Skip to content

Commit 1f56b75

Browse files
authored
Merge pull request #1755 from CartoDB/chore/sc-279134/cartoframes-not-working-with-shapely-2-0
Add compatibility with shapely>=1.7
2 parents 7c7392b + db76d4d commit 1f56b75

File tree

8 files changed

+53
-23
lines changed

8 files changed

+53
-23
lines changed

.github/workflows/cartoframes-ci.yml

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,27 @@ on:
1010
jobs:
1111
test:
1212
strategy:
13+
fail-fast: false
1314
matrix:
14-
python-version: [3.5, 3.6, 3.7, 3.8]
15+
include:
16+
- os: ubuntu-20.04
17+
python-version: 3.5
18+
- os: ubuntu-20.04
19+
python-version: 3.6
20+
- os: ubuntu-latest
21+
python-version: 3.7
22+
- os: ubuntu-latest
23+
python-version: 3.8
1524

1625
name: Run tests on Python ${{ matrix.python-version }}
1726

18-
runs-on: ubuntu-latest
27+
runs-on: ${{ matrix.os }}
1928

2029
steps:
21-
- uses: actions/checkout@v2
30+
- uses: actions/checkout@v3
2231

2332
- name: Set up Python ${{ matrix.python-version }}
24-
uses: actions/setup-python@v1
33+
uses: actions/setup-python@v4
2534
with:
2635
python-version: ${{ matrix.python-version }}
2736

Makefile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
init:
2-
pip install -e .
2+
pip install -U pip
3+
pip install -e .[tests]
4+
5+
lint:
6+
flake8 cartoframes tests
37

48
test:
59
pytest tests/unit/

cartoframes/data/observatory/catalog/dataset.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -500,8 +500,9 @@ def subscribe(self, credentials=None):
500500

501501
@check_do_enabled
502502
def subscription_info(self, credentials=None):
503-
"""Get the subscription information of a Dataset, which includes the license, Terms of Service, rights, price, and
504-
estimated time of delivery, among other metadata of interest during the :py:attr:`Dataset.subscription` process.
503+
"""Get the subscription information of a Dataset, which includes the license, Terms of Service, rights, price,
504+
and estimated time of delivery, among other metadata of interest during the :py:attr:`Dataset.subscription`
505+
process.
505506
506507
Args:
507508
credentials (:py:class:`Credentials <cartoframes.auth.Credentials>`, optional):

cartoframes/io/managers/context_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ def has_table(self, table_name, schema=None):
168168
def delete_table(self, table_name):
169169
query = _drop_table_query(table_name)
170170
output = self.execute_query(query)
171-
return not('notices' in output and 'does not exist' in output['notices'][0])
171+
return not ('notices' in output and 'does not exist' in output['notices'][0])
172172

173173
def _delete_function(self, function_name):
174174
query = _drop_function_query(function_name)

cartoframes/utils/geom_utils.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ def _load_ewkt(egeom):
218218
srid, geom = _extract_srid(egeom)
219219
ogeom = _load_wkt(geom)
220220
if srid:
221-
shapely.geos.lgeos.GEOSSetSRID(ogeom._geom, int(srid))
221+
ogeom = set_srid(ogeom, int(srid))
222222
return ogeom
223223

224224

@@ -241,7 +241,7 @@ def encode_geometry_ewkt(geom, srid=4326):
241241

242242
def encode_geometry_ewkb(geom, srid=4326):
243243
if isinstance(geom, shapely.geometry.base.BaseGeometry):
244-
shapely.geos.lgeos.GEOSSetSRID(geom._geom, srid)
244+
geom = set_srid(geom, srid)
245245
return shapely.wkb.dumps(geom, hex=True, include_srid=True)
246246

247247

@@ -272,3 +272,18 @@ def get_crs(gdf):
272272
return gdf.crs['init']
273273
else:
274274
return str(gdf.crs)
275+
276+
277+
def get_srid(geom):
278+
if shapely.__version__ < '2.0':
279+
return shapely.geos.lgeos.GEOSGetSRID(geom._geom)
280+
else:
281+
return shapely.get_srid(geom)
282+
283+
284+
def set_srid(geom, srid):
285+
if shapely.__version__ < '2.0':
286+
shapely.geos.lgeos.GEOSSetSRID(geom._geom, int(srid))
287+
return geom
288+
else:
289+
return shapely.set_srid(geom, int(srid))

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def get_version():
2626
REQUIRES = [
2727
'appdirs>=1.4.3,<2.0',
2828
'carto>=1.11.3,<2.0',
29+
'markupsafe<=2.0.1',
2930
'jinja2>=2.10.1,<3.0',
3031
'pandas>=0.25.0',
3132
'geopandas>=0.6.0,<1.0',

tests/unit/io/test_carto.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from pandas import Index
66
from geopandas import GeoDataFrame
77
from shapely.geometry import Point
8-
from shapely.geometry.base import BaseGeometry
98
from shapely import wkt
109

1110
from carto.exceptions import CartoException
@@ -83,17 +82,18 @@ def test_read_carto_basegeometry_as_null_geom_value(mocker):
8382
})
8483

8584
# When
86-
gdf = read_carto('__source__', CREDENTIALS, null_geom_value=BaseGeometry())
85+
gdf = read_carto('__source__', CREDENTIALS, null_geom_value=None)
8786

8887
# Then
8988
expected = GeoDataFrame({
9089
'cartodb_id': [1],
9190
'the_geom': [
92-
BaseGeometry()
91+
None
9392
]
9493
}, geometry='the_geom')
9594

9695
cm_mock.assert_called_once_with('__source__', None, None, 3)
96+
print(expected, gdf)
9797
assert expected.equals(gdf)
9898
assert gdf.crs == 'epsg:4326'
9999

tests/unit/utils/test_geom_utils.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
import pandas as pd
44
import geopandas as gpd
55

6-
from shapely.geos import lgeos
76
from shapely.geometry import Point
87

98
from cartoframes.utils.geom_utils import (ENC_EWKT, ENC_SHAPELY, ENC_WKB,
109
ENC_WKB_BHEX, ENC_WKB_HEX, ENC_WKT,
11-
decode_geometry, decode_geometry_item, detect_encoding_type)
10+
decode_geometry, decode_geometry_item,
11+
detect_encoding_type, get_srid)
1212

1313

1414
class TestGeomUtils(object):
@@ -92,38 +92,38 @@ def test_decode_geometry_shapely(self):
9292
def test_decode_geometry_wkb(self):
9393
geom = decode_geometry_item(
9494
b'\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00H\x93@\x00\x00\x00\x00\x00\x9d\xb6@', ENC_WKB)
95-
assert lgeos.GEOSGetSRID(geom._geom) == 0
95+
assert get_srid(geom) == 0
9696
assert geom.wkb == b'\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00H\x93@\x00\x00\x00\x00\x00\x9d\xb6@'
9797

9898
geom = decode_geometry_item(
9999
b'\x01\x01\x00\x00 \xe6\x10\x00\x00\x00\x00\x00\x00\x00H\x93@\x00\x00\x00\x00\x00\x9d\xb6@', ENC_WKB) # ext
100-
assert lgeos.GEOSGetSRID(geom._geom) == 4326
100+
assert get_srid(geom) == 4326
101101
assert geom.wkb == b'\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00H\x93@\x00\x00\x00\x00\x00\x9d\xb6@'
102102

103103
def test_decode_geometry_wkb_hex(self):
104104
geom = decode_geometry_item('0101000000000000000048934000000000009DB640', ENC_WKB_HEX)
105-
assert lgeos.GEOSGetSRID(geom._geom) == 0
105+
assert get_srid(geom) == 0
106106
assert geom.wkb_hex == '0101000000000000000048934000000000009DB640'
107107

108108
geom = decode_geometry_item('0101000020E6100000000000000048934000000000009DB640', ENC_WKB_HEX) # ext
109-
assert lgeos.GEOSGetSRID(geom._geom) == 4326
109+
assert get_srid(geom) == 4326
110110
assert geom.wkb_hex == '0101000000000000000048934000000000009DB640'
111111

112112
def test_decode_geometry_wkb_bhex(self):
113113
geom = decode_geometry_item(b'0101000000000000000048934000000000009DB640', ENC_WKB_BHEX)
114-
assert lgeos.GEOSGetSRID(geom._geom) == 0
114+
assert get_srid(geom) == 0
115115
assert geom.wkb == b'\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00H\x93@\x00\x00\x00\x00\x00\x9d\xb6@'
116116

117117
geom = decode_geometry_item(b'0101000020E6100000000000000048934000000000009DB640', ENC_WKB_BHEX) # ext
118-
assert lgeos.GEOSGetSRID(geom._geom) == 4326
118+
assert get_srid(geom) == 4326
119119
assert geom.wkb == b'\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00H\x93@\x00\x00\x00\x00\x00\x9d\xb6@'
120120

121121
def test_decode_geometry_wkt(self):
122122
geom = decode_geometry_item('POINT (1234 5789)', ENC_WKT)
123-
assert lgeos.GEOSGetSRID(geom._geom) == 0
123+
assert get_srid(geom) == 0
124124
assert geom.wkt == 'POINT (1234 5789)'
125125

126126
def test_decode_geometry_ewkt(self):
127127
geom = decode_geometry_item('SRID=4326;POINT (1234 5789)', ENC_EWKT) # ext
128-
assert lgeos.GEOSGetSRID(geom._geom) == 4326
128+
assert get_srid(geom) == 4326
129129
assert geom.wkt == 'POINT (1234 5789)'

0 commit comments

Comments
 (0)