2525 SIGMF_METADATA_EXT ,
2626 SigMFArchive ,
2727)
28- from .error import SigMFAccessError , SigMFFileError
28+ from .error import SigMFAccessError , SigMFError , SigMFFileError
2929from .utils import dict_merge
3030
3131
@@ -45,7 +45,7 @@ def __repr__(self):
4545 return f"SigMFFile({ self } )"
4646
4747 def __iter__ (self ):
48- ''' special method to iterate through samples'''
48+ """ special method to iterate through samples"""
4949 self .iter_position = 0
5050 return self
5151
@@ -182,14 +182,7 @@ def __init__(self, metadata=None, data_file=None, global_info=None, skip_checksu
182182 self ._memmap = None
183183 self .is_complex_data = False # numpy.iscomplexobj(self._memmap) is not adequate for fixed-point complex case
184184
185- if metadata is None :
186- self ._metadata = {self .GLOBAL_KEY : {}, self .CAPTURE_KEY : [], self .ANNOTATION_KEY : []}
187- self ._metadata [self .GLOBAL_KEY ][self .NUM_CHANNELS_KEY ] = 1
188- self ._metadata [self .GLOBAL_KEY ][self .VERSION_KEY ] = __specification__
189- elif isinstance (metadata , dict ):
190- self ._metadata = metadata
191- else :
192- self ._metadata = json .loads (metadata )
185+ self .set_metadata (metadata )
193186 if global_info is not None :
194187 self .set_global_info (global_info )
195188 if data_file is not None :
@@ -271,6 +264,27 @@ def get_schema(self):
271264 assert isinstance (self .schema , dict )
272265 return self .schema
273266
267+ def set_metadata (self , metadata ):
268+ """
269+ Read provided metadata as either None (empty), string, bytes, or dictionary.
270+ """
271+ if metadata is None :
272+ # Create empty
273+ self ._metadata = {self .GLOBAL_KEY : {}, self .CAPTURE_KEY : [], self .ANNOTATION_KEY : []}
274+ elif isinstance (metadata , dict ):
275+ self ._metadata = metadata
276+ elif isinstance (metadata , (str , bytes )):
277+ self ._metadata = json .loads (metadata )
278+ else :
279+ raise SigMFError ("Unable to interpret provided metadata." )
280+
281+ # if num_channels missing, default to 1
282+ if self .get_global_field (self .NUM_CHANNELS_KEY ) is None :
283+ self .set_global_field (self .NUM_CHANNELS_KEY , 1 )
284+
285+ # set specification version to current implemented version
286+ self .set_global_field (self .VERSION_KEY , __specification__ )
287+
274288 def set_global_info (self , new_global ):
275289 """
276290 Overwrite the global info with a new dictionary.
0 commit comments