+ def _get_greatest_operative_mip_version(self):
+ def append_comp_specs_descriptors(descriptors, comp_specs, comp_cls_type):
+ for comp_spec in comp_specs:
+ comp_cls = self._component_spec_class(comp_spec, comp_cls_type)
+ descriptors.append(
+ bt2.ComponentDescriptor(comp_cls, comp_spec.params, comp_spec.obj)
+ )
+
+ descriptors = []
+ append_comp_specs_descriptors(
+ descriptors, self._src_comp_specs, _CompClsType.SOURCE
+ )
+ append_comp_specs_descriptors(
+ descriptors, self._flt_comp_specs, _CompClsType.FILTER
+ )
+
+ if self._stream_intersection_mode:
+ # we also need at least one `flt.utils.trimmer` component
+ comp_spec = ComponentSpec('utils', 'trimmer')
+ append_comp_specs_descriptors(descriptors, [comp_spec], _CompClsType.FILTER)
+
+ mip_version = bt2.get_greatest_operative_mip_version(descriptors)
+
+ if mip_version is None:
+ msg = 'failed to find an operative message interchange protocol version (components are not interoperable)'
+ raise RuntimeError(msg)
+
+ return mip_version
+