README.md: add PPA instructions for Ubuntu
[barectf.git] / barectf / config.py
index 152169e03869018a1941d18459d236baaadab1d8..eb952b6729c5951335c9ef011c357577be90c262 100644 (file)
@@ -66,15 +66,18 @@ class Config:
             raise ConfigError('barectf metadata error', e)
 
     def _augment_metadata_env(self, meta):
-        env = meta.env
-
-        env['domain'] = 'bare'
-        env['tracer_name'] = 'barectf'
         version_tuple = barectf.get_version_tuple()
-        env['tracer_major'] = version_tuple[0]
-        env['tracer_minor'] = version_tuple[1]
-        env['tracer_patch'] = version_tuple[2]
-        env['barectf_gen_date'] = str(datetime.datetime.now().isoformat())
+        base_env = {
+            'domain': 'bare',
+            'tracer_name': 'barectf'        ,
+            'tracer_major': version_tuple[0],
+            'tracer_minor': version_tuple[1],
+            'tracer_patch': version_tuple[2],
+            'barectf_gen_date': str(datetime.datetime.now().isoformat()),
+        }
+
+        base_env.update(meta.env)
+        meta.env = base_env
 
     @property
     def version(self):
@@ -100,7 +103,7 @@ class Config:
 
     @prefix.setter
     def prefix(self, value):
-        if not is_valid_identifier(value):
+        if not _is_valid_identifier(value):
             raise ConfigError('prefix must be a valid C identifier')
 
         self._prefix = value
@@ -170,7 +173,7 @@ _ctf_keywords = set([
 ])
 
 
-def is_valid_identifier(iden):
+def _is_valid_identifier(iden):
     if not _re_iden.match(iden):
         return False
 
@@ -271,7 +274,7 @@ class _BarectfMetadataValidator:
             raise ConfigError('invalid trace packet header type', e)
 
         for stream_name, stream in meta.streams.items():
-            if not is_valid_identifier(stream_name):
+            if not _is_valid_identifier(stream_name):
                 raise ConfigError('stream name "{}" is not a valid C identifier'.format(stream_name))
 
             self._cur_entity = _Entity.STREAM_PACKET_CONTEXT
@@ -297,7 +300,7 @@ class _BarectfMetadataValidator:
 
             try:
                 for ev_name, ev in stream.events.items():
-                    if not is_valid_identifier(ev_name):
+                    if not _is_valid_identifier(ev_name):
                         raise ConfigError('event name "{}" is not a valid C identifier'.format(ev_name))
 
                     self._cur_entity = _Entity.EVENT_CONTEXT
@@ -309,16 +312,13 @@ class _BarectfMetadataValidator:
 
                     self._cur_entity = _Entity.EVENT_PAYLOAD
 
-                    if ev.payload_type is None:
-                        raise ConfigError('missing payload type in event "{}"'.format(ev_name), e)
-
                     try:
                         self._validate_entity(ev.payload_type)
                     except Exception as e:
                         raise ConfigError('invalid payload type in event "{}"'.format(ev_name), e)
 
-                    if not ev.payload_type.fields:
-                        raise ConfigError('empty payload type in event "{}"'.format(ev_name), e)
+                    if stream.is_event_empty(ev):
+                        raise ConfigError('event "{}" is empty'.format(ev_name))
             except Exception as e:
                 raise ConfigError('invalid stream "{}"'.format(stream_name), e)
 
@@ -335,13 +335,13 @@ class _MetadataSpecialFieldsValidator:
         if len(self._meta.streams) > 1:
             # yes
             if t is None:
-                raise ConfigError('need "stream_id" field in trace packet header type, but trace packet header type is missing')
+                raise ConfigError('need "stream_id" field in trace packet header type (more than one stream), but trace packet header type is missing')
 
             if type(t) is not metadata.Struct:
-                raise ConfigError('need "stream_id" field in trace packet header type, but trace packet header type is not a structure type')
+                raise ConfigError('need "stream_id" field in trace packet header type (more than one stream), but trace packet header type is not a structure type')
 
             if 'stream_id' not in t.fields:
-                raise ConfigError('need "stream_id" field in trace packet header type')
+                raise ConfigError('need "stream_id" field in trace packet header type (more than one stream)')
 
         # validate "magic" and "stream_id" types
         if type(t) is not metadata.Struct:
@@ -491,13 +491,13 @@ class _MetadataSpecialFieldsValidator:
         if len(stream.events) > 1:
             # yes
             if t is None:
-                raise ConfigError('need "id" field in stream event header type, but stream event header type is missing')
+                raise ConfigError('need "id" field in stream event header type (more than one event), but stream event header type is missing')
 
             if type(t) is not metadata.Struct:
-                raise ConfigError('need "id" field in stream event header type, but stream event header type is not a structure type')
+                raise ConfigError('need "id" field in stream event header type (more than one event), but stream event header type is not a structure type')
 
             if 'id' not in t.fields:
-                raise ConfigError('need "id" field in stream event header type')
+                raise ConfigError('need "id" field in stream event header type (more than one event)')
 
         # validate "id" and "timestamp" types
         if type(t) is not metadata.Struct:
@@ -1110,14 +1110,6 @@ class _MetadataTypesHistologyValidator:
             raise ConfigError('invalid event context type for event "{}"'.format(ev_name), e)
 
         # validate event payload type
-        if ev.payload_type is None:
-            raise ConfigError('event payload type must exist in event "{}"'.format(ev_name))
-
-        # TODO: also check arrays, sequences, and variants
-        if type(ev.payload_type) is metadata.Struct:
-            if not ev.payload_type.fields:
-                raise ConfigError('event payload type must have at least one field for event "{}"'.format(ev_name))
-
         try:
             self._validate_entity_type_histology(ev.payload_type)
         except Exception as e:
@@ -1648,7 +1640,7 @@ class _YamlConfigParser:
                     raise ConfigError('"fields" property of structure type object must be an associative array')
 
                 for field_name, field_node in fields.items():
-                    if not is_valid_identifier(field_name):
+                    if not _is_valid_identifier(field_name):
                         raise ConfigError('"{}" is not a valid field name for structure type'.format(field_name))
 
                     try:
@@ -1728,7 +1720,7 @@ class _YamlConfigParser:
             # do not validate type names for the moment; will be done in a
             # second phase
             for type_name, type_node in types.items():
-                if not is_valid_identifier(type_name):
+                if not _is_valid_identifier(type_name):
                     raise ConfigError('"{}" is not a valid type name for variant type'.format(type_name))
 
                 try:
@@ -1912,8 +1904,8 @@ class _YamlConfigParser:
             offset = node['offset']
 
             if offset is None:
-                self.set_default_offset_seconds()
-                self.set_default_offset_cycles()
+                clock.set_default_offset_seconds()
+                clock.set_default_offset_cycles()
             else:
                 if not _is_assoc_array_prop(offset):
                     raise ConfigError('"offset" property of clock object must be an associative array')
@@ -1927,25 +1919,31 @@ class _YamlConfigParser:
                 if 'cycles' in offset:
                     offset_cycles = offset['cycles']
 
-                    if not _is_int_prop(offset_cycles):
-                        raise ConfigError('"cycles" property of clock object\'s offset property must be an integer')
+                    if offset_cycles is None:
+                        clock.set_default_offset_cycles()
+                    else:
+                        if not _is_int_prop(offset_cycles):
+                            raise ConfigError('"cycles" property of clock object\'s offset property must be an integer')
 
-                    if offset_cycles < 0:
-                        raise ConfigError('invalid clock offset cycles: {}'.format(offset_cycles))
+                        if offset_cycles < 0:
+                            raise ConfigError('invalid clock offset cycles: {}'.format(offset_cycles))
 
-                    clock.offset_cycles = offset_cycles
+                        clock.offset_cycles = offset_cycles
 
                 # seconds
                 if 'seconds' in offset:
                     offset_seconds = offset['seconds']
 
-                    if not _is_int_prop(offset_seconds):
-                        raise ConfigError('"seconds" property of clock object\'s offset property must be an integer')
+                    if offset_seconds is None:
+                        clock.set_default_offset_seconds()
+                    else:
+                        if not _is_int_prop(offset_seconds):
+                            raise ConfigError('"seconds" property of clock object\'s offset property must be an integer')
 
-                    if offset_seconds < 0:
-                        raise ConfigError('invalid clock offset seconds: {}'.format(offset_seconds))
+                        if offset_seconds < 0:
+                            raise ConfigError('invalid clock offset seconds: {}'.format(offset_seconds))
 
-                    clock.offset_seconds = offset_seconds
+                        clock.offset_seconds = offset_seconds
 
         # absolute
         if 'absolute' in node:
@@ -2003,7 +2001,7 @@ class _YamlConfigParser:
             raise ConfigError('"clocks" property (metadata) must be an associative array')
 
         for clock_name, clock_node in clocks_node.items():
-            if not is_valid_identifier(clock_name):
+            if not _is_valid_identifier(clock_name):
                 raise ConfigError('invalid clock name: "{}"'.format(clock_name))
 
             if clock_name in self._clocks:
@@ -2035,7 +2033,7 @@ class _YamlConfigParser:
             if env_name in env:
                 raise ConfigError('duplicate environment variable "{}"'.format(env_name))
 
-            if not is_valid_identifier(env_name):
+            if not _is_valid_identifier(env_name):
                 raise ConfigError('invalid environment variable name: "{}"'.format(env_name))
 
             if not _is_int_prop(env_value) and not _is_str_prop(env_value):
@@ -2187,10 +2185,7 @@ class _YamlConfigParser:
 
             event.context_type = t
 
-        if 'payload-type' not in event_node:
-            raise ConfigError('missing "payload-type" property in event object')
-
-        if event_node['payload-type'] is not None:
+        if 'payload-type' in event_node and event_node['payload-type'] is not None:
             try:
                 t = self._create_type(event_node['payload-type'])
             except Exception as e:
@@ -2374,7 +2369,7 @@ class _YamlConfigParser:
         if not _is_str_prop(prefix_node):
             raise ConfigError('"prefix" property (configuration) must be a string')
 
-        if not is_valid_identifier(prefix_node):
+        if not _is_valid_identifier(prefix_node):
             raise ConfigError('"prefix" property (configuration) must be a valid C identifier')
 
         return prefix_node
This page took 0.027956 seconds and 4 git commands to generate.