Skip to content

Commit

Permalink
Naive version
Browse files Browse the repository at this point in the history
  • Loading branch information
khamaileon committed Aug 3, 2023
1 parent 227c5d3 commit cfcdc96
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 22 deletions.
8 changes: 4 additions & 4 deletions routingpy/direction.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,10 @@ def __init__(
:param distance: The distance of the direction in meters.
:type distance: int
:param departure_datetime: The departure timezone aware date and time of the direction.
:param departure_datetime: The departure date and time of the direction.
:type departure_datetime: datetime.datetime
:param arrival_datetime: The arrival timezone aware date and time of the direction.
:param arrival_datetime: The arrival date and time of the direction.
:type arrival_datetime: datetime.datetime
:param raw: The raw response of an individual direction (for multiple alternative routes) or the whole direction
Expand Down Expand Up @@ -134,7 +134,7 @@ def distance(self) -> int:
@property
def departure_datetime(self) -> Optional[datetime.datetime]:
"""
The departure timezone aware date and time of the direction.
The departure date and time of the direction.
:rtype: datetime.datetime or None
"""
Expand All @@ -143,7 +143,7 @@ def departure_datetime(self) -> Optional[datetime.datetime]:
@property
def arrival_datetime(self) -> Optional[datetime.datetime]:
"""
The arrival timezone aware date and time of the direction.
The arrival date and time of the direction.
:rtype: datetime.datetime or None
"""
Expand Down
9 changes: 5 additions & 4 deletions routingpy/routers/google.py
Original file line number Diff line number Diff line change
Expand Up @@ -326,11 +326,12 @@ def directions( # noqa: C901
self.client._request("/directions/json", get_params=params, dry_run=dry_run), alternatives
)

def _time_object_to_aware_datetime(self, time_object):
def _time_object_to_naive_datetime(self, time_object):
timestamp = time_object["value"]
dt = datetime.datetime.fromtimestamp(timestamp)
timezone = pytz.timezone(time_object["time_zone"])
return dt.astimezone(timezone)
aware_dt = dt.astimezone(timezone)
return aware_dt.replace(tzinfo=None)

def _parse_legs(self, legs):
duration = 0
Expand All @@ -343,12 +344,12 @@ def _parse_legs(self, legs):
departure_time = leg.get("departure_time")
if departure_time:
assert len(legs) == 1, "departure_time is only supported for single leg routes"
departure_datetime = self._time_object_to_aware_datetime(departure_time)
departure_datetime = self._time_object_to_naive_datetime(departure_time)

arrival_time = leg.get("arrival_time")
if arrival_time:
assert len(legs) == 1, "arrival_time is only supported for single leg routes"
arrival_datetime = self._time_object_to_aware_datetime(arrival_time)
arrival_datetime = self._time_object_to_naive_datetime(arrival_time)

duration += leg["duration"]["value"]
distance += leg["distance"]["value"]
Expand Down
24 changes: 16 additions & 8 deletions routingpy/routers/opentripplanner_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
import datetime
from typing import List, Optional

import pytz

from .. import convert, utils
from ..client_base import DEFAULT
from ..client_default import Client
Expand Down Expand Up @@ -97,6 +99,7 @@ def directions(
profile: Optional[str] = "WALK,TRANSIT",
date: Optional[datetime.date] = datetime.datetime.now().date(),
time: Optional[datetime.time] = datetime.datetime.now().time(),
timezone: Optional[str] = "UTC",
arrive_by: Optional[bool] = False,
num_itineraries: Optional[int] = 3,
dry_run: Optional[bool] = None,
Expand All @@ -118,6 +121,10 @@ def directions(
:param time: Time of departure or arrival. Default value: current time.
:type time: datetime.time
:param timezone: Timezone used to transform output departure and arrival timestamps to naive
datetimes. Default value: UTC.
:type time: str
:arrive_by: Whether the itinerary should depart at the specified time (False), or arrive to
the destination at the specified time (True). Default value: False.
:type arrive_by: bool
Expand Down Expand Up @@ -165,21 +172,22 @@ def directions(
response = self.client._request(
"/otp/routers/default/index/graphql", post_params=params, dry_run=dry_run
)
return self._parse_directions_response(response, num_itineraries)
return self._parse_directions_response(response, num_itineraries, timezone)

def _timestamp_to_utc_datetime(self, timestamp):
def _timestamp_to_naive_datetime(self, timestamp, timezone):
dt = datetime.datetime.fromtimestamp(timestamp / 1000)
return dt.astimezone(datetime.timezone.utc)
aware_dt = dt.astimezone(pytz.timezone(timezone))
return aware_dt.replace(tzinfo=None)

def _parse_directions_response(self, response, num_itineraries):
def _parse_directions_response(self, response, num_itineraries, timezone):
if response is None: # pragma: no cover
return Directions() if num_itineraries > 1 else Direction()

directions = []
for itinerary in response["data"]["plan"]["itineraries"]:
for itinerary in response["data"]["plan"]["itineraries"][1:2]:
distance, geometry = self._parse_legs(itinerary["legs"])
departure_datetime = self._timestamp_to_utc_datetime(itinerary["startTime"])
arrival_datetime = self._timestamp_to_utc_datetime(itinerary["endTime"])
departure_datetime = self._timestamp_to_naive_datetime(itinerary["startTime"], timezone)
arrival_datetime = self._timestamp_to_naive_datetime(itinerary["endTime"], timezone)
directions.append(
Direction(
geometry=geometry,
Expand All @@ -202,7 +210,7 @@ def _parse_legs(self, legs):
geometry = []
for leg in legs:
points = utils.decode_polyline5(leg["legGeometry"]["points"])
geometry.extend(list(reversed(points)))
geometry.extend(points)
distance += int(leg["distance"])

return distance, geometry
Expand Down
4 changes: 2 additions & 2 deletions tests/test_google.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,9 @@ def test_directions_transit(self):
self.assertIsInstance(direction.distance, int)
self.assertIsInstance(direction.duration, int)
self.assertIsInstance(direction.departure_datetime, datetime.datetime)
self.assertEqual(direction.departure_datetime.tzinfo.zone, "Europe/Berlin")
self.assertEqual(direction.departure_datetime.tzinfo, None)
self.assertIsInstance(direction.arrival_datetime, datetime.datetime)
self.assertEqual(direction.arrival_datetime.tzinfo.zone, "Europe/Berlin")
self.assertEqual(direction.arrival_datetime.tzinfo, None)
self.assertIsInstance(direction.raw, dict)

@responses.activate
Expand Down
8 changes: 4 additions & 4 deletions tests/test_opentripplanner_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,9 @@ def test_directions(self):
self.assertIsInstance(direction.duration, int)
self.assertIsInstance(direction.geometry, list)
self.assertIsInstance(direction.departure_datetime, datetime.datetime)
self.assertEqual(direction.departure_datetime.tzinfo, datetime.timezone.utc)
self.assertEqual(direction.departure_datetime.tzinfo, None)
self.assertIsInstance(direction.arrival_datetime, datetime.datetime)
self.assertEqual(direction.arrival_datetime.tzinfo, datetime.timezone.utc)
self.assertEqual(direction.arrival_datetime.tzinfo, None)

@responses.activate
def test_directions_alternative(self):
Expand All @@ -85,9 +85,9 @@ def test_directions_alternative(self):
self.assertIsInstance(direction.geometry, list)
self.assertIsInstance(direction.raw, dict)
self.assertIsInstance(direction.departure_datetime, datetime.datetime)
self.assertEqual(direction.departure_datetime.tzinfo, datetime.timezone.utc)
self.assertEqual(direction.departure_datetime.tzinfo, None)
self.assertIsInstance(direction.arrival_datetime, datetime.datetime)
self.assertEqual(direction.arrival_datetime.tzinfo, datetime.timezone.utc)
self.assertEqual(direction.arrival_datetime.tzinfo, None)

@responses.activate
def test_isochrones(self):
Expand Down

0 comments on commit cfcdc96

Please sign in to comment.