166 Commits

Author SHA1 Message Date
5082b803a0 Merge pull request 'v0.5.0' (#87) from dev into master
Reviewed-on: #87
2025-05-05 01:06:48 +03:00
01d6831de0 Upgrade to version to 0.5.0
All checks were successful
Tests / test (3.10) (push) Successful in 30s
Tests / test (3.11) (push) Successful in 26s
Tests / test (3.12) (push) Successful in 34s
Tests / test (3.9) (push) Successful in 27s
Tests / test (3.10) (pull_request) Successful in 27s
Tests / test (3.11) (pull_request) Successful in 29s
Tests / test (3.12) (pull_request) Successful in 35s
Tests / test (3.9) (pull_request) Successful in 27s
2025-05-05 00:05:16 +02:00
00a772cb6a Update dependency pylint to ==3.3.7,<3.4.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 28s
Tests / test (3.11) (pull_request) Successful in 27s
Tests / test (3.12) (pull_request) Successful in 35s
Tests / test (3.9) (pull_request) Successful in 30s
Tests / test (3.10) (push) Successful in 27s
Tests / test (3.11) (push) Successful in 26s
Tests / test (3.12) (push) Successful in 31s
Tests / test (3.9) (push) Successful in 25s
2025-05-05 00:27:59 +03:00
6ade6f7554 Fixed altStart and altEnd not being provided causing KeyError
All checks were successful
Tests / test (3.10) (push) Successful in 29s
Tests / test (3.11) (push) Successful in 28s
Tests / test (3.12) (push) Successful in 37s
Tests / test (3.9) (push) Successful in 27s
2025-05-04 23:26:12 +02:00
c17a9d4206 Update dependency pytest-cov to ~=6.1.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 37s
Tests / test (3.11) (pull_request) Successful in 36s
Tests / test (3.12) (pull_request) Successful in 44s
Tests / test (3.9) (pull_request) Successful in 36s
Tests / test (3.10) (push) Successful in 45s
Tests / test (3.11) (push) Successful in 36s
Tests / test (3.12) (push) Successful in 44s
Tests / test (3.9) (push) Successful in 37s
2025-04-01 14:38:49 +03:00
389582255f Merge pull request 'Update dependency tox to v4.25.0' (#84) from renovate/tox-4.x into dev
All checks were successful
Tests / test (3.10) (push) Successful in 40s
Tests / test (3.11) (push) Successful in 38s
Tests / test (3.12) (push) Successful in 48s
Tests / test (3.9) (push) Successful in 42s
Reviewed-on: #84
2025-03-27 17:57:54 +02:00
89bfea3f8b Update dependency tox to v4.25.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 43s
Tests / test (3.11) (pull_request) Successful in 41s
Tests / test (3.12) (pull_request) Successful in 48s
Tests / test (3.9) (pull_request) Successful in 39s
2025-03-27 17:30:59 +02:00
668f05f7f2 Merge pull request 'Update dependency pylint to ==3.3.6,<3.4.0' (#83) from renovate/pylint-3.x into dev
All checks were successful
Tests / test (3.10) (push) Successful in 44s
Tests / test (3.11) (push) Successful in 40s
Tests / test (3.9) (push) Successful in 40s
Tests / test (3.12) (push) Successful in 48s
Reviewed-on: #83
2025-03-20 15:11:56 +02:00
c6d7e8733a Update dependency pylint to ==3.3.6,<3.4.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 42s
Tests / test (3.12) (pull_request) Successful in 53s
Tests / test (3.9) (pull_request) Successful in 41s
Tests / test (3.11) (pull_request) Successful in 40s
2025-03-20 13:41:06 +02:00
2fcd2eae52 Update dependency pylint to ==3.3.5,<3.4.0
Some checks failed
Tests / test (3.10) (pull_request) Successful in 45s
Tests / test (3.11) (pull_request) Successful in 44s
Tests / test (3.12) (pull_request) Successful in 50s
Tests / test (3.9) (pull_request) Failing after 45s
Tests / test (3.10) (push) Successful in 44s
Tests / test (3.11) (push) Successful in 43s
Tests / test (3.12) (push) Failing after 51s
Tests / test (3.9) (push) Failing after 44s
2025-03-09 09:35:12 +02:00
500d24016d Update dependency tox to v4.24.2
Some checks failed
Tests / test (3.10) (pull_request) Successful in 1m34s
Tests / test (3.11) (pull_request) Successful in 53s
Tests / test (3.12) (pull_request) Failing after 55s
Tests / test (3.9) (pull_request) Successful in 49s
Tests / test (3.10) (push) Successful in 47s
Tests / test (3.11) (push) Successful in 45s
Tests / test (3.12) (push) Successful in 53s
Tests / test (3.9) (push) Successful in 47s
2025-03-07 20:38:27 +02:00
7f1a330436 Update dependency mypy to ~=1.15.0
Some checks failed
Tests / test (3.10) (pull_request) Successful in 56s
Tests / test (3.11) (pull_request) Successful in 54s
Tests / test (3.12) (pull_request) Successful in 1m0s
Tests / test (3.9) (pull_request) Successful in 54s
Tests / test (3.10) (push) Failing after 55s
Tests / test (3.11) (push) Successful in 54s
Tests / test (3.12) (push) Successful in 1m1s
Tests / test (3.9) (push) Successful in 55s
2025-02-05 06:31:20 +02:00
a529184352 Update dependency black to v25
Some checks failed
Tests / test (3.10) (pull_request) Successful in 59s
Tests / test (3.11) (pull_request) Failing after 57s
Tests / test (3.12) (pull_request) Failing after 1m3s
Tests / test (3.9) (pull_request) Failing after 58s
Tests / test (3.10) (push) Failing after 58s
Tests / test (3.11) (push) Successful in 56s
Tests / test (3.12) (push) Failing after 1m3s
Tests / test (3.9) (push) Successful in 58s
2025-01-29 06:30:09 +02:00
c43a0223fa Update dependency pylint to ==3.3.4,<3.4.0
Some checks failed
Tests / test (3.10) (pull_request) Successful in 1m0s
Tests / test (3.11) (pull_request) Successful in 1m0s
Tests / test (3.12) (pull_request) Successful in 1m12s
Tests / test (3.9) (pull_request) Successful in 1m1s
Tests / test (3.10) (push) Failing after 1m0s
Tests / test (3.11) (push) Successful in 59s
Tests / test (3.12) (push) Failing after 1m9s
Tests / test (3.9) (push) Successful in 1m0s
2025-01-28 15:50:59 +02:00
37087787ee Merge pull request 'Update dependency twine to ~=6.1.0' (#76) from renovate/twine-6.x into dev
Some checks failed
Tests / test (3.10) (push) Successful in 1m29s
Tests / test (3.11) (push) Successful in 1m23s
Tests / test (3.12) (push) Successful in 1m37s
Tests / test (3.9) (push) Failing after 10m46s
Reviewed-on: #76
2025-01-21 22:03:21 +02:00
2ac646e7c0 Update dependency twine to ~=6.1.0
Some checks failed
Tests / test (3.10) (pull_request) Successful in 1m24s
Tests / test (3.11) (pull_request) Successful in 1m26s
Tests / test (3.12) (pull_request) Failing after 1m30s
Tests / test (3.9) (pull_request) Successful in 1m24s
2025-01-21 21:37:44 +02:00
a03a55e716 Update dependency tox to v4.24.1
Some checks failed
Tests / test (3.10) (pull_request) Successful in 1m25s
Tests / test (3.11) (pull_request) Successful in 1m24s
Tests / test (3.12) (pull_request) Successful in 1m30s
Tests / test (3.9) (pull_request) Successful in 1m23s
Tests / test (3.10) (push) Failing after 1m27s
Tests / test (3.11) (push) Failing after 1m24s
Tests / test (3.12) (push) Successful in 1m32s
Tests / test (3.9) (push) Failing after 1m25s
2025-01-21 21:37:40 +02:00
baad9bb83c Merge pull request 'Update dependency tox to v4.24.0' (#74) from renovate/tox-4.x into dev
All checks were successful
Tests / test (3.12) (push) Successful in 1m33s
Tests / test (3.9) (push) Successful in 1m27s
Tests / test (3.10) (push) Successful in 1m26s
Tests / test (3.11) (push) Successful in 1m27s
Reviewed-on: #74
2025-01-21 21:01:38 +02:00
f981deea66 Update dependency tox to v4.24.0
All checks were successful
Tests / test (3.11) (pull_request) Successful in 1m25s
Tests / test (3.12) (pull_request) Successful in 1m31s
Tests / test (3.9) (pull_request) Successful in 1m25s
Tests / test (3.10) (pull_request) Successful in 1m29s
2025-01-21 20:33:18 +02:00
8e4fec6be3 Update dependency pylint to ==3.3.3,<3.4.0
Some checks failed
Tests / test (3.10) (pull_request) Successful in 3m9s
Tests / test (3.11) (pull_request) Successful in 3m8s
Tests / test (3.12) (pull_request) Successful in 3m14s
Tests / test (3.9) (pull_request) Successful in 3m6s
Tests / test (3.10) (push) Successful in 3m7s
Tests / test (3.11) (push) Successful in 3m7s
Tests / test (3.12) (push) Successful in 3m14s
Tests / test (3.9) (push) Failing after 3m7s
2024-12-24 05:27:50 +02:00
393e120069 Update dependency mypy to ~=1.14.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 3m11s
Tests / test (3.11) (pull_request) Successful in 3m9s
Tests / test (3.9) (pull_request) Successful in 3m9s
Tests / test (3.12) (pull_request) Successful in 3m16s
Tests / test (3.10) (push) Successful in 3m13s
Tests / test (3.11) (push) Successful in 3m5s
Tests / test (3.12) (push) Successful in 3m15s
Tests / test (3.9) (push) Successful in 3m7s
2024-12-20 17:48:21 +02:00
7aec10eb58 Update dependency pylint to ==3.3.2,<3.4.0
Some checks failed
Tests / test (3.10) (pull_request) Successful in 3m41s
Tests / test (3.11) (pull_request) Successful in 3m14s
Tests / test (3.12) (pull_request) Successful in 3m20s
Tests / test (3.9) (pull_request) Successful in 3m14s
Tests / test (3.10) (push) Successful in 3m15s
Tests / test (3.11) (push) Failing after 3m14s
Tests / test (3.12) (push) Successful in 3m19s
Tests / test (3.9) (push) Successful in 3m14s
2024-12-01 21:33:07 +02:00
2ce3eb878b Merge pull request 'Update dependency twine to v6' (#70) from renovate/twine-6.x into dev
All checks were successful
Tests / test (3.10) (push) Successful in 3m13s
Tests / test (3.11) (push) Successful in 3m13s
Tests / test (3.12) (push) Successful in 3m18s
Tests / test (3.9) (push) Successful in 3m13s
Reviewed-on: #70
2024-11-30 21:08:39 +02:00
2b37dd2a0c Dropped support for Python 3.8 because of EOL.
All checks were successful
Tests / test (3.11) (push) Successful in 3m10s
Tests / test (3.9) (push) Successful in 3m10s
Tests / test (3.12) (push) Successful in 3m21s
Tests / test (3.10) (push) Successful in 3m11s
2024-11-30 20:04:06 +01:00
0bf4140c5e Update dependency twine to v6
Some checks failed
Tests / test (3.12) (pull_request) Successful in 3m20s
Tests / test (3.8) (pull_request) Failing after 2m45s
Tests / test (3.10) (pull_request) Successful in 3m41s
Tests / test (3.11) (pull_request) Successful in 3m20s
Tests / test (3.9) (pull_request) Successful in 3m14s
2024-11-30 18:27:49 +02:00
a3eb99793e Update dependency pytest-cov to v6
Some checks failed
Tests / test (3.10) (pull_request) Successful in -1m41s
Tests / test (3.11) (pull_request) Successful in -1m41s
Tests / test (3.12) (pull_request) Successful in -1m34s
Tests / test (3.8) (pull_request) Failing after -2m34s
Tests / test (3.9) (pull_request) Successful in -1m44s
Tests / test (3.10) (push) Successful in -1m41s
Tests / test (3.11) (push) Successful in -1m44s
Tests / test (3.12) (push) Successful in -1m36s
Tests / test (3.8) (push) Failing after -2m36s
Tests / test (3.9) (push) Successful in -1m44s
2024-10-29 22:25:23 +02:00
fb4ba9144a Merge pull request 'Update dependency mypy to ~=1.13.0' (#68) from renovate/mypy-1.x into dev
All checks were successful
Tests / test (3.10) (push) Successful in -1m16s
Tests / test (3.11) (push) Successful in -1m15s
Tests / test (3.12) (push) Successful in -1m4s
Tests / test (3.9) (push) Successful in -1m12s
Tests / test (3.8) (push) Successful in -1m15s
Reviewed-on: #68
2024-10-23 02:14:45 +03:00
0fe90e13a8 Update dependency mypy to ~=1.13.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in -1m10s
Tests / test (3.12) (pull_request) Successful in -1m4s
Tests / test (3.8) (pull_request) Successful in -1m14s
Tests / test (3.11) (pull_request) Successful in -1m17s
Tests / test (3.9) (pull_request) Successful in -1m18s
2024-10-23 01:28:51 +03:00
608d3a775c Update dependency tox to v4.23.2
All checks were successful
Tests / test (3.11) (pull_request) Successful in -1m16s
Tests / test (3.8) (pull_request) Successful in -1m13s
Tests / test (3.10) (pull_request) Successful in -1m16s
Tests / test (3.12) (pull_request) Successful in -1m7s
Tests / test (3.9) (pull_request) Successful in -1m16s
Tests / test (3.10) (push) Successful in -1m17s
Tests / test (3.11) (push) Successful in -1m21s
Tests / test (3.12) (push) Successful in -1m7s
Tests / test (3.8) (push) Successful in -1m18s
Tests / test (3.9) (push) Successful in -1m16s
2024-10-22 18:12:10 +03:00
94034a1b1a Merge pull request 'Update dependency tox to v4.23.0' (#66) from renovate/tox-4.x into dev
Some checks failed
Tests / test (3.10) (push) Successful in -53s
Tests / test (3.11) (push) Failing after -58s
Tests / test (3.12) (push) Successful in -45s
Tests / test (3.8) (push) Failing after -57s
Tests / test (3.9) (push) Successful in -56s
Reviewed-on: #66
2024-10-17 09:55:43 +03:00
ed735fa605 Update dependency tox to v4.23.0
All checks were successful
Tests / test (3.11) (pull_request) Successful in -56s
Tests / test (3.12) (pull_request) Successful in -40s
Tests / test (3.8) (pull_request) Successful in -48s
Tests / test (3.9) (pull_request) Successful in -54s
Tests / test (3.10) (pull_request) Successful in -54s
2024-10-17 07:40:09 +03:00
5699a7ce86 Update dependency tox to v4.22.0
Some checks failed
Tests / test (3.10) (pull_request) Successful in -44s
Tests / test (3.11) (pull_request) Successful in -45s
Tests / test (3.12) (pull_request) Successful in -32s
Tests / test (3.8) (pull_request) Successful in -43s
Tests / test (3.9) (pull_request) Successful in -41s
Tests / test (3.10) (push) Failing after -45s
Tests / test (3.11) (push) Successful in -46s
Tests / test (3.12) (push) Successful in -35s
Tests / test (3.8) (push) Successful in -47s
Tests / test (3.9) (push) Failing after -45s
2024-10-15 22:29:54 +03:00
87d24f3da1 Update dependency mypy to ~=1.12.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in -40s
Tests / test (3.11) (pull_request) Successful in -45s
Tests / test (3.12) (pull_request) Successful in -32s
Tests / test (3.8) (pull_request) Successful in -45s
Tests / test (3.9) (pull_request) Successful in -43s
Tests / test (3.10) (push) Successful in -42s
Tests / test (3.11) (push) Successful in -44s
Tests / test (3.12) (push) Successful in -34s
Tests / test (3.8) (push) Successful in -44s
Tests / test (3.9) (push) Successful in -45s
2024-10-14 15:22:03 +03:00
b64b02b6b4 Update dependency xmltodict to ~=0.14.0
Some checks failed
Tests / test (3.10) (pull_request) Successful in 2s
Tests / test (3.11) (pull_request) Successful in -26s
Tests / test (3.12) (pull_request) Failing after -16s
Tests / test (3.8) (pull_request) Successful in -30s
Tests / test (3.9) (pull_request) Successful in -31s
Tests / test (3.10) (push) Successful in -26s
Tests / test (3.11) (push) Successful in -34s
Tests / test (3.12) (push) Successful in -23s
Tests / test (3.8) (push) Successful in -32s
Tests / test (3.9) (push) Successful in -26s
2024-10-08 22:46:23 +03:00
4a376d0522 Update dependency isodate to ~=0.7.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in -28s
Tests / test (3.11) (pull_request) Successful in -27s
Tests / test (3.12) (pull_request) Successful in -13s
Tests / test (3.8) (pull_request) Successful in -24s
Tests / test (3.9) (pull_request) Successful in -23s
Tests / test (3.10) (push) Successful in -22s
Tests / test (3.11) (push) Successful in -27s
Tests / test (3.12) (push) Successful in -22s
Tests / test (3.8) (push) Successful in -29s
Tests / test (3.9) (push) Successful in -29s
2024-10-08 06:04:32 +03:00
52b86c257d revert 0e89fd0350
All checks were successful
Tests / test (3.10) (push) Successful in -27s
Tests / test (3.11) (push) Successful in -20s
Tests / test (3.12) (push) Successful in -14s
Tests / test (3.8) (push) Successful in -26s
Tests / test (3.9) (push) Successful in -25s
revert Update dependency pylint to ==3.3.1,<3.4.0
2024-10-07 14:21:38 +03:00
0e89fd0350 Update dependency pylint to ==3.3.1,<3.4.0
Some checks failed
Tests / test (3.10) (pull_request) Successful in -21s
Tests / test (3.11) (pull_request) Successful in -21s
Tests / test (3.12) (pull_request) Successful in -15s
Tests / test (3.8) (pull_request) Failing after -1m11s
Tests / test (3.9) (pull_request) Successful in -26s
Tests / test (3.10) (push) Successful in -26s
Tests / test (3.11) (push) Successful in -30s
Tests / test (3.12) (push) Successful in -20s
Tests / test (3.8) (push) Failing after -1m10s
Tests / test (3.9) (push) Successful in -29s
2024-10-07 14:04:03 +03:00
b507a70615 Merge pull request 'Update dependency tox to v4.21.2' (#58) from renovate/tox-4.x into dev
All checks were successful
Tests / test (3.11) (push) Successful in -19s
Tests / test (3.12) (push) Successful in -13s
Tests / test (3.8) (push) Successful in -24s
Tests / test (3.9) (push) Successful in -22s
Tests / test (3.10) (push) Successful in -28s
Reviewed-on: #58
2024-10-07 13:47:40 +03:00
a0b9d2a6da revert f04733c0
All checks were successful
Tests / test (3.10) (push) Successful in -20s
Tests / test (3.11) (push) Successful in -24s
Tests / test (3.12) (push) Successful in -19s
Tests / test (3.8) (push) Successful in -25s
Tests / test (3.9) (push) Successful in -28s
2024-10-07 13:36:11 +03:00
1d78e6c55e Update dependency tox to v4.21.2
Some checks failed
Tests / test (3.11) (pull_request) Successful in -15s
Tests / test (3.12) (pull_request) Successful in -5s
Tests / test (3.9) (pull_request) Successful in -15s
Tests / test (3.10) (pull_request) Successful in -21s
Tests / test (3.8) (pull_request) Failing after -1m9s
2024-10-06 22:23:08 +03:00
affb4007e4 Update dependency build to v1.2.2.post1
Some checks failed
Tests / test (3.10) (pull_request) Successful in -13s
Tests / test (3.11) (pull_request) Successful in -20s
Tests / test (3.12) (pull_request) Successful in -3s
Tests / test (3.8) (pull_request) Failing after -1m6s
Tests / test (3.9) (pull_request) Successful in -13s
Tests / test (3.10) (push) Successful in -11s
Tests / test (3.11) (push) Successful in -16s
Tests / test (3.12) (push) Failing after -3s
Tests / test (3.8) (push) Failing after -1m4s
Tests / test (3.9) (push) Failing after -11s
2024-10-06 21:20:00 +03:00
c8b42ce818 Merge pull request 'Update dependency tox to v4.21.0' (#57) from renovate/tox-4.x into dev
Some checks failed
Tests / test (3.10) (push) Successful in 45s
Tests / test (3.11) (push) Successful in 9s
Tests / test (3.12) (push) Successful in 14s
Tests / test (3.8) (push) Failing after -46s
Tests / test (3.9) (push) Successful in 4s
Reviewed-on: #57
2024-10-01 23:12:54 +03:00
f23beec5ad Update dependency tox to v4.21.0
Some checks failed
Tests / test (3.10) (pull_request) Successful in 11s
Tests / test (3.11) (pull_request) Successful in 1s
Tests / test (3.12) (pull_request) Successful in 12s
Tests / test (3.8) (pull_request) Failing after -41s
Tests / test (3.9) (pull_request) Successful in 7s
2024-10-01 07:40:01 +03:00
87841b4037 Update dependency pylint to v3.3.1
Some checks failed
Tests / test (3.10) (pull_request) Failing after 34s
Tests / test (3.11) (pull_request) Successful in 34s
Tests / test (3.12) (pull_request) Failing after 46s
Tests / test (3.8) (pull_request) Failing after -15s
Tests / test (3.9) (pull_request) Successful in 32s
Tests / test (3.10) (push) Failing after 35s
Tests / test (3.11) (push) Successful in 31s
Tests / test (3.12) (push) Failing after 40s
Tests / test (3.8) (push) Failing after -15s
Tests / test (3.9) (push) Successful in 35s
2024-09-24 15:11:43 +03:00
f04733c093 Update dependency pylint to v3.3.0
Some checks failed
Tests / test (3.10) (pull_request) Successful in 48s
Tests / test (3.11) (pull_request) Failing after 47s
Tests / test (3.12) (pull_request) Failing after 58s
Tests / test (3.8) (pull_request) Failing after -2s
Tests / test (3.9) (pull_request) Successful in 48s
Tests / test (3.10) (push) Failing after 46s
Tests / test (3.11) (push) Failing after 47s
Tests / test (3.12) (push) Successful in 52s
Tests / test (3.8) (push) Failing after 0s
Tests / test (3.9) (push) Failing after 44s
2024-09-20 16:22:59 +03:00
4412dd133c Merge pull request 'Update dependency tox to v4.20.0' (#54) from renovate/tox-4.x into dev
All checks were successful
Tests / test (3.10) (push) Successful in 53s
Tests / test (3.11) (push) Successful in 53s
Tests / test (3.8) (push) Successful in 49s
Tests / test (3.9) (push) Successful in 54s
Tests / test (3.12) (push) Successful in 57s
Reviewed-on: #54
2024-09-19 23:10:15 +03:00
e3a8e385b9 Merge branch 'dev' into renovate/tox-4.x
All checks were successful
Tests / test (3.10) (pull_request) Successful in 49s
Tests / test (3.11) (pull_request) Successful in 48s
Tests / test (3.12) (pull_request) Successful in 57s
Tests / test (3.8) (pull_request) Successful in 46s
Tests / test (3.9) (pull_request) Successful in 52s
2024-09-19 23:10:05 +03:00
dfb472a4e8 Possibly fixed false positives on exception detection
All checks were successful
Tests / test (3.10) (push) Successful in 48s
Tests / test (3.11) (push) Successful in 46s
Tests / test (3.12) (push) Successful in 56s
Tests / test (3.8) (push) Successful in 47s
Tests / test (3.9) (push) Successful in 50s
2024-09-19 22:03:57 +02:00
c06d90b7ce Fixed unavailable Message attributes 2024-09-19 22:03:23 +02:00
9e12b53c3b Trip.duration and Trip.real_time_duration are now nullable 2024-09-19 22:03:02 +02:00
19971e6e71 Fixed a rare bug with locals() being changed during iteration 2024-09-19 21:56:24 +02:00
5f30c68edb Update dependency tox to v4.20.0
Some checks failed
Tests / test (3.10) (pull_request) Successful in 1m44s
Tests / test (3.12) (pull_request) Successful in 1m14s
Tests / test (3.8) (pull_request) Successful in 55s
Tests / test (3.11) (pull_request) Failing after 50s
Tests / test (3.9) (pull_request) Failing after 55s
2024-09-19 06:56:49 +03:00
956c4c30ea Added handling for SVC_PARAM error
Some checks failed
Tests / test (3.10) (push) Successful in 1s
Tests / test (3.11) (push) Successful in 0s
Tests / test (3.12) (push) Failing after 7s
Tests / test (3.8) (push) Successful in -2s
Tests / test (3.9) (push) Successful in -4s
2024-09-15 00:55:16 +02:00
c70982755d Improved and cleaned up imports 2024-09-15 00:54:56 +02:00
483aae38b3 Added Python 3.12 to testing matrix
All checks were successful
Tests / test (3.10) (push) Successful in 23s
Tests / test (3.11) (push) Successful in 25s
Tests / test (3.12) (push) Successful in 1m4s
Tests / test (3.8) (push) Successful in 23s
Tests / test (3.9) (push) Successful in 21s
2024-09-08 01:58:25 +02:00
387565605e Merge pull request 'v0.4.0' (#53) from dev into master
Reviewed-on: #53
2024-09-08 02:54:11 +03:00
759e6f3703 Updated to 0.4.0
All checks were successful
Tests / test (3.10) (push) Successful in 22s
Tests / test (3.11) (push) Successful in 23s
Tests / test (3.8) (push) Successful in 22s
Tests / test (3.9) (push) Successful in 23s
Tests / test (3.10) (pull_request) Successful in 22s
Tests / test (3.11) (pull_request) Successful in 19s
Tests / test (3.8) (pull_request) Successful in 22s
Tests / test (3.9) (pull_request) Successful in 20s
2024-09-08 01:44:18 +02:00
09d43d3426 Merge branch 'rmv-2.39.1' into dev
All checks were successful
Tests / test (3.10) (push) Successful in 20s
Tests / test (3.11) (push) Successful in 22s
Tests / test (3.8) (push) Successful in 20s
Tests / test (3.9) (push) Successful in 21s
2024-09-08 01:40:22 +02:00
cbcfc8604f Changed testing method for Client.him_search()
All checks were successful
Tests / test (3.10) (pull_request) Successful in 23s
Tests / test (3.11) (pull_request) Successful in 33s
Tests / test (3.8) (pull_request) Successful in 24s
Tests / test (3.9) (pull_request) Successful in 21s
2024-09-08 01:28:18 +02:00
34a601424b Dependencies bumped and .gitignore updated 2024-09-08 01:27:58 +02:00
0096581595 Disabled unused async libraries
Some checks failed
Tests / test (3.10) (pull_request) Successful in 34s
Tests / test (3.11) (pull_request) Successful in 33s
Tests / test (3.8) (pull_request) Successful in 34s
Tests / test (3.9) (pull_request) Failing after 36s
2024-09-08 00:51:21 +02:00
9fd0704156 Merge pull request 'Update dependency tox to v4.18.1' (#50) from renovate/tox-4.x into dev
Some checks failed
Tests / test (3.10) (push) Successful in 39s
Tests / test (3.11) (push) Successful in 37s
Tests / test (3.8) (push) Failing after 33s
Tests / test (3.9) (push) Failing after 37s
Reviewed-on: #50
2024-09-08 01:49:03 +03:00
d29793f064 Merge pull request 'Update dependencies in the branch' (#51) from dev into rmv-2.39.1
Some checks failed
Tests / test (3.10) (pull_request) Successful in 33s
Tests / test (3.11) (pull_request) Successful in 37s
Tests / test (3.8) (pull_request) Failing after 38s
Tests / test (3.9) (pull_request) Failing after 38s
Reviewed-on: #51
2024-09-07 21:34:20 +03:00
34953dd739 Added Python 3.12 support 2024-09-07 20:21:52 +02:00
11eddfab68 Update dependency tox to v4.18.1
All checks were successful
Tests / test (3.10) (pull_request) Successful in 36s
Tests / test (3.11) (pull_request) Successful in 37s
Tests / test (3.8) (pull_request) Successful in 38s
Tests / test (3.9) (pull_request) Successful in 35s
2024-09-07 19:48:59 +03:00
cb5ec2df90 Changed runner's label to ubuntu-latest-de
Some checks failed
Tests / test (3.10) (push) Failing after 35s
Tests / test (3.11) (push) Failing after 1m8s
Tests / test (3.8) (push) Successful in 58s
Tests / test (3.9) (push) Failing after 1m4s
Tests / test (3.10) (pull_request) Failing after 33s
Tests / test (3.11) (pull_request) Failing after 27s
Tests / test (3.8) (pull_request) Failing after 33s
Tests / test (3.9) (pull_request) Failing after 31s
2024-09-07 12:01:27 +03:00
06221ac72c Merge pull request 'Update dependency build to v1.2.2' (#49) from renovate/build-1.x into dev
Some checks failed
Tests / test (3.8) (push) Waiting to run
Tests / test (3.9) (push) Waiting to run
Tests / test (3.10) (push) Failing after 22m41s
Tests / test (3.11) (push) Has been cancelled
Reviewed-on: #49
2024-09-07 11:31:35 +03:00
3284fb8452 Update dependency build to v1.2.2
Some checks failed
Tests / test (3.10) (pull_request) Failing after 22m44s
Tests / test (3.11) (pull_request) Failing after 22m44s
Tests / test (3.8) (pull_request) Failing after 22m44s
Tests / test (3.9) (pull_request) Failing after 22m44s
2024-09-07 00:00:46 +03:00
4b169c1a86 Update dependency pylint to v3.2.7 (#48)
Some checks failed
Tests / test (3.10) (push) Failing after 22m48s
Tests / test (3.11) (push) Failing after 22m44s
Tests / test (3.8) (push) Failing after 22m44s
Tests / test (3.9) (push) Failing after 22m44s
2024-08-31 20:02:52 +03:00
6df5f6993b Update dependency pylint to v3.2.7
Some checks failed
Tests / test (3.10) (pull_request) Failing after 22m44s
Tests / test (3.11) (pull_request) Failing after 22m43s
Tests / test (3.8) (pull_request) Failing after 22m44s
Tests / test (3.9) (pull_request) Failing after 22m46s
2024-08-31 18:06:11 +03:00
8cd447bfa2 Update dependency pytest-asyncio to ~=0.24.0 (#47) 2024-08-22 12:11:55 +03:00
d20a463ba0 Update dependency pytest-asyncio to ~=0.24.0 2024-08-22 11:53:54 +03:00
fa2a70efbf Added PlatformType and PlatformTypeType (for #4) 2024-08-18 22:51:57 +02:00
42adffec7b Update dependency tox to v4.18.0 (#46) 2024-08-13 21:58:08 +03:00
e4574fb42d Update dependency tox to v4.18.0 2024-08-13 20:33:11 +03:00
81a05b194a Merge pull request 'Update dependency tox to v4.17.1' (#45) from renovate/tox-4.x into dev
Reviewed-on: #45
2024-08-08 15:24:48 +03:00
cb6106d486 Update dependency tox to v4.17.1 2024-08-07 21:23:00 +03:00
1d131642eb Merge pull request 'Update dependency tox to v4.17.0' (#44) from renovate/tox-4.x into dev
Reviewed-on: #44
2024-08-06 00:39:34 +03:00
519e083f57 Update dependency tox to v4.17.0 2024-08-05 23:47:05 +03:00
df99e97399 Merge pull request 'Update dependency black to ~=24.8.0' (#43) from renovate/black-24.x into dev
Reviewed-on: #43
2024-08-03 00:58:03 +03:00
92e99fe01a Update dependency black to ~=24.8.0 2024-08-02 21:37:56 +03:00
aa51ddfd70 Update dependency pylint to v3.2.6 (#42) 2024-07-21 23:31:50 +03:00
82d9f703d4 Update dependency pylint to v3.2.6 2024-07-21 23:08:48 +03:00
11a1749623 Update dependency pytest to ~=8.3.1 (#41) 2024-07-20 20:02:10 +03:00
b87e2ea3de Update dependency pytest to ~=8.3.1 2024-07-20 19:40:05 +03:00
2c5472502c Merge pull request 'Update dependency mypy to ~=1.11.0' (#40) from renovate/mypy-1.x into dev
Reviewed-on: #40
2024-07-19 21:42:45 +03:00
fd9199c8ae Update dependency mypy to ~=1.11.0 2024-07-19 21:30:25 +03:00
b8d868efae Update dependency tox to v4.16.0 (#39) 2024-07-03 08:47:52 +03:00
8ebc8d4e59 Update dependency tox to v4.16.0 2024-07-03 07:05:54 +03:00
4cb1a29819 Update dependency pylint to v3.2.5 (#38) 2024-06-28 20:58:42 +03:00
ae565481bc Update dependency pylint to v3.2.5 2024-06-28 17:03:45 +03:00
868060aa35 Merge pull request 'Update dependency pylint to v3.2.4' (#37) from renovate/pylint-3.x into dev
Reviewed-on: #37
2024-06-26 11:54:46 +03:00
beda60e7a8 Update dependency pylint to v3.2.4
Some checks failed
Tests / test (3.10) (pull_request) Failing after 15s
Tests / test (3.11) (pull_request) Failing after 13s
Tests / test (3.8) (pull_request) Failing after 13s
Tests / test (3.9) (pull_request) Failing after 14s
2024-06-26 11:26:50 +03:00
dd1b8d2595 Update dependency types-aiofiles to v24 (#36)
Some checks failed
Tests / test (3.10) (push) Failing after 15s
Tests / test (3.11) (push) Failing after 14s
Tests / test (3.8) (push) Failing after 14s
Tests / test (3.9) (push) Failing after 14s
2024-06-26 08:26:06 +03:00
3531486ee6 Update dependency types-aiofiles to v24
Some checks failed
Tests / test (3.10) (pull_request) Failing after 14s
Tests / test (3.11) (pull_request) Failing after 14s
Tests / test (3.8) (pull_request) Failing after 13s
Tests / test (3.9) (pull_request) Failing after 14s
2024-06-26 06:08:23 +03:00
cb01e17df4 Merge pull request 'Update dependency pylint to v3.2.3' (#35) from renovate/pylint-3.x into dev
Some checks failed
Tests / test (3.10) (push) Failing after 22m49s
Tests / test (3.8) (push) Has been cancelled
Tests / test (3.9) (push) Has been cancelled
Tests / test (3.11) (push) Has been cancelled
Reviewed-on: #35
2024-06-06 21:47:33 +03:00
a3ef49b9a1 Update dependency pylint to v3.2.3
Some checks failed
Tests / test (3.10) (pull_request) Failing after 22m48s
Tests / test (3.11) (pull_request) Failing after 22m47s
Tests / test (3.8) (pull_request) Failing after 22m50s
Tests / test (3.9) (pull_request) Failing after 23m6s
2024-06-06 18:02:45 +03:00
11c47d498c Update dependency tox to v4.15.1 (#34)
Some checks failed
Tests / test (3.10) (push) Failing after 22m59s
Tests / test (3.11) (push) Failing after 22m45s
Tests / test (3.8) (push) Failing after 22m50s
Tests / test (3.9) (push) Failing after 22m49s
2024-06-06 08:11:41 +03:00
3acf96884e Update dependency tox to v4.15.1
Some checks failed
Tests / test (3.10) (pull_request) Failing after 22m49s
Tests / test (3.11) (pull_request) Failing after 22m48s
Tests / test (3.8) (pull_request) Failing after 22m50s
Tests / test (3.9) (pull_request) Failing after 22m52s
2024-06-06 04:19:04 +03:00
8c283f741e Merge pull request 'Update dependency pylint to v3.2.2' (#32) from renovate/pylint-3.x into dev
Some checks failed
Tests / test (3.11) (push) Has been cancelled
Tests / test (3.8) (push) Has been cancelled
Tests / test (3.9) (push) Has been cancelled
Tests / test (3.10) (push) Has been cancelled
Reviewed-on: #32
2024-05-20 19:59:44 +03:00
2525f8d33e Update dependency requests to ~=2.32.0 (#33)
Some checks are pending
Tests / test (3.10) (push) Waiting to run
Tests / test (3.11) (push) Waiting to run
Tests / test (3.8) (push) Waiting to run
Tests / test (3.9) (push) Waiting to run
2024-05-20 19:52:11 +03:00
cbc705ae8e Update dependency requests to ~=2.32.0
Some checks failed
Tests / test (3.8) (pull_request) Has been cancelled
Tests / test (3.9) (pull_request) Has been cancelled
Tests / test (3.11) (pull_request) Has been cancelled
Tests / test (3.10) (pull_request) Has been cancelled
2024-05-20 19:36:23 +03:00
f5daf31f39 Update dependency pylint to v3.2.2
Some checks failed
Tests / test (3.10) (pull_request) Failing after 22m50s
Tests / test (3.11) (pull_request) Failing after 22m56s
Tests / test (3.8) (pull_request) Failing after 22m48s
Tests / test (3.9) (pull_request) Failing after 22m49s
2024-05-20 11:11:30 +03:00
9d49b1b0c8 Fixed wrong license attribute
Some checks failed
Tests / test (3.10) (push) Failing after 22m50s
Tests / test (3.11) (push) Failing after 22m51s
Tests / test (3.9) (push) Has been cancelled
Tests / test (3.8) (push) Has been cancelled
2024-05-19 14:18:41 +02:00
104f73afa4 Merge pull request 'Update dependency twine to ~=5.1.0' (#30) from renovate/twine-5.x into dev
Some checks failed
Tests / test (3.11) (push) Has been cancelled
Tests / test (3.8) (push) Has been cancelled
Tests / test (3.9) (push) Has been cancelled
Tests / test (3.10) (push) Has been cancelled
Reviewed-on: #30
2024-05-19 12:07:29 +03:00
aada32f5db Merge pull request 'Update dependency pylint to v3.2.1' (#31) from renovate/pylint-3.x into dev
Some checks failed
Tests / test (3.11) (push) Has been cancelled
Tests / test (3.8) (push) Has been cancelled
Tests / test (3.9) (push) Has been cancelled
Tests / test (3.10) (push) Has been cancelled
Reviewed-on: #31
2024-05-19 12:06:09 +03:00
7c5a56bb0a Update dependency pylint to v3.2.1
Some checks failed
Tests / test (3.10) (pull_request) Failing after 22m48s
Tests / test (3.11) (pull_request) Failing after 22m48s
Tests / test (3.8) (pull_request) Failing after 22m50s
Tests / test (3.9) (pull_request) Failing after 22m49s
2024-05-18 20:18:37 +03:00
60b0a44454 Update dependency twine to ~=5.1.0
Some checks failed
Tests / test (3.10) (pull_request) Failing after 23m11s
Tests / test (3.11) (pull_request) Failing after 22m48s
Tests / test (3.8) (pull_request) Failing after 23m13s
Tests / test (3.9) (pull_request) Failing after 22m50s
2024-05-16 17:09:45 +03:00
7270475220 Update dependency types-ujson to ~=5.10.0.20240515 (#29)
Some checks failed
Tests / test (3.10) (push) Has been cancelled
Tests / test (3.11) (push) Has been cancelled
Tests / test (3.8) (push) Has been cancelled
Tests / test (3.9) (push) Has been cancelled
2024-05-15 07:00:58 +03:00
86e233994e Update dependency types-ujson to ~=5.10.0.20240515
Some checks failed
Tests / test (3.10) (pull_request) Failing after 22m47s
Tests / test (3.11) (pull_request) Failing after 23m4s
Tests / test (3.8) (pull_request) Failing after 22m48s
Tests / test (3.9) (pull_request) Has been cancelled
2024-05-15 05:42:13 +03:00
9a2c008cbc Merge pull request 'Update dependency ujson to ~=5.10.0' (#27) from renovate/ujson-5.x into dev
Some checks failed
Tests / test (3.10) (push) Waiting to run
Tests / test (3.8) (push) Has been cancelled
Tests / test (3.9) (push) Has been cancelled
Tests / test (3.11) (push) Has been cancelled
Reviewed-on: #27
2024-05-14 23:58:07 +03:00
0c05229534 Merge pull request 'Update dependency pylint to v3.2.0' (#28) from renovate/pylint-3.x into dev
Some checks failed
Tests / test (3.11) (push) Waiting to run
Tests / test (3.8) (push) Waiting to run
Tests / test (3.9) (push) Waiting to run
Tests / test (3.10) (push) Has been cancelled
Reviewed-on: #28
2024-05-14 23:57:17 +03:00
72d1d7b6e6 Update dependency pylint to v3.2.0
Some checks failed
Tests / test (3.10) (pull_request) Failing after 22m49s
Tests / test (3.11) (pull_request) Failing after 22m48s
Tests / test (3.8) (pull_request) Failing after 22m48s
Tests / test (3.9) (pull_request) Failing after 22m48s
2024-05-14 15:03:58 +03:00
ed5a81d25e Update dependency ujson to ~=5.10.0
Some checks failed
Tests / test (3.10) (pull_request) Failing after 22m50s
Tests / test (3.11) (pull_request) Failing after 22m50s
Tests / test (3.8) (pull_request) Failing after 22m48s
Tests / test (3.9) (pull_request) Failing after 23m2s
2024-05-14 05:38:38 +03:00
f024c232d5 Merge pull request 'Update dependency pylint to v3.1.1' (#26) from renovate/pylint-3.x into dev
Some checks failed
Tests / test (3.10) (push) Has been cancelled
Tests / test (3.11) (push) Has been cancelled
Tests / test (3.8) (push) Has been cancelled
Tests / test (3.9) (push) Has been cancelled
Reviewed-on: #26
2024-05-13 19:54:44 +03:00
271f9b54d8 Update dependency pylint to v3.1.1
Some checks failed
Tests / test (3.11) (pull_request) Failing after 22m48s
Tests / test (3.8) (pull_request) Failing after 20m41s
Tests / test (3.9) (pull_request) Has been cancelled
Tests / test (3.10) (pull_request) Has been cancelled
2024-05-13 18:08:44 +03:00
73a16c8b13 Merge pull request 'Update dependency pytest to ~=8.2.0' (#25) from renovate/pytest-8.x into dev
Some checks failed
Tests / test (3.10) (push) Failing after 22m50s
Tests / test (3.11) (push) Failing after 22m48s
Tests / test (3.8) (push) Failing after 23m11s
Tests / test (3.9) (push) Failing after 22m48s
Reviewed-on: #25
2024-04-30 18:45:22 +03:00
a125bdb72d Update dependency pytest to ~=8.2.0
Some checks failed
Tests / test (3.10) (pull_request) Failing after 22m48s
Tests / test (3.11) (pull_request) Failing after 22m48s
Tests / test (3.8) (pull_request) Failing after 23m6s
Tests / test (3.9) (pull_request) Failing after 23m1s
2024-04-28 03:27:52 +03:00
736f36dde7 Merge pull request 'Update dependency tox to v4.15.0' (#24) from renovate/tox-4.x into dev
Some checks failed
Tests / test (3.10) (push) Failing after 22m48s
Tests / test (3.11) (push) Failing after 22m48s
Tests / test (3.8) (push) Failing after 23m8s
Tests / test (3.9) (push) Failing after 22m48s
Reviewed-on: #24
2024-04-26 23:48:47 +03:00
e6d6fee14b Update dependency tox to v4.15.0
Some checks failed
Tests / test (3.10) (pull_request) Failing after 22m48s
Tests / test (3.11) (pull_request) Failing after 22m51s
Tests / test (3.8) (pull_request) Failing after 23m38s
Tests / test (3.9) (pull_request) Failing after 23m5s
2024-04-26 22:20:43 +03:00
956b7da3fb Update dependency mypy to ~=1.10.0 (#23)
Some checks failed
Tests / test (3.10) (push) Failing after 22m49s
Tests / test (3.11) (push) Failing after 22m47s
Tests / test (3.8) (push) Failing after 22m49s
Tests / test (3.9) (push) Failing after 22m47s
2024-04-25 17:20:10 +03:00
bc4613dc57 Update dependency mypy to ~=1.10.0
Some checks failed
Tests / test (3.10) (pull_request) Failing after 22m48s
Tests / test (3.11) (pull_request) Failing after 22m48s
Tests / test (3.8) (pull_request) Failing after 22m48s
Tests / test (3.9) (pull_request) Failing after 22m48s
2024-04-24 17:17:26 +03:00
fec87ae13c Merge pull request 'Update dependency black to ~=24.4.0' (#22) from renovate/black-24.x into dev
Some checks failed
Tests / test (3.10) (push) Failing after 23m27s
Tests / test (3.11) (push) Failing after 22m48s
Tests / test (3.8) (push) Failing after 22m48s
Tests / test (3.9) (push) Failing after 22m48s
Reviewed-on: #22
2024-04-12 23:51:39 +03:00
5d155a5485 Update dependency black to ~=24.4.0
Some checks failed
Tests / test (3.10) (pull_request) Failing after 17m3s
Tests / test (3.11) (pull_request) Failing after 22m46s
Tests / test (3.8) (pull_request) Failing after 22m50s
Tests / test (3.9) (pull_request) Failing after 22m50s
2024-04-12 23:30:30 +03:00
483665e8e7 Update dependency build to v1.2.1 (#21)
Some checks failed
Tests / test (3.10) (push) Failing after 23m8s
Tests / test (3.11) (push) Failing after 23m8s
Tests / test (3.8) (push) Failing after 23m8s
Tests / test (3.9) (push) Failing after 23m8s
2024-03-28 19:42:50 +02:00
231003c3c6 Update dependency build to v1.2.1
Some checks failed
Tests / test (3.10) (pull_request) Failing after 23m11s
Tests / test (3.11) (pull_request) Failing after 23m9s
Tests / test (3.8) (pull_request) Failing after 23m10s
Tests / test (3.9) (pull_request) Failing after 23m8s
2024-03-28 17:33:19 +02:00
5b43707aae Merge pull request 'Update dependency ujson to ~=5.9.0' (#15) from renovate/ujson-5.x into dev
Some checks failed
Tests / test (3.10) (push) Failing after 23m10s
Tests / test (3.11) (push) Failing after 23m8s
Tests / test (3.8) (push) Failing after 23m8s
Tests / test (3.9) (push) Failing after 23m8s
Reviewed-on: #15
2024-03-27 12:31:36 +02:00
082c097b91 Merge pull request 'Update dependency types-ujson to ~=5.9.0.0' (#14) from renovate/types-ujson-5.x into dev
Some checks are pending
Tests / test (3.10) (push) Waiting to run
Tests / test (3.11) (push) Waiting to run
Tests / test (3.8) (push) Waiting to run
Tests / test (3.9) (push) Waiting to run
Reviewed-on: #14
2024-03-27 12:31:33 +02:00
d998a5c8d9 Update dependency types-ujson to ~=5.9.0.0
Some checks failed
Tests / test (3.10) (pull_request) Failing after 23m14s
Tests / test (3.11) (pull_request) Failing after 23m14s
Tests / test (3.8) (pull_request) Failing after 23m12s
Tests / test (3.9) (pull_request) Failing after 23m10s
2024-03-27 12:28:12 +02:00
966b80e69b Update the dependencies
Some checks are pending
Tests / test (3.10) (push) Waiting to run
Tests / test (3.11) (push) Waiting to run
Tests / test (3.8) (push) Waiting to run
Tests / test (3.9) (push) Waiting to run
2024-03-27 11:26:48 +01:00
4ef8ef7d7a Merge branch 'dev' into renovate/ujson-5.x
Some checks failed
Tests / test (3.10) (pull_request) Failing after 23m18s
Tests / test (3.11) (pull_request) Failing after 23m26s
Tests / test (3.8) (pull_request) Failing after 23m11s
Tests / test (3.9) (pull_request) Failing after 23m8s
2024-03-27 12:21:49 +02:00
40b4d490b6 Merge pull request 'Update dependency tox to v4.14.2' (#13) from renovate/tox-4.x into dev
Some checks failed
Tests / test (3.11) (push) Waiting to run
Tests / test (3.8) (push) Waiting to run
Tests / test (3.9) (push) Waiting to run
Tests / test (3.10) (push) Has been cancelled
Reviewed-on: #13
2024-03-27 12:21:40 +02:00
3d1df089de Merge pull request 'Update dependency pylint to v3.1.0' (#11) from renovate/pylint-3.x into dev
Some checks failed
Tests / test (3.11) (push) Waiting to run
Tests / test (3.8) (push) Waiting to run
Tests / test (3.9) (push) Waiting to run
Tests / test (3.10) (push) Has been cancelled
Reviewed-on: #11
2024-03-27 12:21:27 +02:00
b5df7aa93b Merge pull request 'Update dependency isort to v5.13.2' (#9) from renovate/isort-5.x into dev
Some checks failed
Tests / test (3.11) (push) Waiting to run
Tests / test (3.8) (push) Waiting to run
Tests / test (3.9) (push) Waiting to run
Tests / test (3.10) (push) Has been cancelled
Reviewed-on: #9
2024-03-27 12:21:11 +02:00
02f3c2409e Merge pull request 'Update dependency black to v23.12.1' (#7) from renovate/black-23.x into dev
Some checks failed
Tests / test (3.11) (push) Waiting to run
Tests / test (3.8) (push) Waiting to run
Tests / test (3.9) (push) Waiting to run
Tests / test (3.10) (push) Has been cancelled
Reviewed-on: #7
2024-03-27 12:21:05 +02:00
b08ace2ba2 Update dependency ujson to ~=5.9.0
Some checks failed
Tests / test (3.10) (pull_request) Failing after 23m11s
Tests / test (3.11) (pull_request) Failing after 23m6s
Tests / test (3.8) (pull_request) Failing after 23m7s
Tests / test (3.9) (pull_request) Failing after 23m10s
2024-03-26 19:40:47 +02:00
2410571581 Update dependency tox to v4.14.2
Some checks failed
Tests / test (3.10) (pull_request) Failing after 23m15s
Tests / test (3.11) (pull_request) Failing after 24m1s
Tests / test (3.8) (pull_request) Failing after 23m10s
Tests / test (3.9) (pull_request) Failing after 23m9s
2024-03-26 18:38:07 +02:00
2dc5f9a5d8 Update dependency pylint to v3.1.0
Some checks failed
Tests / test (3.10) (pull_request) Failing after 23m10s
Tests / test (3.11) (pull_request) Failing after 23m16s
Tests / test (3.8) (pull_request) Failing after 23m8s
Tests / test (3.9) (pull_request) Failing after 23m10s
2024-03-26 17:35:31 +02:00
83aac1cb12 Update dependency isort to v5.13.2
Some checks failed
Tests / test (3.10) (pull_request) Failing after 23m10s
Tests / test (3.11) (pull_request) Failing after 23m8s
Tests / test (3.8) (pull_request) Failing after 23m8s
Tests / test (3.9) (pull_request) Failing after 23m10s
2024-03-26 16:32:59 +02:00
3031a65697 Update dependency black to v23.12.1
Some checks failed
Tests / test (3.10) (pull_request) Failing after 23m10s
Tests / test (3.11) (pull_request) Failing after 23m35s
Tests / test (3.8) (pull_request) Failing after 23m33s
Tests / test (3.9) (pull_request) Failing after 23m10s
2024-03-26 16:32:57 +02:00
ca22cb0cbe Merge pull request 'Update dependency build to v1.1.1' (#8) from renovate/build-1.x into dev
Some checks failed
Tests / test (3.10) (push) Failing after 23m11s
Tests / test (3.11) (push) Failing after 23m16s
Tests / test (3.8) (push) Failing after 23m10s
Tests / test (3.9) (push) Failing after 23m8s
Reviewed-on: #8
2024-03-26 15:36:09 +02:00
2717835ed8 Update dependency build to v1.1.1
Some checks failed
Tests / test (3.11) (pull_request) Has been cancelled
Tests / test (3.8) (pull_request) Has been cancelled
Tests / test (3.9) (pull_request) Has been cancelled
Tests / test (3.10) (pull_request) Has been cancelled
2024-03-26 15:30:27 +02:00
c10f56de27 Merge pull request 'Update dependency types-aiofiles to v23.2.0.20240311' (#6) from renovate/types-aiofiles-23.x into dev
Some checks failed
Tests / test (3.10) (push) Has been cancelled
Tests / test (3.11) (push) Has been cancelled
Tests / test (3.8) (push) Has been cancelled
Tests / test (3.9) (push) Has been cancelled
Reviewed-on: #6
2024-03-26 14:32:30 +02:00
1afa8a6d78 Merge pull request 'Update dependency pytest to v7.4.4' (#5) from renovate/pytest-7.x into dev
Some checks failed
Tests / test (3.11) (push) Waiting to run
Tests / test (3.8) (push) Waiting to run
Tests / test (3.9) (push) Waiting to run
Tests / test (3.10) (push) Has been cancelled
Reviewed-on: #5
2024-03-26 14:32:22 +02:00
0d95d85a8a Update dependency types-aiofiles to v23.2.0.20240311
Some checks failed
Tests / test (3.11) (pull_request) Has been cancelled
Tests / test (3.8) (pull_request) Has been cancelled
Tests / test (3.9) (pull_request) Has been cancelled
Tests / test (3.10) (pull_request) Has been cancelled
2024-03-26 14:28:04 +02:00
f9540d61d6 Update dependency pytest to v7.4.4
Some checks failed
Tests / test (3.11) (pull_request) Has been cancelled
Tests / test (3.8) (pull_request) Has been cancelled
Tests / test (3.9) (pull_request) Has been cancelled
Tests / test (3.10) (pull_request) Has been cancelled
2024-03-26 14:27:59 +02:00
78de092a45 Changed pip_requirements location 2024-03-26 14:26:56 +02:00
860ecadb88 Renovate will use dev branch as a main one 2024-03-26 14:14:35 +02:00
303a534d38 Upgrade to version to 0.4.0-rc.2
Some checks reported warnings
Tests / test (3.11) (push) Has been cancelled
Tests / test (3.8) (push) Has been cancelled
Tests / test (3.9) (push) Has been cancelled
Tests / test (3.10) (push) Has been cancelled
2023-11-27 21:57:48 +01:00
66cb676639 Added pyrmv[speed] with ujson as a speedup 2023-11-27 21:56:57 +01:00
3ee90c7a41 New date and time behavior, improved typing 2023-11-27 21:44:17 +01:00
5690080a6a Version is set to 0.4.0-rc.1
Some checks reported warnings
Tests / test (3.11) (push) Has been cancelled
Tests / test (3.8) (push) Has been cancelled
Tests / test (3.9) (push) Has been cancelled
Tests / test (3.10) (push) Has been cancelled
2023-11-25 14:21:48 +01:00
f7873ac66b Fixed installation methods
Some checks reported warnings
Tests / test (3.11) (push) Has been cancelled
Tests / test (3.8) (push) Has been cancelled
Tests / test (3.9) (push) Has been cancelled
Tests / test (3.10) (push) Has been cancelled
2023-11-25 13:20:00 +01:00
83ae0999ea Documentation prepared and improved
Some checks reported warnings
Tests / test (3.11) (push) Has been cancelled
Tests / test (3.8) (push) Has been cancelled
Tests / test (3.9) (push) Has been cancelled
Tests / test (3.10) (push) Has been cancelled
2023-11-25 13:16:48 +01:00
3656a040f4 Okay, 1.0.0 was an overkill, module is in alpha
Some checks failed
Tests / test (3.10) (push) Failing after 22m55s
Tests / test (3.11) (push) Failing after 22m56s
Tests / test (3.9) (push) Has been cancelled
Tests / test (3.8) (push) Has been cancelled
2023-11-25 12:23:33 +01:00
414f3966da Attempt to temporarily fix #2
Some checks failed
Tests / test (3.10) (push) Failing after 23m0s
Tests / test (3.11) (push) Failing after 22m55s
Tests / test (3.8) (push) Failing after 22m56s
Tests / test (3.9) (push) Failing after 22m54s
2023-11-24 23:52:50 +01:00
efedb2533b WIP: Automatic tests
Some checks failed
Tests / test (3.10) (push) Failing after 18m31s
Tests / test (3.11) (push) Failing after 16m39s
Tests / test (3.8) (push) Failing after 1m15s
Tests / test (3.9) (push) Failing after 14m41s
2023-11-24 13:35:47 +01:00
059c511e05 Removed Client from classes
Some checks failed
Tests / test (3.10) (push) Failing after 5m26s
Tests / test (3.11) (push) Failing after 5m28s
Tests / test (3.8) (push) Failing after 5m25s
Tests / test (3.9) (push) Failing after 5m23s
2023-11-24 12:44:57 +01:00
c4b7197267 Classes restructure
Some checks failed
Tests / test (3.10) (push) Failing after 1m10s
Tests / test (3.11) (push) Failing after 1m7s
Tests / test (3.8) (push) Failing after 1m11s
Tests / test (3.9) (push) Has been cancelled
2023-11-24 12:39:25 +01:00
3a65991257 This commit breaks everything 2023-11-24 12:37:24 +01:00
7b9367c0a7 Changed imports 2023-11-24 12:35:51 +01:00
f31fa65d78 Small refactor and isort+black formatting
Some checks reported warnings
Tests / test (3.11) (push) Has been cancelled
Tests / test (3.8) (push) Has been cancelled
Tests / test (3.9) (push) Has been cancelled
Tests / test (3.10) (push) Has been cancelled
2023-11-24 11:21:02 +01:00
fa4f7b83ec Drop support for Python 3.7 (due to EOL)
Some checks failed
Tests / test (3.10) (push) Failing after 5m30s
Tests / test (3.11) (push) Failing after 5m33s
Tests / test (3.8) (push) Failing after 5m29s
Tests / test (3.9) (push) Failing after 5m29s
2023-11-19 23:47:41 +01:00
b0b874bfc8 env fix
Some checks failed
Tests / test (3.10) (push) Failing after 5m31s
Tests / test (3.11) (push) Failing after 5m34s
Tests / test (3.7) (push) Failing after 39s
Tests / test (3.8) (push) Failing after 5m53s
Tests / test (3.9) (push) Failing after 5m23s
2023-11-19 23:08:09 +01:00
9733557463 Added a few basic tests 2023-11-19 23:05:48 +01:00
9282578788 Structural changes
Some checks failed
Tests / test (3.10) (push) Failing after 1m10s
Tests / test (3.7) (push) Has been cancelled
Tests / test (3.8) (push) Has been cancelled
Tests / test (3.9) (push) Has been cancelled
Tests / test (3.11) (push) Has been cancelled
2023-11-19 22:38:51 +01:00
112 changed files with 2503 additions and 1877 deletions

View File

@@ -0,0 +1,36 @@
name: Tests
on:
push:
branches:
- dev
- main
tags-ignore:
- v*
pull_request:
jobs:
test:
runs-on: ubuntu-latest-de
container: catthehacker/ubuntu:act-latest
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
env:
AGENT_TOOLSDIRECTORY: /opt/hostedtoolcache
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install tox tox-gh-actions
- name: Test with tox
env:
RMV_TOKEN: ${{ secrets.RMV_TOKEN }}
run: tox

16
.gitignore vendored
View File

@@ -154,12 +154,10 @@ cython_debug/
# Custom
.pypirc
tests
test.bat
test_key.json
build.*
cleanup.*
publish.*
publish-release.*
.vscode
.mise.toml
.vscode/
.venv_linux/
.venv_windows/
# Module-related
tests/output/

View File

@@ -3,6 +3,15 @@
"extends": [
"config:base"
],
"baseBranches": [
"dev"
],
"pip_requirements": {
"fileMatch": [
"requirements/.*\\.txt$"
],
"enabled": true
},
"packageRules": [
{
"matchUpdateTypes": [

View File

@@ -1,11 +1,16 @@
# PythonRMV
<h1 align="center">PythonRMV</h1>
<p align="center">
<a href="https://git.end-play.xyz/profitroll/PythonRMV/src/branch/master/LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/License-MIT-blue"></a>
<a href="https://git.end-play.xyz/profitroll/PythonRMV"><img alt="Code style: black" src="https://img.shields.io/badge/code%20style-black-000000.svg"></a>
</p>
Small module that makes your journey with RMV REST API somehow easier. Based fully on official RMV API reference and HAFAS documentation.
## 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)
* Python 3.9+
* git (Only for installation from source)
## Installation
@@ -14,13 +19,11 @@ If you have everything listed in [requirements](#requirements), then let's begin
### Variant 1
1. `python -m pip install pyrmv`
`python -m pip install pyrmv`
### Variant 2
1. `git clone https://git.end-play.xyz/profitroll/PythonRMV.git`
2. `cd PythonRMV`
3. `python setup.py install`
`python -m pip install git+https://git.end-play.xyz/profitroll/PythonRMV.git`
## Usage
@@ -34,7 +37,7 @@ client = pyrmv.Client("AcessId")
origin = client.stop_by_name("Frankfurt Hauptbahnhof", max_number=3)[0]
destination = client.stop_by_coords(50.099613, 8.685449, max_number=3)[0]
# Find a trip by locations got
# Find a trip by locations you got above
trip = client.trip_find(origin_id=origin.id, dest_id=destination.id)
```

71
pyproject.toml Normal file
View File

@@ -0,0 +1,71 @@
[build-system]
requires = ["setuptools>=52.0"]
build-backend = "setuptools.build_meta"
[project]
name = "pyrmv"
dynamic = ["version", "dependencies", "optional-dependencies"]
authors = [{ name = "Profitroll", email = "profitroll@end-play.xyz" }]
maintainers = [{ name = "Profitroll", email = "profitroll@end-play.xyz" }]
description = "Small module that makes your journey with RMV REST API somehow easier."
readme = "README.md"
requires-python = ">=3.9"
license = { text = "MIT" }
classifiers = [
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Software Development :: Libraries :: Python Modules",
"Topic :: Utilities",
]
[project.urls]
Homepage = "https://git.end-play.xyz/profitroll/PythonRMV"
Source = "https://git.end-play.xyz/profitroll/PythonRMV"
Tracker = "https://git.end-play.xyz/profitroll/PythonRMV/issues"
Documentation = "https://git.end-play.xyz/profitroll/PythonRMV/wiki"
[tool.setuptools.dynamic]
version = { attr = "pyrmv.__version__" }
dependencies = { file = "requirements/_.txt" }
[tool.setuptools.dynamic.optional-dependencies]
dev = { file = "requirements/dev.txt" }
dist = { file = "requirements/dist.txt" }
speed = { file = "requirements/speed.txt" }
[tool.setuptools.packages.find]
where = ["src"]
[tool.black]
target-version = ['py39', 'py310', 'py311', 'py312']
line-length = 94
[tool.isort]
profile = "black"
[tool.pytest.ini_options]
minversion = "6.0"
python_files = ["test_*.py"]
pythonpath = "."
testpaths = ["tests"]
[tool.mypy]
namespace_packages = true
install_types = true
strict = true
show_error_codes = true
[tool.pylint.main]
extension-pkg-whitelist = ["ujson"]
py-version = 3.9
[tool.coverage.run]
source = ["pyrmv"]

View File

@@ -1,94 +0,0 @@
from datetime import datetime
from pyrmv.classes.Message import Message
class LineArrival():
def __init__(self, data, client, retrieve_stops: bool = True):
self.journey = client.journey_detail(data["JourneyDetailRef"]["ref"])
self.status = data["JourneyStatus"]
self.messages = []
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")
if ("rtTime" in data) and ("rtDate" in data):
self.time_real_time = datetime.strptime(data["rtTime"], "%H:%M:%S")
self.date_real_time = datetime.strptime(data["rtDate"], "%Y-%m-%d")
self.reachable = data["reachable"]
self.origin = data["origin"]
def __str__(self) -> str:
return f"{self.name} coming from {self.origin} at {self.time.time()} {self.date.date()}"
class LineDeparture():
def __init__(self, data, client, retrieve_stops: bool = True):
self.journey = client.journey_detail(data["JourneyDetailRef"]["ref"])
self.status = data["JourneyStatus"]
self.messages = []
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.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):
self.time_real_time = datetime.strptime(data["rtTime"], "%H:%M:%S")
self.date_real_time = datetime.strptime(data["rtDate"], "%Y-%m-%d")
self.reachable = data["reachable"]
self.direction = data["direction"]
self.direction_flag = data["directionFlag"]
def __str__(self) -> str:
return f"{self.name} heading {self.direction} at {self.time.time()} {self.date.date()}"
class BoardArrival(list):
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, retrieve_stops=retrieve_stops))
def __str__(self) -> str:
lines = []
for line in self:
lines.append(str(line))
return "Arrival board\n" + "\n".join(lines)
class BoardDeparture(list):
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, retrieve_stops=retrieve_stops))
def __str__(self) -> str:
lines = []
for line in self:
lines.append(str(line))
return "Departure board\n" + "\n".join(lines)

View File

@@ -1,11 +0,0 @@
from isodate import parse_duration
class Gis():
"""Gis object."""
def __init__(self, ref: str, route: dict):
self.ref = ref
self.dist = route["dist"]
self.duration = parse_duration(route["durS"])
self.geo = route["dirGeo"]

View File

@@ -1,22 +0,0 @@
from pyrmv.classes.Stop import Stop
from pyrmv.classes.Message import Message
class Journey():
"""Journey object."""
def __init__(self, data: dict):
self.stops = []
self.ref = data["ref"]
self.direction = data["Directions"]["Direction"][0]["value"]
self.direction_flag = data["Directions"]["Direction"][0]["flag"]
self.messages = []
self.stops.extend(Stop(stop) for stop in data["Stops"]["Stop"])
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

@@ -1,43 +0,0 @@
from pyrmv.classes.Gis import Gis
from pyrmv.classes.Message import Message
from pyrmv.classes.Stop import StopTrip
from isodate import parse_duration
class Leg():
"""Trip leg object."""
def __init__(self, data: dict):
self.origin = StopTrip(data["Origin"])
self.destination = StopTrip(data["Destination"])
if "GisRef" in data:
self.gis = Gis(data["GisRef"]["ref"], data["GisRoute"])
else:
self.gis = None
self.index = data["idx"]
self.name = data["name"]
self.type = data["type"]
if "direction" in data:
self.direction = data["direction"]
else:
self.direction = None
self.messages = []
if "Messages" in data:
for message in data["Messages"]["Message"]:
self.messages.append(Message(message))
if "number" in data:
self.number = data["number"]
else:
self.number = None
self.duration = parse_duration(data["duration"])
if "dist" in data:
self.distance = data["dist"]
else:
self.distance = None

View File

@@ -1,84 +0,0 @@
from pyrmv.classes.Stop import Stop
from datetime import datetime
from isodate import parse_duration
class Url():
"""Traffic message channel url object."""
def __init__(self, data: dict) -> None:
self.name = data["name"]
self.url = data["url"]
def __str__(self) -> str:
return f"{self.name}: {self.url}"
class Channel():
"""Traffic message channel object."""
def __init__(self, data: dict) -> None:
self.name = data["name"]
url = []
for link in url:
url.append(Url(link))
self.url = url
self.time_start = datetime.strptime(data["validFromTime"], "%H:%M:%S")
self.date_start = datetime.strptime(data["validFromDate"], "%Y-%m-%d")
self.time_end = datetime.strptime(data["validToTime"], "%H:%M:%S")
self.date_end = datetime.strptime(data["validToDate"], "%Y-%m-%d")
def __str__(self) -> str:
return f"{self.name}: from {self.time_start} {self.date_start} until {self.time_end} {self.date_end}"
class Message():
"""Traffic message object."""
def __init__(self, data: dict) -> None:
self.affected_stops = []
if "affectedStops" in data:
for stop in data["affectedStops"]["StopLocation"]:
self.affected_stops.append(Stop(stop))
if "validFromStop" in data:
self.valid_from_stop = Stop(data["validFromStop"])
else:
self.valid_from_stop = None
if "validToStop" in data:
self.valid_to_stop = Stop(data["validToStop"])
else:
self.valid_to_stop = None
self.channels = []
for channel in data["channel"]:
self.channels.append(Channel(channel))
self.id = data["id"]
self.active = data["act"]
self.head = data["head"]
self.lead = data["lead"]
self.text = data["text"]
self.company = data["company"]
self.category = data["category"]
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")
self.date_start = datetime.strptime(data["sDate"], "%Y-%m-%d")
self.time_end = datetime.strptime(data["eTime"], "%H:%M:%S")
self.date_end = datetime.strptime(data["eDate"], "%Y-%m-%d")
self.date_start_alt = data["altStart"]
self.date_end_alt = data["altEnd"]
self.time_modified = datetime.strptime(data["modTime"], "%H:%M:%S")
self.date_modified = datetime.strptime(data["modDate"], "%Y-%m-%d")
self.daily_start = datetime.strptime(data["dailyStartingAt"], "%H:%M:%S")
self.daily_duration = parse_duration(data["dailyDuration"])
if "baseType" in data:
self.base_type = data["baseType"]
else:
self.base_type = None
def __str__(self) -> str:
return f"{self.base_type} message with priority {self.products} valid from {self.time_start.time()} {self.date_start.date()} until {self.time_end.time()} {self.date_end.date()}: {self.head} - {self.lead}"

View File

@@ -1,54 +0,0 @@
from datetime import datetime
class Stop():
"""Stop object."""
def __init__(self, data: dict):
self.name = data["name"]
self.id = data["id"]
if "extId" in data:
self.ext_id = data["extId"]
else:
self.ext_id = None
if "description" in data:
self.description = data["description"]
else:
self.description = None
self.lon = data["lon"]
self.lat = data["lat"]
if "routeIdx" in data:
self.route_index = data["routeIdx"]
else:
self.route_index = None
if "arrTrack" in data:
self.track_arrival = data["arrTrack"]
else:
self.track_arrival = None
if "depTrack" in data:
self.track_departure = data["depTrack"]
else:
self.track_departure = None
def __str__(self) -> str:
return f"Stop {self.name} at {self.lon}, {self.lat}"
class StopTrip(Stop):
"""Trip stop object. It's like a Stop object, but with a date and time."""
def __init__(self, data: dict):
self.type = data["type"]
self.date = datetime.strptime(data["date"], "%Y-%m-%d")
self.time = datetime.strptime(data["time"], "%H:%M:%S")
super().__init__(data)
def __str__(self) -> str:
return f"Stop {self.name} at {self.lon}, {self.lat} at {self.time.time()} {self.date.date()}"

View File

@@ -1,37 +0,0 @@
from pyrmv.classes.Leg import Leg
from pyrmv.classes.Stop import StopTrip
from isodate import parse_duration
class Trip():
"""Trip object."""
def __init__(self, data: dict):
self.raw_data = data
self.origin = StopTrip(data["Origin"])
self.destination = StopTrip(data["Destination"])
self.legs = []
for leg in data["LegList"]["Leg"]:
self.legs.append(Leg(leg))
self.calculation = data["calculation"]
self.index = data["idx"]
self.id = data["tripId"]
self.ctx_recon = data["ctxRecon"]
self.duration = parse_duration(data["duration"])
if "rtDuration" in data:
self.real_time_duration = parse_duration(data["rtDuration"])
else:
self.real_time_duration = None
self.checksum = data["checksum"]
if "transferCount" in data:
self.transfer_count = data["transferCount"]
else:
self.transfer_count = 0
def __str__(self) -> str:
return f"Trip from {self.origin.name} to {self.destination.name} lasting {self.duration} ({self.real_time_duration}) with {len(self.legs)} legs and {self.transfer_count} transfers"

View File

@@ -1,9 +0,0 @@
from .Board import BoardArrival, BoardDeparture, LineArrival, LineDeparture
from .Gis import Gis
from .Journey import Journey
from .Leg import Leg
from .Message import Message, Channel, Url
from .Stop import Stop, StopTrip
from .Ticket import Ticket
from .Trip import Trip
from .Client import Client

View File

@@ -1,99 +0,0 @@
from requests import get
from datetime import datetime, timedelta
from typing import Union
from xmltodict import parse as xmlparse
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
# 2.25. Arrival Board (arrivalBoard)
def board_arrival(accessId: str,
json: bool = True,
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: Union[int, None] = None,
operators: Union[str, list, None] = None,
lines: Union[str, list, None] = None,
filterEquiv: bool = True,
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:
"""The arrival board can be retrieved by a call to the arrivalBoard service. This method will return the next
arrivals from a given point in time within a duration covered time span. The default duration size is 60 minutes.
Note: The result list always contains all arrivals running the the last minute found even if the requested
maximum was overrun.
Read more about this in section 2.25. "Arrival Board (arrivalBoard)" of HAFAS ReST Documentation.
### Args:
* accessId (str): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
* json (bool, optional): Whether response should be retrieved as JSON. XML is returned if False. Only matters if raw_response is True. Defaults to True.
* id (str, optional): Access ID for identifying the requesting client. Defaults to None.
* extId (str, optional): Deprecated. Please use id as it supports external IDs. Specifies the external station/stop ID for which the arrivals shall be retrieved. Required if id is not present. Such ID can be retrieved from the `stop_by_name` or `stop_by_coords`. Defaults to None.
* direction (str, 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. 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. 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. Seconds will be ignored for requests. By default the current server time is used. Defaults to None.
* duration (int, optional): Set the interval size in minutes. Defaults to 60.
* maxJourneys (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.
* products (int, optional): Decimal value defining the product classes to be included in the search. It represents a bitmask combining bit number of a product as defined in the HAFAS raw data. Defaults to None.
* 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. 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. If the line should not be part of the be trip, negate it by putting ! in front of it. Defaults to None.
* filterEquiv (bool, optional): Use `boardType` instead. Enables/disables the filtering of equivalent marked stops. Defaults to True.
* attributes (Union[str, list], optional): Filter boards by one or more attribute codes of a journey. Multiple attribute as a list or as a string separated by comma. If the attribute should not be part of the result, negate it by putting ! in front of it. Defaults to None.
* platforms (Union[str, list], optional): Filter boards by platform. Multiple platforms provided as a list or as a string separated by comma. Defaults to None.
* passlist (bool, optional): Include a list of all passed waystops. Defaults to False.
* boardType (Literal["ARR", "ARR_EQUIVS", "ARR_MAST", "ARR_STATION"], optional): Set the station arrival board type to be used. 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. Defaults to "ARR".
### Returns:
* dict: Output from RMV. Dict will contain "errorCode" and "errorText" if exception occurs.
"""
if json:
headers = {"Accept": "application/json"}
else:
headers = {"Accept": "application/xml"}
payload = {}
for var, val in locals().items():
if str(var) == "date":
if val != None:
if isinstance(val, datetime):
payload[str(var)] = val.strftime("%Y-%m-%d")
else:
payload[str(var)] = val
elif str(var) == "time":
if val != None:
if isinstance(val, datetime):
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 # type: ignore
else:
payload[str(var)] = val
elif str(var) == "boardType":
if val != None:
payload["type"] = val.upper()
elif str(var) not in ["json", "headers", "payload"]:
if val != None:
payload[str(var)] = val
output = get("https://www.rmv.de/hapi/arrivalBoard", params=payload, headers=headers)
if json:
return output.json()
else:
return xmlparse(output.content)

View File

@@ -1,100 +0,0 @@
from requests import get
from datetime import datetime, timedelta
from typing import Union
from xmltodict import parse as xmlparse
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
# 2.24. Departure Board (departureBoard)
def board_departure(accessId: str,
json: bool = True,
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: Union[int, None] = None,
operators: Union[str, list, None] = None,
lines: Union[str, list, None] = None,
filterEquiv: bool = True,
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:
"""The separture board can be retrieved by a call to the departureBoard service. This method will return the
next departures (or less if not existing) from a given point in time within a duration covered time span. The
default duration size is 60 minutes.
Note: The result list always contains all departures running the the last minute found even if the requested
maximum was overrun.
Read more about this in section 2.24. "Departure Board (departureBoard)" of HAFAS ReST Documentation.
### Args:
* accessId (str): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
* json (bool, optional): Whether response should be retrieved as JSON. XML is returned if False. Only matters if raw_response is True. Defaults to True.
* id (str, optional): Access ID for identifying the requesting client. Defaults to None.
* extId (str, optional): Deprecated. Please use id as it supports external IDs. Specifies the external station/stop ID for which the arrivals shall be retrieved. Required if id is not present. Such ID can be retrieved from the `stop_by_name` or `stop_by_coords`. Defaults to None.
* direction (str, 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. 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. 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. Seconds will be ignored for requests. By default the current server time is used. Defaults to None.
* duration (int, optional): Set the interval size in minutes. Defaults to 60.
* maxJourneys (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.
* products (int, optional): Decimal value defining the product classes to be included in the search. It represents a bitmask combining bit number of a product as defined in the HAFAS raw data. Defaults to None.
* 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. 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. If the line should not be part of the be trip, negate it by putting ! in front of it. Defaults to None.
* filterEquiv (bool, optional): Use `boardType` instead. Enables/disables the filtering of equivalent marked stops. Defaults to True.
* attributes (Union[str, list], optional): Filter boards by one or more attribute codes of a journey. Multiple attribute as a list or as a string separated by comma. If the attribute should not be part of the result, negate it by putting ! in front of it. Defaults to None.
* platforms (Union[str, list], optional): Filter boards by platform. Multiple platforms provided as a list or as a string separated by comma. Defaults to None.
* passlist (bool, optional): Include a list of all passed waystops. Defaults to False.
* boardType (Literal["DEP", "DEP_EQUIVS", "DEP_MAST", "DEP_STATION"], optional): Set the station departure board type to be used. 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. Defaults to "DEP".
### Returns:
* dict: Output from RMV. Dict will contain "errorCode" and "errorText" if exception occurs.
"""
if json:
headers = {"Accept": "application/json"}
else:
headers = {"Accept": "application/xml"}
payload = {}
for var, val in locals().items():
if str(var) == "date":
if val != None:
if isinstance(val, datetime):
payload[str(var)] = val.strftime("%Y-%m-%d")
else:
payload[str(var)] = val
elif str(var) == "time":
if val != None:
if isinstance(val, datetime):
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 # type: ignore
else:
payload[str(var)] = val
elif str(var) == "boardType":
if val != None:
payload["type"] = val.upper()
elif str(var) not in ["json", "headers", "payload"]:
if val != None:
payload[str(var)] = val
output = get("https://www.rmv.de/hapi/departureBoard", params=payload, headers=headers)
if json:
return output.json()
else:
return xmlparse(output.content)

View File

@@ -1,138 +0,0 @@
from requests import get
from typing import OrderedDict, Union
from xmltodict import parse as xmlparse
from datetime import datetime
from pyrmv.utility.weekdays_bitmask import weekdays_bitmask
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
# 2.37. HIM Search (himsearch)
def him_search(accessId: str,
json: bool = True,
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] = 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: 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.
Read more about this in section 2.37. "HIM Search (himsearch)" of HAFAS ReST Documentation.
### Args:
* accessId (str): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
* json (bool, optional): Whether response should be retrieved as JSON. XML is returned if False. Defaults to True.
* dateB (Union[str, datetime], optional): Sets the event period start date. Represented in the format `YYYY-MM-DD`. By default the current server date is used. Defaults to None.
* dateE (Union[str, datetime], optional): Sets the event period end date. Represented in the format `YYYY-MM-DD`. By default the current server date is used. Defaults to None.
* timeB (Union[str, datetime], optional): Sets the event period start time. Represented in the format `hh:mm[:ss]` in 24h nomenclature. Seconds will be ignored for requests. By default the current server time is used. Defaults to None.
* timeE (Union[str, datetime], optional): Sets the event period end time. Represented in the format `hh:mm[:ss]` in 24h nomenclature. Seconds will be ignored for requests. By default the current server time is used. Defaults to None.
* weekdays (Union[str, OrderedDict[str, bool]], optional): Bitmask or an OrderedDict for validity of HIM messages based on weekdays. OrderedDict must be formatted as follows: `OrderedDict(Monday=bool, Tuesday=bool, Wednesday=bool, Thursday=bool, Friday=bool, Saturday=bool, Sunday=bool)`. Each character of a bitmask represents a weekday starting on monday. Example: Only find HIM Messages valid from monday to friday: `1111100`. Defaults to None.
* himIds (Union[str, list], optional): List of HIM message IDs as a list or as a string separated by comma. Defaults to None.
* hierarchicalView (bool, optional): Return parent messages with childs. Defaults to False.
* operators (Union[str, list], optional): List of operators as a list or as a string separated by comma. Defaults to None.
* categories (Union[str, list], optional): List of train categories as a list or as a string separated by comma. Defaults to None.
* channels (Union[str, list], optional): List of channels as a list or as a string separated by comma. Defaults to None.
* companies (Union[str, list], optional): List of companies as a list or as a string separated by comma. Defaults to None.
* lines (Union[str, list], optional): Only HIM messages for the given line are part of the result. To filter multiple lines, separate the codes by comma. Defaults to None.
* lineids (Union[str, list], optional): Only HIM messages for the given line (identified by its line ID) are part of the result. To filter multiple lines, separate the line IDs by comma. Defaults to None.
* stations (Union[str, list], optional): List of (external) station ids to be filtered for as a list or as a string separated by comma. Defaults to None.
* fromstation (str, optional): Filter messages by line segment starting at this station given as (external) station id. Defaults to None.
* tostation (str, optional): Filter messages by line segment travelling in direction of this station given as (external) station id. Defaults to None.
* bothways (bool, optional): If enabled, messages in both directions - from 'fromstation' to 'tostation' as well as from 'tostation' to 'fromstation' are returned. Defaults to None.
* trainnames (Union[str, list], optional): List of train name to be filtered for as a list or as a string separated by comma. Defaults to None.
* metas (Union[str, list], optional): List of predefined filters as a list or as a string separated by comma. Defaults to None.
* himcategory (str, optional): HIM category, e.g. Works and/or Disturbance. Value depends on your HAFAS server data. Defaults to None.
* himtags (Union[str, list], optional): HIM Tags. Value depends on your HAFAS server data. Return HIM messages having these tag(s) only. Multiple values are separated by comma. Note: HIM tags differ from HIM text tags. Defaults to None.
* regions (Union[str, list], optional): Filter for HIM messages based on regions defined in HAFAS raw data. As a list or as a string separated by comma. Available regions can be retrieved by /datainfo service. Defaults to None.
* himtext (Union[str, list], optional): Filter for HIM messages containing the given free text message as a list or as a string separated by comma. Defaults to None.
* himtexttags (Union[str, list], optional): Return HIM texts having this text tag(s) only. Multiple values are separated by comma. Note: HIM text tags differ from HIM tags. Defaults to None.
* additionalfields (Union[str, list, dict], optional): List of additional fields and values to be filtered for. Two filter options are available: Filter by key only: `additionalfields=key` or filter by key and value: `additionalfields={key:value}`. Multiple filters are separated by comma like `additionalfields=[keyA,keyB]` or `additionalfields={key:value}`. Defaults to None.
* poly (bool, optional): Enables/disables returning of geo information for affected edges and regions if available and enabled in the backend. Defaults to False.
* searchmode (Literal["MATCH", "NOMATCH", "TFMATCH"], optional): HIM search mode. `"NOMATCH"` iterate over all HIM messages available. `"MATCH"` iterate over all trips to find HIM messages. `"TFMATCH"` uses filters defined `metas` parameter. Defaults to None.
* affectedJourneyMode (Literal["ALL", "OFF"], optional): Define how to return affected journeys `"OFF"`: do not return affected journeys. `"ALL"`: return affected journeys. Defaults to None.
* affectedJourneyStopMode (Literal["ALL", "IMP", "OFF"], optional): Define how to return stops of affected journeys. `"IMP"`: return important stops of affected journeys. `"OFF"`: do not return stops of affected journeys. `"ALL"`: return all affected stops of affected journeys. Defaults to None.
* orderBy (Union[str, list], optional): Define the Order the returned messages by fields and directions. Multiple, string comma separated or list entries are supported. Read more about this in HAFAS ReST Documentation. Defaults to None.
* minprio (Union[str, int], optional): Filter for HIM messages having at least this priority. Defaults to None.
* maxprio (Union[str, int], optional): Filter for HIM messages having this priority as maximum. Defaults to None.
### Returns:
* dict: Output from RMV. Dict will contain "errorCode" and "errorText" if exception occurs.
"""
if json:
headers = {"Accept": "application/json"}
else:
headers = {"Accept": "application/xml"}
payload = {}
for var, val in locals().items():
if str(var) in ["dateB", "dateE"]:
if val != None:
if isinstance(val, datetime):
payload[str(var)] = val.strftime("%Y-%m-%d")
else:
payload[str(var)] = val
elif str(var) in ["timeB", "timeE"]:
if val != None:
if isinstance(val, datetime):
payload[str(var)] = val.strftime("%H:%M")
else:
payload[str(var)] = val
elif str(var) == "weekdays":
if val != None:
if isinstance(val, OrderedDict):
payload[str(var)] = weekdays_bitmask(val)
else:
payload[str(var)] = val
elif str(var) == "searchmode":
if val != None:
payload["searchmode"] = val.upper()
elif str(var) == "affectedJourneyMode":
if val != None:
payload["affectedJourneyMode"] = val.upper()
elif str(var) == "affectedJourneyStopMode":
if val != None:
payload["affectedJourneyStopMode"] = val.upper()
elif str(var) not in ["json", "headers", "payload"]:
if val != None:
payload[str(var)] = val
output = get("https://www.rmv.de/hapi/himsearch", params=payload, headers=headers)
if json:
return output.json()
else:
return xmlparse(output.content)

View File

@@ -1,72 +0,0 @@
from datetime import datetime
from requests import get
from typing import Union
from xmltodict import parse as xmlparse
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
# 2.26. Journey Detail (journeyDetail)
def journey_detail(accessId: str,
id: str,
json: bool = True,
date: Union[str, datetime, None] = None,
poly: bool = False,
polyEnc: Literal["DLT", "GPA", "N"] = "N",
showPassingPoints: bool = False,
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
identifier is part of a trip or departureBoard response. It contains a list of all stops/stations of this journey
including all departure and arrival times (with real-time data if available) and additional information like
specific attributes about facilities and other texts.
Read more about this in section 2.26. "Journey Detail (journeyDetail)" of HAFAS ReST Documentation.
### Args:
* accessId (str): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
* id (str): Specifies the internal journey id of the journey shall be retrieved. Maximum length 512.
* json (bool, optional): Whether response should be retrieved as JSON. XML is returned if False. Defaults to True.
* date (Union[str, datetime], optional): Day of operation. Represented in the format `YYYY-MM-DD`. By default the current server date is used. Defaults to None.
* poly (bool, optional): Enables/disables the calculation of the polyline for each leg of the trip except any GIS route. Defaults to False.
* polyEnc (Literal["DLT", "GPA", "N"], optional): Defines encoding of the returned polyline. Possible values are "N" (no encoding / compression), "DLT" (delta to the previous coordinate), "GPA" (Google encoded polyline format). Defaults to "N".
* showPassingPoints (bool, optional): Enables/disables the return of stops having no alighting and no boarding in its passlist for each leg of the trip. Defaults to False.
* rtMode (Literal["FULL", "INFOS", "OFF", "REALTIME", "SERVER_DEFAULT"], optional): Set the realtime mode to be used. Read more about this in HAFAS ReST Documentation. Defaults to None.
* fromId (str, optional): Specifies the station/stop ID the partial itinerary shall start from. Defaults to None.
* fromIdx (str, optional): Specifies the station/stop index the partial itinerary shall start from. Defaults to None.
* toId (str, optional): Specifies the station/stop ID the partial itinerary shall end at. Defaults to None.
* toIdx (str, optional): Specifies the station/stop index the partial itinerary shall end at. Defaults to None.
* baim (bool, optional): Enables/disables BAIM search and response. Defaults to False.
### Returns:
* dict: Output from RMV. Dict will contain "errorCode" and "errorText" if exception occurs.
"""
if json:
headers = {"Accept": "application/json"}
else:
headers = {"Accept": "application/xml"}
payload = {}
for var, val in locals().items():
if str(var) == "rtMode":
if val != None:
payload["rtMode"] = val.upper()
elif str(var) not in ["json", "headers", "payload"]:
if val != None:
payload[str(var)] = val
output = get("https://www.rmv.de/hapi/journeyDetail", params=payload, headers=headers)
if json:
return output.json()
else:
return xmlparse(output.content)

View File

@@ -1,72 +0,0 @@
from requests import get
from typing import Union
from xmltodict import parse as xmlparse
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
# 2.4. Location Search by Coordinate (location.nearbystops)
def stop_by_coords(accessId: str,
originCoordLat: Union[str, float],
originCoordLong: Union[str, float],
lang: Literal["de", "da", "en", "es", "fr", "hu", "it", "nl", "no", "pl", "sv", "tr"] = "en",
json: bool = True,
radius: Union[int, float] = 1000,
maxNo: int = 10,
stopType: Literal["S", "P", "SP", "SE", "SPE"] = "S",
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.
Read more about this in section 2.4. "Location Search by Coordinate (location.nearbystops)" of HAFAS ReST Documentation.
### Args:
* accessId (str): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
* originCoordLat (Union[str, float]): Latitude of centre coordinate.
* originCoordLong (Union[str, float]): Longitude of centre coordinate.
* lang (Literal["de","da","en","es","fr","hu","it","nl","no","pl","sv","tr"], optional): The language of response. Defaults to "en".
* json (bool, optional): Whether response should be retrieved as JSON. XML is returned if False. Only matters if raw_response is True. Defaults to True.
* radius (Union[int, float], optional): Search radius in meter around the given coordinate if any. Defaults to 1000.
* maxNo (int, optional): Maximum number of returned stops. Defaults to 10.
* stopType (Literal["S", "P", "SP", "SE", "SPE"], optional): Type filter for location types. Defaults to "S".
* locationSelectionMode (Literal["SLCT_N", "SLCT_A"], optional): Selection mode for locations. Defaults to None.
* products (int, optional): Decimal value defining the product classes to be included in the search. It represents a bitmask combining bit number of a product as defined in the HAFAS raw data. Defaults to None.
* meta (str, optional): Filter by a predefined meta filter. If the rules of the predefined filter should not be negated, put ! in front of it. Defaults to None.
* sattributes (Union[str, list], optional): Filter locations by one or more attribute codes. Multiple attribute codes are separated by comma. If the attribute should not be part of the be location data, negate it by putting ! in front of it. Defaults to None.
* sinfotexts (Union[str, list], optional): Filter locations by one or more station infotext codes and values. Multiple attribute codes are separated by comma the value by pipe |. Defaults to None.
### Returns:
* dict: Output from RMV. Dict will contain "errorCode" and "errorText" if exception occurs.
"""
if json:
headers = {"Accept": "application/json"}
else:
headers = {"Accept": "application/xml"}
payload = {}
for var, val in locals().items():
if str(var) == "stopType":
if val != None:
payload["type"] = val.upper()
elif str(var) == "locationSelectionMode":
if val != None:
payload["locationSelectionMode"] = val.upper()
elif str(var) not in ["json", "headers", "payload", "raw_response"]:
if val != None:
payload[str(var)] = val
output = get("https://www.rmv.de/hapi/location.nearbystops", params=payload, headers=headers)
if json:
return output.json()
else:
return xmlparse(output.content)

View File

@@ -1,86 +0,0 @@
from requests import get
from typing import Union
from xmltodict import parse as xmlparse
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
# 2.3. Location Search by Name (location.name)
def stop_by_name(accessId: str,
inputString: str,
lang: Literal["de", "da", "en", "es", "fr", "hu", "it", "nl", "no", "pl", "sv", "tr"] = "en",
json: bool = True,
maxNo: int = 10,
stopType: Literal["A", "ALL", "AP", "P", "S", "SA", "SP"] = "ALL",
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: 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
of possible matches in the journey planner database. Possible matches might be stops/stations, points of
interest and addresses.
The result is a list of possible matches (locations) where the user might pick one entry to perform a trip
request with this location as origin or destination or to ask for a departure board or arrival board of this
location (stops/stations only).
Read more about this in section 2.3. "Location Search by Name (location.name)" of HAFAS ReST Documentation.
### Args:
* accessId (str): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
* inputString (str): Search for that token.
* lang (Literal["de","da","en","es","fr","hu","it","nl","no","pl","sv","tr"], optional): The language of response. Defaults to "en".
* json (bool, optional): Whether response should be retrieved as JSON. XML is returned if False. Only matters if raw_response is True. Defaults to True.
* maxNo (int, optional): Maximum number of returned stops. In range 1-1000. Defaults to 10.
* stopType (Literal["A", "ALL", "AP", "P", "S", "SA", "SP"], optional): Type filter for location types. Defaults to "ALL".
* locationSelectionMode (str, optional): Selection mode for locations. "SLCT_N": Not selectable, "SLCT_A": Selectable. Defaults to None.
* products (int, optional): Decimal value defining the product classes to be included in the search. It represents a bitmask combining bit number of a product as defined in the HAFAS raw data. Defaults to None.
* coordLat (Union[str, float], optional): Latitude of centre coordinate. Defaults to None.
* coordLong (Union[str, float], optional): Longitude of centre coordinate. Defaults to None.
* radius (Union[int, float], optional): Search radius in meter around the given coordinate if any. Defaults to 1000.
* refineId (str, optional): In case of an refinable location, this value takes the ID of the refinable one of a previous result. Defaults to None.
* meta (str, optional): Filter by a predefined meta filter. If the rules of the predefined filter should not be negated, put ! in front of it. Defaults to None.
* stations (Union[str, list], optional): Filter for stations. Matches if the given value is prefix of any station in the itinerary. Multiple values are separated by comma. Defaults to None.
* sattributes (Union[str, list], optional): Filter locations by one or more attribute codes. Multiple attribute codes are separated by comma. If the attribute should not be part of the be location data, negate it by putting ! in front of it. Defaults to None.
* filterMode (Literal["DIST_PERI", "EXCL_PERI", "SLCT_PERI"], optional): Filter modes for nearby searches. Defaults to "DIST_PERI".
### Returns:
* dict: Output from RMV. Dict will contain "errorCode" and "errorText" if exception occurs.
"""
if json:
headers = {"Accept": "application/json"}
else:
headers = {"Accept": "application/xml"}
payload = {}
for var, val in locals().items():
if str(var) == "inputString":
if val != None:
payload["input"] = val
elif str(var) == "stopType":
if val != None:
payload["type"] = val.upper()
elif str(var) == "filterMode":
if val != None:
payload["filterMode"] = val.upper()
elif str(var) not in ["json", "headers", "payload", "raw_response", "stopType"]:
if val != None:
payload[str(var)] = val
output = get("https://www.rmv.de/hapi/location.name", params=payload, headers=headers)
if json:
return output.json()
else:
return xmlparse(output.content)

View File

@@ -1,254 +0,0 @@
from datetime import datetime
from requests import get
from typing import List, Union
from xmltodict import parse as xmlparse
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
# 2.12. Trip Search (trip)
def trip_find(accessId: str,
lang: Literal["de", "da", "en", "es", "fr", "hu", "it", "nl", "no", "pl", "sv", "tr"] = "en",
json: bool = True,
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: 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: Union[str, None] = None,
viaId: Union[str, None] = None,
viaWaitTime: int = 0,
avoid: Union[str, None] = None,
avoidId: Union[str, None] = None,
viaGis: Union[str, None] = None,
changeTimePercent: int = 100,
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] = None,
time: Union[str, datetime, None] = None,
searchForArrival: bool = False,
numF: Union[int, None] = None,
numB: Union[int, None] = None,
context: Union[str, None] = None,
poly: bool = False,
polyEnc: Literal["DLT", "GPA", "N"] = "N",
passlist: bool = False,
products: Union[int, None] = None,
operators: Union[str, list, None] = None,
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: Union[List[Literal["SW", "EA", "ES", "RA", "CB"]], None] = None,
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] = 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] = 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: Union[str, None] = None,
includeIv: bool = False,
ivOnly: bool = False,
mobilityProfile: Union[str, None] = None,
bikeCarriage: bool = False,
bikeCarriageType: Union[Literal["SINGLEBIKES", "SMALLGROUPS", "LARGEGROUPS"], None] = None,
sleepingCar: bool = False,
couchetteCoach: bool = False,
showPassingPoints: bool = False,
baim: bool = False,
eco: bool = False,
ecoCmp: bool = False,
ecoParams: Union[str, None] = None,
rtMode: Union[Literal["FULL", "INFOS", "OFF", "REALTIME", "SERVER_DEFAULT"], None] = None,
unsharp: bool = False,
trainFilter: Union[str, None] = None,
economic: bool = False,
groupFilter: Union[str, None] = None,
blockingList: Union[str, None] = None,
blockedEdges: Union[str, None] = None,
trainComposition: bool = False,
includeEarlier: bool = False,
withICTAlternatives: bool = False,
tariff: Union[bool, None] = None,
trafficMessages: bool = False,
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
stop/station IDs or coordinates based on addresses and points of interest validated by the location service or
coordinates freely defined by the client.
Read more about this in section 2.12. "Trip Search (trip)" of HAFAS ReST Documentation.
### Args:
* accessId (str): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
* lang (Literal["de","da","en","es","fr","hu","it","nl","no","pl","sv","tr"], optional): The language of response. Defaults to "en".
* json (bool, optional): Whether response should be retrieved as JSON. XML is returned if False. Defaults to True.
* originId (str, optional): Specifies the station/stop ID of the origin for the trip. Such ID can be retrieved from stopByName() or stopByCoords(). Defaults to None.
* originExtId (str, optional): Deprecated. Please use originId as it supports external IDs. Specifies the external station/stop ID of the origin for the trip. Such ID can be retrieved from stopByName() or stopByCoords(). Defaults to None.
* originCoordLat (Union[str, float], optional): Latitude of station/stop coordinate of the trip's origin. The coordinate can be retrieved from stopByName() or stopByCoords(). Defaults to None.
* originCoordLong (Union[str, float], optional): Longitude of station/stop coordinate of the trip's origin. The coordinate can be retrieved from stopByName() or stopByCoords(). Defaults to None.
* originCoordName (str, optional): Name of the trip's origin if coordinate cannot be resolved to an address or poi. Defaults to None.
* destId (str, optional): Specifies the station/stop ID of the destination for the trip. Such ID can be retrieved from stopByName() or stopByCoords(). Defaults to None.
* destExtId (str, optional): Deprecated. Please use destId as it supports external IDs. Specifies the external station/stop ID of the destination for the trip. Such ID can be retrieved from stopByName() or stopByCoords(). Defaults to None.
* destCoordLat (Union[str, float], optional): Latitude of station/stop coordinate of the trip's destination. The coordinate can be retrieved from stopByName() or stopByCoords(). Defaults to None.
* destCoordLong (Union[str, float], optional): Longitude of station/stop coordinate of the trip's destination. The coordinate can be retrieved from stopByName() or stopByCoords(). Defaults to None.
* destCoordName (str, optional): Name of the trip's destination if coordinate cannot be resolved to an address or poi. Defaults to None.
* via (str, optional): Complex structure to provide multiple via points separated by semicolon. This structure is build like this: `viaId|waittime|viastatus|products|direct|sleepingCar|couchetteCoach|attributes`. Read more about this in HAFAS ReST Documentation. Defaults to None.
* viaId (str, optional): ID of a station/stop used as a via for the trip. Specifying a via station forces the trip search to look for trips which must pass through this station. Such ID can be retrieved from stopByName() or stopByCoords(). If `via` is used, `viaId` and `viaWaitTime ` are having no effect. Defaults to None.
* viaWaitTime (int, optional): Defines the waiting time spent at via station in minutes. If `via` is used, `viaId` and `viaWaitTime` are having no effect. Defaults to 0.
* avoid (str, optional): Complex structure to provide multiple points to be avoided separated by semicolon. This structure is build like this: `avoidId|avoidstatus` avoidId: id, extId or altId of the avoid, mandatory avoidstatus: one of NPAVM (do not run through if this is a meta station), NPAVO (do not run through), NCAVM (do not change if this is a meta station), NCAVO (do not change), optional but defaults to NCAVM Example: Just define three avoids by extId: `avoid="801234;801235;801236"`. Defaults to None.
* avoidId (str, optional): ID of a station/stop to be avoided as transfer stop for the trip. Such ID can be retrieved from stopByName() or stopByCoords(). If `avoid` is used, `avoidId` has no effect. Defaults to None.
* viaGis (str, optional): Complex structure to provide multiple GIS via locations separated by semicolon. This structure is build like this: `locationId|locationMode|transportMode|placeType|usageType|mode|durationOfStay`. Read more about this in HAFAS ReST Documentation. Defaults to None.
* changeTimePercent (int, optional): Configures the walking speed when changing from one leg of the journey to the next one. It extends the time required for changes by a specified percentage. A value of 200 doubles the change time as initially calculated by the system. In the response, change time is presented in full minutes. If the calculation based on changeTime-Percent does not result in a full minute, it is rounded using "round half up" method. Defaults to 100.
* minChangeTime (int, optional): Minimum change time at stop in minutes. Defaults to None.
* maxChangeTime (int, optional): Maximum change time at stop in minutes. Defaults to None.
* addChangeTime (int, optional): This amount of minutes is added to the change time at each stop. Defaults to None.
* maxChange (int, optional): Maximum number of changes. In range 0-11. 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`. 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. Seconds will be ignored for requests. By default the current server time is used. Defaults to None.
* searchForArrival (bool, optional): If set, the date and time parameters specify the arrival time for the trip search instead of the departure time. Defaults to False.
* numF (int, optional): Minimum number of trips after the search time. Sum of numF and numB has to be less or equal 6. Read more about this in HAFAS ReST Documentation. In range 1-6. Defaults to None.
* numB (int, optional): Minimum number of trips before the search time. Sum of numF and numB has to be less or equal 6. Read more about this in HAFAS ReST Documentation. In range 0-6. Defaults to None.
* context (str, optional): Defines the starting point for the scroll back or forth operation. Use the scrB value from a previous result to scroll backwards in time and use the scrF value to scroll forth. Defaults to None.
* poly (bool, optional): Enables/disables the calculation of the polyline for each leg of the trip except any GIS route. Defaults to False.
* polyEnc (Literal["DLT", "GPA", "N"], optional): Defines encoding of the returned polyline. Possible values are "N" (no encoding / compression), "DLT" (delta to the previous coordinate), "GPA" (Google encoded polyline format). Defaults to "N".
* passlist (bool, optional): Enables/disables the return of the passlist for each leg of the trip. Defaults to False.
* products (str, optional): Decimal value defining the product classes to be included in the search. It represents a bitmask combining bit number of a product as defined in the HAFAS raw data. Defaults to None.
* operators (Union[str, list], optional): Only trips provided by the given operators are part of the result. 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.
* attributes (Union[str, list], optional): Filter trips by one or more attribute codes of a journey. If the attribute should not be part of the be trip, negate it by putting ! in front of it. Defaults to None.
* sattributes (Union[str, list], optional): Filter trips by one or more station attribute codes of a journey. If the attribute should not be part of the be trip, negate it by putting ! in front of it. Defaults to None.
* fattributes (Union[str, list], optional): Filter trips by one or more footway attribute codes of a journey. If the attribute should not be part of the be trip, negate it by putting ! in front of it. Defaults to None.
* lines (Union[str, list], optional): Only journeys running the given line are part of the result. If the line should not be part of the be trip, negate it by putting ! in front of it. Defaults to None.
* lineids (Union[str, list], optional): Only journeys running the given line (identified by its line ID) are part of the result. If the line should not be part of the be trip, negate it by putting ! in front of it. Defaults to None.
* avoidPaths (List[Literal["SW", "EA", "ES", "RA", "CB"]], optional): Only path not having the given properties will be part of the result. "SW": Stairway; "EA": Elevator; "ES": Escalator; "RA": Ramp; "CB": Convey Belt. Example: Use paths without ramp and stairway: `avoidPaths="SW", "RA"`. Defaults to None.
* originWalk (Union[str, list], optional): Enables/disables using footpaths in the beginning of a trip when searching from an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* originBike (Union[str, list], optional): Enables/disables using bike routes in the beginning of a trip when searching from an address. To fine-tune the minimum and/or maximum distance to the next public transport station or mode change point, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* originCar (Union[str, list], optional): Enables/disables using car in the beginning of a trip when searching from an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* originTaxi (Union[str, list], optional): Enables/disables using taxi rides in the beginning of a trip when searching from an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* originPark (Union[str, list], optional): Enables/disables using Park and Ride in the beginning of a trip when searching from an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* originMeta (Union[str, list], optional): Enables using one or more predefined individual transport meta profile at the beginning of a trip. Defaults to None.
* destWalk (Union[str, list], optional): Enables/disables using footpaths at the end of a trip when searching to an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* destBike (Union[str, list], optional): Enables/disables using bike routes at the end of a trip when searching to an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* destCar (Union[str, list], optional): Enables/disables using car routes at the end of a trip when searching to an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* destTaxi (Union[str, list], optional): Enables/disables using taxi rides at the end of a trip when searching to an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* destPark (Union[str, list], optional): Enables/disables using Park and Ride at the end of a trip when searching to an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* destMeta (Union[str, list], optional): Enables using one or more predefined individual transport meta profile at the end of a trip. Defaults to None.
* totalWalk (Union[str, list], optional): Enables/disables using footpaths for the whole trip. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* totalBike (Union[str, list], optional): Enables/disables using bike routes for the whole trip. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* totalCar (Union[str, list], optional): Enables/disables using car routes for the whole trip. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* totalTaxi (Union[str, list], optional): Enables/disables using taxi rides for the whole trip. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* totalMeta (Union[str, list], optional): Enables using one or more predefined individual transport meta profile for a trip. Defaults to None.
* gisProducts (str, optional): Filter on GIS product, e.g. specific sharing provider. Currently, only exclusion of certain providers is available by adding ! in front of the provider meta code. Defaults to None.
* includeIv (bool, optional): Enables/disables search for individual transport routes. Defaults to False.
* ivOnly (bool, optional): Enables/disables search for individual transport routes only. Defaults to False.
* mobilityProfile (str, optional): Use a predefined filter by its name. The filters are defined in the HAFAS installation. If the filter should be negated, put a ! in front of its name. Defaults to None.
* bikeCarriage (bool, optional): Enables/disables search for trips explicit allowing bike carriage. This will only work in combination with `maxChange=0` as those trips are always meant to be direct connections. Defaults to False.
* bikeCarriageType (Literal["SINGLEBIKES", "SMALLGROUPS", "LARGEGROUPS"], optional): Filter for a specific bike carriage type. Defaults to None.
* sleepingCar (bool, optional): Enables/disables search for trips having sleeping car. This will only work in combination with `maxChange=0` as those trips are always meant to be direct connections. Defaults to False.
* couchetteCoach (bool, optional): Enables/disables search for trips having couchette coach. This will only work in combination with `maxChange=0` as those trips are always meant to be direct connections. Defaults to False.
* showPassingPoints (bool, optional): Enables/disables the return of stops having no alighting and boarding in its passlist for each leg of the trip. Needs passlist enabled. Defaults to False.
* baim (bool, optional): Enables/disables BAIM search and response. Defaults to False.
* eco (bool, optional): Enables/disables eco value calculation. Defaults to False.
* ecoCmp (bool, optional): Enables/disables eco comparison. Defaults to False.
* ecoParams (str, optional): Provide additional eco parameters. Defaults to None.
* rtMode (Literal["FULL", "INFOS", "OFF", "REALTIME", "SERVER_DEFAULT"], optional): Set the realtime mode to be used. Read more about this in HAFAS ReST Documentation. Defaults to None.
* unsharp (bool, optional): Enables/disables unsharp search mode. Read more about this in section 2.12.2.1. "Trip Search (trip)" of HAFAS ReST Documentation. Defaults to False.
* trainFilter (str, optional): Filters a trip search for a certain train. First hit will be taken. Defaults to None.
* economic (bool, optional): Enables/disables economic search mode. Read more about this in section 2.12.2.2. "Trip Search (trip)" of HAFAS ReST Documentation. Defaults to False.
* groupFilter (str, optional): Use a predefined group filter to query for certain modes. Defaults to None.
* blockingList (str, optional): Defines a section of a route of a journey not to be used within the trip search. Each route section is defined by a tuple of the following style: `<train name>|<departure id>|<arrival id>|<departure time>|<arrival time>|<departure date>|<arrival date>` A set of tuples can be separated by semicolon. Defaults to None.
* blockedEdges (str, optional): List of edges within the public transport network that should be excluded from the result. Each edge is defined by a tuple of the following style: `start location ID|end locationID|bidirectional|blockOnlyIfInOutAllowed` A set of tuples can be separated by semicolon. Defaults to None.
* trainComposition (bool, optional): Enables/disables train composition data. Defaults to False.
* includeEarlier (bool, optional): Disables search optimization in relation of duration. Defaults to False.
* withICTAlternatives (bool, optional): Enables/disables the search for alternatives with individualized change times (ICT). Defaults to False.
* tariff (bool, optional): Enables/disables the output of tariff data. The default is configurable via provisioning. Defaults to None.
* trafficMessages (bool, optional): Enables/disables the output of traffic messages. The default is configurable via provisioning. Defaults to False.
* travellerProfileData (str, optional): Traveller profile data. Structure depends on set up. Defaults to None.
* withFreq (bool, optional): Enables/disables the calculation of frequency information. Defaults to True.
### Returns:
* dict: Output from RMV. Dict will contain "errorCode" and "errorText" if exception occurs.
"""
if json:
headers = {"Accept": "application/json"}
else:
headers = {"Accept": "application/xml"}
payload = {}
for var, val in locals().items():
if str(var) == "date":
if val != None:
if isinstance(val, datetime):
payload[str(var)] = val.strftime("%Y-%m-%d")
else:
payload[str(var)] = val
elif str(var) == "time":
if val != None:
if isinstance(val, datetime):
payload[str(var)] = val.strftime("%H:%M")
else:
payload[str(var)] = val
elif str(var) == "rtMode":
if val != None:
payload["rtMode"] = val.upper()
elif str(var) not in ["json", "headers", "payload"]:
if val != None:
payload[str(var)] = val
output = get("https://www.rmv.de/hapi/trip", params=payload, headers=headers)
if json:
return output.json()
else:
return xmlparse(output.content)

View File

@@ -1,108 +0,0 @@
from datetime import datetime
from requests import get
from typing import Union
from xmltodict import parse as xmlparse
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
# 2.17. Reconstruction (recon)
def trip_recon(accessId: str,
ctx: str,
json: bool = True,
poly: bool = False,
polyEnc: Literal["DLT", "GPA", "N"] = "N",
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: Union[Literal["FULL", "INFOS", "OFF", "REALTIME", "SERVER_DEFAULT"], None] = None,
eco: bool = False,
ecoCmp: bool = False,
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
that the underlying data did not change.
Read more about this in section 2.17. "Reconstruction (recon)" of HAFAS ReST Documentation.
### Args:
* accessId (str): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
* ctx (str): Specifies the reconstruction context.
* json (bool, optional): Whether response should be retrieved as JSON. XML is returned if False. Defaults to True.
* poly (bool, optional): Enables/disables the calculation of the polyline for each leg of the trip except any GIS route. Defaults to False.
* polyEnc (Literal["DLT", "GPA", "N"], optional): Defines encoding of the returned polyline. Possible values are "N" (no encoding / compression), "DLT" (delta to the previous coordinate), "GPA" (Google encoded polyline format). Defaults to "N".
* date (Union[str, datetime], optional): Sets the start date for which the departures shall be retrieved. Represented in the format `YYYY-MM-DD`. This parameter will force the ser-vice to reconstruct the trip on that specific date. If the trip is not available on that date, because it does not operate, the error code SVC_NO_RESULT will be returned. Defaults to None.
* useCombinedComparison (bool, optional): Compare based on combined output name - `False`: Compare parameters (category, line, train number) individually. Defaults to None.
* acceptGaps (bool, optional): Accept an incomplete description of the connection (with gaps) i.e. missing walks/transfers. Defaults to None.
* allowDummySections (bool, optional): Allow a partial reconstruction that will not lead to a reconstruction failure if sections are not reconstructable. Instead, for theses inconstructable sections, dummy sections will be created in the result. Defaults to None.
* flagAllNonReachable (bool, optional): Should all non-reachable journeys be flagged (`True`), or only the first one encountered? Defaults to None.
* matchCatStrict (bool, optional): Should the category (Gattung) match exactly? Only applicable if `useCombinedComparison` is `False`. Defaults to None.
* matchIdNonBlank (bool, optional): Should the train identifier (Zugbezeichner) without whitespace match? Defaults to None.
* matchIdStrict (bool, optional): Should the train identifier (Zugbezeichner) match exactly? Defaults to None.
* matchNumStrict (bool, optional): Should the train number (Zugnummer) match exactly? Only applicable if `useCombinedComparison` is `False`. Defaults to None.
* matchRtType (bool, optional): Should the realtime type that journeys are based on (e.g. SOLL, IST, additional, deviation, …) be considered? Defaults to None.
* enableRtFullSearch (bool, optional): By default, the reconstruction request makes one attempt for each journey within the scheduled data. However, the scheduled data may not necessarily reflect basic realtime properties of the journeys therein. In such a case, one may enable a two-step approach which we call "full search", i.e. search for matching journeys in the scheduled data in a first step. If this fails, then search for matching journeys in the realtime data. Defaults to None.
* enableReplacements (bool, optional): If set to true replaces cancelled journeys with their replacement journeys if possible. Defaults to None.
* arrL (int, optional): Lower deviation in minutes within interval [0, 720] indicating "how much earlier than original arrival". Defaults to None.
* arrU (int, optional): Upper deviation in minutes within interval [0, 720] indicating "how much later than original arrival". Defaults to None.
* depL (int, optional): Lower deviation in minutes within interval [0, 720] indicating "how much earlier than original departure". Defaults to None.
* depU (int, optional): Upper deviation in minutes within interval [0, 720] indicating "how much later than original departure". Defaults to None.
* passlist (bool, optional): Enables/disables the return of the passlist for each leg of the trip. Defaults to False.
* showPassingPoints (bool, optional): Enables/disables the return of stops having no alighting and boarding in its passlist for each leg of the trip. Needs passlist parameter enabled. Defaults to False.
* rtMode (Literal["FULL", "INFOS", "OFF", "REALTIME", "SERVER_DEFAULT"], optional): Set the realtime mode to be used. Read more about this in HAFAS ReST Documentation. Defaults to None.
* eco (bool, optional): Enables/disables eco value calculation. Defaults to False.
* ecoCmp (bool, optional): Enables/disables eco comparison. Defaults to False.
* ecoParams (str, optional): Provide additional eco parameters. Values vary. Defaults to None.
* tariff (bool, optional): Enables/disables the output of tariff data. The default is configurable via provisioning. Defaults to None.
* trafficMessages (bool, optional): Enables/disables the output of traffic messages. The default is configurable via provisioning. Defaults to None.
* travellerProfileData (str, optional): Traveller profile data. Structure depends on set up. Defaults to None.
### Returns:
* dict: Output from RMV. Dict will contain "errorCode" and "errorText" if exception occurs.
"""
if json:
headers = {"Accept": "application/json"}
else:
headers = {"Accept": "application/xml"}
payload = {}
for var, val in locals().items():
if str(var) == "date":
if val != None:
if isinstance(val, datetime):
payload[str(var)] = val.strftime("%Y-%m-%d")
else:
payload[str(var)] = val
elif str(var) not in ["json", "headers", "payload"]:
if val != None:
payload[str(var)] = val
output = get("https://www.rmv.de/hapi/recon", params=payload, headers=headers)
if json:
return output.json()
else:
return xmlparse(output.content)

View File

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

3
requirements/_.txt Normal file
View File

@@ -0,0 +1,3 @@
requests~=2.32.3
xmltodict~=0.14.0
isodate~=0.7.0

12
requirements/dev.txt Normal file
View File

@@ -0,0 +1,12 @@
black~=25.1.0
isort==5.13.2
mypy~=1.15.0
pylint==3.3.7,<3.4.0
pytest-cov~=6.1.0
pytest~=8.3.2
tox==4.25.0
types-ujson~=5.10.0.20240515
# Disabled async libraries for now
# types-aiofiles~=24.1.0.20240626
# pytest-asyncio~=0.24.0

2
requirements/dist.txt Normal file
View File

@@ -0,0 +1,2 @@
build==1.2.2.post1
twine~=6.1.0

1
requirements/speed.txt Normal file
View File

@@ -0,0 +1 @@
ujson~=5.10.0

View File

@@ -1,3 +0,0 @@
[metadata]
description_file=README.md
license_files=LICENSE

View File

@@ -1,36 +0,0 @@
from setuptools import setup
setup(
name="pyrmv",
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## 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",
project_urls={
"Bug Tracker": "https://git.end-play.xyz/profitroll/PythonRMV/issues",
"Documentation": "https://git.end-play.xyz/profitroll/PythonRMV/wiki",
"Source Code": "https://git.end-play.xyz/profitroll/PythonRMV.git",
},
packages=[
"pyrmv",
"pyrmv.raw",
"pyrmv.const",
"pyrmv.enums",
"pyrmv.errors",
"pyrmv.utility",
"pyrmv.classes",
],
install_requires=["requests", "xmltodict", "isodate"],
classifiers=[
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Topic :: Software Development :: Libraries :: Python Modules",
"Topic :: Utilities",
],
)

View File

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

View File

@@ -0,0 +1,9 @@
from .board import BoardArrival, BoardDeparture, LineArrival, LineDeparture
from .gis import Gis
from .journey import Journey
from .leg import Leg
from .message import Channel, Message, Url
from .platform_type import PlatformType
from .stop import Stop, StopTrip
from .ticket import Ticket
from .trip import Trip

180
src/pyrmv/classes/board.py Normal file
View File

@@ -0,0 +1,180 @@
from datetime import datetime
from typing import Any, List, Mapping, Union
from ..classes.journey import Journey
from ..classes.message import Message
from ..classes.stop import Stop
from ..utility import ref_upgrade
class LineArrival:
def __init__(
self,
data: Mapping[str, Any],
retrieve_stops: bool = False,
retrieve_journey: bool = False,
client: Union["pyrmv.Client", None] = None,
):
if (retrieve_stops or retrieve_journey) and client is None:
raise KeyError(
"Stops/journey retrieval requested but client argument was not provided."
)
# Upgrade is temporarily used due to RMV API mismatch
# self.journey = client.journey_detail(data["JourneyDetailRef"]["ref"])
self.journey: Union[Journey, None] = (
client.journey_detail(ref_upgrade(data["JourneyDetailRef"]["ref"]))
if retrieve_journey
else None
)
self.status: str = data["JourneyStatus"]
self.messages: List[Message] = []
self.name: str = data["name"]
self.type: str = data["type"]
self.stop_name: str = data["stop"]
self.stop_id: str = data["stopid"]
self.stop_id_ext: Union[str, None] = data.get("stopExtId")
self.stop: Union[Stop, None] = (
client.stop_by_id(self.stop_id) if retrieve_stops else None
)
self.time: datetime = datetime.strptime(
f"{data['date']} {data['time']}", "%Y-%m-%d %H:%M:%S"
)
self.time_real: datetime = (
datetime.strptime(f"{data['rtDate']} {data['rtTime']}", "%Y-%m-%d %H:%M:%S")
if data.get("rtTime") and data.get("rtDate")
else None
)
self.reachable: bool = data["reachable"]
self.origin: Union[str, None] = data.get("origin")
if "Messages" in data:
self.messages.extend(Message(message) for message in data["Messages"]["Message"])
def __str__(self) -> str:
return (
f"{self.name} coming from {self.origin} at {self.time.time()} {self.date.date()}"
)
class LineDeparture:
def __init__(
self,
data: Mapping[str, Any],
retrieve_stops: bool = False,
retrieve_journey: bool = False,
client: Union["pyrmv.Client", None] = None,
):
if (retrieve_stops or retrieve_journey) and client is None:
raise KeyError(
"Stops/journey retrieval requested but client argument was not provided."
)
# Upgrade is temporarily used due to RMV API mismatch
# self.journey = client.journey_detail(data["JourneyDetailRef"]["ref"])
self.journey: Union[Journey, None] = (
client.journey_detail(ref_upgrade(data["JourneyDetailRef"]["ref"]))
if retrieve_journey
else None
)
self.status: str = data["JourneyStatus"]
self.messages: List[Message] = []
self.name: str = data["name"]
self.type: str = data["type"]
self.stop_name: str = data["stop"]
self.stop_id: str = data["stopid"]
self.stop_id_ext: Union[str, None] = data.get("stopExtId")
self.stop: Union[Stop, None] = (
client.stop_by_id(self.stop_id) if retrieve_stops else None
)
self.time: datetime = datetime.strptime(
f"{data['date']} {data['time']}", "%Y-%m-%d %H:%M:%S"
)
self.time_real: datetime = (
datetime.strptime(f"{data['rtDate']} {data['rtTime']}", "%Y-%m-%d %H:%M:%S")
if data.get("rtTime") and data.get("rtDate")
else None
)
self.reachable: bool = data["reachable"]
self.direction: Union[str, None] = data.get("direction")
self.direction_flag: Union[str, None] = data.get("directionFlag")
if "Messages" in data:
self.messages.extend(Message(message) for message in data["Messages"]["Message"])
def __str__(self) -> str:
return (
f"{self.name} heading {self.direction} at {self.time.time()} {self.date.date()}"
)
class BoardArrival(list):
def __init__(
self,
data: Mapping[str, Any],
retrieve_stops: bool = False,
retrieve_journey: bool = False,
client: Union["pyrmv.Client", None] = None,
):
"""Arrival board representation
### Args:
* data (`Mapping[str, Any]`): Dictionary from RMV to be parsed.
* retrieve_stops (`bool`, *optional*): Retrieve `Stop` objects for each line of the board. Defaults to `False`.
* retrieve_journey (`bool`, *optional*): Retrieve `Journey` object for each line of the board. Defaults to `False`.
* client (`Union[Client, None]`, *optional*): Client to be used if `retrieve_stops` or `retrieve_journey` are set to `True`. Defaults to `None`.
"""
super().__init__([])
if "Arrival" not in data:
return
for line in data["Arrival"]:
self.append(
LineArrival(
line,
retrieve_stops=retrieve_stops,
retrieve_journey=retrieve_journey,
client=client,
)
)
def __str__(self) -> str:
return "Arrival board\n" + "\n".join([str(line) for line in self])
class BoardDeparture(list):
def __init__(
self,
data: Mapping[str, Any],
retrieve_stops: bool = False,
retrieve_journey: bool = False,
client: Union["pyrmv.Client", None] = None,
):
"""Departure board representation
### Args:
* data (`Mapping[str, Any]`): Dictionary from RMV to be parsed.
* retrieve_stops (`bool`, *optional*): Retrieve `Stop` objects for each line of the board. Defaults to `False`.
* retrieve_journey (`bool`, *optional*): Retrieve `Journey` object for each line of the board. Defaults to `False`.
* client (`Union[Client, None]`, *optional*): Client to be used if `retrieve_stops` or `retrieve_journey` are set to `True`. Defaults to `None`.
"""
super().__init__([])
if "Departure" not in data:
return
for line in data["Departure"]:
self.append(
LineDeparture(
line,
retrieve_stops=retrieve_stops,
retrieve_journey=retrieve_journey,
client=client,
)
)
def __str__(self) -> str:
return "Departure board\n" + "\n".join([str(line) for line in self])

File diff suppressed because it is too large Load Diff

14
src/pyrmv/classes/gis.py Normal file
View File

@@ -0,0 +1,14 @@
from datetime import timedelta
from typing import Any, Mapping, Union
from isodate import Duration, parse_duration
class Gis:
"""Gis object."""
def __init__(self, ref: str, route: Mapping[str, Any]):
self.ref: str = ref
self.dist: Union[int, None] = route.get("dist")
self.duration: Union[Duration, timedelta] = parse_duration(route["durS"])
self.geo: Union[int, None] = route.get("dirGeo")

View File

@@ -0,0 +1,35 @@
from typing import Any, List, Mapping, Union
from ..classes.message import Message
from ..classes.stop import Stop
from ..utility import ref_upgrade
class Journey:
"""Journey object."""
def __init__(self, data: Mapping[str, Any]):
self.stops: List[Stop] = []
# Upgrade is temporarily used due to RMV API mismatch
# self.ref = data["ref"]
self.ref: str = ref_upgrade(data["ref"])
self.direction: Union[str, None] = (
data["Directions"]["Direction"][0].get("value")
if data["Directions"]["Direction"]
else None
)
self.direction_flag: Union[str, None] = (
data["Directions"]["Direction"][0].get("flag")
if data["Directions"]["Direction"]
else None
)
self.stops.extend(Stop(stop) for stop in data["Stops"]["Stop"])
self.messages: List[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})"

30
src/pyrmv/classes/leg.py Normal file
View File

@@ -0,0 +1,30 @@
from datetime import timedelta
from typing import Any, List, Mapping, Union
from isodate import Duration, parse_duration
from ..classes.gis import Gis
from ..classes.message import Message
from ..classes.stop import StopTrip
class Leg:
"""Trip leg object."""
def __init__(self, data: Mapping[str, Any]):
self.origin: StopTrip = StopTrip(data["Origin"])
self.destination: StopTrip = StopTrip(data["Destination"])
self.gis = (
None if "GisRef" not in data else Gis(data["GisRef"]["ref"], data["GisRoute"])
)
self.messages: List[Message] = []
self.index: Union[int, None] = data.get("idx")
self.name: str = data["name"]
self.type: Union[str, None] = data.get("type")
self.direction: Union[str, None] = data.get("direction")
self.number: Union[str, None] = data.get("number")
self.duration: Union[Duration, timedelta] = parse_duration(data["duration"])
self.distance: Union[int, None] = data.get("dist")
if "Messages" in data:
self.messages.extend(Message(message) for message in data["Messages"]["Message"])

View File

@@ -0,0 +1,111 @@
from datetime import datetime, timedelta
from typing import Any, List, Mapping, Union
from isodate import Duration, parse_duration
from ..classes.stop import Stop
class Url:
"""Traffic message channel url object."""
def __init__(self, data: Mapping[str, Any]) -> None:
self.name: str = data["name"]
self.url: str = data["url"]
def __str__(self) -> str:
return f"{self.name}: {self.url}"
class Channel:
"""Traffic message channel object."""
def __init__(self, data: Mapping[str, Any]) -> None:
self.name: str = data["name"]
url = []
url.extend(Url(link) for link in url)
self.url: List[Url] = url
self.time_start: Union[datetime, None] = (
None
if "validFromDate" not in data
else datetime.strptime(
f"{data['validFromDate']} {data['validFromTime']}", "%Y-%m-%d %H:%M:%S"
)
)
self.time_end: Union[datetime, None] = (
None
if "validToDate" not in data
else datetime.strptime(
f"{data['validToDate']} {data['validToTime']}", "%Y-%m-%d %H:%M:%S"
)
)
def __str__(self) -> str:
return f"{self.name}: from {self.time_start} until {self.time_end}"
class Message:
"""Traffic message object."""
def __init__(self, data: Mapping[str, Any]) -> None:
self.affected_stops: List[Stop] = []
self.valid_from_stop: Union[Stop, None] = (
None if "validFromStop" not in data else Stop(data["validFromStop"])
)
self.valid_to_stop: Union[Stop, None] = (
None if "validToStop" not in data else Stop(data["validToStop"])
)
self.channels: Union[Channel, None] = []
self.channels.extend(Channel(channel) for channel in data["channel"])
self.id: str = data["id"]
self.active: bool = data["act"]
self.head: str = "" if "head" not in data else data["head"]
self.lead: str = "" if "lead" not in data else data["lead"]
self.text: str = "" if "text" not in data else data["text"]
self.company: Union[str, None] = data.get("company")
self.category: Union[str, None] = data.get("category")
self.priority: Union[int, None] = data.get("priority")
self.products: int = data["products"]
self.icon: Mapping[str, Any] = data["icon"]
self.time_start: Union[datetime, None] = (
None
if "validFromDate" not in data or "validFromTime" not in data
else datetime.strptime(
f"{data['validFromDate']} {data['validFromTime']}", "%Y-%m-%d %H:%M:%S"
)
)
self.time_end: Union[datetime, None] = (
None
if "validToDate" not in data or "validToTime" not in data
else datetime.strptime(
f"{data['validToDate']} {data['validToTime']}", "%Y-%m-%d %H:%M:%S"
)
)
self.date_start_alt: Union[str, None] = (
None if "altStart" not in data else data["altStart"]
)
self.date_end_alt: Union[str, None] = None if "altEnd" not in data else data["altEnd"]
self.time_modified: Union[datetime, None] = (
None
if "modDate" not in data or "modTime" not in data
else datetime.strptime(
f"{data['modDate']} {data['modTime']}", "%Y-%m-%d %H:%M:%S"
)
)
self.daily_start: Union[datetime, None] = (
None
if "dailyStartingAt" not in data
else datetime.strptime(data["dailyStartingAt"], "%H:%M:%S")
)
self.daily_duration: Union[Duration, timedelta] = parse_duration(
data["dailyDuration"]
)
self.base_type: Union[str, None] = data.get("baseType")
if "affectedStops" in data:
self.affected_stops.extend(
Stop(stop) for stop in data["affectedStops"]["StopLocation"]
)
def __str__(self) -> str:
return f"{self.base_type} message with priority {self.products} valid from {self.time_start} until {self.time_end}: {self.head} - {self.lead}"

View File

@@ -0,0 +1,17 @@
from typing import Any, Mapping, Union
from ..enums.platform_type_type import PlatformTypeType
class PlatformType:
"""Platform information."""
def __init__(self, data: Mapping[str, Any]):
self.type: PlatformTypeType = (
PlatformTypeType.U if "type" not in data else PlatformTypeType(data.get("type"))
)
self.text: Union[str, None] = data.get("text")
self.hidden: bool = bool(data.get("hidden"))
self.lon: float = data["lon"]
self.lat: float = data["lat"]
self.alt: int = data["alt"]

34
src/pyrmv/classes/stop.py Normal file
View File

@@ -0,0 +1,34 @@
from datetime import datetime
from typing import Union
class Stop:
"""Stop object."""
def __init__(self, data: dict):
self.name: str = data["name"]
self.id: str = data["id"]
self.ext_id: Union[str, None] = data.get("extId")
self.description: Union[str, None] = data.get("description")
self.lon: float = data["lon"]
self.lat: float = data["lat"]
self.route_index: Union[int, None] = data.get("routeIdx")
self.track_arrival: Union[str, None] = data.get("arrTrack")
self.track_departure: Union[str, None] = data.get("depTrack")
def __str__(self) -> str:
return f"Stop {self.name} at {self.lon}, {self.lat}"
class StopTrip(Stop):
"""Trip stop object. It's like a Stop object, but with a date and time."""
def __init__(self, data: dict):
self.type: str = data["type"]
self.time: datetime = datetime.strptime(
f"{data['date']} {data['time']}", "%Y-%m-%d %H:%M:%S"
)
super().__init__(data)
def __str__(self) -> str:
return f"Stop {self.name} at {self.lon}, {self.lat} at {self.time.time()}"

View File

@@ -1,4 +1,4 @@
class Ticket():
class Ticket:
"""
{
"externalContent": {
@@ -44,9 +44,9 @@ class Ticket():
"FreigabeId": "20730",
"Freigabe":"2645, 3670, 5001, 5002, 5003, 5004, 5005, 5006, 5011, 5013, 5015, 5021, 5022, 5023, 5031, 5041, 5042, 5046, 5059, 5100, 5233, 6239, 6626, 6636, 6637, 6639, 6648, 6649, 6650, 6655, 6660, 6664, 6691",
"FreigabeOverview": "Bad Homburg v.d.Höhe;Bad Soden a.Ts.;Eschborn;Friedrichsdorf;Glashütten"
}
}
}
"""
def __init__(self) -> None:
pass
pass

32
src/pyrmv/classes/trip.py Normal file
View File

@@ -0,0 +1,32 @@
from datetime import timedelta
from typing import List, Union
from isodate import Duration, parse_duration
from ..classes.leg import Leg
from ..classes.stop import StopTrip
class Trip:
"""Trip object."""
def __init__(self, data: dict):
self.origin: StopTrip = StopTrip(data["Origin"])
self.destination: StopTrip = StopTrip(data["Destination"])
self.legs: List[Leg] = []
self.legs.extend(Leg(leg) for leg in data["LegList"]["Leg"])
self.calculation: str = data["calculation"]
self.index: int = data["idx"]
self.id: str = data["tripId"]
self.ctx_recon: str = data["ctxRecon"]
self.duration: Union[Duration, timedelta, None] = (
None if "duration" not in data else parse_duration(data["duration"])
)
self.real_time_duration: Union[Duration, timedelta, None] = (
None if "rtDuration" not in data else parse_duration(data["rtDuration"])
)
self.checksum: str = data["checksum"]
self.transfer_count: int = data.get("transferCount", 0)
def __str__(self) -> str:
return f"Trip from {self.origin.name} to {self.destination.name} lasting {self.duration} ({self.real_time_duration}) with {len(self.legs)} legs and {self.transfer_count} transfers"

View File

@@ -0,0 +1 @@
from .product import PRODUCTS

View File

@@ -17,4 +17,4 @@ PRODUCTS: Dict[str, int] = {
"ferry": 256,
"taxi": 512,
"bahn": 1024,
}
}

View File

@@ -1,10 +1,11 @@
from .product import Product
from .rt_mode import RealTimeMode
from .aff_journey_mode import AffectedJourneyMode
from .aff_journey_stop_mode import AffectedJourneyStopMode
from .board_type import BoardArrivalType, BoardDepartureType
from .filter_mode import FilterMode
from .lang import Language
from .location_type import LocationType
from .selection_mode import SelectionMode
from .platform_type_type import PlatformTypeType
from .product import Product
from .rt_mode import RealTimeMode
from .search_mode import SearchMode
from .filter_mode import FilterMode
from .board_type import BoardArrivalType, BoardDepartureType
from .aff_journey_mode import AffectedJourneyMode
from .aff_journey_stop_mode import AffectedJourneyStopMode
from .selection_mode import SelectionMode

View File

@@ -1,6 +1,8 @@
from enum import auto
from .auto_name import AutoName
class AffectedJourneyMode(AutoName):
"""Enumeration used to declare types of HIM search modes."""
@@ -8,4 +10,4 @@ class AffectedJourneyMode(AutoName):
"Return affected journeys."
OFF = auto()
"Do not return affected journeys."
"Do not return affected journeys."

View File

@@ -1,6 +1,8 @@
from enum import auto
from .auto_name import AutoName
class AffectedJourneyStopMode(AutoName):
"""Enumeration used to declare types of affected journey stops return modes."""
@@ -11,4 +13,4 @@ class AffectedJourneyStopMode(AutoName):
"Return important stops of affected journeys."
OFF = auto()
"Do not return stops of affected journeys."
"Do not return stops of affected journeys."

View File

@@ -2,7 +2,9 @@
# https://github.com/pyrogram/pyrogram/blob/master/pyrogram/enums/auto_name.py
from enum import Enum
from pyrmv.const.product import PRODUCTS
from ..const import PRODUCTS
class AutoName(Enum):
def __init__(self, code) -> None:
@@ -14,6 +16,7 @@ class AutoName(Enum):
def __repr__(self):
return f"pyrmv.enums.{self}"
class AutoNameProduct(AutoName):
def __init__(self, code) -> None:
self.code = PRODUCTS[code]
self.code = PRODUCTS[code]

View File

@@ -1,9 +1,11 @@
from enum import auto
from .auto_name import AutoName
class BoardArrivalType(AutoName):
"""Enumeration used to declare types of arrival board.
"""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
@@ -22,9 +24,10 @@ class BoardArrivalType(AutoName):
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.
"""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
@@ -41,4 +44,4 @@ class BoardDepartureType(AutoName):
"Departure board at mast"
DEP_STATION = auto()
"Departure board with all journeys at any masts of the requested station"
"Departure board with all journeys at any masts of the requested station"

View File

@@ -1,9 +1,11 @@
from enum import auto
from .auto_name import AutoName
class FilterMode(AutoName):
"""Enumeration used to declare filters for nearby searches.
"""Enumeration used to declare filters for nearby searches.
* DIST_PERI - Accentuate matches. Matches in the radius are first
* EXCL_PERI - Returns matches inside the radius only
* SLCT_PERI - Matches in the radius are excluded. Returns matches outside the radius only
@@ -16,4 +18,4 @@ class FilterMode(AutoName):
"Returns matches inside the radius only."
SLCT_PERI = auto()
"Matches in the radius are excluded. Returns matches outside the radius only."
"Matches in the radius are excluded. Returns matches outside the radius only."

View File

@@ -1,24 +1,44 @@
from enum import auto
from .auto_name import AutoName
class Language(AutoName):
"""Enumeration used to declare locales as ISO-3166 codes (but only available in HAFAS ones)."""
DE = auto()
"German"
AR = auto()
"Arabic"
CA = auto()
"Catalan, Valencian"
DA = auto()
"Danish"
DE = auto()
"German"
EL = auto()
"Greek"
EN = auto()
"English"
ES = auto()
"Spanish"
FI = auto()
"Finnish"
FR = auto()
"French"
HI = auto()
"Hindi"
HR = auto()
"Croatian"
HU = auto()
"Hungarian"
@@ -34,8 +54,26 @@ class Language(AutoName):
PL = auto()
"Polish"
RU = auto()
"Russian"
SK = auto()
"Slovak"
SL = auto()
"Slovenian"
SV = auto()
"Swedish"
TL = auto()
"Tagalog"
TR = auto()
"Turkish"
"Turkish"
UR = auto()
"Urdu"
ZH = auto()
"Chinese"

View File

@@ -1,9 +1,11 @@
from enum import auto
from .auto_name import AutoName
class LocationType(AutoName):
"""Enumeration used to declare types of location filter.
"""Enumeration used to declare types of location filter.
* S - Search for station/stops only
* A - Search for addresses only
* P - Search for POIs only
@@ -15,7 +17,7 @@ class LocationType(AutoName):
* SPE - Search for stations/stops, POIs and entrypoints
Note that not all location types may be available for a certain methods.
Make sure that selected type is supported by method by looking up
Make sure that selected type is supported by method by looking up
its acceptable types in argument description.
"""
@@ -44,4 +46,4 @@ class LocationType(AutoName):
"Search in all existing location pools"
SPE = auto()
"Search for stations/stops, POIs and entrypoints"
"Search for stations/stops, POIs and entrypoints"

View File

@@ -0,0 +1,51 @@
from enum import Enum, auto
class PlatformTypeType(Enum):
"""Enumeration used to declare types of platform type.
* U - Undefined
* PL - Platform/track at train station
* ST - Stop at bus or tram station
* GA - Terminal/Gate at airport
* PI - Pier if ship or ferry
* SL - Slot/parking space if bike or car
* FL - Floor in buildings or at footpath
* CI - Check-in/entrance
* CO - Check-out/exit
* X - No explicit type
* H - Hide platform information
"""
U = auto()
"Undefined"
PL = auto()
"Platform/track at train station"
ST = auto()
"Stop at bus or tram station"
GA = auto()
"Terminal/Gate at airport"
PI = auto()
"Pier if ship or ferry"
SL = auto()
"Slot/parking space if bike or car"
FL = auto()
"Floor in buildings or at footpath"
CI = auto()
"Check-in/entrance"
CO = auto()
"Check-out/exit"
X = auto()
"No explicit type"
H = auto()
"Hide platform information"

View File

@@ -1,6 +1,8 @@
from enum import auto
from .auto_name import AutoNameProduct
class Product(AutoNameProduct):
"""Enumeration used to declare types of transport."""
@@ -11,7 +13,7 @@ class Product(AutoNameProduct):
"InterCity (commonly abbreviated IC on timetables and tickets) is the classification applied to certain long-distance passenger train services in Europe. Such trains (in contrast to regional, local, or commuter trains) generally call at major stations only."
EC = auto()
"EuroCity, abbreviated as EC, is a cross-border train category within the European inter-city rail network. In contrast to trains allocated to the lower-level \"IC\" (InterCity) category, EC trains are international services that meet 20 criteria covering comfort, speed, food service, and cleanliness."
'EuroCity, abbreviated as EC, is a cross-border train category within the European inter-city rail network. In contrast to trains allocated to the lower-level "IC" (InterCity) category, EC trains are international services that meet 20 criteria covering comfort, speed, food service, and cleanliness.'
R = auto()
"Regional rail, also known as local trains and stopping trains, are passenger rail services that operate between towns and cities. These trains operate with more stops over shorter distances than inter-city rail, but fewer stops and faster service than commuter rail."
@@ -44,4 +46,4 @@ class Product(AutoNameProduct):
"A taxi, also known as a taxicab or simply a cab, is a type of vehicle for hire with a driver, used by a single passenger or small group of passengers, often for a non-shared ride."
BAHN = auto()
"Rail transport (also known as train transport) is a means of transport that transfers passengers and goods on wheeled vehicles running on rails, which are located on tracks. In contrast to road transport, where the vehicles run on a prepared flat surface, rail vehicles (rolling stock) are directionally guided by the tracks on which they run."
"Rail transport (also known as train transport) is a means of transport that transfers passengers and goods on wheeled vehicles running on rails, which are located on tracks. In contrast to road transport, where the vehicles run on a prepared flat surface, rail vehicles (rolling stock) are directionally guided by the tracks on which they run."

View File

@@ -1,6 +1,8 @@
from enum import auto
from .auto_name import AutoName
class RealTimeMode(AutoName):
"""Enumeration used to declare types of real-time traffic."""
@@ -17,4 +19,4 @@ class RealTimeMode(AutoName):
"Search on real-time data: Connections are computed on the basis of real-time data, using planned schedule only whenever no real-time data is available. All connections computed are feasible with respect to the currently known real-time situation. Additional trains (supplied via real-time feed) will be found if these are part of a fast, comfortable, or direct connection (or economic connection, if economic search is activated)."
SERVER_DEFAULT = auto()
"One of the other real-times modes used by default for RMV."
"One of the other real-times modes used by default for RMV."

View File

@@ -1,6 +1,8 @@
from enum import auto
from .auto_name import AutoName
class SearchMode(AutoName):
"""Enumeration used to declare types of HIM search modes."""
@@ -11,4 +13,4 @@ class SearchMode(AutoName):
"Iterate over all HIM messages available."
TFMATCH = auto()
"Uses filters defined `metas` parameter."
"Uses filters defined `metas` parameter."

View File

@@ -1,9 +1,11 @@
from enum import auto
from .auto_name import AutoName
class SelectionMode(AutoName):
"""Enumeration used to declare location selection modes.
* SLCT_A - Selectable
* SLCT_N - Not selectable
"""
@@ -12,4 +14,4 @@ class SelectionMode(AutoName):
"Selectable"
SLCT_N = auto()
"Not selectable"
"Not selectable"

View File

@@ -0,0 +1,7 @@
from .api_errors import *
from .int_errors import *
from .not_ready import *
from .ps_errors import *
from .sot_errors import *
from .svc_errors import *
from .unknown_error import *

View File

@@ -2,32 +2,38 @@ class ApiAuthError(Exception):
"""
Access denied for accessId provided.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class ApiQuotaError(Exception):
"""
Quota exceeded for accessId provided.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class ApiTooManyRequests(Exception):
"""
Too many requests.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class ApiParamError(Exception):
"""Exception raised for errors in the input arguments.
@@ -42,14 +48,16 @@ class ApiParamError(Exception):
super().__init__(self.errorText)
def __str__(self):
return f'{self.errorCode} -> {self.errorText}'
return f"{self.errorCode} -> {self.errorText}"
class ApiFormatError(Exception):
"""
Response format not supported.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
return self.__doc__

View File

@@ -2,28 +2,33 @@ class IntError(Exception):
"""
Internal RMV server error.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class IntGatewayError(Exception):
"""
Communication error with RMV backend systems.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class IntTimeoutError(Exception):
"""
Timeout during service processing.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
return self.__doc__

View File

@@ -2,8 +2,9 @@ class NotReadyYetError(Exception):
"""
This method is not finished yet.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
return self.__doc__

View File

@@ -6,8 +6,9 @@ class PsIncorrectParamError(Exception):
forward/backward from the end/beginning of the
connection.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
return self.__doc__

View File

@@ -2,48 +2,57 @@ class SotAlreadyArrivedError(Exception):
"""
Trip already arrived.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class SotNotStartedError(Exception):
"""
Trip not started.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class SotCancelledError(Exception):
"""
Trip cancelled.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class SotAllTrainsFilteredError(Exception):
"""
All trips filtered.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class SotStayOnTripError(Exception):
"""
No change. Stay on trip.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
return self.__doc__

View File

@@ -12,134 +12,160 @@ class SvcParamError(Exception):
super().__init__(self.errorText)
def __str__(self):
return f'{self.errorCode} -> {self.errorText}'
return f"{self.errorCode} -> {self.errorText}"
class SvcLocationError(Exception):
"""
Location missing or invalid.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class SvcLocationArrivalError(Exception):
"""
Arrival location missing or invalid.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class SvcLocationDepartureError(Exception):
"""
Departure location missing or invalid.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class SvcLocationViaError(Exception):
"""
Unknown change stop.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class SvcLocationEqualError(Exception):
"""
Origin/destination or vias are equal.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class SvcLocationNearError(Exception):
"""
Origin and destination are too close.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class SvcDatetimeError(Exception):
"""
Date/time are missing or invalid.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class SvcDatetimePeriodError(Exception):
"""
Date/time are not in timetable or allowed period.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class SvcProductError(Exception):
"""
Product field missing or invalid.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class SvcContextError(Exception):
"""
Context is invalid.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class SvcNoResultError(Exception):
"""
No result found.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class SvcSearchError(Exception):
"""
Unsuccessful search.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
class SvcNoMatchError(Exception):
"""
No match found.
"""
def __init__(self):
super().__init__(self.__doc__)
def __str__(self):
return self.__doc__
return self.__doc__

View File

@@ -12,4 +12,4 @@ class UnknownError(Exception):
super().__init__(self.errorText)
def __str__(self):
return f'{self.errorCode} -> {self.errorText}'
return f"{self.errorCode} -> {self.errorText}"

View File

@@ -1,3 +1,7 @@
import contextlib
import requests
from .board_arrival import board_arrival
from .board_departure import board_departure
from .him_search import him_search
@@ -5,4 +9,9 @@ from .journey_detail import journey_detail
from .stop_by_coords import stop_by_coords
from .stop_by_name import stop_by_name
from .trip_find import trip_find
from .trip_recon import trip_recon
from .trip_recon import trip_recon
with contextlib.suppress(ImportError):
import ujson
requests.models.complexjson = ujson

View File

@@ -0,0 +1,91 @@
from datetime import datetime, timedelta
from typing import Union
from requests import get
from xmltodict import parse as xmlparse
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
# 2.25. Arrival Board (arrivalBoard)
def board_arrival(
accessId: str,
json: bool = True,
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: Union[int, None] = None,
operators: Union[str, list, None] = None,
lines: Union[str, list, None] = None,
filterEquiv: bool = True,
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:
"""The arrival board can be retrieved by a call to the arrivalBoard service. This method will return the next
arrivals from a given point in time within a duration covered time span. The default duration size is 60 minutes.
Note: The result list always contains all arrivals running the the last minute found even if the requested
maximum was overrun.
Read more about this in section 2.25. "Arrival Board (arrivalBoard)" of HAFAS ReST Documentation.
### Args:
* accessId (str): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
* json (bool, *optional*): Whether response should be retrieved as JSON. XML is returned if False. Only matters if raw_response is True. Defaults to True.
* id (str, *optional*): Access ID for identifying the requesting client. Defaults to None.
* extId (str, *optional*): Deprecated. Please use id as it supports external IDs. Specifies the external station/stop ID for which the arrivals shall be retrieved. Required if id is not present. Such ID can be retrieved from the `stop_by_name` or `stop_by_coords`. Defaults to None.
* direction (str, *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. 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. 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. Seconds will be ignored for requests. By default the current server time is used. Defaults to None.
* duration (int, *optional*): Set the interval size in minutes. Defaults to 60.
* maxJourneys (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.
* products (int, *optional*): Decimal value defining the product classes to be included in the search. It represents a bitmask combining bit number of a product as defined in the HAFAS raw data. Defaults to None.
* 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. 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. If the line should not be part of the be trip, negate it by putting ! in front of it. Defaults to None.
* filterEquiv (bool, *optional*): Use `boardType` instead. Enables/disables the filtering of equivalent marked stops. Defaults to True.
* attributes (Union[str, list], *optional*): Filter boards by one or more attribute codes of a journey. Multiple attribute as a list or as a string separated by comma. If the attribute should not be part of the result, negate it by putting ! in front of it. Defaults to None.
* platforms (Union[str, list], *optional*): Filter boards by platform. Multiple platforms provided as a list or as a string separated by comma. Defaults to None.
* passlist (bool, *optional*): Include a list of all passed waystops. Defaults to False.
* boardType (Literal["ARR", "ARR_EQUIVS", "ARR_MAST", "ARR_STATION"], *optional*): Set the station arrival board type to be used. 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. Defaults to "ARR".
### Returns:
* dict: Output from RMV. Dict will contain "errorCode" and "errorText" if exception occurs.
"""
payload = {}
headers = {"Accept": "application/json"} if json else {"Accept": "application/xml"}
for var, val in locals().copy().items():
if str(var) == "date":
if val != None:
if isinstance(val, datetime):
payload[str(var)] = val.strftime("%Y-%m-%d")
else:
payload[str(var)] = val
elif str(var) == "time":
if val != None:
payload[str(var)] = (
val.strftime("%H:%M") if isinstance(val, datetime) else val
)
elif str(var) == "duration":
if val != None:
payload[str(var)] = val.minutes if isinstance(val, timedelta) else val
elif str(var) == "boardType":
if val != None:
payload["type"] = val.upper()
elif str(var) not in ["json", "headers", "payload"]:
if val != None:
payload[str(var)] = val
output = get("https://www.rmv.de/hapi/arrivalBoard", params=payload, headers=headers)
return output.json() if json else xmlparse(output.content)

View File

@@ -0,0 +1,92 @@
from datetime import datetime, timedelta
from typing import Union
from requests import get
from xmltodict import parse as xmlparse
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
# 2.24. Departure Board (departureBoard)
def board_departure(
accessId: str,
json: bool = True,
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: Union[int, None] = None,
operators: Union[str, list, None] = None,
lines: Union[str, list, None] = None,
filterEquiv: bool = True,
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:
"""The separture board can be retrieved by a call to the departureBoard service. This method will return the
next departures (or less if not existing) from a given point in time within a duration covered time span. The
default duration size is 60 minutes.
Note: The result list always contains all departures running the the last minute found even if the requested
maximum was overrun.
Read more about this in section 2.24. "Departure Board (departureBoard)" of HAFAS ReST Documentation.
### Args:
* accessId (str): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
* json (bool, *optional*): Whether response should be retrieved as JSON. XML is returned if False. Only matters if raw_response is True. Defaults to True.
* id (str, *optional*): Access ID for identifying the requesting client. Defaults to None.
* extId (str, *optional*): Deprecated. Please use id as it supports external IDs. Specifies the external station/stop ID for which the arrivals shall be retrieved. Required if id is not present. Such ID can be retrieved from the `stop_by_name` or `stop_by_coords`. Defaults to None.
* direction (str, *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. 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. 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. Seconds will be ignored for requests. By default the current server time is used. Defaults to None.
* duration (int, *optional*): Set the interval size in minutes. Defaults to 60.
* maxJourneys (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.
* products (int, *optional*): Decimal value defining the product classes to be included in the search. It represents a bitmask combining bit number of a product as defined in the HAFAS raw data. Defaults to None.
* 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. 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. If the line should not be part of the be trip, negate it by putting ! in front of it. Defaults to None.
* filterEquiv (bool, *optional*): Use `boardType` instead. Enables/disables the filtering of equivalent marked stops. Defaults to True.
* attributes (Union[str, list], *optional*): Filter boards by one or more attribute codes of a journey. Multiple attribute as a list or as a string separated by comma. If the attribute should not be part of the result, negate it by putting ! in front of it. Defaults to None.
* platforms (Union[str, list], *optional*): Filter boards by platform. Multiple platforms provided as a list or as a string separated by comma. Defaults to None.
* passlist (bool, *optional*): Include a list of all passed waystops. Defaults to False.
* boardType (Literal["DEP", "DEP_EQUIVS", "DEP_MAST", "DEP_STATION"], *optional*): Set the station departure board type to be used. 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. Defaults to "DEP".
### Returns:
* dict: Output from RMV. Dict will contain "errorCode" and "errorText" if exception occurs.
"""
payload = {}
headers = {"Accept": "application/json"} if json else {"Accept": "application/xml"}
for var, val in locals().copy().items():
if str(var) == "date":
if val != None:
if isinstance(val, datetime):
payload[str(var)] = val.strftime("%Y-%m-%d")
else:
payload[str(var)] = val
elif str(var) == "time":
if val != None:
payload[str(var)] = (
val.strftime("%H:%M") if isinstance(val, datetime) else val
)
elif str(var) == "duration":
if val != None:
payload[str(var)] = val.minutes if isinstance(val, timedelta) else val
elif str(var) == "boardType":
if val != None:
payload["type"] = val.upper()
elif str(var) not in ["json", "headers", "payload"]:
if val != None:
payload[str(var)] = val
output = get("https://www.rmv.de/hapi/departureBoard", params=payload, headers=headers)
return output.json() if json else xmlparse(output.content)

133
src/pyrmv/raw/him_search.py Normal file
View File

@@ -0,0 +1,133 @@
from datetime import datetime
from typing import OrderedDict, Union
from requests import get
from xmltodict import parse as xmlparse
from ..utility import weekdays_bitmask
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
# 2.37. HIM Search (himsearch)
def him_search(
accessId: str,
json: bool = True,
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] = 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: 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.
Read more about this in section 2.37. "HIM Search (himsearch)" of HAFAS ReST Documentation.
### Args:
* accessId (str): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
* json (bool, *optional*): Whether response should be retrieved as JSON. XML is returned if False. Defaults to True.
* dateB (Union[str, datetime], *optional*): Sets the event period start date. Represented in the format `YYYY-MM-DD`. By default the current server date is used. Defaults to None.
* dateE (Union[str, datetime], *optional*): Sets the event period end date. Represented in the format `YYYY-MM-DD`. By default the current server date is used. Defaults to None.
* timeB (Union[str, datetime], *optional*): Sets the event period start time. Represented in the format `hh:mm[:ss]` in 24h nomenclature. Seconds will be ignored for requests. By default the current server time is used. Defaults to None.
* timeE (Union[str, datetime], *optional*): Sets the event period end time. Represented in the format `hh:mm[:ss]` in 24h nomenclature. Seconds will be ignored for requests. By default the current server time is used. Defaults to None.
* weekdays (Union[str, OrderedDict[str, bool]], *optional*): Bitmask or an OrderedDict for validity of HIM messages based on weekdays. OrderedDict must be formatted as follows: `OrderedDict(Monday=bool, Tuesday=bool, Wednesday=bool, Thursday=bool, Friday=bool, Saturday=bool, Sunday=bool)`. Each character of a bitmask represents a weekday starting on monday. Example: Only find HIM Messages valid from monday to friday: `1111100`. Defaults to None.
* himIds (Union[str, list], *optional*): List of HIM message IDs as a list or as a string separated by comma. Defaults to None.
* hierarchicalView (bool, *optional*): Return parent messages with childs. Defaults to False.
* operators (Union[str, list], *optional*): List of operators as a list or as a string separated by comma. Defaults to None.
* categories (Union[str, list], *optional*): List of train categories as a list or as a string separated by comma. Defaults to None.
* channels (Union[str, list], *optional*): List of channels as a list or as a string separated by comma. Defaults to None.
* companies (Union[str, list], *optional*): List of companies as a list or as a string separated by comma. Defaults to None.
* lines (Union[str, list], *optional*): Only HIM messages for the given line are part of the result. To filter multiple lines, separate the codes by comma. Defaults to None.
* lineids (Union[str, list], *optional*): Only HIM messages for the given line (identified by its line ID) are part of the result. To filter multiple lines, separate the line IDs by comma. Defaults to None.
* stations (Union[str, list], *optional*): List of (external) station ids to be filtered for as a list or as a string separated by comma. Defaults to None.
* fromstation (str, *optional*): Filter messages by line segment starting at this station given as (external) station id. Defaults to None.
* tostation (str, *optional*): Filter messages by line segment travelling in direction of this station given as (external) station id. Defaults to None.
* bothways (bool, *optional*): If enabled, messages in both directions - from 'fromstation' to 'tostation' as well as from 'tostation' to 'fromstation' are returned. Defaults to None.
* trainnames (Union[str, list], *optional*): List of train name to be filtered for as a list or as a string separated by comma. Defaults to None.
* metas (Union[str, list], *optional*): List of predefined filters as a list or as a string separated by comma. Defaults to None.
* himcategory (str, *optional*): HIM category, e.g. Works and/or Disturbance. Value depends on your HAFAS server data. Defaults to None.
* himtags (Union[str, list], *optional*): HIM Tags. Value depends on your HAFAS server data. Return HIM messages having these tag(s) only. Multiple values are separated by comma. Note: HIM tags differ from HIM text tags. Defaults to None.
* regions (Union[str, list], *optional*): Filter for HIM messages based on regions defined in HAFAS raw data. As a list or as a string separated by comma. Available regions can be retrieved by /datainfo service. Defaults to None.
* himtext (Union[str, list], *optional*): Filter for HIM messages containing the given free text message as a list or as a string separated by comma. Defaults to None.
* himtexttags (Union[str, list], *optional*): Return HIM texts having this text tag(s) only. Multiple values are separated by comma. Note: HIM text tags differ from HIM tags. Defaults to None.
* additionalfields (Union[str, list, dict], *optional*): List of additional fields and values to be filtered for. Two filter options are available: Filter by key only: `additionalfields=key` or filter by key and value: `additionalfields={key:value}`. Multiple filters are separated by comma like `additionalfields=[keyA,keyB]` or `additionalfields={key:value}`. Defaults to None.
* poly (bool, *optional*): Enables/disables returning of geo information for affected edges and regions if available and enabled in the backend. Defaults to False.
* searchmode (Literal["MATCH", "NOMATCH", "TFMATCH"], *optional*): HIM search mode. `"NOMATCH"` iterate over all HIM messages available. `"MATCH"` iterate over all trips to find HIM messages. `"TFMATCH"` uses filters defined `metas` parameter. Defaults to None.
* affectedJourneyMode (Literal["ALL", "OFF"], *optional*): Define how to return affected journeys `"OFF"`: do not return affected journeys. `"ALL"`: return affected journeys. Defaults to None.
* affectedJourneyStopMode (Literal["ALL", "IMP", "OFF"], *optional*): Define how to return stops of affected journeys. `"IMP"`: return important stops of affected journeys. `"OFF"`: do not return stops of affected journeys. `"ALL"`: return all affected stops of affected journeys. Defaults to None.
* orderBy (Union[str, list], *optional*): Define the Order the returned messages by fields and directions. Multiple, string comma separated or list entries are supported. Read more about this in HAFAS ReST Documentation. Defaults to None.
* minprio (Union[str, int], *optional*): Filter for HIM messages having at least this priority. Defaults to None.
* maxprio (Union[str, int], *optional*): Filter for HIM messages having this priority as maximum. Defaults to None.
### Returns:
* dict: Output from RMV. Dict will contain "errorCode" and "errorText" if exception occurs.
"""
payload = {}
headers = {"Accept": "application/json"} if json else {"Accept": "application/xml"}
for var, val in locals().copy().items():
if str(var) in {"dateB", "dateE"}:
if val != None:
if isinstance(val, datetime):
payload[str(var)] = val.strftime("%Y-%m-%d")
else:
payload[str(var)] = val
elif str(var) in {"timeB", "timeE"}:
if val != None:
payload[str(var)] = (
val.strftime("%H:%M") if isinstance(val, datetime) else val
)
elif str(var) == "weekdays":
if val != None:
if isinstance(val, OrderedDict):
payload[str(var)] = weekdays_bitmask(val)
else:
payload[str(var)] = val
elif str(var) == "searchmode":
if val != None:
payload["searchmode"] = val.upper()
elif str(var) == "affectedJourneyMode":
if val != None:
payload["affectedJourneyMode"] = val.upper()
elif str(var) == "affectedJourneyStopMode":
if val != None:
payload["affectedJourneyStopMode"] = val.upper()
elif str(var) not in ["json", "headers", "payload"]:
if val != None:
payload[str(var)] = val
output = get("https://www.rmv.de/hapi/himsearch", params=payload, headers=headers)
return output.json() if json else xmlparse(output.content)

View File

@@ -0,0 +1,68 @@
from datetime import datetime
from typing import Union
from requests import get
from xmltodict import parse as xmlparse
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
# 2.26. Journey Detail (journeyDetail)
def journey_detail(
accessId: str,
id: str,
json: bool = True,
date: Union[str, datetime, None] = None,
poly: bool = False,
polyEnc: Literal["DLT", "GPA", "N"] = "N",
showPassingPoints: bool = False,
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
identifier is part of a trip or departureBoard response. It contains a list of all stops/stations of this journey
including all departure and arrival times (with real-time data if available) and additional information like
specific attributes about facilities and other texts.
Read more about this in section 2.26. "Journey Detail (journeyDetail)" of HAFAS ReST Documentation.
### Args:
* accessId (str): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
* id (str): Specifies the internal journey id of the journey shall be retrieved. Maximum length 512.
* json (bool, *optional*): Whether response should be retrieved as JSON. XML is returned if False. Defaults to True.
* date (Union[str, datetime], *optional*): Day of operation. Represented in the format `YYYY-MM-DD`. By default the current server date is used. Defaults to None.
* poly (bool, *optional*): Enables/disables the calculation of the polyline for each leg of the trip except any GIS route. Defaults to False.
* polyEnc (Literal["DLT", "GPA", "N"], *optional*): Defines encoding of the returned polyline. Possible values are "N" (no encoding / compression), "DLT" (delta to the previous coordinate), "GPA" (Google encoded polyline format). Defaults to "N".
* showPassingPoints (bool, *optional*): Enables/disables the return of stops having no alighting and no boarding in its passlist for each leg of the trip. Defaults to False.
* rtMode (Literal["FULL", "INFOS", "OFF", "REALTIME", "SERVER_DEFAULT"], *optional*): Set the realtime mode to be used. Read more about this in HAFAS ReST Documentation. Defaults to None.
* fromId (str, *optional*): Specifies the station/stop ID the partial itinerary shall start from. Defaults to None.
* fromIdx (str, *optional*): Specifies the station/stop index the partial itinerary shall start from. Defaults to None.
* toId (str, *optional*): Specifies the station/stop ID the partial itinerary shall end at. Defaults to None.
* toIdx (str, *optional*): Specifies the station/stop index the partial itinerary shall end at. Defaults to None.
* baim (bool, *optional*): Enables/disables BAIM search and response. Defaults to False.
### Returns:
* dict: Output from RMV. Dict will contain "errorCode" and "errorText" if exception occurs.
"""
payload = {}
headers = {"Accept": "application/json"} if json else {"Accept": "application/xml"}
for var, val in locals().copy().items():
if str(var) == "rtMode":
if val != None:
payload["rtMode"] = val.upper()
elif str(var) not in ["json", "headers", "payload"]:
if val != None:
payload[str(var)] = val
output = get("https://www.rmv.de/hapi/journeyDetail", params=payload, headers=headers)
return output.json() if json else xmlparse(output.content)

View File

@@ -0,0 +1,72 @@
from typing import Union
from requests import get
from xmltodict import parse as xmlparse
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
# 2.4. Location Search by Coordinate (location.nearbystops)
def stop_by_coords(
accessId: str,
originCoordLat: Union[str, float],
originCoordLong: Union[str, float],
lang: Literal[
"de", "da", "en", "es", "fr", "hu", "it", "nl", "no", "pl", "sv", "tr"
] = "en",
json: bool = True,
radius: Union[int, float] = 1000,
maxNo: int = 10,
stopType: Literal["S", "P", "SP", "SE", "SPE"] = "S",
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.
Read more about this in section 2.4. "Location Search by Coordinate (location.nearbystops)" of HAFAS ReST Documentation.
### Args:
* accessId (str): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
* originCoordLat (Union[str, float]): Latitude of centre coordinate.
* originCoordLong (Union[str, float]): Longitude of centre coordinate.
* lang (Literal["de","da","en","es","fr","hu","it","nl","no","pl","sv","tr"], *optional*): The language of response. Defaults to "en".
* json (bool, *optional*): Whether response should be retrieved as JSON. XML is returned if False. Only matters if raw_response is True. Defaults to True.
* radius (Union[int, float], *optional*): Search radius in meter around the given coordinate if any. Defaults to 1000.
* maxNo (int, *optional*): Maximum number of returned stops. Defaults to 10.
* stopType (Literal["S", "P", "SP", "SE", "SPE"], *optional*): Type filter for location types. Defaults to "S".
* locationSelectionMode (Literal["SLCT_N", "SLCT_A"], *optional*): Selection mode for locations. Defaults to None.
* products (int, *optional*): Decimal value defining the product classes to be included in the search. It represents a bitmask combining bit number of a product as defined in the HAFAS raw data. Defaults to None.
* meta (str, *optional*): Filter by a predefined meta filter. If the rules of the predefined filter should not be negated, put ! in front of it. Defaults to None.
* sattributes (Union[str, list], *optional*): Filter locations by one or more attribute codes. Multiple attribute codes are separated by comma. If the attribute should not be part of the be location data, negate it by putting ! in front of it. Defaults to None.
* sinfotexts (Union[str, list], *optional*): Filter locations by one or more station infotext codes and values. Multiple attribute codes are separated by comma the value by pipe |. Defaults to None.
### Returns:
* dict: Output from RMV. Dict will contain "errorCode" and "errorText" if exception occurs.
"""
payload = {}
headers = {"Accept": "application/json"} if json else {"Accept": "application/xml"}
for var, val in locals().copy().items():
if str(var) == "stopType":
if val != None:
payload["type"] = val.upper()
elif str(var) == "locationSelectionMode":
if val != None:
payload["locationSelectionMode"] = val.upper()
elif str(var) not in ["json", "headers", "payload", "raw_response"]:
if val != None:
payload[str(var)] = val
output = get(
"https://www.rmv.de/hapi/location.nearbystops", params=payload, headers=headers
)
return output.json() if json else xmlparse(output.content)

View File

@@ -0,0 +1,84 @@
from typing import Union
from requests import get
from xmltodict import parse as xmlparse
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
# 2.3. Location Search by Name (location.name)
def stop_by_name(
accessId: str,
inputString: str,
lang: Literal[
"de", "da", "en", "es", "fr", "hu", "it", "nl", "no", "pl", "sv", "tr"
] = "en",
json: bool = True,
maxNo: int = 10,
stopType: Literal["A", "ALL", "AP", "P", "S", "SA", "SP"] = "ALL",
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: 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
of possible matches in the journey planner database. Possible matches might be stops/stations, points of
interest and addresses.
The result is a list of possible matches (locations) where the user might pick one entry to perform a trip
request with this location as origin or destination or to ask for a departure board or arrival board of this
location (stops/stations only).
Read more about this in section 2.3. "Location Search by Name (location.name)" of HAFAS ReST Documentation.
### Args:
* accessId (str): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
* inputString (str): Search for that token.
* lang (Literal["de","da","en","es","fr","hu","it","nl","no","pl","sv","tr"], *optional*): The language of response. Defaults to "en".
* json (bool, *optional*): Whether response should be retrieved as JSON. XML is returned if False. Only matters if raw_response is True. Defaults to True.
* maxNo (int, *optional*): Maximum number of returned stops. In range 1-1000. Defaults to 10.
* stopType (Literal["A", "ALL", "AP", "P", "S", "SA", "SP"], *optional*): Type filter for location types. Defaults to "ALL".
* locationSelectionMode (str, *optional*): Selection mode for locations. "SLCT_N": Not selectable, "SLCT_A": Selectable. Defaults to None.
* products (int, *optional*): Decimal value defining the product classes to be included in the search. It represents a bitmask combining bit number of a product as defined in the HAFAS raw data. Defaults to None.
* coordLat (Union[str, float], *optional*): Latitude of centre coordinate. Defaults to None.
* coordLong (Union[str, float], *optional*): Longitude of centre coordinate. Defaults to None.
* radius (Union[int, float], *optional*): Search radius in meter around the given coordinate if any. Defaults to 1000.
* refineId (str, *optional*): In case of an refinable location, this value takes the ID of the refinable one of a previous result. Defaults to None.
* meta (str, *optional*): Filter by a predefined meta filter. If the rules of the predefined filter should not be negated, put ! in front of it. Defaults to None.
* stations (Union[str, list], *optional*): Filter for stations. Matches if the given value is prefix of any station in the itinerary. Multiple values are separated by comma. Defaults to None.
* sattributes (Union[str, list], *optional*): Filter locations by one or more attribute codes. Multiple attribute codes are separated by comma. If the attribute should not be part of the be location data, negate it by putting ! in front of it. Defaults to None.
* filterMode (Literal["DIST_PERI", "EXCL_PERI", "SLCT_PERI"], *optional*): Filter modes for nearby searches. Defaults to "DIST_PERI".
### Returns:
* dict: Output from RMV. Dict will contain "errorCode" and "errorText" if exception occurs.
"""
payload = {}
headers = {"Accept": "application/json"} if json else {"Accept": "application/xml"}
for var, val in locals().copy().items():
if str(var) == "inputString":
if val != None:
payload["input"] = val
elif str(var) == "stopType":
if val != None:
payload["type"] = val.upper()
elif str(var) == "filterMode":
if val != None:
payload["filterMode"] = val.upper()
elif str(var) not in ["json", "headers", "payload", "raw_response", "stopType"]:
if val != None:
payload[str(var)] = val
output = get("https://www.rmv.de/hapi/location.name", params=payload, headers=headers)
return output.json() if json else xmlparse(output.content)

225
src/pyrmv/raw/trip_find.py Normal file
View File

@@ -0,0 +1,225 @@
from datetime import datetime
from typing import List, Union
from requests import get
from xmltodict import parse as xmlparse
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
def trip_find(
accessId: str,
lang: Literal[
"de", "da", "en", "es", "fr", "hu", "it", "nl", "no", "pl", "sv", "tr"
] = "en",
json: bool = True,
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: 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: Union[str, None] = None,
viaId: Union[str, None] = None,
viaWaitTime: int = 0,
avoid: Union[str, None] = None,
avoidId: Union[str, None] = None,
viaGis: Union[str, None] = None,
changeTimePercent: int = 100,
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] = None,
time: Union[str, datetime, None] = None,
searchForArrival: bool = False,
numF: Union[int, None] = None,
numB: Union[int, None] = None,
context: Union[str, None] = None,
poly: bool = False,
polyEnc: Literal["DLT", "GPA", "N"] = "N",
passlist: bool = False,
products: Union[int, None] = None,
operators: Union[str, list, None] = None,
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: Union[List[Literal["SW", "EA", "ES", "RA", "CB"]], None] = None,
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] = 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] = 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: Union[str, None] = None,
includeIv: bool = False,
ivOnly: bool = False,
mobilityProfile: Union[str, None] = None,
bikeCarriage: bool = False,
bikeCarriageType: Union[
Literal["SINGLEBIKES", "SMALLGROUPS", "LARGEGROUPS"], None
] = None,
sleepingCar: bool = False,
couchetteCoach: bool = False,
showPassingPoints: bool = False,
baim: bool = False,
eco: bool = False,
ecoCmp: bool = False,
ecoParams: Union[str, None] = None,
rtMode: Union[Literal["FULL", "INFOS", "OFF", "REALTIME", "SERVER_DEFAULT"], None] = None,
unsharp: bool = False,
trainFilter: Union[str, None] = None,
economic: bool = False,
groupFilter: Union[str, None] = None,
blockingList: Union[str, None] = None,
blockedEdges: Union[str, None] = None,
trainComposition: bool = False,
includeEarlier: bool = False,
withICTAlternatives: bool = False,
tariff: Union[bool, None] = None,
trafficMessages: bool = False,
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
stop/station IDs or coordinates based on addresses and points of interest validated by the location service or
coordinates freely defined by the client.
Read more about this in section 2.12. "Trip Search (trip)" of HAFAS ReST Documentation.
### Args:
* accessId (str): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
* lang (Literal["de","da","en","es","fr","hu","it","nl","no","pl","sv","tr"], *optional*): The language of response. Defaults to "en".
* json (bool, *optional*): Whether response should be retrieved as JSON. XML is returned if False. Defaults to True.
* originId (str, *optional*): Specifies the station/stop ID of the origin for the trip. Such ID can be retrieved from stopByName() or stopByCoords(). Defaults to None.
* originExtId (str, *optional*): Deprecated. Please use originId as it supports external IDs. Specifies the external station/stop ID of the origin for the trip. Such ID can be retrieved from stopByName() or stopByCoords(). Defaults to None.
* originCoordLat (Union[str, float], *optional*): Latitude of station/stop coordinate of the trip's origin. The coordinate can be retrieved from stopByName() or stopByCoords(). Defaults to None.
* originCoordLong (Union[str, float], *optional*): Longitude of station/stop coordinate of the trip's origin. The coordinate can be retrieved from stopByName() or stopByCoords(). Defaults to None.
* originCoordName (str, *optional*): Name of the trip's origin if coordinate cannot be resolved to an address or poi. Defaults to None.
* destId (str, *optional*): Specifies the station/stop ID of the destination for the trip. Such ID can be retrieved from stopByName() or stopByCoords(). Defaults to None.
* destExtId (str, *optional*): Deprecated. Please use destId as it supports external IDs. Specifies the external station/stop ID of the destination for the trip. Such ID can be retrieved from stopByName() or stopByCoords(). Defaults to None.
* destCoordLat (Union[str, float], *optional*): Latitude of station/stop coordinate of the trip's destination. The coordinate can be retrieved from stopByName() or stopByCoords(). Defaults to None.
* destCoordLong (Union[str, float], *optional*): Longitude of station/stop coordinate of the trip's destination. The coordinate can be retrieved from stopByName() or stopByCoords(). Defaults to None.
* destCoordName (str, *optional*): Name of the trip's destination if coordinate cannot be resolved to an address or poi. Defaults to None.
* via (str, *optional*): Complex structure to provide multiple via points separated by semicolon. This structure is build like this: `viaId|waittime|viastatus|products|direct|sleepingCar|couchetteCoach|attributes`. Read more about this in HAFAS ReST Documentation. Defaults to None.
* viaId (str, *optional*): ID of a station/stop used as a via for the trip. Specifying a via station forces the trip search to look for trips which must pass through this station. Such ID can be retrieved from stopByName() or stopByCoords(). If `via` is used, `viaId` and `viaWaitTime ` are having no effect. Defaults to None.
* viaWaitTime (int, *optional*): Defines the waiting time spent at via station in minutes. If `via` is used, `viaId` and `viaWaitTime` are having no effect. Defaults to 0.
* avoid (str, *optional*): Complex structure to provide multiple points to be avoided separated by semicolon. This structure is build like this: `avoidId|avoidstatus` avoidId: id, extId or altId of the avoid, mandatory avoidstatus: one of NPAVM (do not run through if this is a meta station), NPAVO (do not run through), NCAVM (do not change if this is a meta station), NCAVO (do not change), *optional* but defaults to NCAVM Example: Just define three avoids by extId: `avoid="801234;801235;801236"`. Defaults to None.
* avoidId (str, *optional*): ID of a station/stop to be avoided as transfer stop for the trip. Such ID can be retrieved from stopByName() or stopByCoords(). If `avoid` is used, `avoidId` has no effect. Defaults to None.
* viaGis (str, *optional*): Complex structure to provide multiple GIS via locations separated by semicolon. This structure is build like this: `locationId|locationMode|transportMode|placeType|usageType|mode|durationOfStay`. Read more about this in HAFAS ReST Documentation. Defaults to None.
* changeTimePercent (int, *optional*): Configures the walking speed when changing from one leg of the journey to the next one. It extends the time required for changes by a specified percentage. A value of 200 doubles the change time as initially calculated by the system. In the response, change time is presented in full minutes. If the calculation based on changeTime-Percent does not result in a full minute, it is rounded using "round half up" method. Defaults to 100.
* minChangeTime (int, *optional*): Minimum change time at stop in minutes. Defaults to None.
* maxChangeTime (int, *optional*): Maximum change time at stop in minutes. Defaults to None.
* addChangeTime (int, *optional*): This amount of minutes is added to the change time at each stop. Defaults to None.
* maxChange (int, *optional*): Maximum number of changes. In range 0-11. 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`. 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. Seconds will be ignored for requests. By default the current server time is used. Defaults to None.
* searchForArrival (bool, *optional*): If set, the date and time parameters specify the arrival time for the trip search instead of the departure time. Defaults to False.
* numF (int, *optional*): Minimum number of trips after the search time. Sum of numF and numB has to be less or equal 6. Read more about this in HAFAS ReST Documentation. In range 1-6. Defaults to None.
* numB (int, *optional*): Minimum number of trips before the search time. Sum of numF and numB has to be less or equal 6. Read more about this in HAFAS ReST Documentation. In range 0-6. Defaults to None.
* context (str, *optional*): Defines the starting point for the scroll back or forth operation. Use the scrB value from a previous result to scroll backwards in time and use the scrF value to scroll forth. Defaults to None.
* poly (bool, *optional*): Enables/disables the calculation of the polyline for each leg of the trip except any GIS route. Defaults to False.
* polyEnc (Literal["DLT", "GPA", "N"], *optional*): Defines encoding of the returned polyline. Possible values are "N" (no encoding / compression), "DLT" (delta to the previous coordinate), "GPA" (Google encoded polyline format). Defaults to "N".
* passlist (bool, *optional*): Enables/disables the return of the passlist for each leg of the trip. Defaults to False.
* products (str, *optional*): Decimal value defining the product classes to be included in the search. It represents a bitmask combining bit number of a product as defined in the HAFAS raw data. Defaults to None.
* operators (Union[str, list], *optional*): Only trips provided by the given operators are part of the result. 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.
* attributes (Union[str, list], *optional*): Filter trips by one or more attribute codes of a journey. If the attribute should not be part of the be trip, negate it by putting ! in front of it. Defaults to None.
* sattributes (Union[str, list], *optional*): Filter trips by one or more station attribute codes of a journey. If the attribute should not be part of the be trip, negate it by putting ! in front of it. Defaults to None.
* fattributes (Union[str, list], *optional*): Filter trips by one or more footway attribute codes of a journey. If the attribute should not be part of the be trip, negate it by putting ! in front of it. Defaults to None.
* lines (Union[str, list], *optional*): Only journeys running the given line are part of the result. If the line should not be part of the be trip, negate it by putting ! in front of it. Defaults to None.
* lineids (Union[str, list], *optional*): Only journeys running the given line (identified by its line ID) are part of the result. If the line should not be part of the be trip, negate it by putting ! in front of it. Defaults to None.
* avoidPaths (List[Literal["SW", "EA", "ES", "RA", "CB"]], *optional*): Only path not having the given properties will be part of the result. "SW": Stairway; "EA": Elevator; "ES": Escalator; "RA": Ramp; "CB": Convey Belt. Example: Use paths without ramp and stairway: `avoidPaths="SW", "RA"`. Defaults to None.
* originWalk (Union[str, list], *optional*): Enables/disables using footpaths in the beginning of a trip when searching from an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* originBike (Union[str, list], *optional*): Enables/disables using bike routes in the beginning of a trip when searching from an address. To fine-tune the minimum and/or maximum distance to the next public transport station or mode change point, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* originCar (Union[str, list], *optional*): Enables/disables using car in the beginning of a trip when searching from an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* originTaxi (Union[str, list], *optional*): Enables/disables using taxi rides in the beginning of a trip when searching from an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* originPark (Union[str, list], *optional*): Enables/disables using Park and Ride in the beginning of a trip when searching from an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* originMeta (Union[str, list], *optional*): Enables using one or more predefined individual transport meta profile at the beginning of a trip. Defaults to None.
* destWalk (Union[str, list], *optional*): Enables/disables using footpaths at the end of a trip when searching to an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* destBike (Union[str, list], *optional*): Enables/disables using bike routes at the end of a trip when searching to an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* destCar (Union[str, list], *optional*): Enables/disables using car routes at the end of a trip when searching to an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* destTaxi (Union[str, list], *optional*): Enables/disables using taxi rides at the end of a trip when searching to an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* destPark (Union[str, list], *optional*): Enables/disables using Park and Ride at the end of a trip when searching to an address. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* destMeta (Union[str, list], *optional*): Enables using one or more predefined individual transport meta profile at the end of a trip. Defaults to None.
* totalWalk (Union[str, list], *optional*): Enables/disables using footpaths for the whole trip. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* totalBike (Union[str, list], *optional*): Enables/disables using bike routes for the whole trip. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* totalCar (Union[str, list], *optional*): Enables/disables using car routes for the whole trip. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* totalTaxi (Union[str, list], *optional*): Enables/disables using taxi rides for the whole trip. To fine-tune the minimum and/or maximum distance to the next public transport station, provide these values as a list or as a string separated by comma. These values are expressed in meters. Read more about this in HAFAS ReST Documentation. Defaults to None.
* totalMeta (Union[str, list], *optional*): Enables using one or more predefined individual transport meta profile for a trip. Defaults to None.
* gisProducts (str, *optional*): Filter on GIS product, e.g. specific sharing provider. Currently, only exclusion of certain providers is available by adding ! in front of the provider meta code. Defaults to None.
* includeIv (bool, *optional*): Enables/disables search for individual transport routes. Defaults to False.
* ivOnly (bool, *optional*): Enables/disables search for individual transport routes only. Defaults to False.
* mobilityProfile (str, *optional*): Use a predefined filter by its name. The filters are defined in the HAFAS installation. If the filter should be negated, put a ! in front of its name. Defaults to None.
* bikeCarriage (bool, *optional*): Enables/disables search for trips explicit allowing bike carriage. This will only work in combination with `maxChange=0` as those trips are always meant to be direct connections. Defaults to False.
* bikeCarriageType (Literal["SINGLEBIKES", "SMALLGROUPS", "LARGEGROUPS"], *optional*): Filter for a specific bike carriage type. Defaults to None.
* sleepingCar (bool, *optional*): Enables/disables search for trips having sleeping car. This will only work in combination with `maxChange=0` as those trips are always meant to be direct connections. Defaults to False.
* couchetteCoach (bool, *optional*): Enables/disables search for trips having couchette coach. This will only work in combination with `maxChange=0` as those trips are always meant to be direct connections. Defaults to False.
* showPassingPoints (bool, *optional*): Enables/disables the return of stops having no alighting and boarding in its passlist for each leg of the trip. Needs passlist enabled. Defaults to False.
* baim (bool, *optional*): Enables/disables BAIM search and response. Defaults to False.
* eco (bool, *optional*): Enables/disables eco value calculation. Defaults to False.
* ecoCmp (bool, *optional*): Enables/disables eco comparison. Defaults to False.
* ecoParams (str, *optional*): Provide additional eco parameters. Defaults to None.
* rtMode (Literal["FULL", "INFOS", "OFF", "REALTIME", "SERVER_DEFAULT"], *optional*): Set the realtime mode to be used. Read more about this in HAFAS ReST Documentation. Defaults to None.
* unsharp (bool, *optional*): Enables/disables unsharp search mode. Read more about this in section 2.12.2.1. "Trip Search (trip)" of HAFAS ReST Documentation. Defaults to False.
* trainFilter (str, *optional*): Filters a trip search for a certain train. First hit will be taken. Defaults to None.
* economic (bool, *optional*): Enables/disables economic search mode. Read more about this in section 2.12.2.2. "Trip Search (trip)" of HAFAS ReST Documentation. Defaults to False.
* groupFilter (str, *optional*): Use a predefined group filter to query for certain modes. Defaults to None.
* blockingList (str, *optional*): Defines a section of a route of a journey not to be used within the trip search. Each route section is defined by a tuple of the following style: `<train name>|<departure id>|<arrival id>|<departure time>|<arrival time>|<departure date>|<arrival date>` A set of tuples can be separated by semicolon. Defaults to None.
* blockedEdges (str, *optional*): List of edges within the public transport network that should be excluded from the result. Each edge is defined by a tuple of the following style: `start location ID|end locationID|bidirectional|blockOnlyIfInOutAllowed` A set of tuples can be separated by semicolon. Defaults to None.
* trainComposition (bool, *optional*): Enables/disables train composition data. Defaults to False.
* includeEarlier (bool, *optional*): Disables search optimization in relation of duration. Defaults to False.
* withICTAlternatives (bool, *optional*): Enables/disables the search for alternatives with individualized change times (ICT). Defaults to False.
* tariff (bool, *optional*): Enables/disables the output of tariff data. The default is configurable via provisioning. Defaults to None.
* trafficMessages (bool, *optional*): Enables/disables the output of traffic messages. The default is configurable via provisioning. Defaults to False.
* travellerProfileData (str, *optional*): Traveller profile data. Structure depends on set up. Defaults to None.
* withFreq (bool, *optional*): Enables/disables the calculation of frequency information. Defaults to True.
### Returns:
* dict: Output from RMV. Dict will contain "errorCode" and "errorText" if exception occurs.
"""
payload = {}
headers = {"Accept": "application/json"} if json else {"Accept": "application/xml"}
for var, val in locals().copy().items():
if str(var) == "date":
if val != None:
if isinstance(val, datetime):
payload[str(var)] = val.strftime("%Y-%m-%d")
else:
payload[str(var)] = val
elif str(var) == "time":
if val != None:
payload[str(var)] = (
val.strftime("%H:%M") if isinstance(val, datetime) else val
)
elif str(var) == "rtMode":
if val != None:
payload["rtMode"] = val.upper()
elif str(var) not in ["json", "headers", "payload"]:
if val != None:
payload[str(var)] = val
output = get("https://www.rmv.de/hapi/trip", params=payload, headers=headers)
return output.json() if json else xmlparse(output.content)

103
src/pyrmv/raw/trip_recon.py Normal file
View File

@@ -0,0 +1,103 @@
from datetime import datetime
from typing import Union
from requests import get
from xmltodict import parse as xmlparse
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
def trip_recon(
accessId: str,
ctx: str,
json: bool = True,
poly: bool = False,
polyEnc: Literal["DLT", "GPA", "N"] = "N",
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: Union[Literal["FULL", "INFOS", "OFF", "REALTIME", "SERVER_DEFAULT"], None] = None,
eco: bool = False,
ecoCmp: bool = False,
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
that the underlying data did not change.
Read more about this in section 2.17. "Reconstruction (recon)" of HAFAS ReST Documentation.
### Args:
* accessId (str): Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
* ctx (str): Specifies the reconstruction context.
* json (bool, *optional*): Whether response should be retrieved as JSON. XML is returned if False. Defaults to True.
* poly (bool, *optional*): Enables/disables the calculation of the polyline for each leg of the trip except any GIS route. Defaults to False.
* polyEnc (Literal["DLT", "GPA", "N"], *optional*): Defines encoding of the returned polyline. Possible values are "N" (no encoding / compression), "DLT" (delta to the previous coordinate), "GPA" (Google encoded polyline format). Defaults to "N".
* date (Union[str, datetime], *optional*): Sets the start date for which the departures shall be retrieved. Represented in the format `YYYY-MM-DD`. This parameter will force the ser-vice to reconstruct the trip on that specific date. If the trip is not available on that date, because it does not operate, the error code SVC_NO_RESULT will be returned. Defaults to None.
* useCombinedComparison (bool, *optional*): Compare based on combined output name - `False`: Compare parameters (category, line, train number) individually. Defaults to None.
* acceptGaps (bool, *optional*): Accept an incomplete description of the connection (with gaps) i.e. missing walks/transfers. Defaults to None.
* allowDummySections (bool, *optional*): Allow a partial reconstruction that will not lead to a reconstruction failure if sections are not reconstructable. Instead, for theses inconstructable sections, dummy sections will be created in the result. Defaults to None.
* flagAllNonReachable (bool, *optional*): Should all non-reachable journeys be flagged (`True`), or only the first one encountered? Defaults to None.
* matchCatStrict (bool, *optional*): Should the category (Gattung) match exactly? Only applicable if `useCombinedComparison` is `False`. Defaults to None.
* matchIdNonBlank (bool, *optional*): Should the train identifier (Zugbezeichner) without whitespace match? Defaults to None.
* matchIdStrict (bool, *optional*): Should the train identifier (Zugbezeichner) match exactly? Defaults to None.
* matchNumStrict (bool, *optional*): Should the train number (Zugnummer) match exactly? Only applicable if `useCombinedComparison` is `False`. Defaults to None.
* matchRtType (bool, *optional*): Should the realtime type that journeys are based on (e.g. SOLL, IST, additional, deviation, …) be considered? Defaults to None.
* enableRtFullSearch (bool, *optional*): By default, the reconstruction request makes one attempt for each journey within the scheduled data. However, the scheduled data may not necessarily reflect basic realtime properties of the journeys therein. In such a case, one may enable a two-step approach which we call "full search", i.e. search for matching journeys in the scheduled data in a first step. If this fails, then search for matching journeys in the realtime data. Defaults to None.
* enableReplacements (bool, *optional*): If set to true replaces cancelled journeys with their replacement journeys if possible. Defaults to None.
* arrL (int, *optional*): Lower deviation in minutes within interval [0, 720] indicating "how much earlier than original arrival". Defaults to None.
* arrU (int, *optional*): Upper deviation in minutes within interval [0, 720] indicating "how much later than original arrival". Defaults to None.
* depL (int, *optional*): Lower deviation in minutes within interval [0, 720] indicating "how much earlier than original departure". Defaults to None.
* depU (int, *optional*): Upper deviation in minutes within interval [0, 720] indicating "how much later than original departure". Defaults to None.
* passlist (bool, *optional*): Enables/disables the return of the passlist for each leg of the trip. Defaults to False.
* showPassingPoints (bool, *optional*): Enables/disables the return of stops having no alighting and boarding in its passlist for each leg of the trip. Needs passlist parameter enabled. Defaults to False.
* rtMode (Literal["FULL", "INFOS", "OFF", "REALTIME", "SERVER_DEFAULT"], *optional*): Set the realtime mode to be used. Read more about this in HAFAS ReST Documentation. Defaults to None.
* eco (bool, *optional*): Enables/disables eco value calculation. Defaults to False.
* ecoCmp (bool, *optional*): Enables/disables eco comparison. Defaults to False.
* ecoParams (str, *optional*): Provide additional eco parameters. Values vary. Defaults to None.
* tariff (bool, *optional*): Enables/disables the output of tariff data. The default is configurable via provisioning. Defaults to None.
* trafficMessages (bool, *optional*): Enables/disables the output of traffic messages. The default is configurable via provisioning. Defaults to None.
* travellerProfileData (str, *optional*): Traveller profile data. Structure depends on set up. Defaults to None.
### Returns:
* dict: Output from RMV. Dict will contain "errorCode" and "errorText" if exception occurs.
"""
payload = {}
headers = {"Accept": "application/json"} if json else {"Accept": "application/xml"}
for var, val in locals().copy().items():
if str(var) == "date":
if val != None:
if isinstance(val, datetime):
payload[str(var)] = val.strftime("%Y-%m-%d")
else:
payload[str(var)] = val
elif str(var) not in ["json", "headers", "payload"]:
if val != None:
payload[str(var)] = val
output = get("https://www.rmv.de/hapi/recon", params=payload, headers=headers)
return output.json() if json else xmlparse(output.content)

View File

@@ -0,0 +1,3 @@
from .find_exception import find_exception
from .journey_ref_converter import ref_upgrade
from .weekdays_bitmask import weekdays_bitmask

View File

@@ -1,22 +1,47 @@
from pyrmv.errors.api_errors import ApiAuthError, ApiFormatError, ApiParamError, ApiQuotaError, ApiTooManyRequests
from pyrmv.errors.int_errors import IntError, IntGatewayError, IntTimeoutError
from pyrmv.errors.ps_errors import PsIncorrectParamError
from pyrmv.errors.sot_errors import SotAllTrainsFilteredError, SotAlreadyArrivedError, SotCancelledError, SotNotStartedError, SotStayOnTripError
from pyrmv.errors.svc_errors import SvcContextError, SvcDatetimeError, SvcDatetimePeriodError, SvcLocationArrivalError, SvcLocationDepartureError, SvcLocationEqualError, SvcLocationError, SvcLocationNearError, SvcLocationViaError, SvcNoMatchError, SvcNoResultError, SvcProductError, SvcSearchError
from pyrmv.errors.unknown_error import UnknownError
from ..errors import (
ApiAuthError,
ApiFormatError,
ApiParamError,
ApiQuotaError,
ApiTooManyRequests,
IntError,
IntGatewayError,
IntTimeoutError,
PsIncorrectParamError,
SotAllTrainsFilteredError,
SotAlreadyArrivedError,
SotCancelledError,
SotNotStartedError,
SotStayOnTripError,
SvcContextError,
SvcDatetimeError,
SvcDatetimePeriodError,
SvcLocationArrivalError,
SvcLocationDepartureError,
SvcLocationEqualError,
SvcLocationError,
SvcLocationNearError,
SvcLocationViaError,
SvcNoMatchError,
SvcNoResultError,
SvcProductError,
SvcSearchError,
SvcParamError,
UnknownError,
)
def find_exception(data: dict):
"""Scan returned dict for errorCode from RMV.
Raises different exceptions if errorCode is not None.
Raises different exceptions if errorCode is not None.
### Args:
* data (dict): Response from RMV as a dict.
### Raises:
* Any: Formatted as "errorCode -> errorText" if ApiParamError and UnknownError or as a single massage for others.
"""
"""
if "errorCode" in data:
if data["errorCode"] == "API_AUTH":
raise ApiAuthError()
@@ -25,7 +50,7 @@ def find_exception(data: dict):
elif data["errorCode"] == "API_TOO_MANY_REQUESTS":
raise ApiTooManyRequests()
elif data["errorCode"] == "API_PARAM":
raise ApiParamError(errorCode=data["errorCode"], errorText=data["errorText"])
@@ -62,6 +87,9 @@ def find_exception(data: dict):
elif data["errorCode"] == "SVC_CTX":
raise SvcContextError()
elif data["errorCode"] == "SVC_PARAM":
raise SvcParamError(errorCode=data["errorCode"], errorText=data["errorText"])
elif data["errorCode"] == "SVC_NO_RESULT":
raise SvcNoResultError()
@@ -99,4 +127,4 @@ def find_exception(data: dict):
raise PsIncorrectParamError()
else:
raise UnknownError(errorCode=data["errorCode"], errorText=data["errorText"])
raise UnknownError(errorCode=data["errorCode"], errorText=data["errorText"])

View File

@@ -0,0 +1,26 @@
def ref_upgrade(ref: str) -> str:
"""This function converts older journey refs to the newer ones.
### WARNING
This function will be deprecated as soon as RMV updates their API
### Args:
* ref (`str`): Old ref like this one: `2|#VN#1#ST#1700765441#PI#0#ZI#160749#TA#0#DA#241123#1S#3004646#1T#2228#LS#3006907#LT#2354#PU#80#RT#1#CA#S30#ZE#S1#ZB# S1#PC#3#FR#3004646#FT#2228#TO#3006907#TT#2354#`
### Raises:
* `KeyError`: Some required keys are not found in the ref provided
### Returns:
* `str`: Ref of the new type
"""
items = "|".join(ref.split("|")[1:]).strip("#").split("#")
result = {items[i]: items[i + 1] for i in range(0, len(items), 2)}
for required in ["VN", "ZI", "TA", "PU"]:
if required not in result:
raise KeyError(
f"Required key {required} in the old journey ref is not found during conversion to the newer journey ref"
)
return "|".join([result["VN"], result["ZI"], result["TA"], result["PU"]])

View File

@@ -9,13 +9,10 @@ def weekdays_bitmask(data: OrderedDict[str, bool]) -> str:
### Returns:
* str: _description_
"""
output = ""
"""
if len(data) != 7:
raise ValueError("OrderedDict must be formatted as follows: OrderedDict(Monday=bool, Tuesday=bool, Wednesday=bool, Thursday=bool, Friday=bool, Saturday=bool, Sunday=bool)")
for day in data:
if data[day]:
output += "1"
else:
output += "0"
return output
raise ValueError(
"OrderedDict must be formatted as follows: OrderedDict(Monday=bool, Tuesday=bool, Wednesday=bool, Thursday=bool, Friday=bool, Saturday=bool, Sunday=bool)"
)
return "".join("1" if data[day] else "0" for day in data)

82
test.py
View File

@@ -1,82 +0,0 @@
from datetime import datetime, timedelta
from os import makedirs
from typing import Any
from ujson import loads, dumps, JSONDecodeError
from test_colors import *
import pyrmv
try:
with open("test_key.json", mode="r", encoding="utf-8") as file:
key = loads(file.read())["key"]
file.close()
except FileNotFoundError:
key = input("File 'test_key.json' does not exist. Enter your RMV API key to continue: ").strip()
key_save = input("To skip entering your key every time I can save your apikey here. Should I do that? (Y/n) > ").strip().lower()
if key_save == "y":
try:
with open("test_key.json", mode="w", encoding="utf-8") as file:
file.write(dumps({"key": key}))
file.close()
except Exception as exp:
print(f"Could not save 'test_key.json' with your apikey due to {exp}", flush=True)
else:
print("To skip entering your key every time create file 'test_key.json' with your apikey as a value for 'key' dict key.", flush=True)
def test(name: str, data: Any, raw: bool = False) -> None:
makedirs("tests", exist_ok=True)
if isinstance(data, dict):
if "errorCode" in data:
print(f"{BBLACK}[{BRED}ER{BBLACK}] {RESET}Test of {YELLOW}{name} {RESET}did not go well. ErrorCode is {BRED}{data['errorCode']}{RESET}. Check {CYAN}tests/{name}.json {RESET}for more information.", flush=True)
else:
print(f"{BBLACK}[{BGREEN}OK{BBLACK}] {RESET}Test of {YELLOW}{name} {RESET}seems to be alright.", flush=True)
if raw:
try:
with open(f"tests/{name}.json", "w", encoding="utf-8") as file:
file.write(dumps(data, indent=4, ensure_ascii=False))
file.close()
except JSONDecodeError:
print(f"{BBLACK}[{BRED}ER{BBLACK}] {RESET}Test of {YELLOW}{name} {RESET}did not go well. ErrorCode is {BRED}{data['errorCode']}{RESET}. Check {CYAN}tests/{name}.json {RESET}for more information.", flush=True)
else:
with open(f"tests/{name}.txt", "w", encoding="utf-8") as file:
if isinstance(data, list):
list_2 = []
for item in data:
list_2.append(str(item)+"\n")
file.writelines(list_2)
else:
file.write(str(data))
file.close()
if data in ["", "\n"]:
print(f"{BBLACK}[{BRED}ER{BBLACK}] {RESET}Test of {YELLOW}{name} {RESET}did not go well. ErrorCode is {BRED}{data['errorCode']}{RESET}. Check {CYAN}tests/{name}.txt {RESET}for more information.", flush=True) # type: ignore
else:
print(f"{BBLACK}[{BGREEN}OK{BBLACK}] {RESET}Test of {YELLOW}{name} {RESET}is not empty, so might be fine. Check {CYAN}tests/{name}.txt {RESET}for more information.", flush=True)
client = pyrmv.Client(key)
test("raw_board_arrival", pyrmv.raw.board_arrival(key, id="A=1@O=Offenbach (Main)-Tempelsee Wilhelm-Schramm-Straße@X=8783648@Y=50083822@U=80@L=3008012@", maxJourneys=5), raw=True)
test("raw_board_departure", pyrmv.raw.board_departure(key, id="A=1@O=Offenbach (Main)-Tempelsee Wilhelm-Schramm-Straße@X=8783648@Y=50083822@U=80@L=3008012@", maxJourneys=5), raw=True)
test("raw_him_search", pyrmv.raw.him_search(key, dateE=datetime.now()+timedelta(days=10), timeE=datetime.now()+timedelta(days=10), minprio=2, trainnames=["S9"]), raw=True)
test("raw_journey_detail", pyrmv.raw.journey_detail(key, id="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#"), raw=True)
test("raw_stop_by_name", pyrmv.raw.stop_by_name(key, "Groß Karben", maxNo=3), raw=True)
test("raw_stop_by_coords", pyrmv.raw.stop_by_coords(key, 50.131140, 8.733362, radius=300, maxNo=3), raw=True)
test("raw_trip_find", pyrmv.raw.trip_find(key, originCoordLat="50.084659", originCoordLong="8.785948", destCoordLat=50.1233048, destCoordLong=8.6129742, trafficMessages=True, numF=3), raw=True)
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, 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))
test("stop_by_id", client.stop_by_id("A=1@O=Offenbach (Main)-Zentrum Marktplatz/Frankf. Straße@X=8764456@Y=50105181@U=80@L=3002510@"))
test("stop_by_name", client.stop_by_name("Groß Karben", max_number=3))
test("trip_find", client.trip_find(origin_coord_lat="50.084659", origin_coord_lon="8.785948", destination_coord_lat=50.1233048, destination_coord_lon=8.6129742, messages=True))
test("trip_recon", client.trip_recon( client.trip_find(origin_coord_lat="50.084659", origin_coord_lon="8.785948", destination_coord_lat=50.1233048, destination_coord_lon=8.6129742, messages=True, trips_after_time=1)[0] ))

View File

@@ -1,19 +0,0 @@
RESET = '\u001b[0m'
BLACK = '\u001b[30m'
RED = '\u001b[31m'
GREEN = '\u001b[32m'
YELLOW = '\u001b[33m'
BLUE = '\u001b[34m'
MAGENTA = '\u001b[35m'
CYAN = '\u001b[36m'
WHITE = '\u001b[37m'
BBLACK = '\u001b[30;1m'
BRED = '\u001b[31;1m'
BGREEN = '\u001b[32;1m'
BYELLOW = '\u001b[33;1m'
BBLUE = '\u001b[34;1m'
BMAGENTA = '\u001b[35;1m'
BCYAN = '\u001b[36;1m'
BWHITE = '\u001b[37;1m'
ULINE = '\u001b[4m'
REVERSE = '\u001b[7m'

36
tests/conftest.py Normal file
View File

@@ -0,0 +1,36 @@
from os import environ
from typing import List
import pytest
from pyrmv import Client
@pytest.fixture()
def api_token() -> str:
return environ.get("RMV_TOKEN")
@pytest.fixture()
def api_client(api_token: str) -> Client:
return Client(api_token)
@pytest.fixture()
def sample_stop_id() -> str:
return "A=1@O=Frankfurt (Main) Taunusanlage@X=8668765@Y=50113478@U=80@L=3000011@"
@pytest.fixture()
def sample_journey_id() -> str:
return "1|12709|0|80"
@pytest.fixture()
def sample_origin() -> List[str]:
return ["50.084659", "8.785948"]
@pytest.fixture()
def sample_destination() -> List[float]:
return [50.1233048, 8.6129742]

84
tests/test_client.py Normal file
View File

@@ -0,0 +1,84 @@
from datetime import datetime, timedelta
from typing import List
import pytest
from pyrmv import Client, enums
from pyrmv.classes import BoardArrival, BoardDeparture, Journey, Message, Stop, Trip
def test_board_arrival(api_client: Client, sample_stop_id: str):
assert isinstance(
api_client.board_arrival(id=sample_stop_id, journeys_max=3), BoardArrival
)
def test_board_departure(api_client: Client, sample_stop_id: str):
assert isinstance(
api_client.board_departure(id=sample_stop_id, journeys_max=3), BoardDeparture
)
def test_him_search(api_client: Client):
response = api_client.him_search(time_end=datetime.now() + timedelta(days=10))
if len(response) != 0:
assert isinstance(response[0], Message)
else:
assert isinstance(response, list)
def test_journey_detail(api_client: Client, sample_journey_id: str):
assert isinstance(
api_client.journey_detail(
sample_journey_id,
real_time_mode=enums.RealTimeMode.FULL,
),
Journey,
)
def test_stop_by_coords(api_client: Client, sample_origin: List[str]):
assert isinstance(
api_client.stop_by_coords(sample_origin[0], sample_origin[1], max_number=3)[0], Stop
)
def test_stop_by_id(api_client: Client, sample_stop_id: str):
assert isinstance(api_client.stop_by_id(sample_stop_id), Stop)
def test_trip_find(
api_client: Client, sample_origin: List[str], sample_destination: List[float]
):
assert isinstance(
api_client.trip_find(
origin_coord_lat=sample_origin[0],
origin_coord_lon=sample_origin[1],
destination_coord_lat=sample_destination[0],
destination_coord_lon=sample_destination[1],
messages=True,
)[0],
Trip,
)
def test_trip_recon(
api_client: Client, sample_origin: List[str], sample_destination: List[float]
):
assert isinstance(
api_client.trip_recon(
api_client.trip_find(
origin_coord_lat=sample_origin[0],
origin_coord_lon=sample_origin[1],
destination_coord_lat=sample_destination[0],
destination_coord_lon=sample_destination[1],
messages=True,
)[0],
)[0],
Trip,
)
def test_stop_by_name(api_client: Client):
assert isinstance(api_client.stop_by_name("Hauptwache", max_number=1)[0], Stop)

7
tests/test_raw.py Normal file
View File

@@ -0,0 +1,7 @@
import pytest
from pyrmv.raw import stop_by_name
def test_stop_by_name(api_token: str):
assert isinstance(stop_by_name(api_token, "Hauptwache", maxNo=1), dict)

23
tox.ini Normal file
View File

@@ -0,0 +1,23 @@
[tox]
minversion = 3.9.0
envlist = py39, py310, py311, py312
isolated_build = true
[gh-actions]
python =
3.9: py39
3.10: py310
3.11: py311
3.12: py312
[testenv]
setenv =
PYTHONPATH = {toxinidir}
passenv =
RMV_TOKEN
deps =
-r{toxinidir}/requirements/_.txt
-r{toxinidir}/requirements/dev.txt
-r{toxinidir}/requirements/speed.txt
commands =
pytest --basetemp={envtmpdir} --cov=pyrmv --cov-report term-missing

View File

@@ -2,4 +2,38 @@
Welcome to the project's Wiki.
Conceptional there are two different types of methods. Normal and raw ones. Raw methods are only beautiful variant of HTTP requests, nothing except for that actually. Normal ones are meant to be used as objects. You can still provide strings here and there, but basic concept is focused on objects usage.
This module aims to provide eased access to RMV's OpenData API endpoints and enable some home-projects to show the data about public transit state at the moment. As for now, async is not supported and is not necessarily planned in the future, so bigger projects should consider this before using this module in the first place.
## Basic concepts behind
So the module `pyrmv` has two options to choose from when it comes to the usage:
1. Using higher-level methods of the class [pyrmv.Client](https://git.end-play.xyz/profitroll/PythonRMV/wiki/Client). These methods provide pythonic objects, can throw exceptions and are overall pretty neat.
2. Using raw functions from [pyrmv.raw](https://git.end-play.xyz/profitroll/PythonRMV/wiki/Raw-Functions). These functions are basically a small interface for HTTP requests that happen in the background and have little to no processing behind the scenes.
Your preferred variant depends on the use case, but usually higher-level methods of the Client should be the match.
## Objects
This module does **not** use the [FPTF](https://github.com/public-transport/friendly-public-transport-format) because it aims to give full access to the API RMV provides, thus objects Client gives you will contain a bit more information.
These objects are implemented in pyrmv:
* [BoardArrival](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.BoardArrival)
* [BoardDeparture](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.BoardDeparture)
* [LineArrival](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.LineArrival)
* [LineDeparture](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.LineDeparture)
* [Gis](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Gis)
* [Journey](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Journey)
* [Leg](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Leg)
* [Channel](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Channel)
* [Message](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Message)
* [Url](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Url)
* [Stop](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Stop)
* [StopTrip](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.StopTrip)
* [Trip](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Trip)
* ~~[Ticket](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Ticket)~~ (WIP)
## Note for bigger projects
As you may already know, bigger projects like [Öffi](https://gitlab.com/oeffi/oeffi) and [DB Navigator](https://play.google.com/store/apps/details?id=de.hafas.android.db) use NVV's API instead of RMV's for navigation and public transit querying. Reasons behind this are clear as day and from perspective of pyrmv it's highly recommended you also choose that way, because RMV loves to change or break their API in unexpected places and does not cooperate with developers well enough when they do so.

1
wiki/Raw-Functions.md Normal file
View File

@@ -0,0 +1 @@
Docs are not available yet. Please, use the linting in your IDE until the documentation is there.

View File

@@ -1,15 +1,21 @@
## [Home](https://git.end-play.xyz/profitroll/PythonRMV/wiki)
# [Home](https://git.end-play.xyz/profitroll/PythonRMV/wiki)
### Classes
* [Client](https://git.end-play.xyz/profitroll/PythonRMV/wiki/Client)
## Classes
### Methods
* [board_arrival](https://git.end-play.xyz/profitroll/PythonRMV/wiki/board_arrival)
* [board_departure](https://git.end-play.xyz/profitroll/PythonRMV/wiki/board_departure)
* [him_search](https://git.end-play.xyz/profitroll/PythonRMV/wiki/him_search)
* [journey_detail](https://git.end-play.xyz/profitroll/PythonRMV/wiki/journey_detail)
* [stop_by_coords](https://git.end-play.xyz/profitroll/PythonRMV/wiki/stop_by_coords)
* [stop_by_id](https://git.end-play.xyz/profitroll/PythonRMV/wiki/stop_by_id)
* [stop_by_name](https://git.end-play.xyz/profitroll/PythonRMV/wiki/stop_by_name)
* [trip_find](https://git.end-play.xyz/profitroll/PythonRMV/wiki/trip_find)
* [trip_recon](https://git.end-play.xyz/profitroll/PythonRMV/wiki/trip_recon)
* [Client](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Client)
## Methods
* [board_arrival](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Client.board_arrival)
* [board_departure](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Client.board_departure)
* [him_search](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Client.him_search)
* [journey_detail](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Client.journey_detail)
* [stop_by_coords](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Client.stop_by_coords)
* [stop_by_id](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Client.stop_by_id)
* [stop_by_name](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Client.stop_by_name)
* [trip_find](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Client.trip_find)
* [trip_recon](https://git.end-play.xyz/profitroll/PythonRMV/wiki/classes.Client.trip_recon)
## Raw functions
* [List of raw functions](https://git.end-play.xyz/profitroll/PythonRMV/wiki/Raw-Functions)

View File

@@ -0,0 +1 @@
Docs are not available yet. Please, use the linting in your IDE until the documentation is there.

View File

@@ -0,0 +1 @@
Docs are not available yet. Please, use the linting in your IDE until the documentation is there.

1
wiki/classes/Channel.md Normal file
View File

@@ -0,0 +1 @@
Docs are not available yet. Please, use the linting in your IDE until the documentation is there.

View File

@@ -1,5 +1,6 @@
# PythonRMV Client
You are now viewing the main class of the module, its heart. The main Client class, all available normal methods can be found here.
# Client
You are now viewing the main class of the module, all available higher-level methods can be found here.
This page is about the Client class, which exposes high-level methods for an easy access to the API.
@@ -11,14 +12,14 @@ client = Client("SampleAPIKey")
print(client.stop_by_id("A=1@O=Offenbach (Main)-Zentrum Marktplatz\/Frankf. Straße@X=8764456@Y=50105181@U=80@L=3002510@"))
```
# Details
## `class pyrmv.Client`
## Details
### Parameters
* access_key (`str`) Access ID for identifying the requesting client. Get your key on [RMV website](https://opendata.rmv.de/site/start.html).
### Methods:
### Methods
* [board_arrival](https://git.end-play.xyz/profitroll/PythonRMV/wiki/board_arrival) -> `BoardArrival`
* [board_departure](https://git.end-play.xyz/profitroll/PythonRMV/wiki/board_departure) -> `BoardDeparture`
* [him_search](https://git.end-play.xyz/profitroll/PythonRMV/wiki/him_search) -> `List[Message]`
@@ -27,4 +28,4 @@ print(client.stop_by_id("A=1@O=Offenbach (Main)-Zentrum Marktplatz\/Frankf. Stra
* [stop_by_id](https://git.end-play.xyz/profitroll/PythonRMV/wiki/stop_by_id) -> `Union[Stop, None]`
* [stop_by_name](https://git.end-play.xyz/profitroll/PythonRMV/wiki/stop_by_name) -> `List[Stop]`
* [trip_find](https://git.end-play.xyz/profitroll/PythonRMV/wiki/trip_find) -> `List[Trip]`
* [trip_recon](https://git.end-play.xyz/profitroll/PythonRMV/wiki/trip_recon) -> `List[Trip]`
* [trip_recon](https://git.end-play.xyz/profitroll/PythonRMV/wiki/trip_recon) -> `List[Trip]`

View File

@@ -0,0 +1 @@
Docs are not available yet. Please, use the linting in your IDE until the documentation is there.

View File

@@ -0,0 +1 @@
Docs are not available yet. Please, use the linting in your IDE until the documentation is there.

View File

@@ -0,0 +1 @@
Docs are not available yet. Please, use the linting in your IDE until the documentation is there.

View File

@@ -0,0 +1 @@
Docs are not available yet. Please, use the linting in your IDE until the documentation is there.

View File

@@ -0,0 +1 @@
Docs are not available yet. Please, use the linting in your IDE until the documentation is there.

View File

@@ -0,0 +1 @@
Docs are not available yet. Please, use the linting in your IDE until the documentation is there.

View File

@@ -0,0 +1 @@
Docs are not available yet. Please, use the linting in your IDE until the documentation is there.

View File

@@ -0,0 +1 @@
Docs are not available yet. Please, use the linting in your IDE until the documentation is there.

Some files were not shown because too many files have changed in this diff Show More