Skip to content

Commit 8ef497b

Browse files
Testing pipeline
1 parent 41a58e6 commit 8ef497b

File tree

7 files changed

+121
-56
lines changed

7 files changed

+121
-56
lines changed

.github/workflows/pipeline.yml

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,12 @@ jobs:
3333
coverage:
3434
name: Test Coverage
3535
runs-on: ubuntu-latest
36-
strategy:
37-
matrix:
38-
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
3936
steps:
4037
- uses: actions/checkout@v3
4138
- name: Set up Python
4239
uses: actions/setup-python@v4
4340
with:
44-
python-version: ${{ matrix.python-version }}
41+
python-version: "3.13"
4542
- name: Install dependencies
4643
run: |
4744
pip install -r requirements.txt
@@ -73,8 +70,10 @@ jobs:
7370
run: |
7471
pip install -r requirements.txt
7572
pip install flake8
76-
- name: Run Flake8
77-
run: flake8 --ignore E501,E226,W503 --exclude=src/... src/
73+
- name: Run Flake8 on code
74+
run: flake8 --ignore E501,E226,W503 --exclude src/flexstack/facilities/vru_awareness_service/vam_asn1.py,src/flexstack/facilities/ca_basic_service/cam_asn1.py,src/flexstack/security/security_asn1.py,,src/flexstack/facilities/decentralized_environmental_notification_service/asn1/*,src/flexstack/utils/asn1/* src/
75+
- name: Run Flake8 on tests
76+
run: flake8 --ignore E501,E226 tests/
7877

7978
pylint:
8079
name: Run Pylint
@@ -90,7 +89,7 @@ jobs:
9089
pip install -r requirements.txt
9190
pip install pylint
9291
- name: Run Pylint
93-
run: pylint src/... --fail-under=9.49
92+
run: pylint src/flexstack/ --fail-under=9.49
9493

9594
build_wheel:
9695
name: Build Python Wheel

src/flexstack/applications/road_hazard_signalling_service/service_access_point.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
from ...facilities.local_dynamic_map.ldm_classes import ReferencePosition, TimestampIts
55

66
if TYPE_CHECKING:
7-
from .emergency_vehicle_approaching_service import EmergencyVehicleApproachingService
7+
from .emergency_vehicle_approaching_service import (
8+
EmergencyVehicleApproachingService,
9+
)
10+
811

912
class RelevanceArea:
1013
"""

src/flexstack/facilities/local_dynamic_map/factory.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def ldm_factory(
2424
) -> LDMFacility:
2525
"""
2626
Factory function to create a Local Dynamic Map Facility.
27-
27+
2828
Parameters
2929
----------
3030
ldm_location : Location
@@ -87,6 +87,8 @@ def ldm_factory(
8787
ldm_facility = LDMFacility(ldm_maintenance, ldm_service)
8888
logs.info(
8989
'LDM Facility configured with: LDM Maintenance: "%s", LDM Service: "%s", LDM Database: "%s".',
90-
ldm_maintenance_type, ldm_service_type, ldm_database_type
90+
ldm_maintenance_type,
91+
ldm_service_type,
92+
ldm_database_type,
9193
)
9294
return ldm_facility

src/flexstack/facilities/local_dynamic_map/if_ldm_4.py

Lines changed: 90 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
from .ldm_service import LDMService
3232

3333

34-
3534
class InterfaceLDM4:
3635
"""
3736
Class specified is described in ETSI EN 302 895 V1.1.1 (2014-09). Section 5.4.4.
@@ -62,7 +61,10 @@ def check_its_aid(self, its_application_identifier) -> bool:
6261
its_application_identifier : int
6362
ITS-AID of the application that wants to register as a data provider
6463
"""
65-
return isinstance(its_application_identifier, int) and its_application_identifier in VALID_ITS_AID
64+
return (
65+
isinstance(its_application_identifier, int)
66+
and its_application_identifier in VALID_ITS_AID
67+
)
6668

6769
def check_permissions(self, permissions_granted: list, data_object_id: int) -> bool:
6870
"""
@@ -87,7 +89,9 @@ def check_permissions(self, permissions_granted: list, data_object_id: int) -> b
8789
return True
8890
return False
8991

90-
def register_data_consumer(self, data_consumer: RegisterDataConsumerReq) -> RegisterDataConsumerResp:
92+
def register_data_consumer(
93+
self, data_consumer: RegisterDataConsumerReq
94+
) -> RegisterDataConsumerResp:
9195
"""
9296
Method specified in ETSI EN 302 895 V1.1.1 (2014-09). Section 6.3.1.1
9397
TODO: Apply Security. Currenly gives access to anyone sending valid information.
@@ -101,31 +105,50 @@ def register_data_consumer(self, data_consumer: RegisterDataConsumerReq) -> Regi
101105
if (
102106
data_consumer is None
103107
or self.check_its_aid(data_consumer.application_id) is False
104-
or self.check_permissions(data_consumer.access_permisions, data_consumer.application_id) is False
108+
or self.check_permissions(
109+
data_consumer.access_permisions, data_consumer.application_id
110+
)
111+
is False
105112
):
106-
return RegisterDataConsumerResp(data_consumer.application_id, None, RegisterDataConsumerResult(2))
113+
return RegisterDataConsumerResp(
114+
data_consumer.application_id, None, RegisterDataConsumerResult(2)
115+
)
107116
self.ldm_service.add_data_consumer_its_aid(data_consumer.application_id)
108-
self.logging.debug("Registered new LDM Data Consumer with application_id %d", data_consumer.application_id)
117+
self.logging.debug(
118+
"Registered new LDM Data Consumer with application_id %d",
119+
data_consumer.application_id,
120+
)
109121
return RegisterDataConsumerResp(
110122
data_consumer.application_id,
111123
data_consumer.access_permisions,
112124
RegisterDataConsumerResult(0),
113125
)
114126

115-
def deregister_data_consumer(self, data_consumer: DeregisterDataConsumerReq) -> DeregisterDataConsumerResp:
127+
def deregister_data_consumer(
128+
self, data_consumer: DeregisterDataConsumerReq
129+
) -> DeregisterDataConsumerResp:
116130
"""
117131
Method specified in ETSI EN 302 895 V1.1.1 (2014-09). Section 6.3.2.1
118132
Returning ACK 0 if the application is registered (and now will be unregistered) and
119133
ACK 1 if it is not (and will not be unregistered).
120134
"""
121-
self.logging.debug("Deregistring LDM Data Consumer wtih application_id: %d", data_consumer.application_id)
135+
self.logging.debug(
136+
"Deregistring LDM Data Consumer wtih application_id: %d",
137+
data_consumer.application_id,
138+
)
122139

123140
if data_consumer.application_id in self.ldm_service.get_data_consumer_its_aid():
124141
self.ldm_service.del_data_consumer_its_aid(data_consumer.application_id)
125-
return DeregisterDataConsumerResp(data_consumer.application_id, DeregisterDataConsumerAck(0))
126-
return DeregisterDataConsumerResp(data_consumer.application_id, DeregisterDataConsumerAck(1))
142+
return DeregisterDataConsumerResp(
143+
data_consumer.application_id, DeregisterDataConsumerAck(0)
144+
)
145+
return DeregisterDataConsumerResp(
146+
data_consumer.application_id, DeregisterDataConsumerAck(1)
147+
)
127148

128-
def request_data_objects(self, data_request: RequestDataObjectsReq) -> RequestDataObjectsResp:
149+
def request_data_objects(
150+
self, data_request: RequestDataObjectsReq
151+
) -> RequestDataObjectsResp:
129152
"""
130153
Method specified in ETSI EN 302 895 V1.1.1 (2014-09). Section 6.3.3
131154
TODO: Add error message in response if result is not successful.
@@ -140,15 +163,24 @@ def request_data_objects(self, data_request: RequestDataObjectsReq) -> RequestDa
140163
data_request.application_id,
141164
data_request.data_object_type,
142165
)
143-
if data_request.application_id not in self.ldm_service.get_data_consumer_its_aid():
144-
return RequestDataObjectsResp(data_request.application_id, None, RequestedDataObjectsResult(1))
166+
if (
167+
data_request.application_id
168+
not in self.ldm_service.get_data_consumer_its_aid()
169+
):
170+
return RequestDataObjectsResp(
171+
data_request.application_id, None, RequestedDataObjectsResult(1)
172+
)
145173
for data_object_type in data_request.data_object_type:
146174
if data_object_type not in DATA_OBJECT_TYPE_ID:
147-
return RequestDataObjectsResp(data_request.application_id, None, RequestedDataObjectsResult(2))
175+
return RequestDataObjectsResp(
176+
data_request.application_id, None, RequestedDataObjectsResult(2)
177+
)
148178

149179
if data_request.priority is not None:
150180
if data_request.priority < 0 or data_request.priority > 255:
151-
return RequestDataObjectsResp(data_request.application_id, None, RequestedDataObjectsResult(3))
181+
return RequestDataObjectsResp(
182+
data_request.application_id, None, RequestedDataObjectsResult(3)
183+
)
152184
if data_request.order is not None:
153185
if not isinstance(data_request.order, list):
154186
return RequestDataObjectsResp(
@@ -158,14 +190,20 @@ def request_data_objects(self, data_request: RequestDataObjectsReq) -> RequestDa
158190
)
159191
if data_request.filter is not None:
160192
if not isinstance(data_request.filter, Filter):
161-
return RequestDataObjectsResp(data_request.application_id, None, RequestedDataObjectsResult(4))
162-
data_objects: list = self.ldm_service.query(data_request) # Find data objects in LDM Maintance DataBases
193+
return RequestDataObjectsResp(
194+
data_request.application_id, None, RequestedDataObjectsResult(4)
195+
)
196+
data_objects: list = self.ldm_service.query(
197+
data_request
198+
) # Find data objects in LDM Maintance DataBases
163199
self.logging.debug(
164200
"LDM Data Consumer with application id %s, has recieved %s.",
165201
data_request.application_id,
166-
len(data_objects)
202+
len(data_objects),
203+
)
204+
return RequestDataObjectsResp(
205+
data_request.application_id, data_objects, RequestedDataObjectsResult(0)
167206
)
168-
return RequestDataObjectsResp(data_request.application_id, data_objects, RequestedDataObjectsResult(0))
169207

170208
def subscribe_data_consumer(
171209
self,
@@ -201,13 +239,18 @@ def subscribe_data_consumer(
201239
callback : Callable[[None], None]
202240
Callback function that will be called when data is available for the data consumer.
203241
"""
204-
self.logging.debug("LDM Data Consumer subscribed with application id %s", str(subscribe_data_consumer))
242+
self.logging.debug(
243+
"LDM Data Consumer subscribed with application id %s",
244+
str(subscribe_data_consumer),
245+
)
205246
result = self.validate_subscribe_data_consumer(subscribe_data_consumer)
206247

207248
if result is not None:
208249
return result
209250

210-
subscription_id = self.store_subscription_info(subscribe_data_consumer, callback)
251+
subscription_id = self.store_subscription_info(
252+
subscribe_data_consumer, callback
253+
)
211254

212255
return SubscribeDataObjectsResp(
213256
subscribe_data_consumer.application_id,
@@ -265,11 +308,15 @@ def validate_subscribe_data_consumer(
265308
error_message = "Invalid multiplicity"
266309

267310
if result_code is not None:
268-
return self.invalid_response(subscribe_data_consumer.application_id, result_code, error_message)
311+
return self.invalid_response(
312+
subscribe_data_consumer.application_id, result_code, error_message
313+
)
269314

270315
return None
271316

272-
def invalid_response(self, application_id: int, result_code: int, error_message: str) -> SubscribeDataObjectsResp:
317+
def invalid_response(
318+
self, application_id: int, result_code: int, error_message: str
319+
) -> SubscribeDataObjectsResp:
273320
"""
274321
Method to create SubscribeDataObjectResp with error message as specified
275322
in ETSI EN 302 895 V1.1.1 (2014-09). Section 6.3.4
@@ -326,7 +373,10 @@ def is_valid_data_object_type(self, data_object_type: str) -> bool:
326373
bool
327374
True if data_object_types are valid, False otherwise.
328375
"""
329-
return all(data_object_type in DATA_OBJECT_TYPE_ID for data_object_type in data_object_type)
376+
return all(
377+
data_object_type in DATA_OBJECT_TYPE_ID
378+
for data_object_type in data_object_type
379+
)
330380

331381
def is_valid_priority(self, priority: int) -> bool:
332382
"""
@@ -358,7 +408,9 @@ def is_valid_order(self, order: list[OrderTuple]) -> bool:
358408
bool
359409
True if order is valid, False otherwise.
360410
"""
361-
return order is None or (isinstance(order, list) and all(o in [1, 2] for o in order))
411+
return order is None or (
412+
isinstance(order, list) and all(o in [1, 2] for o in order)
413+
)
362414

363415
def is_valid_filter(self, data_filter: Filter) -> bool:
364416
"""
@@ -409,7 +461,9 @@ def is_valid_multiplicity(self, multiplicity: int) -> bool:
409461
"""
410462
return multiplicity is None or (0 <= multiplicity <= 255)
411463

412-
def store_subscription_info(self, subscribe_data_consumer: SubscribeDataobjectsReq, callback: Callable) -> int:
464+
def store_subscription_info(
465+
self, subscribe_data_consumer: SubscribeDataobjectsReq, callback: Callable
466+
) -> int:
413467
"""
414468
Method to store subscription information as specified in ETSI EN 302 895 V1.1.1 (2014-09). Section 6.3.4
415469
@@ -436,7 +490,9 @@ def store_subscription_info(self, subscribe_data_consumer: SubscribeDataobjectsR
436490
callback,
437491
)
438492

439-
def unsubscribe_data_consumer(self, unsubscribe_data_consumer: UnsubscribeDataConsumerReq):
493+
def unsubscribe_data_consumer(
494+
self, unsubscribe_data_consumer: UnsubscribeDataConsumerReq
495+
):
440496
"""
441497
Method specified in ETSI EN 302 895 V1.1.1 (2014-09). Section 6.3.5.1
442498
Current standard doesn't have ASN.1 implementation for UnsubscribeDataConsumerReq
@@ -452,7 +508,10 @@ def unsubscribe_data_consumer(self, unsubscribe_data_consumer: UnsubscribeDataCo
452508
"LDM Data Consumer Subscriber with application_id %s has unsubscribed.",
453509
unsubscribe_data_consumer.application_id,
454510
)
455-
if unsubscribe_data_consumer.application_id not in self.ldm_service.get_data_consumer_its_aid():
511+
if (
512+
unsubscribe_data_consumer.application_id
513+
not in self.ldm_service.get_data_consumer_its_aid()
514+
):
456515
return UnsubscribeDataConsumerResp(
457516
unsubscribe_data_consumer.application_id,
458517
None,
@@ -466,7 +525,9 @@ def unsubscribe_data_consumer(self, unsubscribe_data_consumer: UnsubscribeDataCo
466525
UnsubscribeDataConsumerAck(1),
467526
)
468527

469-
if not self.ldm_service.delete_subscription(unsubscribe_data_consumer.subscription_id):
528+
if not self.ldm_service.delete_subscription(
529+
unsubscribe_data_consumer.subscription_id
530+
):
470531
return UnsubscribeDataConsumerResp(
471532
unsubscribe_data_consumer.application_id,
472533
unsubscribe_data_consumer.subscription_id,

src/flexstack/facilities/local_dynamic_map/ldm_classes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ def compare_with_int(self, value: int) -> bool:
692692
return distance_mapping[self.relevance_distance]
693693

694694
raise ValueError(
695-
f"""RelevanceDistance relevance distance, {self.relevance_distance},
695+
f"""RelevanceDistance relevance distance, {self.relevance_distance},
696696
not valid according to ETSI EN 302 895 V1.1.1 (2014-09). Must be in the range 0..7."""
697697
)
698698

0 commit comments

Comments
 (0)