Skip to content

Commit 6c9ddce

Browse files
committed
TransportationSystem object & documentation
1 parent b7dccb4 commit 6c9ddce

File tree

4 files changed

+212
-46
lines changed

4 files changed

+212
-46
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11

22
/passiogo/__pycache__
33
/tests/__pycache__
4+
/.ipynb_checkpoints
5+
Testing.ipynb

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
# Passio Go API
22

3+
[![PyPI - Version](https://img.shields.io/pypi/v/passiogo?label=Latest%20Version&link=https%3A%2F%2Fpypi.org%2Fproject%2FPassioGo%2F)](https://pypi.org/project/PassioGo/)
34
[![Pepy Total Downlods](https://img.shields.io/pepy/dt/PassioGo)](https://www.pepy.tech/projects/passiogo)
45
[![Documentation Status](https://readthedocs.org/projects/passiogo/badge/?version=latest)](https://passiogo.readthedocs.io/en/latest/?badge=latest)
56

67

8+
9+
710
An **unofficial** Python API for [Passio Go](https://passiogo.com/) allowing anyone to build transit-based applications for hundreds of Universities, Municipalities, Paratransit, and Airports.
811

912

docs/api.md

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,48 @@
11

22
# API Reference
33

4-
## `getAllRoutes`
4+
## `TransportationSystem`
5+
6+
- **id** (*int*): ID of the system
7+
- **name** (*str*): The full name of the system
8+
- **username** (*str*): URL-friendly system name
9+
- **goAgencyName** (*str*): Display name of the system
10+
- **email** (*str*): Contact email address for the system
11+
- **goTestMode** (*bool*): Unknown
12+
- **name2** (*bool*): Unknown
13+
- **homepage** (*str*): URL to the agency's homepage
14+
- **logo** (*bool*): Unknown
15+
- **goRoutePlannerEnabled** (*bool*): Unknown
16+
- **goColor** (*str*): Unknown
17+
- **goSupportEmail** (*str*): Unknown
18+
- **goSharedCode** (*int*): Unknown
19+
- **goAuthenticationType** (*bool*): Unknown
20+
21+
22+
## `getSystems()`
23+
24+
Gets all systems supported by PassioGo.
25+
26+
**Inputs**:
27+
28+
- **appVersion** (*int*): Version of the application (Default: 2)
29+
- **sortMode** (*int*): Unknown (Default: 1)
30+
31+
**Returns**: *list* of [`TransportationSystem`](#transportationsystem)
32+
33+
34+
## `printAllSystemsMd()`
35+
36+
Prints all system names as a markdown list.
37+
38+
**Input**:
39+
40+
- **includeHtmlBreaks** (*bool*): Whether to include HTML line breaks (Default: True)
41+
42+
**Returns**: None
43+
44+
45+
## `getAllRoutes()`
546

647
Obtains every route for the selected system.
748

@@ -11,12 +52,11 @@ Obtains every route for the selected system.
1152
- **paramDigit**:
1253
- **amount**:
1354

14-
## `getAllStops`
55+
## `getAllStops()`
56+
57+
## `getSystemAlerts()`
1558

16-
## `getSystemAlerts`
59+
## `getBuses()`
1760

18-
## `getBuses`
1961

20-
## `getSystems`
2162

22-
## `printAllSystemsMd`

passiogo/__init__.py

Lines changed: 161 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
1+
import json
12
import requests
23
import websocket
3-
import json
44

55
BASE_URL = "https://passiogo.com"
66

77

8+
### Helper Functions ###
9+
10+
def toIntInclNone(toInt):
11+
if toInt == None:
12+
return toInt
13+
return(int(toInt))
14+
15+
816
def sendApiRequest(url, body):
917

1018
# Send Request
@@ -25,6 +33,158 @@ def sendApiRequest(url, body):
2533
return(response)
2634

2735

36+
37+
### Transportation Systems ###
38+
39+
40+
class TransportationSystem:
41+
42+
def __init__(
43+
self,
44+
id: int,
45+
name: str = None,
46+
username: str = None,
47+
goAgencyName: str = None,
48+
email: str = None,
49+
goTestMode: bool = None,
50+
name2: bool = None,
51+
homepage: str = None,
52+
logo: bool = None,
53+
goRoutePlannerEnabled: bool = None,
54+
goColor: str = None,
55+
goSupportEmail: str = None,
56+
goSharedCode: int = None,
57+
goAuthenticationType: bool = None
58+
):
59+
60+
self.id = id
61+
self.name = name
62+
self.username = username
63+
self.goAgencyName = goAgencyName
64+
self.email = email
65+
self.goTestMode = goTestMode
66+
self.name2 = name2
67+
self.homepage = homepage
68+
self.logo = logo
69+
self.goRoutePlannerEnabled = goRoutePlannerEnabled
70+
self.goColor = goColor
71+
self.goSupportEmail = goSupportEmail
72+
self.goSharedCode = goSharedCode
73+
self.goAuthenticationType = goAuthenticationType
74+
75+
self.checkTypes()
76+
77+
def checkTypes(self) -> None:
78+
# id : int
79+
assert type(self.id) == int, f"'id' parameter must be an int not {type(self.id)}"
80+
81+
# name : str or None
82+
assert (type(self.name) == str or self.name is None), f"'name' parameter must be a str not {type(self.name)}"
83+
84+
# username : str or None
85+
assert (type(self.username) == str or self.username is None), f"'username' parameter must be a str not {type(self.username)}"
86+
87+
# goAgencyName : str or None
88+
assert (type(self.goAgencyName) == str or self.goAgencyName is None), f"'goAgencyName' parameter must be a str not {type(self.goAgencyName)}"
89+
90+
# email : str or None
91+
assert (type(self.email) == str or self.email is None), f"'email' parameter must be a str not {type(self.email)}"
92+
93+
# goTestMode : bool or None
94+
assert (type(self.goTestMode) == bool or self.goTestMode is None), f"'goTestMode' parameter must be a bool not {type(self.goTestMode)}"
95+
96+
# name2 : bool or None
97+
assert (type(self.name2) == bool or self.name2 is None), f"'name2' parameter must be a bool not {type(self.name2)}"
98+
99+
# homepage : str or None
100+
assert (type(self.homepage) == str or self.homepage is None), f"'homepage' parameter must be a str not {type(self.homepage)}"
101+
102+
# logo : bool or None
103+
assert (type(self.logo) == bool or self.logo is None), f"'logo' parameter must be a bool not {type(self.logo)}"
104+
105+
# goRoutePlannerEnabled : bool or None
106+
assert (type(self.goRoutePlannerEnabled) == bool or self.goRoutePlannerEnabled is None), f"'goRoutePlannerEnabled' parameter must be a bool not {type(self.goRoutePlannerEnabled)}"
107+
108+
# goColor : str or None
109+
assert (type(self.goColor) == str or self.goColor is None), f"'goColor' parameter must be a str not {type(self.goColor)}"
110+
111+
# goSupportEmail : str or None
112+
assert (type(self.goSupportEmail) == str or self.goSupportEmail is None), f"'goSupportEmail' parameter must be a str not {type(self.goSupportEmail)}"
113+
114+
# goSharedCode : int or None
115+
assert (type(self.goSharedCode) == int or self.goSharedCode is None), f"'goSharedCode' parameter must be a int not {type(self.goSharedCode)}"
116+
117+
# goAuthenticationType : bool or None
118+
assert (type(self.goAuthenticationType) == bool or self.goAuthenticationType is None), f"'goAuthenticationType' parameter must be a bool not {type(self.goAuthenticationType)}"
119+
120+
121+
def getSystems(
122+
appVersion = 2,
123+
sortMode = 1,
124+
) -> list[TransportationSystem]:
125+
'''
126+
Gets all systems. Returns a list of TransportationSystem.
127+
128+
sortMode: Unknown
129+
appVersion:
130+
<2: Error
131+
2: Valid
132+
'''
133+
134+
135+
# Initialize & Send Request
136+
url = f"{BASE_URL}/mapGetData.php?getSystems={appVersion}&sortMode={sortMode}&credentials=1"
137+
systems = sendApiRequest(url, None)
138+
139+
140+
# Handle Request Error
141+
if(systems == None):
142+
return([])
143+
144+
145+
allSystems = []
146+
for system in systems["all"]:
147+
148+
# Convert Empty Strings To None Objects
149+
for parameter in system.keys():
150+
if system[parameter] == '':
151+
system[parameter] = None
152+
try:
153+
allSystems.append(TransportationSystem(
154+
id = int(system["id"]),
155+
name = system["fullname"],
156+
username = system["username"],
157+
goAgencyName = system["goAgencyName"],
158+
email = system["email"],
159+
goTestMode = bool(int(system["goTestMode"])),
160+
name2 = bool(int(system["name2"])),
161+
homepage = system["homepage"],
162+
logo = bool(int(system["logo"])),
163+
goRoutePlannerEnabled = bool(int(system["goRoutePlannerEnabled"])),
164+
goColor = system["goColor"],
165+
goSupportEmail = system["goSupportEmail"],
166+
goSharedCode = toIntInclNone(system["goSharedCode"]),
167+
goAuthenticationType = bool(int(system["goAuthenticationType"])),
168+
))
169+
except Exception as e:
170+
print(e)
171+
print(system)
172+
return()
173+
174+
175+
return(allSystems)
176+
177+
178+
def printAllSystemsMd(
179+
includeHtmlBreaks = True
180+
):
181+
systems = getSystems()
182+
183+
for system in systems:
184+
print(f"- {system.name}{'<br/>' if includeHtmlBreaks else ''}")
185+
186+
187+
28188
def getAllRoutes(
29189
systemSelected,
30190
paramDigit = 1,
@@ -156,45 +316,6 @@ def getBuses(
156316
return(buses)
157317

158318

159-
def getSystems(
160-
paramDigit = 2,
161-
sortMode = 1,
162-
deviceId = 43647468
163-
):
164-
"""
165-
Gets all system alerts for the selected system.
166-
=========
167-
systemSelected: system from which to get content
168-
paramDigit:
169-
0: Error
170-
>=1: Valid
171-
"""
172-
173-
174-
# Initialize & Send Request
175-
url = f"{BASE_URL}/mapGetData.php?getSystems={paramDigit}&sortMode={sortMode}&deviceId={deviceId}&credentials=1"
176-
systems = sendApiRequest(url, None)
177-
178-
179-
# Handle Request Error
180-
if(systems == None):
181-
return(None)
182-
183-
184-
185-
return(systems)
186-
187-
188-
def printAllSystemsMd(
189-
paramDigit = 2,
190-
sortMode = 1,
191-
deviceId = 43647468,
192-
includeHtml = True
193-
):
194-
systems = getSystems(paramDigit,sortMode,deviceId)
195-
196-
for system in systems["all"]:
197-
print(f"- {system['fullname']}{'<br/>' if includeHtml else ''}")
198319

199320

200321
# Launch WebSocket

0 commit comments

Comments
 (0)