aiomobilitydatabase 0.2.0__tar.gz → 0.2.1__tar.gz

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.
Files changed (78) hide show
  1. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/PKG-INFO +1 -1
  2. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/src/aiomobilitydatabase/const.py +1 -1
  3. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/src/aiomobilitydatabase/feeds/transit.py +14 -4
  4. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/.github/workflows/ci.yml +0 -0
  5. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/.github/workflows/publish.yml +0 -0
  6. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/.gitignore +0 -0
  7. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/.pre-commit-config.yaml +0 -0
  8. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/LICENSE +0 -0
  9. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/README.md +0 -0
  10. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/pyproject.toml +0 -0
  11. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/scripts/generate_rt_fixtures.py +0 -0
  12. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/src/aiomobilitydatabase/__init__.py +0 -0
  13. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/src/aiomobilitydatabase/client.py +0 -0
  14. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/src/aiomobilitydatabase/exceptions.py +0 -0
  15. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/src/aiomobilitydatabase/feeds/__init__.py +0 -0
  16. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/src/aiomobilitydatabase/feeds/client.py +0 -0
  17. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/src/aiomobilitydatabase/feeds/const.py +0 -0
  18. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/src/aiomobilitydatabase/feeds/exceptions.py +0 -0
  19. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/src/aiomobilitydatabase/feeds/gbfs.py +0 -0
  20. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/src/aiomobilitydatabase/feeds/geo.py +0 -0
  21. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/src/aiomobilitydatabase/feeds/models.py +0 -0
  22. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/src/aiomobilitydatabase/feeds/rt.py +0 -0
  23. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/src/aiomobilitydatabase/feeds/static_index.py +0 -0
  24. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/src/aiomobilitydatabase/models.py +0 -0
  25. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/src/aiomobilitydatabase/py.typed +0 -0
  26. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/__init__.py +0 -0
  27. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/conftest.py +0 -0
  28. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/__init__.py +0 -0
  29. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/conftest.py +0 -0
  30. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/catalog/gbfs_feed.json +0 -0
  31. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/catalog/gtfs_feed.json +0 -0
  32. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/catalog/gtfs_rt_feed.json +0 -0
  33. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/catalog/token_response.json +0 -0
  34. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/gbfs/free_bike_status_23.json +0 -0
  35. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/gbfs/station_info_23.json +0 -0
  36. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/gbfs/station_status_23.json +0 -0
  37. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/gbfs/system_info_23.json +0 -0
  38. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/gbfs/system_info_30.json +0 -0
  39. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/gbfs/vehicle_status_30.json +0 -0
  40. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/gtfs/agency.txt +0 -0
  41. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/gtfs/calendar.txt +0 -0
  42. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/gtfs/calendar_dates.txt +0 -0
  43. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/gtfs/routes.txt +0 -0
  44. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/gtfs/stop_times.txt +0 -0
  45. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/gtfs/stops.txt +0 -0
  46. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/gtfs/trips.txt +0 -0
  47. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/rt/added_trips_s1.pb +0 -0
  48. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/rt/alerts.pb +0 -0
  49. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/rt/trip_updates_baseline.pb +0 -0
  50. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/rt/trip_updates_t1_delayed.pb +0 -0
  51. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/data/rt/vehicle_positions.pb +0 -0
  52. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/fixtures.py +0 -0
  53. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/test_client.py +0 -0
  54. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/test_exceptions.py +0 -0
  55. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/test_extra_import_guard.py +0 -0
  56. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/test_gbfs_stations.py +0 -0
  57. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/test_gbfs_vehicles.py +0 -0
  58. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/test_geo.py +0 -0
  59. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/test_models.py +0 -0
  60. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/test_properties.py +0 -0
  61. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/test_rt.py +0 -0
  62. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/test_static_arrivals.py +0 -0
  63. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/test_static_build.py +0 -0
  64. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/test_station_grouping.py +0 -0
  65. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/test_transit_arrivals.py +0 -0
  66. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/test_transit_resolution.py +0 -0
  67. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/feeds/test_transit_vehicles_alerts.py +0 -0
  68. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/fixtures.py +0 -0
  69. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/mock_server.py +0 -0
  70. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/test_catalog_properties.py +0 -0
  71. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/test_client_request.py +0 -0
  72. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/test_client_session.py +0 -0
  73. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/test_client_token.py +0 -0
  74. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/test_endpoints.py +0 -0
  75. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/test_exceptions.py +0 -0
  76. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/test_models.py +0 -0
  77. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/test_params.py +0 -0
  78. {aiomobilitydatabase-0.2.0 → aiomobilitydatabase-0.2.1}/tests/test_public_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiomobilitydatabase
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Async Python client for the Mobility Database catalog API
5
5
  Project-URL: Source Code, https://github.com/raman325/aiomobilitydatabase
6
6
  Project-URL: Bug Reports, https://github.com/raman325/aiomobilitydatabase/issues
@@ -1,6 +1,6 @@
1
1
  """Constants for aiomobilitydatabase."""
2
2
 
3
- __version__ = "0.2.0"
3
+ __version__ = "0.2.1"
4
4
 
5
5
  PROD_BASE_URL = "https://api.mobilitydatabase.org"
6
6
  QA_BASE_URL = "https://api-qa.mobilitydatabase.org"
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import asyncio
6
+ import shutil
6
7
  import tempfile
7
8
  from collections.abc import Callable
8
9
  from datetime import UTC, datetime, timedelta
@@ -184,7 +185,7 @@ class TransitFeedHandle:
184
185
  raise FeedParseError(
185
186
  f"Feed id {static_feed.id!r} escapes the cache directory"
186
187
  )
187
- feed_dir.mkdir(parents=True, exist_ok=True)
188
+ await asyncio.to_thread(feed_dir.mkdir, parents=True, exist_ok=True)
188
189
  db_path = feed_dir / STATIC_DB_FILENAME
189
190
  cached = await asyncio.to_thread(
190
191
  StaticIndex.open_cached, db_path, dataset.id
@@ -192,7 +193,8 @@ class TransitFeedHandle:
192
193
  if cached is not None:
193
194
  return cached
194
195
  session = client._get_session() # deliberate friend access
195
- with tempfile.TemporaryDirectory() as tmp_dir:
196
+ tmp_dir = await asyncio.to_thread(tempfile.mkdtemp)
197
+ try:
196
198
  zip_path = Path(tmp_dir) / "dataset.zip"
197
199
  try:
198
200
  async with session.get(
@@ -210,9 +212,13 @@ class TransitFeedHandle:
210
212
  done_bytes = 0
211
213
  last_emitted = 0
212
214
  first_chunk = True
213
- with zip_path.open("wb") as fp:
215
+ # File writes stay off the event loop: consumers (for
216
+ # example Home Assistant) run this on their loop and a
217
+ # large dataset means thousands of 64 KiB writes.
218
+ fp = await asyncio.to_thread(zip_path.open, "wb")
219
+ try:
214
220
  async for chunk in resp.content.iter_chunked(1 << 16):
215
- fp.write(chunk)
221
+ await asyncio.to_thread(fp.write, chunk)
216
222
  done_bytes += len(chunk)
217
223
  if on_progress is not None and (
218
224
  first_chunk
@@ -227,6 +233,8 @@ class TransitFeedHandle:
227
233
  )
228
234
  last_emitted = done_bytes
229
235
  first_chunk = False
236
+ finally:
237
+ await asyncio.to_thread(fp.close)
230
238
  if on_progress is not None:
231
239
  on_progress(
232
240
  StaticBuildProgress(
@@ -259,6 +267,8 @@ class TransitFeedHandle:
259
267
  dataset.agency_timezone,
260
268
  build_progress,
261
269
  )
270
+ finally:
271
+ await asyncio.to_thread(shutil.rmtree, tmp_dir, ignore_errors=True)
262
272
 
263
273
  def _rt_feeds_for(self, entity_type: EntityType) -> list[GtfsRtFeed]:
264
274
  return [