/py-poa-bus

Module/CLI to retrieve the bus timetables of Porto Alegre city from EPTC web site

Primary LanguagePythonMIT LicenseMIT

Project Deprecation Notice

This project is deprecated since EPTC is no longer making the time tables available.

PyPoABus

Build Status Code covarage

Module to retrieve the bus timetables of Porto Alegre city from EPTC web site

  • List bus line codes by zone: north, south, east, public (from Carris company)
  • Retrieve timetables by bus line

Data source: www.eptc.com.br

Why this project?

Currently, Porto Alegre city hall doesn't provide an API to get the oficial information about bus timetables. This project aims to provide an interface to convert the oficial online information from EPTC web site to JSON representation.

Setup the project

This project uses Pipenv as packaging tool.

So you can run:

# Installing dependencies
$ pipenv install

Running the same command using make:

# Using the Makefile
$ make install

Install as Python Module in a Virtual Env

$ git clone https://github.com/jonathadv/py-poa-bus.git
$ cd py-poa-bus/
$ pipenv install
$ pipenv shell
(py-poa-bus-owRTHeFi) $ ./setup.py install

Usage

List bus lines

>>> from pypoabus import pypoabus
>>> zone = 'south'
>>> list_bus_lines = pypoabus.list_bus_lines(zone)
>>> for i in list_bus_lines:
...     print(i)
... 
{"code": "210-14", "name": "110 - RESTINGA NOVA VIA TRISTEZA"}
{"code": "210-81", "name": "1101 - RESTINGA NOVA VIA TRISTEZA/DOMINGOS E FERIADOS"}
{"code": "210-46", "name": "1102 - RESTINGA NOVA VIA TRISTEZA/BARRA SHOPPING"}
{"code": "211-11", "name": "111 - RESTINGA VELHA (TRISTEZA)"}
{"code": "211-12", "name": "1111 - RESTINGA VELHA(TRISTEZA)/SHOPPING"}
{"code": "272-33", "name": "1112 - HIPICA/TRISTEZA"}

Get bus line timetable

>>> from pypoabus import pypoabus
>>> bus_line_code = '281-1'
>>> timetable = pypoabus.get_bus_timetable(bus_line_code)
>>> timetable.code
'2811'
>>> timetable.name
'CAMPO NOVO / MORRO AGUDO'
>>> timetable.to_json()
'{"code": "2811", "name": "CAMPO NOVO / MORRO AGUDO", "schedules": [{"direction": "BAIRRO/CENTRO", "schedule_day": "Dias Úteis", "timetable": ["05:30", "06:00", "06:30", "06:55", "07:25", "07:45", "09:00", "09:55", "10:35", "11:00", "11:35", "12:35", "13:30", "14:10", "14:40", "15:45", "16:25", "17:55", "19:10", "20:30", "21:30", "22:25"]}, {"direction": "BAIRRO/CENTRO", "schedule_day": "Sábados", "timetable": ["06:15", "06:55", "07:45", "08:30", "10:20", "11:20", "13:35", "14:25", "15:40", "16:55", "18:10", "19:25", "21:05", "22:45"]}, {"direction": "CENTRO/BAIRRO", "schedule_day": "Dias Úteis", "timetable": ["06:20", "06:50", "08:05", "08:25", "08:45", "10:00", "10:55", "11:35", "12:00", "12:35", "13:35", "14:30", "15:10", "15:40", "16:45", "17:25", "17:50", "18:45", "18:55", "20:00", "22:15", "23:10"]}, {"direction": "CENTRO/BAIRRO", "schedule_day": "Sábados", "timetable": ["07:05", "07:45", "08:35", "09:20", "10:05", "11:10", "12:10", "14:25", "15:15", "16:30", "20:15", "21:50", "23:30"]}]}'
>>> 

CMD Tool

This tool allows the user to access some features of PyPoaBus without to code a new module or Python script. It handles stdout and stderr messages, so | (pipe) can be used to send the output to another handler.

The below examples are using jq (https://stedolan.github.io/jq/) to format the JSON output.

Help

$ python -m pypoabus

usage: pypoabus [-h] [-l zone | -t line_code] [-f format] [-d]

optional arguments:
  -h, --help            show this help message and exit
  -l zone, --list zone  List all line codes by zone: [north|south|east|public]
  -t line_code, --timetable line_code
                        Line code like 281-1, 101-1, etc.
  -f format, --format format
                        [json|table]
  -d, --debug-url       Log the URL that pypoabus will call

Examples

List bus lines

$ python -m pypoabus -l south -f json | jq  # jq is only a external tool to format json (not included) :D
{
  "list": [
    {
      "code": "210-14",
      "name": "110 - RESTINGA NOVA VIA TRISTEZA"
    },
    {
      "code": "210-81",
      "name": "1101 - RESTINGA NOVA VIA TRISTEZA/DOMINGOS E FERIADOS"
    },
    {
      "code": "210-46",
      "name": "1102 - RESTINGA NOVA VIA TRISTEZA/BARRA SHOPPING"
    },
    {
      "code": "211-11",
      "name": "111 - RESTINGA VELHA (TRISTEZA)"
    }
}
$ python -m pypoabus -l south -f table # format output as table
┌───────────────────────────────┐
│    List of Bus lines  (South) │
└───────────────────────────────┘
┌────────┬────────────────────────────────────────────────────────┐
│ Code   │ Name                                                   │
├────────┼────────────────────────────────────────────────────────┤
│ 210-14 │ 110 - RESTINGA NOVA VIA TRISTEZA                       │
├────────┼────────────────────────────────────────────────────────┤
│ 210-81 │ 1101 - RESTINGA NOVA VIA TRISTEZA/DOMINGOS E FERIADOS  │
├────────┼────────────────────────────────────────────────────────┤
│ 210-46 │ 1102 - RESTINGA NOVA VIA TRISTEZA/BARRA SHOPPING       │
├────────┼────────────────────────────────────────────────────────┤
│ 211-11 │ 111 - RESTINGA VELHA (TRISTEZA)                        │
├────────┼────────────────────────────────────────────────────────┤
│ 211-12 │ 1111 - RESTINGA VELHA(TRISTEZA)/SHOPPING               │
├────────┼────────────────────────────────────────────────────────┤
│ 272-33 │ 1112 - HIPICA/TRISTEZA                                 │
├────────┼────────────────────────────────────────────────────────┤
│ 149-0  │ 149 - ICARAI                                           │
├────────┼────────────────────────────────────────────────────────┤

Get bus line timetable

$ python -m pypoabus -t 281-81 -f json | jq # jq is only a external tool to format json (not included) :D
{
  "code": "R81",
  "name": "RAPIDA CAMPO NOVO",
  "schedules": [
    {
      "direction": "BAIRRO/CENTRO",
      "schedule_day": "Dias Úteis",
      "timetable": [
        "06:25",
        "06:45",
        "07:05",
        "07:25",
        "07:40",
        "08:00"
      ]
    },
    {
      "direction": "CENTRO/BAIRRO",
      "schedule_day": "Dias Úteis",
      "timetable": [
        "17:20",
        "17:45",
        "18:15"
      ]
    }
  ]
}
$ python -m pypoabus -t 281-81  -f table  


┌──────────────────────────────┐
│    R81 - RAPIDA CAMPO NOVO   │
└──────────────────────────────┘
┌BAIRRO/CENTRO─┐
│  Dias Úteis  │
├──────────────┤
│ 06:25        │
│ 06:45        │
│ 07:05        │
│ 07:25        │
│ 07:40        │
│ 08:00        │
└──────────────┘

┌CENTRO/BAIRRO─┐
│  Dias Úteis  │
├──────────────┤
│ 17:20        │
│ 17:45        │
│ 18:15        │
└──────────────┘