Skip to content

Commit

Permalink
♻️ remove plugin namespace
Browse files Browse the repository at this point in the history
  • Loading branch information
yanyongyu committed Nov 11, 2021
1 parent 08f56db commit 2ccbc93
Show file tree
Hide file tree
Showing 9 changed files with 215 additions and 209 deletions.
2 changes: 1 addition & 1 deletion nonebot/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
from nonebot.utils import escape_tag
from nonebot.config import Env, Config
from nonebot.log import logger, default_filter
from nonebot.drivers import Driver, ForwardDriver, ReverseDriver
from nonebot.drivers import Driver, ReverseDriver

try:
_dist: pkg_resources.Distribution = pkg_resources.get_distribution(
Expand Down
24 changes: 23 additions & 1 deletion nonebot/plugin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,36 @@
为 NoneBot 插件开发提供便携的定义函数。
"""

from typing import Optional
from typing import List, Optional
from contextvars import ContextVar

_managers: List["PluginManager"] = []
_current_plugin: ContextVar[Optional["Plugin"]] = ContextVar("_current_plugin",
default=None)

from .on import on as on
from .manager import PluginManager
from .export import Export as Export
from .export import export as export
from .load import require as require
from .on import on_regex as on_regex
from .plugin import Plugin as Plugin
from .on import on_notice as on_notice
from .on import on_command as on_command
from .on import on_keyword as on_keyword
from .on import on_message as on_message
from .on import on_request as on_request
from .on import on_endswith as on_endswith
from .load import load_plugin as load_plugin
from .on import CommandGroup as CommandGroup
from .on import MatcherGroup as MatcherGroup
from .on import on_metaevent as on_metaevent
from .plugin import get_plugin as get_plugin
from .load import load_plugins as load_plugins
from .on import on_startswith as on_startswith
from .load import load_from_json as load_from_json
from .load import load_from_toml as load_from_toml
from .on import on_shell_command as on_shell_command
from .load import load_all_plugins as load_all_plugins
from .plugin import get_loaded_plugins as get_loaded_plugins
from .load import load_builtin_plugins as load_builtin_plugins
87 changes: 31 additions & 56 deletions nonebot/plugin/load.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,14 @@
from typing import Set, Optional
import json
from typing import Set, Iterable, Optional

import tomlkit

from . import _managers
from .export import Export
from .manager import PluginManager
from .plugin import Plugin, get_plugin


# TODO
def _load_plugin(manager: PluginManager, plugin_name: str) -> Optional[Plugin]:
if plugin_name.startswith("_"):
return None

if plugin_name in plugins:
return None

try:
module = manager.load_plugin(plugin_name)

plugin = Plugin(plugin_name, module)
plugins[plugin_name] = plugin
logger.opt(colors=True).success(
f'Succeeded to import "<y>{escape_tag(plugin_name)}</y>"')
return plugin
except Exception as e:
logger.opt(colors=True, exception=e).error(
f'<r><bg #f8bbd0>Failed to import "{escape_tag(plugin_name)}"</bg #f8bbd0></r>'
)
return None


def load_plugin(module_path: str) -> Optional[Plugin]:
"""
:说明:
Expand All @@ -43,9 +24,9 @@ def load_plugin(module_path: str) -> Optional[Plugin]:
- ``Optional[Plugin]``
"""

context: Context = copy_context()
manager = PluginManager(PLUGIN_NAMESPACE, plugins=[module_path])
return context.run(_load_plugin, manager, module_path)
manager = PluginManager([module_path])
_managers.append(manager)
return manager.load_plugin(module_path)


def load_plugins(*plugin_dir: str) -> Set[Plugin]:
Expand All @@ -62,40 +43,30 @@ def load_plugins(*plugin_dir: str) -> Set[Plugin]:
- ``Set[Plugin]``
"""
loaded_plugins = set()
manager = PluginManager(PLUGIN_NAMESPACE, search_path=plugin_dir)
for plugin_name in manager.list_plugins():
context: Context = copy_context()
result = context.run(_load_plugin, manager, plugin_name)
if result:
loaded_plugins.add(result)
return loaded_plugins


def load_all_plugins(module_path: Set[str],
plugin_dir: Set[str]) -> Set[Plugin]:
manager = PluginManager(search_path=plugin_dir)
_managers.append(manager)
return manager.load_all_plugins()


def load_all_plugins(module_path: Iterable[str],
plugin_dir: Iterable[str]) -> Set[Plugin]:
"""
:说明:
导入指定列表中的插件以及指定目录下多个插件,以 ``_`` 开头的插件不会被导入!
:参数:
- ``module_path: Set[str]``: 指定插件集合
- ``plugin_dir: Set[str]``: 指定插件路径集合
- ``module_path: Iterable[str]``: 指定插件集合
- ``plugin_dir: Iterable[str]``: 指定插件路径集合
:返回:
- ``Set[Plugin]``
"""
loaded_plugins = set()
manager = PluginManager(PLUGIN_NAMESPACE, module_path, plugin_dir)
for plugin_name in manager.list_plugins():
context: Context = copy_context()
result = context.run(_load_plugin, manager, plugin_name)
if result:
loaded_plugins.add(result)
return loaded_plugins
manager = PluginManager(module_path, plugin_dir)
_managers.append(manager)
return manager.load_all_plugins()


def load_from_json(file_path: str, encoding: str = "utf-8") -> Set[Plugin]:
Expand Down Expand Up @@ -127,7 +98,7 @@ def load_from_toml(file_path: str, encoding: str = "utf-8") -> Set[Plugin]:
"""
:说明:
导入指定 toml 文件 ``[nonebot.plugins]`` 中的 ``plugins`` 以及 ``plugin_dirs`` 下多个插件,
导入指定 toml 文件 ``[tool.nonebot]`` 中的 ``plugins`` 以及 ``plugin_dirs`` 下多个插件,
以 ``_`` 开头的插件不会被导入!
:参数:
Expand All @@ -142,22 +113,23 @@ def load_from_toml(file_path: str, encoding: str = "utf-8") -> Set[Plugin]:
with open(file_path, "r", encoding=encoding) as f:
data = tomlkit.parse(f.read()) # type: ignore

nonebot_data = data.get("nonebot", {}).get("plugins")
nonebot_data = data.get("tool", {}).get("nonebot") or data.get(
"nonebot", {}).get("plugins")
if not nonebot_data:
raise ValueError("Cannot find '[nonebot.plugins]' in given toml file!")
raise ValueError("Cannot find '[tool.nonebot]' in given toml file!")
plugins = nonebot_data.get("plugins", [])
plugin_dirs = nonebot_data.get("plugin_dirs", [])
assert isinstance(plugins, list), "plugins must be a list of plugin name"
assert isinstance(plugin_dirs,
list), "plugin_dirs must be a list of directories"
return load_all_plugins(set(plugins), set(plugin_dirs))
return load_all_plugins(plugins, plugin_dirs)


def load_builtin_plugins(name: str = "echo") -> Optional[Plugin]:
"""
:说明:
导入 NoneBot 内置插件
导入 NoneBot 内置插件, 默认导入 ``echo`` 插件
:返回:
Expand All @@ -166,7 +138,7 @@ def load_builtin_plugins(name: str = "echo") -> Optional[Plugin]:
return load_plugin(f"nonebot.plugins.{name}")


def require(name: str) -> Optional[Export]:
def require(name: str) -> Export:
"""
:说明:
Expand All @@ -178,7 +150,10 @@ def require(name: str) -> Optional[Export]:
:返回:
- ``Optional[Export]``
- ``Export``
:异常:
- ``RuntimeError``: 插件无法加载
"""
plugin = get_plugin(name) or load_plugin(name)
if not plugin:
Expand Down

0 comments on commit 2ccbc93

Please sign in to comment.