Merge pull request #16 from geopython/provider-refactor
refactor provider initialization. Provider can obtain specific information like table for sqlite3
This commit is contained in:
+12
-9
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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('/')
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
+2
-6
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user