Skip to content

Commit 474cb60

Browse files
authored
fix item queryables provider handling (geopython#1820)
* fix queryables provider handling * fix test
1 parent b3a7071 commit 474cb60

File tree

5 files changed

+60
-21
lines changed

5 files changed

+60
-21
lines changed

pygeoapi/api/itemtypes.py

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -121,29 +121,22 @@ def get_collection_queryables(api: API, request: Union[APIRequest, Any],
121121
HTTPStatus.NOT_FOUND, headers, request.format, 'NotFound', msg)
122122

123123
LOGGER.debug('Creating collection queryables')
124-
try:
125-
LOGGER.debug('Loading feature provider')
126-
p = load_plugin('provider', get_provider_by_type(
127-
api.config['resources'][dataset]['providers'], 'feature'))
128-
except ProviderTypeError:
124+
125+
p = None
126+
for pt in ['feature', 'coverage', 'record']:
129127
try:
130-
LOGGER.debug('Loading coverage provider')
128+
LOGGER.debug(f'Loading {pt} provider')
131129
p = load_plugin('provider', get_provider_by_type(
132-
api.config['resources'][dataset]['providers'], 'coverage')) # noqa
130+
api.config['resources'][dataset]['providers'], pt))
131+
break
133132
except ProviderTypeError:
134-
LOGGER.debug('Loading record provider')
135-
p = load_plugin('provider', get_provider_by_type(
136-
api.config['resources'][dataset]['providers'], 'record'))
137-
finally:
138-
msg = 'queryables not available for this collection'
139-
return api.get_exception(
140-
HTTPStatus.BAD_REQUEST, headers, request.format,
141-
'NoApplicableError', msg)
133+
LOGGER.debug(f'Providing type {pt} not found')
142134

143-
except ProviderGenericError as err:
135+
if p is None:
136+
msg = 'queryables not available for this collection'
144137
return api.get_exception(
145-
err.http_status_code, headers, request.format,
146-
err.ogc_exception_code, err.message)
138+
HTTPStatus.BAD_REQUEST, headers, request.format,
139+
'NoApplicableError', msg)
147140

148141
queryables = {
149142
'type': 'object',

tests/api/test_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,7 @@ def test_conformance(config, api_):
575575

576576
assert isinstance(root, dict)
577577
assert 'conformsTo' in root
578-
assert len(root['conformsTo']) == 37
578+
assert len(root['conformsTo']) == 42
579579
assert 'http://www.opengis.net/spec/ogcapi-features-2/1.0/conf/crs' \
580580
in root['conformsTo']
581581

@@ -604,7 +604,7 @@ def test_describe_collections(config, api_):
604604
collections = json.loads(response)
605605

606606
assert len(collections) == 2
607-
assert len(collections['collections']) == 9
607+
assert len(collections['collections']) == 10
608608
assert len(collections['links']) == 3
609609

610610
rsp_headers, code, response = api_.describe_collections(req, 'foo')

tests/api/test_itemtypes.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,14 @@ def test_get_collection_queryables(config, api_):
7979
assert 'properties' in queryables
8080
assert len(queryables['properties']) == 5
8181

82+
req = mock_api_request({'f': 'json'})
83+
rsp_headers, code, response = get_collection_queryables(api_, req, 'canada-metadata') # noqa
84+
assert rsp_headers['Content-Type'] == 'application/schema+json'
85+
queryables = json.loads(response)
86+
87+
assert 'properties' in queryables
88+
assert len(queryables['properties']) == 10
89+
8290
# test with provider filtered properties
8391
api_.config['resources']['obs']['providers'][0]['properties'] = ['stn_id']
8492

tests/pygeoapi-test-config.yml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,44 @@ resources:
398398
name: png
399399
mimetype: image/png
400400

401+
canada-metadata:
402+
type: collection
403+
title:
404+
en: Open Canada sample data
405+
fr: Exemple de donn\u00e9es Canada Ouvert
406+
description:
407+
en: Sample metadata records from open.canada.ca
408+
fr: Exemples d'enregistrements de m\u00e9tadonn\u00e9es sur ouvert.canada.ca
409+
keywords:
410+
en:
411+
- canada
412+
- open data
413+
fr:
414+
- canada
415+
- donn\u00e9es ouvertes
416+
links:
417+
- type: text/html
418+
rel: canonical
419+
title: information
420+
href: https://open.canada.ca/en/open-data
421+
hreflang: en-CA
422+
- type: text/html
423+
rel: alternate
424+
title: informations
425+
href: https://ouvert.canada.ca/fr/donnees-ouvertes
426+
hreflang: fr-CA
427+
extents:
428+
spatial:
429+
bbox: [-180,-90,180,90]
430+
crs: http://www.opengis.net/def/crs/OGC/1.3/CRS84
431+
providers:
432+
- type: record
433+
name: TinyDBCatalogue
434+
data: tests/data/open.canada.ca/sample-records.tinydb
435+
id_field: externalId
436+
time_field: created
437+
title_field: title
438+
401439
hello-world:
402440
type: process
403441
processor:

tests/test_util.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ def test_path_basename():
172172
def test_filter_dict_by_key_value(config):
173173
collections = util.filter_dict_by_key_value(config['resources'],
174174
'type', 'collection')
175-
assert len(collections) == 9
175+
assert len(collections) == 10
176176

177177
notfound = util.filter_dict_by_key_value(config['resources'],
178178
'type', 'foo')

0 commit comments

Comments
 (0)