r5py 1.0.2__py3-none-any.whl → 1.0.3.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of r5py might be problematic. Click here for more details.

r5py/__init__.py CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  """Python wrapper for the R5 routing analysis engine."""
4
4
 
5
- __version__ = "1.0.2"
5
+ __version__ = "1.0.3.dev0"
6
6
 
7
7
 
8
8
  from .r5 import (
r5py/r5/regional_task.py CHANGED
@@ -194,8 +194,10 @@ class RegionalTask:
194
194
  ):
195
195
  # fmt: on
196
196
  warnings.warn(
197
- f"Departure time {departure} is outside of the time range "
198
- "covered by currently loaded GTFS data sets.",
197
+ (
198
+ "The currently loaded GTFS data sets do not define "
199
+ f"any services on {departure.date()}."
200
+ ),
199
201
  RuntimeWarning,
200
202
  )
201
203
 
r5py/r5/transit_layer.py CHANGED
@@ -4,13 +4,12 @@
4
4
  """Wraps a com.conveyal.r5.transit.TransitLayer."""
5
5
 
6
6
 
7
- import datetime
8
7
  import functools
9
8
 
10
9
  import jpype
11
10
  import jpype.types
12
11
 
13
- from ..util import parse_int_date
12
+ import java.time
14
13
 
15
14
 
16
15
  __all__ = ["TransitLayer"]
@@ -32,44 +31,24 @@ class TransitLayer:
32
31
  instance._transit_layer = transit_layer
33
32
  return instance
34
33
 
35
- @functools.cached_property
36
- def start_date(self):
37
- """The earliest date the loaded GTFS data covers."""
38
- try:
39
- start_date = min(
40
- [
41
- parse_int_date(service.calendar.start_date)
42
- for service in self._transit_layer.services
43
- ]
44
- )
45
- except (AttributeError, ValueError) as exception:
46
- raise ValueError("No GTFS data set loaded") from exception
47
- return start_date
34
+ def covers(self, date):
35
+ """
36
+ Check whether `date` is covered by GTFS data sets.
48
37
 
49
- @functools.cached_property
50
- def end_date(self):
51
- """The latest date the loaded GTFS data covers."""
52
- try:
53
- end_date = max(
54
- [
55
- parse_int_date(service.calendar.end_date)
56
- for service in self._transit_layer.services
57
- ]
58
- )
59
- end_date += datetime.timedelta(
60
- hours=23, minutes=59, seconds=59
61
- ) # *end* of day
62
- except (AttributeError, ValueError) as exception:
63
- raise ValueError("No GTFS data set loaded") from exception
64
- return end_date
65
-
66
- def covers(self, point_in_time):
67
- """Check whether `point_in_time` is covered by GTFS data sets."""
68
- try:
69
- covers = self.start_date <= point_in_time <= self.end_date
70
- except ValueError: # no GTFS data loaded
71
- covers = False
72
- return covers
38
+ Arguments:
39
+ ----------
40
+ date : datetime.date
41
+ date for which to check whether a GTFS service exists.
42
+
43
+ Returns:
44
+ --------
45
+ bool
46
+ Whether or not any services exist on `date`.
47
+ """
48
+ date = java.time.LocalDate.of(date.year, date.month, date.day)
49
+ return True in set(
50
+ [service.activeOn(date) for service in self._transit_layer.services]
51
+ )
73
52
 
74
53
  def get_street_vertex_for_stop(self, stop):
75
54
  """
@@ -16,6 +16,7 @@ from .street_layer import StreetLayer
16
16
  from .transit_layer import TransitLayer
17
17
  from .transport_mode import TransportMode
18
18
  from ..util import Config, contains_gtfs_data, FileDigest, start_jvm, WorkingCopy
19
+ from ..util.exceptions import GtfsFileError
19
20
 
20
21
  import com.conveyal.gtfs
21
22
  import com.conveyal.osmlib
@@ -35,7 +36,7 @@ start_jvm()
35
36
  class TransportNetwork:
36
37
  """Wrap a com.conveyal.r5.transit.TransportNetwork."""
37
38
 
38
- def __init__(self, osm_pbf, gtfs=[]):
39
+ def __init__(self, osm_pbf, gtfs=[], allow_errors=False):
39
40
  """
40
41
  Load a transport network.
41
42
 
@@ -45,6 +46,9 @@ class TransportNetwork:
45
46
  file path of an OpenStreetMap extract in PBF format
46
47
  gtfs : str | pathlib.Path | list[str] | list[pathlib.Path]
47
48
  path(s) to public transport schedule information in GTFS format
49
+ allow_errors : bool
50
+ try to proceed with loading the transport network even if input data
51
+ contain errors
48
52
  """
49
53
  osm_pbf = WorkingCopy(osm_pbf)
50
54
  if isinstance(gtfs, (str, pathlib.Path)):
@@ -79,9 +83,31 @@ class TransportNetwork:
79
83
  transport_network.transitLayer = com.conveyal.r5.transit.TransitLayer()
80
84
  transport_network.transitLayer.parentNetwork = transport_network
81
85
  for gtfs_file in gtfs:
82
- gtfs_feed = com.conveyal.gtfs.GTFSFeed.readOnlyTempFileFromGtfs(
86
+ gtfs_feed = com.conveyal.gtfs.GTFSFeed.writableTempFileFromGtfs(
83
87
  f"{gtfs_file}"
84
88
  )
89
+ if gtfs_feed.errors.size() > 0:
90
+ errors = [
91
+ f"{error.errorType}: {error.getMessageWithContext()}"
92
+ for error in gtfs_feed.errors
93
+ ]
94
+ if allow_errors:
95
+ warnings.warn(
96
+ (
97
+ "R5 reported the following issues with "
98
+ f"GTFS file {gtfs_file.name}: \n"
99
+ + ("\n- ".join(errors))
100
+ ),
101
+ RuntimeWarning,
102
+ )
103
+ else:
104
+ raise GtfsFileError(
105
+ (
106
+ f"Could not load GTFS file {gtfs_file.name}. \n"
107
+ + ("\n- ".join(errors))
108
+ )
109
+ )
110
+
85
111
  transport_network.transitLayer.loadFromGtfs(gtfs_feed)
86
112
  gtfs_feed.close()
87
113
 
r5py/util/exceptions.py CHANGED
@@ -12,6 +12,10 @@ class R5pyError(Exception):
12
12
 
13
13
 
14
14
  # more specific exceptions
15
+ class GtfsFileError(R5pyError):
16
+ """GTFS file contained errors."""
17
+
18
+
15
19
  class ChecksumFailed(requests.RequestException, R5pyError):
16
20
  """Requested resource did not pass checksum test."""
17
21
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: r5py
3
- Version: 1.0.2
3
+ Version: 1.0.3.dev0
4
4
  Summary: Python wrapper for the R5 routing analysis engine
5
5
  Author: Christoph Fink, Willem Klumpenhouwer, Marcus Sairava, Rafael Pereira, Henrikki Tenkanen
6
6
  License: GPL-3.0-or-later or MIT
@@ -58,6 +58,7 @@ Requires-Dist: pytest-lazy-fixtures; extra == "tests"
58
58
  Requires-Dist: r5py.sampledata.helsinki>=0.1.1; extra == "tests"
59
59
  Requires-Dist: r5py.sampledata.sao_paulo>=0.1.1; extra == "tests"
60
60
  Requires-Dist: typing-extensions; extra == "tests"
61
+ Dynamic: license-file
61
62
 
62
63
  <img class="r5py_logo" align="right" src="https://github.com/r5py/r5py/raw/main/docs/_static/images/r5py_blue.svg" alt="r5py logo" style="width:180px; max-width:30vW;">
63
64
 
@@ -1,4 +1,4 @@
1
- r5py/__init__.py,sha256=weod_rATJoxiJHVbp-3NUPqhLH9TG7PgN85tKfzgv-g,546
1
+ r5py/__init__.py,sha256=fmuPx-uivkG0M6kPpYFSiiAHJKYQ4iWAprWSkeq--xA,551
2
2
  r5py/__main__.py,sha256=Wvn0ChD7E-dCSZ8b8k_HhHG0KMOk0qMNFkijGuSH3-0,81
3
3
  r5py/r5/__init__.py,sha256=BVEeEVc-uUHLPLYBq1LN4exiQIHDw4YyANxNrprb8jQ,1061
4
4
  r5py/r5/access_leg.py,sha256=W3GfPEpqmWD1c4xipd6UcVIaBC-yb6srGCZV30E2dPY,293
@@ -7,15 +7,15 @@ r5py/r5/detailed_itineraries.py,sha256=Oo8JnF5jM2FsYFR1ma9r4y3evOmU7itDYs5M4vbqr
7
7
  r5py/r5/direct_leg.py,sha256=T7wX8puhOVIssCpflXthYs-G9OA8pasFbdz9p8k8teg,1054
8
8
  r5py/r5/egress_leg.py,sha256=9rsCIcwlZUzoZE6q4imNY3VWpjJepO1IJvheVrlPi90,297
9
9
  r5py/r5/isochrones.py,sha256=NNpV3Df4NeLdDksGERkb2Eos33ziMBGEeaWyCKPt5P8,12974
10
- r5py/r5/regional_task.py,sha256=EizNJCSQQ2fLDMTzDsq_pAVHBs1PPtwvSx8dt1t7pTo,22032
10
+ r5py/r5/regional_task.py,sha256=jpOoskx7Y-j-c4E-56uvJXiiuPYK3w28_FJsoGQLSbE,22062
11
11
  r5py/r5/scenario.py,sha256=nUNAlN3cO7E_b4sMpNqdL0FD7WQaQ49iIvh-k8l4YRM,763
12
12
  r5py/r5/street_layer.py,sha256=2AWhIE0-aTNGQenX6bF1xv5bmhR_LV0CgqM4BKgVYfk,2329
13
13
  r5py/r5/street_segment.py,sha256=0O0QV8Eyfss-xHJShKGSQV1IusZfTrrxzu_AWl3KACo,1109
14
14
  r5py/r5/transfer_leg.py,sha256=_IpzQJAyW4hDPO5V4k-ZjIPd3uyxhHPa4U6_b8UbKt4,311
15
- r5py/r5/transit_layer.py,sha256=vVo_o10yDCzpujOQ99xdzmznwVjAbANjdDflQy2QOpI,3223
15
+ r5py/r5/transit_layer.py,sha256=vfbzCpTiIpCevSwCTz7EGeFWB4LDrfba1JAqXYo7WXo,2334
16
16
  r5py/r5/transit_leg.py,sha256=R0Qc9YLMEXYu51NIdo7Q0bdmpYIJf5irEDXWrW6pZWE,221
17
17
  r5py/r5/transport_mode.py,sha256=zHSqXb0R4oyjTp069CzO69IgoCKt0nmOAwsSy272rGo,3675
18
- r5py/r5/transport_network.py,sha256=wy7jsIqcladee6FdUiOu0kJgMhGYymtJpfyjX9RRnNU,7925
18
+ r5py/r5/transport_network.py,sha256=eKq4c4L46k_rpPkO9MxPOWHAZ0ZyPzV27lVouNFHqSk,9055
19
19
  r5py/r5/travel_time_matrix.py,sha256=Z_ErylB8mMD_eO2BogV3K_OFdYFVCcmIPmcMe7GGRiU,8003
20
20
  r5py/r5/trip.py,sha256=AqhlhgYaGRL5jVzV08BhsqgWxe8f4wAb5HMP8HIGwc8,2944
21
21
  r5py/r5/trip_leg.py,sha256=9E4vZpBEJCXIVqAXWJvnPloC-upEASKhFnjiuen8i8A,6495
@@ -27,7 +27,7 @@ r5py/util/config.py,sha256=5jz42iUaftgBfJ2HNnktZw5oXIPE2ytl3Nxt2RjjDoM,5267
27
27
  r5py/util/contains_gtfs_data.py,sha256=ooX4hfVDKK0aqX1MI46jSFZ7dZ6riyXaORrgF6PUFrk,1211
28
28
  r5py/util/data_validation.py,sha256=H5Mcp2nS4vu5RKym20mPnGpl-8d0SDchzDRJBrrL6WE,1039
29
29
  r5py/util/environment.py,sha256=cbSM8TKTuhbXsTIIB06pMtydBOiqLkitF2Lj2asVTho,1082
30
- r5py/util/exceptions.py,sha256=r65XUg_AJ_bTw8ARNj7A2-GbFZlSTrOAjDynx1pSD2Y,1049
30
+ r5py/util/exceptions.py,sha256=i1FyTuas43HnlLUIf3zip0Eie2S0j09EcgB9KnmQoKE,1121
31
31
  r5py/util/file_digest.py,sha256=95UbaxbTZLa54j1CupsKria028xZ8f6ueZsTupnjlYE,1061
32
32
  r5py/util/good_enough_equidistant_crs.py,sha256=7FX3Ly3qegSV_YRA4OFk49LC29xUyTte1Gc5qOEi_9E,2458
33
33
  r5py/util/jvm.py,sha256=NCwoYLDznXydcIRAZl2kzUQA6D6NCvzjVG74pm6ioR0,5027
@@ -39,8 +39,8 @@ r5py/util/spatially_clustered_geodataframe.py,sha256=FxG8V3SSeK-PuCep565p1b3TNcl
39
39
  r5py/util/validating_requests_session.py,sha256=sH5FgpS9eGax5DG2qA2GrGuiwgTJgh8tKsZ9OiXKmvk,1807
40
40
  r5py/util/warnings.py,sha256=CvxKWKlNO_p3riB4SkNqbU5AGPsaY_3-OzqaBObE3B8,139
41
41
  r5py/util/working_copy.py,sha256=sbLbRCi39LtC-0tXxvh2y7ZN2D15chbhleCZXzHAFSc,1432
42
- r5py-1.0.2.dist-info/LICENSE,sha256=VAnuGDX1TPylSN9G2xLa-urDpj_SQwn-qqs068dx4tk,51
43
- r5py-1.0.2.dist-info/METADATA,sha256=JDf3owvqgJStxW6jM_36mjJC8iqtapgfaiLvVFCxur8,9954
44
- r5py-1.0.2.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
45
- r5py-1.0.2.dist-info/top_level.txt,sha256=fOH1R85dkNDOI7jkg-lIsl5CQIO4fE5X868K9dTqs9U,5
46
- r5py-1.0.2.dist-info/RECORD,,
42
+ r5py-1.0.3.dev0.dist-info/licenses/LICENSE,sha256=VAnuGDX1TPylSN9G2xLa-urDpj_SQwn-qqs068dx4tk,51
43
+ r5py-1.0.3.dev0.dist-info/METADATA,sha256=GnVvhl0wT1TNeqWnslpiwmvpw2fYJl62oUjkfptcsss,9981
44
+ r5py-1.0.3.dev0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
45
+ r5py-1.0.3.dev0.dist-info/top_level.txt,sha256=fOH1R85dkNDOI7jkg-lIsl5CQIO4fE5X868K9dTqs9U,5
46
+ r5py-1.0.3.dev0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (76.0.0)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5