From 1cba822390c0a6e2c2d8f3f9e101215a1abc22cc Mon Sep 17 00:00:00 2001 From: Stainless Bot Date: Wed, 31 Jul 2024 19:00:13 +0000 Subject: [PATCH 01/19] feat: various codegen changes --- .release-please-manifest.json | 2 +- .stats.yml | 4 +- CHANGELOG.md | 25 +++ api.md | 12 ++ examples/schedule_for_stop.py | 16 ++ examples/stop_ids_for_agency.py | 2 +- pyproject.toml | 2 +- src/onebusaway/_client.py | 8 + src/onebusaway/_version.py | 2 +- src/onebusaway/resources/__init__.py | 14 ++ src/onebusaway/resources/schedule_for_stop.py | 167 ++++++++++++++++++ .../resources/stops_for_location.py | 4 - src/onebusaway/resources/trip_for_vehicle.py | 4 +- src/onebusaway/types/__init__.py | 2 + ...gencies_with_coverage_retrieve_response.py | 6 +- .../types/agency_retrieve_response.py | 6 +- .../arrival_and_departure_list_response.py | 8 +- ...arrival_and_departure_retrieve_response.py | 4 +- .../types/config_retrieve_response.py | 4 +- .../types/current_time_retrieve_response.py | 4 +- .../types/route_retrieve_response.py | 4 +- .../schedule_for_stop_retrieve_params.py | 19 ++ .../schedule_for_stop_retrieve_response.py | 89 ++++++++++ .../stop_ids_for_agency_list_response.py | 6 +- .../types/stop_retrieve_response.py | 4 +- .../stops_for_location_retrieve_params.py | 4 +- .../stops_for_location_retrieve_response.py | 6 +- .../types/stops_for_route_list_response.py | 2 +- .../types/trip_detail_retrieve_response.py | 4 +- .../trip_for_vehicle_retrieve_response.py | 4 +- .../types/trip_retrieve_response.py | 4 +- .../trips_for_location_retrieve_response.py | 8 +- tests/api_resources/test_schedule_for_stop.py | 115 ++++++++++++ .../api_resources/test_stops_for_location.py | 26 +-- 34 files changed, 519 insertions(+), 72 deletions(-) create mode 100644 examples/schedule_for_stop.py create mode 100644 src/onebusaway/resources/schedule_for_stop.py create mode 100644 src/onebusaway/types/schedule_for_stop_retrieve_params.py create mode 100644 src/onebusaway/types/schedule_for_stop_retrieve_response.py create mode 100644 tests/api_resources/test_schedule_for_stop.py diff --git a/.release-please-manifest.json b/.release-please-manifest.json index b5db7ce..3b005e5 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.1.0-alpha.7" + ".": "0.1.0-alpha.10" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index fa549e7..cce1cfa 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,2 +1,2 @@ -configured_endpoints: 16 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/open-transit%2Fopen-transit-7a71bec90a568b0dbefc3d81206069d9759259460cffa0543b162f6835be1e9a.yml +configured_endpoints: 17 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/open-transit%2Fopen-transit-261df351536029839245955df4df7341de315fe2b1d1d6aeb063eaef62bcddc9.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index fdbe776..f2fcfe2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,30 @@ # Changelog +## 0.1.0-alpha.10 (2024-07-31) + +Full Changelog: [v0.1.0-alpha.9...v0.1.0-alpha.10](https://github.com/OneBusAway/python-sdk/compare/v0.1.0-alpha.9...v0.1.0-alpha.10) + +### Features + +* **api:** OpenAPI spec update via Stainless API ([#37](https://github.com/OneBusAway/python-sdk/issues/37)) ([cc7611d](https://github.com/OneBusAway/python-sdk/commit/cc7611d6984efe9cce70b1388c8bdfd14ed814d3)) +* **api:** OpenAPI spec update via Stainless API ([#39](https://github.com/OneBusAway/python-sdk/issues/39)) ([45dc9fe](https://github.com/OneBusAway/python-sdk/commit/45dc9fe6b89ab5224d6f60d97d10ab85326e08fd)) + +## 0.1.0-alpha.9 (2024-07-31) + +Full Changelog: [v0.1.0-alpha.8...v0.1.0-alpha.9](https://github.com/OneBusAway/python-sdk/compare/v0.1.0-alpha.8...v0.1.0-alpha.9) + +### Features + +* **api:** OpenAPI spec update via Stainless API ([#34](https://github.com/OneBusAway/python-sdk/issues/34)) ([d60f5d7](https://github.com/OneBusAway/python-sdk/commit/d60f5d72bed809667875d4548bc4909d5125a6d5)) + +## 0.1.0-alpha.8 (2024-07-30) + +Full Changelog: [v0.1.0-alpha.7...v0.1.0-alpha.8](https://github.com/OneBusAway/python-sdk/compare/v0.1.0-alpha.7...v0.1.0-alpha.8) + +### Features + +* **api:** OpenAPI spec update via Stainless API ([#31](https://github.com/OneBusAway/python-sdk/issues/31)) ([891cdf5](https://github.com/OneBusAway/python-sdk/commit/891cdf59961594e7bfb21fc25e8615b3c536dc8e)) + ## 0.1.0-alpha.7 (2024-07-29) Full Changelog: [v0.1.0-alpha.6...v0.1.0-alpha.7](https://github.com/OneBusAway/python-sdk/compare/v0.1.0-alpha.6...v0.1.0-alpha.7) diff --git a/api.md b/api.md index ac324dd..8404d9c 100644 --- a/api.md +++ b/api.md @@ -112,6 +112,18 @@ Methods: - client.stop_ids_for_agency.list(agency_id) -> StopIDsForAgencyListResponse +# ScheduleForStop + +Types: + +```python +from onebusaway.types import ScheduleForStopRetrieveResponse +``` + +Methods: + +- client.schedule_for_stop.retrieve(stop_id, \*\*params) -> ScheduleForStopRetrieveResponse + # Route Types: diff --git a/examples/schedule_for_stop.py b/examples/schedule_for_stop.py new file mode 100644 index 0000000..05eaf2f --- /dev/null +++ b/examples/schedule_for_stop.py @@ -0,0 +1,16 @@ +import onebusaway + + +def main_sync() -> None: + client = onebusaway.OnebusawaySDK(api_key="TEST") + stop_id = "1_75403" + schedule_for_stop = client.schedule_for_stop.retrieve(stop_id) + + if schedule_for_stop.data and schedule_for_stop.data.entry: + print(schedule_for_stop.data.entry) + else: + print("schedule data or entry is None.") + + +if __name__ == "__main__": + main_sync() diff --git a/examples/stop_ids_for_agency.py b/examples/stop_ids_for_agency.py index 1d2e5d6..59b8d77 100644 --- a/examples/stop_ids_for_agency.py +++ b/examples/stop_ids_for_agency.py @@ -18,4 +18,4 @@ stop_ids = oba.stop_ids_for_agency.list(agency_id) if stop_ids.data and stop_ids.data.list: for stop_id in stop_ids.data.list: - print(stop_id) \ No newline at end of file + print(stop_id) diff --git a/pyproject.toml b/pyproject.toml index 63a507b..6db0b9e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "onebusaway" -version = "0.1.0-alpha.7" +version = "0.1.0-alpha.10" description = "The official Python library for the onebusaway-sdk API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/onebusaway/_client.py b/src/onebusaway/_client.py index de1458c..4d0abe9 100644 --- a/src/onebusaway/_client.py +++ b/src/onebusaway/_client.py @@ -55,6 +55,7 @@ class OnebusawaySDK(SyncAPIClient): stops_for_route: resources.StopsForRouteResource stop: resources.StopResource stop_ids_for_agency: resources.StopIDsForAgencyResource + schedule_for_stop: resources.ScheduleForStopResource route: resources.RouteResource arrival_and_departure: resources.ArrivalAndDepartureResource trip: resources.TripResource @@ -127,6 +128,7 @@ def __init__( self.stops_for_route = resources.StopsForRouteResource(self) self.stop = resources.StopResource(self) self.stop_ids_for_agency = resources.StopIDsForAgencyResource(self) + self.schedule_for_stop = resources.ScheduleForStopResource(self) self.route = resources.RouteResource(self) self.arrival_and_departure = resources.ArrivalAndDepartureResource(self) self.trip = resources.TripResource(self) @@ -259,6 +261,7 @@ class AsyncOnebusawaySDK(AsyncAPIClient): stops_for_route: resources.AsyncStopsForRouteResource stop: resources.AsyncStopResource stop_ids_for_agency: resources.AsyncStopIDsForAgencyResource + schedule_for_stop: resources.AsyncScheduleForStopResource route: resources.AsyncRouteResource arrival_and_departure: resources.AsyncArrivalAndDepartureResource trip: resources.AsyncTripResource @@ -331,6 +334,7 @@ def __init__( self.stops_for_route = resources.AsyncStopsForRouteResource(self) self.stop = resources.AsyncStopResource(self) self.stop_ids_for_agency = resources.AsyncStopIDsForAgencyResource(self) + self.schedule_for_stop = resources.AsyncScheduleForStopResource(self) self.route = resources.AsyncRouteResource(self) self.arrival_and_departure = resources.AsyncArrivalAndDepartureResource(self) self.trip = resources.AsyncTripResource(self) @@ -466,6 +470,7 @@ def __init__(self, client: OnebusawaySDK) -> None: self.stops_for_route = resources.StopsForRouteResourceWithRawResponse(client.stops_for_route) self.stop = resources.StopResourceWithRawResponse(client.stop) self.stop_ids_for_agency = resources.StopIDsForAgencyResourceWithRawResponse(client.stop_ids_for_agency) + self.schedule_for_stop = resources.ScheduleForStopResourceWithRawResponse(client.schedule_for_stop) self.route = resources.RouteResourceWithRawResponse(client.route) self.arrival_and_departure = resources.ArrivalAndDepartureResourceWithRawResponse(client.arrival_and_departure) self.trip = resources.TripResourceWithRawResponse(client.trip) @@ -487,6 +492,7 @@ def __init__(self, client: AsyncOnebusawaySDK) -> None: self.stops_for_route = resources.AsyncStopsForRouteResourceWithRawResponse(client.stops_for_route) self.stop = resources.AsyncStopResourceWithRawResponse(client.stop) self.stop_ids_for_agency = resources.AsyncStopIDsForAgencyResourceWithRawResponse(client.stop_ids_for_agency) + self.schedule_for_stop = resources.AsyncScheduleForStopResourceWithRawResponse(client.schedule_for_stop) self.route = resources.AsyncRouteResourceWithRawResponse(client.route) self.arrival_and_departure = resources.AsyncArrivalAndDepartureResourceWithRawResponse( client.arrival_and_departure @@ -510,6 +516,7 @@ def __init__(self, client: OnebusawaySDK) -> None: self.stops_for_route = resources.StopsForRouteResourceWithStreamingResponse(client.stops_for_route) self.stop = resources.StopResourceWithStreamingResponse(client.stop) self.stop_ids_for_agency = resources.StopIDsForAgencyResourceWithStreamingResponse(client.stop_ids_for_agency) + self.schedule_for_stop = resources.ScheduleForStopResourceWithStreamingResponse(client.schedule_for_stop) self.route = resources.RouteResourceWithStreamingResponse(client.route) self.arrival_and_departure = resources.ArrivalAndDepartureResourceWithStreamingResponse( client.arrival_and_departure @@ -539,6 +546,7 @@ def __init__(self, client: AsyncOnebusawaySDK) -> None: self.stop_ids_for_agency = resources.AsyncStopIDsForAgencyResourceWithStreamingResponse( client.stop_ids_for_agency ) + self.schedule_for_stop = resources.AsyncScheduleForStopResourceWithStreamingResponse(client.schedule_for_stop) self.route = resources.AsyncRouteResourceWithStreamingResponse(client.route) self.arrival_and_departure = resources.AsyncArrivalAndDepartureResourceWithStreamingResponse( client.arrival_and_departure diff --git a/src/onebusaway/_version.py b/src/onebusaway/_version.py index faf8c10..ffc4f0c 100644 --- a/src/onebusaway/_version.py +++ b/src/onebusaway/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "onebusaway" -__version__ = "0.1.0-alpha.7" # x-release-please-version +__version__ = "0.1.0-alpha.10" # x-release-please-version diff --git a/src/onebusaway/resources/__init__.py b/src/onebusaway/resources/__init__.py index 041cf0a..48fb9f8 100644 --- a/src/onebusaway/resources/__init__.py +++ b/src/onebusaway/resources/__init__.py @@ -72,6 +72,14 @@ TripForVehicleResourceWithStreamingResponse, AsyncTripForVehicleResourceWithStreamingResponse, ) +from .schedule_for_stop import ( + ScheduleForStopResource, + AsyncScheduleForStopResource, + ScheduleForStopResourceWithRawResponse, + AsyncScheduleForStopResourceWithRawResponse, + ScheduleForStopResourceWithStreamingResponse, + AsyncScheduleForStopResourceWithStreamingResponse, +) from .stops_for_location import ( StopsForLocationResource, AsyncStopsForLocationResource, @@ -176,6 +184,12 @@ "AsyncStopIDsForAgencyResourceWithRawResponse", "StopIDsForAgencyResourceWithStreamingResponse", "AsyncStopIDsForAgencyResourceWithStreamingResponse", + "ScheduleForStopResource", + "AsyncScheduleForStopResource", + "ScheduleForStopResourceWithRawResponse", + "AsyncScheduleForStopResourceWithRawResponse", + "ScheduleForStopResourceWithStreamingResponse", + "AsyncScheduleForStopResourceWithStreamingResponse", "RouteResource", "AsyncRouteResource", "RouteResourceWithRawResponse", diff --git a/src/onebusaway/resources/schedule_for_stop.py b/src/onebusaway/resources/schedule_for_stop.py new file mode 100644 index 0000000..9b44909 --- /dev/null +++ b/src/onebusaway/resources/schedule_for_stop.py @@ -0,0 +1,167 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Union +from datetime import date + +import httpx + +from ..types import schedule_for_stop_retrieve_params +from .._types import NOT_GIVEN, Body, Query, Headers, NotGiven +from .._utils import ( + maybe_transform, + async_maybe_transform, +) +from .._compat import cached_property +from .._resource import SyncAPIResource, AsyncAPIResource +from .._response import ( + to_raw_response_wrapper, + to_streamed_response_wrapper, + async_to_raw_response_wrapper, + async_to_streamed_response_wrapper, +) +from .._base_client import make_request_options +from ..types.schedule_for_stop_retrieve_response import ScheduleForStopRetrieveResponse + +__all__ = ["ScheduleForStopResource", "AsyncScheduleForStopResource"] + + +class ScheduleForStopResource(SyncAPIResource): + @cached_property + def with_raw_response(self) -> ScheduleForStopResourceWithRawResponse: + return ScheduleForStopResourceWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> ScheduleForStopResourceWithStreamingResponse: + return ScheduleForStopResourceWithStreamingResponse(self) + + def retrieve( + self, + stop_id: str, + *, + date: Union[str, date] | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> ScheduleForStopRetrieveResponse: + """ + Get schedule for a specific stop + + Args: + date: The date for which you want to request a schedule in the format YYYY-MM-DD + (optional, defaults to the current date) + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not stop_id: + raise ValueError(f"Expected a non-empty value for `stop_id` but received {stop_id!r}") + return self._get( + f"/api/where/schedule-for-stop/{stop_id}.json", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform({"date": date}, schedule_for_stop_retrieve_params.ScheduleForStopRetrieveParams), + ), + cast_to=ScheduleForStopRetrieveResponse, + ) + + +class AsyncScheduleForStopResource(AsyncAPIResource): + @cached_property + def with_raw_response(self) -> AsyncScheduleForStopResourceWithRawResponse: + return AsyncScheduleForStopResourceWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> AsyncScheduleForStopResourceWithStreamingResponse: + return AsyncScheduleForStopResourceWithStreamingResponse(self) + + async def retrieve( + self, + stop_id: str, + *, + date: Union[str, date] | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> ScheduleForStopRetrieveResponse: + """ + Get schedule for a specific stop + + Args: + date: The date for which you want to request a schedule in the format YYYY-MM-DD + (optional, defaults to the current date) + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not stop_id: + raise ValueError(f"Expected a non-empty value for `stop_id` but received {stop_id!r}") + return await self._get( + f"/api/where/schedule-for-stop/{stop_id}.json", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=await async_maybe_transform( + {"date": date}, schedule_for_stop_retrieve_params.ScheduleForStopRetrieveParams + ), + ), + cast_to=ScheduleForStopRetrieveResponse, + ) + + +class ScheduleForStopResourceWithRawResponse: + def __init__(self, schedule_for_stop: ScheduleForStopResource) -> None: + self._schedule_for_stop = schedule_for_stop + + self.retrieve = to_raw_response_wrapper( + schedule_for_stop.retrieve, + ) + + +class AsyncScheduleForStopResourceWithRawResponse: + def __init__(self, schedule_for_stop: AsyncScheduleForStopResource) -> None: + self._schedule_for_stop = schedule_for_stop + + self.retrieve = async_to_raw_response_wrapper( + schedule_for_stop.retrieve, + ) + + +class ScheduleForStopResourceWithStreamingResponse: + def __init__(self, schedule_for_stop: ScheduleForStopResource) -> None: + self._schedule_for_stop = schedule_for_stop + + self.retrieve = to_streamed_response_wrapper( + schedule_for_stop.retrieve, + ) + + +class AsyncScheduleForStopResourceWithStreamingResponse: + def __init__(self, schedule_for_stop: AsyncScheduleForStopResource) -> None: + self._schedule_for_stop = schedule_for_stop + + self.retrieve = async_to_streamed_response_wrapper( + schedule_for_stop.retrieve, + ) diff --git a/src/onebusaway/resources/stops_for_location.py b/src/onebusaway/resources/stops_for_location.py index c7c654f..dd64b27 100644 --- a/src/onebusaway/resources/stops_for_location.py +++ b/src/onebusaway/resources/stops_for_location.py @@ -36,7 +36,6 @@ def with_streaming_response(self) -> StopsForLocationResourceWithStreamingRespon def retrieve( self, *, - key: str, lat: float | NotGiven = NOT_GIVEN, lon: float | NotGiven = NOT_GIVEN, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -67,7 +66,6 @@ def retrieve( timeout=timeout, query=maybe_transform( { - "key": key, "lat": lat, "lon": lon, }, @@ -90,7 +88,6 @@ def with_streaming_response(self) -> AsyncStopsForLocationResourceWithStreamingR async def retrieve( self, *, - key: str, lat: float | NotGiven = NOT_GIVEN, lon: float | NotGiven = NOT_GIVEN, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -121,7 +118,6 @@ async def retrieve( timeout=timeout, query=await async_maybe_transform( { - "key": key, "lat": lat, "lon": lon, }, diff --git a/src/onebusaway/resources/trip_for_vehicle.py b/src/onebusaway/resources/trip_for_vehicle.py index f0091cd..b98c3ed 100644 --- a/src/onebusaway/resources/trip_for_vehicle.py +++ b/src/onebusaway/resources/trip_for_vehicle.py @@ -74,7 +74,7 @@ def retrieve( if not vehicle_id: raise ValueError(f"Expected a non-empty value for `vehicle_id` but received {vehicle_id!r}") return self._get( - f"/api/where/trip-for-vehicle/vehicleID.json", + f"/api/where/trip-for-vehicle/{vehicle_id}.json", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -144,7 +144,7 @@ async def retrieve( if not vehicle_id: raise ValueError(f"Expected a non-empty value for `vehicle_id` but received {vehicle_id!r}") return await self._get( - f"/api/where/trip-for-vehicle/vehicleID.json", + f"/api/where/trip-for-vehicle/{vehicle_id}.json", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/onebusaway/types/__init__.py b/src/onebusaway/types/__init__.py index e9da12e..87b7d0c 100644 --- a/src/onebusaway/types/__init__.py +++ b/src/onebusaway/types/__init__.py @@ -16,12 +16,14 @@ from .vehicles_for_agency_list_params import VehiclesForAgencyListParams as VehiclesForAgencyListParams from .trip_for_vehicle_retrieve_params import TripForVehicleRetrieveParams as TripForVehicleRetrieveParams from .arrival_and_departure_list_params import ArrivalAndDepartureListParams as ArrivalAndDepartureListParams +from .schedule_for_stop_retrieve_params import ScheduleForStopRetrieveParams as ScheduleForStopRetrieveParams from .stop_ids_for_agency_list_response import StopIDsForAgencyListResponse as StopIDsForAgencyListResponse from .vehicles_for_agency_list_response import VehiclesForAgencyListResponse as VehiclesForAgencyListResponse from .stops_for_location_retrieve_params import StopsForLocationRetrieveParams as StopsForLocationRetrieveParams from .trip_for_vehicle_retrieve_response import TripForVehicleRetrieveResponse as TripForVehicleRetrieveResponse from .trips_for_location_retrieve_params import TripsForLocationRetrieveParams as TripsForLocationRetrieveParams from .arrival_and_departure_list_response import ArrivalAndDepartureListResponse as ArrivalAndDepartureListResponse +from .schedule_for_stop_retrieve_response import ScheduleForStopRetrieveResponse as ScheduleForStopRetrieveResponse from .stops_for_location_retrieve_response import StopsForLocationRetrieveResponse as StopsForLocationRetrieveResponse from .trips_for_location_retrieve_response import TripsForLocationRetrieveResponse as TripsForLocationRetrieveResponse from .arrival_and_departure_retrieve_params import ( diff --git a/src/onebusaway/types/agencies_with_coverage_retrieve_response.py b/src/onebusaway/types/agencies_with_coverage_retrieve_response.py index 43df6e7..6a54093 100644 --- a/src/onebusaway/types/agencies_with_coverage_retrieve_response.py +++ b/src/onebusaway/types/agencies_with_coverage_retrieve_response.py @@ -28,11 +28,11 @@ class AgenciesWithCoverageRetrieveResponseDataList(BaseModel): class AgenciesWithCoverageRetrieveResponseData(BaseModel): - limit_exceeded: Optional[bool] = FieldInfo(alias="limitExceeded", default=None) + list: List[AgenciesWithCoverageRetrieveResponseDataList] - list: Optional[List[AgenciesWithCoverageRetrieveResponseDataList]] = None + references: References - references: Optional[References] = None + limit_exceeded: Optional[bool] = FieldInfo(alias="limitExceeded", default=None) class AgenciesWithCoverageRetrieveResponse(ResponseWrapper): diff --git a/src/onebusaway/types/agency_retrieve_response.py b/src/onebusaway/types/agency_retrieve_response.py index f1fdd43..bec686c 100644 --- a/src/onebusaway/types/agency_retrieve_response.py +++ b/src/onebusaway/types/agency_retrieve_response.py @@ -34,11 +34,11 @@ class AgencyRetrieveResponseDataEntry(BaseModel): class AgencyRetrieveResponseData(BaseModel): - entry: Optional[AgencyRetrieveResponseDataEntry] = None + entry: AgencyRetrieveResponseDataEntry - limit_exceeded: Optional[bool] = FieldInfo(alias="limitExceeded", default=None) + references: References - references: Optional[References] = None + limit_exceeded: Optional[bool] = FieldInfo(alias="limitExceeded", default=None) class AgencyRetrieveResponse(ResponseWrapper): diff --git a/src/onebusaway/types/arrival_and_departure_list_response.py b/src/onebusaway/types/arrival_and_departure_list_response.py index 2b13670..84eb767 100644 --- a/src/onebusaway/types/arrival_and_departure_list_response.py +++ b/src/onebusaway/types/arrival_and_departure_list_response.py @@ -266,15 +266,15 @@ class ArrivalAndDepartureListResponseDataEntryArrivalsAndDeparture(BaseModel): class ArrivalAndDepartureListResponseDataEntry(BaseModel): - arrivals_and_departures: Optional[List[ArrivalAndDepartureListResponseDataEntryArrivalsAndDeparture]] = FieldInfo( - alias="arrivalsAndDepartures", default=None + arrivals_and_departures: List[ArrivalAndDepartureListResponseDataEntryArrivalsAndDeparture] = FieldInfo( + alias="arrivalsAndDepartures" ) class ArrivalAndDepartureListResponseData(BaseModel): - entry: Optional[ArrivalAndDepartureListResponseDataEntry] = None + entry: ArrivalAndDepartureListResponseDataEntry - references: Optional[References] = None + references: References class ArrivalAndDepartureListResponse(ResponseWrapper): diff --git a/src/onebusaway/types/arrival_and_departure_retrieve_response.py b/src/onebusaway/types/arrival_and_departure_retrieve_response.py index aa6c77a..723eec7 100644 --- a/src/onebusaway/types/arrival_and_departure_retrieve_response.py +++ b/src/onebusaway/types/arrival_and_departure_retrieve_response.py @@ -265,9 +265,9 @@ class ArrivalAndDepartureRetrieveResponseDataEntry(BaseModel): class ArrivalAndDepartureRetrieveResponseData(BaseModel): - entry: Optional[ArrivalAndDepartureRetrieveResponseDataEntry] = None + entry: ArrivalAndDepartureRetrieveResponseDataEntry - references: Optional[References] = None + references: References class ArrivalAndDepartureRetrieveResponse(ResponseWrapper): diff --git a/src/onebusaway/types/config_retrieve_response.py b/src/onebusaway/types/config_retrieve_response.py index d814f25..fb24ae4 100644 --- a/src/onebusaway/types/config_retrieve_response.py +++ b/src/onebusaway/types/config_retrieve_response.py @@ -73,9 +73,9 @@ class ConfigRetrieveResponseDataEntry(BaseModel): class ConfigRetrieveResponseData(BaseModel): - entry: Optional[ConfigRetrieveResponseDataEntry] = None + entry: ConfigRetrieveResponseDataEntry - references: Optional[References] = None + references: References class ConfigRetrieveResponse(ResponseWrapper): diff --git a/src/onebusaway/types/current_time_retrieve_response.py b/src/onebusaway/types/current_time_retrieve_response.py index 7459360..0f0ad3b 100644 --- a/src/onebusaway/types/current_time_retrieve_response.py +++ b/src/onebusaway/types/current_time_retrieve_response.py @@ -18,9 +18,9 @@ class CurrentTimeRetrieveResponseDataEntry(BaseModel): class CurrentTimeRetrieveResponseData(BaseModel): - entry: Optional[CurrentTimeRetrieveResponseDataEntry] = None + entry: CurrentTimeRetrieveResponseDataEntry - references: Optional[References] = None + references: References class CurrentTimeRetrieveResponse(ResponseWrapper): diff --git a/src/onebusaway/types/route_retrieve_response.py b/src/onebusaway/types/route_retrieve_response.py index 640416a..cf07d4a 100644 --- a/src/onebusaway/types/route_retrieve_response.py +++ b/src/onebusaway/types/route_retrieve_response.py @@ -32,9 +32,9 @@ class RouteRetrieveResponseDataEntry(BaseModel): class RouteRetrieveResponseData(BaseModel): - entry: Optional[RouteRetrieveResponseDataEntry] = None + entry: RouteRetrieveResponseDataEntry - references: Optional[References] = None + references: References class RouteRetrieveResponse(ResponseWrapper): diff --git a/src/onebusaway/types/schedule_for_stop_retrieve_params.py b/src/onebusaway/types/schedule_for_stop_retrieve_params.py new file mode 100644 index 0000000..99b89f7 --- /dev/null +++ b/src/onebusaway/types/schedule_for_stop_retrieve_params.py @@ -0,0 +1,19 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +import datetime +from typing import Union +from typing_extensions import Annotated, TypedDict + +from .._utils import PropertyInfo + +__all__ = ["ScheduleForStopRetrieveParams"] + + +class ScheduleForStopRetrieveParams(TypedDict, total=False): + date: Annotated[Union[str, datetime.date], PropertyInfo(format="iso8601")] + """ + The date for which you want to request a schedule in the format YYYY-MM-DD + (optional, defaults to the current date) + """ diff --git a/src/onebusaway/types/schedule_for_stop_retrieve_response.py b/src/onebusaway/types/schedule_for_stop_retrieve_response.py new file mode 100644 index 0000000..5170464 --- /dev/null +++ b/src/onebusaway/types/schedule_for_stop_retrieve_response.py @@ -0,0 +1,89 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List, Optional + +from pydantic import Field as FieldInfo + +from .._models import BaseModel +from .shared.references import References +from .shared.response_wrapper import ResponseWrapper + +__all__ = [ + "ScheduleForStopRetrieveResponse", + "ScheduleForStopRetrieveResponseData", + "ScheduleForStopRetrieveResponseDataEntry", + "ScheduleForStopRetrieveResponseDataEntryStopRouteSchedule", + "ScheduleForStopRetrieveResponseDataEntryStopRouteScheduleStopRouteDirectionSchedule", + "ScheduleForStopRetrieveResponseDataEntryStopRouteScheduleStopRouteDirectionScheduleScheduleStopTime", + "ScheduleForStopRetrieveResponseDataEntryStopRouteScheduleStopRouteDirectionScheduleScheduleFrequency", +] + + +class ScheduleForStopRetrieveResponseDataEntryStopRouteScheduleStopRouteDirectionScheduleScheduleStopTime(BaseModel): + arrival_enabled: bool = FieldInfo(alias="arrivalEnabled") + + arrival_time: int = FieldInfo(alias="arrivalTime") + + departure_enabled: bool = FieldInfo(alias="departureEnabled") + + departure_time: int = FieldInfo(alias="departureTime") + + service_id: str = FieldInfo(alias="serviceId") + + trip_id: str = FieldInfo(alias="tripId") + + stop_headsign: Optional[str] = FieldInfo(alias="stopHeadsign", default=None) + + +class ScheduleForStopRetrieveResponseDataEntryStopRouteScheduleStopRouteDirectionScheduleScheduleFrequency(BaseModel): + end_time: int = FieldInfo(alias="endTime") + + headway: int + + service_date: int = FieldInfo(alias="serviceDate") + + service_id: str = FieldInfo(alias="serviceId") + + start_time: int = FieldInfo(alias="startTime") + + trip_id: str = FieldInfo(alias="tripId") + + +class ScheduleForStopRetrieveResponseDataEntryStopRouteScheduleStopRouteDirectionSchedule(BaseModel): + schedule_stop_times: List[ + ScheduleForStopRetrieveResponseDataEntryStopRouteScheduleStopRouteDirectionScheduleScheduleStopTime + ] = FieldInfo(alias="scheduleStopTimes") + + trip_headsign: str = FieldInfo(alias="tripHeadsign") + + schedule_frequencies: Optional[ + List[ScheduleForStopRetrieveResponseDataEntryStopRouteScheduleStopRouteDirectionScheduleScheduleFrequency] + ] = FieldInfo(alias="scheduleFrequencies", default=None) + + +class ScheduleForStopRetrieveResponseDataEntryStopRouteSchedule(BaseModel): + route_id: str = FieldInfo(alias="routeId") + + stop_route_direction_schedules: List[ + ScheduleForStopRetrieveResponseDataEntryStopRouteScheduleStopRouteDirectionSchedule + ] = FieldInfo(alias="stopRouteDirectionSchedules") + + +class ScheduleForStopRetrieveResponseDataEntry(BaseModel): + date: int + + stop_id: str = FieldInfo(alias="stopId") + + stop_route_schedules: List[ScheduleForStopRetrieveResponseDataEntryStopRouteSchedule] = FieldInfo( + alias="stopRouteSchedules" + ) + + +class ScheduleForStopRetrieveResponseData(BaseModel): + entry: ScheduleForStopRetrieveResponseDataEntry + + references: References + + +class ScheduleForStopRetrieveResponse(ResponseWrapper): + data: Optional[ScheduleForStopRetrieveResponseData] = None diff --git a/src/onebusaway/types/stop_ids_for_agency_list_response.py b/src/onebusaway/types/stop_ids_for_agency_list_response.py index 6120be8..bf3927c 100644 --- a/src/onebusaway/types/stop_ids_for_agency_list_response.py +++ b/src/onebusaway/types/stop_ids_for_agency_list_response.py @@ -12,11 +12,11 @@ class StopIDsForAgencyListResponseData(BaseModel): - limit_exceeded: Optional[bool] = FieldInfo(alias="limitExceeded", default=None) + list: List[str] - list: Optional[List[str]] = None + references: References - references: Optional[References] = None + limit_exceeded: Optional[bool] = FieldInfo(alias="limitExceeded", default=None) class StopIDsForAgencyListResponse(ResponseWrapper): diff --git a/src/onebusaway/types/stop_retrieve_response.py b/src/onebusaway/types/stop_retrieve_response.py index abb6779..8d71183 100644 --- a/src/onebusaway/types/stop_retrieve_response.py +++ b/src/onebusaway/types/stop_retrieve_response.py @@ -36,9 +36,9 @@ class StopRetrieveResponseDataEntry(BaseModel): class StopRetrieveResponseData(BaseModel): - entry: Optional[StopRetrieveResponseDataEntry] = None + entry: StopRetrieveResponseDataEntry - references: Optional[References] = None + references: References class StopRetrieveResponse(ResponseWrapper): diff --git a/src/onebusaway/types/stops_for_location_retrieve_params.py b/src/onebusaway/types/stops_for_location_retrieve_params.py index aaf2936..b5c1ba6 100644 --- a/src/onebusaway/types/stops_for_location_retrieve_params.py +++ b/src/onebusaway/types/stops_for_location_retrieve_params.py @@ -2,14 +2,12 @@ from __future__ import annotations -from typing_extensions import Required, TypedDict +from typing_extensions import TypedDict __all__ = ["StopsForLocationRetrieveParams"] class StopsForLocationRetrieveParams(TypedDict, total=False): - key: Required[str] - lat: float lon: float diff --git a/src/onebusaway/types/stops_for_location_retrieve_response.py b/src/onebusaway/types/stops_for_location_retrieve_response.py index a505f4a..3612168 100644 --- a/src/onebusaway/types/stops_for_location_retrieve_response.py +++ b/src/onebusaway/types/stops_for_location_retrieve_response.py @@ -40,11 +40,11 @@ class StopsForLocationRetrieveResponseDataList(BaseModel): class StopsForLocationRetrieveResponseData(BaseModel): - limit_exceeded: Optional[bool] = FieldInfo(alias="limitExceeded", default=None) + list: List[StopsForLocationRetrieveResponseDataList] - list: Optional[List[StopsForLocationRetrieveResponseDataList]] = None + references: References - references: Optional[References] = None + limit_exceeded: Optional[bool] = FieldInfo(alias="limitExceeded", default=None) class StopsForLocationRetrieveResponse(ResponseWrapper): diff --git a/src/onebusaway/types/stops_for_route_list_response.py b/src/onebusaway/types/stops_for_route_list_response.py index d0703a0..2aa1644 100644 --- a/src/onebusaway/types/stops_for_route_list_response.py +++ b/src/onebusaway/types/stops_for_route_list_response.py @@ -72,4 +72,4 @@ class StopsForRouteListResponseData(BaseModel): class StopsForRouteListResponse(ResponseWrapper): - data: Optional[StopsForRouteListResponseData] = None + data: StopsForRouteListResponseData diff --git a/src/onebusaway/types/trip_detail_retrieve_response.py b/src/onebusaway/types/trip_detail_retrieve_response.py index e88b30c..24f2152 100644 --- a/src/onebusaway/types/trip_detail_retrieve_response.py +++ b/src/onebusaway/types/trip_detail_retrieve_response.py @@ -179,9 +179,9 @@ class TripDetailRetrieveResponseDataEntry(BaseModel): class TripDetailRetrieveResponseData(BaseModel): - entry: Optional[TripDetailRetrieveResponseDataEntry] = None + entry: TripDetailRetrieveResponseDataEntry - references: Optional[References] = None + references: References class TripDetailRetrieveResponse(ResponseWrapper): diff --git a/src/onebusaway/types/trip_for_vehicle_retrieve_response.py b/src/onebusaway/types/trip_for_vehicle_retrieve_response.py index fdebda9..90a6ff8 100644 --- a/src/onebusaway/types/trip_for_vehicle_retrieve_response.py +++ b/src/onebusaway/types/trip_for_vehicle_retrieve_response.py @@ -179,9 +179,9 @@ class TripForVehicleRetrieveResponseDataEntry(BaseModel): class TripForVehicleRetrieveResponseData(BaseModel): - entry: Optional[TripForVehicleRetrieveResponseDataEntry] = None + entry: TripForVehicleRetrieveResponseDataEntry - references: Optional[References] = None + references: References class TripForVehicleRetrieveResponse(ResponseWrapper): diff --git a/src/onebusaway/types/trip_retrieve_response.py b/src/onebusaway/types/trip_retrieve_response.py index 58a3a34..92c8546 100644 --- a/src/onebusaway/types/trip_retrieve_response.py +++ b/src/onebusaway/types/trip_retrieve_response.py @@ -36,9 +36,9 @@ class TripRetrieveResponseDataEntry(BaseModel): class TripRetrieveResponseData(BaseModel): - entry: Optional[TripRetrieveResponseDataEntry] = None + entry: TripRetrieveResponseDataEntry - references: Optional[References] = None + references: References class TripRetrieveResponse(ResponseWrapper): diff --git a/src/onebusaway/types/trips_for_location_retrieve_response.py b/src/onebusaway/types/trips_for_location_retrieve_response.py index 2c69d10..237c30c 100644 --- a/src/onebusaway/types/trips_for_location_retrieve_response.py +++ b/src/onebusaway/types/trips_for_location_retrieve_response.py @@ -26,16 +26,16 @@ class TripsForLocationRetrieveResponseDataList(BaseModel): class TripsForLocationRetrieveResponseData(BaseModel): + list: List[TripsForLocationRetrieveResponseDataList] + + references: References + limit_exceeded: Optional[bool] = FieldInfo(alias="limitExceeded", default=None) """Indicates if the limit of trips has been exceeded""" - list: Optional[List[TripsForLocationRetrieveResponseDataList]] = None - out_of_range: Optional[bool] = FieldInfo(alias="outOfRange", default=None) """Indicates if the search location is out of range""" - references: Optional[References] = None - class TripsForLocationRetrieveResponse(ResponseWrapper): data: Optional[TripsForLocationRetrieveResponseData] = None diff --git a/tests/api_resources/test_schedule_for_stop.py b/tests/api_resources/test_schedule_for_stop.py new file mode 100644 index 0000000..0154e44 --- /dev/null +++ b/tests/api_resources/test_schedule_for_stop.py @@ -0,0 +1,115 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +import os +from typing import Any, cast + +import pytest + +from onebusaway import OnebusawaySDK, AsyncOnebusawaySDK +from tests.utils import assert_matches_type +from onebusaway.types import ScheduleForStopRetrieveResponse +from onebusaway._utils import parse_date + +base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") + + +class TestScheduleForStop: + parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + + @parametrize + def test_method_retrieve(self, client: OnebusawaySDK) -> None: + schedule_for_stop = client.schedule_for_stop.retrieve( + stop_id="stopID", + ) + assert_matches_type(ScheduleForStopRetrieveResponse, schedule_for_stop, path=["response"]) + + @parametrize + def test_method_retrieve_with_all_params(self, client: OnebusawaySDK) -> None: + schedule_for_stop = client.schedule_for_stop.retrieve( + stop_id="stopID", + date=parse_date("2019-12-27"), + ) + assert_matches_type(ScheduleForStopRetrieveResponse, schedule_for_stop, path=["response"]) + + @parametrize + def test_raw_response_retrieve(self, client: OnebusawaySDK) -> None: + response = client.schedule_for_stop.with_raw_response.retrieve( + stop_id="stopID", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + schedule_for_stop = response.parse() + assert_matches_type(ScheduleForStopRetrieveResponse, schedule_for_stop, path=["response"]) + + @parametrize + def test_streaming_response_retrieve(self, client: OnebusawaySDK) -> None: + with client.schedule_for_stop.with_streaming_response.retrieve( + stop_id="stopID", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + schedule_for_stop = response.parse() + assert_matches_type(ScheduleForStopRetrieveResponse, schedule_for_stop, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_retrieve(self, client: OnebusawaySDK) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `stop_id` but received ''"): + client.schedule_for_stop.with_raw_response.retrieve( + stop_id="", + ) + + +class TestAsyncScheduleForStop: + parametrize = pytest.mark.parametrize("async_client", [False, True], indirect=True, ids=["loose", "strict"]) + + @parametrize + async def test_method_retrieve(self, async_client: AsyncOnebusawaySDK) -> None: + schedule_for_stop = await async_client.schedule_for_stop.retrieve( + stop_id="stopID", + ) + assert_matches_type(ScheduleForStopRetrieveResponse, schedule_for_stop, path=["response"]) + + @parametrize + async def test_method_retrieve_with_all_params(self, async_client: AsyncOnebusawaySDK) -> None: + schedule_for_stop = await async_client.schedule_for_stop.retrieve( + stop_id="stopID", + date=parse_date("2019-12-27"), + ) + assert_matches_type(ScheduleForStopRetrieveResponse, schedule_for_stop, path=["response"]) + + @parametrize + async def test_raw_response_retrieve(self, async_client: AsyncOnebusawaySDK) -> None: + response = await async_client.schedule_for_stop.with_raw_response.retrieve( + stop_id="stopID", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + schedule_for_stop = await response.parse() + assert_matches_type(ScheduleForStopRetrieveResponse, schedule_for_stop, path=["response"]) + + @parametrize + async def test_streaming_response_retrieve(self, async_client: AsyncOnebusawaySDK) -> None: + async with async_client.schedule_for_stop.with_streaming_response.retrieve( + stop_id="stopID", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + schedule_for_stop = await response.parse() + assert_matches_type(ScheduleForStopRetrieveResponse, schedule_for_stop, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_retrieve(self, async_client: AsyncOnebusawaySDK) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `stop_id` but received ''"): + await async_client.schedule_for_stop.with_raw_response.retrieve( + stop_id="", + ) diff --git a/tests/api_resources/test_stops_for_location.py b/tests/api_resources/test_stops_for_location.py index 6613263..d1abaeb 100644 --- a/tests/api_resources/test_stops_for_location.py +++ b/tests/api_resources/test_stops_for_location.py @@ -19,15 +19,12 @@ class TestStopsForLocation: @parametrize def test_method_retrieve(self, client: OnebusawaySDK) -> None: - stops_for_location = client.stops_for_location.retrieve( - key="key", - ) + stops_for_location = client.stops_for_location.retrieve() assert_matches_type(StopsForLocationRetrieveResponse, stops_for_location, path=["response"]) @parametrize def test_method_retrieve_with_all_params(self, client: OnebusawaySDK) -> None: stops_for_location = client.stops_for_location.retrieve( - key="key", lat=0, lon=0, ) @@ -35,9 +32,7 @@ def test_method_retrieve_with_all_params(self, client: OnebusawaySDK) -> None: @parametrize def test_raw_response_retrieve(self, client: OnebusawaySDK) -> None: - response = client.stops_for_location.with_raw_response.retrieve( - key="key", - ) + response = client.stops_for_location.with_raw_response.retrieve() assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -46,9 +41,7 @@ def test_raw_response_retrieve(self, client: OnebusawaySDK) -> None: @parametrize def test_streaming_response_retrieve(self, client: OnebusawaySDK) -> None: - with client.stops_for_location.with_streaming_response.retrieve( - key="key", - ) as response: + with client.stops_for_location.with_streaming_response.retrieve() as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -63,15 +56,12 @@ class TestAsyncStopsForLocation: @parametrize async def test_method_retrieve(self, async_client: AsyncOnebusawaySDK) -> None: - stops_for_location = await async_client.stops_for_location.retrieve( - key="key", - ) + stops_for_location = await async_client.stops_for_location.retrieve() assert_matches_type(StopsForLocationRetrieveResponse, stops_for_location, path=["response"]) @parametrize async def test_method_retrieve_with_all_params(self, async_client: AsyncOnebusawaySDK) -> None: stops_for_location = await async_client.stops_for_location.retrieve( - key="key", lat=0, lon=0, ) @@ -79,9 +69,7 @@ async def test_method_retrieve_with_all_params(self, async_client: AsyncOnebusaw @parametrize async def test_raw_response_retrieve(self, async_client: AsyncOnebusawaySDK) -> None: - response = await async_client.stops_for_location.with_raw_response.retrieve( - key="key", - ) + response = await async_client.stops_for_location.with_raw_response.retrieve() assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -90,9 +78,7 @@ async def test_raw_response_retrieve(self, async_client: AsyncOnebusawaySDK) -> @parametrize async def test_streaming_response_retrieve(self, async_client: AsyncOnebusawaySDK) -> None: - async with async_client.stops_for_location.with_streaming_response.retrieve( - key="key", - ) as response: + async with async_client.stops_for_location.with_streaming_response.retrieve() as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" From 9dfffd881f9bbe738a2af883ef1dae8db68c7eb7 Mon Sep 17 00:00:00 2001 From: Stainless Bot Date: Wed, 31 Jul 2024 19:00:16 +0000 Subject: [PATCH 02/19] feat: chore: Refactor code by removing unnecessary blank lines --- examples/agencies_with_coverage.py | 16 +++-- examples/arrivals_and_departures_for_stop.py | 21 ++++--- examples/config.py | 15 +++-- examples/current_time.py | 15 +++-- examples/helpers/load_env.py | 13 ++-- examples/stop.py | 16 +++-- examples/stop_for_route.py | 19 +++--- examples/stop_ids_for_agency.py | 14 +++-- examples/stops_for_location.py | 19 +++--- examples/trip_details.py | 16 +++-- src/onebusaway/_base_client.py | 63 +++++++++++++------- src/onebusaway/_compat.py | 24 +++++--- src/onebusaway/_files.py | 12 ++-- src/onebusaway/_response.py | 12 ++-- src/onebusaway/_types.py | 9 ++- src/onebusaway/_utils/_proxy.py | 3 +- src/onebusaway/_utils/_utils.py | 18 ++++-- tests/test_deepcopy.py | 3 +- tests/test_response.py | 12 ++-- tests/test_utils/test_typing.py | 15 +++-- 20 files changed, 212 insertions(+), 123 deletions(-) diff --git a/examples/agencies_with_coverage.py b/examples/agencies_with_coverage.py index 878ba97..0e239ed 100644 --- a/examples/agencies_with_coverage.py +++ b/examples/agencies_with_coverage.py @@ -1,14 +1,18 @@ -from onebusaway import OnebusawaySDK -from helpers.load_env import load_settings from pprint import pprint +from helpers.load_env import load_settings + +from onebusaway import OnebusawaySDK + # Load settings from .env file, if it exists. If not, we'll use the # Puget Sound server URL (which is also the default in the SDK) and # the 'TEST' API key. -settings = load_settings({ - "api_key": "TEST", - "base_url": "https://api.pugetsound.onebusaway.org/", -}) +settings = load_settings( + { + "api_key": "TEST", + "base_url": "https://api.pugetsound.onebusaway.org/", + } +) # Create a new instance of the OneBusAway SDK with the settings we loaded. oba = OnebusawaySDK(**settings) diff --git a/examples/arrivals_and_departures_for_stop.py b/examples/arrivals_and_departures_for_stop.py index 6807007..d2888a6 100644 --- a/examples/arrivals_and_departures_for_stop.py +++ b/examples/arrivals_and_departures_for_stop.py @@ -1,24 +1,27 @@ -from onebusaway import OnebusawaySDK from helpers.load_env import load_settings +from onebusaway import OnebusawaySDK + # Load settings from .env file, if it exists. If not, we'll use the # Puget Sound server URL (which is also the default in the SDK) and # the 'TEST' API key. -settings = load_settings({ - "api_key": "TEST", - "base_url": "https://api.pugetsound.onebusaway.org/", -}) +settings = load_settings( + { + "api_key": "TEST", + "base_url": "https://api.pugetsound.onebusaway.org/", + } +) # Create a new instance of the OneBusAway SDK with the settings we loaded. oba = OnebusawaySDK(**settings) # Define the query parameters query = { - "tripId": '1_604670535', # Replace with actual trip ID - "serviceDate": '1810918000000', # Replace with actual service date in milliseconds since epoch + "tripId": "1_604670535", # Replace with actual trip ID + "serviceDate": "1810918000000", # Replace with actual service date in milliseconds since epoch } -stopId = '1_75403' # Replace with actual stop ID +stopId = "1_75403" # Replace with actual stop ID # Retrieve arrival and departure information response = oba.arrival_and_departure.list(stopId, extra_query=query) @@ -32,4 +35,4 @@ print(f"Predicted Arrival Time: {arr_dep.predicted_arrival_time}") print(f"Scheduled Arrival Time: {arr_dep.scheduled_arrival_time}") print(f"Vehicle ID: {arr_dep.vehicle_id}") - print('') + print("") diff --git a/examples/config.py b/examples/config.py index 01bdcf3..437640d 100644 --- a/examples/config.py +++ b/examples/config.py @@ -1,15 +1,18 @@ -from onebusaway import OnebusawaySDK -from helpers.load_env import load_settings from pprint import pprint +from helpers.load_env import load_settings + +from onebusaway import OnebusawaySDK # Load settings from .env file, if it exists. If not, we'll use the # Puget Sound server URL (which is also the default in the SDK) and # the 'TEST' API key. -settings = load_settings({ - "api_key": "TEST", - "base_url": "https://api.pugetsound.onebusaway.org/", -}) +settings = load_settings( + { + "api_key": "TEST", + "base_url": "https://api.pugetsound.onebusaway.org/", + } +) # Create a new instance of the OneBusAway SDK with the settings we loaded. oba = OnebusawaySDK(**settings) diff --git a/examples/current_time.py b/examples/current_time.py index 00caf7a..f0db3e9 100644 --- a/examples/current_time.py +++ b/examples/current_time.py @@ -1,15 +1,18 @@ -from onebusaway import OnebusawaySDK -from helpers.load_env import load_settings from pprint import pprint +from helpers.load_env import load_settings + +from onebusaway import OnebusawaySDK # Load settings from .env file, if it exists. If not, we'll use the # Puget Sound server URL (which is also the default in the SDK) and # the 'TEST' API key. -settings = load_settings({ - "api_key": "TEST", - "base_url": "https://api.pugetsound.onebusaway.org/", -}) +settings = load_settings( + { + "api_key": "TEST", + "base_url": "https://api.pugetsound.onebusaway.org/", + } +) # Create a new instance of the OneBusAway SDK with the settings we loaded. oba = OnebusawaySDK(**settings) diff --git a/examples/helpers/load_env.py b/examples/helpers/load_env.py index 50a7717..c0f6599 100644 --- a/examples/helpers/load_env.py +++ b/examples/helpers/load_env.py @@ -1,5 +1,6 @@ +from typing import Any, Dict, Optional from pathlib import Path -from typing import Optional, Dict, Any + def load_settings(default_settings: Dict[str, Any]) -> Dict[str, Any]: """ @@ -17,6 +18,7 @@ def load_settings(default_settings: Dict[str, Any]) -> Dict[str, Any]: else: return default_settings + def load_env() -> Optional[Dict[str, Any]]: """ Loads environment variables from a .env file located in the parent directory of the current file. @@ -25,13 +27,14 @@ def load_env() -> Optional[Dict[str, Any]]: A dictionary containing the loaded environment variables, or None if the .env file does not exist. """ dirname = Path(__file__).resolve().parent - env_path = dirname.parent / '.env' + env_path = dirname.parent / ".env" if env_path.exists(): return load_env_from_path(str(env_path)) else: return None + def load_env_from_path(file_path: str) -> Dict[str, str]: """ Load environment variables from a file. @@ -45,17 +48,17 @@ def load_env_from_path(file_path: str) -> Dict[str, str]: """ env = {} - with open(file_path, 'r', encoding='utf8') as file: + with open(file_path, "r", encoding="utf8") as file: lines = file.readlines() for line in lines: # Remove comments and trim whitespace - trimmed_line = line.split('#')[0].strip() + trimmed_line = line.split("#")[0].strip() if not trimmed_line: continue - key_value = trimmed_line.split('=', 1) + key_value = trimmed_line.split("=", 1) if len(key_value) != 2: continue diff --git a/examples/stop.py b/examples/stop.py index 94d35b8..7810f1a 100644 --- a/examples/stop.py +++ b/examples/stop.py @@ -1,14 +1,18 @@ -from onebusaway import OnebusawaySDK -from helpers.load_env import load_settings from pprint import pprint +from helpers.load_env import load_settings + +from onebusaway import OnebusawaySDK + # Load settings from .env file, if it exists. If not, we'll use the # Puget Sound server URL (which is also the default in the SDK) and # the 'TEST' API key. -settings = load_settings({ - "api_key": "TEST", - "base_url": "https://api.pugetsound.onebusaway.org/", -}) +settings = load_settings( + { + "api_key": "TEST", + "base_url": "https://api.pugetsound.onebusaway.org/", + } +) # Create a new instance of the OneBusAway SDK with the settings we loaded. oba = OnebusawaySDK(**settings) diff --git a/examples/stop_for_route.py b/examples/stop_for_route.py index 3b18d41..11354b1 100644 --- a/examples/stop_for_route.py +++ b/examples/stop_for_route.py @@ -1,21 +1,24 @@ -from onebusaway import OnebusawaySDK -from helpers.load_env import load_settings from pprint import pprint +from helpers.load_env import load_settings + +from onebusaway import OnebusawaySDK # Load settings from .env file, if it exists. If not, we'll use the # Puget Sound server URL (which is also the default in the SDK) and # the 'TEST' API key. -settings = load_settings({ - "api_key": "TEST", - "base_url": "https://api.pugetsound.onebusaway.org/", -}) +settings = load_settings( + { + "api_key": "TEST", + "base_url": "https://api.pugetsound.onebusaway.org/", + } +) # Create a new instance of the OneBusAway SDK with the settings we loaded. oba = OnebusawaySDK(**settings) -route_id = '1_100224' +route_id = "1_100224" response = oba.stops_for_route.list(route_id) if response and response.data: - pprint(response.data) + pprint(response.data) diff --git a/examples/stop_ids_for_agency.py b/examples/stop_ids_for_agency.py index 59b8d77..919ee60 100644 --- a/examples/stop_ids_for_agency.py +++ b/examples/stop_ids_for_agency.py @@ -1,19 +1,21 @@ -from onebusaway import OnebusawaySDK from helpers.load_env import load_settings +from onebusaway import OnebusawaySDK # Load settings from .env file, if it exists. If not, we'll use the # Puget Sound server URL (which is also the default in the SDK) and # the 'TEST' API key. -settings = load_settings({ - "api_key": "TEST", - "base_url": "https://api.pugetsound.onebusaway.org/", -}) +settings = load_settings( + { + "api_key": "TEST", + "base_url": "https://api.pugetsound.onebusaway.org/", + } +) # Create a new instance of the OneBusAway SDK with the settings we loaded. oba = OnebusawaySDK(**settings) -agency_id = "40" # Link Light Rail in the Seattle area. +agency_id = "40" # Link Light Rail in the Seattle area. stop_ids = oba.stop_ids_for_agency.list(agency_id) if stop_ids.data and stop_ids.data.list: diff --git a/examples/stops_for_location.py b/examples/stops_for_location.py index 8cbf2e5..3a8ecc3 100644 --- a/examples/stops_for_location.py +++ b/examples/stops_for_location.py @@ -1,22 +1,25 @@ -from onebusaway import OnebusawaySDK + from helpers.load_env import load_settings -from pprint import pprint + +from onebusaway import OnebusawaySDK # Load settings from .env file, if it exists. If not, we'll use the # Puget Sound server URL (which is also the default in the SDK) and # the 'TEST' API key. -settings = load_settings({ - "api_key": "TEST", - "base_url": "https://api.pugetsound.onebusaway.org/", -}) +settings = load_settings( + { + "api_key": "TEST", + "base_url": "https://api.pugetsound.onebusaway.org/", + } +) # Create a new instance of the OneBusAway SDK with the settings we loaded. oba = OnebusawaySDK(**settings) space_needle_stops = oba.stops_for_location.retrieve( - key="TEST", # TODO FIXME: I shouldn't have to specify the API key here. + key="TEST", # TODO FIXME: I shouldn't have to specify the API key here. lat=47.6205, - lon=-122.3493 + lon=-122.3493, ) stops = space_needle_stops.data.list diff --git a/examples/trip_details.py b/examples/trip_details.py index 149dd70..ada941e 100644 --- a/examples/trip_details.py +++ b/examples/trip_details.py @@ -1,14 +1,18 @@ -from onebusaway import OnebusawaySDK -from helpers.load_env import load_settings from pprint import pprint +from helpers.load_env import load_settings + +from onebusaway import OnebusawaySDK + # Load settings from .env file, if it exists. If not, we'll use the # Puget Sound server URL (which is also the default in the SDK) and # the 'TEST' API key. -settings = load_settings({ - "api_key": "TEST", - "base_url": "https://api.pugetsound.onebusaway.org/", -}) +settings = load_settings( + { + "api_key": "TEST", + "base_url": "https://api.pugetsound.onebusaway.org/", + } +) # Create a new instance of the OneBusAway SDK with the settings we loaded. oba = OnebusawaySDK(**settings) diff --git a/src/onebusaway/_base_client.py b/src/onebusaway/_base_client.py index ae4d8a0..d17404e 100644 --- a/src/onebusaway/_base_client.py +++ b/src/onebusaway/_base_client.py @@ -124,14 +124,16 @@ def __init__( self, *, url: URL, - ) -> None: ... + ) -> None: + ... @overload def __init__( self, *, params: Query, - ) -> None: ... + ) -> None: + ... def __init__( self, @@ -164,7 +166,8 @@ def has_next_page(self) -> bool: return False return self.next_page_info() is not None - def next_page_info(self) -> Optional[PageInfo]: ... + def next_page_info(self) -> Optional[PageInfo]: + ... def _get_page_items(self) -> Iterable[_T]: # type: ignore[empty-body] ... @@ -900,7 +903,8 @@ def request( *, stream: Literal[True], stream_cls: Type[_StreamT], - ) -> _StreamT: ... + ) -> _StreamT: + ... @overload def request( @@ -910,7 +914,8 @@ def request( remaining_retries: Optional[int] = None, *, stream: Literal[False] = False, - ) -> ResponseT: ... + ) -> ResponseT: + ... @overload def request( @@ -921,7 +926,8 @@ def request( *, stream: bool = False, stream_cls: Type[_StreamT] | None = None, - ) -> ResponseT | _StreamT: ... + ) -> ResponseT | _StreamT: + ... def request( self, @@ -1146,7 +1152,8 @@ def get( cast_to: Type[ResponseT], options: RequestOptions = {}, stream: Literal[False] = False, - ) -> ResponseT: ... + ) -> ResponseT: + ... @overload def get( @@ -1157,7 +1164,8 @@ def get( options: RequestOptions = {}, stream: Literal[True], stream_cls: type[_StreamT], - ) -> _StreamT: ... + ) -> _StreamT: + ... @overload def get( @@ -1168,7 +1176,8 @@ def get( options: RequestOptions = {}, stream: bool, stream_cls: type[_StreamT] | None = None, - ) -> ResponseT | _StreamT: ... + ) -> ResponseT | _StreamT: + ... def get( self, @@ -1194,7 +1203,8 @@ def post( options: RequestOptions = {}, files: RequestFiles | None = None, stream: Literal[False] = False, - ) -> ResponseT: ... + ) -> ResponseT: + ... @overload def post( @@ -1207,7 +1217,8 @@ def post( files: RequestFiles | None = None, stream: Literal[True], stream_cls: type[_StreamT], - ) -> _StreamT: ... + ) -> _StreamT: + ... @overload def post( @@ -1220,7 +1231,8 @@ def post( files: RequestFiles | None = None, stream: bool, stream_cls: type[_StreamT] | None = None, - ) -> ResponseT | _StreamT: ... + ) -> ResponseT | _StreamT: + ... def post( self, @@ -1453,7 +1465,8 @@ async def request( *, stream: Literal[False] = False, remaining_retries: Optional[int] = None, - ) -> ResponseT: ... + ) -> ResponseT: + ... @overload async def request( @@ -1464,7 +1477,8 @@ async def request( stream: Literal[True], stream_cls: type[_AsyncStreamT], remaining_retries: Optional[int] = None, - ) -> _AsyncStreamT: ... + ) -> _AsyncStreamT: + ... @overload async def request( @@ -1475,7 +1489,8 @@ async def request( stream: bool, stream_cls: type[_AsyncStreamT] | None = None, remaining_retries: Optional[int] = None, - ) -> ResponseT | _AsyncStreamT: ... + ) -> ResponseT | _AsyncStreamT: + ... async def request( self, @@ -1686,7 +1701,8 @@ async def get( cast_to: Type[ResponseT], options: RequestOptions = {}, stream: Literal[False] = False, - ) -> ResponseT: ... + ) -> ResponseT: + ... @overload async def get( @@ -1697,7 +1713,8 @@ async def get( options: RequestOptions = {}, stream: Literal[True], stream_cls: type[_AsyncStreamT], - ) -> _AsyncStreamT: ... + ) -> _AsyncStreamT: + ... @overload async def get( @@ -1708,7 +1725,8 @@ async def get( options: RequestOptions = {}, stream: bool, stream_cls: type[_AsyncStreamT] | None = None, - ) -> ResponseT | _AsyncStreamT: ... + ) -> ResponseT | _AsyncStreamT: + ... async def get( self, @@ -1732,7 +1750,8 @@ async def post( files: RequestFiles | None = None, options: RequestOptions = {}, stream: Literal[False] = False, - ) -> ResponseT: ... + ) -> ResponseT: + ... @overload async def post( @@ -1745,7 +1764,8 @@ async def post( options: RequestOptions = {}, stream: Literal[True], stream_cls: type[_AsyncStreamT], - ) -> _AsyncStreamT: ... + ) -> _AsyncStreamT: + ... @overload async def post( @@ -1758,7 +1778,8 @@ async def post( options: RequestOptions = {}, stream: bool, stream_cls: type[_AsyncStreamT] | None = None, - ) -> ResponseT | _AsyncStreamT: ... + ) -> ResponseT | _AsyncStreamT: + ... async def post( self, diff --git a/src/onebusaway/_compat.py b/src/onebusaway/_compat.py index 7c6f91a..c919b5a 100644 --- a/src/onebusaway/_compat.py +++ b/src/onebusaway/_compat.py @@ -159,19 +159,22 @@ def model_parse(model: type[_ModelT], data: Any) -> _ModelT: # generic models if TYPE_CHECKING: - class GenericModel(pydantic.BaseModel): ... + class GenericModel(pydantic.BaseModel): + ... else: if PYDANTIC_V2: # there no longer needs to be a distinction in v2 but # we still have to create our own subclass to avoid # inconsistent MRO ordering errors - class GenericModel(pydantic.BaseModel): ... + class GenericModel(pydantic.BaseModel): + ... else: import pydantic.generics - class GenericModel(pydantic.generics.GenericModel, pydantic.BaseModel): ... + class GenericModel(pydantic.generics.GenericModel, pydantic.BaseModel): + ... # cached properties @@ -190,21 +193,26 @@ class typed_cached_property(Generic[_T]): func: Callable[[Any], _T] attrname: str | None - def __init__(self, func: Callable[[Any], _T]) -> None: ... + def __init__(self, func: Callable[[Any], _T]) -> None: + ... @overload - def __get__(self, instance: None, owner: type[Any] | None = None) -> Self: ... + def __get__(self, instance: None, owner: type[Any] | None = None) -> Self: + ... @overload - def __get__(self, instance: object, owner: type[Any] | None = None) -> _T: ... + def __get__(self, instance: object, owner: type[Any] | None = None) -> _T: + ... def __get__(self, instance: object, owner: type[Any] | None = None) -> _T | Self: raise NotImplementedError() - def __set_name__(self, owner: type[Any], name: str) -> None: ... + def __set_name__(self, owner: type[Any], name: str) -> None: + ... # __set__ is not defined at runtime, but @cached_property is designed to be settable - def __set__(self, instance: object, value: _T) -> None: ... + def __set__(self, instance: object, value: _T) -> None: + ... else: try: from functools import cached_property as cached_property diff --git a/src/onebusaway/_files.py b/src/onebusaway/_files.py index 715cc20..0d2022a 100644 --- a/src/onebusaway/_files.py +++ b/src/onebusaway/_files.py @@ -39,11 +39,13 @@ def assert_is_file_content(obj: object, *, key: str | None = None) -> None: @overload -def to_httpx_files(files: None) -> None: ... +def to_httpx_files(files: None) -> None: + ... @overload -def to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: ... +def to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: + ... def to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles | None: @@ -81,11 +83,13 @@ def _read_file_content(file: FileContent) -> HttpxFileContent: @overload -async def async_to_httpx_files(files: None) -> None: ... +async def async_to_httpx_files(files: None) -> None: + ... @overload -async def async_to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: ... +async def async_to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: + ... async def async_to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles | None: diff --git a/src/onebusaway/_response.py b/src/onebusaway/_response.py index e29a7d3..40d4fb2 100644 --- a/src/onebusaway/_response.py +++ b/src/onebusaway/_response.py @@ -257,10 +257,12 @@ def _parse(self, *, to: type[_T] | None = None) -> R | _T: class APIResponse(BaseAPIResponse[R]): @overload - def parse(self, *, to: type[_T]) -> _T: ... + def parse(self, *, to: type[_T]) -> _T: + ... @overload - def parse(self) -> R: ... + def parse(self) -> R: + ... def parse(self, *, to: type[_T] | None = None) -> R | _T: """Returns the rich python representation of this response's data. @@ -359,10 +361,12 @@ def iter_lines(self) -> Iterator[str]: class AsyncAPIResponse(BaseAPIResponse[R]): @overload - async def parse(self, *, to: type[_T]) -> _T: ... + async def parse(self, *, to: type[_T]) -> _T: + ... @overload - async def parse(self) -> R: ... + async def parse(self) -> R: + ... async def parse(self, *, to: type[_T] | None = None) -> R | _T: """Returns the rich python representation of this response's data. diff --git a/src/onebusaway/_types.py b/src/onebusaway/_types.py index f554261..66ec7fc 100644 --- a/src/onebusaway/_types.py +++ b/src/onebusaway/_types.py @@ -111,7 +111,8 @@ class NotGiven: For example: ```py - def get(timeout: Union[int, NotGiven, None] = NotGiven()) -> Response: ... + def get(timeout: Union[int, NotGiven, None] = NotGiven()) -> Response: + ... get(timeout=1) # 1s timeout @@ -161,14 +162,16 @@ def build( *, response: Response, data: object, - ) -> _T: ... + ) -> _T: + ... Headers = Mapping[str, Union[str, Omit]] class HeadersLikeProtocol(Protocol): - def get(self, __key: str) -> str | None: ... + def get(self, __key: str) -> str | None: + ... HeadersLike = Union[Headers, HeadersLikeProtocol] diff --git a/src/onebusaway/_utils/_proxy.py b/src/onebusaway/_utils/_proxy.py index ffd883e..c46a62a 100644 --- a/src/onebusaway/_utils/_proxy.py +++ b/src/onebusaway/_utils/_proxy.py @@ -59,4 +59,5 @@ def __as_proxied__(self) -> T: return cast(T, self) @abstractmethod - def __load__(self) -> T: ... + def __load__(self) -> T: + ... diff --git a/src/onebusaway/_utils/_utils.py b/src/onebusaway/_utils/_utils.py index 2fc5a1c..34797c2 100644 --- a/src/onebusaway/_utils/_utils.py +++ b/src/onebusaway/_utils/_utils.py @@ -211,17 +211,20 @@ def required_args(*variants: Sequence[str]) -> Callable[[CallableT], CallableT]: Example usage: ```py @overload - def foo(*, a: str) -> str: ... + def foo(*, a: str) -> str: + ... @overload - def foo(*, b: bool) -> str: ... + def foo(*, b: bool) -> str: + ... # This enforces the same constraints that a static type checker would # i.e. that either a or b must be passed to the function @required_args(["a"], ["b"]) - def foo(*, a: str | None = None, b: bool | None = None) -> str: ... + def foo(*, a: str | None = None, b: bool | None = None) -> str: + ... ``` """ @@ -283,15 +286,18 @@ def wrapper(*args: object, **kwargs: object) -> object: @overload -def strip_not_given(obj: None) -> None: ... +def strip_not_given(obj: None) -> None: + ... @overload -def strip_not_given(obj: Mapping[_K, _V | NotGiven]) -> dict[_K, _V]: ... +def strip_not_given(obj: Mapping[_K, _V | NotGiven]) -> dict[_K, _V]: + ... @overload -def strip_not_given(obj: object) -> object: ... +def strip_not_given(obj: object) -> object: + ... def strip_not_given(obj: object | None) -> object: diff --git a/tests/test_deepcopy.py b/tests/test_deepcopy.py index 5da235a..519c9b1 100644 --- a/tests/test_deepcopy.py +++ b/tests/test_deepcopy.py @@ -41,7 +41,8 @@ def test_nested_list() -> None: assert_different_identities(obj1[1], obj2[1]) -class MyObject: ... +class MyObject: + ... def test_ignores_other_types() -> None: diff --git a/tests/test_response.py b/tests/test_response.py index df94f16..9e02d05 100644 --- a/tests/test_response.py +++ b/tests/test_response.py @@ -19,13 +19,16 @@ from onebusaway._base_client import FinalRequestOptions -class ConcreteBaseAPIResponse(APIResponse[bytes]): ... +class ConcreteBaseAPIResponse(APIResponse[bytes]): + ... -class ConcreteAPIResponse(APIResponse[List[str]]): ... +class ConcreteAPIResponse(APIResponse[List[str]]): + ... -class ConcreteAsyncAPIResponse(APIResponse[httpx.Response]): ... +class ConcreteAsyncAPIResponse(APIResponse[httpx.Response]): + ... def test_extract_response_type_direct_classes() -> None: @@ -53,7 +56,8 @@ def test_extract_response_type_binary_response() -> None: assert extract_response_type(AsyncBinaryAPIResponse) == bytes -class PydanticModel(pydantic.BaseModel): ... +class PydanticModel(pydantic.BaseModel): + ... def test_response_parse_mismatched_basemodel(client: OnebusawaySDK) -> None: diff --git a/tests/test_utils/test_typing.py b/tests/test_utils/test_typing.py index 1f6e80a..c6438ff 100644 --- a/tests/test_utils/test_typing.py +++ b/tests/test_utils/test_typing.py @@ -9,19 +9,24 @@ _T3 = TypeVar("_T3") -class BaseGeneric(Generic[_T]): ... +class BaseGeneric(Generic[_T]): + ... -class SubclassGeneric(BaseGeneric[_T]): ... +class SubclassGeneric(BaseGeneric[_T]): + ... -class BaseGenericMultipleTypeArgs(Generic[_T, _T2, _T3]): ... +class BaseGenericMultipleTypeArgs(Generic[_T, _T2, _T3]): + ... -class SubclassGenericMultipleTypeArgs(BaseGenericMultipleTypeArgs[_T, _T2, _T3]): ... +class SubclassGenericMultipleTypeArgs(BaseGenericMultipleTypeArgs[_T, _T2, _T3]): + ... -class SubclassDifferentOrderGenericMultipleTypeArgs(BaseGenericMultipleTypeArgs[_T2, _T, _T3]): ... +class SubclassDifferentOrderGenericMultipleTypeArgs(BaseGenericMultipleTypeArgs[_T2, _T, _T3]): + ... def test_extract_type_var() -> None: From d80d795cf0dfce32a27986630065fcf3f93a0eaa Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 03:45:01 +0000 Subject: [PATCH 03/19] feat(api): OpenAPI spec update via Stainless API (#43) --- .stats.yml | 2 +- .../types/agencies_with_coverage_retrieve_response.py | 2 +- src/onebusaway/types/agency_retrieve_response.py | 2 +- src/onebusaway/types/arrival_and_departure_list_response.py | 2 +- src/onebusaway/types/arrival_and_departure_retrieve_response.py | 2 +- src/onebusaway/types/config_retrieve_response.py | 2 +- src/onebusaway/types/current_time_retrieve_response.py | 2 +- src/onebusaway/types/route_retrieve_response.py | 2 +- src/onebusaway/types/schedule_for_stop_retrieve_response.py | 2 +- src/onebusaway/types/stop_ids_for_agency_list_response.py | 2 +- src/onebusaway/types/stop_retrieve_response.py | 2 +- src/onebusaway/types/stops_for_location_retrieve_response.py | 2 +- src/onebusaway/types/trip_detail_retrieve_response.py | 2 +- src/onebusaway/types/trip_for_vehicle_retrieve_response.py | 2 +- src/onebusaway/types/trip_retrieve_response.py | 2 +- src/onebusaway/types/trips_for_location_retrieve_response.py | 2 +- src/onebusaway/types/vehicles_for_agency_list_response.py | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.stats.yml b/.stats.yml index cce1cfa..bde8699 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,2 +1,2 @@ configured_endpoints: 17 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/open-transit%2Fopen-transit-261df351536029839245955df4df7341de315fe2b1d1d6aeb063eaef62bcddc9.yml +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/open-transit%2Fopen-transit-b3ce4adf9802981762637faaf11e9f3a1805de9b86da2c1afaa464ff17899d16.yml diff --git a/src/onebusaway/types/agencies_with_coverage_retrieve_response.py b/src/onebusaway/types/agencies_with_coverage_retrieve_response.py index 6a54093..d4db507 100644 --- a/src/onebusaway/types/agencies_with_coverage_retrieve_response.py +++ b/src/onebusaway/types/agencies_with_coverage_retrieve_response.py @@ -36,4 +36,4 @@ class AgenciesWithCoverageRetrieveResponseData(BaseModel): class AgenciesWithCoverageRetrieveResponse(ResponseWrapper): - data: Optional[AgenciesWithCoverageRetrieveResponseData] = None + data: AgenciesWithCoverageRetrieveResponseData diff --git a/src/onebusaway/types/agency_retrieve_response.py b/src/onebusaway/types/agency_retrieve_response.py index bec686c..06000e6 100644 --- a/src/onebusaway/types/agency_retrieve_response.py +++ b/src/onebusaway/types/agency_retrieve_response.py @@ -42,4 +42,4 @@ class AgencyRetrieveResponseData(BaseModel): class AgencyRetrieveResponse(ResponseWrapper): - data: Optional[AgencyRetrieveResponseData] = None + data: AgencyRetrieveResponseData diff --git a/src/onebusaway/types/arrival_and_departure_list_response.py b/src/onebusaway/types/arrival_and_departure_list_response.py index 84eb767..362df0d 100644 --- a/src/onebusaway/types/arrival_and_departure_list_response.py +++ b/src/onebusaway/types/arrival_and_departure_list_response.py @@ -278,4 +278,4 @@ class ArrivalAndDepartureListResponseData(BaseModel): class ArrivalAndDepartureListResponse(ResponseWrapper): - data: Optional[ArrivalAndDepartureListResponseData] = None + data: ArrivalAndDepartureListResponseData diff --git a/src/onebusaway/types/arrival_and_departure_retrieve_response.py b/src/onebusaway/types/arrival_and_departure_retrieve_response.py index 723eec7..b9a7507 100644 --- a/src/onebusaway/types/arrival_and_departure_retrieve_response.py +++ b/src/onebusaway/types/arrival_and_departure_retrieve_response.py @@ -271,4 +271,4 @@ class ArrivalAndDepartureRetrieveResponseData(BaseModel): class ArrivalAndDepartureRetrieveResponse(ResponseWrapper): - data: Optional[ArrivalAndDepartureRetrieveResponseData] = None + data: ArrivalAndDepartureRetrieveResponseData diff --git a/src/onebusaway/types/config_retrieve_response.py b/src/onebusaway/types/config_retrieve_response.py index fb24ae4..eaa7cf9 100644 --- a/src/onebusaway/types/config_retrieve_response.py +++ b/src/onebusaway/types/config_retrieve_response.py @@ -79,4 +79,4 @@ class ConfigRetrieveResponseData(BaseModel): class ConfigRetrieveResponse(ResponseWrapper): - data: Optional[ConfigRetrieveResponseData] = None + data: ConfigRetrieveResponseData diff --git a/src/onebusaway/types/current_time_retrieve_response.py b/src/onebusaway/types/current_time_retrieve_response.py index 0f0ad3b..20fddb2 100644 --- a/src/onebusaway/types/current_time_retrieve_response.py +++ b/src/onebusaway/types/current_time_retrieve_response.py @@ -24,4 +24,4 @@ class CurrentTimeRetrieveResponseData(BaseModel): class CurrentTimeRetrieveResponse(ResponseWrapper): - data: Optional[CurrentTimeRetrieveResponseData] = None + data: CurrentTimeRetrieveResponseData diff --git a/src/onebusaway/types/route_retrieve_response.py b/src/onebusaway/types/route_retrieve_response.py index cf07d4a..7a153e8 100644 --- a/src/onebusaway/types/route_retrieve_response.py +++ b/src/onebusaway/types/route_retrieve_response.py @@ -38,4 +38,4 @@ class RouteRetrieveResponseData(BaseModel): class RouteRetrieveResponse(ResponseWrapper): - data: Optional[RouteRetrieveResponseData] = None + data: RouteRetrieveResponseData diff --git a/src/onebusaway/types/schedule_for_stop_retrieve_response.py b/src/onebusaway/types/schedule_for_stop_retrieve_response.py index 5170464..83d1985 100644 --- a/src/onebusaway/types/schedule_for_stop_retrieve_response.py +++ b/src/onebusaway/types/schedule_for_stop_retrieve_response.py @@ -86,4 +86,4 @@ class ScheduleForStopRetrieveResponseData(BaseModel): class ScheduleForStopRetrieveResponse(ResponseWrapper): - data: Optional[ScheduleForStopRetrieveResponseData] = None + data: ScheduleForStopRetrieveResponseData diff --git a/src/onebusaway/types/stop_ids_for_agency_list_response.py b/src/onebusaway/types/stop_ids_for_agency_list_response.py index bf3927c..f36b63f 100644 --- a/src/onebusaway/types/stop_ids_for_agency_list_response.py +++ b/src/onebusaway/types/stop_ids_for_agency_list_response.py @@ -20,4 +20,4 @@ class StopIDsForAgencyListResponseData(BaseModel): class StopIDsForAgencyListResponse(ResponseWrapper): - data: Optional[StopIDsForAgencyListResponseData] = None + data: StopIDsForAgencyListResponseData diff --git a/src/onebusaway/types/stop_retrieve_response.py b/src/onebusaway/types/stop_retrieve_response.py index 8d71183..105a50c 100644 --- a/src/onebusaway/types/stop_retrieve_response.py +++ b/src/onebusaway/types/stop_retrieve_response.py @@ -42,4 +42,4 @@ class StopRetrieveResponseData(BaseModel): class StopRetrieveResponse(ResponseWrapper): - data: Optional[StopRetrieveResponseData] = None + data: StopRetrieveResponseData diff --git a/src/onebusaway/types/stops_for_location_retrieve_response.py b/src/onebusaway/types/stops_for_location_retrieve_response.py index 3612168..6704d6e 100644 --- a/src/onebusaway/types/stops_for_location_retrieve_response.py +++ b/src/onebusaway/types/stops_for_location_retrieve_response.py @@ -48,4 +48,4 @@ class StopsForLocationRetrieveResponseData(BaseModel): class StopsForLocationRetrieveResponse(ResponseWrapper): - data: Optional[StopsForLocationRetrieveResponseData] = None + data: StopsForLocationRetrieveResponseData diff --git a/src/onebusaway/types/trip_detail_retrieve_response.py b/src/onebusaway/types/trip_detail_retrieve_response.py index 24f2152..d750fe0 100644 --- a/src/onebusaway/types/trip_detail_retrieve_response.py +++ b/src/onebusaway/types/trip_detail_retrieve_response.py @@ -185,4 +185,4 @@ class TripDetailRetrieveResponseData(BaseModel): class TripDetailRetrieveResponse(ResponseWrapper): - data: Optional[TripDetailRetrieveResponseData] = None + data: TripDetailRetrieveResponseData diff --git a/src/onebusaway/types/trip_for_vehicle_retrieve_response.py b/src/onebusaway/types/trip_for_vehicle_retrieve_response.py index 90a6ff8..42fa05e 100644 --- a/src/onebusaway/types/trip_for_vehicle_retrieve_response.py +++ b/src/onebusaway/types/trip_for_vehicle_retrieve_response.py @@ -185,4 +185,4 @@ class TripForVehicleRetrieveResponseData(BaseModel): class TripForVehicleRetrieveResponse(ResponseWrapper): - data: Optional[TripForVehicleRetrieveResponseData] = None + data: TripForVehicleRetrieveResponseData diff --git a/src/onebusaway/types/trip_retrieve_response.py b/src/onebusaway/types/trip_retrieve_response.py index 92c8546..e939f2f 100644 --- a/src/onebusaway/types/trip_retrieve_response.py +++ b/src/onebusaway/types/trip_retrieve_response.py @@ -42,4 +42,4 @@ class TripRetrieveResponseData(BaseModel): class TripRetrieveResponse(ResponseWrapper): - data: Optional[TripRetrieveResponseData] = None + data: TripRetrieveResponseData diff --git a/src/onebusaway/types/trips_for_location_retrieve_response.py b/src/onebusaway/types/trips_for_location_retrieve_response.py index 237c30c..0864e6d 100644 --- a/src/onebusaway/types/trips_for_location_retrieve_response.py +++ b/src/onebusaway/types/trips_for_location_retrieve_response.py @@ -38,4 +38,4 @@ class TripsForLocationRetrieveResponseData(BaseModel): class TripsForLocationRetrieveResponse(ResponseWrapper): - data: Optional[TripsForLocationRetrieveResponseData] = None + data: TripsForLocationRetrieveResponseData diff --git a/src/onebusaway/types/vehicles_for_agency_list_response.py b/src/onebusaway/types/vehicles_for_agency_list_response.py index f61596d..8675eda 100644 --- a/src/onebusaway/types/vehicles_for_agency_list_response.py +++ b/src/onebusaway/types/vehicles_for_agency_list_response.py @@ -174,4 +174,4 @@ class VehiclesForAgencyListResponseData(BaseModel): class VehiclesForAgencyListResponse(ResponseWrapper): - data: Optional[VehiclesForAgencyListResponseData] = None + data: VehiclesForAgencyListResponseData From aaccc2917f63dfc429ce74682892693e4d12b9b8 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 03:45:18 +0000 Subject: [PATCH 04/19] release: 0.1.0-alpha.11 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 10 ++++++++++ pyproject.toml | 2 +- src/onebusaway/_version.py | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 3b005e5..ee49ac2 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.1.0-alpha.10" + ".": "0.1.0-alpha.11" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index f2fcfe2..a7fb75d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 0.1.0-alpha.11 (2024-08-01) + +Full Changelog: [v0.1.0-alpha.10...v0.1.0-alpha.11](https://github.com/OneBusAway/python-sdk/compare/v0.1.0-alpha.10...v0.1.0-alpha.11) + +### Features + +* **api:** OpenAPI spec update via Stainless API ([#43](https://github.com/OneBusAway/python-sdk/issues/43)) ([d80d795](https://github.com/OneBusAway/python-sdk/commit/d80d795cf0dfce32a27986630065fcf3f93a0eaa)) +* chore: Refactor code by removing unnecessary blank lines ([9dfffd8](https://github.com/OneBusAway/python-sdk/commit/9dfffd881f9bbe738a2af883ef1dae8db68c7eb7)) +* various codegen changes ([1cba822](https://github.com/OneBusAway/python-sdk/commit/1cba822390c0a6e2c2d8f3f9e101215a1abc22cc)) + ## 0.1.0-alpha.10 (2024-07-31) Full Changelog: [v0.1.0-alpha.9...v0.1.0-alpha.10](https://github.com/OneBusAway/python-sdk/compare/v0.1.0-alpha.9...v0.1.0-alpha.10) diff --git a/pyproject.toml b/pyproject.toml index 6db0b9e..c33aaf0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "onebusaway" -version = "0.1.0-alpha.10" +version = "0.1.0-alpha.11" description = "The official Python library for the onebusaway-sdk API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/onebusaway/_version.py b/src/onebusaway/_version.py index ffc4f0c..9189dbc 100644 --- a/src/onebusaway/_version.py +++ b/src/onebusaway/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "onebusaway" -__version__ = "0.1.0-alpha.10" # x-release-please-version +__version__ = "0.1.0-alpha.11" # x-release-please-version From 70461d8b097ae0ec821f06871818b3a0b1271921 Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Thu, 1 Aug 2024 06:55:06 +0300 Subject: [PATCH 05/19] chore: Remove unnecessary API key comment in stops_for_location.py --- examples/stops_for_location.py | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/stops_for_location.py b/examples/stops_for_location.py index 3a8ecc3..8635c38 100644 --- a/examples/stops_for_location.py +++ b/examples/stops_for_location.py @@ -17,7 +17,6 @@ oba = OnebusawaySDK(**settings) space_needle_stops = oba.stops_for_location.retrieve( - key="TEST", # TODO FIXME: I shouldn't have to specify the API key here. lat=47.6205, lon=-122.3493, ) From c79102d2c079e23c77dd4583485b967cf8eaddc1 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 03:57:49 +0000 Subject: [PATCH 06/19] feat(api): OpenAPI spec update via Stainless API (#44) --- .stats.yml | 2 +- src/onebusaway/types/shared/references.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.stats.yml b/.stats.yml index bde8699..530ad67 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,2 +1,2 @@ configured_endpoints: 17 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/open-transit%2Fopen-transit-b3ce4adf9802981762637faaf11e9f3a1805de9b86da2c1afaa464ff17899d16.yml +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/open-transit%2Fopen-transit-2f06829fbda889b14e1a2adc5f3bf80df5ca926d166ef9ff487a132080fc6437.yml diff --git a/src/onebusaway/types/shared/references.py b/src/onebusaway/types/shared/references.py index 827d72a..cb39a86 100644 --- a/src/onebusaway/types/shared/references.py +++ b/src/onebusaway/types/shared/references.py @@ -257,14 +257,14 @@ class Trip(BaseModel): class References(BaseModel): - agencies: Optional[List[Agency]] = None + agencies: List[Agency] - routes: Optional[List[Route]] = None + routes: List[Route] - situations: Optional[List[Situation]] = None + situations: List[Situation] - stops: Optional[List[Stop]] = None + stops: List[Stop] - stop_times: Optional[List[StopTime]] = FieldInfo(alias="stopTimes", default=None) + stop_times: List[StopTime] = FieldInfo(alias="stopTimes") - trips: Optional[List[Trip]] = None + trips: List[Trip] From dddd42142c02d44635e2c38fcc040e06d1c87414 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 03:58:03 +0000 Subject: [PATCH 07/19] release: 0.1.0-alpha.11 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 11 +++++++++++ pyproject.toml | 2 +- src/onebusaway/_version.py | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 3b005e5..ee49ac2 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.1.0-alpha.10" + ".": "0.1.0-alpha.11" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index f2fcfe2..124dc2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## 0.1.0-alpha.11 (2024-08-01) + +Full Changelog: [v0.1.0-alpha.10...v0.1.0-alpha.11](https://github.com/OneBusAway/python-sdk/compare/v0.1.0-alpha.10...v0.1.0-alpha.11) + +### Features + +* **api:** OpenAPI spec update via Stainless API ([#43](https://github.com/OneBusAway/python-sdk/issues/43)) ([d80d795](https://github.com/OneBusAway/python-sdk/commit/d80d795cf0dfce32a27986630065fcf3f93a0eaa)) +* **api:** OpenAPI spec update via Stainless API ([#44](https://github.com/OneBusAway/python-sdk/issues/44)) ([c79102d](https://github.com/OneBusAway/python-sdk/commit/c79102d2c079e23c77dd4583485b967cf8eaddc1)) +* chore: Refactor code by removing unnecessary blank lines ([9dfffd8](https://github.com/OneBusAway/python-sdk/commit/9dfffd881f9bbe738a2af883ef1dae8db68c7eb7)) +* various codegen changes ([1cba822](https://github.com/OneBusAway/python-sdk/commit/1cba822390c0a6e2c2d8f3f9e101215a1abc22cc)) + ## 0.1.0-alpha.10 (2024-07-31) Full Changelog: [v0.1.0-alpha.9...v0.1.0-alpha.10](https://github.com/OneBusAway/python-sdk/compare/v0.1.0-alpha.9...v0.1.0-alpha.10) diff --git a/pyproject.toml b/pyproject.toml index 6db0b9e..c33aaf0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "onebusaway" -version = "0.1.0-alpha.10" +version = "0.1.0-alpha.11" description = "The official Python library for the onebusaway-sdk API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/onebusaway/_version.py b/src/onebusaway/_version.py index ffc4f0c..9189dbc 100644 --- a/src/onebusaway/_version.py +++ b/src/onebusaway/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "onebusaway" -__version__ = "0.1.0-alpha.10" # x-release-please-version +__version__ = "0.1.0-alpha.11" # x-release-please-version From 138c1c35902a68e251796e4713fcfeb609fb2592 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 04:09:35 +0000 Subject: [PATCH 08/19] feat(api): OpenAPI spec update via Stainless API (#45) --- .stats.yml | 2 +- .../stops_for_location_retrieve_response.py | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.stats.yml b/.stats.yml index 530ad67..0915939 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,2 +1,2 @@ configured_endpoints: 17 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/open-transit%2Fopen-transit-2f06829fbda889b14e1a2adc5f3bf80df5ca926d166ef9ff487a132080fc6437.yml +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/open-transit%2Fopen-transit-e1da29690ebfb4c6c07ede3d292a4f6babcd2202d6f3bb38bfa287ae04dfeb50.yml diff --git a/src/onebusaway/types/stops_for_location_retrieve_response.py b/src/onebusaway/types/stops_for_location_retrieve_response.py index 6704d6e..628b246 100644 --- a/src/onebusaway/types/stops_for_location_retrieve_response.py +++ b/src/onebusaway/types/stops_for_location_retrieve_response.py @@ -16,36 +16,36 @@ class StopsForLocationRetrieveResponseDataList(BaseModel): - id: Optional[str] = None + id: str - code: Optional[str] = None + lat: float - direction: Optional[str] = None + lon: float - lat: Optional[float] = None + name: str - location_type: Optional[int] = FieldInfo(alias="locationType", default=None) + parent: str - lon: Optional[float] = None + route_ids: List[str] = FieldInfo(alias="routeIds") - name: Optional[str] = None + static_route_ids: List[str] = FieldInfo(alias="staticRouteIds") - parent: Optional[str] = None + code: Optional[str] = None - route_ids: Optional[List[str]] = FieldInfo(alias="routeIds", default=None) + direction: Optional[str] = None - static_route_ids: Optional[List[str]] = FieldInfo(alias="staticRouteIds", default=None) + location_type: Optional[int] = FieldInfo(alias="locationType", default=None) wheelchair_boarding: Optional[str] = FieldInfo(alias="wheelchairBoarding", default=None) class StopsForLocationRetrieveResponseData(BaseModel): + limit_exceeded: bool = FieldInfo(alias="limitExceeded") + list: List[StopsForLocationRetrieveResponseDataList] references: References - limit_exceeded: Optional[bool] = FieldInfo(alias="limitExceeded", default=None) - class StopsForLocationRetrieveResponse(ResponseWrapper): data: StopsForLocationRetrieveResponseData From 865b96be32373e572db8064ad76891d391b5b7b4 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 04:09:49 +0000 Subject: [PATCH 09/19] release: 0.1.0-alpha.11 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 12 ++++++++++++ pyproject.toml | 2 +- src/onebusaway/_version.py | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 3b005e5..ee49ac2 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.1.0-alpha.10" + ".": "0.1.0-alpha.11" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index f2fcfe2..8f5d1e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 0.1.0-alpha.11 (2024-08-01) + +Full Changelog: [v0.1.0-alpha.10...v0.1.0-alpha.11](https://github.com/OneBusAway/python-sdk/compare/v0.1.0-alpha.10...v0.1.0-alpha.11) + +### Features + +* **api:** OpenAPI spec update via Stainless API ([#43](https://github.com/OneBusAway/python-sdk/issues/43)) ([d80d795](https://github.com/OneBusAway/python-sdk/commit/d80d795cf0dfce32a27986630065fcf3f93a0eaa)) +* **api:** OpenAPI spec update via Stainless API ([#44](https://github.com/OneBusAway/python-sdk/issues/44)) ([c79102d](https://github.com/OneBusAway/python-sdk/commit/c79102d2c079e23c77dd4583485b967cf8eaddc1)) +* **api:** OpenAPI spec update via Stainless API ([#45](https://github.com/OneBusAway/python-sdk/issues/45)) ([138c1c3](https://github.com/OneBusAway/python-sdk/commit/138c1c35902a68e251796e4713fcfeb609fb2592)) +* chore: Refactor code by removing unnecessary blank lines ([9dfffd8](https://github.com/OneBusAway/python-sdk/commit/9dfffd881f9bbe738a2af883ef1dae8db68c7eb7)) +* various codegen changes ([1cba822](https://github.com/OneBusAway/python-sdk/commit/1cba822390c0a6e2c2d8f3f9e101215a1abc22cc)) + ## 0.1.0-alpha.10 (2024-07-31) Full Changelog: [v0.1.0-alpha.9...v0.1.0-alpha.10](https://github.com/OneBusAway/python-sdk/compare/v0.1.0-alpha.9...v0.1.0-alpha.10) diff --git a/pyproject.toml b/pyproject.toml index 6db0b9e..c33aaf0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "onebusaway" -version = "0.1.0-alpha.10" +version = "0.1.0-alpha.11" description = "The official Python library for the onebusaway-sdk API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/onebusaway/_version.py b/src/onebusaway/_version.py index ffc4f0c..9189dbc 100644 --- a/src/onebusaway/_version.py +++ b/src/onebusaway/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "onebusaway" -__version__ = "0.1.0-alpha.10" # x-release-please-version +__version__ = "0.1.0-alpha.11" # x-release-please-version From 530a7993f6bdf1d7e6e128d03f25b3b624686537 Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Thu, 1 Aug 2024 07:13:18 +0300 Subject: [PATCH 10/19] chore: Remove unnecessary API key comment in stops_for_location.py --- examples/stops_for_location.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/stops_for_location.py b/examples/stops_for_location.py index 8635c38..649bc9e 100644 --- a/examples/stops_for_location.py +++ b/examples/stops_for_location.py @@ -1,8 +1,10 @@ + from helpers.load_env import load_settings from onebusaway import OnebusawaySDK + # Load settings from .env file, if it exists. If not, we'll use the # Puget Sound server URL (which is also the default in the SDK) and # the 'TEST' API key. From 894b9f30e7a3adf8f24b7ab934cf4399df765c21 Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Thu, 1 Aug 2024 07:30:14 +0300 Subject: [PATCH 11/19] chore: format the code --- src/onebusaway/_base_client.py | 63 +++++++++++---------------------- src/onebusaway/_files.py | 12 +++---- src/onebusaway/_response.py | 12 +++---- src/onebusaway/_types.py | 9 ++--- src/onebusaway/_utils/_proxy.py | 3 +- src/onebusaway/_utils/_utils.py | 18 ++++------ tests/test_deepcopy.py | 3 +- tests/test_response.py | 12 +++---- tests/test_utils/test_typing.py | 15 +++----- 9 files changed, 49 insertions(+), 98 deletions(-) diff --git a/src/onebusaway/_base_client.py b/src/onebusaway/_base_client.py index d17404e..ae4d8a0 100644 --- a/src/onebusaway/_base_client.py +++ b/src/onebusaway/_base_client.py @@ -124,16 +124,14 @@ def __init__( self, *, url: URL, - ) -> None: - ... + ) -> None: ... @overload def __init__( self, *, params: Query, - ) -> None: - ... + ) -> None: ... def __init__( self, @@ -166,8 +164,7 @@ def has_next_page(self) -> bool: return False return self.next_page_info() is not None - def next_page_info(self) -> Optional[PageInfo]: - ... + def next_page_info(self) -> Optional[PageInfo]: ... def _get_page_items(self) -> Iterable[_T]: # type: ignore[empty-body] ... @@ -903,8 +900,7 @@ def request( *, stream: Literal[True], stream_cls: Type[_StreamT], - ) -> _StreamT: - ... + ) -> _StreamT: ... @overload def request( @@ -914,8 +910,7 @@ def request( remaining_retries: Optional[int] = None, *, stream: Literal[False] = False, - ) -> ResponseT: - ... + ) -> ResponseT: ... @overload def request( @@ -926,8 +921,7 @@ def request( *, stream: bool = False, stream_cls: Type[_StreamT] | None = None, - ) -> ResponseT | _StreamT: - ... + ) -> ResponseT | _StreamT: ... def request( self, @@ -1152,8 +1146,7 @@ def get( cast_to: Type[ResponseT], options: RequestOptions = {}, stream: Literal[False] = False, - ) -> ResponseT: - ... + ) -> ResponseT: ... @overload def get( @@ -1164,8 +1157,7 @@ def get( options: RequestOptions = {}, stream: Literal[True], stream_cls: type[_StreamT], - ) -> _StreamT: - ... + ) -> _StreamT: ... @overload def get( @@ -1176,8 +1168,7 @@ def get( options: RequestOptions = {}, stream: bool, stream_cls: type[_StreamT] | None = None, - ) -> ResponseT | _StreamT: - ... + ) -> ResponseT | _StreamT: ... def get( self, @@ -1203,8 +1194,7 @@ def post( options: RequestOptions = {}, files: RequestFiles | None = None, stream: Literal[False] = False, - ) -> ResponseT: - ... + ) -> ResponseT: ... @overload def post( @@ -1217,8 +1207,7 @@ def post( files: RequestFiles | None = None, stream: Literal[True], stream_cls: type[_StreamT], - ) -> _StreamT: - ... + ) -> _StreamT: ... @overload def post( @@ -1231,8 +1220,7 @@ def post( files: RequestFiles | None = None, stream: bool, stream_cls: type[_StreamT] | None = None, - ) -> ResponseT | _StreamT: - ... + ) -> ResponseT | _StreamT: ... def post( self, @@ -1465,8 +1453,7 @@ async def request( *, stream: Literal[False] = False, remaining_retries: Optional[int] = None, - ) -> ResponseT: - ... + ) -> ResponseT: ... @overload async def request( @@ -1477,8 +1464,7 @@ async def request( stream: Literal[True], stream_cls: type[_AsyncStreamT], remaining_retries: Optional[int] = None, - ) -> _AsyncStreamT: - ... + ) -> _AsyncStreamT: ... @overload async def request( @@ -1489,8 +1475,7 @@ async def request( stream: bool, stream_cls: type[_AsyncStreamT] | None = None, remaining_retries: Optional[int] = None, - ) -> ResponseT | _AsyncStreamT: - ... + ) -> ResponseT | _AsyncStreamT: ... async def request( self, @@ -1701,8 +1686,7 @@ async def get( cast_to: Type[ResponseT], options: RequestOptions = {}, stream: Literal[False] = False, - ) -> ResponseT: - ... + ) -> ResponseT: ... @overload async def get( @@ -1713,8 +1697,7 @@ async def get( options: RequestOptions = {}, stream: Literal[True], stream_cls: type[_AsyncStreamT], - ) -> _AsyncStreamT: - ... + ) -> _AsyncStreamT: ... @overload async def get( @@ -1725,8 +1708,7 @@ async def get( options: RequestOptions = {}, stream: bool, stream_cls: type[_AsyncStreamT] | None = None, - ) -> ResponseT | _AsyncStreamT: - ... + ) -> ResponseT | _AsyncStreamT: ... async def get( self, @@ -1750,8 +1732,7 @@ async def post( files: RequestFiles | None = None, options: RequestOptions = {}, stream: Literal[False] = False, - ) -> ResponseT: - ... + ) -> ResponseT: ... @overload async def post( @@ -1764,8 +1745,7 @@ async def post( options: RequestOptions = {}, stream: Literal[True], stream_cls: type[_AsyncStreamT], - ) -> _AsyncStreamT: - ... + ) -> _AsyncStreamT: ... @overload async def post( @@ -1778,8 +1758,7 @@ async def post( options: RequestOptions = {}, stream: bool, stream_cls: type[_AsyncStreamT] | None = None, - ) -> ResponseT | _AsyncStreamT: - ... + ) -> ResponseT | _AsyncStreamT: ... async def post( self, diff --git a/src/onebusaway/_files.py b/src/onebusaway/_files.py index 0d2022a..715cc20 100644 --- a/src/onebusaway/_files.py +++ b/src/onebusaway/_files.py @@ -39,13 +39,11 @@ def assert_is_file_content(obj: object, *, key: str | None = None) -> None: @overload -def to_httpx_files(files: None) -> None: - ... +def to_httpx_files(files: None) -> None: ... @overload -def to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: - ... +def to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: ... def to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles | None: @@ -83,13 +81,11 @@ def _read_file_content(file: FileContent) -> HttpxFileContent: @overload -async def async_to_httpx_files(files: None) -> None: - ... +async def async_to_httpx_files(files: None) -> None: ... @overload -async def async_to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: - ... +async def async_to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: ... async def async_to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles | None: diff --git a/src/onebusaway/_response.py b/src/onebusaway/_response.py index 40d4fb2..e29a7d3 100644 --- a/src/onebusaway/_response.py +++ b/src/onebusaway/_response.py @@ -257,12 +257,10 @@ def _parse(self, *, to: type[_T] | None = None) -> R | _T: class APIResponse(BaseAPIResponse[R]): @overload - def parse(self, *, to: type[_T]) -> _T: - ... + def parse(self, *, to: type[_T]) -> _T: ... @overload - def parse(self) -> R: - ... + def parse(self) -> R: ... def parse(self, *, to: type[_T] | None = None) -> R | _T: """Returns the rich python representation of this response's data. @@ -361,12 +359,10 @@ def iter_lines(self) -> Iterator[str]: class AsyncAPIResponse(BaseAPIResponse[R]): @overload - async def parse(self, *, to: type[_T]) -> _T: - ... + async def parse(self, *, to: type[_T]) -> _T: ... @overload - async def parse(self) -> R: - ... + async def parse(self) -> R: ... async def parse(self, *, to: type[_T] | None = None) -> R | _T: """Returns the rich python representation of this response's data. diff --git a/src/onebusaway/_types.py b/src/onebusaway/_types.py index 66ec7fc..f554261 100644 --- a/src/onebusaway/_types.py +++ b/src/onebusaway/_types.py @@ -111,8 +111,7 @@ class NotGiven: For example: ```py - def get(timeout: Union[int, NotGiven, None] = NotGiven()) -> Response: - ... + def get(timeout: Union[int, NotGiven, None] = NotGiven()) -> Response: ... get(timeout=1) # 1s timeout @@ -162,16 +161,14 @@ def build( *, response: Response, data: object, - ) -> _T: - ... + ) -> _T: ... Headers = Mapping[str, Union[str, Omit]] class HeadersLikeProtocol(Protocol): - def get(self, __key: str) -> str | None: - ... + def get(self, __key: str) -> str | None: ... HeadersLike = Union[Headers, HeadersLikeProtocol] diff --git a/src/onebusaway/_utils/_proxy.py b/src/onebusaway/_utils/_proxy.py index c46a62a..ffd883e 100644 --- a/src/onebusaway/_utils/_proxy.py +++ b/src/onebusaway/_utils/_proxy.py @@ -59,5 +59,4 @@ def __as_proxied__(self) -> T: return cast(T, self) @abstractmethod - def __load__(self) -> T: - ... + def __load__(self) -> T: ... diff --git a/src/onebusaway/_utils/_utils.py b/src/onebusaway/_utils/_utils.py index 34797c2..2fc5a1c 100644 --- a/src/onebusaway/_utils/_utils.py +++ b/src/onebusaway/_utils/_utils.py @@ -211,20 +211,17 @@ def required_args(*variants: Sequence[str]) -> Callable[[CallableT], CallableT]: Example usage: ```py @overload - def foo(*, a: str) -> str: - ... + def foo(*, a: str) -> str: ... @overload - def foo(*, b: bool) -> str: - ... + def foo(*, b: bool) -> str: ... # This enforces the same constraints that a static type checker would # i.e. that either a or b must be passed to the function @required_args(["a"], ["b"]) - def foo(*, a: str | None = None, b: bool | None = None) -> str: - ... + def foo(*, a: str | None = None, b: bool | None = None) -> str: ... ``` """ @@ -286,18 +283,15 @@ def wrapper(*args: object, **kwargs: object) -> object: @overload -def strip_not_given(obj: None) -> None: - ... +def strip_not_given(obj: None) -> None: ... @overload -def strip_not_given(obj: Mapping[_K, _V | NotGiven]) -> dict[_K, _V]: - ... +def strip_not_given(obj: Mapping[_K, _V | NotGiven]) -> dict[_K, _V]: ... @overload -def strip_not_given(obj: object) -> object: - ... +def strip_not_given(obj: object) -> object: ... def strip_not_given(obj: object | None) -> object: diff --git a/tests/test_deepcopy.py b/tests/test_deepcopy.py index 519c9b1..5da235a 100644 --- a/tests/test_deepcopy.py +++ b/tests/test_deepcopy.py @@ -41,8 +41,7 @@ def test_nested_list() -> None: assert_different_identities(obj1[1], obj2[1]) -class MyObject: - ... +class MyObject: ... def test_ignores_other_types() -> None: diff --git a/tests/test_response.py b/tests/test_response.py index 9e02d05..df94f16 100644 --- a/tests/test_response.py +++ b/tests/test_response.py @@ -19,16 +19,13 @@ from onebusaway._base_client import FinalRequestOptions -class ConcreteBaseAPIResponse(APIResponse[bytes]): - ... +class ConcreteBaseAPIResponse(APIResponse[bytes]): ... -class ConcreteAPIResponse(APIResponse[List[str]]): - ... +class ConcreteAPIResponse(APIResponse[List[str]]): ... -class ConcreteAsyncAPIResponse(APIResponse[httpx.Response]): - ... +class ConcreteAsyncAPIResponse(APIResponse[httpx.Response]): ... def test_extract_response_type_direct_classes() -> None: @@ -56,8 +53,7 @@ def test_extract_response_type_binary_response() -> None: assert extract_response_type(AsyncBinaryAPIResponse) == bytes -class PydanticModel(pydantic.BaseModel): - ... +class PydanticModel(pydantic.BaseModel): ... def test_response_parse_mismatched_basemodel(client: OnebusawaySDK) -> None: diff --git a/tests/test_utils/test_typing.py b/tests/test_utils/test_typing.py index c6438ff..1f6e80a 100644 --- a/tests/test_utils/test_typing.py +++ b/tests/test_utils/test_typing.py @@ -9,24 +9,19 @@ _T3 = TypeVar("_T3") -class BaseGeneric(Generic[_T]): - ... +class BaseGeneric(Generic[_T]): ... -class SubclassGeneric(BaseGeneric[_T]): - ... +class SubclassGeneric(BaseGeneric[_T]): ... -class BaseGenericMultipleTypeArgs(Generic[_T, _T2, _T3]): - ... +class BaseGenericMultipleTypeArgs(Generic[_T, _T2, _T3]): ... -class SubclassGenericMultipleTypeArgs(BaseGenericMultipleTypeArgs[_T, _T2, _T3]): - ... +class SubclassGenericMultipleTypeArgs(BaseGenericMultipleTypeArgs[_T, _T2, _T3]): ... -class SubclassDifferentOrderGenericMultipleTypeArgs(BaseGenericMultipleTypeArgs[_T2, _T, _T3]): - ... +class SubclassDifferentOrderGenericMultipleTypeArgs(BaseGenericMultipleTypeArgs[_T2, _T, _T3]): ... def test_extract_type_var() -> None: From 669433848d98f71c9761e0db346cf6d62449c90c Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Thu, 1 Aug 2024 07:30:19 +0300 Subject: [PATCH 12/19] chore: Refactor _compat.py to use simplified GenericModel class --- src/onebusaway/_compat.py | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/onebusaway/_compat.py b/src/onebusaway/_compat.py index c919b5a..7c6f91a 100644 --- a/src/onebusaway/_compat.py +++ b/src/onebusaway/_compat.py @@ -159,22 +159,19 @@ def model_parse(model: type[_ModelT], data: Any) -> _ModelT: # generic models if TYPE_CHECKING: - class GenericModel(pydantic.BaseModel): - ... + class GenericModel(pydantic.BaseModel): ... else: if PYDANTIC_V2: # there no longer needs to be a distinction in v2 but # we still have to create our own subclass to avoid # inconsistent MRO ordering errors - class GenericModel(pydantic.BaseModel): - ... + class GenericModel(pydantic.BaseModel): ... else: import pydantic.generics - class GenericModel(pydantic.generics.GenericModel, pydantic.BaseModel): - ... + class GenericModel(pydantic.generics.GenericModel, pydantic.BaseModel): ... # cached properties @@ -193,26 +190,21 @@ class typed_cached_property(Generic[_T]): func: Callable[[Any], _T] attrname: str | None - def __init__(self, func: Callable[[Any], _T]) -> None: - ... + def __init__(self, func: Callable[[Any], _T]) -> None: ... @overload - def __get__(self, instance: None, owner: type[Any] | None = None) -> Self: - ... + def __get__(self, instance: None, owner: type[Any] | None = None) -> Self: ... @overload - def __get__(self, instance: object, owner: type[Any] | None = None) -> _T: - ... + def __get__(self, instance: object, owner: type[Any] | None = None) -> _T: ... def __get__(self, instance: object, owner: type[Any] | None = None) -> _T | Self: raise NotImplementedError() - def __set_name__(self, owner: type[Any], name: str) -> None: - ... + def __set_name__(self, owner: type[Any], name: str) -> None: ... # __set__ is not defined at runtime, but @cached_property is designed to be settable - def __set__(self, instance: object, value: _T) -> None: - ... + def __set__(self, instance: object, value: _T) -> None: ... else: try: from functools import cached_property as cached_property From a786c068e35ab1de354f6b2d43b4f4de80b176e1 Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Thu, 1 Aug 2024 07:48:36 +0300 Subject: [PATCH 13/19] chore: Add type hint to route variable in stops_for_location.py --- examples/stops_for_location.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/stops_for_location.py b/examples/stops_for_location.py index 649bc9e..3107024 100644 --- a/examples/stops_for_location.py +++ b/examples/stops_for_location.py @@ -1,9 +1,8 @@ - - from helpers.load_env import load_settings from onebusaway import OnebusawaySDK +from typing import Any # Load settings from .env file, if it exists. If not, we'll use the # Puget Sound server URL (which is also the default in the SDK) and @@ -36,7 +35,8 @@ print(" Routes:") for route_id in stop.route_ids: - route = reference_map[route_id] + # TODO: add type to route + route: Any = reference_map[route_id] # Get a string that looks like "D Line - Blue Ridge/Crown Hill - Ballard - Downtown Seattle" description = [route.null_safe_short_name, route.description] From dbbc76d7e13363b8a6ed9d0ce95b9ce5e9be835a Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Thu, 1 Aug 2024 07:55:24 +0300 Subject: [PATCH 14/19] chore: Add type hint to route variable in stops_for_location.py --- examples/stops_for_location.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/stops_for_location.py b/examples/stops_for_location.py index 3107024..a92c96e 100644 --- a/examples/stops_for_location.py +++ b/examples/stops_for_location.py @@ -1,9 +1,9 @@ +from typing import Any + from helpers.load_env import load_settings from onebusaway import OnebusawaySDK -from typing import Any - # Load settings from .env file, if it exists. If not, we'll use the # Puget Sound server URL (which is also the default in the SDK) and # the 'TEST' API key. From 71191c5aa7d260517746d9a08d1ebb586c11c74e Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Thu, 1 Aug 2024 13:06:05 +0300 Subject: [PATCH 15/19] chore: fornat code --- src/onebusaway/_base_client.py | 63 +++++++++++---------------------- src/onebusaway/_compat.py | 24 +++++-------- src/onebusaway/_files.py | 12 +++---- src/onebusaway/_response.py | 12 +++---- src/onebusaway/_types.py | 9 ++--- src/onebusaway/_utils/_proxy.py | 3 +- src/onebusaway/_utils/_utils.py | 18 ++++------ tests/test_deepcopy.py | 3 +- tests/test_response.py | 12 +++---- tests/test_utils/test_typing.py | 15 +++----- 10 files changed, 57 insertions(+), 114 deletions(-) diff --git a/src/onebusaway/_base_client.py b/src/onebusaway/_base_client.py index d17404e..ae4d8a0 100644 --- a/src/onebusaway/_base_client.py +++ b/src/onebusaway/_base_client.py @@ -124,16 +124,14 @@ def __init__( self, *, url: URL, - ) -> None: - ... + ) -> None: ... @overload def __init__( self, *, params: Query, - ) -> None: - ... + ) -> None: ... def __init__( self, @@ -166,8 +164,7 @@ def has_next_page(self) -> bool: return False return self.next_page_info() is not None - def next_page_info(self) -> Optional[PageInfo]: - ... + def next_page_info(self) -> Optional[PageInfo]: ... def _get_page_items(self) -> Iterable[_T]: # type: ignore[empty-body] ... @@ -903,8 +900,7 @@ def request( *, stream: Literal[True], stream_cls: Type[_StreamT], - ) -> _StreamT: - ... + ) -> _StreamT: ... @overload def request( @@ -914,8 +910,7 @@ def request( remaining_retries: Optional[int] = None, *, stream: Literal[False] = False, - ) -> ResponseT: - ... + ) -> ResponseT: ... @overload def request( @@ -926,8 +921,7 @@ def request( *, stream: bool = False, stream_cls: Type[_StreamT] | None = None, - ) -> ResponseT | _StreamT: - ... + ) -> ResponseT | _StreamT: ... def request( self, @@ -1152,8 +1146,7 @@ def get( cast_to: Type[ResponseT], options: RequestOptions = {}, stream: Literal[False] = False, - ) -> ResponseT: - ... + ) -> ResponseT: ... @overload def get( @@ -1164,8 +1157,7 @@ def get( options: RequestOptions = {}, stream: Literal[True], stream_cls: type[_StreamT], - ) -> _StreamT: - ... + ) -> _StreamT: ... @overload def get( @@ -1176,8 +1168,7 @@ def get( options: RequestOptions = {}, stream: bool, stream_cls: type[_StreamT] | None = None, - ) -> ResponseT | _StreamT: - ... + ) -> ResponseT | _StreamT: ... def get( self, @@ -1203,8 +1194,7 @@ def post( options: RequestOptions = {}, files: RequestFiles | None = None, stream: Literal[False] = False, - ) -> ResponseT: - ... + ) -> ResponseT: ... @overload def post( @@ -1217,8 +1207,7 @@ def post( files: RequestFiles | None = None, stream: Literal[True], stream_cls: type[_StreamT], - ) -> _StreamT: - ... + ) -> _StreamT: ... @overload def post( @@ -1231,8 +1220,7 @@ def post( files: RequestFiles | None = None, stream: bool, stream_cls: type[_StreamT] | None = None, - ) -> ResponseT | _StreamT: - ... + ) -> ResponseT | _StreamT: ... def post( self, @@ -1465,8 +1453,7 @@ async def request( *, stream: Literal[False] = False, remaining_retries: Optional[int] = None, - ) -> ResponseT: - ... + ) -> ResponseT: ... @overload async def request( @@ -1477,8 +1464,7 @@ async def request( stream: Literal[True], stream_cls: type[_AsyncStreamT], remaining_retries: Optional[int] = None, - ) -> _AsyncStreamT: - ... + ) -> _AsyncStreamT: ... @overload async def request( @@ -1489,8 +1475,7 @@ async def request( stream: bool, stream_cls: type[_AsyncStreamT] | None = None, remaining_retries: Optional[int] = None, - ) -> ResponseT | _AsyncStreamT: - ... + ) -> ResponseT | _AsyncStreamT: ... async def request( self, @@ -1701,8 +1686,7 @@ async def get( cast_to: Type[ResponseT], options: RequestOptions = {}, stream: Literal[False] = False, - ) -> ResponseT: - ... + ) -> ResponseT: ... @overload async def get( @@ -1713,8 +1697,7 @@ async def get( options: RequestOptions = {}, stream: Literal[True], stream_cls: type[_AsyncStreamT], - ) -> _AsyncStreamT: - ... + ) -> _AsyncStreamT: ... @overload async def get( @@ -1725,8 +1708,7 @@ async def get( options: RequestOptions = {}, stream: bool, stream_cls: type[_AsyncStreamT] | None = None, - ) -> ResponseT | _AsyncStreamT: - ... + ) -> ResponseT | _AsyncStreamT: ... async def get( self, @@ -1750,8 +1732,7 @@ async def post( files: RequestFiles | None = None, options: RequestOptions = {}, stream: Literal[False] = False, - ) -> ResponseT: - ... + ) -> ResponseT: ... @overload async def post( @@ -1764,8 +1745,7 @@ async def post( options: RequestOptions = {}, stream: Literal[True], stream_cls: type[_AsyncStreamT], - ) -> _AsyncStreamT: - ... + ) -> _AsyncStreamT: ... @overload async def post( @@ -1778,8 +1758,7 @@ async def post( options: RequestOptions = {}, stream: bool, stream_cls: type[_AsyncStreamT] | None = None, - ) -> ResponseT | _AsyncStreamT: - ... + ) -> ResponseT | _AsyncStreamT: ... async def post( self, diff --git a/src/onebusaway/_compat.py b/src/onebusaway/_compat.py index c919b5a..7c6f91a 100644 --- a/src/onebusaway/_compat.py +++ b/src/onebusaway/_compat.py @@ -159,22 +159,19 @@ def model_parse(model: type[_ModelT], data: Any) -> _ModelT: # generic models if TYPE_CHECKING: - class GenericModel(pydantic.BaseModel): - ... + class GenericModel(pydantic.BaseModel): ... else: if PYDANTIC_V2: # there no longer needs to be a distinction in v2 but # we still have to create our own subclass to avoid # inconsistent MRO ordering errors - class GenericModel(pydantic.BaseModel): - ... + class GenericModel(pydantic.BaseModel): ... else: import pydantic.generics - class GenericModel(pydantic.generics.GenericModel, pydantic.BaseModel): - ... + class GenericModel(pydantic.generics.GenericModel, pydantic.BaseModel): ... # cached properties @@ -193,26 +190,21 @@ class typed_cached_property(Generic[_T]): func: Callable[[Any], _T] attrname: str | None - def __init__(self, func: Callable[[Any], _T]) -> None: - ... + def __init__(self, func: Callable[[Any], _T]) -> None: ... @overload - def __get__(self, instance: None, owner: type[Any] | None = None) -> Self: - ... + def __get__(self, instance: None, owner: type[Any] | None = None) -> Self: ... @overload - def __get__(self, instance: object, owner: type[Any] | None = None) -> _T: - ... + def __get__(self, instance: object, owner: type[Any] | None = None) -> _T: ... def __get__(self, instance: object, owner: type[Any] | None = None) -> _T | Self: raise NotImplementedError() - def __set_name__(self, owner: type[Any], name: str) -> None: - ... + def __set_name__(self, owner: type[Any], name: str) -> None: ... # __set__ is not defined at runtime, but @cached_property is designed to be settable - def __set__(self, instance: object, value: _T) -> None: - ... + def __set__(self, instance: object, value: _T) -> None: ... else: try: from functools import cached_property as cached_property diff --git a/src/onebusaway/_files.py b/src/onebusaway/_files.py index 0d2022a..715cc20 100644 --- a/src/onebusaway/_files.py +++ b/src/onebusaway/_files.py @@ -39,13 +39,11 @@ def assert_is_file_content(obj: object, *, key: str | None = None) -> None: @overload -def to_httpx_files(files: None) -> None: - ... +def to_httpx_files(files: None) -> None: ... @overload -def to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: - ... +def to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: ... def to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles | None: @@ -83,13 +81,11 @@ def _read_file_content(file: FileContent) -> HttpxFileContent: @overload -async def async_to_httpx_files(files: None) -> None: - ... +async def async_to_httpx_files(files: None) -> None: ... @overload -async def async_to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: - ... +async def async_to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: ... async def async_to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles | None: diff --git a/src/onebusaway/_response.py b/src/onebusaway/_response.py index 40d4fb2..e29a7d3 100644 --- a/src/onebusaway/_response.py +++ b/src/onebusaway/_response.py @@ -257,12 +257,10 @@ def _parse(self, *, to: type[_T] | None = None) -> R | _T: class APIResponse(BaseAPIResponse[R]): @overload - def parse(self, *, to: type[_T]) -> _T: - ... + def parse(self, *, to: type[_T]) -> _T: ... @overload - def parse(self) -> R: - ... + def parse(self) -> R: ... def parse(self, *, to: type[_T] | None = None) -> R | _T: """Returns the rich python representation of this response's data. @@ -361,12 +359,10 @@ def iter_lines(self) -> Iterator[str]: class AsyncAPIResponse(BaseAPIResponse[R]): @overload - async def parse(self, *, to: type[_T]) -> _T: - ... + async def parse(self, *, to: type[_T]) -> _T: ... @overload - async def parse(self) -> R: - ... + async def parse(self) -> R: ... async def parse(self, *, to: type[_T] | None = None) -> R | _T: """Returns the rich python representation of this response's data. diff --git a/src/onebusaway/_types.py b/src/onebusaway/_types.py index 66ec7fc..f554261 100644 --- a/src/onebusaway/_types.py +++ b/src/onebusaway/_types.py @@ -111,8 +111,7 @@ class NotGiven: For example: ```py - def get(timeout: Union[int, NotGiven, None] = NotGiven()) -> Response: - ... + def get(timeout: Union[int, NotGiven, None] = NotGiven()) -> Response: ... get(timeout=1) # 1s timeout @@ -162,16 +161,14 @@ def build( *, response: Response, data: object, - ) -> _T: - ... + ) -> _T: ... Headers = Mapping[str, Union[str, Omit]] class HeadersLikeProtocol(Protocol): - def get(self, __key: str) -> str | None: - ... + def get(self, __key: str) -> str | None: ... HeadersLike = Union[Headers, HeadersLikeProtocol] diff --git a/src/onebusaway/_utils/_proxy.py b/src/onebusaway/_utils/_proxy.py index c46a62a..ffd883e 100644 --- a/src/onebusaway/_utils/_proxy.py +++ b/src/onebusaway/_utils/_proxy.py @@ -59,5 +59,4 @@ def __as_proxied__(self) -> T: return cast(T, self) @abstractmethod - def __load__(self) -> T: - ... + def __load__(self) -> T: ... diff --git a/src/onebusaway/_utils/_utils.py b/src/onebusaway/_utils/_utils.py index 34797c2..2fc5a1c 100644 --- a/src/onebusaway/_utils/_utils.py +++ b/src/onebusaway/_utils/_utils.py @@ -211,20 +211,17 @@ def required_args(*variants: Sequence[str]) -> Callable[[CallableT], CallableT]: Example usage: ```py @overload - def foo(*, a: str) -> str: - ... + def foo(*, a: str) -> str: ... @overload - def foo(*, b: bool) -> str: - ... + def foo(*, b: bool) -> str: ... # This enforces the same constraints that a static type checker would # i.e. that either a or b must be passed to the function @required_args(["a"], ["b"]) - def foo(*, a: str | None = None, b: bool | None = None) -> str: - ... + def foo(*, a: str | None = None, b: bool | None = None) -> str: ... ``` """ @@ -286,18 +283,15 @@ def wrapper(*args: object, **kwargs: object) -> object: @overload -def strip_not_given(obj: None) -> None: - ... +def strip_not_given(obj: None) -> None: ... @overload -def strip_not_given(obj: Mapping[_K, _V | NotGiven]) -> dict[_K, _V]: - ... +def strip_not_given(obj: Mapping[_K, _V | NotGiven]) -> dict[_K, _V]: ... @overload -def strip_not_given(obj: object) -> object: - ... +def strip_not_given(obj: object) -> object: ... def strip_not_given(obj: object | None) -> object: diff --git a/tests/test_deepcopy.py b/tests/test_deepcopy.py index 519c9b1..5da235a 100644 --- a/tests/test_deepcopy.py +++ b/tests/test_deepcopy.py @@ -41,8 +41,7 @@ def test_nested_list() -> None: assert_different_identities(obj1[1], obj2[1]) -class MyObject: - ... +class MyObject: ... def test_ignores_other_types() -> None: diff --git a/tests/test_response.py b/tests/test_response.py index 9e02d05..df94f16 100644 --- a/tests/test_response.py +++ b/tests/test_response.py @@ -19,16 +19,13 @@ from onebusaway._base_client import FinalRequestOptions -class ConcreteBaseAPIResponse(APIResponse[bytes]): - ... +class ConcreteBaseAPIResponse(APIResponse[bytes]): ... -class ConcreteAPIResponse(APIResponse[List[str]]): - ... +class ConcreteAPIResponse(APIResponse[List[str]]): ... -class ConcreteAsyncAPIResponse(APIResponse[httpx.Response]): - ... +class ConcreteAsyncAPIResponse(APIResponse[httpx.Response]): ... def test_extract_response_type_direct_classes() -> None: @@ -56,8 +53,7 @@ def test_extract_response_type_binary_response() -> None: assert extract_response_type(AsyncBinaryAPIResponse) == bytes -class PydanticModel(pydantic.BaseModel): - ... +class PydanticModel(pydantic.BaseModel): ... def test_response_parse_mismatched_basemodel(client: OnebusawaySDK) -> None: diff --git a/tests/test_utils/test_typing.py b/tests/test_utils/test_typing.py index c6438ff..1f6e80a 100644 --- a/tests/test_utils/test_typing.py +++ b/tests/test_utils/test_typing.py @@ -9,24 +9,19 @@ _T3 = TypeVar("_T3") -class BaseGeneric(Generic[_T]): - ... +class BaseGeneric(Generic[_T]): ... -class SubclassGeneric(BaseGeneric[_T]): - ... +class SubclassGeneric(BaseGeneric[_T]): ... -class BaseGenericMultipleTypeArgs(Generic[_T, _T2, _T3]): - ... +class BaseGenericMultipleTypeArgs(Generic[_T, _T2, _T3]): ... -class SubclassGenericMultipleTypeArgs(BaseGenericMultipleTypeArgs[_T, _T2, _T3]): - ... +class SubclassGenericMultipleTypeArgs(BaseGenericMultipleTypeArgs[_T, _T2, _T3]): ... -class SubclassDifferentOrderGenericMultipleTypeArgs(BaseGenericMultipleTypeArgs[_T2, _T, _T3]): - ... +class SubclassDifferentOrderGenericMultipleTypeArgs(BaseGenericMultipleTypeArgs[_T2, _T, _T3]): ... def test_extract_type_var() -> None: From 7ae6416618afee7a51193f85fd1bc2095b502426 Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Thu, 1 Aug 2024 13:06:34 +0300 Subject: [PATCH 16/19] chore: Fix typo in stops_for_location.py --- examples/stops_for_location.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/stops_for_location.py b/examples/stops_for_location.py index 998e48b..dbd53eb 100644 --- a/examples/stops_for_location.py +++ b/examples/stops_for_location.py @@ -4,9 +4,7 @@ from onebusaway import OnebusawaySDK -from onebusaway import OnebusawaySDK - -# Load settings from .env file, if it exists. If not, we'll use the +# Load settings from .en`v file, if it exists. If not, we'll use the # Puget Sound server URL (which is also the default in the SDK) and # the 'TEST' API key. settings = load_settings( From 3ff6d559611d5ae4f0e90a06179bf20a7b0be410 Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Thu, 1 Aug 2024 14:44:01 +0300 Subject: [PATCH 17/19] chore: code format --- src/onebusaway/_base_client.py | 63 ++++++++++++++++++++++----------- src/onebusaway/_compat.py | 24 ++++++++----- src/onebusaway/_files.py | 12 ++++--- src/onebusaway/_response.py | 12 ++++--- src/onebusaway/_types.py | 9 +++-- src/onebusaway/_utils/_proxy.py | 3 +- src/onebusaway/_utils/_utils.py | 18 ++++++---- tests/test_deepcopy.py | 3 +- tests/test_response.py | 12 ++++--- tests/test_utils/test_typing.py | 15 +++++--- 10 files changed, 114 insertions(+), 57 deletions(-) diff --git a/src/onebusaway/_base_client.py b/src/onebusaway/_base_client.py index ae4d8a0..d17404e 100644 --- a/src/onebusaway/_base_client.py +++ b/src/onebusaway/_base_client.py @@ -124,14 +124,16 @@ def __init__( self, *, url: URL, - ) -> None: ... + ) -> None: + ... @overload def __init__( self, *, params: Query, - ) -> None: ... + ) -> None: + ... def __init__( self, @@ -164,7 +166,8 @@ def has_next_page(self) -> bool: return False return self.next_page_info() is not None - def next_page_info(self) -> Optional[PageInfo]: ... + def next_page_info(self) -> Optional[PageInfo]: + ... def _get_page_items(self) -> Iterable[_T]: # type: ignore[empty-body] ... @@ -900,7 +903,8 @@ def request( *, stream: Literal[True], stream_cls: Type[_StreamT], - ) -> _StreamT: ... + ) -> _StreamT: + ... @overload def request( @@ -910,7 +914,8 @@ def request( remaining_retries: Optional[int] = None, *, stream: Literal[False] = False, - ) -> ResponseT: ... + ) -> ResponseT: + ... @overload def request( @@ -921,7 +926,8 @@ def request( *, stream: bool = False, stream_cls: Type[_StreamT] | None = None, - ) -> ResponseT | _StreamT: ... + ) -> ResponseT | _StreamT: + ... def request( self, @@ -1146,7 +1152,8 @@ def get( cast_to: Type[ResponseT], options: RequestOptions = {}, stream: Literal[False] = False, - ) -> ResponseT: ... + ) -> ResponseT: + ... @overload def get( @@ -1157,7 +1164,8 @@ def get( options: RequestOptions = {}, stream: Literal[True], stream_cls: type[_StreamT], - ) -> _StreamT: ... + ) -> _StreamT: + ... @overload def get( @@ -1168,7 +1176,8 @@ def get( options: RequestOptions = {}, stream: bool, stream_cls: type[_StreamT] | None = None, - ) -> ResponseT | _StreamT: ... + ) -> ResponseT | _StreamT: + ... def get( self, @@ -1194,7 +1203,8 @@ def post( options: RequestOptions = {}, files: RequestFiles | None = None, stream: Literal[False] = False, - ) -> ResponseT: ... + ) -> ResponseT: + ... @overload def post( @@ -1207,7 +1217,8 @@ def post( files: RequestFiles | None = None, stream: Literal[True], stream_cls: type[_StreamT], - ) -> _StreamT: ... + ) -> _StreamT: + ... @overload def post( @@ -1220,7 +1231,8 @@ def post( files: RequestFiles | None = None, stream: bool, stream_cls: type[_StreamT] | None = None, - ) -> ResponseT | _StreamT: ... + ) -> ResponseT | _StreamT: + ... def post( self, @@ -1453,7 +1465,8 @@ async def request( *, stream: Literal[False] = False, remaining_retries: Optional[int] = None, - ) -> ResponseT: ... + ) -> ResponseT: + ... @overload async def request( @@ -1464,7 +1477,8 @@ async def request( stream: Literal[True], stream_cls: type[_AsyncStreamT], remaining_retries: Optional[int] = None, - ) -> _AsyncStreamT: ... + ) -> _AsyncStreamT: + ... @overload async def request( @@ -1475,7 +1489,8 @@ async def request( stream: bool, stream_cls: type[_AsyncStreamT] | None = None, remaining_retries: Optional[int] = None, - ) -> ResponseT | _AsyncStreamT: ... + ) -> ResponseT | _AsyncStreamT: + ... async def request( self, @@ -1686,7 +1701,8 @@ async def get( cast_to: Type[ResponseT], options: RequestOptions = {}, stream: Literal[False] = False, - ) -> ResponseT: ... + ) -> ResponseT: + ... @overload async def get( @@ -1697,7 +1713,8 @@ async def get( options: RequestOptions = {}, stream: Literal[True], stream_cls: type[_AsyncStreamT], - ) -> _AsyncStreamT: ... + ) -> _AsyncStreamT: + ... @overload async def get( @@ -1708,7 +1725,8 @@ async def get( options: RequestOptions = {}, stream: bool, stream_cls: type[_AsyncStreamT] | None = None, - ) -> ResponseT | _AsyncStreamT: ... + ) -> ResponseT | _AsyncStreamT: + ... async def get( self, @@ -1732,7 +1750,8 @@ async def post( files: RequestFiles | None = None, options: RequestOptions = {}, stream: Literal[False] = False, - ) -> ResponseT: ... + ) -> ResponseT: + ... @overload async def post( @@ -1745,7 +1764,8 @@ async def post( options: RequestOptions = {}, stream: Literal[True], stream_cls: type[_AsyncStreamT], - ) -> _AsyncStreamT: ... + ) -> _AsyncStreamT: + ... @overload async def post( @@ -1758,7 +1778,8 @@ async def post( options: RequestOptions = {}, stream: bool, stream_cls: type[_AsyncStreamT] | None = None, - ) -> ResponseT | _AsyncStreamT: ... + ) -> ResponseT | _AsyncStreamT: + ... async def post( self, diff --git a/src/onebusaway/_compat.py b/src/onebusaway/_compat.py index 7c6f91a..c919b5a 100644 --- a/src/onebusaway/_compat.py +++ b/src/onebusaway/_compat.py @@ -159,19 +159,22 @@ def model_parse(model: type[_ModelT], data: Any) -> _ModelT: # generic models if TYPE_CHECKING: - class GenericModel(pydantic.BaseModel): ... + class GenericModel(pydantic.BaseModel): + ... else: if PYDANTIC_V2: # there no longer needs to be a distinction in v2 but # we still have to create our own subclass to avoid # inconsistent MRO ordering errors - class GenericModel(pydantic.BaseModel): ... + class GenericModel(pydantic.BaseModel): + ... else: import pydantic.generics - class GenericModel(pydantic.generics.GenericModel, pydantic.BaseModel): ... + class GenericModel(pydantic.generics.GenericModel, pydantic.BaseModel): + ... # cached properties @@ -190,21 +193,26 @@ class typed_cached_property(Generic[_T]): func: Callable[[Any], _T] attrname: str | None - def __init__(self, func: Callable[[Any], _T]) -> None: ... + def __init__(self, func: Callable[[Any], _T]) -> None: + ... @overload - def __get__(self, instance: None, owner: type[Any] | None = None) -> Self: ... + def __get__(self, instance: None, owner: type[Any] | None = None) -> Self: + ... @overload - def __get__(self, instance: object, owner: type[Any] | None = None) -> _T: ... + def __get__(self, instance: object, owner: type[Any] | None = None) -> _T: + ... def __get__(self, instance: object, owner: type[Any] | None = None) -> _T | Self: raise NotImplementedError() - def __set_name__(self, owner: type[Any], name: str) -> None: ... + def __set_name__(self, owner: type[Any], name: str) -> None: + ... # __set__ is not defined at runtime, but @cached_property is designed to be settable - def __set__(self, instance: object, value: _T) -> None: ... + def __set__(self, instance: object, value: _T) -> None: + ... else: try: from functools import cached_property as cached_property diff --git a/src/onebusaway/_files.py b/src/onebusaway/_files.py index 715cc20..0d2022a 100644 --- a/src/onebusaway/_files.py +++ b/src/onebusaway/_files.py @@ -39,11 +39,13 @@ def assert_is_file_content(obj: object, *, key: str | None = None) -> None: @overload -def to_httpx_files(files: None) -> None: ... +def to_httpx_files(files: None) -> None: + ... @overload -def to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: ... +def to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: + ... def to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles | None: @@ -81,11 +83,13 @@ def _read_file_content(file: FileContent) -> HttpxFileContent: @overload -async def async_to_httpx_files(files: None) -> None: ... +async def async_to_httpx_files(files: None) -> None: + ... @overload -async def async_to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: ... +async def async_to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: + ... async def async_to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles | None: diff --git a/src/onebusaway/_response.py b/src/onebusaway/_response.py index e29a7d3..40d4fb2 100644 --- a/src/onebusaway/_response.py +++ b/src/onebusaway/_response.py @@ -257,10 +257,12 @@ def _parse(self, *, to: type[_T] | None = None) -> R | _T: class APIResponse(BaseAPIResponse[R]): @overload - def parse(self, *, to: type[_T]) -> _T: ... + def parse(self, *, to: type[_T]) -> _T: + ... @overload - def parse(self) -> R: ... + def parse(self) -> R: + ... def parse(self, *, to: type[_T] | None = None) -> R | _T: """Returns the rich python representation of this response's data. @@ -359,10 +361,12 @@ def iter_lines(self) -> Iterator[str]: class AsyncAPIResponse(BaseAPIResponse[R]): @overload - async def parse(self, *, to: type[_T]) -> _T: ... + async def parse(self, *, to: type[_T]) -> _T: + ... @overload - async def parse(self) -> R: ... + async def parse(self) -> R: + ... async def parse(self, *, to: type[_T] | None = None) -> R | _T: """Returns the rich python representation of this response's data. diff --git a/src/onebusaway/_types.py b/src/onebusaway/_types.py index f554261..66ec7fc 100644 --- a/src/onebusaway/_types.py +++ b/src/onebusaway/_types.py @@ -111,7 +111,8 @@ class NotGiven: For example: ```py - def get(timeout: Union[int, NotGiven, None] = NotGiven()) -> Response: ... + def get(timeout: Union[int, NotGiven, None] = NotGiven()) -> Response: + ... get(timeout=1) # 1s timeout @@ -161,14 +162,16 @@ def build( *, response: Response, data: object, - ) -> _T: ... + ) -> _T: + ... Headers = Mapping[str, Union[str, Omit]] class HeadersLikeProtocol(Protocol): - def get(self, __key: str) -> str | None: ... + def get(self, __key: str) -> str | None: + ... HeadersLike = Union[Headers, HeadersLikeProtocol] diff --git a/src/onebusaway/_utils/_proxy.py b/src/onebusaway/_utils/_proxy.py index ffd883e..c46a62a 100644 --- a/src/onebusaway/_utils/_proxy.py +++ b/src/onebusaway/_utils/_proxy.py @@ -59,4 +59,5 @@ def __as_proxied__(self) -> T: return cast(T, self) @abstractmethod - def __load__(self) -> T: ... + def __load__(self) -> T: + ... diff --git a/src/onebusaway/_utils/_utils.py b/src/onebusaway/_utils/_utils.py index 2fc5a1c..34797c2 100644 --- a/src/onebusaway/_utils/_utils.py +++ b/src/onebusaway/_utils/_utils.py @@ -211,17 +211,20 @@ def required_args(*variants: Sequence[str]) -> Callable[[CallableT], CallableT]: Example usage: ```py @overload - def foo(*, a: str) -> str: ... + def foo(*, a: str) -> str: + ... @overload - def foo(*, b: bool) -> str: ... + def foo(*, b: bool) -> str: + ... # This enforces the same constraints that a static type checker would # i.e. that either a or b must be passed to the function @required_args(["a"], ["b"]) - def foo(*, a: str | None = None, b: bool | None = None) -> str: ... + def foo(*, a: str | None = None, b: bool | None = None) -> str: + ... ``` """ @@ -283,15 +286,18 @@ def wrapper(*args: object, **kwargs: object) -> object: @overload -def strip_not_given(obj: None) -> None: ... +def strip_not_given(obj: None) -> None: + ... @overload -def strip_not_given(obj: Mapping[_K, _V | NotGiven]) -> dict[_K, _V]: ... +def strip_not_given(obj: Mapping[_K, _V | NotGiven]) -> dict[_K, _V]: + ... @overload -def strip_not_given(obj: object) -> object: ... +def strip_not_given(obj: object) -> object: + ... def strip_not_given(obj: object | None) -> object: diff --git a/tests/test_deepcopy.py b/tests/test_deepcopy.py index 5da235a..519c9b1 100644 --- a/tests/test_deepcopy.py +++ b/tests/test_deepcopy.py @@ -41,7 +41,8 @@ def test_nested_list() -> None: assert_different_identities(obj1[1], obj2[1]) -class MyObject: ... +class MyObject: + ... def test_ignores_other_types() -> None: diff --git a/tests/test_response.py b/tests/test_response.py index df94f16..9e02d05 100644 --- a/tests/test_response.py +++ b/tests/test_response.py @@ -19,13 +19,16 @@ from onebusaway._base_client import FinalRequestOptions -class ConcreteBaseAPIResponse(APIResponse[bytes]): ... +class ConcreteBaseAPIResponse(APIResponse[bytes]): + ... -class ConcreteAPIResponse(APIResponse[List[str]]): ... +class ConcreteAPIResponse(APIResponse[List[str]]): + ... -class ConcreteAsyncAPIResponse(APIResponse[httpx.Response]): ... +class ConcreteAsyncAPIResponse(APIResponse[httpx.Response]): + ... def test_extract_response_type_direct_classes() -> None: @@ -53,7 +56,8 @@ def test_extract_response_type_binary_response() -> None: assert extract_response_type(AsyncBinaryAPIResponse) == bytes -class PydanticModel(pydantic.BaseModel): ... +class PydanticModel(pydantic.BaseModel): + ... def test_response_parse_mismatched_basemodel(client: OnebusawaySDK) -> None: diff --git a/tests/test_utils/test_typing.py b/tests/test_utils/test_typing.py index 1f6e80a..c6438ff 100644 --- a/tests/test_utils/test_typing.py +++ b/tests/test_utils/test_typing.py @@ -9,19 +9,24 @@ _T3 = TypeVar("_T3") -class BaseGeneric(Generic[_T]): ... +class BaseGeneric(Generic[_T]): + ... -class SubclassGeneric(BaseGeneric[_T]): ... +class SubclassGeneric(BaseGeneric[_T]): + ... -class BaseGenericMultipleTypeArgs(Generic[_T, _T2, _T3]): ... +class BaseGenericMultipleTypeArgs(Generic[_T, _T2, _T3]): + ... -class SubclassGenericMultipleTypeArgs(BaseGenericMultipleTypeArgs[_T, _T2, _T3]): ... +class SubclassGenericMultipleTypeArgs(BaseGenericMultipleTypeArgs[_T, _T2, _T3]): + ... -class SubclassDifferentOrderGenericMultipleTypeArgs(BaseGenericMultipleTypeArgs[_T2, _T, _T3]): ... +class SubclassDifferentOrderGenericMultipleTypeArgs(BaseGenericMultipleTypeArgs[_T2, _T, _T3]): + ... def test_extract_type_var() -> None: From 0edb28938def397326d428dde2af8754fa98c156 Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Thu, 1 Aug 2024 14:44:09 +0300 Subject: [PATCH 18/19] chore: Add helpers module with load_env and load_settings functions --- examples/helpers/__init__.py | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 examples/helpers/__init__.py diff --git a/examples/helpers/__init__.py b/examples/helpers/__init__.py new file mode 100644 index 0000000..76b6e5e --- /dev/null +++ b/examples/helpers/__init__.py @@ -0,0 +1,3 @@ +from .load_env import load_env, load_settings + +__all__ = ["load_settings", "load_env"] From 4170e67ebf01253afccd144683b170d196ab3dd2 Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Thu, 1 Aug 2024 14:44:13 +0300 Subject: [PATCH 19/19] Refactor stops_for_location.py for improved readability and maintainability --- examples/stops_for_location.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/stops_for_location.py b/examples/stops_for_location.py index dbd53eb..ea9b153 100644 --- a/examples/stops_for_location.py +++ b/examples/stops_for_location.py @@ -4,7 +4,7 @@ from onebusaway import OnebusawaySDK -# Load settings from .en`v file, if it exists. If not, we'll use the +# Load settings from .env file, if it exists. If not, we'll use the # Puget Sound server URL (which is also the default in the SDK) and # the 'TEST' API key. settings = load_settings( @@ -27,8 +27,8 @@ # make it easy to look up routes by ID. reference_map = {} -for route in references.routes: - reference_map[route.id] = route +for ref_route in references.routes: + reference_map[ref_route.id] = ref_route for stop in stops: print(f"{stop.name} ({stop.lat}, {stop.lon})") @@ -39,7 +39,7 @@ route: Any = reference_map[route_id] # Get a string that looks like "D Line - Blue Ridge/Crown Hill - Ballard - Downtown Seattle" - description = [route.null_safe_short_name, route.description] - description = [e for e in description if e] - description = " - ".join(description) - print(f" {description}") + description_list = [route.null_safe_short_name, route.description] + description_list = [e for e in description_list if e] + description_str = " - ".join(description_list) + print(f" {description_str}")