Skip to content

Commit ec82b7c

Browse files
authored
Merge pull request #756 from OpenSimulationInterface/update/workflow-dependencies
Workflow: Update Python and Actions + Black formatting Python files
2 parents d00b974 + 493bd51 commit ec82b7c

19 files changed

+861
-397
lines changed

.github/workflows/protobuf.yml

+6-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ jobs:
2828
python-version: '3.8'
2929

3030
- name: Install Python Dependencies
31-
run: python -m pip install --upgrade pip setuptools wheel pyyaml
31+
run: |
32+
python -m pip install --upgrade pip
33+
python -m pip install -r requirements_develop.txt
34+
35+
- name: Check black format
36+
run: black --check --diff .
3237

3338
- name: Install Doxygen
3439
run: sudo apt-get install doxygen graphviz

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ compile_commands.json
3232

3333
# Python-generated files
3434
__pycache__/
35+
.venv/
36+
venv/
3537
*.py[cod]
3638
proto2cpp.log
3739
.clang-format

format/OSITrace.py

+44-29
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010
from osi3.osi_groundtruth_pb2 import GroundTruth
1111
from osi3.osi_sensordata_pb2 import SensorData
1212
import warnings
13-
warnings.simplefilter('default')
1413

15-
SEPARATOR = b'$$__$$'
14+
warnings.simplefilter("default")
15+
16+
SEPARATOR = b"$$__$$"
1617
SEPARATOR_LENGTH = len(SEPARATOR)
1718
BUFFER_SIZE = 1000000
1819

@@ -31,7 +32,7 @@ def get_size_from_file_stream(file_object):
3132
MESSAGES_TYPE = {
3233
"SensorView": SensorView,
3334
"GroundTruth": GroundTruth,
34-
"SensorData": SensorData
35+
"SensorData": SensorData,
3536
}
3637

3738

@@ -49,15 +50,15 @@ def __init__(self, path=None, type_name="SensorView"):
4950
def from_file(self, path, type_name="SensorView", max_index=-1, format_type=None):
5051
"""Import a scenario from a file"""
5152

52-
if path.lower().endswith(('.lzma', '.xz')):
53+
if path.lower().endswith((".lzma", ".xz")):
5354
self.scenario_file = lzma.open(path, "rb")
5455
else:
5556
self.scenario_file = open(path, "rb")
5657

5758
self.type_name = type_name
5859
self.format_type = format_type
5960

60-
if self.format_type == 'separated':
61+
if self.format_type == "separated":
6162
# warnings.warn("The separated trace files will be completely removed in the near future. Please convert them to *.osi files with the converter in the main OSI repository.", PendingDeprecationWarning)
6263
self.timestep_count = self.retrieve_message_offsets(max_index)
6364
else:
@@ -73,7 +74,7 @@ def retrieve_message_offsets(self, max_index):
7374
scenario_size = get_size_from_file_stream(self.scenario_file)
7475

7576
if max_index == -1:
76-
max_index = float('inf')
77+
max_index = float("inf")
7778

7879
buffer_deque = deque(maxlen=2)
7980

@@ -100,7 +101,7 @@ def retrieve_message_offsets(self, max_index):
100101
self.scenario_file.seek(message_offset)
101102

102103
while eof and found != -1:
103-
buffer = buffer[found + SEPARATOR_LENGTH:]
104+
buffer = buffer[found + SEPARATOR_LENGTH :]
104105
found = buffer.find(SEPARATOR)
105106

106107
buffer_offset = scenario_size - len(buffer)
@@ -126,7 +127,7 @@ def retrieve_message(self):
126127
self.message_offsets = [0]
127128
eof = False
128129

129-
# TODO Implement buffering for the scenarios
130+
# TODO Implement buffering for the scenarios
130131
self.scenario_file.seek(0)
131132
serialized_message = self.scenario_file.read()
132133
INT_LENGTH = len(struct.pack("<L", 0))
@@ -135,8 +136,12 @@ def retrieve_message(self):
135136
i = 0
136137
while i < len(serialized_message):
137138
message = MESSAGES_TYPE[self.type_name]()
138-
message_length = struct.unpack("<L", serialized_message[i:INT_LENGTH+i])[0]
139-
message.ParseFromString(serialized_message[i+INT_LENGTH:i+INT_LENGTH+message_length])
139+
message_length = struct.unpack(
140+
"<L", serialized_message[i : INT_LENGTH + i]
141+
)[0]
142+
message.ParseFromString(
143+
serialized_message[i + INT_LENGTH : i + INT_LENGTH + message_length]
144+
)
140145
i += message_length + INT_LENGTH
141146
self.message_offsets.append(i)
142147

@@ -153,7 +158,7 @@ def get_message_by_index(self, index):
153158
Get a message by its index. Try first to get it from the cache made
154159
by the method ``cache_messages_in_index_range``.
155160
"""
156-
return next(self.get_messages_in_index_range(index, index+1))
161+
return next(self.get_messages_in_index_range(index, index + 1))
157162

158163
def get_messages(self):
159164
return self.get_messages_in_index_range(0, len(self.message_offsets))
@@ -164,26 +169,28 @@ def get_messages_in_index_range(self, begin, end):
164169
"""
165170
self.scenario_file.seek(self.message_offsets[begin])
166171
abs_first_offset = self.message_offsets[begin]
167-
abs_last_offset = self.message_offsets[end] \
168-
if end < len(self.message_offsets) \
172+
abs_last_offset = (
173+
self.message_offsets[end]
174+
if end < len(self.message_offsets)
169175
else self.retrieved_scenario_size
176+
)
170177

171178
rel_message_offsets = [
172179
abs_message_offset - abs_first_offset
173180
for abs_message_offset in self.message_offsets[begin:end]
174181
]
175182

176183
if self.format_type == "separated":
177-
message_sequence_len = abs_last_offset - \
178-
abs_first_offset - SEPARATOR_LENGTH
179-
serialized_messages_extract = self.scenario_file.read(
180-
message_sequence_len)
184+
message_sequence_len = abs_last_offset - abs_first_offset - SEPARATOR_LENGTH
185+
serialized_messages_extract = self.scenario_file.read(message_sequence_len)
181186

182187
for rel_index, rel_message_offset in enumerate(rel_message_offsets):
183188
rel_begin = rel_message_offset
184-
rel_end = rel_message_offsets[rel_index + 1] - SEPARATOR_LENGTH \
185-
if rel_index + 1 < len(rel_message_offsets) \
189+
rel_end = (
190+
rel_message_offsets[rel_index + 1] - SEPARATOR_LENGTH
191+
if rel_index + 1 < len(rel_message_offsets)
186192
else message_sequence_len
193+
)
187194
message = MESSAGES_TYPE[self.type_name]()
188195
serialized_message = serialized_messages_extract[rel_begin:rel_end]
189196
message.ParseFromString(serialized_message)
@@ -212,27 +219,35 @@ def get_messages_in_index_range(self, begin, end):
212219

213220
def make_readable(self, name, interval=None, index=None):
214221
self.scenario_file.seek(0)
215-
serialized_message = self.scenario_file.read()
222+
serialized_message = self.scenario_file.read()
216223
message_length = len(serialized_message)
217224

218225
if message_length > 1000000000:
219226
# Throw a warning if trace file is bigger than 1GB
220-
gb_size_input = round(message_length/1000000000, 2)
221-
gb_size_output = round(3.307692308*message_length/1000000000, 2)
222-
warnings.warn(f"The trace file you are trying to make readable has the size {gb_size_input}GB. This will generate a readable file with the size {gb_size_output}GB. Make sure you have enough disc space and memory to read the file with your text editor.", ResourceWarning)
223-
224-
with open(name, 'a') as f:
225-
227+
gb_size_input = round(message_length / 1000000000, 2)
228+
gb_size_output = round(3.307692308 * message_length / 1000000000, 2)
229+
warnings.warn(
230+
f"The trace file you are trying to make readable has the size {gb_size_input}GB. This will generate a readable file with the size {gb_size_output}GB. Make sure you have enough disc space and memory to read the file with your text editor.",
231+
ResourceWarning,
232+
)
233+
234+
with open(name, "a") as f:
226235
if interval is None and index is None:
227236
for i in self.get_messages():
228237
f.write(str(i))
229-
238+
230239
if interval is not None and index is None:
231-
if type(interval) == tuple and len(interval) == 2 and interval[0]<interval[1]:
240+
if (
241+
type(interval) == tuple
242+
and len(interval) == 2
243+
and interval[0] < interval[1]
244+
):
232245
for i in self.get_messages_in_index_range(interval[0], interval[1]):
233246
f.write(str(i))
234247
else:
235-
raise Exception("Argument 'interval' needs to be a tuple of length 2! The first number must be smaller then the second.")
248+
raise Exception(
249+
"Argument 'interval' needs to be a tuple of length 2! The first number must be smaller then the second."
250+
)
236251

237252
if interval is None and index is not None:
238253
if type(index) == int:

format/osi2read.py

+44-31
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,60 @@
1-
'''
1+
"""
22
This program converts serialized txt/osi trace files into a human readable txth file.
33
44
Example usage:
55
python3 osi2read.py -d trace.osi -o myreadableosifile
66
python3 osi2read.py -d trace.txt -f separated -o myreadableosifile
7-
'''
7+
"""
88

99
from OSITrace import OSITrace
1010
import struct
1111
import lzma
1212
import argparse
1313
import os
1414

15+
1516
def command_line_arguments():
16-
""" Define and handle command line interface """
17+
"""Define and handle command line interface"""
1718

1819
dir_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
1920

2021
parser = argparse.ArgumentParser(
21-
description='Convert a serialized osi/txt trace file to a readable txth output.',
22-
prog='osi2read converter')
23-
parser.add_argument('--data', '-d',
24-
help='Path to the file with serialized data.',
25-
type=str)
26-
parser.add_argument('--type', '-t',
27-
help='Name of the type used to serialize data.',
28-
choices=['SensorView', 'GroundTruth', 'SensorData'],
29-
default='SensorView',
30-
type=str,
31-
required=False)
32-
parser.add_argument('--output', '-o',
33-
help='Output name of the file.',
34-
default='converted.txth',
35-
type=str,
36-
required=False)
37-
parser.add_argument('--format', '-f',
38-
help='Set the format type of the trace.',
39-
choices=['separated', None],
40-
default=None,
41-
type=str,
42-
required=False)
22+
description="Convert a serialized osi/txt trace file to a readable txth output.",
23+
prog="osi2read converter",
24+
)
25+
parser.add_argument(
26+
"--data", "-d", help="Path to the file with serialized data.", type=str
27+
)
28+
parser.add_argument(
29+
"--type",
30+
"-t",
31+
help="Name of the type used to serialize data.",
32+
choices=["SensorView", "GroundTruth", "SensorData"],
33+
default="SensorView",
34+
type=str,
35+
required=False,
36+
)
37+
parser.add_argument(
38+
"--output",
39+
"-o",
40+
help="Output name of the file.",
41+
default="converted.txth",
42+
type=str,
43+
required=False,
44+
)
45+
parser.add_argument(
46+
"--format",
47+
"-f",
48+
help="Set the format type of the trace.",
49+
choices=["separated", None],
50+
default=None,
51+
type=str,
52+
required=False,
53+
)
4354

4455
return parser.parse_args()
4556

57+
4658
def main():
4759
# Handling of command line arguments
4860
args = command_line_arguments()
@@ -51,13 +63,14 @@ def main():
5163
trace = OSITrace()
5264
trace.from_file(path=args.data, type_name=args.type, format_type=args.format)
5365

54-
args.output = args.output.split('.', 1)[0] + '.txth'
66+
args.output = args.output.split(".", 1)[0] + ".txth"
5567

56-
if args.output == 'converted.txth':
57-
args.output = args.data.split('.', 1)[0] + '.txth'
68+
if args.output == "converted.txth":
69+
args.output = args.data.split(".", 1)[0] + ".txth"
5870

5971
trace.make_readable(args.output)
60-
trace.scenario_file.close()
61-
72+
trace.scenario_file.close()
73+
74+
6275
if __name__ == "__main__":
63-
main()
76+
main()

0 commit comments

Comments
 (0)