1
0
mirror of https://github.com/mikf/gallery-dl.git synced 2024-11-22 02:32:33 +01:00

[util] add 'std' object to global eval namespace (#6330)

allows accessing standard library modules (and other external modules)
in a more straightforward manner than '__import__(...)'

* std.os.getcwd()
* std["os"].getcwd()
This commit is contained in:
Mike Fährmann 2024-10-17 21:01:34 +02:00
parent 9b4c94fda8
commit 4667833195
No known key found for this signature in database
GPG Key ID: 5680CA389D365A88
2 changed files with 48 additions and 0 deletions

View File

@ -532,6 +532,24 @@ class HTTPBasicAuth():
return request
class ModuleProxy():
__slots__ = ()
def __getitem__(self, key, modules=sys.modules):
try:
return modules[key]
except KeyError:
pass
try:
__import__(key)
except ImportError:
modules[key] = NONE
return NONE
return modules[key]
__getattr__ = __getitem__
class LazyPrompt():
__slots__ = ()
@ -540,6 +558,7 @@ class LazyPrompt():
class NullContext():
__slots__ = ()
def __enter__(self):
return None
@ -646,6 +665,7 @@ GLOBALS = {
"restart" : raises(exception.RestartExtraction),
"hash_sha1": sha1,
"hash_md5" : md5,
"std" : ModuleProxy(),
"re" : re,
}

View File

@ -830,6 +830,34 @@ def hash(value):
i += 1
self.assertEqual(i, 0)
def test_module_proxy(self):
proxy = util.ModuleProxy()
self.assertIs(proxy.os, os)
self.assertIs(proxy.os.path, os.path)
self.assertIs(proxy["os"], os)
self.assertIs(proxy["os.path"], os.path)
self.assertIs(proxy["os"].path, os.path)
self.assertIs(proxy.abcdefghi, util.NONE)
self.assertIs(proxy["abcdefghi"], util.NONE)
self.assertIs(proxy["abc.def.ghi"], util.NONE)
self.assertIs(proxy["os.path2"], util.NONE)
def test_null_context(self):
with util.NullContext():
pass
with util.NullContext() as ctx:
self.assertIs(ctx, None)
try:
with util.NullContext() as ctx:
exc_orig = ValueError()
raise exc_orig
except ValueError as exc:
self.assertIs(exc, exc_orig)
class TestExtractor():
category = "test_category"