Skip to main content

Unit Tests Code style: black

eflips-ingest


Part of the eFLIPS/simBA list of projects.


This repository contains code to import bus schedules from various sources into an eFLIPS-Model database.

Installation

  1. Set up a PostgreSQL database with the PostGIS extension and BTREE_gist enabled.

    apt install postgresql postgis
    sudo -u postgres psql createdb eflips
    sudo -u postgres psql eflips -c "CREATE EXTENSION postgis;"
    sudo -u postgres psql eflips -c "CREATE EXTENSION btree_gist;"
    
  2. Clone this git repository (or download a specific release)

    git clone git@github.com:mpm-tu-berlin/eflips-model.git
    
  3. Install the packages listed in poetry.lock and pyproject.toml into your Python environment. Notes:

    • This project depends on pyproj, which may require the proj-bin package (apt install proj-bin on Ubuntu).
    • The supported platforms are macOS and Linux.
    • Using the poetry package manager is recommended. It can be installed accoring to the instructions listed here.
    poetry install
    

Usage

The code is organized as a set of ingester packages under eflips/ingest/, each covering a specific data source. Use them via the API described below. Supported sources:

  • eflips.ingest.bvgxml.BvgxmlIngester: XML files emitted by BVG's proprietary software.
    • Known Limitations:
      • The source data is known to contain some partial rotations of the bus routes. These are imported, which may lead to errors when creating a depot for each start and end spot, as some roations start/end at spots that are not depots.
      • Some routes that are going from the same stop to the stop itself are not imported, as they are considered to be invalid.
      • Some route's distance and time is fudged, when it is found to be unrealistically short or long.
  • eflips.ingest.vdv.VdvIngester: VDV 451/452 archives.
  • eflips.ingest.gtfs.GtfsIngester: GTFS feeds.

Altitude lookups

All ingesters store stations and route shapes with an altitude (the model's geometries are POINT Z / LINESTRING Z). Altitudes are looked up through eflips.model.util.get_altitudes, which batches all coordinates of an import into as few requests as possible and caches results on disk. The environment variables involved:

  • GOOGLE_MAPS_API_KEY: required for real altitudes. The Google Elevation API is billed per request; one request carries up to 512 points.
  • OPENELEVATION_URL: optional. If set, an Open-Elevation server is queried first and only the points it cannot answer go to Google.
  • ELEVATION_DUMMY_MODE=True: skip all lookups and store a dummy altitude of 9999 m. This is what the test suite and CI use.

API


All API Classes should inherit from eflip.ingest.base.AbstractIngester. This class also provides documentation on how to implement the required methods.


The eflips-ingest package is designed to provide a standardized access method to the different ingesters. It is designed as a reusable package providing a programmatic API. It provides the Ingester class with the following methods:

  • __init__(self, database_url: str): The constructor. It takes the database URL as a parameter.
  • prepare(self, progress_callback: None | Callable[[float], None] = None, **kwargs: Dict[str, str | int | float | bool | Enum | Path],) -> Tuple[bool, UUID | Dict[str, str]]:: This method is used to validate the data. It has multiple keyword arguments, one for each parameter. It returns a tuple containing a boolean indicating whether the data is valid and a UUID if the data is valid or a dictionary containing the error names and messages if the data is invalid. It is suggested that the input form is generated by introspecting this method. If a UUID is returned, this UUID can be used to start the ingestion process, even with another instance of this Ingester class (the validated input data is saved to a temporary directory).
  • ingest(self, UUID: UUID, progress_callback: None | Callable[[float], None]) -> None: This method is used to start the ingestion process. It takes the UUID returned by the validate method and a callback function that will be called with the progress of the ingestion process. It is suggested that the progress is displayed in the UI. This method may raise an exception if the ingestion process fails. Note that exceptions should not be raised during the ingest process if everything goes well, as we are checking validity in the validate method.
  • prepare_param_names() This property should return a dict with a short description of each parameter that the prepare method takes. This can be used for Naming fields in the UI.
  • prepare_param_descriptions() This property should return a dict with a long description of each parameter that the prepare method takes. This can be used for tooltips in the UI.

In addition, the package provides a get_ingesters function that returns a list of Ingester classes.

Testing


NOTE: Be aware that the tests will clear the database specified in the DATABASE_URL environment variable. Make sure that you are not using a database that you want to keep.


Testing is done using the pytest framework with tests located in the testsdirectory. To run the tests, execute the following command in the root directory of the repository:

   export PYTHONPATH=tests:. # To make sure that the tests can find the eflips package
   export DATABASE_URL=postgis://postgres:postgres@localhost:5432/postgres # Or whatever your database URL is
   export ELEVATION_DUMMY_MODE=True # Skip altitude lookups; the tests never need real altitudes
   pytest

Development

We utilize the GitHub Flow branching structure. This means that the main branch is always deployable and that all development happens in feature branches. The feature branches are merged into main via pull requests.

We use black for code formatting. You can use pre-commit to ensure the code is formatted correctly before committing. You are also free to use other methods to format the code, but please ensure that the code is formatted correctly before committing.

Please make sure that your poetry.lock and pyproject.toml files are consistent before committing. You can use poetry check to check this. This is also checked by pre-commit.

License

This project is licensed under the AGPLv3 license - see the LICENSE file for details.

Funding Notice

This code was developed as part of the project eBus2030+ funded by the Federal German Ministry for Digital and Transport (BMDV) under grant number 03EMF0402.

Metadata

Release files for eflips-ingest 2.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for eflips-ingest 2.3.0
File Size Uploaded
eflips_ingest-2.3.0.tar.gz 125.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for eflips-ingest 2.3.0
File Interpreter ABI Platform
eflips_ingest-2.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 259.0 kB

Release files / eflips_ingest-2.3.0.tar.gz

Download URL eflips_ingest-2.3.0.tar.gz
Size 125.3 kB
Tags Source
SHA-256 checksum
How to use checksums
464df47c79fd61d3e77c6c5b814ba86dfbab5ad138262f39b655db89f2dcf68d
BLAKE2b-256 checksum
How to use checksums
d0206d39bf79c17e4290ce669ca4c8106947e5045f04f95c5b739502f809ab22
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release files / eflips_ingest-2.3.0-py3-none-any.whl

Download URL eflips_ingest-2.3.0-py3-none-any.whl
Size 133.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f39f15543f7965f19650b86472338ec68d5cd14cd6c39dd7fd2eb3176de3e18f
BLAKE2b-256 checksum
How to use checksums
e3c94159b41c86b181d118762f36ada89e0b02796f1971fb11f125b71a37d2f6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

2.3.0 This release

2 release files

2.2.0

2 release files

2.1.1

2 release files

2.1.0

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.8.1

2 release files

1.8.0

2 release files

1.7.0

2 release files

1.6.5

2 release files

1.6.4

2 release files

1.6.3

2 release files

1.6.2

2 release files

1.6.1

2 release files

1.6.0

2 release files

1.5.0

2 release files

1.4.5

2 release files

1.4.4

2 release files

1.4.3

2 release files

1.4.2

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.3

2 release files

1.3.2

2 release files

1.3.1

2 release files

1.3

2 release files

1.2.85

2 release files

1.2.84

2 release files

1.2.83

2 release files

1.2.82

2 release files

1.2.81

2 release files

1.2.80

2 release files

1.2.79

2 release files

1.2.78

2 release files

1.2.76

2 release files

1.2.6

2 release files

1.2.5

2 release files

1.2.4

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page