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:
Jorge Samuel Mendes de Jesus
2018-04-01 16:23:55 +02:00
committed by GitHub
7 changed files with 38 additions and 45 deletions
+12 -9
View File
@@ -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
+9 -9
View File
@@ -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
+5 -7
View File
@@ -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):
"""
+4 -6
View File
@@ -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):
+4 -6
View File
@@ -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('/')
+2 -2
View File
@@ -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
View File
@@ -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)