Skip to content

Commit f0665e6

Browse files
committed
Rollback to timezone aware version
1 parent 1fb9c70 commit f0665e6

File tree

6 files changed

+32
-41
lines changed

6 files changed

+32
-41
lines changed

routingpy/direction.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,10 @@ def __init__(
8787
:param distance: The distance of the direction in meters.
8888
:type distance: int
8989
90-
:param departure_datetime: The departure date and time of the direction.
90+
:param departure_datetime: The departure timezone aware datetime of the direction.
9191
:type departure_datetime: datetime.datetime
9292
93-
:param arrival_datetime: The arrival date and time of the direction.
93+
:param arrival_datetime: The arrival timezone aware datetime of the direction.
9494
:type arrival_datetime: datetime.datetime
9595
9696
: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:
134134
@property
135135
def departure_datetime(self) -> Optional[datetime.datetime]:
136136
"""
137-
The departure date and time of the direction.
137+
The departure timezone aware datetime of the direction.
138138
139139
:rtype: datetime.datetime or None
140140
"""
@@ -143,7 +143,7 @@ def departure_datetime(self) -> Optional[datetime.datetime]:
143143
@property
144144
def arrival_datetime(self) -> Optional[datetime.datetime]:
145145
"""
146-
The arrival date and time of the direction.
146+
The arrival timezone aware datetime of the direction.
147147
148148
:rtype: datetime.datetime or None
149149
"""

routingpy/routers/google.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,8 @@ def directions( # noqa: C901
189189
language: Optional[str] = None,
190190
region: Optional[str] = None,
191191
units: Optional[str] = None,
192-
departure_time: Optional[int] = None,
193192
arrival_time: Optional[int] = None,
193+
departure_time: Optional[int] = None,
194194
traffic_model: Optional[str] = None,
195195
transit_mode: Optional[Union[List[str], Tuple[str]]] = None,
196196
transit_routing_preference: Optional[str] = None,
@@ -326,12 +326,11 @@ def directions( # noqa: C901
326326
self.client._request("/directions/json", get_params=params, dry_run=dry_run), alternatives
327327
)
328328

329-
def _time_object_to_naive_datetime(self, time_object):
329+
def _time_object_to_aware_datetime(self, time_object):
330330
timestamp = time_object["value"]
331331
dt = datetime.datetime.fromtimestamp(timestamp)
332332
timezone = pytz.timezone(time_object["time_zone"])
333-
aware_dt = dt.astimezone(timezone)
334-
return aware_dt.replace(tzinfo=None)
333+
return dt.astimezone(timezone)
335334

336335
def _parse_legs(self, legs):
337336
duration = 0
@@ -348,11 +347,11 @@ def _parse_legs(self, legs):
348347

349348
departure_time = legs[0].get("departure_time")
350349
if departure_time:
351-
departure_datetime = self._time_object_to_naive_datetime(departure_time)
350+
departure_datetime = self._time_object_to_aware_datetime(departure_time)
352351

353352
arrival_time = legs[-1].get("arrival_time")
354353
if arrival_time:
355-
arrival_datetime = self._time_object_to_naive_datetime(arrival_time)
354+
arrival_datetime = self._time_object_to_aware_datetime(arrival_time)
356355

357356
return duration, distance, geometry, departure_datetime, arrival_datetime
358357

routingpy/routers/opentripplanner_v2.py

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
import datetime
1818
from typing import List, Optional
1919

20-
import pytz
21-
2220
from .. import convert, utils
2321
from ..client_base import DEFAULT
2422
from ..client_default import Client
@@ -99,7 +97,6 @@ def directions(
9997
profile: Optional[str] = "WALK,TRANSIT",
10098
date: Optional[datetime.date] = datetime.datetime.now().date(),
10199
time: Optional[datetime.time] = datetime.datetime.now().time(),
102-
timezone: Optional[str] = "UTC",
103100
arrive_by: Optional[bool] = False,
104101
num_itineraries: Optional[int] = 3,
105102
dry_run: Optional[bool] = None,
@@ -121,10 +118,6 @@ def directions(
121118
:param time: Time of departure or arrival. Default value: current time.
122119
:type time: datetime.time
123120
124-
:param timezone: Timezone used to transform output departure and arrival timestamps to naive
125-
datetimes. Default value: UTC.
126-
:type time: str
127-
128121
:arrive_by: Whether the itinerary should depart at the specified time (False), or arrive to
129122
the destination at the specified time (True). Default value: False.
130123
:type arrive_by: bool
@@ -172,22 +165,21 @@ def directions(
172165
response = self.client._request(
173166
"/otp/routers/default/index/graphql", post_params=params, dry_run=dry_run
174167
)
175-
return self._parse_directions_response(response, num_itineraries, timezone)
168+
return self._parse_directions_response(response, num_itineraries)
176169

177-
def _timestamp_to_naive_datetime(self, timestamp, timezone):
170+
def _timestamp_to_utc_datetime(self, timestamp):
178171
dt = datetime.datetime.fromtimestamp(timestamp / 1000)
179-
aware_dt = dt.astimezone(pytz.timezone(timezone))
180-
return aware_dt.replace(tzinfo=None)
172+
return dt.astimezone(datetime.timezone.utc)
181173

182-
def _parse_directions_response(self, response, num_itineraries, timezone):
174+
def _parse_directions_response(self, response, num_itineraries):
183175
if response is None: # pragma: no cover
184176
return Directions() if num_itineraries > 1 else Direction()
185177

186178
directions = []
187179
for itinerary in response["data"]["plan"]["itineraries"]:
188180
distance, geometry = self._parse_legs(itinerary["legs"])
189-
departure_datetime = self._timestamp_to_naive_datetime(itinerary["startTime"], timezone)
190-
arrival_datetime = self._timestamp_to_naive_datetime(itinerary["endTime"], timezone)
181+
departure_datetime = self._timestamp_to_utc_datetime(itinerary["startTime"])
182+
arrival_datetime = self._timestamp_to_utc_datetime(itinerary["endTime"])
191183
directions.append(
192184
Direction(
193185
geometry=geometry,
@@ -210,7 +202,7 @@ def _parse_legs(self, legs):
210202
geometry = []
211203
for leg in legs:
212204
points = utils.decode_polyline5(leg["legGeometry"]["points"])
213-
geometry.extend(points)
205+
geometry.extend(list(reversed(points)))
214206
distance += int(leg["distance"])
215207

216208
return distance, geometry
@@ -233,7 +225,7 @@ def isochrones(
233225
use. Default: "WALK,TRANSIT"
234226
:type profile: str
235227
236-
:time: Departure date and time (timezone aware). The default value is now (UTC).
228+
:time: Departure datetime (timezone aware). The default value is now (UTC).
237229
:type time: datetime.datetime
238230
239231
:cutoff: The maximum travel duration in seconds. The default value is one hour.
@@ -298,7 +290,7 @@ def raster(
298290
use. Default: "WALK,TRANSIT"
299291
:type profile: str
300292
301-
:time: Departure date and time (timezone aware). The default value is now (UTC).
293+
:time: Departure datetime (timezone aware). The default value is now (UTC).
302294
:type time: datetime.datetime
303295
304296
:cutoff: The maximum travel duration in seconds. The default value is one hour.

routingpy/routers/valhalla.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,8 @@ def directions(
169169
efficient to use avoid_locations. Valhalla will close open rings (i.e. copy the first coordingate to the
170170
last position).
171171
172-
:param date_time: This is the local date and time at the location. Field ``type``: 0: Current departure time,
173-
1: Specified departure time. Field ``value```: the date and time is specified
172+
:param date_time: This is the local datetime at the location. Field ``type``: 0: Current departure time,
173+
1: Specified departure time. Field ``value```: the datetime is specified
174174
in ISO 8601 format (YYYY-MM-DDThh:mm), local time.
175175
E.g. date_time = {type: 0, value: 2021-03-03T08:06:23}
176176
@@ -353,8 +353,8 @@ def isochrones( # noqa: C901
353353
efficient to use avoid_locations. Valhalla will close open rings (i.e. copy the first coordingate to the
354354
last position).
355355
356-
:param date_time: This is the local date and time at the location. Field ``type``: 0: Current departure time,
357-
1: Specified departure time. Field ``value```: the date and time is specified
356+
:param date_time: This is the local datetime at the location. Field ``type``: 0: Current departure time,
357+
1: Specified departure time. Field ``value```: the datetime is specified
358358
in format YYYY-MM-DDThh:mm, local time.
359359
360360
E.g. date_time = {type: 0, value: 2021-03-03T08:06}
@@ -548,8 +548,8 @@ def matrix(
548548
549549
:param units: Distance units for output. One of ['mi', 'km']. Default km.
550550
551-
:param date_time: This is the local date and time at the location. Field ``type``: 0: Current departure time,
552-
1: Specified departure time. Field ``value```: the date and time is specified
551+
:param date_time: This is the local datetime at the location. Field ``type``: 0: Current departure time,
552+
1: Specified departure time. Field ``value```: the datetime is specified
553553
in format YYYY-MM-DDThh:mm, local time.
554554
555555
:param id: Name your route request. If id is specified, the naming will be sent through to the response.
@@ -703,8 +703,8 @@ def expansion(
703703
will be filled automatically. For more information, visit:
704704
https://github.com/valhalla/valhalla/blob/master/docs/api/turn-by-turn/api-reference.md#costing-options
705705
706-
:param date_time: This is the local date and time at the location. Field ``type``: 0: Current departure time,
707-
1: Specified departure time. Field ``value```: the date and time is specified
706+
:param date_time: This is the local datetime at the location. Field ``type``: 0: Current departure time,
707+
1: Specified departure time. Field ``value```: the datetime is specified
708708
in format YYYY-MM-DDThh:mm, local time.
709709
710710
E.g. date_time = {type: 0, value: 2021-03-03T08:06}

tests/test_google.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,9 @@ def test_directions_transit(self):
9191
self.assertIsInstance(direction.distance, int)
9292
self.assertIsInstance(direction.duration, int)
9393
self.assertIsInstance(direction.departure_datetime, datetime.datetime)
94-
self.assertEqual(direction.departure_datetime.tzinfo, None)
94+
self.assertEqual(direction.departure_datetime.tzinfo.zone, "Europe/Berlin")
9595
self.assertIsInstance(direction.arrival_datetime, datetime.datetime)
96-
self.assertEqual(direction.arrival_datetime.tzinfo, None)
96+
self.assertEqual(direction.arrival_datetime.tzinfo.zone, "Europe/Berlin")
9797
self.assertIsInstance(direction.raw, dict)
9898

9999
@responses.activate

tests/test_opentripplanner_v2.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ def test_directions(self):
5656
self.assertIsInstance(direction.duration, int)
5757
self.assertIsInstance(direction.geometry, list)
5858
self.assertIsInstance(direction.departure_datetime, datetime.datetime)
59-
self.assertEqual(direction.departure_datetime.tzinfo, None)
59+
self.assertEqual(direction.departure_datetime.tzinfo, datetime.timezone.utc)
6060
self.assertIsInstance(direction.arrival_datetime, datetime.datetime)
61-
self.assertEqual(direction.arrival_datetime.tzinfo, None)
61+
self.assertEqual(direction.arrival_datetime.tzinfo, datetime.timezone.utc)
6262

6363
@responses.activate
6464
def test_directions_alternative(self):
@@ -85,9 +85,9 @@ def test_directions_alternative(self):
8585
self.assertIsInstance(direction.geometry, list)
8686
self.assertIsInstance(direction.raw, dict)
8787
self.assertIsInstance(direction.departure_datetime, datetime.datetime)
88-
self.assertEqual(direction.departure_datetime.tzinfo, None)
88+
self.assertEqual(direction.departure_datetime.tzinfo, datetime.timezone.utc)
8989
self.assertIsInstance(direction.arrival_datetime, datetime.datetime)
90-
self.assertEqual(direction.arrival_datetime.tzinfo, None)
90+
self.assertEqual(direction.arrival_datetime.tzinfo, datetime.timezone.utc)
9191

9292
@responses.activate
9393
def test_isochrones(self):

0 commit comments

Comments
 (0)