v0.4.0 #53
34
.gitea/workflows/tests.yml
Normal file
34
.gitea/workflows/tests.yml
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
name: Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- dev
|
||||||
|
- main
|
||||||
|
tags-ignore:
|
||||||
|
- v*
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: catthehacker/ubuntu:act-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"]
|
||||||
|
|
||||||
|
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
|
||||||
|
run: tox
|
||||||
|
|
15
.gitignore
vendored
15
.gitignore
vendored
@ -154,12 +154,9 @@ cython_debug/
|
|||||||
|
|
||||||
|
|
||||||
# Custom
|
# Custom
|
||||||
.pypirc
|
.vscode/
|
||||||
tests
|
.venv_linux/
|
||||||
test.bat
|
.venv_windows/
|
||||||
test_key.json
|
|
||||||
build.*
|
# Module-related
|
||||||
cleanup.*
|
tests/output/
|
||||||
publish.*
|
|
||||||
publish-release.*
|
|
||||||
.vscode
|
|
69
pyproject.toml
Normal file
69
pyproject.toml
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
[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.8"
|
||||||
|
license = { text = "GPL3" }
|
||||||
|
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.7",
|
||||||
|
"Programming Language :: Python :: 3.8",
|
||||||
|
"Programming Language :: Python :: 3.9",
|
||||||
|
"Programming Language :: Python :: 3.10",
|
||||||
|
"Programming Language :: Python :: 3.11",
|
||||||
|
"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" }
|
||||||
|
|
||||||
|
[tool.setuptools.packages.find]
|
||||||
|
where = ["src"]
|
||||||
|
|
||||||
|
[tool.black]
|
||||||
|
target-version = ['py38', 'py39', 'py310', 'py311']
|
||||||
|
|
||||||
|
[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.8
|
||||||
|
|
||||||
|
[tool.coverage.run]
|
||||||
|
source = ["libbot"]
|
12
requirements/dev.txt
Normal file
12
requirements/dev.txt
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
black==23.11.0
|
||||||
|
build==1.0.3
|
||||||
|
isort==5.12.0
|
||||||
|
mypy==1.7.0
|
||||||
|
pylint==3.0.2
|
||||||
|
pytest-asyncio==0.22.0
|
||||||
|
pytest-cov==4.1.0
|
||||||
|
pytest==7.4.3
|
||||||
|
tox==4.11.3
|
||||||
|
twine==4.0.2
|
||||||
|
types-aiofiles==23.2.0.0
|
||||||
|
types-ujson==5.8.0.1
|
36
setup.py
36
setup.py
@ -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",
|
|
||||||
],
|
|
||||||
)
|
|
@ -21,7 +21,7 @@ trip = client.trip_find(origin_id=origin.id, dest_id=destination.id)
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
__name__ = "pyrmv"
|
__name__ = "pyrmv"
|
||||||
__version__ = "0.3.5"
|
__version__ = "0.3.6"
|
||||||
__license__ = "MIT License"
|
__license__ = "MIT License"
|
||||||
__author__ = "Profitroll"
|
__author__ = "Profitroll"
|
||||||
|
|
82
test.py
82
test.py
@ -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] ))
|
|
@ -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'
|
|
22
tox.ini
Normal file
22
tox.ini
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
[tox]
|
||||||
|
minversion = 3.8.0
|
||||||
|
envlist = py37, py38, py39, py310, py311
|
||||||
|
isolated_build = true
|
||||||
|
|
||||||
|
[gh-actions]
|
||||||
|
python =
|
||||||
|
3.7: py37
|
||||||
|
3.8: py38
|
||||||
|
3.9: py39
|
||||||
|
3.10: py310
|
||||||
|
3.11: py311
|
||||||
|
|
||||||
|
[testenv]
|
||||||
|
setenv =
|
||||||
|
PYTHONPATH = {toxinidir}
|
||||||
|
deps =
|
||||||
|
-r{toxinidir}/requirements/_.txt
|
||||||
|
-r{toxinidir}/requirements/dev.txt
|
||||||
|
commands =
|
||||||
|
pytest --basetemp={envtmpdir} --cov=cringepredictor --cov-report term-missing
|
||||||
|
|
Loading…
Reference in New Issue
Block a user