Skip to content

Commit

Permalink
Extend testing workflow to test on mac (intel and arm) (#42)
Browse files Browse the repository at this point in the history
* Add testing on MacOS (intel and m1)

* Add filters to avoid running tests when only docs are updated

* Skip python 3.8 and 3.9 for arm macos due to issue with runners.
Update brew reinstall to avoid brew issue in intel macos

* Update defined symbol search to take into account that symbols in macOS have and underscore prepended

* Set DYLD_LIBRARY_PATH

* Add rounding in srid transformation tests to account for floating point precision differences

* Move is_ever_disjoint to TGeomPoint for comparisons with base geometries. Remove corresponding tests of TGeogPoint
  • Loading branch information
Diviloper authored Apr 7, 2024
1 parent a9823dc commit 73f5c5c
Show file tree
Hide file tree
Showing 9 changed files with 1,121 additions and 960 deletions.
70 changes: 58 additions & 12 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,56 +3,102 @@ name: Test PyMEOS
on:
push:
branches: [ "develop", "master" ]
paths-ignore:
- "docs/**"
- ".readthedocs.yml"
- "README.md"
pull_request:
branches: [ "develop", "master" ]
paths-ignore:
- "docs/**"
- ".readthedocs.yml"
- "README.md"

jobs:
build:

runs-on: ubuntu-22.04
test:
name: Test PyMEOS - Python ${{ matrix.python-version }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
python-version: [ "3.8", "3.9", "3.10", "3.11", "3.12" ]
os: [ ubuntu-latest, macos-13, macos-14 ]
exclude:
# Necessary due to issue with macOS runners. See
# https://github.com/actions/setup-python/issues/808
# Can be removed once this PR is merged:
# https://github.com/actions/python-versions/pull/259
- os: macos-14
python-version: "3.8"
- os: macos-14
python-version: "3.9"
include:
- ld_path: "/usr/local/lib"
- os: macos-14
ld_path: "/opt/homebrew/lib"

steps:
- uses: actions/checkout@v4
- name: Checkout
uses: actions/checkout@v4

- uses: awalsh128/cache-apt-pkgs-action@latest
- name: Get dependencies from apt (cache)
uses: awalsh128/cache-apt-pkgs-action@latest
if: runner.os == 'Linux'
with:
packages: build-essential cmake postgresql-server-dev-14 libproj-dev libjson-c-dev libgsl-dev libgeos-dev
version: 1.0

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
- name: Update brew
if: matrix.os == 'macos-13'
# Necessary to avoid issue with macOS runners. See
# https://github.com/actions/runner-images/issues/4020
run: |
brew reinstall [email protected] || brew link --overwrite [email protected]
brew reinstall [email protected] || brew link --overwrite [email protected]
brew update
- name: Get dependencies from homebrew (cache)
uses: tecolicom/actions-use-homebrew-tools@v1
if: runner.os == 'macOS'
with:
python-version: ${{ matrix.python-version }}
cache: "pip"
tools: cmake libpq proj json-c gsl geos

- name: Install MEOS
- name: Fetch MEOS sources
env:
BRANCH_NAME: ${{ github.base_ref || github.ref_name }}
run: |
git clone --branch ${{ env.BRANCH_NAME }} --depth 1 https://github.com/MobilityDB/MobilityDB
- name: Install MEOS
run: |
mkdir MobilityDB/build
cd MobilityDB/build
cmake .. -DMEOS=on
make -j
sudo make install
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: "pip"

- name: Install python dependencies
run: |
python -m pip install --upgrade pip
pip install -r pymeos_cffi/dev-requirements.txt
pip install -r pymeos/dev-requirements.txt
- name: Install pymeos_cffi
run: |
cd pymeos_cffi
python ./pymeos_cffi/builder/build_header.py
python ./pymeos_cffi/builder/build_pymeos_functions.py
pip install .
cd ..
- name: Test PyMEOS with pytest
run: |
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${{ matrix.ld_path }}
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:${{ matrix.ld_path }}
cd pymeos
pytest
46 changes: 35 additions & 11 deletions pymeos/pymeos/main/tpoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class TPoint(Temporal[shp.Point, TG, TI, TS, TSS], TSimplifiable, ABC):
Abstract class for temporal points.
"""

_projection_cache: dict[tuple[int, int], 'LWPROJ'] = {}
_projection_cache: dict[tuple[int, int], "LWPROJ"] = {}

# ------------------------- Constructors ----------------------------------
def __init__(self, _inner) -> None:
Expand Down Expand Up @@ -502,9 +502,10 @@ def transform(self: Self, srid: int) -> Self:
MEOS Functions:
tpoint_transform
"""
if (self.srid(), srid) not in self._projection_cache:
self._projection_cache[(self.srid(), srid)] = lwproj_transform(self.srid(), srid)
result = tpoint_transform_pj(self._inner, srid, self._projection_cache[(self.srid(), srid)])
srids = (self.srid(), srid)
if srids not in self._projection_cache:
self._projection_cache[srids] = lwproj_transform(*srids)
result = tpoint_transform_pj(self._inner, srid, self._projection_cache[srids])
return Temporal._factory(result)

# ------------------------- Restrictions ----------------------------------
Expand Down Expand Up @@ -774,7 +775,7 @@ def is_ever_contained_in(self, container: Union[shpb.BaseGeometry, STBox]) -> bo
raise TypeError(f"Operation not supported with type {container.__class__}")
return result == 1

def is_ever_disjoint(self, other: Union[shpb.BaseGeometry, TPoint, STBox]) -> bool:
def is_ever_disjoint(self, other: TPoint) -> bool:
"""
Returns whether the temporal point is ever disjoint from `other`.
Expand All @@ -789,12 +790,7 @@ def is_ever_disjoint(self, other: Union[shpb.BaseGeometry, TPoint, STBox]) -> bo
"""
from ..boxes import STBox

if isinstance(other, shpb.BaseGeometry):
gs = geo_to_gserialized(other, isinstance(self, TGeogPoint))
result = edisjoint_tpoint_geo(self._inner, gs)
elif isinstance(other, STBox):
result = edisjoint_tpoint_geo(self._inner, stbox_to_geo(other._inner))
elif isinstance(other, TPoint):
if isinstance(other, TPoint):
result = edisjoint_tpoint_tpoint(self._inner, other._inner)
else:
raise TypeError(f"Operation not supported with type {other.__class__}")
Expand Down Expand Up @@ -1651,6 +1647,34 @@ def never_not_equal(self, value: Union[shpb.BaseGeometry, TGeomPoint]) -> bool:
"""
return not self.ever_not_equal(value)

def is_ever_disjoint(
self, other: Union[shpb.BaseGeometry, TGeomPoint, STBox]
) -> bool:
"""
Returns whether the temporal point is ever disjoint from `other`.
Args:
other: An object to check for disjointness with.
Returns:
A :class:`bool` indicating whether the temporal point is ever disjoint from `other`.
MEOS Functions:
edisjoint_tpoint_geo, edisjoint_tpoint_tpoint
"""
from ..boxes import STBox

if isinstance(other, shpb.BaseGeometry):
gs = geo_to_gserialized(other, isinstance(self, TGeogPoint))
result = edisjoint_tpoint_geo(self._inner, gs)
elif isinstance(other, STBox):
result = edisjoint_tpoint_geo(self._inner, stbox_to_geo(other._inner))
elif isinstance(other, TGeomPoint):
result = edisjoint_tpoint_tpoint(self._inner, other._inner)
else:
raise TypeError(f"Operation not supported with type {other.__class__}")
return result == 1

# ------------------------- Temporal Comparisons --------------------------
def temporal_equal(self, other: Union[shp.Point, TGeomPoint]) -> TBool:
"""
Expand Down
Loading

0 comments on commit 73f5c5c

Please sign in to comment.