Skip to content

Commit efbbeec

Browse files
author
afabiani
committed
Py3 compatibility
1 parent 9bf6fc5 commit efbbeec

File tree

6 files changed

+55
-42
lines changed

6 files changed

+55
-42
lines changed

src/geoserver/catalog.py

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
# LICENSE.txt file in the root directory of this source tree.
99
#
1010
#########################################################################
11-
from datetime import datetime, timedelta
11+
1212
import logging
13+
from datetime import datetime, timedelta
1314
from geoserver.layer import Layer
1415
from geoserver.resource import FeatureType
1516
from geoserver.store import (
@@ -32,6 +33,7 @@
3233
import requests
3334
from requests.packages.urllib3.util.retry import Retry
3435
from requests.adapters import HTTPAdapter
36+
from six import string_types
3537

3638
try:
3739
from past.builtins import basestring
@@ -77,9 +79,9 @@ def _name(named):
7779
as long as it's a string
7880
* otherwise, we raise a ValueError
7981
"""
80-
if isinstance(named, basestring) or named is None:
82+
if isinstance(named, string_types) or named is None:
8183
return named
82-
elif hasattr(named, 'name') and isinstance(named.name, basestring):
84+
elif hasattr(named, 'name') and isinstance(named.name, string_types):
8385
return named.name
8486
else:
8587
raise ValueError("Can't interpret %s as a name or a configuration object" % named)
@@ -100,14 +102,15 @@ class Catalog(object):
100102
- Namespaces, which provide unique identifiers for resources
101103
"""
102104

103-
def __init__(self, service_url, username="admin", password="geoserver", validate_ssl_certificate=True, access_token=None):
105+
def __init__(self, service_url, username="admin", password="geoserver", validate_ssl_certificate=True, access_token=None, retries=3, backoff_factor=0.9):
104106
self.service_url = service_url.strip("/")
105107
self.username = username
106108
self.password = password
107109
self.validate_ssl_certificate = validate_ssl_certificate
108110
self.access_token = access_token
109-
self.setup_connection()
110-
111+
self.retries = retries
112+
self.backoff_factor = backoff_factor
113+
self.setup_connection(retries=self.retries, backoff_factor=self.backoff_factor)
111114
self._cache = {}
112115
self._version = None
113116

@@ -121,20 +124,21 @@ def __getstate__(self):
121124
def __setstate__(self, state):
122125
'''restore http connection upon unpickling'''
123126
self.__dict__.update(state)
124-
self.setup_connection()
127+
self.setup_connection(retries=self.retries, backoff_factor=self.backoff_factor)
125128

126-
def setup_connection(self):
129+
def setup_connection(self, retries=3, backoff_factor=0.9):
127130
self.client = requests.session()
128131
self.client.verify = self.validate_ssl_certificate
129132
parsed_url = urlparse(self.service_url)
130133
retry = Retry(
131-
total = 6,
132-
status = 6,
133-
backoff_factor = 0.9,
134+
total = retries or self.retries,
135+
status = retries or self.retries,
136+
read = retries or self.retries,
137+
connect = retries or self.retries,
138+
backoff_factor = backoff_factor or self.backoff_factor,
134139
status_forcelist = [502, 503, 504],
135140
method_whitelist = set(['HEAD', 'TRACE', 'GET', 'PUT', 'POST', 'OPTIONS', 'DELETE'])
136141
)
137-
138142
self.client.mount("{}://".format(parsed_url.scheme), HTTPAdapter(max_retries=retry))
139143

140144
def http_request(self, url, data=None, method='get', headers={}):
@@ -295,8 +299,6 @@ def save(self, obj, content_type="application/xml"):
295299
def _return_first_item(self, _list):
296300
if len(_list) == 0:
297301
return None
298-
elif len(_list) > 1:
299-
raise AmbiguousRequestError("Multiple items found")
300302
else:
301303
return _list[0]
302304

@@ -330,7 +332,7 @@ def get_stores(self, names=None, workspaces=None):
330332

331333
if names is None:
332334
names = []
333-
elif isinstance(names, basestring):
335+
elif isinstance(names, string_types):
334336
names = [s.strip() for s in names.split(',') if s.strip()]
335337

336338
if stores and names:
@@ -348,7 +350,7 @@ def get_store(self, name, workspace=None):
348350
return self._return_first_item(stores)
349351

350352
def create_datastore(self, name, workspace=None):
351-
if isinstance(workspace, basestring):
353+
if isinstance(workspace, string_types):
352354
workspace = self.get_workspaces(names=workspace)[0]
353355
elif workspace is None:
354356
workspace = self.get_default_workspace()
@@ -381,7 +383,7 @@ def create_wmslayer(self, workspace, store, name, nativeName=None):
381383
return self.get_layer(name)
382384

383385
def add_data_to_store(self, store, name, data, workspace=None, overwrite = False, charset = None):
384-
if isinstance(store, basestring):
386+
if isinstance(store, string_types):
385387
store = self.get_stores(names=store, workspaces=[workspace])[0]
386388
if workspace is not None:
387389
workspace = _name(workspace)
@@ -498,7 +500,7 @@ def create_imagemosaic(self, name, data, configure='first', workspace=None, over
498500
if hasattr(data, 'read'):
499501
# Adding this check only to pass tests. We should drop support for passing a file object
500502
upload_data = data
501-
elif isinstance(data, basestring):
503+
elif isinstance(data, string_types):
502504
if os.path.splitext(data)[-1] == ".zip":
503505
upload_data = open(data, 'rb')
504506
else:
@@ -652,7 +654,7 @@ def add_granule(self, data, store, workspace=None):
652654

653655
params = dict()
654656
workspace_name = workspace
655-
if isinstance(store, basestring):
657+
if isinstance(store, string_types):
656658
store_name = store
657659
else:
658660
store_name = store.name
@@ -690,7 +692,7 @@ def delete_granule(self, coverage, store, granule_id, workspace=None):
690692
params = dict()
691693

692694
workspace_name = workspace
693-
if isinstance(store, basestring):
695+
if isinstance(store, string_types):
694696
store_name = store
695697
else:
696698
store_name = store.name
@@ -741,7 +743,7 @@ def list_granules(self, coverage, store, workspace=None, filter=None, limit=None
741743
params['offset'] = offset
742744

743745
workspace_name = workspace
744-
if isinstance(store, basestring):
746+
if isinstance(store, string_types):
745747
store_name = store
746748
else:
747749
store_name = store.name
@@ -903,7 +905,7 @@ def get_resources(self, names=None, stores=None, workspaces=None):
903905
resources = []
904906
for s in _stores:
905907
try:
906-
if isinstance(s, basestring):
908+
if isinstance(s, string_types):
907909
s = self.get_store(
908910
s,
909911
workspace=workspaces[0] if workspaces else None
@@ -914,7 +916,7 @@ def get_resources(self, names=None, stores=None, workspaces=None):
914916

915917
if names is None:
916918
names = []
917-
elif isinstance(names, basestring):
919+
elif isinstance(names, string_types):
918920
names = [s.strip() for s in names.split(',') if s.strip()]
919921

920922
if resources and names:
@@ -944,7 +946,7 @@ def get_layer(self, name):
944946
return None
945947

946948
def get_layers(self, resource=None):
947-
if isinstance(resource, basestring):
949+
if isinstance(resource, string_types):
948950
ws_name = None
949951
if self.get_short_version() >= "2.13":
950952
if ":" in resource:
@@ -978,7 +980,7 @@ def get_layergroups(self, names=None, workspaces=None):
978980
groups = self.get_xml(url)
979981
layergroups.extend([LayerGroup(self, g.find("name").text, None) for g in groups.findall("layerGroup")])
980982
workspaces = []
981-
elif isinstance(workspaces, basestring):
983+
elif isinstance(workspaces, string_types):
982984
workspaces = [s.strip() for s in workspaces.split(',') if s.strip()]
983985
elif isinstance(workspaces, Workspace):
984986
workspaces = [workspaces]
@@ -1001,7 +1003,7 @@ def get_layergroups(self, names=None, workspaces=None):
10011003

10021004
if names is None:
10031005
names = []
1004-
elif isinstance(names, basestring):
1006+
elif isinstance(names, string_types):
10051007
names = [s.strip() for s in names.split(',') if s.strip()]
10061008

10071009
if layergroups and names:
@@ -1039,7 +1041,7 @@ def get_styles(self, names=None, workspaces=None):
10391041
styles = self.get_xml(url)
10401042
all_styles.extend([Style(self, s.find('name').text) for s in styles.findall("style")])
10411043
workspaces = []
1042-
elif isinstance(workspaces, basestring):
1044+
elif isinstance(workspaces, string_types):
10431045
workspaces = [s.strip() for s in workspaces.split(',') if s.strip()]
10441046
elif isinstance(workspaces, Workspace):
10451047
workspaces = [workspaces]
@@ -1066,7 +1068,7 @@ def get_styles(self, names=None, workspaces=None):
10661068

10671069
if names is None:
10681070
names = []
1069-
elif isinstance(names, basestring):
1071+
elif isinstance(names, string_types):
10701072
names = [s.strip() for s in names.split(',') if s.strip()]
10711073

10721074
if all_styles and names:
@@ -1157,7 +1159,7 @@ def get_workspaces(self, names=None):
11571159
'''
11581160
if names is None:
11591161
names = []
1160-
elif isinstance(names, basestring):
1162+
elif isinstance(names, string_types):
11611163
names = [s.strip() for s in names.split(',') if s.strip()]
11621164

11631165
data = self.get_xml("{}/workspaces.xml".format(self.service_url))

src/geoserver/layergroup.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
# LICENSE.txt file in the root directory of this source tree.
99
#
1010
#########################################################################
11+
12+
from six import string_types
1113
try:
1214
from urllib.parse import urljoin
1315
except:
@@ -73,7 +75,7 @@ class LayerGroup(ResourceInfo):
7375
def __init__(self, catalog, name, workspace=None):
7476
super(LayerGroup, self).__init__()
7577

76-
assert isinstance(name, basestring)
78+
assert isinstance(name, string_types)
7779

7880
self.catalog = catalog
7981
self.name = name

src/geoserver/resource.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
# LICENSE.txt file in the root directory of this source tree.
99
#
1010
#########################################################################
11+
12+
from six import string_types
1113
try:
1214
from urllib.parse import urljoin
1315
except:
@@ -84,7 +86,7 @@ def __init__(self, catalog, workspace, store, name, href=None):
8486
super(_ResourceBase, self).__init__()
8587
if not href:
8688
assert isinstance(store, ResourceInfo)
87-
assert isinstance(name, basestring)
89+
assert isinstance(name, string_types)
8890
assert workspace is not None
8991
else:
9092
parts = href.split('/')

src/geoserver/store.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
# LICENSE.txt file in the root directory of this source tree.
99
#
1010
#########################################################################
11+
12+
from six import string_types
1113
import geoserver.workspace as ws
1214
from geoserver.resource import featuretype_from_index, coverage_from_index, wmslayer_from_index
1315
from geoserver.support import ResourceInfo, xml_property, key_value_pairs, write_bool, write_dict, write_string, build_url
@@ -44,7 +46,7 @@ def __init__(self, catalog, workspace, name):
4446
super(DataStore, self).__init__()
4547

4648
assert isinstance(workspace, ws.Workspace)
47-
assert isinstance(name, basestring)
49+
assert isinstance(name, string_types)
4850
self.catalog = catalog
4951
self.workspace = workspace
5052
self.name = name

src/geoserver/style.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
# LICENSE.txt file in the root directory of this source tree.
99
#
1010
#########################################################################
11+
12+
from six import string_types
1113
from geoserver.support import ResourceInfo, build_url, xml_property
14+
1215
try:
1316
from past.builtins import basestring
1417
except ImportError:
@@ -25,7 +28,7 @@ class Style(ResourceInfo):
2528

2629
def __init__(self, catalog, name, workspace=None, style_format="sld10"):
2730
super(Style, self).__init__()
28-
assert isinstance(name, basestring)
31+
assert isinstance(name, string_types)
2932
assert style_format in Style.supported_formats
3033

3134
self.catalog = catalog

src/geoserver/support.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88
# LICENSE.txt file in the root directory of this source tree.
99
#
1010
#########################################################################
11+
12+
import os
1113
import logging
1214
from xml.etree.ElementTree import TreeBuilder, tostring
1315
from tempfile import mkstemp
1416
from zipfile import ZipFile
15-
import os
17+
from six import string_types
1618

1719
try:
1820
from urllib.parse import urljoin, quote, urlencode, urlparse
@@ -55,7 +57,7 @@ def clean_segment(segment):
5557
Cleans the segment and encodes to UTF-8 if the segment is unicode.
5658
"""
5759
segment = segment.strip('/')
58-
if isinstance(segment, basestring):
60+
if isinstance(segment, string_types):
5961
segment = segment.encode('utf-8')
6062
return segment
6163

@@ -171,7 +173,7 @@ def write(builder, pairs):
171173
if k == 'port':
172174
v = str(v)
173175
builder.start("entry", dict(key=k))
174-
v = v if isinstance(v, basestring) else str(v)
176+
v = v if isinstance(v, string_types) else str(v)
175177
builder.data(v)
176178
builder.end("entry")
177179
builder.end(name)
@@ -247,7 +249,7 @@ def prepare_upload_bundle(name, data):
247249
zip_file = ZipFile(path, 'w')
248250
for ext, stream in data.items():
249251
fname = "%s.%s" % (name, ext)
250-
if (isinstance(stream, basestring)):
252+
if (isinstance(stream, string_types)):
251253
zip_file.write(stream, fname)
252254
else:
253255
zip_file.writestr(fname, stream.read())
@@ -381,14 +383,14 @@ def _multipier(self, name):
381383

382384
def resolution_millis(self):
383385
'''if set, get the value of resolution in milliseconds'''
384-
if self.resolution is None or not isinstance(self.resolution, basestring):
386+
if self.resolution is None or not isinstance(self.resolution, string_types):
385387
return self.resolution
386388
val, mult = self.resolution.split(' ')
387389
return int(float(val) * self._multipier(mult) * 1000)
388390

389391
def resolution_str(self):
390392
'''if set, get the value of resolution as "<n> <period>s", for example: "8 seconds"'''
391-
if self.resolution is None or isinstance(self.resolution, basestring):
393+
if self.resolution is None or isinstance(self.resolution, string_types):
392394
return self.resolution
393395
seconds = self.resolution / 1000.
394396
biggest = self._lookup[0]
@@ -620,7 +622,7 @@ def metadata(node):
620622
def _decode_list(data):
621623
rv = []
622624
for item in data:
623-
if isinstance(item, basestring):
625+
if isinstance(item, string_types):
624626
item = item.encode('utf-8')
625627
elif isinstance(item, list):
626628
item = _decode_list(item)
@@ -633,9 +635,9 @@ def _decode_list(data):
633635
def _decode_dict(data):
634636
rv = {}
635637
for key, value in data.items():
636-
if isinstance(key, basestring):
638+
if isinstance(key, string_types):
637639
key = key.encode('utf-8')
638-
if isinstance(value, basestring):
640+
if isinstance(value, string_types):
639641
value = value.encode('utf-8')
640642
elif isinstance(value, list):
641643
value = _decode_list(value)

0 commit comments

Comments
 (0)