Plugin Development ------------------ A single Plugin can provide one or more of the pluggable entities described elsewhere (MCO/KPICalculators/DataSources). Multiple plugins can be installed to provide a broad range of functionalities. Plugins must return Factories. Each Factory provides factory methods for one of the above pluggable entities and its associated classes. To implement a new plugin, you must - define the entity you want to extend (e.g. ``MyOwnDataSource``) as a derived class of the appropriate class (e.g. ``BaseDataSource``), and reimplement the appropriate methods: - ``run()``: where the actual computation takes place, given the configuration options specified in the model (which is received as an argument). It is strongly advised that the ``run()`` method is stateless. - ``slots()``: must return a 2-tuple of tuples. Each tuple contains instances of the ``Slot`` class. Slots are the input and output entities of the data source or KPI calculator. Given that this information depends on the configuration options, ``slots()`` accepts the model and must return the appropriate values according to the model options. - Define the model that this ``DataSource`` needs, by extending ``BaseDataSourceModel`` and adding, with traits, the appropriate data that are required by your data source to perform its task. If a trait change in your model influences the input/output slots, you must make sure that the event ``changes_slots`` is fired as a consequence of those changes. This will notify the UI that the new slots need to be recomputed and presented to the user. Failing to do so will have unexpected consequences. - Define the Factory, by reimplementing BaseDataSourceFactory and reimplementing its ``create_*`` methods to return the above entities. - Define a ``Plugin`` by reimplementing ``BaseExtensionPlugin`` and reimplementing its initialization defaults methods to return your factory. - add the plugin class in the setup.py entry_point, under the namespace ``force.bdss.extensions``