Skip to content

Commit

Permalink
[util] add 'std' object to global eval namespace (#6330)
Browse files Browse the repository at this point in the history
allows accessing standard library modules (and other external modules)
in a more straightforward manner than '__import__(...)'

* std.os.getcwd()
* std["os"].getcwd()
  • Loading branch information
mikf committed Oct 17, 2024
1 parent 9b4c94f commit 4667833
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 0 deletions.
20 changes: 20 additions & 0 deletions gallery_dl/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,24 @@ def __call__(self, request):
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__ = ()

Expand All @@ -540,6 +558,7 @@ def __str__(self):


class NullContext():
__slots__ = ()

def __enter__(self):
return None
Expand Down Expand Up @@ -646,6 +665,7 @@ def __str__():
"restart" : raises(exception.RestartExtraction),
"hash_sha1": sha1,
"hash_md5" : md5,
"std" : ModuleProxy(),
"re" : re,
}

Expand Down
28 changes: 28 additions & 0 deletions test/test_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -830,6 +830,34 @@ def test_universal_none(self):
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"
Expand Down

0 comments on commit 4667833

Please sign in to comment.