diff --git a/docs/project/changelog.md b/docs/project/changelog.md index 32cce19c3..d3efe71d7 100644 --- a/docs/project/changelog.md +++ b/docs/project/changelog.md @@ -16,7 +16,7 @@ substitutions: ### Packages -- New packages: sqlalchemy {pr}`2112` pydantic {pr}`2117` +- New packages: sqlalchemy {pr}`2112`, pydantic {pr}`2117`, wrapt {pr}`2165` - Upgraded packages: distlib (0.3.4) diff --git a/packages/wrapt/meta.yaml b/packages/wrapt/meta.yaml new file mode 100644 index 000000000..48e6f9037 --- /dev/null +++ b/packages/wrapt/meta.yaml @@ -0,0 +1,14 @@ +package: + name: wrapt + version: 1.13.3 +source: + url: https://files.pythonhosted.org/packages/eb/f6/d81ccf43ac2a3c80ddb6647653ac8b53ce2d65796029369923be06b815b8/wrapt-1.13.3.tar.gz + sha256: 1fea9cd438686e6682271d36f3481a9f3636195578bab9ca3382e2f5f01fc185 +test: + imports: + - wrapt +about: + home: https://github.com/GrahamDumpleton/wrapt + PyPI: https://pypi.org/project/wrapt + summary: Module for decorators, wrappers and monkey patching. + license: BSD diff --git a/packages/wrapt/test_wrapt.py b/packages/wrapt/test_wrapt.py new file mode 100644 index 000000000..25cb838e8 --- /dev/null +++ b/packages/wrapt/test_wrapt.py @@ -0,0 +1,81 @@ +from pyodide_build.testing import run_in_pyodide + + +@run_in_pyodide(packages=["wrapt"]) +def test_wrapt(): + import wrapt + import unittest + + @wrapt.decorator + def passthru_decorator(wrapped, instance, args, kwargs): + return wrapped(*args, **kwargs) + + def function1(arg): + """documentation""" + return arg + + function1o = function1 + function1d = passthru_decorator(function1) + assert function1d is not function1o + + class TestNamingFunction(unittest.TestCase): + def test_object_name(self): + # Test preservation of function __name__ attribute. + + self.assertEqual(function1d.__name__, function1o.__name__) + + def test_object_qualname(self): + # Test preservation of function __qualname__ attribute. + + try: + __qualname__ = function1o.__qualname__ + except AttributeError: + pass + else: + self.assertEqual(function1d.__qualname__, __qualname__) + + def test_module_name(self): + # Test preservation of function __module__ attribute. + + self.assertEqual(function1d.__module__, __name__) + + def test_doc_string(self): + # Test preservation of function __doc__ attribute. + + self.assertEqual(function1d.__doc__, function1o.__doc__) + + def test_argspec(self): + # Test preservation of function argument specification. + + function1o_argspec = inspect.getargspec(function1o) + function1d_argspec = inspect.getargspec(function1d) + self.assertEqual(function1o_argspec, function1d_argspec) + + def test_getmembers(self): + function1o_members = inspect.getmembers(function1o) + function1d_members = inspect.getmembers(function1d) + + def test_isinstance(self): + # Test preservation of isinstance() checks. + + self.assertTrue(isinstance(function1d, type(function1o))) + + class TestCallingFunction(unittest.TestCase): + def test_call_function(self): + _args = (1, 2) + _kwargs = {"one": 1, "two": 2} + + @wrapt.decorator + def _decorator(wrapped, instance, args, kwargs): + self.assertEqual(instance, None) + self.assertEqual(args, _args) + self.assertEqual(kwargs, _kwargs) + return wrapped(*args, **kwargs) + + @_decorator + def _function(*args, **kwargs): + return args, kwargs + + result = _function(*_args, **_kwargs) + + self.assertEqual(result, (_args, _kwargs))