diff --git a/elodie/geolocation.py b/elodie/geolocation.py index a12dd23..a8251d5 100644 --- a/elodie/geolocation.py +++ b/elodie/geolocation.py @@ -31,7 +31,7 @@ def coordinates_by_name(name): } # If the name is not cached then we go ahead with an API lookup - geolocation_info = lookup(name) + geolocation_info = lookup(location=name) if(geolocation_info is not None): if( @@ -129,7 +129,7 @@ def place_name(lat, lon): return cached_place_name lookup_place_name = None - geolocation_info = reverse_lookup(lat, lon) + geolocation_info = lookup(lat=lat, lon=lon) if(geolocation_info is not None): if('address' in geolocation_info): address = geolocation_info['address'] @@ -147,8 +147,12 @@ def place_name(lat, lon): return lookup_place_name -def reverse_lookup(lat, lon): - if(lat is None or lon is None): +def lookup(**kwargs): + if( + 'location' not in kwargs and + 'lat' not in kwargs and + 'lon' not in kwargs + ): return None key = get_key() @@ -157,13 +161,19 @@ def reverse_lookup(lat, lon): return None try: - params = {'format': 'json', 'key': key, 'lat': lat, 'lon': lon} - headers = {"Accept-Language": constants.accepted_language} - r = requests.get( - 'http://open.mapquestapi.com/nominatim/v1/reverse.php?%s' % - urllib.parse.urlencode(params), headers=headers - ) - return r.json() + params = {'format': 'json', 'key': key} + params.update(kwargs) + path = '/geocoding/v1/address' + if('lat' in kwargs and 'lon' in kwargs): + path = '/nominatim/v1/reverse.php' + url = 'http://open.mapquestapi.com%s?%s' % ( + path, + urllib.parse.urlencode(params) + ) + if(constants.debug is True): + print(url) + r = requests.get(url) + return parse_result(r.json()) except requests.exceptions.RequestException as e: if(constants.debug is True): print(e) @@ -175,30 +185,19 @@ def reverse_lookup(lat, lon): return None -def lookup(name): - if(name is None or len(name) == 0): +def parse_result(result): + if('error' in result): return None - key = get_key() + if( + 'results' in result and + len(result['results']) > 0 and + 'locations' in result['results'][0] + and len(result['results'][0]['locations']) > 0 and + 'latLng' in result['results'][0]['locations'][0] + ): + latLng = result['results'][0]['locations'][0]['latLng'] + if(latLng['lat'] == 39.78373 and latLng['lng'] == -100.445882): + return None - if(key is None): - return None - - try: - params = {'format': 'json', 'key': key, 'location': name} - if(constants.debug is True): - print('http://open.mapquestapi.com/geocoding/v1/address?%s' % urllib.parse.urlencode(params)) # noqa - r = requests.get( - 'http://open.mapquestapi.com/geocoding/v1/address?%s' % - urllib.parse.urlencode(params) - ) - return r.json() - except requests.exceptions.RequestException as e: - if(constants.debug is True): - print(e) - return None - except ValueError as e: - if(constants.debug is True): - print(r.text) - print(e) - return None + return result diff --git a/elodie/tests/elodie_test.py b/elodie/tests/elodie_test.py index 97749bf..4a242c5 100644 --- a/elodie/tests/elodie_test.py +++ b/elodie/tests/elodie_test.py @@ -144,7 +144,7 @@ def test_update_location_on_audio(): shutil.rmtree(folder_destination) assert status == True, status - assert metadata['latitude'] != metadata_processed['latitude'] + assert metadata['latitude'] != metadata_processed['latitude'], metadata_processed['latitude'] assert helper.isclose(metadata_processed['latitude'], 37.36883), metadata_processed['latitude'] assert helper.isclose(metadata_processed['longitude'], -122.03635), metadata_processed['longitude'] diff --git a/elodie/tests/geolocation_test.py b/elodie/tests/geolocation_test.py index f6c323e..2a6cb6f 100644 --- a/elodie/tests/geolocation_test.py +++ b/elodie/tests/geolocation_test.py @@ -3,6 +3,7 @@ from __future__ import division from builtins import range from past.utils import old_div # Project imports +import mock import os import random import re @@ -77,24 +78,103 @@ def test_dms_string_longitude(): assert check_value in dms_string, '%s not in %s' % (check_value, dms_string) assert str(dms[0]) in dms_string, '%s not in %s' % (dms[0], dms_string) +def test_reverse_lookup_with_valid_key(): + res = geolocation.lookup(lat=37.368, lon=-122.03) + assert res['address']['city'] == 'Sunnyvale', res + +def test_reverse_lookup_with_invalid_lat_lon(): + res = geolocation.lookup(lat=999, lon=999) + assert res is None, res + +@mock.patch('elodie.geolocation.__KEY__', 'invalid_key') def test_reverse_lookup_with_invalid_key(): - geolocation.__KEY__ = 'invalid_key' - res = geolocation.reverse_lookup(123.45, 123.45) + res = geolocation.lookup(lat=37.368, lon=-122.03) assert res is None, res -@patch('elodie.geolocation.constants') -def test_reverse_lookup_with_no_key(mock_constants): - mock_constants.application_directory = 'invalid path' - res = geolocation.reverse_lookup(123.45, 123.45) +def test_lookup_with_valid_key(): + res = geolocation.lookup(location='Sunnyvale, CA') + latLng = res['results'][0]['locations'][0]['latLng'] + assert latLng['lat'] == 37.36883, latLng + assert latLng['lng'] == -122.03635, latLng + +def test_lookup_with_invalid_location(): + res = geolocation.lookup(location='foobar dne') assert res is None, res +@mock.patch('elodie.geolocation.__KEY__', 'invalid_key') def test_lookup_with_invalid_key(): - geolocation.__KEY__ = 'invalid_key' - res = geolocation.lookup('foo') + res = geolocation.lookup(location='Sunnyvale, CA') assert res is None, res -@patch('elodie.geolocation.constants') -def test_lookup_with_no_key(mock_constants): - mock_constants.application_directory = 'invalid path' - res = geolocation.lookup('foo') +@mock.patch('elodie.geolocation.__KEY__', '') +def test_lookup_with_no_key(): + res = geolocation.lookup(location='Sunnyvale, CA') + assert res is None, res + +def test_parse_result_with_error(): + res = geolocation.parse_result({'error': 'foo'}) + assert res is None, res + +def test_parse_result_with_city(): + # http://open.mapquestapi.com/nominatim/v1/reverse.php?lat=37.368&lon=-122.03&key=key_goes_here&format=json + results = { + "place_id": "60197412", + "osm_type": "way", + "osm_id": "30907961", + "lat": "37.36746105", + "lon": "-122.030237558742", + "display_name": "111, East El Camino Real, Sunnyvale, Santa Clara County, California, 94087, United States of America", + "address": { + "house_number": "111", + "road": "East El Camino Real", + "city": "Sunnyvale", + "county": "Santa Clara County", + "state": "California", + "postcode": "94087", + "country": "United States of America", + "country_code": "us" + } + } + + res = geolocation.parse_result(results) + assert res == results, res + +def test_parse_result_with_lat_lon(): + # http://open.mapquestapi.com/geocoding/v1/address?location=abcdefghijklmnopqrstuvwxyz&key=key_goes_here&format=json + results = { + "results": [ + { + "locations": [ + { + "latLng": { + "lat": 123.00, + "lng": -142.99 + } + } + ] + } + ] + } + + res = geolocation.parse_result(results) + assert res == results, res + +def test_parse_result_with_unknown_lat_lon(): + # http://open.mapquestapi.com/geocoding/v1/address?location=abcdefghijklmnopqrstuvwxyz&key=key_goes_here&format=json + results = { + "results": [ + { + "locations": [ + { + "latLng": { + "lat": 39.78373, + "lng": -100.445882 + } + } + ] + } + ] + } + + res = geolocation.parse_result(results) assert res is None, res