diff --git a/.gitignore b/.gitignore index a44e0f5e09d5e800601f266a85244d3d3b530711..72c9e73f1f170fe9163385cc9b354d8fe3f641f0 100644 --- a/.gitignore +++ b/.gitignore @@ -25,5 +25,9 @@ ubuntu-bionic-18.04-cloudimg-console.log /docs/build/ /docs/source/apidoc/ +# Notes +/data/ +/notes/ + # Experimental /applications/connectors/ diff --git a/datasources/connectors/hypercat.py b/datasources/connectors/hypercat.py index ba37216c9a8001220340995e9c916bd9a03b2e88..8616c0ff014bc703eed8eef38f2be75095f7dc95 100644 --- a/datasources/connectors/hypercat.py +++ b/datasources/connectors/hypercat.py @@ -86,12 +86,38 @@ class HyperCat(DataConnectorContainsDatasets, DataConnectorHasMetadata, BaseData return matches[0] def _get_response(self, query_params: typing.Optional[typing.Mapping[str, str]] = None): - r = requests.get(self.location, params=query_params) + # r = requests.get(self.location, params=query_params) + r = self._get_auth_request(self.location, + query_params=query_params) return r.json() + def _get_auth_request(self, url, **kwargs): + return requests.get(url, + auth=requests.auth.HTTPBasicAuth(self.api_key, ''), + **kwargs) + def __enter__(self): self._response = self._get_response() return self def __exit__(self, exc_type, exc_val, exc_tb): pass + + +class HyperCatCisco(HyperCat): + def __init__(self, location: str, + api_key: typing.Optional[str] = None, + entity_url: str = None): + super().__init__(location, api_key=api_key) + + self.entity_url = entity_url + + def get_entities(self): + r = self._get_auth_request(self.entity_url) + return r.json() + + def _get_auth_request(self, url, **kwargs): + return requests.get(url, + # Doesn't accept HttpBasicAuth + headers={'Authorization': self.api_key}, + **kwargs) diff --git a/datasources/tests/test_connectors.py b/datasources/tests/test_connectors.py index 94538279495cb40b4afe98c1267c02ee42046b9b..b3e09fb8f042368587b2e84d225cd7aa14a2f562 100644 --- a/datasources/tests/test_connectors.py +++ b/datasources/tests/test_connectors.py @@ -136,3 +136,75 @@ class ConnectorHyperCatTest(TestCase): self.assertIsInstance(result, str) self.assertGreaterEqual(len(result), 1) + + +class ConnectorHyperCatCiscoTest(TestCase): + url = 'https://api.cityverve.org.uk/v1/cat' + entity_url = 'https://api.cityverve.org.uk/v1/entity' + + dataset = 'weather-observations-wind' + + def setUp(self): + from decouple import config + + BaseDataConnector.load_plugins('datasources/connectors') + self.plugin = BaseDataConnector.get_plugin('HyperCatCisco') + + self.api_key = config('HYPERCAT_CISCO_API_KEY') + + def test_get_plugin(self): + self.assertIsNotNone(self.plugin) + + def test_plugin_init(self): + connection = self.plugin(self.url) + self.assertEqual(connection.location, self.url) + + def test_plugin_get_entities(self): + connection = self.plugin(self.url, + api_key=self.api_key, + entity_url=self.entity_url) + result = connection.get_entities() + + self.assertGreaterEqual(len(result), 1) + + for entity in result: + self.assertIn('id', entity) + self.assertIn('uri', entity) + + def test_plugin_get_catalogue_metadata(self): + connection = self.plugin(self.url) + result = connection.get_metadata() + + self.assertIn('application/vnd.hypercat.catalogue+json', + result['urn:X-hypercat:rels:isContentType']) + + self.assertIn('CityVerve', + result['urn:X-hypercat:rels:hasDescription:en'][0]) + + self.assertEqual('https://developer.cityverve.org.uk', + result['urn:X-hypercat:rels:hasHomepage']) + + def test_plugin_get_dataset_metadata(self): + connection = self.plugin(self.url) + result = connection.get_metadata(dataset=self.dataset) + + for property in [ + 'urn:X-bt:rels:feedTitle', + 'urn:X-hypercat:rels:hasDescription:en', + 'urn:X-bt:rels:feedTag', + 'urn:X-bt:rels:hasSensorStream', + 'urn:X-hypercat:rels:isContentType', + ]: + self.assertIn(property, result) + + self.assertIn('Met Office', + result['urn:X-bt:rels:feedTitle'][0]) + + self.assertIn('Met Office', + result['urn:X-hypercat:rels:hasDescription:en'][0]) + + self.assertEqual(len(result['urn:X-bt:rels:feedTag']), 1) + self.assertEqual(result['urn:X-bt:rels:feedTag'][0], 'weather') + + self.assertGreaterEqual(len(result['urn:X-bt:rels:hasSensorStream']), 1) +