[Python-modules-commits] [plainbox] 06/10: merge patched into master
Sylvain Pineau
spineau-guest at moszumanska.debian.org
Fri Dec 4 16:13:54 UTC 2015
This is an automated email from the git hooks/post-receive script.
spineau-guest pushed a commit to tag debian/0.24-1
in repository plainbox.
commit 8b353bc456ff9a213f7a379c77ddc8ea7bae82bc
Merge: 3cbe821 0d3fade
Author: Sylvain Pineau <sylvain.pineau at canonical.com>
Date: Thu Dec 3 14:44:11 2015 +0100
merge patched into master
MANIFEST.in | 3 +
PKG-INFO | 2 +-
debian/.git-dpm | 6 +-
debian/patches/documentation-theme | 2 +-
debian/patches/fix-mock-tests | 212 ---
debian/patches/fix-packaging-metadata-units | 452 -------
debian/patches/fix-proxy-mock-tests | 44 -
debian/patches/fix-remaning-py35-issues | 108 --
debian/patches/more-mock-fixes | 264 ----
debian/patches/series | 5 -
debian/patches/silence-logging-failure | 2 +-
debian/patches/unvendorize | 12 +-
docs/author/index.rst | 1 -
docs/changelog.rst | 103 +-
docs/dev/resources.rst | 63 +-
docs/install.rst | 37 +
docs/manpages/plainbox-exporter-units.rst | 55 +-
docs/manpages/plainbox-job-units.rst | 72 +-
docs/manpages/plainbox-test-plan-units.rst | 114 +-
docs/ref/plainbox.impl.exporter.html.rst | 5 -
docs/ref/plainbox.impl.exporter.jinja2.rst | 5 +
docs/ref/plainbox.impl.exporter.xml.rst | 5 -
docs/ref/plainbox.impl.proxy.rst | 5 -
docs/ref/plainbox.impl.session.legacy.rst | 5 -
plainbox.egg-info/PKG-INFO | 2 +-
plainbox.egg-info/SOURCES.txt | 24 +-
plainbox.egg-info/entry_points.txt | 24 +-
plainbox.egg-info/requires.txt | 5 +-
plainbox/__init__.py | 2 +-
plainbox/abc.py | 4 +-
.../data/plainbox-qml-modules/Plainbox/QmlJob.qml | 27 +
plainbox/data/plainbox-qml-modules/Plainbox/qmldir | 23 +
plainbox/impl/applogic.py | 4 +-
plainbox/impl/censoREd.py | 26 +-
plainbox/impl/clitools.py | 2 +-
plainbox/impl/color.py | 90 ++
plainbox/impl/commands/inv_list.py | 2 +-
plainbox/impl/commands/inv_run.py | 20 +-
plainbox/impl/commands/inv_special.py | 13 +-
plainbox/impl/commands/inv_startprovider.py | 59 +-
plainbox/impl/ctrl.py | 104 +-
plainbox/impl/depmgr.py | 1 +
plainbox/impl/developer.py | 226 ++++
plainbox/impl/exporter/test_hexr.py | 130 ++
plainbox/impl/exporter/xlsx.py | 44 +-
plainbox/impl/highlevel.py | 153 ---
plainbox/impl/ingredients.py | 248 ++++
plainbox/impl/job.py | 224 +---
plainbox/impl/providers/categories/po/es.po | 4 +-
.../impl/providers/categories/po/{es.po => fr.po} | 105 +-
plainbox/impl/providers/categories/po/pl.po | 4 +-
.../impl/providers/categories/po/{es.po => ug.po} | 103 +-
.../providers/categories/po/{es.po => zh_TW.po} | 103 +-
.../impl/providers/exporters/data/checkbox.html | 2 +-
plainbox/impl/providers/exporters/data/hexr.xml | 22 +-
plainbox/impl/providers/manifest/manage.py | 53 +-
plainbox/impl/providers/manifest/po/pl.po | 4 +-
.../impl/providers/manifest/po/{pl.po => zh_TW.po} | 65 +-
.../impl/providers/stubbox/data/qml-simple.qml | 6 +-
plainbox/impl/providers/stubbox/po/de.po | 4 +-
plainbox/impl/providers/stubbox/po/en_GB.po | 4 +-
plainbox/impl/providers/stubbox/po/pl.po | 4 +-
plainbox/impl/providers/stubbox/po/pt.po | 4 +-
.../impl/providers/stubbox/po/{pt.po => ug.po} | 18 +-
plainbox/impl/proxy.py | 401 ------
plainbox/impl/resource.py | 111 +-
plainbox/impl/result.py | 21 +-
plainbox/impl/runner.py | 8 +-
plainbox/impl/secure/config.py | 12 +-
plainbox/impl/secure/providers/test_v1.py | 24 +-
plainbox/impl/secure/providers/v1.py | 124 +-
plainbox/impl/secure/test_config.py | 33 +
plainbox/impl/session/__init__.py | 40 +-
plainbox/impl/session/assistant.py | 1347 ++++++++++++++++++++
plainbox/impl/session/jobs.py | 13 +-
plainbox/impl/session/legacy.py | 275 ----
plainbox/impl/session/manager.py | 3 +-
plainbox/impl/session/resume.py | 200 ++-
plainbox/impl/session/state.py | 123 +-
plainbox/impl/session/storage.py | 5 +-
plainbox/impl/session/suspend.py | 90 +-
plainbox/impl/session/test_assistant.py | 171 +++
plainbox/impl/session/test_legacy.py | 69 -
plainbox/impl/session/test_resume.py | 170 ++-
plainbox/impl/session/test_state.py | 22 +
plainbox/impl/session/test_suspend.py | 135 +-
plainbox/impl/test_ctrl.py | 97 +-
plainbox/impl/test_developer.py | 88 ++
plainbox/impl/test_init.py | 17 +-
plainbox/impl/test_job.py | 69 -
plainbox/impl/test_proxy.py | 376 ------
plainbox/impl/test_resource.py | 44 +-
plainbox/impl/transport.py | 186 ++-
plainbox/impl/unit/job.py | 108 +-
plainbox/impl/unit/packaging.py | 16 +
plainbox/impl/unit/test_job.py | 76 +-
plainbox/impl/unit/test_testplan.py | 78 +-
plainbox/impl/unit/testplan.py | 174 ++-
plainbox/provider_manager.py | 53 +-
plainbox/qml_shell/qml_shell.py | 4 +-
plainbox/tests.py | 5 +-
po/POTFILES.in | 3 -
po/de.po | 4 +-
po/en_AU.po | 4 +-
po/en_CA.po | 4 +-
po/en_GB.po | 4 +-
po/es.po | 4 +-
po/{pt.po => fr.po} | 23 +-
po/ja.po | 4 +-
po/pl.po | 4 +-
po/pt.po | 4 +-
po/ru.po | 4 +-
po/tr.po | 4 +-
po/uk.po | 4 +-
po/zh_TW.po | 4 +-
setup.py | 5 +-
116 files changed, 5017 insertions(+), 3394 deletions(-)
diff --cc debian/.git-dpm
index bfaa534,0000000..4f5d2ac
mode 100644,000000..100644
--- a/debian/.git-dpm
+++ b/debian/.git-dpm
@@@ -1,11 -1,0 +1,11 @@@
+# see git-dpm(1) from git-dpm package
- 5839f591331739545f1e534ebef3615a091d9410
- 5839f591331739545f1e534ebef3615a091d9410
- bca60fc2a22b4977d3bc82d3f8dbe1d60d7cf6ae
++0d3fade51baa6f0534eaa3f7d78fae92ace3b2c9
++0d3fade51baa6f0534eaa3f7d78fae92ace3b2c9
++fffe7d6aae9e2bea94bcf7f945a9c670aa344af1
+fffe7d6aae9e2bea94bcf7f945a9c670aa344af1
+plainbox_0.24.orig.tar.gz
+7698425fed465b5681277c101b44a8d280b6662b
+1455278
+debianTag="debian/%e%v"
+patchedTag="patched/%e%v"
+upstreamTag="upstream/%e%u"
diff --cc debian/patches/documentation-theme
index 55530f2,0000000..0e4fdd2
mode 100644,000000..100644
--- a/debian/patches/documentation-theme
+++ b/debian/patches/documentation-theme
@@@ -1,42 -1,0 +1,42 @@@
- From b4e2f52a1aa3b4a0701684038f3f19e99d9e245f Mon Sep 17 00:00:00 2001
++From 0d3fade51baa6f0534eaa3f7d78fae92ace3b2c9 Mon Sep 17 00:00:00 2001
+From: Zygmunt Krynicki <zygmunt.krynicki at canonical.com>
+Date: Thu, 8 Oct 2015 10:13:55 -0700
+Subject: Revert the documentation theme back to default
+
+ PlainBox uses a customized sphinx theme that includes additional
+ HTML to integrate with online comment service. This should not be
+ a part of the offline documentation package.
+Origin: upstream
+Forwarded: not-needed
+Last-Update: 2015-07-21
+
+Patch-Name: documentation-theme
+---
+ docs/conf.py | 10 +---------
+ 1 file changed, 1 insertion(+), 9 deletions(-)
+
+diff --git a/docs/conf.py b/docs/conf.py
+index e8dff10..8310280 100644
+--- a/docs/conf.py
++++ b/docs/conf.py
+@@ -126,19 +126,11 @@ pygments_style = 'sphinx'
+ # Use our custom theme. For now it only adds Disqus.com support but we may
+ # customize it further later on. The theme is called 'plainbox' and has one
+ # option which controls if disqus is active or not.
+-html_theme = 'plainbox'
++html_theme = 'default'
+
+ # Theme options are theme-specific and customize the look and feel of a theme
+ # further. For a list of options available for each theme, see the
+ # documentation.
+-#
+-# Due to the way disqus works, it's only going to work on
+-# plainbox.readthedocs.org so only use it if building for readthedocs.
+-
+-html_theme_options = {
+- 'show_disqus': 'true' if os.environ.get(
+- "READTHEDOCS", None) == 'True' else ''
+-}
+
+ # Add any paths that contain custom themes here, relative to this directory.
+ html_theme_path = ['_theme']
diff --cc debian/patches/series
index d7ae4d9,0000000..5313c71
mode 100644,000000..100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@@ -1,8 -1,0 +1,3 @@@
+unvendorize
+silence-logging-failure
+documentation-theme
- fix-packaging-metadata-units
- fix-mock-tests
- more-mock-fixes
- fix-proxy-mock-tests
- fix-remaning-py35-issues
diff --cc debian/patches/silence-logging-failure
index 0a2325d,0000000..1970924
mode 100644,000000..100644
--- a/debian/patches/silence-logging-failure
+++ b/debian/patches/silence-logging-failure
@@@ -1,34 -1,0 +1,34 @@@
- From a0e91e9d4c4c31db3575e2a86779d40c01c1f350 Mon Sep 17 00:00:00 2001
++From 975fa3cd1f634456ab164ca24e663e4c8a9def5d Mon Sep 17 00:00:00 2001
+From: Zygmunt Krynicki <zygmunt.krynicki at canonical.com>
+Date: Thu, 8 Oct 2015 10:13:54 -0700
+Subject: Silence setup failure of the logging subsystem
+
+ The logging subsystem has a feature that displays two lines of warnings
+ if the per-user log file cannot be created. This leads to spurious
+ errors when plainbox is invoked from a build environment. Before a
+ better solution is found this warning is disabled as all of the
+ subsequent, relevant, logging messages are display either way.
+Bug-Ubuntu: https://bugs.launchpad.net/checkbox/+bug/1262898
+Forwarded: yes
+Last-Update: 2014-03-18
+
+Patch-Name: silence-logging-failure
+---
+ plainbox/impl/logging.py | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/plainbox/impl/logging.py b/plainbox/impl/logging.py
+index 85fe7dd..6e66da0 100644
+--- a/plainbox/impl/logging.py
++++ b/plainbox/impl/logging.py
+@@ -94,10 +94,6 @@ class LoggingHelper:
+ try:
+ os.makedirs(self.log_dir, exist_ok=True)
+ except OSError as error:
+- logger.warning(
+- _("Unable to create log directory: %s"), self.log_dir)
+- logger.warning(_("Reason: %s. All logs will go to "
+- "console instead."), error)
+ config_dict = self.DEFAULT_CONSOLE_ONLY_CONFIG
+ # Apply the selected configuration. This overrides anything currently
+ # defined for all of the logging subsystem in this python runtime
diff --cc debian/patches/unvendorize
index 9bbe128,0000000..ba877ac
mode 100644,000000..100644
--- a/debian/patches/unvendorize
+++ b/debian/patches/unvendorize
@@@ -1,3303 -1,0 +1,3305 @@@
- From b3d884a32f4678be3aa4728c0fad4a458d11cbc9 Mon Sep 17 00:00:00 2001
++From eba1c34d4b1e87649866b51c39c7e62b7fe6769b Mon Sep 17 00:00:00 2001
+From: Zygmunt Krynicki <zygmunt.krynicki at canonical.com>
+Date: Thu, 8 Oct 2015 10:13:53 -0700
+Subject: Remove vendorized modules
+
+ This patch replaces plainbox.vendor.{mock,funcsigs} with equivalent
+ imports from the standard python3.3 library. Upstream will stop
+ shipping those vendorized modules when support for python3.2 is no
+ longer required.
+Upstream: not-needed
+Last-Update: 2014-03-18
+
+Patch-Name: unvendorize
+---
+ plainbox/vendor/__init__.py | 5 +
+ plainbox/vendor/funcsigs/LICENSE | 13 -
+ plainbox/vendor/funcsigs/__init__.py | 829 +-----------
+ plainbox/vendor/funcsigs/version.py | 1 -
- plainbox/vendor/mock.py | 2396 +---------------------------------
- 5 files changed, 58 insertions(+), 3186 deletions(-)
++ plainbox/vendor/mock.py | 2398 +---------------------------------
++ 5 files changed, 58 insertions(+), 3188 deletions(-)
+ delete mode 100644 plainbox/vendor/funcsigs/LICENSE
+ delete mode 100644 plainbox/vendor/funcsigs/version.py
+
+diff --git a/plainbox/vendor/__init__.py b/plainbox/vendor/__init__.py
+index d4ed746..188c398 100644
+--- a/plainbox/vendor/__init__.py
++++ b/plainbox/vendor/__init__.py
+@@ -25,4 +25,9 @@ This module contains external packages that were vendorized (shipped with a
+ tree of another project) to simplify dependency management. There is no problem
+ with expressing those dependencies at pypi level but it would be annoying to
+ have to first package and introduce them to Ubuntu.
++
++.. note::
++ The ``plainbox.vendor`` package is modified by Debian not to ship a copy of
++ the ``unittest.mock`` and updated ``inspect`` modules that are already
++ available in python3.3
+ """
+diff --git a/plainbox/vendor/funcsigs/LICENSE b/plainbox/vendor/funcsigs/LICENSE
+deleted file mode 100644
+index 3e563d6..0000000
+--- a/plainbox/vendor/funcsigs/LICENSE
++++ /dev/null
+@@ -1,13 +0,0 @@
+-Copyright 2013 Aaron Iles
+-
+-Licensed under the Apache License, Version 2.0 (the "License");
+-you may not use this file except in compliance with the License.
+-You may obtain a copy of the License at
+-
+- http://www.apache.org/licenses/LICENSE-2.0
+-
+-Unless required by applicable law or agreed to in writing, software
+-distributed under the License is distributed on an "AS IS" BASIS,
+-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-See the License for the specific language governing permissions and
+-limitations under the License.
+diff --git a/plainbox/vendor/funcsigs/__init__.py b/plainbox/vendor/funcsigs/__init__.py
+index a49b334..6e2f1fd 100644
+--- a/plainbox/vendor/funcsigs/__init__.py
++++ b/plainbox/vendor/funcsigs/__init__.py
+@@ -1,810 +1,29 @@
+-# Copyright 2001-2013 Python Software Foundation; All Rights Reserved
++# This file is part of Checkbox.
+ #
+-# MODIFICATIONS:
+-# - Vendorized for plainbox packaging needs.
+-# See https://pypi.python.org/pypi/plainbox
+-# - Removed the odict.py module as plainbox only supports python3.2+
+-"""Function signature objects for callables
++# Copyright 2013 Canonical Ltd.
++# Written by:
++# Zygmunt Krynicki <zygmunt.krynicki at canonical.com>
++#
++# Checkbox is free software: you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation, either version 3 of the License, or
++# (at your option) any later version.
++#
++# Checkbox is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
+
+-Back port of Python 3.3's function signature tools from the inspect module,
+-modified to be compatible with Python 2.6, 2.7 and 3.2+.
+ """
+-from __future__ import absolute_import, division, print_function
+-import itertools
+-import functools
+-import re
+-import types
+-
+-from collections import OrderedDict
+-
+-from plainbox.vendor.funcsigs.version import __version__
+-
+-__all__ = ['BoundArguments', 'Parameter', 'Signature', 'signature']
+-
+-
+-_WrapperDescriptor = type(type.__call__)
+-_MethodWrapper = type(all.__call__)
+-
+-_NonUserDefinedCallables = (_WrapperDescriptor,
+- _MethodWrapper,
+- types.BuiltinFunctionType)
+-
+-
+-def formatannotation(annotation, base_module=None):
+- if isinstance(annotation, type):
+- if annotation.__module__ in ('builtins', '__builtin__', base_module):
+- return annotation.__name__
+- return annotation.__module__+'.'+annotation.__name__
+- return repr(annotation)
+-
+-
+-def _get_user_defined_method(cls, method_name, *nested):
+- try:
+- if cls is type:
+- return
+- meth = getattr(cls, method_name)
+- for name in nested:
+- meth = getattr(meth, name, meth)
+- except AttributeError:
+- return
+- else:
+- if not isinstance(meth, _NonUserDefinedCallables):
+- # Once '__signature__' will be added to 'C'-level
+- # callables, this check won't be necessary
+- return meth
+-
+-
+-def signature(obj):
+- '''Get a signature object for the passed callable.'''
+-
+- if not callable(obj):
+- raise TypeError('{0!r} is not a callable object'.format(obj))
+-
+- if isinstance(obj, types.MethodType):
+- # In this case we skip the first parameter of the underlying
+- # function (usually `self` or `cls`).
+- sig = signature(obj.__func__)
+- return sig.replace(parameters=tuple(sig.parameters.values())[1:])
+-
+- try:
+- sig = obj.__signature__
+- except AttributeError:
+- pass
+- else:
+- if sig is not None:
+- return sig
+-
+- try:
+- # Was this function wrapped by a decorator?
+- wrapped = obj.__wrapped__
+- except AttributeError:
+- pass
+- else:
+- return signature(wrapped)
+-
+- if isinstance(obj, types.FunctionType):
+- return Signature.from_function(obj)
+-
+- if isinstance(obj, functools.partial):
+- sig = signature(obj.func)
+-
+- new_params = OrderedDict(sig.parameters.items())
+-
+- partial_args = obj.args or ()
+- partial_keywords = obj.keywords or {}
+- try:
+- ba = sig.bind_partial(*partial_args, **partial_keywords)
+- except TypeError as ex:
+- msg = 'partial object {0!r} has incorrect arguments'.format(obj)
+- raise ValueError(msg)
+-
+- for arg_name, arg_value in ba.arguments.items():
+- param = new_params[arg_name]
+- if arg_name in partial_keywords:
+- # We set a new default value, because the following code
+- # is correct:
+- #
+- # >>> def foo(a): print(a)
+- # >>> print(partial(partial(foo, a=10), a=20)())
+- # 20
+- # >>> print(partial(partial(foo, a=10), a=20)(a=30))
+- # 30
+- #
+- # So, with 'partial' objects, passing a keyword argument is
+- # like setting a new default value for the corresponding
+- # parameter
+- #
+- # We also mark this parameter with '_partial_kwarg'
+- # flag. Later, in '_bind', the 'default' value of this
+- # parameter will be added to 'kwargs', to simulate
+- # the 'functools.partial' real call.
+- new_params[arg_name] = param.replace(default=arg_value,
+- _partial_kwarg=True)
+-
+- elif (param.kind not in (_VAR_KEYWORD, _VAR_POSITIONAL) and
+- not param._partial_kwarg):
+- new_params.pop(arg_name)
+-
+- return sig.replace(parameters=new_params.values())
+-
+- sig = None
+- if isinstance(obj, type):
+- # obj is a class or a metaclass
+-
+- # First, let's see if it has an overloaded __call__ defined
+- # in its metaclass
+- call = _get_user_defined_method(type(obj), '__call__')
+- if call is not None:
+- sig = signature(call)
+- else:
+- # Now we check if the 'obj' class has a '__new__' method
+- new = _get_user_defined_method(obj, '__new__')
+- if new is not None:
+- sig = signature(new)
+- else:
+- # Finally, we should have at least __init__ implemented
+- init = _get_user_defined_method(obj, '__init__')
+- if init is not None:
+- sig = signature(init)
+- elif not isinstance(obj, _NonUserDefinedCallables):
+- # An object with __call__
+- # We also check that the 'obj' is not an instance of
+- # _WrapperDescriptor or _MethodWrapper to avoid
+- # infinite recursion (and even potential segfault)
+- call = _get_user_defined_method(type(obj), '__call__', 'im_func')
+- if call is not None:
+- sig = signature(call)
+-
+- if sig is not None:
+- # For classes and objects we skip the first parameter of their
+- # __call__, __new__, or __init__ methods
+- return sig.replace(parameters=tuple(sig.parameters.values())[1:])
+-
+- if isinstance(obj, types.BuiltinFunctionType):
+- # Raise a nicer error message for builtins
+- msg = 'no signature found for builtin function {0!r}'.format(obj)
+- raise ValueError(msg)
+-
+- raise ValueError('callable {0!r} is not supported by signature'.format(obj))
+-
+-
+-class _void(object):
+- '''A private marker - used in Parameter & Signature'''
+-
+-
+-class _empty(object):
+- pass
+-
+-
+-class _ParameterKind(int):
+- def __new__(self, *args, **kwargs):
+- obj = int.__new__(self, *args)
+- obj._name = kwargs['name']
+- return obj
+-
+- def __str__(self):
+- return self._name
+-
+- def __repr__(self):
+- return '<_ParameterKind: {0!r}>'.format(self._name)
+-
+-
+-_POSITIONAL_ONLY = _ParameterKind(0, name='POSITIONAL_ONLY')
+-_POSITIONAL_OR_KEYWORD = _ParameterKind(1, name='POSITIONAL_OR_KEYWORD')
+-_VAR_POSITIONAL = _ParameterKind(2, name='VAR_POSITIONAL')
+-_KEYWORD_ONLY = _ParameterKind(3, name='KEYWORD_ONLY')
+-_VAR_KEYWORD = _ParameterKind(4, name='VAR_KEYWORD')
+-
+-
+-class Parameter(object):
+- '''Represents a parameter in a function signature.
+-
+- Has the following public attributes:
+-
+- * name : str
+- The name of the parameter as a string.
+- * default : object
+- The default value for the parameter if specified. If the
+- parameter has no default value, this attribute is not set.
+- * annotation
+- The annotation for the parameter if specified. If the
+- parameter has no annotation, this attribute is not set.
+- * kind : str
+- Describes how argument values are bound to the parameter.
+- Possible values: `Parameter.POSITIONAL_ONLY`,
+- `Parameter.POSITIONAL_OR_KEYWORD`, `Parameter.VAR_POSITIONAL`,
+- `Parameter.KEYWORD_ONLY`, `Parameter.VAR_KEYWORD`.
+- '''
+-
+- __slots__ = ('_name', '_kind', '_default', '_annotation', '_partial_kwarg')
+-
+- POSITIONAL_ONLY = _POSITIONAL_ONLY
+- POSITIONAL_OR_KEYWORD = _POSITIONAL_OR_KEYWORD
+- VAR_POSITIONAL = _VAR_POSITIONAL
+- KEYWORD_ONLY = _KEYWORD_ONLY
+- VAR_KEYWORD = _VAR_KEYWORD
+-
+- empty = _empty
+-
+- def __init__(self, name, kind, default=_empty, annotation=_empty,
+- _partial_kwarg=False):
+-
+- if kind not in (_POSITIONAL_ONLY, _POSITIONAL_OR_KEYWORD,
+- _VAR_POSITIONAL, _KEYWORD_ONLY, _VAR_KEYWORD):
+- raise ValueError("invalid value for 'Parameter.kind' attribute")
+- self._kind = kind
+-
+- if default is not _empty:
+- if kind in (_VAR_POSITIONAL, _VAR_KEYWORD):
+- msg = '{0} parameters cannot have default values'.format(kind)
+- raise ValueError(msg)
+- self._default = default
+- self._annotation = annotation
+-
+- if name is None:
+- if kind != _POSITIONAL_ONLY:
+- raise ValueError("None is not a valid name for a "
+- "non-positional-only parameter")
+- self._name = name
+- else:
+- name = str(name)
+- if kind != _POSITIONAL_ONLY and not re.match(r'[a-z_]\w*$', name, re.I):
+- msg = '{0!r} is not a valid parameter name'.format(name)
+- raise ValueError(msg)
+- self._name = name
+-
+- self._partial_kwarg = _partial_kwarg
+-
+- @property
+- def name(self):
+- return self._name
+-
+- @property
+- def default(self):
+- return self._default
+-
+- @property
+- def annotation(self):
+- return self._annotation
+-
+- @property
+- def kind(self):
+- return self._kind
+-
+- def replace(self, name=_void, kind=_void, annotation=_void,
+- default=_void, _partial_kwarg=_void):
+- '''Creates a customized copy of the Parameter.'''
+-
+- if name is _void:
+- name = self._name
+-
+- if kind is _void:
+- kind = self._kind
+-
+- if annotation is _void:
+- annotation = self._annotation
+-
+- if default is _void:
+- default = self._default
+-
+- if _partial_kwarg is _void:
+- _partial_kwarg = self._partial_kwarg
+-
+- return type(self)(name, kind, default=default, annotation=annotation,
+- _partial_kwarg=_partial_kwarg)
+-
+- def __str__(self):
+- kind = self.kind
+-
+- formatted = self._name
+- if kind == _POSITIONAL_ONLY:
+- if formatted is None:
+- formatted = ''
+- formatted = '<{0}>'.format(formatted)
+-
+- # Add annotation and default value
+- if self._annotation is not _empty:
+- formatted = '{0}:{1}'.format(formatted,
+- formatannotation(self._annotation))
+-
+- if self._default is not _empty:
+- formatted = '{0}={1}'.format(formatted, repr(self._default))
+-
+- if kind == _VAR_POSITIONAL:
+- formatted = '*' + formatted
+- elif kind == _VAR_KEYWORD:
+- formatted = '**' + formatted
+-
+- return formatted
+-
+- def __repr__(self):
+- return '<{0} at {1:#x} {2!r}>'.format(self.__class__.__name__,
+- id(self), self.name)
+-
+- def __hash__(self):
+- msg = "unhashable type: '{0}'".format(self.__class__.__name__)
+- raise TypeError(msg)
+-
+- def __eq__(self, other):
+- return (issubclass(other.__class__, Parameter) and
+- self._name == other._name and
+- self._kind == other._kind and
+- self._default == other._default and
+- self._annotation == other._annotation)
+-
+- def __ne__(self, other):
+- return not self.__eq__(other)
+-
++:mod:`plainbox.vendor.funcsigs` -- vendorized funcsigs module
++=============================================================
+
+-class BoundArguments(object):
+- '''Result of `Signature.bind` call. Holds the mapping of arguments
+- to the function's parameters.
+-
+- Has the following public attributes:
+-
+- * arguments : OrderedDict
+- An ordered mutable mapping of parameters' names to arguments' values.
+- Does not contain arguments' default values.
+- * signature : Signature
+- The Signature object that created this instance.
+- * args : tuple
+- Tuple of positional arguments values.
+- * kwargs : dict
+- Dict of keyword arguments values.
+- '''
+-
+- def __init__(self, signature, arguments):
+- self.arguments = arguments
+- self._signature = signature
+-
+- @property
+- def signature(self):
+- return self._signature
+-
+- @property
+- def args(self):
+- args = []
+- for param_name, param in self._signature.parameters.items():
+- if (param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY) or
+- param._partial_kwarg):
+- # Keyword arguments mapped by 'functools.partial'
+- # (Parameter._partial_kwarg is True) are mapped
+- # in 'BoundArguments.kwargs', along with VAR_KEYWORD &
+- # KEYWORD_ONLY
+- break
+-
+- try:
+- arg = self.arguments[param_name]
+- except KeyError:
+- # We're done here. Other arguments
+- # will be mapped in 'BoundArguments.kwargs'
+- break
+- else:
+- if param.kind == _VAR_POSITIONAL:
+- # *args
+- args.extend(arg)
+- else:
+- # plain argument
+- args.append(arg)
+-
+- return tuple(args)
+-
+- @property
+- def kwargs(self):
+- kwargs = {}
+- kwargs_started = False
+- for param_name, param in self._signature.parameters.items():
+- if not kwargs_started:
+- if (param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY) or
+- param._partial_kwarg):
+- kwargs_started = True
+- else:
+- if param_name not in self.arguments:
+- kwargs_started = True
+- continue
+-
+- if not kwargs_started:
+- continue
+-
+- try:
+- arg = self.arguments[param_name]
+- except KeyError:
+- pass
+- else:
+- if param.kind == _VAR_KEYWORD:
+- # **kwargs
+- kwargs.update(arg)
+- else:
+- # plain keyword argument
+- kwargs[param_name] = arg
+-
+- return kwargs
+-
+- def __hash__(self):
+- msg = "unhashable type: '{0}'".format(self.__class__.__name__)
+- raise TypeError(msg)
+-
+- def __eq__(self, other):
+- return (issubclass(other.__class__, BoundArguments) and
+- self.signature == other.signature and
+- self.arguments == other.arguments)
+-
+- def __ne__(self, other):
+- return not self.__eq__(other)
+-
+-
+-class Signature(object):
+- '''A Signature object represents the overall signature of a function.
+- It stores a Parameter object for each parameter accepted by the
+- function, as well as information specific to the function itself.
+-
+- A Signature object has the following public attributes and methods:
+-
+- * parameters : OrderedDict
+- An ordered mapping of parameters' names to the corresponding
+- Parameter objects (keyword-only arguments are in the same order
+- as listed in `code.co_varnames`).
+- * return_annotation : object
+- The annotation for the return type of the function if specified.
+- If the function has no annotation for its return type, this
+- attribute is not set.
+- * bind(*args, **kwargs) -> BoundArguments
+- Creates a mapping from positional and keyword arguments to
+- parameters.
+- * bind_partial(*args, **kwargs) -> BoundArguments
+- Creates a partial mapping from positional and keyword arguments
+- to parameters (simulating 'functools.partial' behavior.)
+- '''
+-
+- __slots__ = ('_return_annotation', '_parameters')
+-
+- _parameter_cls = Parameter
+- _bound_arguments_cls = BoundArguments
+-
+- empty = _empty
+-
+- def __init__(self, parameters=None, return_annotation=_empty,
+- __validate_parameters__=True):
+- '''Constructs Signature from the given list of Parameter
+- objects and 'return_annotation'. All arguments are optional.
+- '''
+-
+- if parameters is None:
+- params = OrderedDict()
+- else:
+- if __validate_parameters__:
+- params = OrderedDict()
+- top_kind = _POSITIONAL_ONLY
+-
+- for idx, param in enumerate(parameters):
+- kind = param.kind
+- if kind < top_kind:
+- msg = 'wrong parameter order: {0} before {1}'
+- msg = msg.format(top_kind, param.kind)
+- raise ValueError(msg)
+- else:
+- top_kind = kind
+-
+- name = param.name
+- if name is None:
+- name = str(idx)
+- param = param.replace(name=name)
+-
+- if name in params:
+- msg = 'duplicate parameter name: {0!r}'.format(name)
+- raise ValueError(msg)
+- params[name] = param
+- else:
+- params = OrderedDict(((param.name, param)
+- for param in parameters))
+-
+- self._parameters = params
+- self._return_annotation = return_annotation
+-
+- @classmethod
+- def from_function(cls, func):
+- '''Constructs Signature for the given python function'''
+-
+- if not isinstance(func, types.FunctionType):
+- raise TypeError('{0!r} is not a Python function'.format(func))
+-
+- Parameter = cls._parameter_cls
+-
+- # Parameter information.
+- func_code = func.__code__
+- pos_count = func_code.co_argcount
+- arg_names = func_code.co_varnames
+- positional = tuple(arg_names[:pos_count])
+- keyword_only_count = getattr(func_code, 'co_kwonlyargcount', 0)
+- keyword_only = arg_names[pos_count:(pos_count + keyword_only_count)]
+- annotations = getattr(func, '__annotations__', {})
+- defaults = func.__defaults__
+- kwdefaults = getattr(func, '__kwdefaults__', None)
+-
+- if defaults:
+- pos_default_count = len(defaults)
+- else:
+- pos_default_count = 0
+-
+- parameters = []
+-
+- # Non-keyword-only parameters w/o defaults.
+- non_default_count = pos_count - pos_default_count
+- for name in positional[:non_default_count]:
+- annotation = annotations.get(name, _empty)
+- parameters.append(Parameter(name, annotation=annotation,
+- kind=_POSITIONAL_OR_KEYWORD))
+-
+- # ... w/ defaults.
+- for offset, name in enumerate(positional[non_default_count:]):
+- annotation = annotations.get(name, _empty)
+- parameters.append(Parameter(name, annotation=annotation,
+- kind=_POSITIONAL_OR_KEYWORD,
+- default=defaults[offset]))
+-
+- # *args
+- if func_code.co_flags & 0x04:
+- name = arg_names[pos_count + keyword_only_count]
+- annotation = annotations.get(name, _empty)
+- parameters.append(Parameter(name, annotation=annotation,
+- kind=_VAR_POSITIONAL))
+-
+- # Keyword-only parameters.
+- for name in keyword_only:
+- default = _empty
+- if kwdefaults is not None:
+- default = kwdefaults.get(name, _empty)
+-
+- annotation = annotations.get(name, _empty)
+- parameters.append(Parameter(name, annotation=annotation,
+- kind=_KEYWORD_ONLY,
+- default=default))
+- # **kwargs
+- if func_code.co_flags & 0x08:
+- index = pos_count + keyword_only_count
+- if func_code.co_flags & 0x04:
+- index += 1
+-
+- name = arg_names[index]
+- annotation = annotations.get(name, _empty)
+- parameters.append(Parameter(name, annotation=annotation,
+- kind=_VAR_KEYWORD))
+-
+- return cls(parameters,
+- return_annotation=annotations.get('return', _empty),
+- __validate_parameters__=False)
+-
+- @property
+- def parameters(self):
+- try:
+- return types.MappingProxyType(self._parameters)
+- except AttributeError:
+- return OrderedDict(self._parameters.items())
+-
+- @property
+- def return_annotation(self):
+- return self._return_annotation
+-
+- def replace(self, parameters=_void, return_annotation=_void):
+- '''Creates a customized copy of the Signature.
+- Pass 'parameters' and/or 'return_annotation' arguments
+- to override them in the new copy.
+- '''
+-
+- if parameters is _void:
+- parameters = self.parameters.values()
+-
+- if return_annotation is _void:
+- return_annotation = self._return_annotation
+-
+- return type(self)(parameters,
+- return_annotation=return_annotation)
+-
+- def __hash__(self):
+- msg = "unhashable type: '{0}'".format(self.__class__.__name__)
+- raise TypeError(msg)
+-
+- def __eq__(self, other):
+- if (not issubclass(type(other), Signature) or
+- self.return_annotation != other.return_annotation or
+- len(self.parameters) != len(other.parameters)):
+- return False
+-
+- other_positions = dict((param, idx)
+- for idx, param in enumerate(other.parameters.keys()))
+-
+- for idx, (param_name, param) in enumerate(self.parameters.items()):
+- if param.kind == _KEYWORD_ONLY:
+- try:
+- other_param = other.parameters[param_name]
+- except KeyError:
+- return False
+- else:
+- if param != other_param:
+- return False
+- else:
+- try:
+- other_idx = other_positions[param_name]
+- except KeyError:
+- return False
+- else:
+- if (idx != other_idx or
+- param != other.parameters[param_name]):
+- return False
+-
+- return True
+-
+- def __ne__(self, other):
+- return not self.__eq__(other)
+-
+- def _bind(self, args, kwargs, partial=False):
+- '''Private method. Don't use directly.'''
+-
+- arguments = OrderedDict()
+-
+- parameters = iter(self.parameters.values())
+- parameters_ex = ()
+- arg_vals = iter(args)
+-
+- if partial:
+- # Support for binding arguments to 'functools.partial' objects.
+- # See 'functools.partial' case in 'signature()' implementation
+- # for details.
+- for param_name, param in self.parameters.items():
+- if (param._partial_kwarg and param_name not in kwargs):
+- # Simulating 'functools.partial' behavior
+- kwargs[param_name] = param.default
+-
+- while True:
+- # Let's iterate through the positional arguments and corresponding
+- # parameters
+- try:
+- arg_val = next(arg_vals)
... 2565 lines suppressed ...
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/plainbox.git
More information about the Python-modules-commits
mailing list