configure: disable -Wmaybe-uninitialized
[babeltrace.git] / src / bindings / python / bt2 / bt2 / component.py
index 97446a830e5d902359e171830e33f77a8ecf0df2..5395e0b6b59ccf11699d5a1c76461e928c5c0671 100644 (file)
@@ -327,17 +327,22 @@ def _create_component_class_from_const_ptr_and_get_ref(ptr, comp_cls_type):
 
 def _trim_docstring(docstring):
     lines = docstring.expandtabs().splitlines()
+
+    if len(lines) == 0:
+        return ''
+
     indent = sys.maxsize
 
-    for line in lines[1:]:
-        stripped = line.lstrip()
+    if len(lines) > 1:
+        for line in lines[1:]:
+            stripped = line.lstrip()
 
-        if stripped:
-            indent = min(indent, len(line) - len(stripped))
+            if stripped:
+                indent = min(indent, len(line) - len(stripped))
 
     trimmed = [lines[0].strip()]
 
-    if indent < sys.maxsize:
+    if indent < sys.maxsize and len(lines) > 1:
         for line in lines[1:]:
             trimmed.append(line[indent:].rstrip())
 
@@ -382,14 +387,19 @@ def _trim_docstring(docstring):
 #         ...
 #
 # A user-defined Python component class can have an __init__() method
-# which must at least accept the `params` and `name` arguments:
+# which must accept the following parameters:
 #
-#     def __init__(self, params, name, something_else):
+#     def __init__(self, config, params, obj):
 #         ...
 #
-# The user-defined component class can also have a _finalize() method
-# (do NOT use __del__()) to be notified when the component object is
-# finalized.
+# The value of the `obj` parameter is what was passed as the `obj`
+# parameter if the component was instantiated from Python with
+# Graph.add_component().  If the component was not instantiated from
+# Python, is is always `None`.
+#
+# The user-defined component class can also have a _user_finalize()
+# method (do NOT use __del__()) to be notified when the component object
+# is finalized.
 #
 # User-defined source and filter component classes must use the
 # `message_iterator_class` class parameter to specify the
@@ -402,14 +412,16 @@ def _trim_docstring(docstring):
 #                    message_iterator_class=MyMessageIterator):
 #         ...
 #
-# This message iterator class must inherit
-# bt2._UserMessageIterator, and it must define the _get() and
-# _next() methods. The message iterator class can also define an
-# __init__() method: this method has access to the original Python
-# component object which was used to create it as the `component`
-# property. The message iterator class can also define a
-# _finalize() method (again, do NOT use __del__()): this is called when
-# the message iterator is (really) destroyed.
+# This message iterator class must inherit bt2._UserMessageIterator.
+# It can implement the __init__() method, which must accept the
+# following parameters:
+#
+#     def __init__(self, config, port):
+#         ...
+#
+# It can also implement the __next__() and _user_finalize() methods
+# (again, do NOT use __del__()), which don't accept any parameters
+# other than `self`.
 #
 # When the user-defined class is destroyed, this metaclass's __del__()
 # method is called: the native BT component class pointer is put (not
@@ -821,6 +833,14 @@ class _UserSourceComponent(_UserComponent, _SourceComponentConst):
 
     def _add_output_port(self, name, user_data=None):
         utils._check_str(name)
+
+        if name in self._output_ports:
+            raise ValueError(
+                'source component `{}` already contains an output port named `{}`'.format(
+                    self.name, name
+                )
+            )
+
         fn = native_bt.self_component_source_add_output_port
         comp_status, self_port_ptr = fn(self._bt_ptr, name, user_data)
         utils._handle_func_status(
@@ -871,6 +891,14 @@ class _UserFilterComponent(_UserComponent, _FilterComponentConst):
 
     def _add_output_port(self, name, user_data=None):
         utils._check_str(name)
+
+        if name in self._output_ports:
+            raise ValueError(
+                'filter component `{}` already contains an output port named `{}`'.format(
+                    self.name, name
+                )
+            )
+
         fn = native_bt.self_component_filter_add_output_port
         comp_status, self_port_ptr = fn(self._bt_ptr, name, user_data)
         utils._handle_func_status(
@@ -883,6 +911,14 @@ class _UserFilterComponent(_UserComponent, _FilterComponentConst):
 
     def _add_input_port(self, name, user_data=None):
         utils._check_str(name)
+
+        if name in self._input_ports:
+            raise ValueError(
+                'filter component `{}` already contains an input port named `{}`'.format(
+                    self.name, name
+                )
+            )
+
         fn = native_bt.self_component_filter_add_input_port
         comp_status, self_port_ptr = fn(self._bt_ptr, name, user_data)
         utils._handle_func_status(
@@ -925,6 +961,14 @@ class _UserSinkComponent(_UserComponent, _SinkComponentConst):
 
     def _add_input_port(self, name, user_data=None):
         utils._check_str(name)
+
+        if name in self._input_ports:
+            raise ValueError(
+                'sink component `{}` already contains an input port named `{}`'.format(
+                    self.name, name
+                )
+            )
+
         fn = native_bt.self_component_sink_add_input_port
         comp_status, self_port_ptr = fn(self._bt_ptr, name, user_data)
         utils._handle_func_status(
@@ -938,6 +982,9 @@ class _UserSinkComponent(_UserComponent, _SinkComponentConst):
     def _create_message_iterator(self, input_port):
         utils._check_type(input_port, bt2_port._UserComponentInputPort)
 
+        if not input_port.is_connected:
+            raise ValueError('input port is not connected')
+
         (
             status,
             msg_iter_ptr,
This page took 0.026583 seconds and 4 git commands to generate.