Skip to content
This repository has been archived by the owner on Aug 2, 2022. It is now read-only.

Commit

Permalink
Merge pull request #43 from mapbox/distance
Browse files Browse the repository at this point in the history
Distance
  • Loading branch information
sgillies committed Oct 27, 2015
2 parents 06c3ee2 + 888828e commit af0ac6d
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 1 deletion.
3 changes: 2 additions & 1 deletion mapbox/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
__version__ = "0.2.0"

from .services.base import Service
from .services.directions import Directions
from .services.distance import Distance
from .services.geocoding import Geocoder, InvalidPlaceTypeError
from .services.upload import Uploader
from .services.directions import Directions
28 changes: 28 additions & 0 deletions mapbox/services/distance.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from uritemplate import URITemplate
from mapbox.encoding import encode_coordinates_json
from .base import Service


class Distance(Service):

def __init__(self, profile='driving', access_token=None):
self.profile = self._validate_profile(profile)
self.baseuri = 'https://api.mapbox.com/distances/v1/mapbox'
self.session = self.get_session(access_token)

def _validate_profile(self, profile):
valid_profiles = ['driving', 'cycling', 'walking']
if profile not in valid_profiles:
raise ValueError("{} is not a valid profile".format(profile))
return profile

def distances(self, features):
coords = encode_coordinates_json(features)

uri = URITemplate('%s/{profile}' % self.baseuri).expand(
profile=self.profile)

res = self.session.post(uri, data=coords,
headers={'Content-Type': 'application/json'})
self.handle_http_error(res)
return res
61 changes: 61 additions & 0 deletions tests/test_distances.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import responses
import mapbox


points = [{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Point",
"coordinates": [
-87.337875,
36.539156]}}, {
"type": "Feature",
"properties": {},
"geometry": {
"type": "Point",
"coordinates": [
-86.577791,
36.722137
]}}, {
"type": "Feature",
"properties": {},
"geometry": {
"type": "Point",
"coordinates": [
-88.247685,
36.922175]}}]


@responses.activate
def test_distance():

responses.add(
responses.POST,
'https://api.mapbox.com/distances/v1/mapbox/driving?access_token=pk.test',
match_querystring=True,
body='{"durations":[[0,4977,5951],[4963,0,9349],[5881,9317,0]]}',
status=200,
content_type='application/json')

res = mapbox.Distance(access_token='pk.test').distances(points)
assert res.status_code == 200
assert list(res.json().keys()) == ["durations", ]


@responses.activate
def test_distances_matrix():

responses.add(
responses.POST,
'https://api.mapbox.com/distances/v1/mapbox/driving?access_token=pk.test',
match_querystring=True,
body='{"durations":[[0,4977,5951],[4963,0,9349],[5881,9317,0]]}',
status=200,
content_type='application/json')

res = mapbox.Distance(access_token='pk.test').distances(points)
matrix = res.json()['durations']
# 3x3 list
assert len(matrix) == 3
assert len(matrix[0]) == 3

0 comments on commit af0ac6d

Please sign in to comment.