Skip to content

Commit

Permalink
Relocate formatargspec() standing and update wheel builds.
Browse files Browse the repository at this point in the history
  • Loading branch information
GrahamDumpleton committed Mar 5, 2022
1 parent d0b7c35 commit 2f141c9
Show file tree
Hide file tree
Showing 8 changed files with 72 additions and 35 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ jobs:
if: ${{ matrix.arch == 'aarch64' }}
uses: docker/setup-qemu-action@v1
- name: Build wheels
uses: pypa/cibuildwheel@v2.2.0
uses: pypa/cibuildwheel@v2.3.1
with:
output-dir: dist
env:
Expand Down
16 changes: 16 additions & 0 deletions docs/changes.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,22 @@
Release Notes
=============

Version 1.14.0
--------------

**Bugs Fixed**

* Python 3.11 dropped `inspect.formatargspec()` which was used in creating
signature changing decorators. Now bundling a version of this function
which uses `Parameter` and `Signature` from `inspect` module when available.
The replacement function is exposed as `wrapt.formatargspec()` if need it
for your own code.

**New Features**

* Binary wheels provided on PyPi for `aarch64` Linux systems and macOS
native silicon where supported by Python when using `pypa/cibuildwheel`.

Version 1.13.3
--------------

Expand Down
11 changes: 11 additions & 0 deletions src/wrapt/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,15 @@
from .importer import (register_post_import_hook, when_imported,
notify_module_loaded, discover_post_import_hooks)

# Import of inspect.getcallargs() included for backward compatibility. An
# implementation of this was previously bundled and made available here for
# Python <2.7. Avoid using this in future.

from inspect import getcallargs

# Variant of inspect.formatargspec() included here for forward compatibility.
# This is being done because Python 3.11 dropped inspect.formatargspec() but
# code for handling signature changing decorators relied on it. Exposing the
# bundled implementation here in case any user of wrapt was also needing it.

from .arguments import formatargspec
38 changes: 38 additions & 0 deletions src/wrapt/arguments.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# The inspect.formatargspec() function was dropped in Python 3.11 but we need
# need it for when constructing signature changing decorators based on result of
# inspect.getargspec() or inspect.getfullargspec(). The code here implements
# inspect.formatargspec() base on Parameter and Signature from inspect module,
# which were added in Python 3.6. Thanks to Cyril Jouve for the implementation.

try:
from inspect import Parameter, Signature
except ImportError:
from inspect import formatargspec
else:
def formatargspec(args, varargs=None, varkw=None, defaults=None,
kwonlyargs=(), kwonlydefaults={}, annotations={}):
if kwonlydefaults is None:
kwonlydefaults = {}
ndefaults = len(defaults) if defaults else 0
parameters = [
Parameter(
arg,
Parameter.POSITIONAL_OR_KEYWORD,
default=defaults[i] if i >= 0 else Parameter.empty,
annotation=annotations.get(arg, Parameter.empty),
) for i, arg in enumerate(args, ndefaults - len(args))
]
if varargs:
parameters.append(Parameter(varargs, Parameter.VAR_POSITIONAL))
parameters.extend(
Parameter(
kwonlyarg,
Parameter.KEYWORD_ONLY,
default=kwonlydefaults.get(kwonlyarg, Parameter.empty),
annotation=annotations.get(kwonlyarg, Parameter.empty),
) for kwonlyarg in kwonlyargs
)
if varkw:
parameters.append(Parameter(varkw, Parameter.VAR_KEYWORD))
return_annotation = annotations.get('return', Signature.empty)
return str(Signature(parameters, return_annotation=return_annotation))
34 changes: 2 additions & 32 deletions src/wrapt/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,38 +34,8 @@ def exec_(_code_, _globs_=None, _locs_=None):
from inspect import isclass
from threading import Lock, RLock

try:
from inspect import Parameter, Signature
except ImportError: # < py3.5
from inspect import formatargspec
else:
def formatargspec(args, varargs=None, varkw=None, defaults=None,
kwonlyargs=(), kwonlydefaults={}, annotations={}):
if kwonlydefaults is None:
kwonlydefaults = {}
ndefaults = len(defaults) if defaults else 0
parameters = [
Parameter(
arg,
Parameter.POSITIONAL_OR_KEYWORD,
default=defaults[i] if i >= 0 else Parameter.empty,
annotation=annotations.get(arg, Parameter.empty),
) for i, arg in enumerate(args, ndefaults - len(args))
]
if varargs:
parameters.append(Parameter(varargs, Parameter.VAR_POSITIONAL))
parameters.extend(
Parameter(
kwonlyarg,
Parameter.KEYWORD_ONLY,
default=kwonlydefaults.get(kwonlyarg, Parameter.empty),
annotation=annotations.get(kwonlyarg, Parameter.empty),
) for kwonlyarg in kwonlyargs
)
if varkw:
parameters.append(Parameter(varkw, Parameter.VAR_KEYWORD))
return_annotation = annotations.get('return', Signature.empty)
return str(Signature(parameters, return_annotation=return_annotation))
from .arguments import formatargspec

try:
from inspect import signature
except ImportError:
Expand Down
2 changes: 2 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ def pytest_pycollect_makemodule(path, parent):
return construct_dummy(path, parent)
if '_py310' in path.basename and version < (3, 10):
return construct_dummy(path, parent)
if '_py311' in path.basename and version < (3, 11):
return construct_dummy(path, parent)
if '_py3' in path.basename and version < (3, 0):
return construct_dummy(path, parent)
if '_py2' in path.basename and version >= (3, 0):
Expand Down
2 changes: 1 addition & 1 deletion tests/test_formatargspec_py35.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import sys
from inspect import getfullargspec

from wrapt.decorators import formatargspec
from wrapt import formatargspec

class TestFormatargspec35(unittest.TestCase):

Expand Down
2 changes: 1 addition & 1 deletion tests/test_formatargspec_py38.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import sys
from inspect import getfullargspec

from wrapt.decorators import formatargspec
from wrapt import formatargspec

class TestFormatargspec38(unittest.TestCase):

Expand Down

0 comments on commit 2f141c9

Please sign in to comment.