Skip to content

Commit af4cf3a

Browse files
AartGoossensdtcooper
authored andcommitted
Ignore developer data errors by passing check_developer_data=False
Fixes dtcooper#124
1 parent 11e7dbb commit af4cf3a

1 file changed

Lines changed: 77 additions & 19 deletions

File tree

fitparse/base.py

Lines changed: 77 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,49 @@
2121

2222

2323
class DeveloperDataMixin(object):
24-
def __init__(self, *args, **kwargs):
24+
def __init__(self, *args, check_developer_data=True, **kwargs):
25+
self.check_developer_data = check_developer_data
2526
self.dev_types = {}
2627

2728
super(DeveloperDataMixin, self).__init__(*args, **kwargs)
2829

29-
def add_dev_data_id(self, message):
30-
dev_data_index = message.get_raw_value('developer_data_index')
31-
application_id = message.get_raw_value('application_id')
30+
def _append_dev_data_id(self, dev_data_index, application_id=None, fields=None):
31+
if fields is None:
32+
fields = {}
3233

3334
# Note that nothing in the spec says overwriting an existing type is invalid
3435
self.dev_types[dev_data_index] = {
3536
'dev_data_index': dev_data_index,
3637
'application_id': application_id,
37-
'fields': {}
38+
'fields': fields
3839
}
3940

41+
def add_dev_data_id(self, message):
42+
dev_data_index = message.get_raw_value('developer_data_index')
43+
application_id = message.get_raw_value('application_id')
44+
45+
self._append_dev_data_id(dev_data_index, application_id)
46+
47+
def _append_dev_field_description(self, dev_data_index, field_def_num, type=BASE_TYPE_BYTE, name=None,
48+
units=None, native_field_num=None):
49+
if dev_data_index not in self.dev_types:
50+
if self.check_developer_data:
51+
raise FitParseError("No such dev_data_index=%s found" % (dev_data_index))
52+
53+
warnings.warn(
54+
"Dev type for dev_data_index=%s missing. Adding dummy dev type." % (dev_data_index)
55+
)
56+
self._append_dev_data_id(dev_data_index)
57+
58+
self.dev_types[dev_data_index]["fields"][field_def_num] = DevField(
59+
dev_data_index=dev_data_index,
60+
def_num=field_def_num,
61+
type=type,
62+
name=name,
63+
units=units,
64+
native_field_num=native_field_num
65+
)
66+
4067
def add_dev_field_description(self, message):
4168
dev_data_index = message.get_raw_value('developer_data_index')
4269
field_def_num = message.get_raw_value('field_definition_number')
@@ -46,26 +73,55 @@ def add_dev_field_description(self, message):
4673
native_field_num = message.get_raw_value('native_field_num')
4774

4875
if dev_data_index not in self.dev_types:
49-
raise FitParseError("No such dev_data_index=%s found" % (dev_data_index))
76+
if self.check_developer_data:
77+
raise FitParseError("No such dev_data_index=%s found" % (dev_data_index))
78+
79+
warnings.warn(
80+
"Dev type for dev_data_index=%s missing. Adding dummy dev type." % (dev_data_index)
81+
)
82+
self._append_dev_data_id(dev_data_index)
83+
5084
fields = self.dev_types[int(dev_data_index)]['fields']
5185

5286
# Note that nothing in the spec says overwriting an existing field is invalid
53-
fields[field_def_num] = DevField(dev_data_index=dev_data_index,
54-
def_num=field_def_num,
55-
type=BASE_TYPES[base_type_id],
56-
name=field_name,
57-
units=units,
58-
native_field_num=native_field_num)
59-
87+
fields[field_def_num] = DevField(
88+
dev_data_index=dev_data_index,
89+
def_num=field_def_num,
90+
type=BASE_TYPES[base_type_id],
91+
name=field_name,
92+
units=units,
93+
native_field_num=native_field_num
94+
)
6095

6196
def get_dev_type(self, dev_data_index, field_def_num):
6297
if dev_data_index not in self.dev_types:
63-
raise FitParseError("No such dev_data_index=%s found when looking up field %s" % (dev_data_index, field_def_num))
98+
if self.check_developer_data:
99+
raise FitParseError(
100+
"No such dev_data_index=%s found when looking up field %s" % (dev_data_index, field_def_num)
101+
)
102+
103+
warnings.warn(
104+
"Dev type for dev_data_index=%s missing. Adding dummy dev type." % (dev_data_index)
105+
)
106+
self._append_dev_data_id(dev_data_index)
64107

65-
if field_def_num not in self.dev_types[dev_data_index]['fields']:
66-
raise FitParseError("No such field %s for dev_data_index %s" % (field_def_num, dev_data_index))
108+
dev_type = self.dev_types[dev_data_index]
67109

68-
return self.dev_types[dev_data_index]['fields'][field_def_num]
110+
if field_def_num not in dev_type['fields']:
111+
if self.check_developer_data:
112+
raise FitParseError(
113+
"No such field %s for dev_data_index %s" % (field_def_num, dev_data_index)
114+
)
115+
116+
warnings.warn(
117+
"Field %s for dev_data_index %s missing. Adding dummy field." % (field_def_num, dev_data_index)
118+
)
119+
self._append_dev_field_description(
120+
dev_data_index=dev_data_index,
121+
field_def_num=field_def_num
122+
)
123+
124+
return dev_type['fields'][field_def_num]
69125

70126

71127
class FitFileDecoder(DeveloperDataMixin):
@@ -554,12 +610,14 @@ def _parse_data_message(self, header):
554610
class UncachedFitFile(DataProcessorMixin, FitFileDecoder):
555611
"""FitFileDecoder with data processing"""
556612

557-
def __init__(self, fileish, check_crc=True, data_processor=None):
613+
def __init__(self, fileish, *args, check_crc=True, data_processor=None, **kwargs):
558614
# Ensure all optional params are passed as kwargs
559615
super(UncachedFitFile, self).__init__(
560616
fileish,
617+
*args,
561618
check_crc=check_crc,
562-
data_processor=data_processor
619+
data_processor=data_processor,
620+
**kwargs
563621
)
564622

565623

0 commit comments

Comments
 (0)