================================================================================
lml - Load me later. A lazy plugin management system.
.. image:: https://codecov.io/github/python-lml/lml/coverage.png
:target: https://codecov.io/github/python-lml/lml
.. image:: https://badge.fury.io/py/lml.svg
:target: https://pypi.org/project/lml
.. image:: https://pepy.tech/badge/lml/month
:target: https://pepy.tech/project/lml
.. image:: https://img.shields.io/github/stars/python-lml/lml.svg?style=social&maxAge=3600&label=Star
:target: https://github.com/python-lml/lml/stargazers
.. image:: https://img.shields.io/static/v1?label=continuous%20templating&message=%E6%A8%A1%E7%89%88%E6%9B%B4%E6%96%B0&color=blue&style=flat-square
:target: https://moban.readthedocs.io/en/latest/#at-scale-continous-templating-for-open-source-projects
.. image:: https://img.shields.io/static/v1?label=coding%20style&message=black&color=black&style=flat-square
:target: https://github.com/psf/black
.. image:: https://readthedocs.org/projects/lml/badge/?version=latest
:target: http://lml.readthedocs.org/en/latest/
lml seamlessly finds the lml based plugins from your current python
environment but loads your plugins on demand. It is designed to support
plugins that have external dependencies, especially bulky and/or
memory hungry ones. lml provides the plugin management system only and the
plugin interface is on your shoulder.
lml enabled applications helps your customers [#f1]_ in two ways:
#. Your customers could cherry-pick the plugins from pypi per python environment.
They could remove a plugin using pip uninstall
command.
#. Only the plugins used at runtime gets loaded into computer memory.
When you would use lml to refactor your existing code, it aims to flatten the
complexity and to shrink the size of your bulky python library by
distributing the similar functionalities across its plugins. However, you as
the developer need to do the code refactoring by yourself and lml would lend you a hand.
.. [#f1] the end developers who uses your library and packages achieve their
objectives.
Quick start
The following code tries to get you started quickly with non-lazy loading.
.. code-block:: python
from lml.plugin import PluginInfo, PluginManager
@PluginInfo("cuisine", tags=["Portable Battery"])
class Boost(object):
def make(self, food=None, **keywords):
print("I can cook %s for robots" % food)
class CuisineManager(PluginManager):
def __init__(self):
PluginManager.__init__(self, "cuisine")
def get_a_plugin(self, food_name=None, **keywords):
return PluginManager.get_a_plugin(self, key=food_name, **keywords)
if __name__ == '__main__':
manager = CuisineManager()
chef = manager.get_a_plugin("Portable Battery")
chef.make()
At a glance, above code simply replaces the Factory pattern should you write
them without lml. What's not obvious is, that once you got hands-on with it,
you can start work on how to do lazy loading.
Installation
You can install lml via pip:
.. code-block:: bash
$ pip install lml
or clone it and install it:
.. code-block:: bash
$ git clone https://github.com/python-lml/lml.git
$ cd lml
$ python setup.py install
lml enabled project
Beyond the documentation above, here is a list of projects using lml:
#. pyexcel <https://github.com/pyexcel/pyexcel>
_
#. pyecharts <https://github.com/pyecharts/pyecharts>
_
#. moban <https://github.com/moremoban/moban>
_
lml is available on these distributions:
#. ARCH linux <https://aur.archlinux.org/packages/python-lml/>
_
#. Conda forge <https://anaconda.org/conda-forge/lml>
_
#. OpenSuse <https://build.opensuse.org/package/show/devel:languages:python/python-lml>
_
License
New BSD
Change log
0.2.0 - 16/03/2025
Updated
#. replace import with importlib
Removed
#. removed python 2 support
0.1.0 - 21/10/2020
Updated
#. non class object can be a plugin too
#. #20 <https://github.com/python-lml/lml/issues/20>
_: When a plugin was not
installed, it now calls raise_exception method
0.0.9 - 7/1/2019
Updated
#. #11 <https://github.com/python-lml/lml/issues/11>
_: more test contents for
OpenSuse package validation
0.0.8 - 4/1/2019
Updated
#. #9 <https://github.com/python-lml/lml/issues/9>
_: include tests, docs for
OpenSuse package validation
0.0.7 - 17/11/2018
Fixed
#. #8 <https://github.com/python-lml/lml/issues/8>
_: get_primary_key will fail
when a module is loaded later
#. deprecated old style plugin scanner: scan_plugins
0.0.6 - 07/11/2018
Fixed
#. Revert the version 0.0.5 changes. Raise Import error and log the exception
0.0.5 - 06/11/2018
Fixed
#. #6 <https://github.com/python-lml/lml/issues/6>
_: Catch and Ignore
ModuleNotFoundError
0.0.4 - 07.08.2018
Added
#. #4 <https://github.com/python-lml/lml/issues/4>
_: to find plugin names with
different naming patterns
0.0.3 - 12/06/2018
Added
#. dict
can be a pluggable type in addition to function
, class
#. get primary tag of your tag, helping you find out which category of plugins
your tag points to
0.0.2 - 23/10/2017
Updated
#. pyexcel#103 <https://github.com/pyexcel/pyexcel/issues/103>
_: include
LICENSE in tar ball
0.0.1 - 30/05/2017
Added
#. First release