Skip to content
Snippets Groups Projects
Commit 9f5f2211 authored by James Graham's avatar James Graham
Browse files

Refactor away connector type enum - there were only ever 2 types - #5

parent 7a074ae5
No related branches found
No related tags found
1 merge request!60Merge dev pre-hackday
......@@ -29,7 +29,7 @@ class Plugin(abc.ABCMeta):
else:
cls._plugins[name] = cls
def get_plugin(cls, class_name: str) -> type:
def get_plugin(cls, class_name: str) -> typing.Type:
"""
Get a plugin class by name.
......
......@@ -29,6 +29,13 @@ class AuthMethod(enum.Enum):
class HttpHeaderAuth(requests.auth.HTTPBasicAuth):
"""
Requests Auth provider.
The same as HttpBasicAuth - but don't convert to base64
Used for e.g. Cisco HyperCat API
"""
def __call__(self, r):
r.headers['Authorization'] = self.username
return r
......@@ -42,12 +49,6 @@ REQUEST_AUTH_FUNCTIONS = OrderedDict([
])
@enum.unique
class ConnectorType(enum.Enum):
CATALOGUE = 1
DATASET = 2
class BaseDataConnector(metaclass=plugin.Plugin):
"""
Base class of data connectors which provide access to data / metadata via an external API.
......@@ -57,7 +58,8 @@ class BaseDataConnector(metaclass=plugin.Plugin):
* A single dataset
* A data catalogue - a collection of datasets
"""
TYPE = None
#: Does this data connector represent a data catalogue containing multiple datasets?
is_catalogue = None
def __init__(self, location: str,
api_key: typing.Optional[str] = None,
......@@ -102,7 +104,8 @@ class DataCatalogueConnector(BaseDataConnector, collections_abc.Mapping):
"""
Base class of data connectors which provide access to a data catalogue.
"""
TYPE = ConnectorType.CATALOGUE
#: Does this data connector represent a data catalogue containing multiple datasets?
is_catalogue = True
def get_data(self,
params: typing.Optional[typing.Mapping[str, str]] = None):
......@@ -135,7 +138,8 @@ class DataSetConnector(BaseDataConnector):
If you wish to connect to a source that provides metadata itself, you must create a new
connector class which inherits from this one.
"""
TYPE = ConnectorType.DATASET
#: Does this data connector represent a data catalogue containing multiple datasets?
is_catalogue = False
def __init__(self, location: str,
api_key: typing.Optional[str] = None,
......
import json
import typing
from django.conf import settings
from django.contrib.auth.models import Group
......@@ -7,8 +8,8 @@ from django.urls import reverse
import requests
import requests.exceptions
from datasources.connectors.base import AuthMethod, BaseDataConnector, ConnectorType, REQUEST_AUTH_FUNCTIONS
from core.models import BaseAppDataModel, MAX_LENGTH_API_KEY, MAX_LENGTH_NAME, MAX_LENGTH_PATH
from datasources.connectors.base import AuthMethod, BaseDataConnector, REQUEST_AUTH_FUNCTIONS
class DataSource(BaseAppDataModel):
......@@ -60,8 +61,8 @@ class DataSource(BaseAppDataModel):
return super().save(**kwargs)
@property
def is_catalogue(self):
return self.data_connector_class.TYPE == ConnectorType.CATALOGUE
def is_catalogue(self) -> bool:
return self.data_connector_class.is_catalogue
@property
def connector_string(self):
......@@ -70,7 +71,7 @@ class DataSource(BaseAppDataModel):
return self.url
@property
def data_connector_class(self):
def data_connector_class(self) -> typing.Type[BaseDataConnector]:
"""
Get the data connector class for this source.
......@@ -118,11 +119,11 @@ class DataSource(BaseAppDataModel):
@property
def search_representation(self) -> str:
lines = []
lines.append(self.name)
lines.append(self.owner.get_full_name())
lines.append(self.description)
lines = [
self.name,
self.owner.get_full_name(),
self.description,
]
try:
lines.append(json.dumps(
......
from django.test import TestCase
from datasources.connectors.base import BaseDataConnector, ConnectorType
from datasources.connectors.base import BaseDataConnector
class ConnectorPluginTest(TestCase):
......@@ -41,7 +41,7 @@ class ConnectorPluginTest(TestCase):
class ConnectorIoTUKTest(TestCase):
url = 'https://api.iotuk.org.uk/iotOrganisation'
def _get_connection(self):
def _get_connection(self) -> BaseDataConnector:
return self.plugin(self.url)
def setUp(self):
......@@ -59,8 +59,7 @@ class ConnectorIoTUKTest(TestCase):
def test_plugin_type(self):
connection = self._get_connection()
self.assertEqual(ConnectorType.DATASET,
connection.TYPE)
self.assertFalse(connection.is_catalogue)
def test_plugin_get_data_fails(self):
connection = self._get_connection()
......
......@@ -4,7 +4,7 @@ import typing
from django.test import TestCase
from requests.auth import HTTPBasicAuth
from datasources.connectors.base import BaseDataConnector, ConnectorType, HttpHeaderAuth
from datasources.connectors.base import BaseDataConnector, HttpHeaderAuth
def _get_item_by_key_value(collection: typing.Iterable[typing.Mapping],
......@@ -32,7 +32,7 @@ class ConnectorHyperCatTest(TestCase):
# Met Office dataset for weather at Heathrow
dataset = 'http://api.bt-hypercat.com/sensors/feeds/c7f361c6-7cb7-4ef5-aed9-397a0c0c4088'
def _get_connection(self):
def _get_connection(self) -> BaseDataConnector:
return self.plugin(self.url,
api_key=self.api_key,
auth=HTTPBasicAuth)
......@@ -56,8 +56,7 @@ class ConnectorHyperCatTest(TestCase):
def test_plugin_type(self):
connection = self._get_connection()
self.assertEqual(ConnectorType.CATALOGUE,
connection.TYPE)
self.assertTrue(connection.is_catalogue)
def test_plugin_get_metadata(self):
connection = self.plugin(self.url, auth=HTTPBasicAuth)
......@@ -189,7 +188,7 @@ class ConnectorHyperCatCiscoTest(TestCase):
subcatalogue = 'https://api.cityverve.org.uk/v1/cat/polling-station'
dataset = 'https://api.cityverve.org.uk/v1/entity/polling-station/5'
def _get_connection(self):
def _get_connection(self) -> BaseDataConnector:
return self.plugin(self.url,
api_key=self.api_key,
auth=HttpHeaderAuth)
......@@ -214,8 +213,7 @@ class ConnectorHyperCatCiscoTest(TestCase):
def test_plugin_type(self):
connection = self._get_connection()
self.assertEqual(ConnectorType.CATALOGUE,
connection.TYPE)
self.assertTrue(connection.is_catalogue)
def test_plugin_get_catalogue_metadata(self):
connection = self._get_connection()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment