13 Commits

Author SHA1 Message Date
eb9a043c34 Probably a fix for #2 2023-11-19 12:19:31 +01:00
819bd5ff40 Add '.renovaterc' 2023-04-21 10:07:48 +03:00
c2e1fc54c1 Updated to 0.3.4 2023-01-04 11:55:06 +01:00
29ebb4627d Merge branch 'master' of https://git.profitroll.eu/profitroll/PythonRMV 2023-01-04 10:35:38 +01:00
6b6299cd0a Added one more check for correct response return 2023-01-04 10:35:33 +01:00
Profitroll
e91846edee Fixed empty boards return 2022-11-13 15:04:00 +01:00
Profitroll
9b6b2d6416 Updated meta to 0.3.3 2022-11-13 15:03:40 +01:00
Profitroll
f8b13ccedf Removed unused import 2022-10-12 17:42:42 +02:00
Profitroll
b47bc51365 Just a bit clarified docstring 2022-10-12 17:42:22 +02:00
Profitroll
f39da9b803 Updated meta to 0.3.2 2022-10-12 17:28:21 +02:00
Profitroll
1b863c55f1 Added retrieve_stops argument 2022-10-12 17:28:09 +02:00
Profitroll
80a788933d Improved README 2022-10-12 17:15:12 +02:00
Profitroll
3599a034dc Typing improved 2022-10-12 17:08:49 +02:00
18 changed files with 362 additions and 344 deletions

17
.renovaterc Normal file
View File

@@ -0,0 +1,17 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:base"
],
"packageRules": [
{
"matchUpdateTypes": [
"minor",
"patch",
"pin",
"digest"
],
"automerge": true
}
]
}

View File

@@ -2,25 +2,27 @@
Small module that makes your journey with RMV REST API somehow easier. Based fully on official RMV API reference and HAFAS documentation.
# Requirements
## Requirements
* RMV API key (Get it [here](https://opendata.rmv.de/site/start.html))
* Python3 (Tested versions are 3.7.9 and 3.9.13)
* git (Only for installation from source)
# Installation
## Installation
If you have everything listed in [requirements](#requirements), then let's begin.
### Variant 1:
### Variant 1
1. `python -m pip install pyrmv`
### Variant 2:
### Variant 2
1. `git clone https://git.end-play.xyz/profitroll/PythonRMV.git`
2. `cd PythonRMV`
3. `python setup.py install`
# Usage
## Usage
```py
import pyrmv
@@ -36,44 +38,26 @@ destination = client.stop_by_coords(50.099613, 8.685449, max_number=3)[0]
trip = client.trip_find(origin_id=origin.id, dest_id=destination.id)
```
# Frequently Asked Questions
## Frequently Asked Questions
- [Why are there raw versions and formatted ones?](#why-are-there-raw-versions-and-formatted-ones)
- [Some methods work slightly different](#some-methods-work-slightly-different)
* [Why are there raw versions and formatted ones?](#why-are-there-raw-versions-and-formatted-ones)
* [Some methods work slightly different](#some-methods-work-slightly-different)
## Why are there raw versions and formatted ones?
### Why are there raw versions and formatted ones?
For the purposes of my projects I don't really need all the stuff RMV gives (even though it's not much).
I only need some specific things. However I do understand that in some cases other users may find
those methods quite useful so I implemented them as well.
## Some methods work slightly different
### Some methods work slightly different
Can be. Not all function arguments written may work perfectly because I simply did not test each and
every request. Some of arguments may be irrelevant in my use-case and the others are used quite rare at all.
Just [make an issue](https://git.end-play.xyz/profitroll/PythonRMV/issues/new) and I'll implement it correct when I'll have some free time.
# To-Do
## General
- [ ] Docs in Wiki
## To-Do
## Raw methods
- [x] arrivalBoard (board_arrival)
- [x] departureBoard (board_departure)
- [x] himsearch (him_search)
- [x] journeyDetail (journey_detail)
- [x] location.nearbystops (stop_by_coords)
- [x] location.name (stop_by_name)
- [x] trip (trip_find)
- [x] recon (trip_recon)
### General
## Normal methods
- [x] arrivalBoard (board_arrival)
- [x] departureBoard (board_departure)
- [x] himsearch (him_search)
- [x] journeyDetail (journey_detail)
- [x] location.nearbystops (stop_by_coords)
- [x] location.name (stop_by_name)
- [x] trip (trip_find)
- [x] recon (trip_recon)
* [ ] Docs in Wiki
* [ ] Tickets

View File

@@ -21,14 +21,10 @@ trip = client.trip_find(origin_id=origin.id, dest_id=destination.id)
"""
__name__ = "pyrmv"
__version__ = "0.3.1"
__version__ = "0.3.5"
__license__ = "MIT License"
__author__ = "Profitroll"
from . import raw
from . import const
from . import enums
from . import errors
from . import utility
from . import const, enums, errors, raw, utility
from .classes import *
from .classes.Client import Client
from .classes.Client import Client

View File

@@ -3,17 +3,23 @@ from pyrmv.classes.Message import Message
class LineArrival():
def __init__(self, data, client):
def __init__(self, data, client, retrieve_stops: bool = True):
self.journey = client.journey_detail(data["JourneyDetailRef"]["ref"])
self.status = data["JourneyStatus"]
self.messages = []
for message in data["Messages"]["Message"]:
self.messages.append(Message(message))
if "Messages" in data:
self.messages.extend(
Message(message) for message in data["Messages"]["Message"]
)
self.name = data["name"]
self.type = data["type"]
self.stop_name = data["stop"]
self.stop_id = data["stopid"]
self.stop_id_ext = data["stopExtId"]
if retrieve_stops:
self.stop = client.stop_by_id(self.stop_id)
else:
self.stop = None
self.stop = client.stop_by_id(self.stop_id)
self.time = datetime.strptime(data["time"], "%H:%M:%S")
self.date = datetime.strptime(data["date"], "%Y-%m-%d")
@@ -28,18 +34,23 @@ class LineArrival():
class LineDeparture():
def __init__(self, data, client):
def __init__(self, data, client, retrieve_stops: bool = True):
self.journey = client.journey_detail(data["JourneyDetailRef"]["ref"])
self.status = data["JourneyStatus"]
self.messages = []
for message in data["Messages"]["Message"]:
self.messages.append(Message(message))
if "Messages" in data:
self.messages.extend(
Message(message) for message in data["Messages"]["Message"]
)
self.name = data["name"]
self.type = data["type"]
self.stop_name = data["stop"]
self.stop_id = data["stopid"]
self.stop_id_ext = data["stopExtId"]
self.stop = client.stop_by_id(self.stop_id)
if retrieve_stops:
self.stop = client.stop_by_id(self.stop_id)
else:
self.stop = None
self.time = datetime.strptime(data["time"], "%H:%M:%S")
self.date = datetime.strptime(data["date"], "%Y-%m-%d")
if ("rtTime" in data) and ("rtDate" in data):
@@ -54,10 +65,12 @@ class LineDeparture():
class BoardArrival(list):
def __init__(self, data: dict, client):
def __init__(self, data: dict, client, retrieve_stops: bool = True):
super().__init__([])
if "Arrival" not in data:
return
for line in data["Arrival"]:
self.append(LineArrival(line, client))
self.append(LineArrival(line, client, retrieve_stops=retrieve_stops))
def __str__(self) -> str:
lines = []
@@ -67,10 +80,12 @@ class BoardArrival(list):
class BoardDeparture(list):
def __init__(self, data: dict, client):
def __init__(self, data: dict, client, retrieve_stops: bool = True):
super().__init__([])
if "Departure" not in data:
return
for line in data["Departure"]:
self.append(LineDeparture(line, client))
self.append(LineDeparture(line, client, retrieve_stops=retrieve_stops))
def __str__(self) -> str:
lines = []

View File

@@ -70,17 +70,18 @@ class Client():
self.access_id = access_id
def board_arrival(self,
id: str = None, # type: ignore
id_ext: str = None, # type: ignore
direction: Union[str, Stop, StopTrip] = None, # type: ignore
date: Union[str, datetime] = None, # type: ignore
time: Union[str, datetime] = None, # type: ignore
id: Union[str, None] = None,
id_ext: Union[str, None] = None,
direction: Union[str, Stop, StopTrip, None] = None,
date: Union[str, datetime, None] = None,
time: Union[str, datetime, None] = None,
duration: Union[int, timedelta] = 60,
journeys_max: int = -1,
operators: Union[str, list] = None, # type: ignore
lines: Union[str, list] = None, # type: ignore
operators: Union[str, list, None] = None,
lines: Union[str, list, None] = None,
passlist: bool = False,
board_type: Literal[BoardArrivalType.ARR, BoardArrivalType.ARR_EQUIVS, BoardArrivalType.ARR_MAST, BoardArrivalType.ARR_STATION] = BoardArrivalType.ARR,
retrieve_stops: bool = True
) -> BoardArrival:
"""Method returns a board with arriving transport.
@@ -98,6 +99,7 @@ class Client():
* 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`.
* retrieve_stops (`bool`, **optional**): Whether the stops should be retrieved as a `Stop` objects. Using `False` will drastically increase processing speed and decrease number of requests made (good for low access_key rate limit). Defaults to `True`.
### Returns:
* BoardArrival: Instance of `BoardArrival` object.
@@ -113,7 +115,7 @@ class Client():
direction=direction, # type: ignore
date=date,
time=time,
duration=duration, # type: ignore
duration=duration,
maxJourneys=journeys_max,
operators=operators,
lines=lines,
@@ -123,20 +125,21 @@ class Client():
find_exception(board_raw)
return BoardArrival(board_raw, self)
return BoardArrival(board_raw, self, retrieve_stops=retrieve_stops)
def board_departure(self,
id: str = None, # type: ignore
id_ext: str = None, # type: ignore
direction: Union[str, Stop, StopTrip] = None, # type: ignore
date: Union[str, datetime] = None, # type: ignore
time: Union[str, datetime] = None, # type: ignore
id: Union[str, None] = None,
id_ext: Union[str, None] = None,
direction: Union[str, Stop, StopTrip, None] = None,
date: Union[str, datetime, None] = None,
time: Union[str, datetime, None] = None,
duration: Union[int, timedelta] = 60,
journeys_max: int = -1,
operators: Union[str, list] = None, # type: ignore
lines: Union[str, list] = None, # type: ignore
operators: Union[str, list, None] = None,
lines: Union[str, list, None] = None,
passlist: bool = False,
board_type: Literal[BoardDepartureType.DEP, BoardDepartureType.DEP_EQUIVS, BoardDepartureType.DEP_MAST, BoardDepartureType.DEP_STATION] = BoardDepartureType.DEP,
retrieve_stops: bool = True
) -> BoardDeparture:
"""Method returns a board with departing transport.
@@ -154,6 +157,7 @@ class Client():
* 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`.
* retrieve_stops (`bool`, **optional**): Whether the stops should be retrieved as a `Stop` objects. Using `False` will drastically increase processing speed and decrease number of requests made (good for low access_key rate limit). Defaults to `True`.
### Returns:
* BoardDeparture: Instance of `BoardDeparture` object.
@@ -169,7 +173,7 @@ class Client():
direction=direction, # type: ignore
date=date,
time=time,
duration=duration, # type: ignore
duration=duration,
maxJourneys=journeys_max,
operators=operators,
lines=lines,
@@ -179,31 +183,31 @@ class Client():
find_exception(board_raw)
return BoardDeparture(board_raw, self)
return BoardDeparture(board_raw, self, retrieve_stops=retrieve_stops)
def him_search(self,
date_begin: Union[str, datetime] = None, # type: ignore
date_end: Union[str, datetime] = None, # type: ignore
time_begin: Union[str, datetime] = None, # type: ignore
time_end: Union[str, datetime] = None, # type: ignore
weekdays: Union[str, OrderedDict[str, bool]] = None, # type: ignore
ids: list = None, # type: ignore
operators: list = None, # type: ignore
categories: list = None, # type: ignore
channels: list = None, # type: ignore
companies: list = None, # type: ignore
lines: list = None, # type: ignore
line_ids: list = None, # type: ignore
stations: Union[list, List[Stop]] = None, # type: ignore
station_from: Union[str, Stop] = None, # type: ignore
station_to: Union[str, Stop] = None, # type: ignore
both_ways: bool = None, # type: ignore
train_names: list = None, # type: ignore
search_mode: Literal[SearchMode.MATCH, SearchMode.NOMATCH, SearchMode.TFMATCH] = None, # type: ignore
affected_journey_mode: Literal[AffectedJourneyMode.ALL, AffectedJourneyMode.OFF] = None, # type: ignore
affected_journey_stop_mode: Literal[AffectedJourneyStopMode.ALL, AffectedJourneyStopMode.IMP, AffectedJourneyStopMode.OFF] = None, # type: ignore
priority_min: int = None, # type: ignore
priority_max: int = None # type: ignore
date_begin: Union[str, datetime, None] = None,
date_end: Union[str, datetime, None] = None,
time_begin: Union[str, datetime, None] = None,
time_end: Union[str, datetime, None] = None,
weekdays: Union[str, OrderedDict[str, bool], None] = None,
ids: Union[list, None] = None,
operators: Union[list, None] = None,
categories: Union[list, None] = None,
channels: Union[list, None] = None,
companies: Union[list, None] = None,
lines: Union[list, None] = None,
line_ids: Union[list, None] = None,
stations: Union[list, List[Stop], None] = None,
station_from: Union[str, Stop, None] = None,
station_to: Union[str, Stop, None] = None,
both_ways: Union[bool, None] = None,
train_names: Union[list, None] = None,
search_mode: Union[Literal[SearchMode.MATCH, SearchMode.NOMATCH, SearchMode.TFMATCH], None] = None,
affected_journey_mode: Union[Literal[AffectedJourneyMode.ALL, AffectedJourneyMode.OFF], None] = None,
affected_journey_stop_mode: Union[Literal[AffectedJourneyStopMode.ALL, AffectedJourneyStopMode.IMP, AffectedJourneyStopMode.OFF], None] = None,
priority_min: Union[int, None] = None,
priority_max: Union[int, None] = None
) -> List[Message]:
"""The him_search method will deliver a list of HIM messages if matched by the given criteria as
well as affected products if any.
@@ -239,10 +243,10 @@ class Client():
"""
if isinstance(station_from, Stop):
station_from = station_from.ext_id # type: ignore
station_from = station_from.ext_id
if isinstance(station_to, Stop):
station_to = station_to.ext_id # type: ignore
station_to = station_to.ext_id
if stations != None:
new_stations = []
@@ -254,17 +258,17 @@ class Client():
stations = new_stations
if search_mode == None:
search_mode = None # type: ignore
search_mode = None
else:
search_mode = search_mode.code
if affected_journey_mode == None:
affected_journey_mode = None # type: ignore
affected_journey_mode = None
else:
affected_journey_mode = affected_journey_mode.code
if affected_journey_stop_mode == None:
affected_journey_stop_mode = None # type: ignore
affected_journey_stop_mode = None
else:
affected_journey_stop_mode = affected_journey_stop_mode.code
@@ -297,19 +301,20 @@ class Client():
find_exception(messages_raw)
for message in messages_raw["Message"]:
messages.append(Message(message))
if "Message" in messages_raw:
for message in messages_raw["Message"]:
messages.append(Message(message))
return messages
def journey_detail(self,
id: str,
date: Union[str, datetime] = None, # type: ignore
real_time_mode: Literal[RealTimeMode.FULL, RealTimeMode.INFOS, RealTimeMode.OFF, RealTimeMode.REALTIME, RealTimeMode.SERVER_DEFAULT] = None, # type: ignore
from_id: str = None, # type: ignore
from_index: int = None, # type: ignore
to_id: str = None, # type: ignore
to_index: int = None # type: ignore
date: Union[str, datetime, None] = None,
real_time_mode: Union[Literal[RealTimeMode.FULL, RealTimeMode.INFOS, RealTimeMode.OFF, RealTimeMode.REALTIME, RealTimeMode.SERVER_DEFAULT], None] = None,
from_id: Union[str, None] = None,
from_index: Union[int, None] = None,
to_id: Union[str, None] = None,
to_index: Union[int, None] = None
) -> Journey:
"""The journey_detail method will deliver information about the complete route of a vehicle. The journey
identifier is part of a trip or `board_departure()` response. It contains a list of all stops/stations of this journey
@@ -332,7 +337,7 @@ class Client():
"""
if real_time_mode == None:
real_time_mode = None # type: ignore
real_time_mode = None
else:
real_time_mode = real_time_mode.code
@@ -342,9 +347,9 @@ class Client():
date=date,
rtMode=real_time_mode, # type: ignore
fromId=from_id,
fromIdx=from_index, # type: ignore
fromIdx=from_index,
toId=to_id,
toIdx=to_index # type: ignore
toIdx=to_index
)
find_exception(journey_raw)
@@ -359,7 +364,7 @@ class Client():
radius: Union[int, float] = 1000,
max_number: int = 10,
stop_type: Literal[LocationType.S, LocationType.P, LocationType.SP, LocationType.SE, LocationType.SPE] = LocationType.S,
selection_mode: Literal[SelectionMode.SLCT_A, SelectionMode.SLCT_N] = None, # type: ignore
selection_mode: Union[Literal[SelectionMode.SLCT_A, SelectionMode.SLCT_N], None] = None,
) -> List[Stop]:
"""Method returns a list of stops around a given center coordinate.
The returned results are ordered by their distance to the center coordinate.
@@ -380,7 +385,7 @@ class Client():
"""
if selection_mode == None:
selection_mode = None # type: ignore
selection_mode = None
else:
selection_mode = selection_mode.code
@@ -398,11 +403,12 @@ class Client():
find_exception(stops_raw)
for stop in stops_raw["stopLocationOrCoordLocation"]:
if "StopLocation" in stop:
stops.append(Stop(stop["StopLocation"]))
elif "CoordLocation" in stop:
stops.append(Stop(stop["CoordLocation"]))
if "stopLocationOrCoordLocation" in stops_raw:
for stop in stops_raw["stopLocationOrCoordLocation"]:
if "StopLocation" in stop:
stops.append(Stop(stop["StopLocation"]))
elif "CoordLocation" in stop:
stops.append(Stop(stop["CoordLocation"]))
return stops
@@ -446,12 +452,12 @@ class Client():
lang: Literal[Language.DE, Language.DA, Language.EN, Language.ES, Language.FR, Language.HU, Language.IT, Language.NL, Language.NO, Language.PL, Language.SV, Language.TR] = Language.EN,
max_number: int = 10,
stop_type: Literal[LocationType.A, LocationType.ALL, LocationType.AP, LocationType.P, LocationType.S, LocationType.SA, LocationType.SP] = LocationType.ALL,
selection_mode: Literal[SelectionMode.SLCT_A, SelectionMode.SLCT_N] = None, # type: ignore
coord_lat: Union[str, float] = None, # type: ignore
coord_lon: Union[str, float] = None, # type: ignore
selection_mode: Union[Literal[SelectionMode.SLCT_A, SelectionMode.SLCT_N], None] = None,
coord_lat: Union[str, float, None] = None,
coord_lon: Union[str, float, None] = None,
radius: Union[int, float] = 1000,
refine_id: str = None, # type: ignore
stations: Union[str, list] = None, # type: ignore
refine_id: Union[str, None] = None,
stations: Union[str, list, None] = None,
filter_mode: Literal[FilterMode.DIST_PERI, FilterMode.EXCL_PERI, FilterMode.SLCT_PERI] = FilterMode.DIST_PERI
) -> List[Stop]:
"""Method can be used to perform a pattern matching of a user input and to retrieve a list
@@ -478,7 +484,7 @@ class Client():
"""
if selection_mode == None:
selection_mode = None # type: ignore
selection_mode = None
else:
selection_mode = selection_mode.code
@@ -500,58 +506,59 @@ class Client():
find_exception(stops_raw)
for stop in stops_raw["stopLocationOrCoordLocation"]:
if "StopLocation" in stop:
stops.append(Stop(stop["StopLocation"]))
elif "CoordLocation" in stop:
stops.append(Stop(stop["CoordLocation"]))
if "stopLocationOrCoordLocation" in stops_raw:
for stop in stops_raw["stopLocationOrCoordLocation"]:
if "StopLocation" in stop:
stops.append(Stop(stop["StopLocation"]))
elif "CoordLocation" in stop:
stops.append(Stop(stop["CoordLocation"]))
return stops
def trip_find(self,
lang: Literal[Language.DE, Language.DA, Language.EN, Language.ES, Language.FR, Language.HU, Language.IT, Language.NL, Language.NO, Language.PL, Language.SV, Language.TR] = Language.EN,
origin_id: str = None, # type: ignore
origin_id_ext: str = None, # type: ignore
origin_coord_lat: Union[str, float] = None, # type: ignore
origin_coord_lon: Union[str, float] = None, # type: ignore
origin_coord_name: str = None, # type: ignore
origin_id: Union[str, None] = None,
origin_id_ext: Union[str, None] = None,
origin_coord_lat: Union[str, float, None] = None,
origin_coord_lon: Union[str, float, None] = None,
origin_coord_name: Union[str, None] = None,
destination_id: str = None, # type: ignore
destination_id_ext: str = None, # type: ignore
destination_coord_lat: Union[str, float] = None, # type: ignore
destination_coord_lon: Union[str, float] = None, # type: ignore
destination_coord_name: str = None, # type: ignore
destination_id: Union[str, None] = None,
destination_id_ext: Union[str, None] = None,
destination_coord_lat: Union[str, float, None] = None,
destination_coord_lon: Union[str, float, None] = None,
destination_coord_name: Union[str, None] = None,
via: str = None, # type: ignore
via_id: str = None, # type: ignore
via_gis: str = None, # type: ignore
via: Union[str, None] = None,
via_id: Union[str, None] = None,
via_gis: Union[str, None] = None,
via_wait_time: int = 0,
avoid: str = None, # type: ignore
avoid_id: str = None, # type: ignore
avoid: Union[str, None] = None,
avoid_id: Union[str, None] = None,
change_time_percent: int = 100,
change_time_min: int = None, # type: ignore
change_time_max: int = None, # type: ignore
change_time_add: int = None, # type: ignore
change_max: int = None, # type: ignore
change_time_min: Union[int, None] = None,
change_time_max: Union[int, None] = None,
change_time_add: Union[int, None] = None,
change_max: Union[int, None] = None,
date: Union[str, datetime] = None, # type: ignore
time: Union[str, datetime] = None, # type: ignore
date: Union[str, datetime, None] = None,
time: Union[str, datetime, None] = None,
search_arrival: bool = False,
trips_after_time: int = None, # type: ignore
trips_before_time: int = None, # type: ignore
trips_after_time: Union[int, None] = None,
trips_before_time: Union[int, None] = None,
context: str = None, # type: ignore
context: Union[str, None] = None,
passlist: bool = False,
operators: Union[str, list] = None, # type: ignore
operators: Union[str, list, None] = None,
lines: Union[str, list] = None, # type: ignore
lineids: Union[str, list] = None, # type: ignore
lines: Union[str, list, None] = None,
lineids: Union[str, list, None] = None,
iv_include: bool = False,
iv_only: bool = False,
@@ -560,11 +567,11 @@ class Client():
passing_points: bool = False,
real_time_mode: Literal[RealTimeMode.FULL, RealTimeMode.INFOS, RealTimeMode.OFF, RealTimeMode.REALTIME, RealTimeMode.SERVER_DEFAULT] = None, # type: ignore
real_time_mode: Union[Literal[RealTimeMode.FULL, RealTimeMode.INFOS, RealTimeMode.OFF, RealTimeMode.REALTIME, RealTimeMode.SERVER_DEFAULT], None] = None,
include_earlier: bool = False,
ict_alternatives: bool = False,
tariff: bool = None, # type: ignore
tariff: Union[bool, None] = None,
messages: bool = False,
frequency: bool = True
) -> List[Trip]:
@@ -623,7 +630,7 @@ class Client():
"""
if real_time_mode == None:
real_time_mode = None # type: ignore
real_time_mode = None
else:
real_time_mode = real_time_mode.code
@@ -693,24 +700,25 @@ class Client():
find_exception(trips_raw)
for trip in trips_raw["Trip"]:
trips.append(Trip(trip))
if "Trip" in trips_raw:
for trip in trips_raw["Trip"]:
trips.append(Trip(trip))
return trips
def trip_recon(self,
context: Union[str, Trip],
date: Union[str, datetime] = None, # type: ignore
match_real_time: bool = None, # type: ignore
enable_replacements: bool = None, # type: ignore
arrival_dev_lower: int = None, # type: ignore
arrival_dev_upper: int = None, # type: ignore
departure_dev_lower: int = None, # type: ignore
departure_dev_upper: int = None, # type: ignore
passlist: bool = None, # type: ignore
date: Union[str, datetime, None] = None,
match_real_time: Union[bool, None] = None,
enable_replacements: Union[bool, None] = None,
arrival_dev_lower: Union[int, None] = None,
arrival_dev_upper: Union[int, None] = None,
departure_dev_lower: Union[int, None] = None,
departure_dev_upper: Union[int, None] = None,
passlist: bool = False,
passing_points: bool = False,
real_time_mode: Literal[RealTimeMode.FULL, RealTimeMode.INFOS, RealTimeMode.OFF, RealTimeMode.REALTIME, RealTimeMode.SERVER_DEFAULT] = None, # type: ignore
tariff: bool = None, # type: ignore
real_time_mode: Union[Literal[RealTimeMode.FULL, RealTimeMode.INFOS, RealTimeMode.OFF, RealTimeMode.REALTIME, RealTimeMode.SERVER_DEFAULT], None] = None,
tariff: Union[bool, None] = None,
messages: bool = False
) -> List[Trip]:
"""Reconstructing a trip can be achieved using the reconstruction context provided by any trip result in the
@@ -739,7 +747,7 @@ class Client():
"""
if real_time_mode == None:
real_time_mode = None # type: ignore
real_time_mode = None
else:
real_time_mode = real_time_mode.code
@@ -766,7 +774,8 @@ class Client():
find_exception(trips_raw)
for trip in trips_raw["Trip"]:
trips.append(Trip(trip))
if "Trip" in trips_raw:
for trip in trips_raw["Trip"]:
trips.append(Trip(trip))
return trips

View File

@@ -11,11 +11,12 @@ class Journey():
self.direction_flag = data["Directions"]["Direction"][0]["flag"]
self.messages = []
for stop in data["Stops"]["Stop"]:
self.stops.append(Stop(stop))
self.stops.extend(Stop(stop) for stop in data["Stops"]["Stop"])
for message in data["Messages"]["Message"]:
self.messages.append(Message(message))
if "Messages" in data:
self.messages.extend(
Message(message) for message in data["Messages"]["Message"]
)
def __str__(self) -> str:
return f"Journey with total of {len(self.stops)} stops and {len(self.messages)} messages heading {self.direction} ({self.direction_flag})"

View File

@@ -61,7 +61,7 @@ class Message():
self.text = data["text"]
self.company = data["company"]
self.category = data["category"]
self.priority = data["priority"]
self.priority = None if "priority" not in data else data["priority"]
self.products = data["products"]
self.icon = data["icon"]
self.time_start = datetime.strptime(data["sTime"], "%H:%M:%S")

View File

@@ -11,19 +11,19 @@ except ImportError:
# 2.25. Arrival Board (arrivalBoard)
def board_arrival(accessId: str,
json: bool = True,
id: str = None, # type: ignore
extId: str = None, # type: ignore
direction: str = None, # type: ignore
date: Union[str, datetime] = None, # type: ignore
time: Union[str, datetime] = None, # type: ignore
duration: int = 60,
id: Union[str, None] = None,
extId: Union[str, None] = None,
direction: Union[str, None] = None,
date: Union[str, datetime, None] = None,
time: Union[str, datetime, None] = None,
duration: Union[int, timedelta] = 60,
maxJourneys: int = -1,
products: int = None, # type: ignore
operators: Union[str, list] = None, # type: ignore
lines: Union[str, list] = None, # type: ignore
products: Union[int, None] = None,
operators: Union[str, list, None] = None,
lines: Union[str, list, None] = None,
filterEquiv: bool = True,
attributes: Union[str, list] = None, # type: ignore
platforms: Union[str, list] = None, # type: ignore
attributes: Union[str, list, None] = None,
platforms: Union[str, list, None] = None,
passlist: bool = False,
boardType: Literal["ARR", "ARR_EQUIVS", "ARR_MAST", "ARR_STATION"] = "ARR"
) -> dict:
@@ -81,7 +81,7 @@ def board_arrival(accessId: str,
elif str(var) == "duration":
if val != None:
if isinstance(val, timedelta):
payload[str(var)] = val.minutes
payload[str(var)] = val.minutes # type: ignore
else:
payload[str(var)] = val
elif str(var) == "boardType":

View File

@@ -11,19 +11,19 @@ except ImportError:
# 2.24. Departure Board (departureBoard)
def board_departure(accessId: str,
json: bool = True,
id: str = None, # type: ignore
extId: str = None, # type: ignore
direction: str = None, # type: ignore
date: Union[str, datetime] = None, # type: ignore
time: Union[str, datetime] = None, # type: ignore
duration: int = 60,
id: Union[str, None] = None,
extId: Union[str, None] = None,
direction: Union[str, None] = None,
date: Union[str, datetime, None] = None,
time: Union[str, datetime, None] = None,
duration: Union[int, timedelta] = 60,
maxJourneys: int = -1,
products: int = None, # type: ignore
operators: Union[str, list] = None, # type: ignore
lines: Union[str, list] = None, # type: ignore
products: Union[int, None] = None,
operators: Union[str, list, None] = None,
lines: Union[str, list, None] = None,
filterEquiv: bool = True,
attributes: Union[str, list] = None, # type: ignore
platforms: Union[str, list] = None, # type: ignore
attributes: Union[str, list, None] = None,
platforms: Union[str, list, None] = None,
passlist: bool = False,
boardType: Literal["DEP", "DEP_EQUIVS", "DEP_MAST", "DEP_STATION"] = "DEP"
) -> dict:
@@ -82,7 +82,7 @@ def board_departure(accessId: str,
elif str(var) == "duration":
if val != None:
if isinstance(val, timedelta):
payload[str(var)] = val.minutes
payload[str(var)] = val.minutes # type: ignore
else:
payload[str(var)] = val
elif str(var) == "boardType":

View File

@@ -13,38 +13,38 @@ except ImportError:
# 2.37. HIM Search (himsearch)
def him_search(accessId: str,
json: bool = True,
dateB: Union[str, datetime] = None, # type: ignore
dateE: Union[str, datetime] = None, # type: ignore
timeB: Union[str, datetime] = None, # type: ignore
timeE: Union[str, datetime] = None, # type: ignore
weekdays: Union[str, OrderedDict[str, bool]] = None, # type: ignore
himIds: Union[str, list] = None, # type: ignore
dateB: Union[str, datetime, None] = None,
dateE: Union[str, datetime, None] = None,
timeB: Union[str, datetime, None] = None,
timeE: Union[str, datetime, None] = None,
weekdays: Union[str, OrderedDict[str, bool], None] = None,
himIds: Union[str, list, None] = None,
hierarchicalView: bool = False,
operators: Union[str, list] = None, # type: ignore
categories: Union[str, list] = None, # type: ignore
channels: Union[str, list] = None, # type: ignore
companies: Union[str, list] = None, # type: ignore
lines: Union[str, list] = None, # type: ignore
lineids: Union[str, list] = None, # type: ignore
stations: Union[str, list] = None, # type: ignore
fromstation: str = None, # type: ignore
tostation: str = None, # type: ignore
bothways: bool = None, # type: ignore
trainnames: Union[str, list] = None, # type: ignore
metas: Union[str, list] = None, # type: ignore
himcategory: str = None, # type: ignore
himtags: Union[str, list] = None, # type: ignore
regions: Union[str, list] = None, # type: ignore
himtext: Union[str, list] = None, # type: ignore
himtexttags: Union[str, list] = None, # type: ignore
additionalfields: Union[str, list, dict] = None, # type: ignore
operators: Union[str, list, None] = None,
categories: Union[str, list, None] = None,
channels: Union[str, list, None] = None,
companies: Union[str, list, None] = None,
lines: Union[str, list, None] = None,
lineids: Union[str, list, None] = None,
stations: Union[str, list, None] = None,
fromstation: Union[str, None] = None,
tostation: Union[str, None] = None,
bothways: Union[bool, None] = None,
trainnames: Union[str, list, None] = None,
metas: Union[str, list, None] = None,
himcategory: Union[str, None] = None,
himtags: Union[str, list, None] = None,
regions: Union[str, list, None] = None,
himtext: Union[str, list, None] = None,
himtexttags: Union[str, list, None] = None,
additionalfields: Union[str, list, dict, None] = None,
poly: bool = False,
searchmode: Literal["MATCH", "NOMATCH", "TFMATCH"] = None, # type: ignore
affectedJourneyMode: Literal["ALL", "OFF"] = None, # type: ignore
affectedJourneyStopMode: Literal["ALL", "IMP", "OFF"] = None, # type: ignore
orderBy: Union[str, list] = None, # type: ignore
minprio: Union[str, int] = None, # type: ignore
maxprio: Union[str, int] = None # type: ignore
searchmode: Union[Literal["MATCH", "NOMATCH", "TFMATCH"], None] = None,
affectedJourneyMode: Union[Literal["ALL", "OFF"], None] = None,
affectedJourneyStopMode: Union[Literal["ALL", "IMP", "OFF"], None] = None,
orderBy: Union[str, list, None] = None,
minprio: Union[str, int, None] = None,
maxprio: Union[str, int, None] = None
) -> dict:
"""The himSearch will return a list of HIM messages if matched by the given criteria as well as affected
products if any.

View File

@@ -12,15 +12,15 @@ except ImportError:
def journey_detail(accessId: str,
id: str,
json: bool = True,
date: Union[str, datetime] = None, # type: ignore
date: Union[str, datetime, None] = None,
poly: bool = False,
polyEnc: Literal["DLT", "GPA", "N"] = "N",
showPassingPoints: bool = False,
rtMode: Literal["FULL", "INFOS", "OFF", "REALTIME", "SERVER_DEFAULT"] = None, # type: ignore
fromId: str = None, # type: ignore
fromIdx: str = None, # type: ignore
toId: str = None, # type: ignore
toIdx: str = None, # type: ignore
rtMode: Union[Literal["FULL", "INFOS", "OFF", "REALTIME", "SERVER_DEFAULT"], None] = None,
fromId: Union[str, None] = None,
fromIdx: Union[int, None] = None,
toId: Union[str, None] = None,
toIdx: Union[int, None] = None,
baim: bool = False
) -> dict:
"""The journey_detail method will deliver information about the complete route of a vehicle. The journey

View File

@@ -16,11 +16,11 @@ def stop_by_coords(accessId: str,
radius: Union[int, float] = 1000,
maxNo: int = 10,
stopType: Literal["S", "P", "SP", "SE", "SPE"] = "S",
locationSelectionMode: Literal["SLCT_N", "SLCT_A"] = None, # type: ignore
products: int = None, # type: ignore
meta: str = None, # type: ignore
sattributes: Union[str, list] = None, # type: ignore
sinfotexts: Union[str, list] = None # type: ignore
locationSelectionMode: Union[Literal["SLCT_N", "SLCT_A"], None] = None,
products: Union[int, None] = None,
meta: Union[str, None] = None,
sattributes: Union[str, list, None] = None,
sinfotexts: Union[str, list, None] = None
) -> dict:
"""The location.nearbystops service returns a list of stops around a given center coordinate (within a
radius of 1000m). The returned results are ordered by their distance to the center coordinate.

View File

@@ -14,15 +14,15 @@ def stop_by_name(accessId: str,
json: bool = True,
maxNo: int = 10,
stopType: Literal["A", "ALL", "AP", "P", "S", "SA", "SP"] = "ALL",
locationSelectionMode: Literal["SLCT_N", "SLCT_A"] = None, # type: ignore
products: int = None, # type: ignore
coordLat: Union[str, float] = None, # type: ignore
coordLong: Union[str, float] = None, # type: ignore
locationSelectionMode: Union[Literal["SLCT_N", "SLCT_A"], None] = None,
products: Union[int, None] = None,
coordLat: Union[str, float, None] = None,
coordLong: Union[str, float, None] = None,
radius: Union[int, float] = 1000,
refineId: str = None, # type: ignore
meta: str = None, # type: ignore
stations: Union[str, list] = None, # type: ignore
sattributes: Union[str, list] = None, # type: ignore
refineId: Union[str, None] = None,
meta: Union[str, None] = None,
stations: Union[str, list, None] = None,
sattributes: Union[str, list, None] = None,
filterMode: Literal["DIST_PERI", "EXCL_PERI", "SLCT_PERI"] = "DIST_PERI"
) -> dict:
"""The location.name service can be used to perform a pattern matching of a user input and to retrieve a list

View File

@@ -13,87 +13,87 @@ def trip_find(accessId: str,
lang: Literal["de", "da", "en", "es", "fr", "hu", "it", "nl", "no", "pl", "sv", "tr"] = "en",
json: bool = True,
originId: str = None, # type: ignore
originExtId: str = None, # type: ignore
originCoordLat: Union[str, float] = None, # type: ignore
originCoordLong: Union[str, float] = None, # type: ignore
originCoordName: str = None, # type: ignore
originId: Union[str, None] = None,
originExtId: Union[str, None] = None,
originCoordLat: Union[str, float, None] = None,
originCoordLong: Union[str, float, None] = None,
originCoordName: Union[str, None] = None,
destId: str = None, # type: ignore
destExtId: str = None, # type: ignore
destCoordLat: Union[str, float] = None, # type: ignore
destCoordLong: Union[str, float] = None, # type: ignore
destCoordName: str = None, # type: ignore
destId: Union[str, None] = None,
destExtId: Union[str, None] = None,
destCoordLat: Union[str, float, None] = None,
destCoordLong: Union[str, float, None] = None,
destCoordName: Union[str, None] = None,
via: str = None, # type: ignore
viaId: str = None, # type: ignore
via: Union[str, None] = None,
viaId: Union[str, None] = None,
viaWaitTime: int = 0,
avoid: str = None, # type: ignore
avoidId: str = None, # type: ignore
avoid: Union[str, None] = None,
avoidId: Union[str, None] = None,
viaGis: str = None, # type: ignore
viaGis: Union[str, None] = None,
changeTimePercent: int = 100,
minChangeTime: int = None, # type: ignore
maxChangeTime: int = None, # type: ignore
addChangeTime: int = None, # type: ignore
maxChange: int = None, # type: ignore
minChangeTime: Union[int, None] = None,
maxChangeTime: Union[int, None] = None,
addChangeTime: Union[int, None] = None,
maxChange: Union[int, None] = None,
date: Union[str, datetime] = None, # type: ignore
time: Union[str, datetime] = None, # type: ignore
date: Union[str, datetime, None] = None,
time: Union[str, datetime, None] = None,
searchForArrival: bool = False,
numF: int = None, # type: ignore
numB: int = None, # type: ignore
numF: Union[int, None] = None,
numB: Union[int, None] = None,
context: str = None, # type: ignore
context: Union[str, None] = None,
poly: bool = False,
polyEnc: Literal["DLT", "GPA", "N"] = "N",
passlist: bool = False,
products: int = None, # type: ignore
operators: Union[str, list] = None, # type: ignore
products: Union[int, None] = None,
operators: Union[str, list, None] = None,
attributes: Union[str, list] = None, # type: ignore
sattributes: Union[str, list] = None, # type: ignore
fattributes: Union[str, list] = None, # type: ignore
lines: Union[str, list] = None, # type: ignore
lineids: Union[str, list] = None, # type: ignore
attributes: Union[str, list, None] = None,
sattributes: Union[str, list, None] = None,
fattributes: Union[str, list, None] = None,
lines: Union[str, list, None] = None,
lineids: Union[str, list, None] = None,
avoidPaths: List[Literal["SW", "EA", "ES", "RA", "CB"]] = None, # type: ignore
avoidPaths: Union[List[Literal["SW", "EA", "ES", "RA", "CB"]], None] = None,
originWalk: Union[str, list] = None, # type: ignore
originBike: Union[str, list] = None, # type: ignore
originCar: Union[str, list] = None, # type: ignore
originTaxi: Union[str, list] = None, # type: ignore
originPark: Union[str, list] = None, # type: ignore
originMeta: Union[str, list] = None, # type: ignore
originWalk: Union[str, list, None] = None,
originBike: Union[str, list, None] = None,
originCar: Union[str, list, None] = None,
originTaxi: Union[str, list, None] = None,
originPark: Union[str, list, None] = None,
originMeta: Union[str, list, None] = None,
destWalk: Union[str, list] = None, # type: ignore
destBike: Union[str, list] = None, # type: ignore
destCar: Union[str, list] = None, # type: ignore
destTaxi: Union[str, list] = None, # type: ignore
destPark: Union[str, list] = None, # type: ignore
destMeta: Union[str, list] = None, # type: ignore
destWalk: Union[str, list, None] = None,
destBike: Union[str, list, None] = None,
destCar: Union[str, list, None] = None,
destTaxi: Union[str, list, None] = None,
destPark: Union[str, list, None] = None,
destMeta: Union[str, list, None] = None,
totalWalk: Union[str, list] = None, # type: ignore
totalBike: Union[str, list] = None, # type: ignore
totalCar: Union[str, list] = None, # type: ignore
totalTaxi: Union[str, list] = None, # type: ignore
totalMeta: Union[str, list] = None, # type: ignore
totalWalk: Union[str, list, None] = None,
totalBike: Union[str, list, None] = None,
totalCar: Union[str, list, None] = None,
totalTaxi: Union[str, list, None] = None,
totalMeta: Union[str, list, None] = None,
gisProducts: str = None, # type: ignore
gisProducts: Union[str, None] = None,
includeIv: bool = False,
ivOnly: bool = False,
mobilityProfile: str = None, # type: ignore
mobilityProfile: Union[str, None] = None,
bikeCarriage: bool = False,
bikeCarriageType: Literal["SINGLEBIKES", "SMALLGROUPS", "LARGEGROUPS"] = None, # type: ignore
bikeCarriageType: Union[Literal["SINGLEBIKES", "SMALLGROUPS", "LARGEGROUPS"], None] = None,
sleepingCar: bool = False,
couchetteCoach: bool = False,
@@ -102,24 +102,24 @@ def trip_find(accessId: str,
eco: bool = False,
ecoCmp: bool = False,
ecoParams: str = None, # type: ignore
ecoParams: Union[str, None] = None,
rtMode: Literal["FULL", "INFOS", "OFF", "REALTIME", "SERVER_DEFAULT"] = None, # type: ignore
rtMode: Union[Literal["FULL", "INFOS", "OFF", "REALTIME", "SERVER_DEFAULT"], None] = None,
unsharp: bool = False,
trainFilter: str = None, # type: ignore
trainFilter: Union[str, None] = None,
economic: bool = False,
groupFilter: str = None, # type: ignore
groupFilter: Union[str, None] = None,
blockingList: str = None, # type: ignore
blockedEdges: str = None, # type: ignore
blockingList: Union[str, None] = None,
blockedEdges: Union[str, None] = None,
trainComposition: bool = False,
includeEarlier: bool = False,
withICTAlternatives: bool = False,
tariff: bool = None, # type: ignore
tariff: Union[bool, None] = None,
trafficMessages: bool = False,
travellerProfileData: str = None, # type: ignore
travellerProfileData: Union[str, None] = None,
withFreq: bool = True
) -> dict:
"""The trip service calculates a trip from a specified origin to a specified destination. These might be

View File

@@ -14,31 +14,31 @@ def trip_recon(accessId: str,
json: bool = True,
poly: bool = False,
polyEnc: Literal["DLT", "GPA", "N"] = "N",
date: Union[str, datetime] = None, # type: ignore
useCombinedComparison: bool = None, # type: ignore
acceptGaps: bool = None, # type: ignore
allowDummySections: bool = None, # type: ignore
flagAllNonReachable: bool = None, # type: ignore
matchCatStrict: bool = None, # type: ignore
matchIdNonBlank: bool = None, # type: ignore
matchIdStrict: bool = None, # type: ignore
matchNumStrict: bool = None, # type: ignore
matchRtType: bool = None, # type: ignore
enableRtFullSearch: bool = None, # type: ignore
enableReplacements: bool = None, # type: ignore
arrL: int = None, # type: ignore
arrU: int = None, # type: ignore
depL: int = None, # type: ignore
depU: int = None, # type: ignore
date: Union[str, datetime, None] = None,
useCombinedComparison: Union[bool, None] = None,
acceptGaps: Union[bool, None] = None,
allowDummySections: Union[bool, None] = None,
flagAllNonReachable: Union[bool, None] = None,
matchCatStrict: Union[bool, None] = None,
matchIdNonBlank: Union[bool, None] = None,
matchIdStrict: Union[bool, None] = None,
matchNumStrict: Union[bool, None] = None,
matchRtType: Union[bool, None] = None,
enableRtFullSearch: Union[bool, None] = None,
enableReplacements: Union[bool, None] = None,
arrL: Union[int, None] = None,
arrU: Union[int, None] = None,
depL: Union[int, None] = None,
depU: Union[int, None] = None,
passlist: bool = False,
showPassingPoints: bool = False,
rtMode: Literal["FULL", "INFOS", "OFF", "REALTIME", "SERVER_DEFAULT"] = None, # type: ignore
rtMode: Union[Literal["FULL", "INFOS", "OFF", "REALTIME", "SERVER_DEFAULT"], None] = None,
eco: bool = False,
ecoCmp: bool = False,
ecoParams: str = None, # type: ignore
tariff: bool = None, # type: ignore
trafficMessages: bool = None, # type: ignore
travellerProfileData: str = None # type: ignore
ecoParams: Union[str, None] = None,
tariff: Union[bool, None] = None,
trafficMessages: Union[bool, None] = None,
travellerProfileData: Union[str, None] = None
) -> dict:
"""Reconstructing a trip can be achieved using the reconstruction context provided by any trip result in the
ctxRecon attribute of Trip element. The result will be a true copy of the original trip search result given

View File

@@ -1,3 +1,3 @@
requests
xmltodict
isodate
requests~=2.31.0
xmltodict~=0.13.0
isodate~=0.6.1

View File

@@ -2,10 +2,10 @@ from setuptools import setup
setup(
name="pyrmv",
version="0.3.1",
version="0.3.5",
author="Profitroll",
description="Small module that makes your journey with RMV REST API somehow easier.",
long_description="Small module that makes your journey with RMV REST API somehow easier. Based fully on official RMV API reference and HAFAS documentation.\n\n# Usage\n\n```py\nimport pyrmv\n\n# Define a Client with API key\nclient = pyrmv.Client(\"AcessId\")\n\n# Get origin's and destination's location\norigin = client.stop_by_name(\"Frankfurt Hauptbahnhof\", max_number=3)[0]\ndestination = client.stop_by_coords(50.099613, 8.685449, max_number=3)[0]\n\n# Find a trip by locations got\ntrip = client.trip_find(origin_id=origin.id, dest_id=destination.id)\n```\n\n# Frequently Asked Questions\n\n- Why are there raw versions and formatted ones?\n- Some methods work slightly different\n\n## Why are there raw versions and formatted ones?\n\nFor the purposes of my projects I don't really need all the stuff RMV gives (even though it's not much).\nI only need some specific things. However I do understand that in some cases other users may find\nthose methods quite useful so I implemented them as well.\n\n\n## Some methods work slightly different\n\nCan be. Not all function arguments written may work perfectly because I simply did not test each and\nevery request. Some of arguments may be irrelevant in my use-case and the others are used quite rare at all.\nJust [make an issue](https://git.end-play.xyz/profitroll/PythonRMV/issues/new) and I'll implement it correct when I'll have some free time.\n\n# To-Do\n## General\n- [ ] Docs in Wiki\n\n## Raw methods\n- [x] arrivalBoard (board_arrival) \n- [x] departureBoard (board_departure) \n- [x] himsearch (him_search) \n- [x] journeyDetail (journey_detail)\n- [x] location.nearbystops (stop_by_coords) \n- [x] location.name (stop_by_name) \n- [x] trip (trip_find) \n- [x] recon (trip_recon)\n\n## Normal methods\n- [x] arrivalBoard (board_arrival) \n- [x] departureBoard (board_departure) \n- [x] himsearch (him_search) \n- [x] journeyDetail (journey_detail)\n- [x] location.nearbystops (stop_by_coords) \n- [x] location.name (stop_by_name) \n- [x] trip (trip_find) \n- [x] recon (trip_recon)",
long_description="Small module that makes your journey with RMV REST API somehow easier. Based fully on official RMV API reference and HAFAS documentation.\n\n## Requirements\n\n* RMV API key (Get it [here](https://opendata.rmv.de/site/start.html))\n* Python3 (Tested versions are 3.7.9 and 3.9.13)\n* git (Only for installation from source)\n\n## Installation\n\nIf you have everything listed in [requirements](#requirements), then let's begin.\n\n### Variant 1\n\n1. `python -m pip install pyrmv`\n\n### Variant 2\n\n1. `git clone https://git.end-play.xyz/profitroll/PythonRMV.git`\n2. `cd PythonRMV`\n3. `python setup.py install`\n\n## Usage\n\n```py\nimport pyrmv\n\n# Define a Client with API key\nclient = pyrmv.Client(\"AcessId\")\n\n# Get origin's and destination's location\norigin = client.stop_by_name(\"Frankfurt Hauptbahnhof\", max_number=3)[0]\ndestination = client.stop_by_coords(50.099613, 8.685449, max_number=3)[0]\n\n# Find a trip by locations got\ntrip = client.trip_find(origin_id=origin.id, dest_id=destination.id)\n```\n\n## Frequently Asked Questions\n\n* [Why are there raw versions and formatted ones?](#why-are-there-raw-versions-and-formatted-ones)\n* [Some methods work slightly different](#some-methods-work-slightly-different)\n\n### Why are there raw versions and formatted ones?\n\nFor the purposes of my projects I don't really need all the stuff RMV gives (even though it's not much).\nI only need some specific things. However I do understand that in some cases other users may find\nthose methods quite useful so I implemented them as well.\n\n### Some methods work slightly different\n\nCan be. Not all function arguments written may work perfectly because I simply did not test each and\nevery request. Some of arguments may be irrelevant in my use-case and the others are used quite rare at all.\nJust [make an issue](https://git.end-play.xyz/profitroll/PythonRMV/issues/new) and I'll implement it correct when I'll have some free time.\n\n## To-Do\n\n### General\n\n* [ ] Docs in Wiki\n* [ ] Tickets",
long_description_content_type="text/markdown",
author_email="profitroll@end-play.xyz",
url="https://git.end-play.xyz/profitroll/PythonRMV",
@@ -21,13 +21,9 @@ setup(
"pyrmv.enums",
"pyrmv.errors",
"pyrmv.utility",
"pyrmv.classes"
],
install_requires=[
"requests",
"xmltodict",
"isodate"
"pyrmv.classes",
],
install_requires=["requests", "xmltodict", "isodate"],
classifiers=[
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
@@ -35,6 +31,6 @@ setup(
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Topic :: Software Development :: Libraries :: Python Modules",
"Topic :: Utilities"
]
)
"Topic :: Utilities",
],
)

View File

@@ -1,6 +1,6 @@
from datetime import datetime, timedelta
from os import makedirs
from typing import Any, Union
from typing import Any
from ujson import loads, dumps, JSONDecodeError
from test_colors import *
@@ -72,7 +72,7 @@ test("raw_trip_find", pyrmv.raw.trip_find(key, originCoordLat="50.084659", origi
test("raw_trip_recon", pyrmv.raw.trip_recon(key, ctx="¶HKI¶G@F$A=2@O=50.084659, 8.785948@X=8785948@Y=50084659@u=0@a=128@$A=1@O=Offenbach (Main)-Tempelsee Wilhelm-Schramm-Straße@L=3008012@a=128@$202210061243$202210061247$$$1$$$$$$§T$A=1@O=Offenbach (Main)-Tempelsee Wilhelm-Schramm-Straße@L=3008012@a=128@$A=1@O=Offenbach (Main)-Zentrum Marktplatz/Frankf. Straße@L=3002510@a=128@$202210061247$202210061300$Bus 101 $$1$$$$$$§W$A=1@O=Offenbach (Main)-Zentrum Marktplatz/Frankf. Straße@L=3002510@a=128@$A=1@O=Offenbach (Main)-Zentrum Marktplatz@L=3011265@a=128@$202210061300$202210061304$$$1$$$$$$§T$A=1@O=Offenbach (Main)-Zentrum Marktplatz@L=3011265@a=128@$A=1@O=Frankfurt (Main) Taunusanlage@L=3000011@a=128@$202210061306$202210061319$ S2$$1$$$$$$§T$A=1@O=Frankfurt (Main) Taunusanlage@L=3000011@a=128@$A=1@O=Frankfurt (Main) Rödelheim Bahnhof@L=3001217@a=128@$202210061322$202210061333$ S5$$1$$$$$$§G@F$A=1@O=Frankfurt (Main) Rödelheim Bahnhof@L=3001217@a=128@$A=2@O=50.123304, 8.612974@X=8612974@Y=50123304@u=0@a=128@$202210061333$202210061344$$$1$$$$$$¶GP¶ft@0@2000@120@1@100@1@@0@@@@@false@0@-1@0@-1@-1@$f@$f@$f@$f@$f@$§bt@0@2000@120@1@100@1@@0@@@@@false@0@-1@0@-1@-1@$f@$f@$f@$f@$f@$§tt@0@2000@120@1@100@1@@0@@@@@false@0@-1@0@-1@-1@$f@$f@$f@$f@$f@$§¶KRCC¶#VE#1#"), raw=True)
test("board_arrival", client.board_arrival("A=1@O=Frankfurt (Main) Taunusanlage@X=8668765@Y=50113478@U=80@L=3000011@", journeys_max=5))
test("board_departure", client.board_departure("A=1@O=Frankfurt (Main) Taunusanlage@X=8668765@Y=50113478@U=80@L=3000011@", journeys_max=5))
test("board_departure", client.board_departure("A=1@O=Frankfurt (Main) Taunusanlage@X=8668765@Y=50113478@U=80@L=3000011@", journeys_max=5, retrieve_stops=False))
test("him_search", client.him_search(date_end=datetime.now()+timedelta(days=10), priority_min=2, train_names=["S9"]))
test("journey_detail", client.journey_detail("2|#VN#1#ST#1664906549#PI#0#ZI#12709#TA#0#DA#61022#1S#3008007#1T#1248#LS#3008043#LT#1323#PU#80#RT#1#CA#1aE#ZE#101#ZB#Bus 101 #PC#6#FR#3008007#FT#1248#TO#3008043#TT#1323#", real_time_mode=pyrmv.enums.RealTimeMode.FULL))
test("stop_by_coords", client.stop_by_coords(50.131140, 8.733362, radius=300, max_number=3))