🐛 fix reimport by require

This commit is contained in:
yanyongyu 2021-03-13 18:21:56 +08:00
parent 785eac1345
commit 211c571508
3 changed files with 123 additions and 14 deletions

View File

@ -6,7 +6,7 @@ from hashlib import md5
from types import ModuleType from types import ModuleType
from collections import Counter from collections import Counter
from importlib.abc import MetaPathFinder from importlib.abc import MetaPathFinder
from importlib.machinery import PathFinder from importlib.machinery import PathFinder, SourceFileLoader
from typing import Set, List, Optional, Iterable from typing import Set, List, Optional, Iterable
_internal_space = ModuleType(__name__ + "._internal") _internal_space = ModuleType(__name__ + "._internal")
@ -142,6 +142,7 @@ class PluginManager:
if "." in name: if "." in name:
raise ValueError("Plugin name cannot contain '.'") raise ValueError("Plugin name cannot contain '.'")
with self: with self:
return importlib.import_module(f"{self.namespace}.{name}") return importlib.import_module(f"{self.namespace}.{name}")
@ -173,9 +174,28 @@ class PluginFinder(MetaPathFinder):
list(manager.search_path), list(manager.search_path),
target) target)
if spec: if spec:
spec.loader = PluginLoader(newname, spec.origin)
return spec return spec
index -= 1 index -= 1
return None return None
class PluginLoader(SourceFileLoader):
def __init__(self, fullname: str, path) -> None:
self.loaded = False
super().__init__(fullname, path)
def create_module(self, spec) -> Optional[ModuleType]:
if self.name in sys.modules:
self.loaded = True
return sys.modules[self.name]
return super().create_module(spec)
def exec_module(self, module: ModuleType) -> None:
if self.loaded:
return
return super().exec_module(module)
sys.meta_path.insert(0, PluginFinder()) sys.meta_path.insert(0, PluginFinder())

112
poetry.lock generated
View File

@ -3,7 +3,7 @@ name = "aiofiles"
version = "0.6.0" version = "0.6.0"
description = "File support for asyncio." description = "File support for asyncio."
category = "main" category = "main"
optional = true optional = false
python-versions = "*" python-versions = "*"
[package.source] [package.source]
@ -389,7 +389,7 @@ reference = "aliyun"
[[package]] [[package]]
name = "nonebot-adapter-cqhttp" name = "nonebot-adapter-cqhttp"
version = "2.0.0-alpha.11" version = "2.0.0a11.post2"
description = "OneBot(CQHTTP) adapter for nonebot2" description = "OneBot(CQHTTP) adapter for nonebot2"
category = "dev" category = "dev"
optional = false optional = false
@ -406,7 +406,7 @@ url = "packages/nonebot-adapter-cqhttp"
[[package]] [[package]]
name = "nonebot-adapter-ding" name = "nonebot-adapter-ding"
version = "2.0.0-alpha.11" version = "2.0.0a11.post2"
description = "Ding adapter for nonebot2" description = "Ding adapter for nonebot2"
category = "dev" category = "dev"
optional = false optional = false
@ -423,7 +423,7 @@ url = "packages/nonebot-adapter-ding"
[[package]] [[package]]
name = "nonebot-adapter-mirai" name = "nonebot-adapter-mirai"
version = "2.0.0-alpha.11" version = "2.0.0a11.post2"
description = "Mirai Api HTTP adapter for nonebot2" description = "Mirai Api HTTP adapter for nonebot2"
category = "dev" category = "dev"
optional = false optional = false
@ -439,6 +439,24 @@ websockets = "^8.1"
type = "directory" type = "directory"
url = "packages/nonebot-adapter-mirai" url = "packages/nonebot-adapter-mirai"
[[package]]
name = "nonebot-plugin-test"
version = "0.2.0"
description = "Test frontend for nonebot v2+"
category = "dev"
optional = false
python-versions = ">=3.7,<4.0"
[package.dependencies]
aiofiles = ">=0.6.0,<0.7.0"
nonebot2 = ">=2.0.0-alpha.9,<3.0.0"
python-socketio = ">=4.6.1,<5.0.0"
[package.source]
type = "legacy"
url = "https://mirrors.aliyun.com/pypi/simple"
reference = "aliyun"
[[package]] [[package]]
name = "packaging" name = "packaging"
version = "20.9" version = "20.9"
@ -507,7 +525,7 @@ reference = "aliyun"
[[package]] [[package]]
name = "pygments" name = "pygments"
version = "2.8.0" version = "2.8.1"
description = "Pygments is a syntax highlighting package written in Python." description = "Pygments is a syntax highlighting package written in Python."
category = "dev" category = "dev"
optional = false optional = false
@ -560,6 +578,47 @@ type = "legacy"
url = "https://mirrors.aliyun.com/pypi/simple" url = "https://mirrors.aliyun.com/pypi/simple"
reference = "aliyun" reference = "aliyun"
[[package]]
name = "python-engineio"
version = "3.14.2"
description = "Engine.IO server"
category = "dev"
optional = false
python-versions = "*"
[package.dependencies]
six = ">=1.9.0"
[package.extras]
asyncio_client = ["aiohttp (>=3.4)"]
client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"]
[package.source]
type = "legacy"
url = "https://mirrors.aliyun.com/pypi/simple"
reference = "aliyun"
[[package]]
name = "python-socketio"
version = "4.6.1"
description = "Socket.IO server"
category = "dev"
optional = false
python-versions = "*"
[package.dependencies]
python-engineio = ">=3.13.0,<4"
six = ">=1.9.0"
[package.extras]
asyncio_client = ["aiohttp (>=3.4)", "websockets (>=7.0)"]
client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"]
[package.source]
type = "legacy"
url = "https://mirrors.aliyun.com/pypi/simple"
reference = "aliyun"
[[package]] [[package]]
name = "pytz" name = "pytz"
version = "2021.1" version = "2021.1"
@ -655,6 +714,19 @@ type = "legacy"
url = "https://mirrors.aliyun.com/pypi/simple" url = "https://mirrors.aliyun.com/pypi/simple"
reference = "aliyun" reference = "aliyun"
[[package]]
name = "six"
version = "1.15.0"
description = "Python 2 and 3 compatibility utilities"
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
[package.source]
type = "legacy"
url = "https://mirrors.aliyun.com/pypi/simple"
reference = "aliyun"
[[package]] [[package]]
name = "sniffio" name = "sniffio"
version = "1.2.0" version = "1.2.0"
@ -683,7 +755,7 @@ reference = "aliyun"
[[package]] [[package]]
name = "sphinx" name = "sphinx"
version = "3.5.1" version = "3.5.2"
description = "Python documentation generator" description = "Python documentation generator"
category = "dev" category = "dev"
optional = false optional = false
@ -735,7 +807,7 @@ yapf = "*"
[package.source] [package.source]
type = "git" type = "git"
url = "https://github.com/nonebot/sphinx-markdown-builder.git" url = "git@github.com:nonebot/sphinx-markdown-builder.git"
reference = "master" reference = "master"
resolved_reference = "fdbc39e1b50aabf8dbcf129895fbbd02cbf54554" resolved_reference = "fdbc39e1b50aabf8dbcf129895fbbd02cbf54554"
@ -1083,7 +1155,7 @@ quart = ["Quart"]
[metadata] [metadata]
lock-version = "1.1" lock-version = "1.1"
python-versions = "^3.7.3" python-versions = "^3.7.3"
content-hash = "f4e49d25ac5c37b3c7527935b52acf5d0d6d0261a645f4247120f9e28c5ca282" content-hash = "51c469a7330ef3dc06805b771670f2c1526ebfc6e50d7c22571ae3ffc7b0f352"
[metadata.files] [metadata.files]
aiofiles = [ aiofiles = [
@ -1248,6 +1320,10 @@ markupsafe = [
nonebot-adapter-cqhttp = [] nonebot-adapter-cqhttp = []
nonebot-adapter-ding = [] nonebot-adapter-ding = []
nonebot-adapter-mirai = [] nonebot-adapter-mirai = []
nonebot-plugin-test = [
{file = "nonebot-plugin-test-0.2.0.tar.gz", hash = "sha256:c9ee997c5c96160de4af02d10a7c6301b3fc4e942df7e70906df0534606ea23b"},
{file = "nonebot_plugin_test-0.2.0-py3-none-any.whl", hash = "sha256:75cd18cc282815a03250bb86c7d2a8d6a66a5064ac335bedc9a3e268a1e7dd13"},
]
packaging = [ packaging = [
{file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"},
{file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"},
@ -1285,8 +1361,8 @@ pydash = [
{file = "pydash-4.9.3.tar.gz", hash = "sha256:d709e57b537b1aaf118f188da3ec6242a665090ecd7839b66f857ee3dc2bb006"}, {file = "pydash-4.9.3.tar.gz", hash = "sha256:d709e57b537b1aaf118f188da3ec6242a665090ecd7839b66f857ee3dc2bb006"},
] ]
pygments = [ pygments = [
{file = "Pygments-2.8.0-py3-none-any.whl", hash = "sha256:b21b072d0ccdf29297a82a2363359d99623597b8a265b8081760e4d0f7153c88"}, {file = "Pygments-2.8.1-py3-none-any.whl", hash = "sha256:534ef71d539ae97d4c3a4cf7d6f110f214b0e687e92f9cb9d2a3b0d3101289c8"},
{file = "Pygments-2.8.0.tar.gz", hash = "sha256:37a13ba168a02ac54cc5891a42b1caec333e59b66addb7fa633ea8a6d73445c0"}, {file = "Pygments-2.8.1.tar.gz", hash = "sha256:2656e1a6edcdabf4275f9a3640db59fd5de107d88e8663c5d4e9a0fa62f77f94"},
] ]
pygtrie = [ pygtrie = [
{file = "pygtrie-2.4.2.tar.gz", hash = "sha256:43205559d28863358dbbf25045029f58e2ab357317a59b11f11ade278ac64692"}, {file = "pygtrie-2.4.2.tar.gz", hash = "sha256:43205559d28863358dbbf25045029f58e2ab357317a59b11f11ade278ac64692"},
@ -1299,6 +1375,14 @@ python-dotenv = [
{file = "python-dotenv-0.15.0.tar.gz", hash = "sha256:587825ed60b1711daea4832cf37524dfd404325b7db5e25ebe88c495c9f807a0"}, {file = "python-dotenv-0.15.0.tar.gz", hash = "sha256:587825ed60b1711daea4832cf37524dfd404325b7db5e25ebe88c495c9f807a0"},
{file = "python_dotenv-0.15.0-py2.py3-none-any.whl", hash = "sha256:0c8d1b80d1a1e91717ea7d526178e3882732420b03f08afea0406db6402e220e"}, {file = "python_dotenv-0.15.0-py2.py3-none-any.whl", hash = "sha256:0c8d1b80d1a1e91717ea7d526178e3882732420b03f08afea0406db6402e220e"},
] ]
python-engineio = [
{file = "python-engineio-3.14.2.tar.gz", hash = "sha256:eab4553f2804c1ce97054c8b22cf0d5a9ab23128075248b97e1a5b2f29553085"},
{file = "python_engineio-3.14.2-py2.py3-none-any.whl", hash = "sha256:5a9e6086d192463b04a1428ff1f85b6ba631bbb19d453b144ffc04f530542b84"},
]
python-socketio = [
{file = "python-socketio-4.6.1.tar.gz", hash = "sha256:cd1f5aa492c1eb2be77838e837a495f117e17f686029ebc03d62c09e33f4fa10"},
{file = "python_socketio-4.6.1-py2.py3-none-any.whl", hash = "sha256:5a21da53fdbdc6bb6c8071f40e13d100e0b279ad997681c2492478e06f370523"},
]
pytz = [ pytz = [
{file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"},
{file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"},
@ -1338,6 +1422,10 @@ rfc3986 = [
{file = "rfc3986-1.4.0-py2.py3-none-any.whl", hash = "sha256:af9147e9aceda37c91a05f4deb128d4b4b49d6b199775fd2d2927768abdc8f50"}, {file = "rfc3986-1.4.0-py2.py3-none-any.whl", hash = "sha256:af9147e9aceda37c91a05f4deb128d4b4b49d6b199775fd2d2927768abdc8f50"},
{file = "rfc3986-1.4.0.tar.gz", hash = "sha256:112398da31a3344dc25dbf477d8df6cb34f9278a94fee2625d89e4514be8bb9d"}, {file = "rfc3986-1.4.0.tar.gz", hash = "sha256:112398da31a3344dc25dbf477d8df6cb34f9278a94fee2625d89e4514be8bb9d"},
] ]
six = [
{file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"},
{file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"},
]
sniffio = [ sniffio = [
{file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"}, {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"},
{file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"}, {file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"},
@ -1347,8 +1435,8 @@ snowballstemmer = [
{file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"},
] ]
sphinx = [ sphinx = [
{file = "Sphinx-3.5.1-py3-none-any.whl", hash = "sha256:e90161222e4d80ce5fc811ace7c6787a226b4f5951545f7f42acf97277bfc35c"}, {file = "Sphinx-3.5.2-py3-none-any.whl", hash = "sha256:ef64a814576f46ec7de06adf11b433a0d6049be007fefe7fd0d183d28b581fac"},
{file = "Sphinx-3.5.1.tar.gz", hash = "sha256:11d521e787d9372c289472513d807277caafb1684b33eb4f08f7574c405893a9"}, {file = "Sphinx-3.5.2.tar.gz", hash = "sha256:672cfcc24b6b69235c97c750cb190a44ecd72696b4452acaf75c2d9cc78ca5ff"},
] ]
sphinx-markdown-builder = [] sphinx-markdown-builder = []
sphinxcontrib-applehelp = [ sphinxcontrib-applehelp = [

View File

@ -35,10 +35,11 @@ uvicorn = { version = "^0.13.0", extras = ["standard"] }
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
yapf = "^0.30.0" yapf = "^0.30.0"
sphinx = "^3.4.1" sphinx = "^3.4.1"
nonebot-plugin-test = "^0.2.0"
nonebot-adapter-cqhttp = { path = "./packages/nonebot-adapter-cqhttp", develop = true } nonebot-adapter-cqhttp = { path = "./packages/nonebot-adapter-cqhttp", develop = true }
nonebot-adapter-ding = { path = "./packages/nonebot-adapter-ding", develop = true } nonebot-adapter-ding = { path = "./packages/nonebot-adapter-ding", develop = true }
nonebot-adapter-mirai = { path = "./packages/nonebot-adapter-mirai", develop = true } nonebot-adapter-mirai = { path = "./packages/nonebot-adapter-mirai", develop = true }
sphinx-markdown-builder = { git = "https://github.com/nonebot/sphinx-markdown-builder.git" } sphinx-markdown-builder = { git = "git@github.com:nonebot/sphinx-markdown-builder.git" }
[tool.poetry.extras] [tool.poetry.extras]
quart = ["quart"] quart = ["quart"]