Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions pygeoapi/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,14 @@
from pygeoapi.log import setup_logger
from pygeoapi.plugin import load_plugin
from pygeoapi.process.manager.base import get_manager
from pygeoapi.provider import (
filter_providers_by_type, get_provider_by_type, get_provider_default)
from pygeoapi.provider.base import (
ProviderConnectionError, ProviderGenericError, ProviderTypeError)

from pygeoapi.util import (
TEMPLATESDIR, UrlPrefetcher, dategetter,
filter_dict_by_key_value, filter_providers_by_type, get_api_rules,
get_base_url, get_provider_by_type, get_provider_default, get_typed_value,
filter_dict_by_key_value, get_api_rules, get_base_url, get_typed_value,
render_j2_template, to_json, get_choice_from_headers, get_from_headers,
get_dataset_formatters
)
Expand Down
5 changes: 2 additions & 3 deletions pygeoapi/api/coverages.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,8 @@
from pygeoapi.openapi import get_oas_30_parameters
from pygeoapi.plugin import load_plugin
from pygeoapi.provider.base import ProviderGenericError, ProviderTypeError
from pygeoapi.util import (
filter_dict_by_key_value, get_provider_by_type, to_json
)
from pygeoapi.provider import get_provider_by_type
from pygeoapi.util import filter_dict_by_key_value, to_json

from . import (
APIRequest, API, F_JSON, SYSTEM_LOCALE, validate_bbox, validate_datetime,
Expand Down
8 changes: 4 additions & 4 deletions pygeoapi/api/environmental_data_retrieval.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,12 @@
from pygeoapi.crs import (create_crs_transform_spec, set_content_crs_header)
from pygeoapi.openapi import get_oas_30_parameters
from pygeoapi.plugin import load_plugin, PLUGINS
from pygeoapi.provider import filter_providers_by_type, get_provider_by_type
from pygeoapi.provider.base import (
ProviderGenericError, ProviderItemNotFoundError)
from pygeoapi.util import (
filter_providers_by_type, get_dataset_formatters, get_provider_by_type,
get_typed_value, render_j2_template, to_json, filter_dict_by_key_value
)
from pygeoapi.util import (get_dataset_formatters, get_typed_value,
render_j2_template, to_json,
filter_dict_by_key_value)

from . import (APIRequest, API, F_COVERAGEJSON, F_HTML, F_JSON, F_JSONLD,
validate_datetime, validate_bbox)
Expand Down
7 changes: 3 additions & 4 deletions pygeoapi/api/itemtypes.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,13 @@
from pygeoapi.linked_data import geojson2jsonld
from pygeoapi.openapi import get_oas_30_parameters
from pygeoapi.plugin import load_plugin, PLUGINS
from pygeoapi.provider import filter_providers_by_type, get_provider_by_type
from pygeoapi.provider.base import (
ProviderGenericError, ProviderItemNotFoundError,
ProviderTypeError, SchemaType)

from pygeoapi.util import (filter_providers_by_type, to_json,
filter_dict_by_key_value, str2bool,
get_provider_by_type, render_j2_template,
get_dataset_formatters)
from pygeoapi.util import (to_json, filter_dict_by_key_value, str2bool,
render_j2_template, get_dataset_formatters)

from . import (
APIRequest, API, SYSTEM_LOCALE, F_JSON, FORMAT_TYPES, F_HTML, F_JSONLD,
Expand Down
6 changes: 2 additions & 4 deletions pygeoapi/api/maps.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,11 @@
from pygeoapi.crs import transform_bbox
from pygeoapi.openapi import get_oas_30_parameters
from pygeoapi.plugin import load_plugin
from pygeoapi.provider import filter_providers_by_type, get_provider_by_type
from pygeoapi.provider.base import (
ProviderGenericError, ProviderInvalidDataError
)
from pygeoapi.util import (
get_provider_by_type, to_json, filter_providers_by_type,
filter_dict_by_key_value
)
from pygeoapi.util import to_json, filter_dict_by_key_value

from . import (
APIRequest, API, F_JSON, FORMAT_TYPES, validate_datetime, validate_subset
Expand Down
7 changes: 3 additions & 4 deletions pygeoapi/api/stac.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,12 @@
from pygeoapi.api import itemtypes as itemtypes_api
from pygeoapi.plugin import load_plugin

from pygeoapi.provider import get_provider_by_type
from pygeoapi.provider.base import (
ProviderConnectionError, ProviderNotFoundError, ProviderTypeError
)
from pygeoapi.util import (
filter_dict_by_key_value, get_current_datetime, get_provider_by_type,
render_j2_template, to_json
)
from pygeoapi.util import (filter_dict_by_key_value, get_current_datetime,
render_j2_template, to_json)

from . import APIRequest, API, FORMAT_TYPES, F_JSON, F_HTML

Expand Down
6 changes: 2 additions & 4 deletions pygeoapi/api/tiles.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,13 @@
from pygeoapi.plugin import load_plugin
from pygeoapi.models.provider.base import (TilesMetadataFormat,
TileMatrixSetEnum)
from pygeoapi.provider import get_provider_by_type, filter_providers_by_type
from pygeoapi.provider.base import (
ProviderGenericError, ProviderTypeError
)
from pygeoapi.provider.tile import ProviderTileNotFoundError

from pygeoapi.util import (
get_provider_by_type, to_json, filter_dict_by_key_value,
filter_providers_by_type, render_j2_template
)
from pygeoapi.util import to_json, filter_dict_by_key_value, render_j2_template

from . import (
APIRequest, API, FORMAT_TYPES, F_JSON, F_HTML, SYSTEM_LOCALE, F_JSONLD
Expand Down
63 changes: 61 additions & 2 deletions pygeoapi/provider/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#
# Authors: Tom Kralidis <tomkralidis@gmail.com>
#
# Copyright (c) 2019 Tom Kralidis
# Copyright (c) 2026 Tom Kralidis
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
Expand All @@ -27,4 +27,63 @@
#
# =================================================================

"""Provider module containing the plugins wrapping data sources"""
import logging

from pygeoapi.provider.base import ProviderTypeError

LOGGER = logging.getLogger(__name__)


def filter_providers_by_type(providers: list, type: str) -> dict:
"""
helper function to filter a list of providers by type

:param providers: ``list``
:param type: str

:returns: filtered ``dict`` provider
"""

providers_ = {provider['type']: provider for provider in providers}
return providers_.get(type)


def get_provider_by_type(providers: list, provider_type: str) -> dict:
"""
helper function to load a provider by a provider type

:param providers: ``list`` of providers
:param provider_type: type of provider (e.g. feature)

:returns: provider based on type
"""

LOGGER.debug(f'Searching for provider type {provider_type}')
try:
p = (next(d for i, d in enumerate(providers)
if d['type'] == provider_type))
except (RuntimeError, StopIteration):
raise ProviderTypeError('Invalid provider type requested')

return p


def get_provider_default(providers: list) -> dict:
"""
helper function to get a resource's default provider

:param providers: ``list`` of providers

:returns: filtered ``dict``
"""

try:
default = (next(d for i, d in enumerate(providers) if 'default' in d
and d['default']))
LOGGER.debug('found default provider type')
except StopIteration:
LOGGER.debug('no default provider type. Returning first provider')
default = providers[0]

LOGGER.debug(f"Default provider: {default['type']}")
return default
2 changes: 2 additions & 0 deletions pygeoapi/provider/sql.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
ProviderQueryError,
ProviderItemNotFoundError
)
from pygeoapi.util import str2bool

LOGGER = logging.getLogger(__name__)

Expand Down Expand Up @@ -127,6 +128,7 @@ def __init__(
self.id_field = provider_def['id_field']
self.geom = provider_def.get('geom_field', 'geom')
self.driver_name = driver_name
self.count = str2bool(provider_def.get('count', True))

LOGGER.debug(f'Name: {self.name}')
LOGGER.debug(f'Table: {self.table}')
Expand Down
58 changes: 1 addition & 57 deletions pygeoapi/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,7 @@
from pygeoapi import l10n
from pygeoapi.models import config as config_models
from pygeoapi.plugin import load_plugin, PLUGINS
from pygeoapi.provider.base import ProviderTypeError

from pygeoapi.provider import get_provider_default

LOGGER = logging.getLogger(__name__)

Expand Down Expand Up @@ -527,61 +526,6 @@ def filter_dict_by_key_value(dict_: dict, key: str, value: str) -> dict:
return {k: v for (k, v) in dict_.items() if v[key] == value}


def filter_providers_by_type(providers: list, type: str) -> dict:
"""
helper function to filter a list of providers by type

:param providers: ``list``
:param type: str

:returns: filtered ``dict`` provider
"""

providers_ = {provider['type']: provider for provider in providers}
return providers_.get(type)


def get_provider_by_type(providers: list, provider_type: str) -> dict:
"""
helper function to load a provider by a provider type

:param providers: ``list`` of providers
:param provider_type: type of provider (e.g. feature)

:returns: provider based on type
"""

LOGGER.debug(f'Searching for provider type {provider_type}')
try:
p = (next(d for i, d in enumerate(providers)
if d['type'] == provider_type))
except (RuntimeError, StopIteration):
raise ProviderTypeError('Invalid provider type requested')

return p


def get_provider_default(providers: list) -> dict:
"""
helper function to get a resource's default provider

:param providers: ``list`` of providers

:returns: filtered ``dict``
"""

try:
default = (next(d for i, d in enumerate(providers) if 'default' in d
and d['default']))
LOGGER.debug('found default provider type')
except StopIteration:
LOGGER.debug('no default provider type. Returning first provider')
default = providers[0]

LOGGER.debug(f"Default provider: {default['type']}")
return default


class ProcessExecutionMode(Enum):
sync_execute = 'sync-execute'
async_execute = 'async-execute'
Expand Down
13 changes: 7 additions & 6 deletions tests/other/test_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@

from pygeoapi import util
from pygeoapi.api import __version__
from pygeoapi.provider import get_provider_by_type, get_provider_default
from pygeoapi.provider.base import ProviderTypeError

from ..util import get_test_file_path
Expand Down Expand Up @@ -181,25 +182,25 @@ def test_filter_dict_by_key_value(config):


def test_get_provider_by_type(config):
p = util.get_provider_by_type(config['resources']['obs']['providers'],
'feature')
p = get_provider_by_type(config['resources']['obs']['providers'],
'feature')

assert isinstance(p, dict)
assert p['type'] == 'feature'
assert p['name'] == 'CSV'

with pytest.raises(ProviderTypeError):
p = util.get_provider_by_type(config['resources']['obs']['providers'],
'something-else')
p = get_provider_by_type(config['resources']['obs']['providers'],
'something-else')


def test_get_provider_default(config):
pd = util.get_provider_default(config['resources']['obs']['providers'])
pd = get_provider_default(config['resources']['obs']['providers'])

assert pd['type'] == 'feature'
assert pd['name'] == 'CSV'

pd = util.get_provider_default(config['resources']['obs']['providers'])
pd = get_provider_default(config['resources']['obs']['providers'])


def test_read_data():
Expand Down