Uraduga插件系统
puradouga的Python项目详细描述
Puradouga
概述
Puradouga是Uraduga的插件系统。目前它的唯一任务是充当uradouga和metadouga之间的接口。但只要遵循相应的指导原则,它也可以与其他项目无问题地进行交互。 Puradouga包含一个通用插件系统,该系统在puradouga.core中定义。基于此,puradouga.plugins.media包含几个类,这些类作为单个插件的基础。此外,puradouga.plugins.data包含各种数据类,它们充当插件的参数和结果。各个接口显式地指定这些数据类型之一或使用python数据类型。
用法
插件
puradouga使用插件的动态加载,所以如果插件位于某个文件夹中,就足够了。此文件夹由Uraduga提供。
puradouga最初搜索其接口的实现。要找到它们,它们必须通过import <pluginName>
可用。
这可以通过将插件设计为一个可以找到实现的文件来实现。或者,插件可以是一个包,其中的实现被导入到uuinit_uuuu.py文件中。
请注意,puradouga必须首先正常执行插件才能加载它们。因此,建议不要在文件中直接包含任何代码,而是所有代码都只能通过类访问。
创建插件的过程相对简单。首先你必须找到一个合适的接口。然后基于它编写自己的类,这将显示所需的行为。
frompuradouga.plugins.mediaimportTvMetaProviderfrompuradouga.pluginsimportdataaspmclassHelloWorld(TvMetaProvider):defseries_from_filename(self,filename_parsed:pm.FilenameParsed)->pm.SeriesResponse:returnpm.SeriesResponse(title=pm.Title(english="Hello World"))
在上面的例子中,分析了一个系列。该方法获取一个对象作为参数,其中包含有关该文件的不同信息。现在我们创建一个答案并将标题设置为Hello World
。如果uradouga调用这个插件,这个系列的标题都是Hello World
。
装载机
加载插件主要采用puradouga内核。第一步是创建一个插件系统。它管理各个插件并提供加载插件的方法。在一个项目中使用一个pluginsystem通常就足够了,但是可以同时使用多个pluginsystem。 接下来,插件的基类和插件所在的文件夹必须在这个系统上注册。系统重新加载后,即可使用。
frompuradouga.coreimportPluginSystemfrompuradouga.plugins.mediaimportTvMetaProvidersystem=PluginSystem(auto_reload=False)system.register_source("./plugins")# Plugin foldersystem.register_base_class(TvMetaProvider)# Plugin base classsystem.reload()
下一步是创建一个过滤器。这将只返回那些对应于某个基类的plgin。其他的都将被忽略。 结果是可以执行不同的方法。这些对应于执行插件的不同策略。根据方法的不同,您可以缩短时间,因为并不是所有的插件都必须执行。
frompuradouga.coreimportPluginSystemfromtest_puradouga.test_plugin_specimportMathPluginplugin_system=PluginSystem(auto_reload=False)plugin_system.register_source("./plugins")plugin_system.register_base_class(MathPlugin)plugin_system.reload()math_filter=plugin_system.get_filter(MathPlugin)# Execute all plugins and return ordered by scoremath_filter.eval_score(MathPlugin.operation,args=[27,13])# Execute all plugins one after another, until the code exitsresults=list(math_filter.eval_ordered(MathPlugin.operation,lambdaa:a,max_results=3,plugin_name_order=['Multiply','Divide','Subtract','Add'],args=[7,5]))
由于eval方法都使用yield,因此在第二个示例中,代码可以在每个项之后中止,而不必执行所有插件。在第一个例子中这是不可能的,因为这是排序的。所有插件必须已经过评估。 Puradouga将过滤不正确的答案,只要它不在调试模式。