Skip to content
This repository has been archived by the owner on Jul 11, 2024. It is now read-only.

Commit

Permalink
Update to onboardapis 2.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
felix-zenk committed May 17, 2024
1 parent fda2b14 commit 62d111e
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 91 deletions.
1 change: 0 additions & 1 deletion MANIFEST.in

This file was deleted.

34 changes: 4 additions & 30 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ No longer actively developed in favor of the [onboardAPIs](https://github.com/fe

---


[![PyPI version](https://badge.fury.io/py/iceportal_apis.svg)](https://pypi.org/project/iceportal-apis)
[![PyPI-Versions](https://img.shields.io/pypi/pyversions/iceportal-apis)](https://pypi.org/project/iceportal-apis)
[![GitHub](https://img.shields.io/badge/license-MIT-green)](https://github.com/felix-zenk/iceportal-apis/blob/main/LICENSE)
Expand All @@ -19,20 +18,13 @@ This is an unofficial project and not supported by [`Deutsche Bahn AG`](https://

> Note, that this module will only work correctly while you are on a train and connected to its WiFi-Hotspot.
#

### Installation
* Available on PyPI
```shell
$ python -m pip install iceportal_apis
```

#

### Usage
> ~~Example code is available in the file [`example.py`](https://github.com/felix-zenk/iceportal-apis/blob/main/samples/example.py) and other files in [`samples`](https://github.com/felix-zenk/iceportal-apis/blob/main/samples).~~
>
> ~~The basic usage consists of requesting new data from the api, then processing it with the modules functions.~~

```python
import iceportal_apis as ipa
Expand All @@ -50,40 +42,20 @@ while True:
. . .
```
#
### License
> **This software is distributed under the MIT License, please see [`LICENSE`](https://github.com/felix-zenk/iceportal-apis/blob/main/LICENSE) for detailed information.**
#
### <div id="api">API documentation</div>
### API documentation
#### 1. Status API
The Status API is available at [https://iceportal.de/api1/rs/status](https://iceportal.de/api1/rs/status)
~~A sample response can be found at:~~
```python
# deprecated
```
#### 2. Trip API
The Trip API is available at [https://iceportal.de/api1/rs/tripInfo/trip](https://iceportal.de/api1/rs/tripInfo/trip)
~~A sample response can be found at:~~
```python
# deprecated
```
#### 3. Connections API
The Connecting trains API can be found at [https://iceportal.de/api1/rs/tripInfo/connection/{eva_number}](https://iceportal.de/api1/rs/tripInfo/connection/8000000_00)
~~A sample response can be found at:~~
```python
# deprecated
```
#### 4. Other APIs
These are other APIs I discovered but didn't investigate in:
Expand All @@ -93,4 +65,6 @@ These are other APIs I discovered but didn't investigate in:
4.3. [https://iceportal.de/api1/rs/configs/cities](https://iceportal.de/api1/rs/configs/cities)
#
4.4. [https://iceportal.de/bap/api/availabilities](https://iceportal.de/bap/api/availabilities)
4.5. [https://iceportal.de/bap/api/bap-service-status](https://iceportal.de/bap/api/bap-service-status)
80 changes: 37 additions & 43 deletions iceportal_apis/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,23 @@
from typing import Union, Any, List, Tuple, Dict
from datetime import datetime, timedelta

from onboardapis.utils.conversions import ms_to_kmh
from onboardapis import Vehicle
from onboardapis.trains import Station as OAStation, ConnectingTrain
from onboardapis.trains.germany.db import ICEPortal
from onboardapis.units import kmh
from onboardapis.train import TrainStation as OAStation, ConnectingTrain
from onboardapis.train.de.db import ICEPortal

from .types import (TrainType, WagonClass, InterfaceStatus, Internet)
from .exceptions import (ApiException, NetworkException, NotInFutureException, NotAvailableException,
NotOnTrainException, NoneDataException, MissingArgumentError)

import warnings
warnings.warn(
"This package is no longer maintained in favor of the 'onboardapis' package https://pypi.org/projects/onboardapis.",
"This package is no longer maintained in favor of the "
"'onboardapis' package https://pypi.org/projects/onboardapis."
"At this point iceportal-apis also is just a wrapper around onboardapis.",
DeprecationWarning
)

######################################
__author__ = 'Felix Zenk'
__email__ = 'felix.zenk@web.de'
__version__ = '2.0.2'
######################################


def _ensure_not_none(param: Any) -> Any:
"""
Expand Down Expand Up @@ -72,21 +68,21 @@ def __repr__(self) -> str:


class Train(Vehicle):
def __init__(self, auto_refresh: bool = False, test_mode: bool = False, dynamic_simulation: bool = False) -> None:
if test_mode or dynamic_simulation:
raise NotImplementedError("Test mode and dynamic simulation are not supported anymore.")
__oa: ICEPortal

def __init__(self, *args, **kwargs) -> None:
super().__init__()
self.__oa = ICEPortal()
self.__oa.init()

def __str__(self) -> str:
return "<"+self.get_train_type().name+" "+self.get_trip_id()+" -> "+self.get_final_station().name+">"
return "<%s %s -> %s>" % (self.get_train_type().name, self.get_trip_id(), self.get_next_station().name)

def get_speed(self) -> float:
"""
Gets the current speed of the train in kilometers/hour.
"""
return ms_to_kmh(self.__oa.speed)
return kmh(ms=self.__oa.speed)

def get_train_type(self) -> TrainType:
"""
Expand All @@ -100,34 +96,36 @@ def get_wagon_class(self) -> WagonClass:
"""
Gets the wagon class (can be inaccurate for wagons next to another class).
"""
return WagonClass.__members__[self.__oa.wagon_class()] \
if self.__oa.wagon_class() in WagonClass.__members__.keys() \
return (
WagonClass.__members__[self.__oa.wagon_class] # type: str
if self.__oa.wagon_class in WagonClass.__members__.keys()
else WagonClass.UNKNOWN
)

def get_internet_status(self) -> Internet:
"""
Gets the current internet status / (speed)
"""
return _convert_to_internet_status(self.__oa.internet_connection()[0])
return _convert_to_internet_status(self.__oa.internet_status)

def get_next_internet_status(self) -> Internet:
"""
Gets the next internet status / (speed)
"""
return _convert_to_internet_status(_ensure_not_none(self.__oa.internet_connection()[1]))
return _convert_to_internet_status(_ensure_not_none(self.__oa.next_internet_status))

def get_time_until_internet_change(self) -> timedelta:
"""
Gets the time until the network status changes
"""
return timedelta(seconds=int(_ensure_not_none(self.__oa.internet_connection()[2])))
return _ensure_not_none(self.__oa.internet_status_change)

def has_bap_service(self) -> bool:
"""
Whether this train offers ordering food from the passengers seat
:return: Whether this train provides bap service or not
"""
return self.__oa.has_bap()
return self.__oa.has_bap

def get_latitude(self) -> float:
"""
Expand Down Expand Up @@ -157,7 +155,7 @@ def get_trip_id(self) -> str:
"""
Gets the ID of the trip
"""
return self.__oa.number
return self.__oa.line_number

def get_next_station(self) -> Station:
"""
Expand All @@ -169,11 +167,7 @@ def get_last_station(self) -> Station:
"""
Gets the last station.
"""
idx_last_station = list(self.__oa.stations.values()).index(self.__oa.current_station) - 1
if idx_last_station < 0:
idx_last_station = 0
id_last_station = list(self.__oa.stations.keys())[idx_last_station]
station = self.__oa.stations.get(id_last_station)
station = self.__oa.stations[max(0, self.__oa.stations.index(self.__oa.current_station) - 1)]
return Station(station.id, station.name)

def get_final_station(self) -> Station:
Expand All @@ -186,15 +180,15 @@ def get_all_stations(self) -> List[Station]:
"""
Gets all stations for this trip.
"""
return list([
Station(station.id, station.name) for station in self.__oa.stations.values()
])
return [
Station(station.id, station.name) for station in self.__oa.stations
]

def get_arrival_time(self, station: Station) -> datetime:
"""
Gets the arrival time at a specific station.
"""
return self.__oa.stations.get(station.eva_number).arrival.actual
return self.__oa.stations_dict.get(station.eva_number).arrival.actual

def get_time_until_arrival(self, station: Station) -> timedelta:
"""Gets the time until the arrival at a specific station.
Expand All @@ -206,7 +200,7 @@ def get_departure_time(self, station: Station) -> datetime:
"""
Gets the departure time at a specific station.
"""
return self.__oa.stations.get(station.eva_number).departure.actual
return self.__oa.stations_dict.get(station.eva_number).departure.actual

def get_time_until_departure(self, station: Station) -> timedelta:
"""
Expand All @@ -219,22 +213,22 @@ def get_platform(self, station: Station) -> str:
"""
Gets the trains arrival platform for a specific station
"""
return self.__oa.stations.get(station.eva_number).platform.actual
return self.__oa.stations_dict.get(station.eva_number).platform.actual

def get_delay_at(self, station: Station) -> timedelta:
"""
Gets the delay at a station
"""
return (
self.__oa.stations.get(station.eva_number).arrival.actual
- self.__oa.stations.get(station.eva_number).arrival.scheduled
self.__oa.stations_dict.get(station.eva_number).arrival.actual
- self.__oa.stations_dict.get(station.eva_number).arrival.scheduled
)

def get_current_delay(self) -> timedelta:
"""
Gets the current delay
"""
return timedelta(seconds=self.__oa.delay)
return self.__oa.delay

def is_delayed(self) -> bool:
"""
Expand All @@ -246,7 +240,7 @@ def get_delay_reasons_at(self, station: Station) -> List[str]:
"""
Gets the delay reasons for a specific station
"""
return self.__oa.all_delay_reasons().get(station.eva_number, [])
return self.__oa.all_delay_reasons.get(station.eva_number, [])

def get_current_delay_reasons(self) -> List[str]:
"""
Expand All @@ -258,29 +252,29 @@ def get_station_position(self, station: Station) -> Tuple[float, float]:
"""
Gets the position of a specific station
"""
pos = self.__oa.stations.get(station.eva_number).position
pos = self.__oa.stations_dict.get(station.eva_number).position
return pos.latitude, pos.longitude

def get_station_distance(self, station: Station) -> float:
"""
Calculates the distance to a specific station and returns it in meters
"""
return self.__oa.calculate_distance(self.__oa.stations.get(station.eva_number))
return self.__oa.calculate_distance(self.__oa.stations_dict.get(station.eva_number))

def get_connections(self, station: Station) -> List[ConnectingTrain]:
"""
Returns the connecting trains from a specific station
"""
return self.__oa.stations.get(station.eva_number).connections
return self.__oa.stations_dict.get(station.eva_number).connections

def get_all_connections(self) -> Dict[str, List[ConnectingTrain]]:
"""
Gets all connections for every available station
(usually every station except for the first one)
"""
return {
station_id: self.__oa.stations.get(station.id).connections
for station_id, station in self.__oa.stations.items()
station_id: self.__oa.stations_dict.get(station.id).connections
for station_id, station in self.__oa.stations_dict.items()
}

def get_connections_info(self, station) -> List[Dict[str, Union[str, Station, datetime]]]:
Expand All @@ -292,7 +286,7 @@ def get_connections_info(self, station) -> List[Dict[str, Union[str, Station, da
"""
return list([
{
'trainName': f"{connection.train_type} {connection.line_number}",
'trainName': f"{connection.vehicle_type} {connection.line_number}",
'finalStation': connection.destination,
'departure': (
connection.departure.actual
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
onboardapis>=1.2.3
onboardapis>=2.0.0,<3
26 changes: 10 additions & 16 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,20 @@
import setuptools
from iceportal_apis import __version__, __author__, __email__
from pathlib import Path
from setuptools import setup, find_packages

with open("README.md", "r") as fh:
long_description = fh.read()

include_files = {'iceportal_apis': ['*.json', 'mocking/sample_data/*.json']}

setuptools.setup(
setup(
name="iceportal_apis",
version=__version__,
author=__author__,
author_email=__email__,
version='2.0.3',
author='Felix Zenk',
author_email='felix.zenk@web.de',
description="A module for interacting with the Deutsche Bahn onboard APIs",
long_description=long_description,
long_description=Path('README.md').read_text(encoding='utf-8'),
long_description_content_type="text/markdown",
url="https://github.com/felix-zenk/iceportal-apis",
project_urls={
"Bug Reports": "https://github.com/felix-zenk/iceportal-apis/issues/new?labels=bug&template=bug_report.md&title=%5BBUG%5D%3A+",
"Source": "https://github.com/felix-zenk/iceportal-apis",
},
packages=setuptools.find_packages(),
include_package_data=True,
packages=find_packages(include=['iceportal_apis', 'iceportal_apis.*']),
license='MIT',
classifiers=[
'License :: OSI Approved :: MIT License',
Expand All @@ -36,5 +30,5 @@
"Topic :: Internet :: WWW/HTTP :: Dynamic Content",
'Topic :: Utilities'
],
python_requires='>=3.7.2',
)
python_requires='>=3.8',
)

0 comments on commit 62d111e

Please sign in to comment.