예제 #1
0
    def get_siri_vm_data_feed(
        self,
        params: Optional[SIRIVMParams] = None,
    ) -> Union[bytes, APIError]:
        """
        Returns a SIRI-VM byte string representation of vehicles currently providing an
        Automatic Vehicle Locations in BODS.

        Args:
            bounding_box: Limit vehicles to those within the BoundingBox.
            operator_refs: Limit vehicles to only certain operators.
            line_ref: Limit vehicles to those on a certain line.
            producer_ref: Limit vehicles to created by a certain producer.
            origin_ref: Limit vehicles to those with a certain origin.
            destinaton_ref: Limit vehicles to those heading for a certain destination.
        """

        if params is None:
            params = SIRIVMParams()

        params = json.loads(params.json(by_alias=True, exclude_none=True))
        response = self._make_request(self.siri_vm_endpoint, params=params)
        if response.status_code == HTTPStatus.OK:
            return response.content
        return APIError(status_code=response.status_code,
                        reason=response.content)
예제 #2
0
    def get_gtfs_rt_data_feed(
            self,
            params: Optional[GTFSRTParams] = None
    ) -> Union[FeedMessage, APIError]:
        """
        Returns a FeedMessage of vehicles currently providing Automatic Vehicle
        Locations in BODS.

        Args:
            bounding_box: Limit vehicles to those within the BoundingBox.
            route_id: Limit vehicles to those with this route id.
            start_time_after: Limit vehicles to those with start time after this
            datetime.
            start_time_before: Limit vehicles to with the start time before this
            datetime.
        """
        if params is None:
            params = GTFSRTParams()

        params = json.loads(params.json(by_alias=True, exclude_none=True))
        response = self._make_request(self.gtfs_rt_endpoint, params=params)
        if response.status_code == HTTPStatus.OK:
            message = FeedMessage()
            message.ParseFromString(response.content)
            return message
        return APIError(status_code=response.status_code,
                        reason=response.content)
예제 #3
0
    def get_fares_datasets(
        self,
        params: Optional[FaresParams] = None,
    ) -> Union[FaresResponse, APIError]:
        """
        Fetches the fares data sets currently available in the BODS database.

        This only returns meta data about a fares data set including a url to
        the actual data set.

        Args:
            nocs: A list of National Operator Codes.
            status: Limit data sets with a specific status of published, error, expired,
            inactive.
            bounding_box: Limit data sets to those within the BoundingBox.
            limit: Maximum number of results to return per page.
            offset: Number to offset results by.

        """
        if params is None:
            params = FaresParams()

        params = json.loads(params.json(by_alias=True, exclude_none=True))
        response = self._make_request(self.fares_endpoint, params=params)
        if response.status_code == 200:
            return FaresResponse(**response.json())
        return APIError(status_code=response.status_code,
                        reason=response.content)
예제 #4
0
 def get_siri_vm_from_archive(self) -> Union[bytes, APIError]:
     """
     Returns a SIRI-VM byte string representation of vehicles currently providing an
     Automatic Vehicle Location from the bulk download file in BODS.
     """
     response = self._make_request(self.siri_vm_zip_endpoint)
     if response.status_code == HTTPStatus.OK:
         with zipfile.ZipFile(io.BytesIO(response.content)) as zf:
             with zf.open("siri.xml") as f:
                 return f.read()
     return APIError(status_code=response.status_code,
                     reason=response.content)
예제 #5
0
 def get_fares_dataset(self,
                       dataset_id: int) -> Union[FaresResponse, APIError]:
     """
     Fetches a single fares data sets currently available in the BODS database.
     """
     url = self.fares_endpoint + f"{dataset_id}/"
     response = self._make_request(url)
     if response.status_code == 200:
         results = [Fares(**response.json())]
         return FaresResponse(count=1, results=results)
     return APIError(status_code=response.status_code,
                     reason=response.content)
예제 #6
0
 def get_gtfs_rt_from_archive(self) -> Union[FeedMessage, APIError]:
     """
     Returns a FeedMessage of vehicles currently providing Automatic Vehicle
     Locations bulk download URL in BODS.
     """
     response = self._make_request(self.gtfs_rt_zip_endpoint)
     if response.status_code == HTTPStatus.OK:
         with zipfile.ZipFile(io.BytesIO(response.content)) as zf:
             with zf.open("gtfsrt.bin") as f:
                 message = FeedMessage()
                 message.ParseFromString(f.read())
                 return message
     return APIError(status_code=response.status_code,
                     reason=response.content)
예제 #7
0
    def get_siri_vm_data_feed_by_id(self,
                                    feed_id: int) -> Union[bytes, APIError]:
        """
        Returns a SIRI-VM byte string representation of vehicles currently providing an
        Automatic Vehicle Locations in BODS.

        Args:
            bounding_box: Limit vehicles to those within the BoundingBox.
            operator_refs: Limit vehicles to only certain operators.
            line_ref: Limit vehicles to those on a certain line.
            producer_ref: Limit vehicles to created by a certain producer.
            origin_ref: Limit vehicles to those with a certain origin.
            destinaton_ref: Limit vehicles to those heading for a certain destination.
        """
        url = self.siri_vm_endpoint + f"{feed_id}/"
        response = self._make_request(url)
        if response.status_code == HTTPStatus.OK:
            return response.content
        return APIError(status_code=response.status_code,
                        reason=response.content)
예제 #8
0
    def get_timetable_dataset(
            self, dataset_id: int) -> Union[TimetableResponse, APIError]:
        """
        Get a single timetable dataset.

        Args:
            dataset_id: The id of the timetable data set.

        Returns:
            timetable: A Timetable object with the data set details.
        """

        url = self.timetable_endpoint + f"{dataset_id}/"
        response = self._make_request(url)

        if response.status_code == HTTPStatus.OK:
            results = [Timetable(**response.json())]
            return TimetableResponse(count=1, results=results)

        return APIError(status_code=response.status_code,
                        reason=response.content)
예제 #9
0
    def get_timetable_datasets(
        self,
        params: Optional[TimetableParams] = None
    ) -> Union[TimetableResponse, APIError]:
        """
        Fetches the data sets currently available in the BODS database.

        This only returns meta data about a data set including a url to
        the actual data set.

        Args:
            admin_areas: A list of NPTG ATCO Area codes.
            nocs: A list of National Operator Codes.
            status: Limit data sets with a specific status of published, error, expired,
            inactive.
            search: Return data sets with search term in the data set name, data set.
            description, organisation name, or admin name.
            modified_date: Get data sets created/updated after this date.
            start_date_start: Limit data sets to those with start dates after this date.
            start_date_end: Limit date sets to those with start dates before this date.
            end_date_start: Get data sets with end dates after this date.
            end_date_end: Get data sets with end dates before this date.
            limit: Maximum number of results to return per page.
            offset: Number to offset results by.
        """

        if params is None:
            params = TimetableParams()

        params = json.loads(params.json(by_alias=True, exclude_none=True))
        response = self._make_request(self.timetable_endpoint, params=params)

        if response.status_code == HTTPStatus.OK:
            return TimetableResponse(**response.json())
        return APIError(status_code=response.status_code,
                        reason=response.content)