[Python-modules-commits] [python-logfury] 01/03: import python-logfury_0.1.2.orig.tar.gz

Ondrej Koblizek kobla-guest at moszumanska.debian.org
Tue Sep 12 12:03:05 UTC 2017


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

kobla-guest pushed a commit to branch master
in repository python-logfury.

commit 031787924ac19871c5c8452b044e0f9e88eeb847
Author: Ondřej Kobližek <ondrej.koblizek at firma.seznam.cz>
Date:   Tue Sep 12 12:58:35 2017 +0200

    import python-logfury_0.1.2.orig.tar.gz
---
 .gitignore                      |   6 +
 .travis.yml                     | 246 ++++++++++++++++++++++++++++++++++++++++
 LICENSE.txt                     |  29 +++++
 MANIFEST.in                     |   6 +
 README.rst                      | 139 +++++++++++++++++++++++
 appveyor.yml                    | 120 ++++++++++++++++++++
 ci/appveyor/install.ps1         | 229 +++++++++++++++++++++++++++++++++++++
 ci/appveyor/run_with_env.cmd    |  88 ++++++++++++++
 requirements-setup.txt          |   1 +
 requirements-test.txt           |   5 +
 requirements.txt                |   2 +
 run-unit-tests.sh               |  16 +++
 setup.cfg                       |  29 +++++
 setup.py                        |  96 ++++++++++++++++
 src/logfury/__init__.py         |   0
 src/logfury/v0_1/__init__.py    |  11 ++
 src/logfury/v0_1/meta.py        | 116 +++++++++++++++++++
 src/logfury/v0_1/trace_call.py  |  86 ++++++++++++++
 src/logfury/v0_1/tuning.py      |  27 +++++
 src/logfury/v0_1/utils.py       |  23 ++++
 test/__init__.py                |   0
 test/v0_1/__init__.py           |   0
 test/v0_1/test_abstract_meta.py |  88 ++++++++++++++
 test/v0_1/test_base.py          |  28 +++++
 test/v0_1/test_meta.py          | 176 ++++++++++++++++++++++++++++
 test/v0_1/test_trace_call.py    |  70 ++++++++++++
 26 files changed, 1637 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..b3075c7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+*.pyc
+.idea
+*.egg-info
+build
+dist
+.eggs/
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..4a707bb
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,246 @@
+notifications:
+  slack:
+    secure: naix0bLa/50X1HIXwLtkUC/YH9Iurs18eVy/mhfrfD2YFd7QjUGRz24SQU2r0ev0Qh3CUaH9MJoAUbu4oaXGB1VXzZkV7OIGimZe4gcWJuzItnVhyrQJKpcpC7yafdl7uDA0wjWs2BYRHCJ3c35Gv4SmihuGVXUS3WFsL0i3VyXno8xPOfmyuUT7GZWW80uMnV6eOyhbPCBb17CchI8x7owdXVf3drxCrrjoP3oNbbpByTsDC+hnCmVQbhkZAqS63gZRj5LT6gNh4ZA/qenaGkhzfHFRSUW1+H16ZzYcSSl0PfAQBQYrc7agUjI987PBHdOv6BJS+pKmZ0MvaDwbnzhHZZdb8LXqM5K0zAhPiZMPL2MTq7+eNOBdRuTlbWs3OZfbY1cnewSpMmUGfwrIjVnLtvfhfJXVaFbpIfvNc6eafgmHas23A05f4Gk/IcRLvqICw+GQg76ADUpWubQal7gECTGbeivO [...]
+
+language: python
+
+python:
+  - 2.6
+  - 2.7
+  - 3.3
+  - 3.4
+  - 3.5
+  - nightly
+  - pypy
+  - pypy3
+
+branches:
+  # https://github.com/travis-ci/travis-ci/issues/1147#issuecomment-160820262
+  # this reduces workload on Travis if there are many pushes in a short time.
+  # It does not have a drawback if:
+  # - pull requests are used for review
+  # - branches that we care about (not work-in-progress) are listed below
+  only:
+    - master
+
+matrix:
+  include:
+    # Source Code Analysis is slow.  We just run it once on
+    # Python 2 and once on Python 3.
+    - python: 2.7
+      env: MODE=SCA
+    - python: 3.5
+      env: MODE=SCA
+
+    # Travis CI doesn't support OSX python builds officially,
+    # but that won't stop us
+    - python: 2.7
+      os: osx
+      language: generic
+      env: OS_X_PYTHON_VERSION=python
+    - python: 3.5
+      os: osx
+      language: generic
+      env: OS_X_PYTHON_VERSION=python3
+
+    # jython
+    - python: 2.7
+      env: JYTHON=true
+
+    # pypy
+    - python: pypy
+      env: PYPY_VERSION=pypy-4.0.1
+    - python: pypy
+      env: PYPY_VERSION=pypy-5.1
+    - python: pypy3
+      env: PYPY_VERSION=pypy3-2.4.0
+
+    # coverage
+    - python: 3.5
+      env: MODE=coverage
+
+cache:
+  - pip
+  - directories:
+    - $HOME/.eggs
+    # custom pypy versions
+    - $HOME/.pyenv
+    # jython
+    - $HOME/.virtualenv/jython
+    - $HOME/jython
+    - $HOME/jython-pip
+    # OS X
+    - $HOME/.virtualenv/osx-python
+    - $HOME/.virtualenv/osx-python3
+    #- /usr/local/Cellar/python  # see comment in the install script
+    #- /usr/local/Cellar/python3
+before_install:
+  - uname -a
+  - if [[ "$TRAVIS_OS_NAME" != "osx" ]]; then lsb_release -a; fi
+  - |
+        # install python on OS X
+        if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
+            if [ -n 'ALWAYS TRUE!' -o ! -d "/usr/local/Cellar/$OS_X_PYTHON_VERSION" ]; then
+                # unfortunately caching /usr/local/Cellar/$OS_X_PYTHON_VERSION is not enough.
+                # brew does some kind of side effect which registers the binary in the system
+                # or something. The resulting error error is:
+                #
+                # dyld: Library not loaded: @executable_path/../.Python
+                #
+                # Due to lack of information on the web as well as the lack of appropriate
+                # environment it is very hard to debug out how to properly cache the python
+                # installation on OS X.
+                #
+                # Therefore caching is temporarily disabled until someone figures it out.
+                # Typically brew update and installation of python takes 3 to 4 minutes.
+                brew update
+                brew install "$OS_X_PYTHON_VERSION"
+            else
+                echo 'skip install'
+            fi
+            if [ ! -e "$HOME/.virtualenv/osx-$OS_X_PYTHON_VERSION/bin/activate" ]; then
+                virtualenv -p "$OS_X_PYTHON_VERSION" "$HOME/.virtualenv/osx-$OS_X_PYTHON_VERSION"
+            else
+                echo 'skip virtualenv'
+            fi
+            source "$HOME/.virtualenv/osx-$OS_X_PYTHON_VERSION/bin/activate"
+        else
+            echo skip
+        fi
+  - |
+        # get jython
+        if [ -n "$JYTHON" ]; then
+            if [ ! -f "$HOME/.virtualenv/jython/bin/activate" ]; then
+                wget http://search.maven.org/remotecontent?filepath=org/python/jython-installer/2.7.1b3/jython-installer-2.7.1b3.jar -O jython-installer-2.7.1b3.jar
+                java -jar jython-installer-2.7.1b3.jar --silent --directory "$HOME/jython"
+            else
+                echo skip
+            fi
+            # install a custom version of pip, as standard pip doesn't work on jython (https://github.com/jythontools/pip/commits/develop)
+            if [ ! -d "$HOME/jython-pip" ]; then
+                mkdir ~/jython-pip
+            else
+                echo skip
+            fi
+            if [ ! -f ~/jython-pip/pip-7.1.2-py2.py3-none-any.whl ]; then
+                wget https://pypi.python.org/packages/py2.py3/p/pip/pip-7.1.2-py2.py3-none-any.whl -O ~/jython-pip/pip-7.1.2-py2.py3-none-any.whl
+            else
+                echo skip
+            fi
+            # create jython virtualenv
+            if [ ! -f "$HOME/.virtualenv/jython/bin/activate" ]; then
+                virtualenv --system-site-packages --extra-search-dir="$HOME/jython-pip" -p "$HOME/jython/bin/jython" "$HOME/.virtualenv/jython"
+            else
+                echo skip
+            fi
+            source "$HOME/.virtualenv/jython/bin/activate"
+        else
+            echo skip
+        fi
+  - |
+        # upgrade pypy (to a version that works with Cryptography 1.0)
+        if [ -z "$PYPY_VERSION" ]; then
+            echo 'this is a build of native Travis pypy/pypy3, not the upgraded one'
+        elif [[ "$TRAVIS_PYTHON_VERSION" == "pypy" ]] || [[ "$TRAVIS_PYTHON_VERSION" == "pypy3" ]]; then
+            export PYENV_ROOT="$HOME/.pyenv"
+            if [ -f "$PYENV_ROOT/bin/pyenv" ]; then
+                pushd "$PYENV_ROOT" && git pull && popd
+            else
+                rm -rf "$PYENV_ROOT" && git clone --depth 1 https://github.com/yyuu/pyenv.git "$PYENV_ROOT"
+            fi
+            echo "PYPY_VERSION=$PYPY_VERSION"
+            "$PYENV_ROOT/bin/pyenv" install --skip-existing "$PYPY_VERSION"
+            if [ ! -e "$HOME/.virtualenv/$PYPY_VERSION/bin/activate" ]; then
+                virtualenv -p "$PYENV_ROOT/versions/$PYPY_VERSION/bin/python" "$HOME/.virtualenv/$PYPY_VERSION"
+            fi
+            source "$HOME/.virtualenv/$PYPY_VERSION/bin/activate"
+        else
+            echo skip
+        fi
+  - virtualenv --version
+  - python --version
+
+install:
+  - |
+        # install PyYAML on Jython manually before pip tries to do it and fails
+        if [ -n "$JYTHON" -a ! -f "$HOME/.virtualenv/jython/Lib/site-packages/PyYAML-3.11-py2.7.egg-info" ] &&
+                egrep '^pyyaml((>|<|=).+)?$' requirements*.txt -q; then
+            wget https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz
+            tar -zxf PyYAML-3.11.tar.gz
+            cd PyYAML-3.11/
+            wget http://pyyaml.org/raw-attachment/ticket/163/jython-setup.patch
+            patch < jython-setup.patch
+            python setup.py install
+            cd -
+        fi
+
+  # installing regex on jython fails (jython can't compile the native extension), this awk filter prevents it
+  - cat requirements*.txt | awk \"${JYTHON:-False}'" == "True" && /^regex/ || ! /^regex/' | xargs pip install
+
+  - |
+        # coverage has additional requirements
+        if [ "$MODE" == 'coverage' ]; then
+            pip install coverage
+            if [ -n "$CODACY_PROJECT_TOKEN" ]; then pip install codacy-coverage; fi
+            if [ -n "$COVERALLS_REPO_TOKEN" ]; then pip install coveralls; fi
+            if [ -n "$CODECOV_TOKEN" ]; then wget https://codecov.io/bash -O codecov.sh && chmod +x codecov.sh; fi
+        fi
+
+before_script:
+  - pip freeze
+  # Before runing the test case, we need to make jython run some code as in first run it can put something on stdout
+  - if [ -n "$JYTHON" ]; then python -c "print ''"; else echo skip; fi
+
+script:
+  - |
+        # nosetests
+        if [ -z "$MODE" ]; then
+            python setup.py nosetests
+        elif [ "$MODE" == 'coverage' ]; then
+            python setup.py nosetests --with-coverage --cover-xml --cover-package "$(python setup.py --name)" --cover-branches
+        else
+            echo skip
+        fi
+  - |
+        # yapf
+        if [ "$MODE" == 'SCA' ]; then
+            if [ -n "$TRAVIS_COMMIT_RANGE" ]; then
+                echo "using commit range: $TRAVIS_COMMIT_RANGE"
+                git diff --name-only "$TRAVIS_COMMIT_RANGE" | grep '\.py$' | xargs yapf --diff setup.py || exit
+            else
+                yapf --diff --recursive . || exit
+            fi
+        else
+            echo skip
+        fi
+  - if [ "$MODE" == 'SCA' ]; then pyflakes . || exit; else echo skip; fi
+
+  # isort doesn't get along with yapf. Hopefully we'll figure it out and re-enable in the future.
+  # - if [ "$MODE" == 'SCA' ]; then isort --order-by-type --recursive --line-width 100 --diff --verbose --check-only || exit; else echo skip; fi
+
+  # home-made bad code detectors
+  - if [ "$MODE" == 'SCA' ]; then egrep -r '^ *class [^\(]+(\(\))?:' . && exit 1 || true; else echo skip; fi  # old-style class detector
+  - if [ "$MODE" == 'SCA' ]; then grep -r 'isinstance\(' . && exit 1 || true; else echo skip; fi  # very non-pythonic
+  - if [ "$MODE" == 'SCA' ]; then egrep -r '\b(all|any)\(\[' . && exit 1 || true; else echo skip; fi  # a list is unnecesarily allocated where a generator expression could have been used
+  - if [ "$MODE" == 'SCA' ]; then grep -r '\_\_metaclass\_\_' . && exit 1 || true; else echo skip; fi  # bad metaclass declaration: use six
+  - if [ "$MODE" == 'SCA' ]; then grep -P -r '^ *logger = (?!logging\.getLogger\(__name__\)$)' . | grep -v '.eggs/nose-' && exit 1 || true; else echo skip; fi  # bad logger definition: use `logger = logging.getLogger(__name__)`. See the magic logging metaclass.
+  - if [ "$MODE" == 'SCA' ]; then python setup.py check -r -s; else echo skip; fi
+  - if [ "$MODE" == 'SCA' ]; then check-manifest -v; else echo skip; fi
+
+  # package installation
+  - |
+        if [ "$MODE" == 'SCA' ]; then
+            echo skip
+        else
+            if [ -n "$OS_X_PYTHON_VERSION" ]; then
+                # install action fails on osx for unknown reason
+                python setup.py develop
+            else
+                python setup.py install
+            fi
+        fi
+
+after_success:
+  - if [ "$MODE" == 'coverage' -a -n "$CODACY_PROJECT_TOKEN" ]; then python-codacy-coverage -r coverage.xml; else echo skip; fi
+  - if [ "$MODE" == 'coverage' -a -n "$COVERALLS_REPO_TOKEN" ]; then coveralls; else echo skip; fi
+  - if [ "$MODE" == 'coverage' -a -n "$CODECOV_TOKEN" ]; then ./codecov.sh -X gcov -X coveragepy; else echo skip; fi
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..ab9d105
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,29 @@
+BSD 3-clause license
+
+Copyright (c) 2016, Pawel Polewicz.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* Neither the name of logfury nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..2bf2271
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,6 @@
+include requirements.txt
+include requirements-test.txt
+include requirements-setup.txt
+include LICENSE.txt
+include README.rst
+graft src
diff --git a/README.rst b/README.rst
new file mode 100644
index 0000000..8c3d785
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,139 @@
+========
+Logfury
+========
+
+Logfury is for python library maintainers. It allows for responsible, low-boilerplate logging of method calls.
+
+*****************
+License
+*****************
+
+BSD 3-clause
+
+*****************************
+whats with the weird import
+*****************************
+
+.. sourcecode:: python
+
+    from logfury.v0_1 import DefaultTraceMeta
+
+If you were to use logfury in your library, any change to the API could potentially break your program. Nobody wants that.
+
+Thanks to this import trick I can keep the 0.1.x API very stable. At the same time I can change the functionality of the library and change default behavior of version 0.2.x etc, without changing the name of the package. This way YOU decide when to adopt potentially incompatible API changes, by incrementing the API version on import.
+
+
+*****************
+Installation
+*****************
+
+^^^^^^^^^^^^^^^^^^^^
+Current stable
+^^^^^^^^^^^^^^^^^^^^
+
+::
+
+    pip install logfury
+
+^^^^^^^^^^^^^^^^^^^^
+Development version
+^^^^^^^^^^^^^^^^^^^^
+
+::
+
+    git clone git at github.com:ppolewicz/logfury.git
+    python setup.py install
+
+
+*****************
+Basic usage
+*****************
+
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+DefaultTraceMeta metaclass
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. sourcecode:: pycon
+
+    >>> import logging
+    >>> import six
+    >>>
+    >>> from logfury.v0_1 import DefaultTraceMeta, limit_trace_arguments, disable_trace
+    >>>
+    >>>
+    >>> logging.basicConfig()
+    >>> logger = logging.getLogger(__name__)
+    >>> logger.setLevel(logging.DEBUG)
+    >>>
+    >>>
+    >>> @six.add_metaclass(DefaultTraceMeta)
+    >>> class Foo(object):
+    ...     def baz(self, a, b, c=None):
+    ...         return True
+    ...     def get_blah(self):
+    ...         return 5
+    ...     def _hello(self):
+    ...         pass
+    ...     @disable_trace
+    ...     def world(self):
+    ...         pass
+    ...     def __repr__(self):
+    ...         return '<%s object>' % (self.__class__.__name__,)
+    ...
+    >>> class Bar(Foo):
+    ...     def baz(self, a, b, c=None):
+    ...         b += 1
+    ...         return super(Bar, self).baz(a, b, c)
+    ...     def world(self):
+    ...         pass
+    ...     @limit_trace_arguments(skip=['password'])
+    ...     def secret(self, password, other):
+    ...         pass
+    ...     @limit_trace_arguments(only=['other'])
+    ...     def secret2(self, password, other):
+    ...         pass
+    ...
+    >>> a = Foo()
+    >>> a.baz(1, 2, 3)
+    DEBUG:__main__:calling Foo.baz(self=<Foo object>, a=1, b=2, c=3)
+    >>> a.baz(4, b=8)
+    DEBUG:__main__:calling Foo.baz(self=<Foo object>, a=4, b=8)
+    >>> a.get_blah()  # nothing happens, since v0_1.DefaultTraceMeta does not trace "get_.*"
+    >>> a._hello()  # nothing happens, since v0_1.DefaultTraceMeta does not trace "_.*"
+    >>> a.world()  # nothing happens, since v0_1.DefaultTraceMeta does not trace "_.*"
+    >>> b = Bar()
+    >>> b.baz(4, b=8)  # tracing is inherited
+    DEBUG:__main__:calling Bar.baz(self=<Bar object>, a=4, b=8)
+    DEBUG:__main__:calling Foo.baz(self=<Bar object>, a=4, b=9, c=None)
+    >>> b.world()  # nothing happens, since Foo.world() tracing was disabled and Bar inherited it
+    >>> b.secret('correct horse battery staple', 'Hello world!')
+    DEBUG:__main__:calling Bar.secret(self=<Bar object>, other='Hello world!') (hidden args: password)
+    >>> b.secret2('correct horse battery staple', 'Hello world!')
+    DEBUG:__main__:calling Bar.secret2(other='Hello world!') (hidden args: self, password)
+
+
+^^^^^^^^^^^^^^^^^^^^
+trace_call decorator
+^^^^^^^^^^^^^^^^^^^^
+
+.. sourcecode:: pycon
+
+    >>> import logging
+    >>> from logfury import *
+    >>> logging.basicConfig()
+    >>> logger = logging.getLogger(__name__)
+    >>>
+    >>> @trace_call(logger)
+    ... def foo(a, b, c=None):
+    ...     return True
+    ...
+    >>> foo(1, 2, 3)
+    True
+    >>> logger.setLevel(logging.DEBUG)
+    >>> foo(1, 2, 3)
+    DEBUG:__main__:calling foo(a=1, b=2, c=3)
+    True
+    >>> foo(1, b=2)
+    DEBUG:__main__:calling foo(a=1, b=2)
+    True
+    >>>
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 0000000..836d9ec
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,120 @@
+# taken from https://github.com/ogrisel/python-appveyor-demo/blob/master/appveyor.yml under http://creativecommons.org/publicdomain/zero/1.0/
+
+environment:
+  global:
+    # SDK v7.0 MSVC Express 2008's SetEnv.cmd script will fail if the
+    # /E:ON and /V:ON options are not enabled in the batch script intepreter
+    # See: http://stackoverflow.com/a/13751649/163740
+    CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\ci\\appveyor\\run_with_env.cmd"
+
+  matrix:
+
+    # Python 2.7.10 is the latest version and is not pre-installed.
+
+    #- PYTHON: "C:\\Python27.10"
+    #  PYTHON_VERSION: "2.7.10"
+    #  PYTHON_ARCH: "32"
+
+    #- PYTHON: "C:\\Python27.10-x64"
+    #  PYTHON_VERSION: "2.7.10"
+    #  PYTHON_ARCH: "64"
+
+    # Pre-installed Python versions, which Appveyor may upgrade to
+    # a later point release.
+    # See: http://www.appveyor.com/docs/installed-software#python
+
+    #- PYTHON: "C:\\Python27"
+    #  PYTHON_VERSION: "2.7.x" # currently 2.7.9
+    #  PYTHON_ARCH: "32"
+
+    #- PYTHON: "C:\\Python27-x64"
+    #  PYTHON_VERSION: "2.7.x" # currently 2.7.9
+    #  PYTHON_ARCH: "64"
+
+    #- PYTHON: "C:\\Python33"
+    #  PYTHON_VERSION: "3.3.x" # currently 3.3.5
+    #  PYTHON_ARCH: "32"
+
+    #- PYTHON: "C:\\Python33-x64"
+    #  PYTHON_VERSION: "3.3.x" # currently 3.3.5
+    #  PYTHON_ARCH: "64"
+
+    #- PYTHON: "C:\\Python34"
+    #  PYTHON_VERSION: "3.4.x" # currently 3.4.3
+    #  PYTHON_ARCH: "32"
+
+    #- PYTHON: "C:\\Python34-x64"
+    #  PYTHON_VERSION: "3.4.x" # currently 3.4.3
+    #  PYTHON_ARCH: "64"
+
+    # Python versions not pre-installed
+
+    # Python 2.6.6 is the latest Python 2.6 with a Windows installer
+    # See: https://github.com/ogrisel/python-appveyor-demo/issues/10
+
+    - PYTHON: "C:\\Python266"
+      PYTHON_VERSION: "2.6.6"
+      PYTHON_ARCH: "32"
+
+    #- PYTHON: "C:\\Python266-x64"
+    #  PYTHON_VERSION: "2.6.6"
+    #  PYTHON_ARCH: "64"
+
+    #- PYTHON: "C:\\Python35"
+    #  PYTHON_VERSION: "3.5.0"
+    #  PYTHON_ARCH: "32"
+
+    - PYTHON: "C:\\Python35-x64"
+      PYTHON_VERSION: "3.5.0"
+      PYTHON_ARCH: "64"
+
+    # Major and minor releases (i.e x.0.0 and x.y.0) prior to 3.3.0 use
+    # a different naming scheme.
+
+    #- PYTHON: "C:\\Python270"
+    #  PYTHON_VERSION: "2.7.0"
+    #  PYTHON_ARCH: "32"
+
+    #- PYTHON: "C:\\Python270-x64"
+    #  PYTHON_VERSION: "2.7.0"
+    #  PYTHON_ARCH: "64"
+
+install:
+  - ECHO "Filesystem root:"
+  - ps: "ls \"C:/\""
+
+  - ECHO "Installed SDKs:"
+  - ps: "ls \"C:/Program Files/Microsoft SDKs/Windows\""
+
+  # Install Python (from the official .msi of http://python.org) and pip when
+  # not already installed.
+  - ps: if (-not(Test-Path($env:PYTHON))) { & ci\appveyor\install.ps1 }
+
+  # Prepend newly installed Python to the PATH of this build (this cannot be
+  # done from inside the powershell script as it would require to restart
+  # the parent CMD process).
+  - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
+
+  # Check that we have the expected version and architecture for Python
+  - "python --version"
+  - "python -c \"import struct; print(struct.calcsize('P') * 8)\""
+
+  # Upgrade to the latest version of pip to avoid it displaying warnings
+  # about it being out of date.
+  - "pip install --disable-pip-version-check --user --upgrade pip"
+
+  # Install the build dependencies of the project. If some dependencies contain
+  # compiled extensions and are not provided as pre-built wheel packages,
+  # pip will build them from source using the MSVC compiler matching the
+  # target Python version and architecture
+  - "%CMD_IN_ENV% pip install -r requirements.txt"
+  - "%CMD_IN_ENV% pip install -r requirements-test.txt"
+  - "%CMD_IN_ENV% pip install -r requirements-setup.txt"
+
+build_script:
+  # Build the compiled extension
+  - "%CMD_IN_ENV% python setup.py build"
+
+test_script:
+  # Run the project tests
+  - "%CMD_IN_ENV% python setup.py nosetests --processes=0"
diff --git a/ci/appveyor/install.ps1 b/ci/appveyor/install.ps1
new file mode 100644
index 0000000..160ba55
--- /dev/null
+++ b/ci/appveyor/install.ps1
@@ -0,0 +1,229 @@
+# Sample script to install Python and pip under Windows
+# Authors: Olivier Grisel, Jonathan Helmus, Kyle Kastner, and Alex Willmer
+# License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/
+
+$MINICONDA_URL = "http://repo.continuum.io/miniconda/"
+$BASE_URL = "https://www.python.org/ftp/python/"
+$GET_PIP_URL = "https://bootstrap.pypa.io/get-pip.py"
+$GET_PIP_PATH = "C:\get-pip.py"
+
+$PYTHON_PRERELEASE_REGEX = @"
+(?x)
+(?<major>\d+)
+\.
+(?<minor>\d+)
+\.
+(?<micro>\d+)
+(?<prerelease>[a-z]{1,2}\d+)
+"@
+
+
+function Download ($filename, $url) {
+    $webclient = New-Object System.Net.WebClient
+
+    $basedir = $pwd.Path + "\"
+    $filepath = $basedir + $filename
+    if (Test-Path $filename) {
+        Write-Host "Reusing" $filepath
+        return $filepath
+    }
+
+    # Download and retry up to 3 times in case of network transient errors.
+    Write-Host "Downloading" $filename "from" $url
+    $retry_attempts = 2
+    for ($i = 0; $i -lt $retry_attempts; $i++) {
+        try {
+            $webclient.DownloadFile($url, $filepath)
+            break
+        }
+        Catch [Exception]{
+            Start-Sleep 1
+        }
+    }
+    if (Test-Path $filepath) {
+        Write-Host "File saved at" $filepath
+    } else {
+        # Retry once to get the error message if any at the last try
+        $webclient.DownloadFile($url, $filepath)
+    }
+    return $filepath
+}
+
+
+function ParsePythonVersion ($python_version) {
+    if ($python_version -match $PYTHON_PRERELEASE_REGEX) {
+        return ([int]$matches.major, [int]$matches.minor, [int]$matches.micro,
+                $matches.prerelease)
+    }
+    $version_obj = [version]$python_version
+    return ($version_obj.major, $version_obj.minor, $version_obj.build, "")
+}
+
+
+function DownloadPython ($python_version, $platform_suffix) {
+    $major, $minor, $micro, $prerelease = ParsePythonVersion $python_version
+
+    if (($major -le 2 -and $micro -eq 0) `
+        -or ($major -eq 3 -and $minor -le 2 -and $micro -eq 0) `
+        ) {
+        $dir = "$major.$minor"
+        $python_version = "$major.$minor$prerelease"
+    } else {
+        $dir = "$major.$minor.$micro"
+    }
+
+    if ($prerelease) {
+        if (($major -le 2) `
+            -or ($major -eq 3 -and $minor -eq 1) `
+            -or ($major -eq 3 -and $minor -eq 2) `
+            -or ($major -eq 3 -and $minor -eq 3) `
+            ) {
+            $dir = "$dir/prev"
+        }
+    }
+
+    if (($major -le 2) -or ($major -le 3 -and $minor -le 4)) {
+        $ext = "msi"
+        if ($platform_suffix) {
+            $platform_suffix = ".$platform_suffix"
+        }
+    } else {
+        $ext = "exe"
+        if ($platform_suffix) {
+            $platform_suffix = "-$platform_suffix"
+        }
+    }
+
+    $filename = "python-$python_version$platform_suffix.$ext"
+    $url = "$BASE_URL$dir/$filename"
+    $filepath = Download $filename $url
+    return $filepath
+}
+
+
+function InstallPython ($python_version, $architecture, $python_home) {
+    Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home
+    if (Test-Path $python_home) {
+        Write-Host $python_home "already exists, skipping."
+        return $false
+    }
+    if ($architecture -eq "32") {
+        $platform_suffix = ""
+    } else {
+        $platform_suffix = "amd64"
+    }
+    $installer_path = DownloadPython $python_version $platform_suffix
+    $installer_ext = [System.IO.Path]::GetExtension($installer_path)
+    Write-Host "Installing $installer_path to $python_home"
+    $install_log = $python_home + ".log"
+    if ($installer_ext -eq '.msi') {
+        InstallPythonMSI $installer_path $python_home $install_log
+    } else {
+        InstallPythonEXE $installer_path $python_home $install_log
+    }
+    if (Test-Path $python_home) {
+        Write-Host "Python $python_version ($architecture) installation complete"
+    } else {
+        Write-Host "Failed to install Python in $python_home"
+        Get-Content -Path $install_log
+        Exit 1
+    }
+}
+
+
+function InstallPythonEXE ($exepath, $python_home, $install_log) {
+    $install_args = "/quiet InstallAllUsers=1 TargetDir=$python_home"
+    RunCommand $exepath $install_args
+}
+
+
+function InstallPythonMSI ($msipath, $python_home, $install_log) {
+    $install_args = "/qn /log $install_log /i $msipath TARGETDIR=$python_home"
+    $uninstall_args = "/qn /x $msipath"
+    RunCommand "msiexec.exe" $install_args
+    if (-not(Test-Path $python_home)) {
+        Write-Host "Python seems to be installed else-where, reinstalling."
+        RunCommand "msiexec.exe" $uninstall_args
+        RunCommand "msiexec.exe" $install_args
+    }
+}
+
+function RunCommand ($command, $command_args) {
+    Write-Host $command $command_args
+    Start-Process -FilePath $command -ArgumentList $command_args -Wait -Passthru
+}
+
+
+function InstallPip ($python_home) {
+    $pip_path = $python_home + "\Scripts\pip.exe"
+    $python_path = $python_home + "\python.exe"
+    if (-not(Test-Path $pip_path)) {
+        Write-Host "Installing pip..."
+        $webclient = New-Object System.Net.WebClient
+        $webclient.DownloadFile($GET_PIP_URL, $GET_PIP_PATH)
+        Write-Host "Executing:" $python_path $GET_PIP_PATH
+        & $python_path $GET_PIP_PATH
+    } else {
+        Write-Host "pip already installed."
+    }
+}
+
+
+function DownloadMiniconda ($python_version, $platform_suffix) {
+    if ($python_version -eq "3.4") {
+        $filename = "Miniconda3-3.5.5-Windows-" + $platform_suffix + ".exe"
+    } else {
+        $filename = "Miniconda-3.5.5-Windows-" + $platform_suffix + ".exe"
+    }
+    $url = $MINICONDA_URL + $filename
+    $filepath = Download $filename $url
+    return $filepath
+}
+
+
+function InstallMiniconda ($python_version, $architecture, $python_home) {
+    Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home
+    if (Test-Path $python_home) {
+        Write-Host $python_home "already exists, skipping."
+        return $false
+    }
+    if ($architecture -eq "32") {
+        $platform_suffix = "x86"
+    } else {
+        $platform_suffix = "x86_64"
+    }
+    $filepath = DownloadMiniconda $python_version $platform_suffix
+    Write-Host "Installing" $filepath "to" $python_home
+    $install_log = $python_home + ".log"
+    $args = "/S /D=$python_home"
+    Write-Host $filepath $args
+    Start-Process -FilePath $filepath -ArgumentList $args -Wait -Passthru
+    if (Test-Path $python_home) {
+        Write-Host "Python $python_version ($architecture) installation complete"
+    } else {
+        Write-Host "Failed to install Python in $python_home"
+        Get-Content -Path $install_log
+        Exit 1
+    }
+}
+
+
+function InstallMinicondaPip ($python_home) {
+    $pip_path = $python_home + "\Scripts\pip.exe"
+    $conda_path = $python_home + "\Scripts\conda.exe"
+    if (-not(Test-Path $pip_path)) {
+        Write-Host "Installing pip..."
+        $args = "install --yes pip"
+        Write-Host $conda_path $args
+        Start-Process -FilePath "$conda_path" -ArgumentList $args -Wait -Passthru
+    } else {
+        Write-Host "pip already installed."
+    }
+}
+
+function main () {
+    InstallPython $env:PYTHON_VERSION $env:PYTHON_ARCH $env:PYTHON
+    InstallPip $env:PYTHON
+}
+
+main
diff --git a/ci/appveyor/run_with_env.cmd b/ci/appveyor/run_with_env.cmd
new file mode 100644
index 0000000..5da547c
--- /dev/null
+++ b/ci/appveyor/run_with_env.cmd
@@ -0,0 +1,88 @@
+:: To build extensions for 64 bit Python 3, we need to configure environment
+:: variables to use the MSVC 2010 C++ compilers from GRMSDKX_EN_DVD.iso of:
+:: MS Windows SDK for Windows 7 and .NET Framework 4 (SDK v7.1)
+::
+:: To build extensions for 64 bit Python 2, we need to configure environment
+:: variables to use the MSVC 2008 C++ compilers from GRMSDKX_EN_DVD.iso of:
+:: MS Windows SDK for Windows 7 and .NET Framework 3.5 (SDK v7.0)
+::
+:: 32 bit builds, and 64-bit builds for 3.5 and beyond, do not require specific
+:: environment configurations.
+::
+:: Note: this script needs to be run with the /E:ON and /V:ON flags for the
+:: cmd interpreter, at least for (SDK v7.0)
+::
+:: More details at:
+:: https://github.com/cython/cython/wiki/64BitCythonExtensionsOnWindows
+:: http://stackoverflow.com/a/13751649/163740
+::
+:: Author: Olivier Grisel
+:: License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/
+::
+:: Notes about batch files for Python people:
+::
+:: Quotes in values are literally part of the values:
+::      SET FOO="bar"
+:: FOO is now five characters long: " b a r "
+:: If you don't want quotes, don't include them on the right-hand side.
+::
+:: The CALL lines at the end of this file look redundant, but if you move them
+:: outside of the IF clauses, they do not run properly in the SET_SDK_64==Y
+:: case, I don't know why.
+ at ECHO OFF
+
+SET COMMAND_TO_RUN=%*
+SET WIN_SDK_ROOT=C:\Program Files\Microsoft SDKs\Windows
+SET WIN_WDK=c:\Program Files (x86)\Windows Kits\10\Include\wdf
+
+:: Extract the major and minor versions, and allow for the minor version to be
+:: more than 9.  This requires the version number to have two dots in it.
+SET MAJOR_PYTHON_VERSION=%PYTHON_VERSION:~0,1%
+IF "%PYTHON_VERSION:~3,1%" == "." (
+    SET MINOR_PYTHON_VERSION=%PYTHON_VERSION:~2,1%
+) ELSE (
+    SET MINOR_PYTHON_VERSION=%PYTHON_VERSION:~2,2%
+)
+
+:: Based on the Python version, determine what SDK version to use, and whether
+:: to set the SDK for 64-bit.
+IF %MAJOR_PYTHON_VERSION% == 2 (
+    SET WINDOWS_SDK_VERSION="v7.0"
+    SET SET_SDK_64=Y
+) ELSE (
+    IF %MAJOR_PYTHON_VERSION% == 3 (
+        SET WINDOWS_SDK_VERSION="v7.1"
+        IF %MINOR_PYTHON_VERSION% LEQ 4 (
+            SET SET_SDK_64=Y
+        ) ELSE (
+            SET SET_SDK_64=N
+            IF EXIST "%WIN_WDK%" (
+                :: See: https://connect.microsoft.com/VisualStudio/feedback/details/1610302/
+                REN "%WIN_WDK%" 0wdf
+            )
+        )
+    ) ELSE (
+        ECHO Unsupported Python version: "%MAJOR_PYTHON_VERSION%"
+        EXIT 1
+    )
+)
+
+IF %PYTHON_ARCH% == 64 (
+    IF %SET_SDK_64% == Y (
+        ECHO Configuring Windows SDK %WINDOWS_SDK_VERSION% for Python %MAJOR_PYTHON_VERSION% on a 64 bit architecture
+        SET DISTUTILS_USE_SDK=1
+        SET MSSdk=1
+        "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Setup\WindowsSdkVer.exe" -q -version:%WINDOWS_SDK_VERSION%
+        "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Bin\SetEnv.cmd" /x64 /release
+        ECHO Executing: %COMMAND_TO_RUN%
+        call %COMMAND_TO_RUN% || EXIT 1
+    ) ELSE (
+        ECHO Using default MSVC build environment for 64 bit architecture
+        ECHO Executing: %COMMAND_TO_RUN%
+        call %COMMAND_TO_RUN% || EXIT 1
+    )
+) ELSE (
+    ECHO Using default MSVC build environment for 32 bit architecture
+    ECHO Executing: %COMMAND_TO_RUN%
+    call %COMMAND_TO_RUN% || EXIT 1
+)
diff --git a/requirements-setup.txt b/requirements-setup.txt
new file mode 100644
index 0000000..f3c7e8e
--- /dev/null
+++ b/requirements-setup.txt
@@ -0,0 +1 @@
+nose
diff --git a/requirements-test.txt b/requirements-test.txt
new file mode 100644
index 0000000..b454361
--- /dev/null
+++ b/requirements-test.txt
@@ -0,0 +1,5 @@
+check-manifest
+pyflakes
+readme_renderer
+testfixtures
+yapf
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..86e41d1
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,2 @@
+six>=1.10
+funcsigs
diff --git a/run-unit-tests.sh b/run-unit-tests.sh
new file mode 100755
index 0000000..b443aee
--- /dev/null
+++ b/run-unit-tests.sh
@@ -0,0 +1,16 @@
+#!/bin/bash -e
+if [ -z "${PYTHON_VIRTUAL_ENVS}" ]; then
+    python setup.py nosetests
+else
+    for virtual_env in ${PYTHON_VIRTUAL_ENVS}
+    do
+        echo Activating ${virtual_env}
+        source ${virtual_env}/bin/activate
+        python setup.py nosetests
+    done
+fi
+
+echo
+echo '#################'
+echo '# unit tests OK #'
+echo '#################'
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..6bec899
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,29 @@
+[metadata]
... 818 lines suppressed ...

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-logfury.git



More information about the Python-modules-commits mailing list