diff --git a/pygeoapi-config.yml b/pygeoapi-config.yml index cf23b78..83b1fb2 100644 --- a/pygeoapi-config.yml +++ b/pygeoapi-config.yml @@ -49,8 +49,6 @@ metadata: datasets: obs: type: Point - provider: CSV - id_field: id title: Observations description: Observations keywords: @@ -71,12 +69,13 @@ datasets: temporal: begin: 2000-10-30T18:24:39Z end: 2007-10-30T08:57:29Z - data: tests/data/obs.csv + provider: + name: CSV + data: tests/data/obs.csv + id_field: id landsat-aws: type: Polygon - provider: Elasticsearch - id_field: id_ title: my dataset description: my dataset keywords: @@ -97,11 +96,12 @@ datasets: temporal: begin: 2011-11-11 end: now # or empty - data: http://localhost:9200/index/type + provider: + name: Elasticsearch + data: http://localhost:9200/index/type + id_field: id_ lakes: type: Polygon - provider: GeoJSON - id_field: null # null indicates use feature enumeration title: Large Lakes description: lakes of the world, public domain keywords: @@ -121,4 +121,7 @@ datasets: temporal: begin: 2011-11-11 end: now # or empty - data: tests/data/ne_110m_lakes.geojson + provider: + name: GeoJSON + data: tests/data/ne_110m_lakes.geojson + id_field: null # null indicates use feature enumeration diff --git a/pygeoapi/provider/__init__.py b/pygeoapi/provider/__init__.py index a5733fb..1fd5edc 100644 --- a/pygeoapi/provider/__init__.py +++ b/pygeoapi/provider/__init__.py @@ -39,31 +39,31 @@ PROVIDERS = { } -def load_provider(name, data, id_field): +def load_provider(provider_def): """ loads provider by name - :param name: provider name - :param data: file path or URL to data/service - :param id_field: field/property/column of identifier + :param provider_def: provider definition :returns: provider object """ LOGGER.debug('Providers: {}'.format(PROVIDERS)) - provider_name = name - if provider_name not in PROVIDERS.keys(): - msg = 'Provider {} not found'.format(provider_name) + + name = provider_def['name'] + + if name not in PROVIDERS.keys(): + msg = 'Provider {} not found'.format(name) LOGGER.exception(msg) raise InvalidProviderError(msg) - packagename, classname = PROVIDERS[provider_name].rsplit('.', 1) + packagename, classname = PROVIDERS[name].rsplit('.', 1) LOGGER.debug('package name: {}'.format(packagename)) LOGGER.debug('class name: {}'.format(classname)) module = importlib.import_module(packagename) class_ = getattr(module, classname) - provider = class_(name, data, id_field) + provider = class_(provider_def) return provider diff --git a/pygeoapi/provider/base.py b/pygeoapi/provider/base.py index 90d939a..1e7989a 100644 --- a/pygeoapi/provider/base.py +++ b/pygeoapi/provider/base.py @@ -35,20 +35,18 @@ LOGGER = logging.getLogger(__name__) class BaseProvider(object): """generic Provider ABC""" - def __init__(self, name, data, id_field): + def __init__(self, provider_def): """ Initialize object - :param name: provider name - :param data: file path or URL to data/service - :param id_field: field/property/column of identifier + :param provider_def: provider definition :returns: pygeoapi.providers.base.BaseProvider """ - self.name = name - self.data = data - self.id_field = id_field + self.name = provider_def['name'] + self.data = provider_def['data'] + self.id_field = provider_def['id_field'] def query(self): """ diff --git a/pygeoapi/provider/csv_.py b/pygeoapi/provider/csv_.py index c7d8baf..7826f86 100644 --- a/pygeoapi/provider/csv_.py +++ b/pygeoapi/provider/csv_.py @@ -42,18 +42,16 @@ LOGGER = logging.getLogger(__name__) class CSVProvider(BaseProvider): """CSV provider""" - def __init__(self, name, data, id_field): + def __init__(self, provider_def): """ Initialize object - :param name: provider name - :param data: file path or URL to data/service - :param id_field: field/property/column of identifier + :param provider_def: provider definition - :returns: pygeoapi.providers.csv.CSVProvider + :returns: pygeoapi.providers.csv_.CSVProvider """ - BaseProvider.__init__(self, name, data, id_field) + BaseProvider.__init__(self, provider_def) def _load(self, startindex=0, limit=10, resulttype='results', identifier=None): diff --git a/pygeoapi/provider/elasticsearch_.py b/pygeoapi/provider/elasticsearch_.py index dbafedf..a90be62 100644 --- a/pygeoapi/provider/elasticsearch_.py +++ b/pygeoapi/provider/elasticsearch_.py @@ -39,18 +39,16 @@ LOGGER = logging.getLogger(__name__) class ElasticsearchProvider(BaseProvider): """Elasticsearch Provider""" - def __init__(self, name, data, id_field): + def __init__(self, provider_def): """ Initialize object - :param name: provider name - :param data: file path or URL to data/service - :param id_field: field/property/column of identifier + :param provider_def: provider definition - :returns: pygeoapi.providers.elasticsearch.ElasticsearchProvider + :returns: pygeoapi.providers.elasticsearch_.ElasticsearchProvider """ - BaseProvider.__init__(self, name, data, id_field) + BaseProvider.__init__(self, provider_def) url_tokens = self.data.split('/') diff --git a/pygeoapi/provider/geojson.py b/pygeoapi/provider/geojson.py index 03c5cb8..b42206a 100644 --- a/pygeoapi/provider/geojson.py +++ b/pygeoapi/provider/geojson.py @@ -59,9 +59,9 @@ class GeoJSONProvider(BaseProvider): appropriate HTTP responses will be raised """ - def __init__(self, name, data, id_field): + def __init__(self, provider_def): """initializer""" - BaseProvider.__init__(self, name, data, id_field) + BaseProvider.__init__(self, provider_def) def _load(self): """Load and validate the source GeoJSON file diff --git a/pygeoapi/views.py b/pygeoapi/views.py index b10031b..2ed3c32 100644 --- a/pygeoapi/views.py +++ b/pygeoapi/views.py @@ -249,9 +249,7 @@ def get_features(headers, args, dataset): return headers_, 400, json.dumps(exception) LOGGER.debug('Loading provider') - p = load_provider(settings['datasets'][dataset]['provider'], - settings['datasets'][dataset]['data'], - settings['datasets'][dataset]['id_field']) + p = load_provider(settings['datasets'][dataset]['provider']) LOGGER.debug('Querying provider') LOGGER.debug('startindex: {}'.format(startindex)) LOGGER.debug('limit: {}'.format(limit)) @@ -306,9 +304,7 @@ def get_feature(headers, args, dataset, identifier): return headers_, 400, json.dumps(exception) LOGGER.debug('Loading provider') - p = load_provider(settings['datasets'][dataset]['provider'], - settings['datasets'][dataset]['data'], - settings['datasets'][dataset]['id_field']) + p = load_provider(settings['datasets'][dataset]['provider']) LOGGER.debug('Fetching id {}'.format(identifier)) content = p.get(identifier)