[Python-modules-commits] [plainbox] 06/07: merge patched into master

Sylvain Pineau spineau-guest at moszumanska.debian.org
Tue Jan 5 16:48:58 UTC 2016


This is an automated email from the git hooks/post-receive script.

spineau-guest pushed a commit to branch master
in repository plainbox.

commit 9223813d5a9048c99c81dcab231acd8a9486e4ad
Merge: 9eff702 4abfe52
Author: Sylvain Pineau <sylvain.pineau at canonical.com>
Date:   Tue Jan 5 17:25:14 2016 +0100

    merge patched into master

 PKG-INFO                                           |   2 +-
 debian/.git-dpm                                    |   6 +-
 debian/patches/documentation-theme                 |   2 +-
 debian/patches/silence-logging-failure             |   2 +-
 debian/patches/unvendorize                         |   2 +-
 docs/author/index.rst                              |   1 +
 docs/author/qml-job-tutorial.rst                   | 369 +++++++++++++++++++++
 docs/changelog.rst                                 |  10 +
 docs/manpages/plainbox-job-units.rst               |   6 +
 docs/manpages/plainbox-template-units.rst          |   3 +
 plainbox.egg-info/PKG-INFO                         |   2 +-
 plainbox.egg-info/SOURCES.txt                      |   2 +
 plainbox.egg-info/entry_points.txt                 |  42 +--
 plainbox/__init__.py                               |   2 +-
 .../data/plainbox-qml-modules/Plainbox/QmlJob.qml  |   1 +
 plainbox/impl/commands/cmd_startprovider.py        |   8 +-
 plainbox/impl/commands/inv_run.py                  |   8 +
 plainbox/impl/commands/inv_startprovider.py        |  70 ++--
 plainbox/impl/exporter/__init__.py                 |  12 +-
 plainbox/impl/providers/categories/po/es.po        |   4 +-
 plainbox/impl/providers/categories/po/fr.po        |  10 +-
 plainbox/impl/providers/categories/po/pl.po        |   4 +-
 plainbox/impl/providers/categories/po/ug.po        |   4 +-
 plainbox/impl/providers/categories/po/zh_TW.po     |   4 +-
 plainbox/impl/providers/manifest/po/pl.po          |   4 +-
 plainbox/impl/providers/manifest/po/zh_TW.po       |   4 +-
 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 +-
 plainbox/impl/providers/stubbox/po/ug.po           |   4 +-
 plainbox/impl/runner.py                            |   8 +-
 plainbox/impl/secure/providers/v1.py               |  36 +-
 plainbox/impl/session/assistant.py                 | 169 +++++++++-
 plainbox/impl/session/restart.py                   | 134 ++++++++
 plainbox/impl/unit/job.py                          |  32 +-
 plainbox/impl/unit/template.py                     |  71 ++--
 plainbox/impl/unit/test_job.py                     |  11 +
 plainbox/impl/unit/testplan.py                     |   1 +
 plainbox/qml_shell/qml_shell.qml                   |   7 +-
 po/de.po                                           |   4 +-
 po/en_AU.po                                        |   4 +-
 po/en_CA.po                                        |   4 +-
 po/en_GB.po                                        |   4 +-
 po/es.po                                           |   4 +-
 po/fr.po                                           |  16 +-
 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.cfg                                          |   2 +-
 setup.py                                           |   2 +-
 55 files changed, 946 insertions(+), 195 deletions(-)

diff --cc debian/.git-dpm
index 15d4187,0000000..a520e47
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
- 0d3fade51baa6f0534eaa3f7d78fae92ace3b2c9
- 0d3fade51baa6f0534eaa3f7d78fae92ace3b2c9
- fffe7d6aae9e2bea94bcf7f945a9c670aa344af1
++4abfe5275b251630c667d91af670b029cecc498c
++4abfe5275b251630c667d91af670b029cecc498c
++b8c5efe5af9895823ec50b8e09a9c82302872bb4
 +b8c5efe5af9895823ec50b8e09a9c82302872bb4
 +plainbox_0.25.orig.tar.gz
 +bf641a521adddb2d739ae55a92b38d07edadd2e9
 +1461932
 +debianTag="debian/%e%v"
 +patchedTag="patched/%e%v"
 +upstreamTag="upstream/%e%u"
diff --cc debian/patches/documentation-theme
index 0e4fdd2,0000000..11de43c
mode 100644,000000..100644
--- a/debian/patches/documentation-theme
+++ b/debian/patches/documentation-theme
@@@ -1,42 -1,0 +1,42 @@@
- From 0d3fade51baa6f0534eaa3f7d78fae92ace3b2c9 Mon Sep 17 00:00:00 2001
++From 4abfe5275b251630c667d91af670b029cecc498c 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/silence-logging-failure
index 1970924,0000000..d6cf0d9
mode 100644,000000..100644
--- a/debian/patches/silence-logging-failure
+++ b/debian/patches/silence-logging-failure
@@@ -1,34 -1,0 +1,34 @@@
- From 975fa3cd1f634456ab164ca24e663e4c8a9def5d Mon Sep 17 00:00:00 2001
++From ce9cc78acb029cd556939b3a32fcbc6add9e01d6 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 ba877ac,0000000..b68ef11
mode 100644,000000..100644
--- a/debian/patches/unvendorize
+++ b/debian/patches/unvendorize
@@@ -1,3305 -1,0 +1,3305 @@@
- From eba1c34d4b1e87649866b51c39c7e62b7fe6769b Mon Sep 17 00:00:00 2001
++From a282dcda0bbd839caeb022e95abda31b275c0103 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              | 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)
 +-            except StopIteration:
 +-                # No more positional arguments
 +-                try:
 +-                    param = next(parameters)
 +-                except StopIteration:
 +-                    # No more parameters. That's it. Just need to check that
 +-                    # we have no `kwargs` after this while loop
 +-                    break
 +-                else:
 +-                    if param.kind == _VAR_POSITIONAL:
 +-                        # That's OK, just empty *args.  Let's start parsing
 +-                        # kwargs
 +-                        break
 +-                    elif param.name in kwargs:
 +-                        if param.kind == _POSITIONAL_ONLY:
 +-                            msg = '{arg!r} parameter is positional only, ' \
 +-                                  'but was passed as a keyword'
 +-                            msg = msg.format(arg=param.name)
 +-                            raise TypeError(msg)
 +-                        parameters_ex = (param,)
 +-                        break
 +-                    elif (param.kind == _VAR_KEYWORD or
 +-                                                param.default is not _empty):
 +-                        # That's fine too - we have a default value for this
 +-                        # parameter.  So, lets start parsing `kwargs`, starting
 +-                        # with the current parameter
 +-                        parameters_ex = (param,)
 +-                        break
 +-                    else:
 +-                        if partial:
 +-                            parameters_ex = (param,)
 +-                            break
 +-                        else:
 +-                            msg = '{arg!r} parameter lacking default value'
 +-                            msg = msg.format(arg=param.name)
 +-                            raise TypeError(msg)
 +-            else:
 +-                # We have a positional argument to process
 +-                try:
 +-                    param = next(parameters)
 +-                except StopIteration:
 +-                    raise TypeError('too many positional arguments')
 +-                else:
 +-                    if param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY):
 +-                        # Looks like we have no parameter for this positional
 +-                        # argument
 +-                        raise TypeError('too many positional arguments')
 +-
 +-                    if param.kind == _VAR_POSITIONAL:
 +-                        # We have an '*args'-like argument, let's fill it with
 +-                        # all positional arguments we have left and move on to
 +-                        # the next phase
 +-                        values = [arg_val]
 +-                        values.extend(arg_vals)
 +-                        arguments[param.name] = tuple(values)
 +-                        break
 +-
 +-                    if param.name in kwargs:
 +-                        raise TypeError('multiple values for argument '
 +-                                        '{arg!r}'.format(arg=param.name))
 +-
 +-                    arguments[param.name] = arg_val
 +-
 +-        # Now, we iterate through the remaining parameters to process
 +-        # keyword arguments
 +-        kwargs_param = None
 +-        for param in itertools.chain(parameters_ex, parameters):
 +-            if param.kind == _POSITIONAL_ONLY:
 +-                # This should never happen in case of a properly built
 +-                # Signature object (but let's have this check here
 +-                # to ensure correct behaviour just in case)
 +-                raise TypeError('{arg!r} parameter is positional only, '
 +-                                'but was passed as a keyword'. \
 +-                                format(arg=param.name))
 +-
 +-            if param.kind == _VAR_KEYWORD:
 +-                # Memorize that we have a '**kwargs'-like parameter
... 2486 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