Skip to content

Commit 52235a4

Browse files
feat: nextbike converter which adds missing range properties (#88)
1 parent ce791ca commit 52235a4

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
The changelog lists relevant feature changes between each release. Search GitHub issues and pull requests for smaller issues.
44

55
## Upcoming release (under development)
6+
7+
- add converter for `gbfs.nextbike.net` feed: set `max_range_meters` and `current_range_meters` for vehicles with `propulsion_type` != `human`.
68
- add converter for `mds.bird.co` feed: remove `station_information`, `station_status` and `free_bike_status` feeds from gbfs.json if they are always empty.
79

810
## 2024-06-14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
from typing import List, Union
2+
3+
from app.base_converter import BaseConverter
4+
5+
6+
class GbfsNextbikeSetRangePropertiesConverter(BaseConverter):
7+
hostnames = ['gbfs.nextbike.net']
8+
9+
vehicle_types_cache_per_system: dict[str, list[dict]] = {}
10+
11+
@staticmethod
12+
def _get_system_id_from_path(path: str) -> str:
13+
return path.split('/')[-3:-2][0]
14+
15+
def convert(self, data: Union[dict, list], path: str) -> Union[dict, list]:
16+
if not isinstance(data, dict):
17+
return data
18+
19+
if path.endswith('/vehicle_types.json'):
20+
vehicle_types = data.get('data', {}).get('vehicle_types', [])
21+
if not isinstance(vehicle_types, list):
22+
return data
23+
for vehicle_type in vehicle_types:
24+
if 'propulsion_type' not in vehicle_type or vehicle_type['propulsion_type'] == 'human':
25+
continue
26+
if 'max_range_meters' not in vehicle_type:
27+
vehicle_type['max_range_meters'] = 60000
28+
system_id = self._get_system_id_from_path(path)
29+
self.vehicle_types_cache_per_system[system_id] = vehicle_types
30+
return data
31+
32+
if path.endswith('/free_bike_status.json'):
33+
system_id = self._get_system_id_from_path(path)
34+
vehicles_types = self.vehicle_types_cache_per_system.get(system_id, [])
35+
if not vehicles_types:
36+
return data
37+
vehicles = data.get('data', {}).get('bikes', [])
38+
if not isinstance(vehicles, list):
39+
return data
40+
for vehicle in vehicles:
41+
if 'vehicle_type_id' not in vehicle:
42+
continue
43+
vehicle_type_id = vehicle['vehicle_type_id']
44+
for vehicle_type in vehicle_types:
45+
if vehicle_type.get('vehicle_type_id') != vehicle_type_id:
46+
continue
47+
if 'current_range_meters' not in vehicle:
48+
vehicle['current_range_meters'] = 1000
49+
break
50+
return data
51+
52+
return data

0 commit comments

Comments
 (0)