diff --git a/routingpy/direction.py b/routingpy/direction.py index 2cb6aa1..d6a5732 100644 --- a/routingpy/direction.py +++ b/routingpy/direction.py @@ -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 @@ -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 """ @@ -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 """ diff --git a/routingpy/routers/google.py b/routingpy/routers/google.py index 1d57a93..c1e571b 100644 --- a/routingpy/routers/google.py +++ b/routingpy/routers/google.py @@ -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, @@ -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 @@ -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 diff --git a/routingpy/routers/opentripplanner_v2.py b/routingpy/routers/opentripplanner_v2.py index b50d7a9..f9a8eba 100644 --- a/routingpy/routers/opentripplanner_v2.py +++ b/routingpy/routers/opentripplanner_v2.py @@ -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 @@ -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, @@ -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 @@ -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, @@ -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 diff --git a/tests/test_google.py b/tests/test_google.py index 6b526c6..3a1af98 100644 --- a/tests/test_google.py +++ b/tests/test_google.py @@ -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 diff --git a/tests/test_opentripplanner_v2.py b/tests/test_opentripplanner_v2.py index 8a354cd..faa1b55 100644 --- a/tests/test_opentripplanner_v2.py +++ b/tests/test_opentripplanner_v2.py @@ -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): @@ -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):