Skip to content

Commit

Permalink
Rollback to timezone aware version
Browse files Browse the repository at this point in the history
  • Loading branch information
khamaileon committed Aug 5, 2023
1 parent 1fb9c70 commit e303406
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 31 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 date and time of the direction.
:param departure_datetime: The departure date and time (timezone aware) of the direction.
:type departure_datetime: datetime.datetime
:param arrival_datetime: The arrival date and time of the direction.
:param arrival_datetime: The arrival date and time (timezone aware) 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 date and time of the direction.
The departure date and time (timezone aware) 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 date and time of the direction.
The arrival date and time (timezone aware) of the direction.
:rtype: datetime.datetime or None
"""
Expand Down
11 changes: 5 additions & 6 deletions routingpy/routers/google.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,8 +189,8 @@ def directions( # noqa: C901
language: Optional[str] = None,
region: Optional[str] = None,
units: Optional[str] = None,
departure_time: Optional[int] = None,
arrival_time: Optional[int] = None,
departure_time: Optional[int] = None,
traffic_model: Optional[str] = None,
transit_mode: Optional[Union[List[str], Tuple[str]]] = None,
transit_routing_preference: Optional[str] = None,
Expand Down Expand Up @@ -326,12 +326,11 @@ def directions( # noqa: C901
self.client._request("/directions/json", get_params=params, dry_run=dry_run), alternatives
)

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

def _parse_legs(self, legs):
duration = 0
Expand All @@ -348,11 +347,11 @@ def _parse_legs(self, legs):

departure_time = legs[0].get("departure_time")
if departure_time:
departure_datetime = self._time_object_to_naive_datetime(departure_time)
departure_datetime = self._time_object_to_aware_datetime(departure_time)

arrival_time = legs[-1].get("arrival_time")
if arrival_time:
arrival_datetime = self._time_object_to_naive_datetime(arrival_time)
arrival_datetime = self._time_object_to_aware_datetime(arrival_time)

return duration, distance, geometry, departure_datetime, arrival_datetime

Expand Down
22 changes: 7 additions & 15 deletions routingpy/routers/opentripplanner_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@
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 @@ -99,7 +97,6 @@ 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 @@ -121,10 +118,6 @@ 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 @@ -172,22 +165,21 @@ 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, timezone)
return self._parse_directions_response(response, num_itineraries)

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

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

directions = []
for itinerary in response["data"]["plan"]["itineraries"]:
distance, geometry = self._parse_legs(itinerary["legs"])
departure_datetime = self._timestamp_to_naive_datetime(itinerary["startTime"], timezone)
arrival_datetime = self._timestamp_to_naive_datetime(itinerary["endTime"], timezone)
departure_datetime = self._timestamp_to_utc_datetime(itinerary["startTime"])
arrival_datetime = self._timestamp_to_utc_datetime(itinerary["endTime"])
directions.append(
Direction(
geometry=geometry,
Expand All @@ -210,7 +202,7 @@ def _parse_legs(self, legs):
geometry = []
for leg in legs:
points = utils.decode_polyline5(leg["legGeometry"]["points"])
geometry.extend(points)
geometry.extend(list(reversed(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, None)
self.assertEqual(direction.departure_datetime.tzinfo.zone, "Europe/Berlin")
self.assertIsInstance(direction.arrival_datetime, datetime.datetime)
self.assertEqual(direction.arrival_datetime.tzinfo, None)
self.assertEqual(direction.arrival_datetime.tzinfo.zone, "Europe/Berlin")
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, None)
self.assertEqual(direction.departure_datetime.tzinfo, datetime.timezone.utc)
self.assertIsInstance(direction.arrival_datetime, datetime.datetime)
self.assertEqual(direction.arrival_datetime.tzinfo, None)
self.assertEqual(direction.arrival_datetime.tzinfo, datetime.timezone.utc)

@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, None)
self.assertEqual(direction.departure_datetime.tzinfo, datetime.timezone.utc)
self.assertIsInstance(direction.arrival_datetime, datetime.datetime)
self.assertEqual(direction.arrival_datetime.tzinfo, None)
self.assertEqual(direction.arrival_datetime.tzinfo, datetime.timezone.utc)

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

0 comments on commit e303406

Please sign in to comment.