From 65349e14b2f4f473f4c404b71c28fbaa4eecf936 Mon Sep 17 00:00:00 2001 From: profitroll Date: Wed, 5 Oct 2022 13:50:26 +0200 Subject: [PATCH] Board methods WIP --- pyrmv/classes/Board.py | 2 + pyrmv/enums/board_type.py | 44 ++++++++++++++++++++++ pyrmv/methods/board_arrival.py | 64 +++++++++++++++++++++++++++++++- pyrmv/methods/board_departure.py | 64 +++++++++++++++++++++++++++++++- pyrmv/raw/board_arrival.py | 8 +++- pyrmv/raw/board_departure.py | 8 +++- 6 files changed, 184 insertions(+), 6 deletions(-) create mode 100644 pyrmv/classes/Board.py create mode 100644 pyrmv/enums/board_type.py diff --git a/pyrmv/classes/Board.py b/pyrmv/classes/Board.py new file mode 100644 index 0000000..f263376 --- /dev/null +++ b/pyrmv/classes/Board.py @@ -0,0 +1,2 @@ +class Board(): + pass \ No newline at end of file diff --git a/pyrmv/enums/board_type.py b/pyrmv/enums/board_type.py new file mode 100644 index 0000000..426da65 --- /dev/null +++ b/pyrmv/enums/board_type.py @@ -0,0 +1,44 @@ +from enum import auto +from .auto_name import AutoName + +class BoardArrivalType(AutoName): + """Enumeration used to declare types of arrival board. + + * ARR - Arrival board as configured in HAFAS + * ARR_EQUIVS - Arrival board with all journeys at any masts and equivalent stops + * ARR_MAST - Arrival board at mast + * ARR_STATION - Arrival board with all journeys at any masts of the requested station + """ + + ARR = auto() + "Arrival board as configured in HAFAS" + + ARR_EQUIVS = auto() + "Arrival board with all journeys at any masts and equivalent stops" + + ARR_MAST = auto() + "Arrival board at mast" + + ARR_STATION = auto() + "Arrival board with all journeys at any masts of the requested station" + +class BoardDepartureType(AutoName): + """Enumeration used to declare types of departure board. + + * DEP - Departure board as configured in HAFAS + * DEP_EQUIVS - Departure board with all journeys at any masts and equivalent stops + * DEP_MAST - Departure board at mast + * DEP_STATION - Departure board with all journeys at any masts of the requested station + """ + + DEP = auto() + "Departure board as configured in HAFAS" + + DEP_EQUIVS = auto() + "Departure board with all journeys at any masts and equivalent stops" + + DEP_MAST = auto() + "Departure board at mast" + + DEP_STATION = auto() + "Departure board with all journeys at any masts of the requested station" \ No newline at end of file diff --git a/pyrmv/methods/board_arrival.py b/pyrmv/methods/board_arrival.py index 2506956..492b488 100644 --- a/pyrmv/methods/board_arrival.py +++ b/pyrmv/methods/board_arrival.py @@ -1,5 +1,65 @@ +from datetime import datetime, timedelta +from typing import Union +from pyrmv.classes.Board import Board +from pyrmv.classes.Stop import Stop, StopTrip +from pyrmv.enums.board_type import BoardArrivalType from pyrmv.errors.not_ready import NotReadyYetError +from pyrmv.raw import board_arrival as raw_board_arrival +from pyrmv.utility.find_exception import find_exception +def board_arrival( + + access_id: str, + id: str = None, + id_ext: str = None, + direction: Union[str, Stop, StopTrip] = None, + date: Union[str, datetime] = None, + time: Union[str, datetime] = None, + duration: Union[int, timedelta] = 60, + journeys_max: int = -1, + operators: Union[str, list] = None, + lines: Union[str, list] = None, + passlist: bool = False, + board_type: Union[BoardArrivalType.ARR, BoardArrivalType.ARR_EQUIVS, BoardArrivalType.ARR_MAST, BoardArrivalType.ARR_STATION] = BoardArrivalType.ARR, + ) -> Board: + """Method returns a board with arriving transport. -def board_arrival(): - raise NotReadyYetError() \ No newline at end of file + More detailed request is available as `raw.board_arrival()`, however returns `dict` instead of `Board`. + + ### Args: + * access_id (`str`): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html). + * id (`str`, **optional**): Specifies the station/stop ID. Such ID can be retrieved from stop_by_name() or stop_by_coords(). Defaults to `None`. + * id_ext (`str`, **optional**): Deprecated. Please use `id` as it supports external IDs. Specifies the external station/stop ID. Such ID can be retrieved from stop_by_name() or stop_by_coords(). Defaults to `None`. + * direction (`Union[str, Stop, StopTrip]`, **optional**): If only vehicles departing or arriving from a certain direction shall be returned, specify the direction by giving the station/stop ID of the last stop on the journey or the Stop object itself. Defaults to `None`. + * date (`Union[str, datetime]`, **optional**): Sets the start date for which the departures shall be retrieved. Represented in the format YYYY-MM-DD or as a datetime object. By default the current server date is used. Defaults to `None`. + * time (`Union[str, datetime]`, **optional**): Sets the start time for which the departures shall be retrieved. Represented in the format hh:mm[:ss] in 24h nomenclature or as a datetime object. Seconds will be ignored for requests. By default the current server time is used. Defaults to `None`. + * duration (`Union[int, timedelta]`, **optional**): Set the interval size in minutes. Can also be provided as a timedelta. Defaults to `60`. + * journeys_max (`int`, **optional**): Maximum number of journeys to be returned. If no value is defined or -1, all departing/arriving services within the duration sized period are returned. Defaults to `-1`. + * operators (`Union[str, list]`, **optional**): Only journeys provided by the given operators are part of the result. To filter multiple operators, separate the codes by comma or provide a list. If the operator should not be part of the be trip, negate it by putting ! in front of it. Example: Filter for operator A and B: `operators=[A,B]`. Defaults to `None`. + * lines (`Union[str, list]`, **optional**): Only journeys running the given line are part of the result. To filter multiple lines, provide a list or separate the codes by comma or provide a list. If the line should not be part of the be trip, negate it by putting ! in front of it. Defaults to `None`. + * passlist (`bool`, **optional**): Include a list of all passed waystops. Defaults to `False`. + * board_type (`Union[BoardArrivalType.ARR, BoardArrivalType.ARR_EQUIVS, BoardArrivalType.ARR_MAST, BoardArrivalType.ARR_STATION]`, optional): Set the station arrival board type to be used. Defaults to `BoardArrivalType.ARR`. + + ### Returns: + * Board: Instance of Board object. + """ + + board_raw = raw_board_arrival( + accessId=access_id, + id=id, + extId=id_ext, + direction=direction, + date=date, + time=time, + duration=duration, + maxJourneys=journeys_max, + operators=operators, + lines=lines, + passlist=passlist, + boardType=board_type.code + ) + + find_exception(board_raw) + + raise NotReadyYetError() + # return Board(board_raw) \ No newline at end of file diff --git a/pyrmv/methods/board_departure.py b/pyrmv/methods/board_departure.py index 40f393e..7e04d60 100644 --- a/pyrmv/methods/board_departure.py +++ b/pyrmv/methods/board_departure.py @@ -1,5 +1,65 @@ +from datetime import datetime, timedelta +from typing import Union +from pyrmv.classes.Board import Board +from pyrmv.classes.Stop import Stop, StopTrip +from pyrmv.enums.board_type import BoardDepartureType from pyrmv.errors.not_ready import NotReadyYetError +from pyrmv.raw import board_departure as raw_board_departure +from pyrmv.utility.find_exception import find_exception +def board_departure( + + access_id: str, + id: str = None, + id_ext: str = None, + direction: Union[str, Stop, StopTrip] = None, + date: Union[str, datetime] = None, + time: Union[str, datetime] = None, + duration: Union[int, timedelta] = 60, + journeys_max: int = -1, + operators: Union[str, list] = None, + lines: Union[str, list] = None, + passlist: bool = False, + board_type: Union[BoardDepartureType.DEP, BoardDepartureType.DEP_EQUIVS, BoardDepartureType.DEP_MAST, BoardDepartureType.DEP_STATION] = BoardDepartureType.DEP, + ) -> Board: + """Method returns a board with departing transport. -def board_departure(): - raise NotReadyYetError() \ No newline at end of file + More detailed request is available as `raw.board_departure()`, however returns `dict` instead of `Board`. + + ### Args: + * access_id (`str`): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html). + * id (`str`, **optional**): Specifies the station/stop ID. Such ID can be retrieved from stop_by_name() or stop_by_coords(). Defaults to `None`. + * id_ext (`str`, **optional**): Deprecated. Please use `id` as it supports external IDs. Specifies the external station/stop ID. Such ID can be retrieved from stop_by_name() or stop_by_coords(). Defaults to `None`. + * direction (`Union[str, Stop, StopTrip]`, **optional**): If only vehicles departing or arriving from a certain direction shall be returned, specify the direction by giving the station/stop ID of the last stop on the journey or the Stop object itself. Defaults to `None`. + * date (`Union[str, datetime]`, **optional**): Sets the start date for which the departures shall be retrieved. Represented in the format YYYY-MM-DD or as a datetime object. By default the current server date is used. Defaults to `None`. + * time (`Union[str, datetime]`, **optional**): Sets the start time for which the departures shall be retrieved. Represented in the format hh:mm[:ss] in 24h nomenclature or as a datetime object. Seconds will be ignored for requests. By default the current server time is used. Defaults to `None`. + * duration (`Union[int, timedelta]`, **optional**): Set the interval size in minutes. Can also be provided as a timedelta. Defaults to `60`. + * journeys_max (`int`, **optional**): Maximum number of journeys to be returned. If no value is defined or -1, all departing/arriving services within the duration sized period are returned. Defaults to `-1`. + * operators (`Union[str, list]`, **optional**): Only journeys provided by the given operators are part of the result. To filter multiple operators, separate the codes by comma or provide a list. If the operator should not be part of the be trip, negate it by putting ! in front of it. Example: Filter for operator A and B: `operators=[A,B]`. Defaults to `None`. + * lines (`Union[str, list]`, **optional**): Only journeys running the given line are part of the result. To filter multiple lines, provide a list or separate the codes by comma or provide a list. If the line should not be part of the be trip, negate it by putting ! in front of it. Defaults to `None`. + * passlist (`bool`, **optional**): Include a list of all passed waystops. Defaults to `False`. + * board_type (`Union[BoardDepartureType.DEP, BoardDepartureType.DEP_EQUIVS, BoardDepartureType.DEP_MAST, BoardDepartureType.DEP_STATION]`, optional): Set the station departure board type to be used. Defaults to `BoardDepartureType.DEP`. + + ### Returns: + * Board: Instance of Board object. + """ + + board_raw = raw_board_departure( + accessId=access_id, + id=id, + extId=id_ext, + direction=direction, + date=date, + time=time, + duration=duration, + maxJourneys=journeys_max, + operators=operators, + lines=lines, + passlist=passlist, + boardType=board_type.code + ) + + find_exception(board_raw) + + raise NotReadyYetError() + # return Board(board_raw) \ No newline at end of file diff --git a/pyrmv/raw/board_arrival.py b/pyrmv/raw/board_arrival.py index c5db4d2..bf5840c 100644 --- a/pyrmv/raw/board_arrival.py +++ b/pyrmv/raw/board_arrival.py @@ -1,5 +1,5 @@ from requests import get -from datetime import datetime +from datetime import datetime, timedelta from typing import Union from xmltodict import parse as xmlparse @@ -78,6 +78,12 @@ def board_arrival(accessId: str, payload[str(var)] = val.strftime("%H:%M") else: payload[str(var)] = val + elif str(var) == "duration": + if val != None: + if isinstance(val, timedelta): + payload[str(var)] = val.minutes + else: + payload[str(var)] = val elif str(var) == "boardType": if val != None: payload["type"] = val diff --git a/pyrmv/raw/board_departure.py b/pyrmv/raw/board_departure.py index aa91ef7..38cc901 100644 --- a/pyrmv/raw/board_departure.py +++ b/pyrmv/raw/board_departure.py @@ -1,5 +1,5 @@ -from datetime import datetime from requests import get +from datetime import datetime, timedelta from typing import Union from xmltodict import parse as xmlparse @@ -79,6 +79,12 @@ def board_departure(accessId: str, payload[str(var)] = val.strftime("%H:%M") else: payload[str(var)] = val + elif str(var) == "duration": + if val != None: + if isinstance(val, timedelta): + payload[str(var)] = val.minutes + else: + payload[str(var)] = val elif str(var) == "boardType": if val != None: payload["type"] = val