lib: make it mandatory to have seek_X if can_seek_X is defined
[babeltrace.git] / src / bindings / python / bt2 / bt2 / component.py
index 142cd26933c333e9104dbefc2eb4d3b01e1dbf4e..9d27e6e09093ca546edbbc523950b240d0e8f7ae 100644 (file)
@@ -43,7 +43,7 @@ import bt2
 #     pointer to a 'bt_component_class *'.
 
 
-class _ComponentClass(object._SharedObject):
+class _ComponentClassConst(object._SharedObject):
     @property
     def name(self):
         ptr = self._bt_as_component_class_ptr(self._ptr)
@@ -65,7 +65,7 @@ class _ComponentClass(object._SharedObject):
         return self._bt_as_component_class_ptr(self._ptr)
 
     def __eq__(self, other):
-        if not isinstance(other, _ComponentClass):
+        if not isinstance(other, _ComponentClassConst):
             try:
                 if not issubclass(other, _UserComponent):
                     return False
@@ -75,7 +75,7 @@ class _ComponentClass(object._SharedObject):
         return self.addr == other.addr
 
 
-class _SourceComponentClass(_ComponentClass):
+class _SourceComponentClassConst(_ComponentClassConst):
     _get_ref = staticmethod(native_bt.component_class_source_get_ref)
     _put_ref = staticmethod(native_bt.component_class_source_put_ref)
     _bt_as_component_class_ptr = staticmethod(
@@ -83,7 +83,7 @@ class _SourceComponentClass(_ComponentClass):
     )
 
 
-class _FilterComponentClass(_ComponentClass):
+class _FilterComponentClassConst(_ComponentClassConst):
     _get_ref = staticmethod(native_bt.component_class_filter_get_ref)
     _put_ref = staticmethod(native_bt.component_class_filter_put_ref)
     _bt_as_component_class_ptr = staticmethod(
@@ -91,7 +91,7 @@ class _FilterComponentClass(_ComponentClass):
     )
 
 
-class _SinkComponentClass(_ComponentClass):
+class _SinkComponentClassConst(_ComponentClassConst):
     _get_ref = staticmethod(native_bt.component_class_sink_get_ref)
     _put_ref = staticmethod(native_bt.component_class_sink_put_ref)
     _bt_as_component_class_ptr = staticmethod(
@@ -173,7 +173,7 @@ class _ComponentPorts(collections.abc.Mapping):
 #     component pointer (e.g. 'bt_component_sink *') as a 'bt_component *'.
 
 
-class _Component:
+class _ComponentConst:
     @property
     def name(self):
         ptr = self._bt_as_component_ptr(self._ptr)
@@ -190,7 +190,7 @@ class _Component:
     def cls(self):
         cc_ptr = self._bt_borrow_component_class_ptr(self._ptr)
         assert cc_ptr is not None
-        return _create_component_class_from_ptr_and_get_ref(
+        return _create_component_class_from_const_ptr_and_get_ref(
             cc_ptr, self._bt_comp_cls_type
         )
 
@@ -201,7 +201,7 @@ class _Component:
         return self.addr == other.addr
 
 
-class _SourceComponent(_Component):
+class _SourceComponentConst(_ComponentConst):
     _bt_borrow_component_class_ptr = staticmethod(
         native_bt.component_source_borrow_class_const
     )
@@ -212,7 +212,7 @@ class _SourceComponent(_Component):
     _bt_as_component_ptr = staticmethod(native_bt.component_source_as_component_const)
 
 
-class _FilterComponent(_Component):
+class _FilterComponentConst(_ComponentConst):
     _bt_borrow_component_class_ptr = staticmethod(
         native_bt.component_filter_borrow_class_const
     )
@@ -223,7 +223,7 @@ class _FilterComponent(_Component):
     _bt_as_component_ptr = staticmethod(native_bt.component_filter_as_component_const)
 
 
-class _SinkComponent(_Component):
+class _SinkComponentConst(_ComponentConst):
     _bt_borrow_component_class_ptr = staticmethod(
         native_bt.component_sink_borrow_class_const
     )
@@ -234,9 +234,9 @@ class _SinkComponent(_Component):
     _bt_as_component_ptr = staticmethod(native_bt.component_sink_as_component_const)
 
 
-# This is analogous to _SourceComponentClass, but for source
+# This is analogous to _SourceComponentClassConst, but for source
 # component objects.
-class _GenericSourceComponent(object._SharedObject, _SourceComponent):
+class _GenericSourceComponentConst(object._SharedObject, _SourceComponentConst):
     _get_ref = staticmethod(native_bt.component_source_get_ref)
     _put_ref = staticmethod(native_bt.component_source_put_ref)
 
@@ -251,9 +251,9 @@ class _GenericSourceComponent(object._SharedObject, _SourceComponent):
         )
 
 
-# This is analogous to _FilterComponentClass, but for filter
+# This is analogous to _FilterComponentClassConst, but for filter
 # component objects.
-class _GenericFilterComponent(object._SharedObject, _FilterComponent):
+class _GenericFilterComponentConst(object._SharedObject, _FilterComponentConst):
     _get_ref = staticmethod(native_bt.component_filter_get_ref)
     _put_ref = staticmethod(native_bt.component_filter_put_ref)
 
@@ -278,9 +278,9 @@ class _GenericFilterComponent(object._SharedObject, _FilterComponent):
         )
 
 
-# This is analogous to _SinkComponentClass, but for sink
+# This is analogous to _SinkComponentClassConst, but for sink
 # component objects.
-class _GenericSinkComponent(object._SharedObject, _SinkComponent):
+class _GenericSinkComponentConst(object._SharedObject, _SinkComponentConst):
     _get_ref = staticmethod(native_bt.component_sink_get_ref)
     _put_ref = staticmethod(native_bt.component_sink_put_ref)
 
@@ -296,27 +296,27 @@ class _GenericSinkComponent(object._SharedObject, _SinkComponent):
 
 
 _COMP_CLS_TYPE_TO_GENERIC_COMP_PYCLS = {
-    native_bt.COMPONENT_CLASS_TYPE_SOURCE: _GenericSourceComponent,
-    native_bt.COMPONENT_CLASS_TYPE_FILTER: _GenericFilterComponent,
-    native_bt.COMPONENT_CLASS_TYPE_SINK: _GenericSinkComponent,
+    native_bt.COMPONENT_CLASS_TYPE_SOURCE: _GenericSourceComponentConst,
+    native_bt.COMPONENT_CLASS_TYPE_FILTER: _GenericFilterComponentConst,
+    native_bt.COMPONENT_CLASS_TYPE_SINK: _GenericSinkComponentConst,
 }
 
 
 _COMP_CLS_TYPE_TO_GENERIC_COMP_CLS_PYCLS = {
-    native_bt.COMPONENT_CLASS_TYPE_SOURCE: _SourceComponentClass,
-    native_bt.COMPONENT_CLASS_TYPE_FILTER: _FilterComponentClass,
-    native_bt.COMPONENT_CLASS_TYPE_SINK: _SinkComponentClass,
+    native_bt.COMPONENT_CLASS_TYPE_SOURCE: _SourceComponentClassConst,
+    native_bt.COMPONENT_CLASS_TYPE_FILTER: _FilterComponentClassConst,
+    native_bt.COMPONENT_CLASS_TYPE_SINK: _SinkComponentClassConst,
 }
 
 
-# Create a component Python object of type _GenericSourceComponent,
-# _GenericFilterComponent or _GenericSinkComponent, depending on
+# Create a component Python object of type _GenericSourceComponentConst,
+# _GenericFilterComponentConst or _GenericSinkComponentConst, depending on
 # comp_cls_type.
 #
 #    Steals the reference to ptr from the caller.
 
 
-def _create_component_from_ptr(ptr, comp_cls_type):
+def _create_component_from_const_ptr(ptr, comp_cls_type):
     return _COMP_CLS_TYPE_TO_GENERIC_COMP_PYCLS[comp_cls_type]._create_from_ptr(ptr)
 
 
@@ -324,20 +324,20 @@ def _create_component_from_ptr(ptr, comp_cls_type):
 # reference from the caller.
 
 
-def _create_component_from_ptr_and_get_ref(ptr, comp_cls_type):
+def _create_component_from_const_ptr_and_get_ref(ptr, comp_cls_type):
     return _COMP_CLS_TYPE_TO_GENERIC_COMP_PYCLS[
         comp_cls_type
     ]._create_from_ptr_and_get_ref(ptr)
 
 
 # Create a component class Python object of type
-# _SourceComponentClass, _FilterComponentClass or
-# _SinkComponentClass, depending on comp_cls_type.
+# _SourceComponentClassConst, _FilterComponentClassConst or
+# _SinkComponentClassConst, depending on comp_cls_type.
 #
 # Acquires a new reference to ptr.
 
 
-def _create_component_class_from_ptr_and_get_ref(ptr, comp_cls_type):
+def _create_component_class_from_const_ptr_and_get_ref(ptr, comp_cls_type):
     return _COMP_CLS_TYPE_TO_GENERIC_COMP_CLS_PYCLS[
         comp_cls_type
     ]._create_from_ptr_and_get_ref(ptr)
@@ -380,7 +380,7 @@ def _trim_docstring(docstring):
 # creates a native BT component class of the corresponding type and
 # associates it with this user-defined class. The metaclass also defines
 # class methods like the `name` and `description` properties to match
-# the _ComponentClass interface.
+# the _ComponentClassConst interface.
 #
 # The component class name which is used is either:
 #
@@ -510,6 +510,9 @@ class _UserComponentType(type):
         # create instance, not user-initialized yet
         self = cls.__new__(cls)
 
+        # config object
+        config = cls._config_pycls()
+
         # pointer to native self component object (weak/borrowed)
         self._bt_ptr = comp_ptr
 
@@ -519,7 +522,7 @@ class _UserComponentType(type):
         else:
             params = None
 
-        self.__init__(params, obj)
+        self.__init__(config, params, obj)
         return self
 
     def __call__(cls, *args, **kwargs):
@@ -550,6 +553,24 @@ class _UserComponentType(type):
                 )
             )
 
+        if hasattr(iter_cls, '_user_can_seek_ns_from_origin') and not hasattr(
+            iter_cls, '_user_seek_ns_from_origin'
+        ):
+            raise bt2._IncompleteUserClass(
+                "cannot create component class '{}': message iterator class implements _user_can_seek_ns_from_origin but not _user_seek_ns_from_origin".format(
+                    cls.__name__
+                )
+            )
+
+        if hasattr(iter_cls, '_user_can_seek_beginning') and not hasattr(
+            iter_cls, '_user_seek_beginning'
+        ):
+            raise bt2._IncompleteUserClass(
+                "cannot create component class '{}': message iterator class implements _user_can_seek_beginning but not _user_seek_beginning".format(
+                    cls.__name__
+                )
+            )
+
         cls._iter_cls = iter_cls
 
     @property
@@ -638,6 +659,29 @@ class _UserComponentType(type):
             native_bt.bt2_unregister_cc_ptr_to_py_cls(cc_ptr)
 
 
+# Configuration objects for components.
+#
+# These are passed in __init__ to allow components to change some configuration
+# parameters during initialization and not after. As you can see, they are not
+# used at the moment, but are there in case we want to add such parameters.
+
+
+class _UserComponentConfiguration:
+    pass
+
+
+class _UserSourceComponentConfiguration(_UserComponentConfiguration):
+    pass
+
+
+class _UserFilterComponentConfiguration(_UserComponentConfiguration):
+    pass
+
+
+class _UserSinkComponentConfiguration(_UserComponentConfiguration):
+    pass
+
+
 # Subclasses must provide these methods or property:
 #
 #   - _bt_as_not_self_specific_component_ptr: static method, must return the passed
@@ -669,7 +713,7 @@ class _UserComponent(metaclass=_UserComponentType):
     def cls(self):
         comp_ptr = self._bt_as_not_self_specific_component_ptr(self._bt_ptr)
         cc_ptr = self._bt_borrow_component_class_ptr(comp_ptr)
-        return _create_component_class_from_ptr_and_get_ref(
+        return _create_component_class_from_const_ptr_and_get_ref(
             cc_ptr, self._bt_comp_cls_type
         )
 
@@ -682,7 +726,7 @@ class _UserComponent(metaclass=_UserComponentType):
         ptr = self._bt_as_self_component_ptr(self._bt_ptr)
         return native_bt.self_component_get_graph_mip_version(ptr)
 
-    def __init__(self, params=None, obj=None):
+    def __init__(self, config, params, obj):
         pass
 
     def _user_finalize(self):
@@ -768,13 +812,14 @@ class _UserComponent(metaclass=_UserComponentType):
         return cc
 
 
-class _UserSourceComponent(_UserComponent, _SourceComponent):
+class _UserSourceComponent(_UserComponent, _SourceComponentConst):
     _bt_as_not_self_specific_component_ptr = staticmethod(
         native_bt.self_component_source_as_component_source
     )
     _bt_as_self_component_ptr = staticmethod(
         native_bt.self_component_source_as_self_component
     )
+    _config_pycls = _UserSourceComponentConfiguration
 
     @property
     def _output_ports(self):
@@ -801,13 +846,14 @@ class _UserSourceComponent(_UserComponent, _SourceComponent):
         return bt2_port._UserComponentOutputPort._create_from_ptr(self_port_ptr)
 
 
-class _UserFilterComponent(_UserComponent, _FilterComponent):
+class _UserFilterComponent(_UserComponent, _FilterComponentConst):
     _bt_as_not_self_specific_component_ptr = staticmethod(
         native_bt.self_component_filter_as_component_filter
     )
     _bt_as_self_component_ptr = staticmethod(
         native_bt.self_component_filter_as_self_component
     )
+    _config_pycls = _UserFilterComponentConfiguration
 
     @property
     def _output_ports(self):
@@ -858,13 +904,14 @@ class _UserFilterComponent(_UserComponent, _FilterComponent):
         return bt2_port._UserComponentInputPort._create_from_ptr(self_port_ptr)
 
 
-class _UserSinkComponent(_UserComponent, _SinkComponent):
+class _UserSinkComponent(_UserComponent, _SinkComponentConst):
     _bt_as_not_self_specific_component_ptr = staticmethod(
         native_bt.self_component_sink_as_component_sink
     )
     _bt_as_self_component_ptr = staticmethod(
         native_bt.self_component_sink_as_self_component
     )
+    _config_pycls = _UserSinkComponentConfiguration
 
     def _bt_graph_is_configured_from_native(self):
         self._user_graph_is_configured()
This page took 0.030255 seconds and 4 git commands to generate.