diff -Nru dh-python-1.20140128/debian/changelog dh-python-2.20160818~bpo8+1~trusty/debian/changelog --- dh-python-1.20140128/debian/changelog 2014-03-24 16:36:42.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/debian/changelog 2017-02-24 22:15:22.000000000 +0000 @@ -1,58 +1,222 @@ -dh-python (1.20140128-1ubuntu8) trusty; urgency=medium +dh-python (2.20160818~bpo8+1~trusty) trusty; urgency=medium - * Add no-python2.6.diff: Fix test failures on checking for python2.6 - specific bits. + * backport to trusty - -- Martin Pitt Mon, 24 Mar 2014 17:36:23 +0100 + -- Hans-Christoph Steiner Fri, 24 Feb 2017 23:15:22 +0100 -dh-python (1.20140128-1ubuntu7) trusty; urgency=medium +dh-python (2.20160818~bpo8+1) jessie-backports; urgency=medium - * Run tests with python3.4 instead of python3.3. - - -- Matthias Klose Mon, 24 Mar 2014 11:10:25 +0100 - -dh-python (1.20140128-1ubuntu5) trusty; urgency=medium - - * Drop Python 3.3 as a supported Python 3 version. - - -- Matthias Klose Sun, 23 Mar 2014 09:17:26 +0100 - -dh-python (1.20140128-1ubuntu4) trusty; urgency=medium - - * Update supported Python 3 versions in tests, to fix autopkgtest - failure. - - -- Dmitry Shachnev Fri, 07 Mar 2014 22:53:55 +0400 - -dh-python (1.20140128-1ubuntu3) trusty; urgency=medium - - * Make dh-python autopkgtest depend on build-essential and fakeroot. - - -- Dmitry Shachnev Thu, 27 Feb 2014 11:56:50 +0400 - -dh-python (1.20140128-1ubuntu2) trusty; urgency=medium + * Rebuild for jessie-backports. + * Update default and supported Python versions + * Add some Jessie packages to fallback files + + -- Piotr Ożarowski Sun, 28 Aug 2016 21:37:36 +0200 + +dh-python (2.20160818) unstable; urgency=medium + + [ Chris Lamb ] + * dh_py*: do not copy build profiles into substvars (closes: 834238) + * pybuild: log "before" and "after" commands by default (closes: 834506) + + [ Piotr Ożarowski ] + * dh_py*: add --{depends,recommends,suggests}-section options + Use these options if you want to translate section(s) of requires.txt + file into Depends/Recommends/Suggests + * Mention pydist override file names and their priority in README.PyDist + + -- Piotr Ożarowski Thu, 18 Aug 2016 00:27:52 +0200 + +dh-python (2.20160721) unstable; urgency=medium + + * pybuild.pm: recognize ":any" build dependencies (closes: 828883) + * Save helper's name in autogenerated maintainer scripts (closes: 827774) + + -- Piotr Ożarowski Thu, 21 Jul 2016 21:56:20 +0200 + +dh-python (2.20160609) unstable; urgency=medium + + [ Piotr Ożarowski ] + * pybuild's distutils build plugin: use force option at install stage to + avoid non-deterministic shebangs (closes: 804339) + * pybuild.pm: + - fail with a message about missing interpreter package in + Build-Depends if there's none (closes: 819353) + - do not pass --dir to pybuild if it's equal to current directory + (to make PYBUILD_DIR override possible) + * dh_pypy: fix dpkg search template to find more pypy egg-info packages + * dh_py*: + - add interpreter to Depends if .so file is detected in private dir + only if python{,3,all,3-all}-dev is in Build-Depends (closes: 811083) + - use Build-Depends' minimum version for required libraries if other + methods to detect it failed (closes: 791433) + - --requires now tries to find given file in debian/pkg-name/ dir + (`--requires foo/bar.txt` will try debian/python3-spam/foo/bar.txt and + fall back to ./foo/bar.txt) + - print an error if there's no package to act on + - fix handling symlinks while moving files to common directory + (closes: 801719) + + [ Ondřej Nový ] + * When depends on python{3,}-setuptools-scm, set + SETUPTOOLS_SCM_PRETEND_VERSION to upstream version + * Standards-Version is 3.9.8 now (no changes needed) + * Changed Vcs-* URLs to https protocol + + [ James Page ] + * dhpython/pydist.py: Ensure that != dependency versions are ignored + (LP: #1581065). + + -- Piotr Ożarowski Thu, 09 Jun 2016 18:37:46 +0200 + +dh-python (2.20151103) unstable; urgency=medium + + * dh_py*: + - remove lines from requires.txt already translated into Debian + dependencies + - remove SOURCES.txt from egg-info directories (closes: 802882) + * dh_pypy: generate pypy-abi-foo dependencies for PyPy extensions + (closes: 803689) + * pybuild: + - build default interpreter version last (in case previous build + results are overwritten, like in distutils build system) + - remove (just before install stage) egg-info dirs generated in build_dir + during test stage (closes: 803242) + * Move libdpkg-perl from Depends to Suggests. python3 still depends on + dh-python and we don't want to pull Perl when python3 is intalled + (libdpkg-perl is pulled in by debhelper anyway) + * Add README.rst file + + -- Piotr Ożarowski Tue, 03 Nov 2015 23:20:36 +0100 + +dh-python (2.20150826) unstable; urgency=medium + + * Remove '--with-doctest' from nose call, closes: 749506 + to re-enable it: export PYBUILD_TEST_ARGS=--with-doctest + * Build-Depends based test suite detection is used only if PYBUILD_TEST_FOO + is not set to 1 + * dh_python2: do not try to move files to pyshared if package doesn't + provide public modules (f.e. due to interpreter version no longer + supported or installed), closes: 793148 + + -- Piotr Ożarowski Wed, 26 Aug 2015 16:53:52 +0200 + +dh-python (2.20150728) unstable; urgency=medium + + * dh_python3: fix module renaming in Python >= 3.5 (SOABI now includes + MULTIARCH triplet) + * pybuild.pm: + - fix parsing Build-Depends with comments (closes: 793609, thanks to James + McCoy for the patch) - new build/runtime dependency: libdpkg-perl + - enable --test-{nose,pytest,tox} if appropriate build dependency is set + * pybuild: + - allow localhost connections (via no_proxy=localhost, thanks to + Dimitri John Ledkov) + - do not forward empty http{,s}_proxy env. vars - some tools do not like it + * dh_python{2,3} and dh_pypy: skip packages with private modules that + do not have apropriate ${*:Depends} substvar in Depends + (-p/-N in debian/rules to select the right package is no longer needed, + now you can select the right tool by adding substvar) + * generate_fallback_list.py: add support for --ubuntu (requires + python3-distro-info package, thanks to James Page for original patch, + closes LP: #1422433) + + -- Piotr Ożarowski Tue, 28 Jul 2015 21:01:02 +0200 + +dh-python (2.20150719) unstable; urgency=medium + + * Update dist_fallback files + * Converted to native package and bumped version number to 2.* + * dh_python{2,3}: + - remove empty directories (closes: 761028) + - remove "test" and "tests" directories from dist-packages/ + (packages should ship tests in /usr/share/ or under thier own namespace) + * Make private dir autoscript snippets output in a determinstic order + (closes: 792436, thanks to Chris Lamb for the patch) + * Clarify purpose of .pydist files (closes: 778633, thanks to Nikolaus Rath + for the patch) + * Remove "module" from extension file names also in Python 2.7 + + -- Piotr Ożarowski Sun, 19 Jul 2015 22:54:37 +0200 + +dh-python (1.20150705-1) unstable; urgency=medium + + * Support requires.txt in PyPy packages. + * Add unit tests for bugs fixed in this and the previous upload. + + -- Stefano Rivera Sun, 05 Jul 2015 19:09:24 -0700 + +dh-python (1.20150628-1) unstable; urgency=medium + + * Fix path handling when --ext-dest-dir is used. Some characters were being + stripped from the beginning of the path. + * Re-apply Multi-Arch change. + * Remove XS-Testsuite control field, no longer necessary. + * Sort namespace files, for reproducibility. Thanks to Chris Lamb for the + patch. (closes: 777134) + + -- Stefano Rivera Sun, 28 Jun 2015 18:43:31 -0700 + +dh-python (1.20141111-2) unstable; urgency=medium + + * Remove Multi-Arch change from previous upload (not accepted for Jessie by + release managers) + + -- Piotr Ożarowski Sat, 15 Nov 2014 12:48:23 +0100 + +dh-python (1.20141111-1) unstable; urgency=medium + + * Set dh-python's Multi-Arch to "foreign" (closes: 767339) + * dist_fallback files now contain list of all packages that provide Egg + metadata (i.e. not just packages that don't have sensible name) + * dh_python* no longer guesses dependency from requires.txt files nor Requires + fields. Dependencies are generated only if given requirement is available + in dist_fallback file (generated at dh-python's build time) or if it's + available at build time (hint: Build-Depends) + + -- Piotr Ożarowski Tue, 11 Nov 2014 21:23:20 +0100 + +dh-python (1.20141026-1) unstable; urgency=medium + + [ Stefano Rivera ] + * Update supported (and default) PyPy version to 2.4. + + [ Piotr Ożarowski ] + * Remove "-p " from autoscripts if --compile-all option is set + * Add support for guessing dependencies from egg-info files (closes: 756378) + * Parse "!=" relationship in egg dependencies (closes: 754058, thanks to + Rafael Laboissiere for the patch) + * Improve handling pyinstall/pyremove files (leading slash no longer needed + for deprecated directories, manpages improved a bit) - closes: 741381 + * Suggest the right file name for dependency overrides (closes: 748296) + * Add argparse to Python 3.X's dist fallback (closes: 763200) + * Ensure that Depends and the likes are written in a stable + order (closes: 759231, thanks to Jérémy Bobbio for the patch) + * Remove dh_python2 diversions while upgrading from bpo package + * Standards-Version bumped to 3.9.6 (no changes needed) + + -- Piotr Ożarowski Sun, 26 Oct 2014 23:32:57 +0100 + +dh-python (1.20140511-1) unstable; urgency=medium + + [ Piotr Ożarowski ] + * pybuild: do not invoke clean commands for missing interpreters + (and thus do not require all interpreter versions to be installed while + building source package outside build environment, closes: 737091) + * dh_python2: no longer moves files to /usr/share/pyshared if there's only + one supported Python 2.X version and doesn't create /usr/lib/pyshared + symlinks for extensions (as other helper tools are now deprecated) + * Show fix_shebang's error messages only in debug mode, closes: 745581 + [ Matthias Klose ] * Remove empty directories when moving files. - -- Matthias Klose Wed, 12 Feb 2014 15:14:23 +0100 - -dh-python (1.20140128-1ubuntu1) trusty; urgency=medium - - * Merge with Debian unstable, remaining changes: - - debian/control: Make dh-python Multi-Arch: foreign. - - Add patch debian/patches/no-pyshare.diff: - + Don't move files to /usr/share/pyshared anymore. - + Don't create extension symlinks in /usr/lib/pyshared/pythonX.Y anymore. - - Add patch debian/patches/python3.4.diff: - + Add python3.4 as a supported version. - - -- Dmitry Shachnev Wed, 29 Jan 2014 17:24:45 +0400 + -- Piotr Ożarowski Sun, 11 May 2014 20:59:15 +0200 dh-python (1.20140128-1) unstable; urgency=low * dh_python3, dh_pypy: add support for debian/package.pyremove files (closes: 730777) - * dh_python3: add multiarch tuples to all already tagged extensions if + * dh_python3: add multiarch tuples to all already tagged extensions when more than one Python 3 version is supported (closes: 733128) * Make sure only first line is taken into account while checking shebangs (closes: 732308) @@ -71,61 +235,6 @@ -- Piotr Ożarowski Tue, 28 Jan 2014 18:20:19 +0100 -dh-python (1.20131021-1ubuntu8) trusty; urgency=medium - - * Taken from upstream: - dh_python3: add multiarch tuples to all already tagged extensions if - when more than one Python 3 version is supported (closes: 733128). - - -- Matthias Klose Tue, 07 Jan 2014 23:11:01 +0100 - -dh-python (1.20131021-1ubuntu7) trusty; urgency=medium - - * Fix dhpython/_defaults.py. Still doesn't rename 3.4 extensions - to the multiarch name. - - -- Matthias Klose Mon, 30 Dec 2013 20:55:17 +0100 - -dh-python (1.20131021-1ubuntu6) trusty; urgency=medium - - * Disable the correct failing test. - - -- Matthias Klose Sat, 21 Dec 2013 17:15:02 +0100 - -dh-python (1.20131021-1ubuntu5) trusty; urgency=low - - * Don't create extension symlinks in /usr/lib/pyshared/pythonX.Y anymore. - * Disable nosetests in autopkg tests until these are fixed. - * dhpython/_defaults.py: Add python3.4 as a supported version. - - -- Matthias Klose Sat, 21 Dec 2013 14:50:06 +0100 - -dh-python (1.20131021-1ubuntu4) trusty; urgency=medium - - * Don't move files to /usr/share/pyshared anymore. - - -- Matthias Klose Fri, 20 Dec 2013 00:39:05 +0100 - -dh-python (1.20131021-1ubuntu3) trusty; urgency=medium - - * Make the package Multi-Arch: foreign. - - -- Matthias Klose Sat, 07 Dec 2013 19:32:35 +0100 - -dh-python (1.20131021-1ubuntu2) trusty; urgency=low - - * Add drop_nonexisting_versions.patch: In tests/Makefile, drop Python 2.6 - and 3.2 as supported, we do not have them in Debian and Ubuntu any more. - (Closes: #727674) - - -- Martin Pitt Tue, 05 Nov 2013 08:52:12 +0100 - -dh-python (1.20131021-1ubuntu1) trusty; urgency=low - - * Add missing python3-all-dbg test dependency for debian/tests/nosetests. - - -- Martin Pitt Thu, 24 Oct 2013 09:44:27 +0200 - dh-python (1.20131021-1) unstable; urgency=low * dh_python2: fix renaming debug extensions with multiarch tuples diff -Nru dh-python-1.20140128/debian/control dh-python-2.20160818~bpo8+1~trusty/debian/control --- dh-python-1.20140128/debian/control 2014-03-10 10:56:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/debian/control 2016-06-17 20:05:56.000000000 +0000 @@ -1,22 +1,25 @@ Source: dh-python Section: python Priority: optional -Maintainer: Ubuntu Developers -XSBC-Original-Maintainer: Piotr Ożarowski +Maintainer: Piotr Ożarowski Uploaders: Stefano Rivera , Barry Warsaw -Build-Depends: debhelper (>= 9), python3-minimal, libpython3-stdlib, +Build-Depends: debhelper (>= 9), python3-minimal, libpython3-stdlib, libdpkg-perl, # provides rst2man command (python3-docutils not used to avoid circular deps): - python-docutils -Standards-Version: 3.9.5 -Vcs-Git: git://anonscm.debian.org/dh-python/dh-python.git -Vcs-Browser: http://anonscm.debian.org/gitweb/?p=dh-python/dh-python.git + python-docutils, +# used by tests: (disabled to avoid circular deps with python3) +# python3-nose, +# python3-all, python3-all-dbg, python3-all-dev, +# python-all, python-all-dbg, python-all-dev +Standards-Version: 3.9.8 +Vcs-Git: https://anonscm.debian.org/git/dh-python/dh-python.git +Vcs-Browser: https://anonscm.debian.org/cgit/dh-python/dh-python.git X-Python3-Version: >= 3.2 -XS-Testsuite: autopkgtest Package: dh-python Architecture: all Multi-Arch: foreign Depends: ${misc:Depends}, ${python3:Depends} +Suggests: libdpkg-perl Breaks: # due to /usr/bin/dh_python3 and debhelper files python3 (<< 3.3.2-4~) diff -Nru dh-python-1.20140128/debian/docs dh-python-2.20160818~bpo8+1~trusty/debian/docs --- dh-python-1.20140128/debian/docs 2014-03-10 10:56:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/debian/docs 2016-06-17 20:05:56.000000000 +0000 @@ -1 +1,2 @@ pydist/README.PyDist +README.rst diff -Nru dh-python-1.20140128/debian/patches/no-pyshared.diff dh-python-2.20160818~bpo8+1~trusty/debian/patches/no-pyshared.diff --- dh-python-1.20140128/debian/patches/no-pyshared.diff 2014-03-10 10:56:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/debian/patches/no-pyshared.diff 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -Index: b/dh_python2 -=================================================================== ---- a/dh_python2 -+++ b/dh_python2 -@@ -85,10 +85,13 @@ - share_2x(dir1, dir2, dc) - elif len(pubvers) == 1: - # TODO: remove this once file conflicts will not be needed anymore -- move_to_pyshared(interpreter.sitedir(package, pubvers[0])) -+ # for trusty: don't install into pyshared. -+ #move_to_pyshared(sitedir(pubvers[0], package)) -+ pass - -- for version in stats['ext_vers']: -- create_ext_links(interpreter.sitedir(package, version)) -+ # for trusty: don't install into pyshared. -+ #for version in stats['ext_vers']: -+ # create_ext_links(interpreter.sitedir(package, version)) - - if options.guess_versions and pubvers: - for version in get_requested_versions('cpython2', options.vrange): diff -Nru dh-python-1.20140128/debian/patches/no-python2.6.diff dh-python-2.20160818~bpo8+1~trusty/debian/patches/no-python2.6.diff --- dh-python-1.20140128/debian/patches/no-python2.6.diff 2014-03-24 16:36:19.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/debian/patches/no-python2.6.diff 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -Index: dh-python-1.20140128/tests/t202/Makefile -=================================================================== ---- dh-python-1.20140128.orig/tests/t202/Makefile 2014-01-28 18:20:25.000000000 +0100 -+++ dh-python-1.20140128/tests/t202/Makefile 2014-03-24 17:24:28.459439873 +0100 -@@ -4,7 +4,7 @@ - clean: clean-common - - check: -- test -f debian/python-foo/usr/lib/python2.6/dist-packages/foo.py -- test -f debian/python-foo/usr/lib/python2.6/dist-packages/bar/bar.py -+ test -f debian/python-foo/usr/lib/python2.7/dist-packages/foo.py -+ test -f debian/python-foo/usr/lib/python2.7/dist-packages/bar/bar.py - grep -q pycompile debian/python-foo/DEBIAN/postinst - grep -q pyclean debian/python-foo/DEBIAN/prerm -Index: dh-python-1.20140128/tests/t204/Makefile -=================================================================== ---- dh-python-1.20140128.orig/tests/t204/Makefile 2014-01-28 18:20:25.000000000 +0100 -+++ dh-python-1.20140128/tests/t204/Makefile 2014-03-24 17:32:41.815422300 +0100 -@@ -5,7 +5,7 @@ - - check: - grep -q python2.6 debian/foo/usr/share/foo/foo.py -- grep -q Depends:.*python2.6 debian/foo/DEBIAN/control -+ grep -q Depends:.*python debian/foo/DEBIAN/control - #grep -q python2.5 debian/foo/usr/share/bar/bar.py - #grep -q Depends:.*python2.5 debian/foo/DEBIAN/control - grep -q python2.4 debian/foo/usr/share/foo/baz.py -Index: dh-python-1.20140128/tests/t206/Makefile -=================================================================== ---- dh-python-1.20140128.orig/tests/t206/Makefile 2014-01-28 18:20:25.000000000 +0100 -+++ dh-python-1.20140128/tests/t206/Makefile 2014-03-24 17:34:39.211418118 +0100 -@@ -13,6 +13,6 @@ - grep -q '\-V 2.5 /usr/share/bar25' debian/foo/usr/share/python/runtime.d/foo.rtupdate - grep -q '/usr/share/bar25 \-V 2.5' debian/foo/DEBIAN/postinst - # python2.6 hardcoded via shebang -- grep -q Depends:.*python2.6 debian/foo/DEBIAN/control -+ #grep -q Depends:.*python2.6 debian/foo/DEBIAN/control - grep -q '\-V 2.6 /usr/share/foo' debian/foo/usr/share/python/runtime.d/foo.rtupdate - grep -q '/usr/share/foo \-V 2.6' debian/foo/DEBIAN/postinst diff -Nru dh-python-1.20140128/debian/patches/no-python3.3.diff dh-python-2.20160818~bpo8+1~trusty/debian/patches/no-python3.3.diff --- dh-python-1.20140128/debian/patches/no-python3.3.diff 2014-03-24 14:32:05.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/debian/patches/no-python3.3.diff 1970-01-01 00:00:00.000000000 +0000 @@ -1,147 +0,0 @@ -Index: b/dhpython/interpreter.py -=================================================================== ---- a/dhpython/interpreter.py -+++ b/dhpython/interpreter.py -@@ -309,8 +309,8 @@ - >>> i = Interpreter('python') - >>> i.cache_file('foo.py', Version('3.1')) - 'foo.pyc' -- >>> i.cache_file('bar/foo.py', '3.3') -- 'bar/__pycache__/foo.cpython-33.pyc' -+ >>> i.cache_file('bar/foo.py', '3.4') -+ 'bar/__pycache__/foo.cpython-34.pyc' - """ - version = Version(version or self.version) - last_char = 'o' if '-O' in self.options else 'c' -@@ -335,8 +335,8 @@ - """Return Python magic tag (used in __pycache__ dir to tag files). - - >>> i = Interpreter('python') -- >>> i.magic_tag(version='3.3') -- 'cpython-33' -+ >>> i.magic_tag(version='3.4') -+ 'cpython-34' - """ - version = Version(version or self.version) - if self.impl.startswith('cpython') and version << Version('3.2'): -@@ -378,8 +378,8 @@ - - >>> Interpreter('python2.7').include_dir - '/usr/include/python2.7' -- >>> Interpreter('python3.3-dbg').include_dir -- '/usr/include/python3.3dm' -+ >>> Interpreter('python3.4-dbg').include_dir -+ '/usr/include/python3.4dm' - """ - if self.impl == 'pypy': - return '/usr/lib/pypy/include' -@@ -482,7 +482,7 @@ - - >>> Interpreter('python3.1').suggest_pkg_name('foo') - 'python3-foo' -- >>> Interpreter('python3.3').suggest_pkg_name('foo') -+ >>> Interpreter('python3.4').suggest_pkg_name('foo') - 'python3-foo' - >>> Interpreter('python2.7-dbg').suggest_pkg_name('bar') - 'python-bar-dbg' -Index: b/pybuild -=================================================================== ---- a/pybuild -+++ b/pybuild -@@ -102,7 +102,7 @@ - - def get_option(name, interpreter=None, version=None, default=None): - if interpreter: -- # try PYBUILD_NAME_python3.3-dbg (or hardcoded interpreter) -+ # try PYBUILD_NAME_python3.4-dbg (or hardcoded interpreter) - i = interpreter.format(version=version or '') - opt = "PYBUILD_{}_{}".format(name.upper(), i) - if opt in environ: -Index: b/pybuild.rst -=================================================================== ---- a/pybuild.rst -+++ b/pybuild.rst -@@ -191,8 +191,8 @@ - * `--disable test/python2.5-dbg` - disables tests for python2.5-dbg - * `--disable '2.4 2.7'` - disables all actions for version 2.4 and 2.7 - * `PYBUILD_DISABLE_python2=1` - disables all actions for Python 2.X --* `PYBUILD_DISABLE_python3.3=test` - disables tests for Python 3.3 --* `PYBUILD_DISABLE=test/python3.3` - same as above -+* `PYBUILD_DISABLE_python3.4=test` - disables tests for Python 3.3 -+* `PYBUILD_DISABLE=test/python3.4` - same as above - * `PYBUILD_DISABLE=configure/python3 2.4 pypy` - disables configure - action for all python3 interpreters, all actions for version 2.4, and - all actions for pypy -Index: b/tests/t304/Makefile -=================================================================== ---- a/tests/t304/Makefile -+++ b/tests/t304/Makefile -@@ -6,10 +6,10 @@ - check: - # python3.2 hardcoded via `dh_python3 --shebang ...python3.2` - grep -q '#! /usr/bin/python3.2 -OO' debian/foo/usr/share/baz32/baz.py -- # python3.3 hardcoded via shebang -- grep -q '/usr/share/foo \-V 3.3' debian/foo/DEBIAN/postinst -+ # python3.4 hardcoded via shebang -+ grep -q '/usr/share/foo \-V 3.4' debian/foo/DEBIAN/postinst - # /env removed from shebang - grep -q '#! /usr/bin/python3' debian/foo/usr/share/bar/bar.py - # /local removed from shebang - grep -q '#! /usr/bin/python3' debian/foo/usr/share/foo/baz.py -- grep -q '#! /usr/bin/python3.3' debian/foo/usr/share/foo/foo.py -+ grep -q '#! /usr/bin/python3.4' debian/foo/usr/share/foo/foo.py -Index: b/tests/t304/foo.py -=================================================================== ---- a/tests/t304/foo.py -+++ b/tests/t304/foo.py -@@ -1,2 +1,2 @@ --#!/usr/local/bin/python3.3 --"/usr/local/bin/python3.3 hardcoded in shebang" -+#!/usr/local/bin/python3.4 -+"/usr/local/bin/python3.4 hardcoded in shebang" -Index: b/tests/test_interpreter.py -=================================================================== ---- a/tests/test_interpreter.py -+++ b/tests/test_interpreter.py -@@ -93,26 +93,26 @@ - self.assertIsNone(i.check_extname('foo.abi3.so')) - self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), r'foo/bar/bazmodule.cpython-32dmu.so') - -- @unittest.skipUnless(exists('/usr/bin/python3.3'), 'python3.3 is not installed') -- def test_python33(self): -- i = Interpreter('python3.3') -- self.assertEqual(i.soabi(), 'cpython-33m') -- self.assertEqual(i.check_extname('foo.so'), r'foo.cpython-33m-MYARCH.so') -+ @unittest.skipUnless(exists('/usr/bin/python3.4'), 'python3.4 is not installed') -+ def test_python34(self): -+ i = Interpreter('python3.4') -+ self.assertEqual(i.soabi(), 'cpython-34m') -+ self.assertEqual(i.check_extname('foo.so'), r'foo.cpython-34m-MYARCH.so') - self.assertIsNone(i.check_extname('foo.cpython-32m.so')) # different version -- self.assertIsNone(i.check_extname('foo.cpython-33m-OTHER.so')) # different architecture -- self.assertEqual(i.check_extname('foo.cpython-33m.so'), r'foo.cpython-33m-MYARCH.so') -+ self.assertIsNone(i.check_extname('foo.cpython-34m-OTHER.so')) # different architecture -+ self.assertEqual(i.check_extname('foo.cpython-34m.so'), r'foo.cpython-34m-MYARCH.so') - self.assertIsNone(i.check_extname('foo.abi3.so')) -- self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), r'foo/bar/baz.cpython-33m-MYARCH.so') -+ self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), r'foo/bar/baz.cpython-34m-MYARCH.so') - -- @unittest.skipUnless(exists('/usr/bin/python3.3-dbg'), 'python3.3-dbg is not installed') -- def test_python33dbg(self): -- i = Interpreter('python3.3-dbg') -- self.assertEqual(i.soabi(), 'cpython-33dm') -- self.assertEqual(i.check_extname('foo.so'), r'foo.cpython-33dm-MYARCH.so') -+ @unittest.skipUnless(exists('/usr/bin/python3.4-dbg'), 'python3.4-dbg is not installed') -+ def test_python34dbg(self): -+ i = Interpreter('python3.4-dbg') -+ self.assertEqual(i.soabi(), 'cpython-34dm') -+ self.assertEqual(i.check_extname('foo.so'), r'foo.cpython-34dm-MYARCH.so') - self.assertIsNone(i.check_extname('foo.cpython-32m.so')) # different version -- self.assertIsNone(i.check_extname('foo.cpython-33m-OTHER.so')) # different architecture -+ self.assertIsNone(i.check_extname('foo.cpython-34m-OTHER.so')) # different architecture - self.assertIsNone(i.check_extname('foo.abi3.so')) -- self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), r'foo/bar/baz.cpython-33dm-MYARCH.so') -+ self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), r'foo/bar/baz.cpython-34dm-MYARCH.so') - - def test_version(self): - i = Interpreter(impl='cpython2') diff -Nru dh-python-1.20140128/debian/patches/python3.4.diff dh-python-2.20160818~bpo8+1~trusty/debian/patches/python3.4.diff --- dh-python-1.20140128/debian/patches/python3.4.diff 2014-03-23 08:17:23.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/debian/patches/python3.4.diff 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -Index: b/dhpython/_defaults.py -=================================================================== ---- a/dhpython/_defaults.py -+++ b/dhpython/_defaults.py -@@ -27,11 +27,11 @@ - - SUPPORTED = { - 'cpython2': [(2, 7)], -- 'cpython3': [(3, 3)], -+ 'cpython3': [(3, 4)], - 'pypy': [(2, 0)]} - DEFAULT = { - 'cpython2': (2, 7), -- 'cpython3': (3, 3), -+ 'cpython3': (3, 4), - 'pypy': (2, 0)} - - log = logging.getLogger('dhpython') -Index: b/tests/Makefile -=================================================================== ---- a/tests/Makefile -+++ b/tests/Makefile -@@ -3,9 +3,9 @@ - # hardcode default/supported Python versions to make tests more reliable - # Note that all these packages have to be installed during tests - export DEBPYTHON_DEFAULT=2.7 --export DEBPYTHON_SUPPORTED=2.6,2.7 --export DEBPYTHON3_DEFAULT=3.3 --export DEBPYTHON3_SUPPORTED=3.2,3.3 -+export DEBPYTHON_SUPPORTED=2.7 -+export DEBPYTHON3_DEFAULT=3.4 -+export DEBPYTHON3_SUPPORTED=3.4 - - # enable or disable tests here: - TESTS := test101 test201 test202 test203 test204 test205 test206 test207 test301 test302 test303 test304 diff -Nru dh-python-1.20140128/debian/patches/rmdirs.diff dh-python-2.20160818~bpo8+1~trusty/debian/patches/rmdirs.diff --- dh-python-1.20140128/debian/patches/rmdirs.diff 2014-03-10 10:56:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/debian/patches/rmdirs.diff 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ ---- a/dhpython/fs.py -+++ b/dhpython/fs.py -@@ -22,7 +22,7 @@ - import os - import re - from filecmp import cmp as cmpfile --from os.path import exists, isdir, islink, join, split, splitext -+from os.path import exists, dirname, isdir, islink, join, split, splitext - from shutil import rmtree - from stat import ST_MODE, S_IXUSR, S_IXGRP, S_IXOTH - from dhpython import MULTIARCH_DIR_TPL -@@ -47,8 +47,12 @@ - log.debug('moving files from %s to %s', srcdir, dstdir) - share_files(srcdir, dstdir, interpreter, options) - parent_dir = '/'.join(srcdir.split('/')[:-1]) -- if exists(parent_dir) and not os.listdir(parent_dir): -- os.rmdir(parent_dir) -+ while parent_dir: -+ if exists(parent_dir): -+ if os.listdir(parent_dir): -+ break -+ os.rmdir(parent_dir) -+ parent_dir = dirname(parent_dir) - - # do the same with debug locations - dstdir = interpreter.sitedir(package, gdb=True) -@@ -57,8 +61,12 @@ - log.debug('moving files from %s to %s', srcdir, dstdir) - share_files(srcdir, dstdir, interpreter, options) - parent_dir = '/'.join(srcdir.split('/')[:-1]) -- if exists(parent_dir) and not os.listdir(parent_dir): -- os.rmdir(parent_dir) -+ while parent_dir: -+ if exists(parent_dir): -+ if os.listdir(parent_dir): -+ break -+ os.rmdir(parent_dir) -+ parent_dir = dirname(parent_dir) - - - def share_files(srcdir, dstdir, interpreter, options): diff -Nru dh-python-1.20140128/debian/patches/series dh-python-2.20160818~bpo8+1~trusty/debian/patches/series --- dh-python-1.20140128/debian/patches/series 2014-03-24 16:24:08.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -no-pyshared.diff -python3.4.diff -rmdirs.diff -no-python3.3.diff -no-python2.6.diff diff -Nru dh-python-1.20140128/debian/preinst dh-python-2.20160818~bpo8+1~trusty/debian/preinst --- dh-python-1.20140128/debian/preinst 1970-01-01 00:00:00.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/debian/preinst 2016-06-17 20:05:56.000000000 +0000 @@ -0,0 +1,14 @@ +#!/bin/sh +set -e + +# ugly hack, but dpkg-divert's manpage isn't clear enough to me +if [ -f /usr/bin/dh_python2.real ]; then + rm -f /usr/bin/dh_python2 + dpkg-divert --remove --rename --divert /usr/bin/dh_python2.real /usr/bin/dh_python2 +fi +if [ -f /usr/share/man/man1/dh_python2.real.1.gz ]; then + rm -f /usr/share/man/man1/dh_python2.1.gz + dpkg-divert --remove --rename --divert /usr/share/man/man1/dh_python2.real.1.gz /usr/share/man/man1/dh_python2.1.gz +fi + +#DEBHELPER# diff -Nru dh-python-1.20140128/debian/prerm dh-python-2.20160818~bpo8+1~trusty/debian/prerm --- dh-python-1.20140128/debian/prerm 1970-01-01 00:00:00.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/debian/prerm 2016-06-17 20:05:56.000000000 +0000 @@ -0,0 +1,6 @@ +#! /bin/sh +set -e + +#DEBHELPER# + +find /usr/share/dh-python/ -type d -name __pycache__ -empty -print0 | xargs --null --no-run-if-empty rmdir diff -Nru dh-python-1.20140128/debian/rules dh-python-2.20160818~bpo8+1~trusty/debian/rules --- dh-python-1.20140128/debian/rules 2014-03-10 10:56:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/debian/rules 2016-06-17 20:05:56.000000000 +0000 @@ -8,7 +8,9 @@ dh_clean override_dh_auto_test: - # FIXME + #make tests + # FIXME: enable above line once python3 doesn't depend on dh-python anymore + # (i.e. there are no circular dependencies) override_dh_auto_install: DESTDIR=debian/dh-python PREFIX=/usr make install manpages diff -Nru dh-python-1.20140128/debian/source/format dh-python-2.20160818~bpo8+1~trusty/debian/source/format --- dh-python-1.20140128/debian/source/format 2014-03-10 10:56:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/debian/source/format 2016-06-17 20:05:56.000000000 +0000 @@ -1 +1 @@ -3.0 (quilt) +3.0 (native) diff -Nru dh-python-1.20140128/dh/pybuild.pm dh-python-2.20160818~bpo8+1~trusty/dh/pybuild.pm --- dh-python-1.20140128/dh/pybuild.pm 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dh/pybuild.pm 2016-08-27 07:39:16.000000000 +0000 @@ -8,6 +8,8 @@ package Debian::Debhelper::Buildsystem::pybuild; use strict; +use Dpkg::Control; +use Dpkg::Changelog::Debian; use Debian::Debhelper::Dh_Lib qw(error doit); use base 'Debian::Debhelper::Buildsystem'; @@ -44,14 +46,14 @@ sub configure { my $this=shift; foreach my $command ($this->pybuild_commands('configure', @_)) { - doit(@$command, '--dir', $this->get_sourcedir()); + doit(@$command); } } sub build { my $this=shift; foreach my $command ($this->pybuild_commands('build', @_)) { - doit(@$command, '--dir', $this->get_sourcedir()); + doit(@$command); } } @@ -59,21 +61,21 @@ my $this=shift; my $destdir=shift; foreach my $command ($this->pybuild_commands('install', @_)) { - doit(@$command, '--dir', $this->get_sourcedir(), '--dest-dir', $destdir); + doit(@$command, '--dest-dir', $destdir); } } sub test { my $this=shift; foreach my $command ($this->pybuild_commands('test', @_)) { - doit(@$command, '--dir', $this->get_sourcedir()); + doit(@$command); } } sub clean { my $this=shift; foreach my $command ($this->pybuild_commands('clean', @_)) { - doit(@$command, '--dir', $this->get_sourcedir()); + doit(@$command); } doit('rm', '-rf', '.pybuild/'); doit('find', '.', '-name', '*.pyc', '-exec', 'rm', '{}', ';'); @@ -85,6 +87,12 @@ my @options = @_; my @result; + my $dir = $this->get_sourcedir(); + if (not grep {$_ eq '--dir'} @options and $dir ne '.') { + # if --dir is not passed, PYBUILD_DIR can be used + push @options, '--dir', $dir; + } + if ($ENV{'PYBUILD_INTERPRETERS'}) { push @result, ['pybuild', "--$step", @options]; } @@ -93,6 +101,40 @@ # NOTE: possible problems with alternative/versioned dependencies my @deps = $this->python_build_dependencies(); + # When depends on python{3,}-setuptools-scm, set + # SETUPTOOLS_SCM_PRETEND_VERSION to upstream version + # Without this, setuptools-scm tries to detect current + # version from git tag, which fails for debian tags + # (debian/) sometimes. + if ((grep /(pypy|python[0-9\.]*)-setuptools-scm/, @deps) && !$ENV{'SETUPTOOLS_SCM_PRETEND_VERSION'}) { + my $changelog = Dpkg::Changelog::Debian->new(range => {"count" => 1}); + $changelog->load("debian/changelog"); + my $version = @{$changelog}[0]->get_version(); + $version =~ s/-[^-]+$//; # revision + $version =~ s/^\d+://; # epoch + $ENV{'SETUPTOOLS_SCM_PRETEND_VERSION'} = $version; + } + + my @py2opts = ('pybuild', "--$step"); + my @py3opts = ('pybuild', "--$step"); + + if ($step == 'test' and $ENV{'PYBUILD_TEST_PYTEST'} ne '1' and + $ENV{'PYBUILD_TEST_NOSE'} ne '1' and + $ENV{'PYBUILD_TEST_TOX'} ne '1') { + if (grep {$_ eq 'python-tox'} @deps and $ENV{'PYBUILD_TEST_TOX'} ne '0') { + push @py2opts, '--test-tox'} + elsif (grep {$_ eq 'python-pytest'} @deps and $ENV{'PYBUILD_TEST_PYTEST'} ne '0') { + push @py2opts, '--test-pytest'} + elsif (grep {$_ eq 'python-nose'} @deps and $ENV{'PYBUILD_TEST_NOSE'} ne '0') { + push @py2opts, '--test-nose'} + if (grep {$_ eq 'python3-tox'} @deps and $ENV{'PYBUILD_TEST_TOX'} ne '0') { + push @py3opts, '--test-tox'} + elsif (grep {$_ eq 'python3-pytest'} @deps and $ENV{'PYBUILD_TEST_PYTEST'} ne '0') { + push @py3opts, '--test-pytest'} + elsif (grep {$_ eq 'python3-nose'} @deps and $ENV{'PYBUILD_TEST_NOSE'} ne '0') { + push @py3opts, '--test-nose'} + } + my $pyall = 0; my $pyalldbg = 0; my $py3all = 0; @@ -104,41 +146,39 @@ if ($this->{pyvers}) { if (grep {$_ eq 'python-all' or $_ eq 'python-all-dev'} @deps) { $pyall = 1; - push @result, ['pybuild', "--$step", '-i', $i, '-p', $this->{pyvers}, @options]; + push @result, [@py2opts, '-i', $i, '-p', $this->{pyvers}, @options]; } if (grep {$_ eq 'python-all-dbg'} @deps) { $pyalldbg = 1; - push @result, ['pybuild', "--$step", '-i', "$i-dbg", '-p', $this->{pyvers}, @options]; + push @result, [@py2opts, '-i', "$i-dbg", '-p', $this->{pyvers}, @options]; } } if ($this->{pydef}) { if (not $pyall and grep {$_ eq 'python' or $_ eq 'python-dev'} @deps) { - push @result, ['pybuild', "--$step", '-i', $i, '-p', $this->{pydef}, @options]; + push @result, [@py2opts, '-i', $i, '-p', $this->{pydef}, @options]; } if (not $pyalldbg and grep {$_ eq 'python-dbg'} @deps) { - push @result, ['pybuild', "--$step", '-i', "$i-dbg", '-p', $this->{pydef}, @options]; + push @result, [@py2opts, '-i', "$i-dbg", '-p', $this->{pydef}, @options]; } } # Python 3 if ($this->{py3vers}) { - my $i = 'python{version}'; if (grep {$_ eq 'python3-all' or $_ eq 'python3-all-dev'} @deps) { $py3all = 1; - push @result, ['pybuild', "--$step", '-i', $i, '-p', $this->{py3vers}, @options]; + push @result, [@py3opts, '-i', $i, '-p', $this->{py3vers}, @options]; } if (grep {$_ eq 'python3-all-dbg'} @deps) { $py3alldbg = 1; - push @result, ['pybuild', "--$step", '-i', "$i-dbg", '-p', $this->{py3vers}, @options]; + push @result, [@py3opts, '-i', "$i-dbg", '-p', $this->{py3vers}, @options]; } } if ($this->{py3def}) { if (not $py3all and grep {$_ eq 'python3' or $_ eq 'python3-dev'} @deps) { - # TODO: "python3" case: should X-Python3-Version header in debian/control be also required here? - push @result, ['pybuild', "--$step", '-i', $i, '-p', $this->{py3def}, @options]; + push @result, [@py3opts, '-i', $i, '-p', $this->{py3def}, @options]; } if (not $py3alldbg and grep {$_ eq 'python3-dbg'} @deps) { - push @result, ['pybuild', "--$step", '-i', "$i-dbg", '-p', $this->{py3def}, @options]; + push @result, [@py3opts, '-i', "$i-dbg", '-p', $this->{py3def}, @options]; } } # TODO: pythonX.Y → `pybuild -i python{version} -p X.Y` @@ -148,6 +188,9 @@ push @result, ['pybuild', "--$step", '-i', 'pypy', '-p', $this->{pypydef}, @options]; } } + if (!@result) { + die('E: Please add apropriate interpreter package to Build-Depends, see pybuild(1) for details') + } return @result; } @@ -155,15 +198,18 @@ my $this=shift; my @result; - open (CONTROL, 'debian/control') || error("cannot read debian/control: $!\n"); - foreach my $builddeps (join('', ) =~ - /^Build-Depends[^:]*:.*\n(?:^[^\w\n#].*\n)*/gmi) { - while ($builddeps =~ /[\s,](pypy|python[0-9\.]*(-all)?((-dev)|(-dbg))?)[\s,]|$/g) { - if ($1) {push @result, $1}; + my $c = Dpkg::Control->new(type => CTRL_INFO_SRC); + if ($c->load('debian/control')) { + for my $field (grep /^Build-Depends/, keys %{$c}) { + my $builddeps = $c->{$field}; + while ($builddeps =~ /(?:^|[\s,])((pypy|python)[0-9\.]*(-[^\s,]+)?)(?:[\s,]|$)/g) { + my $dep = $1; + $dep =~ s/:any$//; + if ($dep) {push @result, $dep}; + } } } - close CONTROL; return @result; } diff -Nru dh-python-1.20140128/dh_pypy dh-python-2.20160818~bpo8+1~trusty/dh_pypy --- dh-python-1.20140128/dh_pypy 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dh_pypy 2016-08-27 07:39:16.000000000 +0000 @@ -48,15 +48,17 @@ class Scanner(Scan): def handle_ext(self, fpath): + # PyPy doesn't include interpreter version in SONAME, + # its ABI is stable so f.e. PyPy 4.0 has "pypy-26" in SONAME path, fname = fpath.rsplit('/', 1) - tagver = EXTFILE_RE.search(fname) - if tagver is None: + soabi = EXTFILE_RE.search(fname) + if soabi is None: return - tagver = tagver.groupdict()['ver'] - if tagver is None: + soabi = soabi.groupdict()['soabi'] + if soabi is None: return - tagver = Version("%s.%s" % (tagver[0], tagver[1])) - return tagver + self.current_result.setdefault('ext_soabi', set()).add(soabi) + return def main(): @@ -97,12 +99,21 @@ help='translate given requirements into Debian ' 'dependencies and add them to ${pypy:Depends}. ' 'Use it for missing items in requires.txt.') + parser.add_option('--depends-section', action='append', + help='translate requirements from given section into Debian ' + 'dependencies and add them to ${python3:Depends}') parser.add_option('--recommends', action='append', help='translate given requirements into Debian ' 'dependencies and add them to ${pypy:Recommends}') + parser.add_option('--recommends-section', action='append', + help='translate requirements from given section into Debian ' + 'dependencies and add them to ${python3:Recommends}') parser.add_option('--suggests', action='append', help='translate given requirements into Debian ' 'dependencies and add them to ${pypy:Suggests}') + parser.add_option('--suggests-section', action='append', + help='translate requirements from given section into Debian ' + 'dependencies and add them to ${python3:Suggests}') parser.add_option('--requires', action='append', help='translate requirements from given file into Debian ' 'dependencies and add them to ${pypy:Depends}') @@ -159,14 +170,14 @@ except Exception as e: log.error('cannot initialize DebHelper: %s', e) exit(2) + if not dh.packages: + log.error('no package to act on (pypy-foo or one with ${pypy:Depends} in Depends)') + # exit(7) if not options.vrange and dh.python_version: options.vrange = VersionRange(dh.python_version) interpreter = Interpreter('pypy') for package, pdetails in dh.packages.items(): - if options.arch is False and pdetails['arch'] != 'all' or \ - options.arch is True and pdetails['arch'] == 'all': - continue log.debug('processing package %s...', package) interpreter.debug = package.endswith('-dbg') @@ -179,7 +190,7 @@ fix_locations(package, interpreter, SUPPORTED, options) stats = Scanner(interpreter, package, private_dir, options).result - dependencies = Dependencies(package, 'pypy') + dependencies = Dependencies(package, 'pypy', dh.build_depends) dependencies.parse(stats, options) if stats['ext_vers']: @@ -199,7 +210,7 @@ dh.autoscript(package, 'postinst', 'postinst-pypycompile', args) dh.autoscript(package, 'prerm', 'prerm-pypyclean', '') pypyclean_added = True - for pdir, details in stats['private_dirs'].items(): + for pdir, details in sorted(stats['private_dirs'].items()): if not details.get('compile'): continue if not pypyclean_added: diff -Nru dh-python-1.20140128/dh_pypy.rst dh-python-2.20160818~bpo8+1~trusty/dh_pypy.rst --- dh-python-1.20140128/dh_pypy.rst 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dh_pypy.rst 2016-08-27 07:39:16.000000000 +0000 @@ -31,14 +31,34 @@ dependencies ~~~~~~~~~~~~ -dh_pypy tries to translate Python dependencies from requires.txt file to -Debian dependencies. Use debian/pypydist-overrides or --no-guessing-deps option -to override it if the guess is incorrect. If you want dh_pypy to generate -more strict dependencies (f.e. to avoid ABI problems) create -debian/pypy-foo.pydist file. See /usr/share/doc/dh-python/README.PyDist -for more information. If the pydist file contains PEP386 flag or set of (uscan -like) rules, dh_pypy will make the depedency versioned (version requirements -are ignored by default). +dh_pypy tries to translate Python dependencies from the `requires.txt` file +to Debian dependencies. In many cases, this works without any additional +configuration because dh_pypy comes with a build-in mapping of Python module +names to Debian packages that is periodically regenerated from the Debian +archive. By default, the version information in the Python dependencies is +discarded. If you want dh_pypy to generate more strict dependencies (e.g. to +avoid ABI problems), or if the automatic mapping does not work correctly for +your package, you have to provide dh_pypy with additional rules for the +translation of Python module to Debian package dependencies. + +For a package *pypy-foo* that depends on a package *pypy-bar*, there are +two files that may provide such rules: + +#. If the *pypy-foo* source package ships with a + `debian/pypy-overrides` file, this file is used by dh_pypy + during the build of *pypy-foo*. + +#. If the *pypy-bar* source package ships with a + `debian/pypy-bar.pydist` file (and uses dh_pypy), this file + will be included in the binary package as + `/usr/share/dh-python/dist/pypy/pypy-bar`. During the build + of *pypy-foo*, dh_pypy will then find and use the file. + +Both files have the same format described in +`/usr/share/doc/dh-python/README.PyDist`. If all you want is to generate +versioned dependencies (and assuming that the *pypy-bar* package provides +the *pybar* Python module), in most cases it will be sufficient to put the line +``pybar pypy-bar; PEP386`` into either of the above files. private dirs ~~~~~~~~~~~~ @@ -104,12 +124,21 @@ --depends=DEPENDS translate given requirements into Debian dependencies and add them to ${pypy:Depends}. Use it for missing items in requires.txt +--depends-sections=SECTIONS translate requirements from given sections of + requres.txt file into Debian dependencies and add them to ${pypy:Depends}. + --recommends=RECOMMENDS translate given requirements into Debian dependencies and add them to ${pypy:Recommends} +--recommends-sections=SECTIONS translate requirements from given sections of + requres.txt file into Debian dependencies and add them to ${pypy:Recommends}. + --suggests=SUGGESTS translate given requirements into Debian dependencies and add them to ${pypy:Suggests} +--suggests-sections=SECTIONS translate requirements from given sections of + requres.txt file into Debian dependencies and add them to ${pypy:Suggests}. + --requires=FILENAME translate requirements from given file(s) into Debian dependencies and add them to ${pypy:Depends} diff -Nru dh-python-1.20140128/dhpython/build/base.py dh-python-2.20160818~bpo8+1~trusty/dhpython/build/base.py --- dh-python-1.20140128/dhpython/build/base.py 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dhpython/build/base.py 2016-06-17 20:05:56.000000000 +0000 @@ -22,9 +22,9 @@ from functools import wraps from glob import glob1 from os import remove, walk -from os.path import isdir, join +from os.path import exists, isdir, join from subprocess import Popen, PIPE -from shutil import rmtree +from shutil import rmtree, copytree from dhpython.tools import execute try: from shlex import quote @@ -149,8 +149,22 @@ raise NotImplementedError("build method not implemented in %s" % self.NAME) def test(self, context, args): + dirs_to_remove = set() + for dname in ('test', 'tests'): + src_dpath = join(args['dir'], dname) + dst_dpath = join(args['build_dir'], dname) + if isdir(src_dpath): + if not exists(dst_dpath): + copytree(src_dpath, dst_dpath) + dirs_to_remove.add(dst_dpath + '\n') + if not args['args'] and 'PYBUILD_TEST_ARGS' not in context['ENV']\ + and (self.cfg.test_pytest or self.cfg.test_nose): + args['args'] = dname + if dirs_to_remove: + with open(join(args['home_dir'], 'build_dirs_to_rm_before_install'), 'w') as fp: + fp.writelines(dirs_to_remove) if self.cfg.test_nose: - return 'cd {build_dir}; {interpreter} -m nose --with-doctest {args}' + return 'cd {build_dir}; {interpreter} -m nose {args}' elif self.cfg.test_pytest: return 'cd {build_dir}; {interpreter} -m pytest {args}' elif self.cfg.test_tox: diff -Nru dh-python-1.20140128/dhpython/build/plugin_distutils.py dh-python-2.20160818~bpo8+1~trusty/dhpython/build/plugin_distutils.py --- dh-python-1.20140128/dhpython/build/plugin_distutils.py 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dhpython/build/plugin_distutils.py 2016-06-17 20:05:56.000000000 +0000 @@ -41,14 +41,19 @@ fpath = join(args['home_dir'], '.pydistutils.cfg') if not exists(fpath): with open(fpath, 'w', encoding='utf-8') as fp: - fp.writelines(['[clean]\n', - 'all=1\n', - '[build]\n', - 'build-lib={}\n'.format(args['build_dir']), - '[install]\n', - 'install-layout=deb\n', - 'install-scripts=/usr/bin\n', - 'install-lib={}\n'.format(args['install_dir'])]) + lines = ['[clean]\n', + 'all=1\n', + '[build]\n', + 'build-lib={}\n'.format(args['build_dir']), + '[install]\n', + 'force=1\n', + 'install-layout=deb\n', + 'install-scripts=/usr/bin\n', + 'install-lib={}\n'.format(args['install_dir']), + '[easy_install]\n', + 'allow_hosts=None\n'] + log.debug('pydistutils config file:\n%s', ''.join(lines)) + fp.writelines(lines) context['ENV']['HOME'] = args['home_dir'] return func(self, context, args, *oargs, **kwargs) @@ -81,10 +86,9 @@ super(BuildSystem, self).clean(context, args) dpath = join(context['dir'], 'build') isdir(dpath) and rmtree(dpath) - for fname in glob1(context['dir'], '*.egg-info'): - fpath = join(context['dir'], fname) - rmtree(fpath) if isdir(fpath) else remove(fpath) - return '{interpreter} {setup_py} clean {args}' + if exists(args['interpreter'].binary()): + return '{interpreter} {setup_py} clean {args}' + return 0 # no need to invoke anything @shell_command @create_pydistutils_cfg @@ -99,6 +103,11 @@ @shell_command @create_pydistutils_cfg def install(self, context, args): + # remove egg-info dirs from build_dir + for fname in glob1(args['build_dir'], '*.egg-info'): + fpath = join(args['build_dir'], fname) + rmtree(fpath) if isdir(fpath) else remove(fpath) + return '{interpreter.binary_dv} {setup_py} install --root {destdir} {args}' @shell_command diff -Nru dh-python-1.20140128/dhpython/debhelper.py dh-python-2.20160818~bpo8+1~trusty/dhpython/debhelper.py --- dh-python-1.20140128/dhpython/debhelper.py 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dhpython/debhelper.py 2016-08-27 07:39:16.000000000 +0000 @@ -19,11 +19,20 @@ # THE SOFTWARE. import logging +import re from os import makedirs, chmod -from os.path import exists, join, dirname -from dhpython import PKG_NAME_TPLS, RT_LOCATIONS, RT_TPLS +from os.path import basename, exists, join, dirname +from sys import argv +from dhpython import DEPENDS_SUBSTVARS, PKG_NAME_TPLS, RT_LOCATIONS, RT_TPLS log = logging.getLogger('dhpython') +parse_dep = re.compile('''[,\s]* + (?P[^ ]+) + \s* + \(?(?P([>=<]{2,}|=)\s*[^\)]+)?\)? + \s* + (?:\[(?P[^\]]+)\])? + ''', re.VERBOSE).match class DebHelper: @@ -32,9 +41,12 @@ def __init__(self, options, impl='cpython3'): self.options = options self.packages = {} + self.build_depends = {} self.python_version = None source_section = True binary_package = None + build_depends_line = '' + inside_bdepends_field = False # Note that each DebHelper instance supports ONE interpreter type only # it's not possible to mix cpython2, cpython3 and pypy here self.impl = impl @@ -43,6 +55,7 @@ if name != impl: skip_tpl.update(tpls) skip_tpl = tuple(skip_tpl) + substvar = DEPENDS_SUBSTVARS[impl] pkgs = options.package skip_pkgs = options.no_package @@ -53,9 +66,12 @@ raise Exception('cannot find debian/control file') for line in fp: + if line.startswith('#'): + continue if not line.strip(): source_section = False binary_package = None + inside_depends_field = False continue line_l = line.lower() # field names are case-insensitive if binary_package: @@ -63,10 +79,28 @@ continue if line_l.startswith('architecture:'): arch = line[13:].strip() - # TODO: if arch doesn't match current architecture: - #del self.packages[binary_package] - self.packages[binary_package]['arch'] = arch + if options.arch is False and arch != 'all' or\ + options.arch is True and arch == 'all': + # TODO: check also if arch matches current architecture: + del self.packages[binary_package] + else: + self.packages[binary_package]['arch'] = arch continue + if not binary_package.startswith(PKG_NAME_TPLS[impl]): + # package doesn't have common prefix (python-, python3-, pypy-) + # so lets check if Depends contains appropriate substvar + if line_l.startswith('depends:'): + if substvar in line: + continue + inside_depends_field = True + elif inside_depends_field: # multiline continuation + if not line.startswith((' ', '\t')): + inside_depends_field = False + log.debug('skipping package %s (missing %s in Depends)', + binary_package, substvar) + del self.packages[binary_package] + elif substvar in line: + inside_depends_field = None elif line_l.startswith('package:'): binary_package = line[8:].strip() if skip_tpl and binary_package.startswith(skip_tpl): @@ -92,6 +126,27 @@ self.python_version = line[18:].strip() if line_l.startswith('x-python-version:'): self.python_version = line[17:].strip() + elif source_section and line_l.startswith(('build-depends:', 'build-depends-indep:')): + inside_bdepends_field = True + build_depends_line += ',' + line.split(':', 1)[1].strip(', \t\n') + elif inside_bdepends_field: # multiline continuation + if not line.startswith((' ', '\t', '#')): + inside_bdepends_field = False + elif not line.strip().startswith('#'): + build_depends_line += ',' + line.strip(', \t\n') + + for dep1 in build_depends_line.strip(', \t').split(','): + for dep2 in dep1.split('|'): + details = parse_dep(dep2) + if details: + details = details.groupdict() + if details['arch']: + architectures = details['arch'].split() + else: + architectures = [None] + for arch in architectures: + self.build_depends.setdefault(details['name'], + {})[arch] = details['version'] fp.close() log.debug('source=%s, binary packages=%s', self.source_name, @@ -135,14 +190,14 @@ tpl = tplfile.read() if self.options.compile_all and args: # TODO: should args be checked to contain dir name? - tpl = tpl.replace('#PACKAGE#', '') + tpl = tpl.replace('-p #PACKAGE#', '') else: tpl = tpl.replace('#PACKAGE#', package) tpl = tpl.replace('#ARGS#', i) if tpl not in data and tpl not in new_data: new_data += "\n%s" % tpl if new_data: - data += '\n# Automatically added by dhpython:' +\ + data += '\n# Automatically added by {}:'.format(basename(argv[0])) +\ '{}\n# End automatically added section\n'.format(new_data) fp = open(fn, 'w', encoding='utf-8') fp.write(data) diff -Nru dh-python-1.20140128/dhpython/_defaults.py dh-python-2.20160818~bpo8+1~trusty/dhpython/_defaults.py --- dh-python-1.20140128/dhpython/_defaults.py 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dhpython/_defaults.py 2016-08-27 07:39:12.000000000 +0000 @@ -27,12 +27,12 @@ SUPPORTED = { 'cpython2': [(2, 7)], - 'cpython3': [(3, 3)], - 'pypy': [(2, 0)]} + 'cpython3': [(3, 4)], + 'pypy': [(4, 0)]} DEFAULT = { 'cpython2': (2, 7), - 'cpython3': (3, 3), - 'pypy': (2, 0)} + 'cpython3': (3, 4), + 'pypy': (4, 0)} log = logging.getLogger('dhpython') diff -Nru dh-python-1.20140128/dhpython/depends.py dh-python-2.20160818~bpo8+1~trusty/dhpython/depends.py --- dh-python-1.20140128/dhpython/depends.py 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dhpython/depends.py 2016-08-27 07:39:16.000000000 +0000 @@ -19,7 +19,7 @@ # THE SOFTWARE. import logging -from os.path import exists +from os.path import exists, join from dhpython import PKG_PREFIX_MAP, MINPYCDEP from dhpython.pydist import parse_pydep, guess_dependency from dhpython.version import default, supported, VersionRange @@ -30,9 +30,10 @@ class Dependencies: """Store relations (dependencies, etc.) between packages.""" - def __init__(self, package, impl='cpython3'): + def __init__(self, package, impl='cpython3', bdep=None): self.impl = impl self.package = package + bdep = self.bdep = bdep or {} self.is_debug_package = dbgpkg = package.endswith('-dbg') # TODO: move it to PyPy and CPython{2,3} classes @@ -51,6 +52,11 @@ self.ipkg_tpl_ma = self.ipkg_tpl + ':any' self.ipkg_vtpl_ma = self.ipkg_vtpl + ':any' + self.python_dev_in_bd = 'python-dev' in bdep or\ + 'python-all-dev' in bdep or\ + 'python3-dev' in bdep or\ + 'python3-all-dev' in bdep + self.depends = set() self.recommends = [] self.suggests = [] @@ -61,17 +67,17 @@ def export_to(self, dh): """Fill in debhelper's substvars.""" prefix = PKG_PREFIX_MAP.get(self.impl, 'misc') - for i in self.depends: + for i in sorted(self.depends): dh.addsubstvar(self.package, '{}:Depends'.format(prefix), i) - for i in self.recommends: + for i in sorted(self.recommends): dh.addsubstvar(self.package, '{}:Recommends'.format(prefix), i) - for i in self.suggests: + for i in sorted(self.suggests): dh.addsubstvar(self.package, '{}:Suggests'.format(prefix), i) - for i in self.enhances: + for i in sorted(self.enhances): dh.addsubstvar(self.package, '{}:Enhances'.format(prefix), i) - for i in self.breaks: + for i in sorted(self.breaks): dh.addsubstvar(self.package, '{}:Breaks'.format(prefix), i) - for i in self.rtscripts: + for i in sorted(self.rtscripts): dh.add_rtupdate(self.package, i) def __str__(self): @@ -139,6 +145,13 @@ if maxv >= default(self.impl): self.depend("%s (<< %s)" % (tpl_ma, maxv + 1)) + if self.impl == 'pypy' and stats.get('ext_soabi'): + # TODO: make sure alternative is used only for the same extension names + # ie. for foo.ABI1.so, foo.ABI2.so, bar.ABI3,so, bar.ABI4.so generate: + # pypy-abi-ABI1 | pypy-abi-ABI2, pypy-abi-ABI3 | pypy-abi-ABI4 + self.depend('|'.join(soabi.replace('-', '-abi-') + for soabi in sorted(stats['ext_soabi']))) + if stats['ext_vers']: # TODO: what about extensions with stable ABI? sorted_vers = sorted(stats['ext_vers']) @@ -155,7 +168,7 @@ self.depend(MINPYCDEP[self.impl]) for ipreter in stats['shebangs']: - self.depend("%s%s" % (ipreter, ':any' if self.impl == 'pypy' else '')) + self.depend("%s%s" % (ipreter, '' if self.impl == 'pypy' else ':any')) supported_versions = supported(self.impl) default_version = default(self.impl) @@ -172,15 +185,17 @@ if any(True for i in details.get('shebangs', []) if i.version is None): self.depend(tpl_ma) - extensions = sorted(details.get('ext_vers', set())) - #self.depend('|'.join(vtpl % i for i in extensions)) - if extensions: - self.depend("%s (>= %s~)" % (tpl, extensions[0])) - self.depend("%s (<< %s)" % (tpl, extensions[-1] + 1)) - elif details.get('ext_no_version'): - # assume unrecognized extension was built for default interpreter version - self.depend("%s (>= %s~)" % (tpl, default_version)) - self.depend("%s (<< %s)" % (tpl, default_version + 1)) + extensions = False + if self.python_dev_in_bd: + extensions = sorted(details.get('ext_vers', set())) + #self.depend('|'.join(vtpl % i for i in extensions)) + if extensions: + self.depend("%s (>= %s~)" % (tpl, extensions[0])) + self.depend("%s (<< %s)" % (tpl, extensions[-1] + 1)) + elif details.get('ext_no_version'): + # assume unrecognized extension was built for default interpreter version + self.depend("%s (>= %s~)" % (tpl, default_version)) + self.depend("%s (<< %s)" % (tpl, default_version + 1)) if details.get('compile'): if self.impl in MINPYCDEP: @@ -209,28 +224,46 @@ args += " -X '%s'" % pattern.replace("'", r"'\''") self.rtscript((private_dir, args)) + section_options = { + 'depends_sec': options.depends_section, + 'recommends_sec': options.recommends_section, + 'suggests_sec': options.suggests_section, + } if options.guess_deps: for fn in stats['requires.txt']: # TODO: should options.recommends and options.suggests be # removed from requires.txt? - for i in parse_pydep(self.impl, fn): - self.depend(i) + deps = parse_pydep(self.impl, fn, bdep=self.bdep, **section_options) + [self.depend(i) for i in deps['depends']] + [self.recommend(i) for i in deps['recommends']] + [self.suggest(i) for i in deps['suggests']] + for fpath in stats['egg-info']: + with open(fpath, 'r', encoding='utf-8') as fp: + for line in fp: + if line.startswith('Requires: '): + req = line[10:].strip() + self.depend(guess_dependency(self.impl, req, bdep=self.bdep)) # add dependencies from --depends for item in options.depends or []: - self.depend(guess_dependency(self.impl, item)) + self.depend(guess_dependency(self.impl, item, bdep=self.bdep)) # add dependencies from --recommends for item in options.recommends or []: - self.recommend(guess_dependency(self.impl, item)) + self.recommend(guess_dependency(self.impl, item, bdep=self.bdep)) # add dependencies from --suggests for item in options.suggests or []: - self.suggest(guess_dependency(self.impl, item)) + self.suggest(guess_dependency(self.impl, item, bdep=self.bdep)) # add dependencies from --requires for fn in options.requires or []: - if not exists(fn): - log.warn('cannot find requirements file: %s', fn) - continue - for i in parse_pydep(self.impl, fn): - self.depend(i) + fpath = join('debian', self.package, fn) + if not exists(fpath): + fpath = fn + if not exists(fpath): + log.warn('cannot find requirements file: %s', fn) + continue + deps = parse_pydep(self.impl, fpath, bdep=self.bdep, **section_options) + [self.depend(i) for i in deps['depends']] + [self.recommend(i) for i in deps['recommends']] + [self.suggest(i) for i in deps['suggests']] log.debug(self) diff -Nru dh-python-1.20140128/dhpython/fs.py dh-python-2.20160818~bpo8+1~trusty/dhpython/fs.py --- dh-python-1.20140128/dhpython/fs.py 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dhpython/fs.py 2016-06-17 20:05:56.000000000 +0000 @@ -22,7 +22,7 @@ import os import re from filecmp import cmp as cmpfile -from os.path import exists, isdir, islink, join, split, splitext +from os.path import exists, isdir, islink, join, realpath, split, splitext from shutil import rmtree from stat import ST_MODE, S_IXUSR, S_IXGRP, S_IXOTH from dhpython import MULTIARCH_DIR_TPL @@ -46,9 +46,10 @@ # TODO: what about relative symlinks? log.debug('moving files from %s to %s', srcdir, dstdir) share_files(srcdir, dstdir, interpreter, options) - parent_dir = '/'.join(srcdir.split('/')[:-1]) - if exists(parent_dir) and not os.listdir(parent_dir): - os.rmdir(parent_dir) + try: + os.removedirs(srcdir) + except OSError: + pass # do the same with debug locations dstdir = interpreter.sitedir(package, gdb=True) @@ -56,9 +57,10 @@ if isdir(srcdir): log.debug('moving files from %s to %s', srcdir, dstdir) share_files(srcdir, dstdir, interpreter, options) - parent_dir = '/'.join(srcdir.split('/')[:-1]) - if exists(parent_dir) and not os.listdir(parent_dir): - os.rmdir(parent_dir) + try: + os.removedirs(srcdir) + except OSError: + pass def share_files(srcdir, dstdir, interpreter, options): @@ -68,33 +70,41 @@ if not options.no_ext_rename and splitext(i)[-1] == '.so': # try to rename extension here as well (in :meth:`scan` info about # Python version is gone) - version = interpreter.parse_public_version(srcdir) - if version: + version = interpreter.parse_public_dir(srcdir) + # if version is True it means it's unversioned dist-packages dir + if version and version is not True: # note that if ver is empty, default Python version will be used fpath1_orig = fpath1 new_name = interpreter.check_extname(i, version) if new_name: fpath1 = join(srcdir, new_name) - if exists(fpath1): - log.warn('destination file exist, ' - 'cannot rename %s to %s', fpath1_orig, fpath1) - else: - log.info('renaming %s to %s', fpath1_orig, fpath1) - os.renames(fpath1_orig, fpath1) - i = new_name + if exists(fpath1): + log.warn('destination file exist, ' + 'cannot rename %s to %s', fpath1_orig, fpath1) + else: + log.info('renaming %s to %s', fpath1_orig, fpath1) + os.renames(fpath1_orig, fpath1) + i = new_name fpath2 = join(dstdir, i) if not isdir(fpath1) and not exists(fpath2): # do not rename directories here - all .so files have to be renamed first os.renames(fpath1, fpath2) continue - if isdir(fpath1): + if islink(fpath1): + # move symlinks without changing them if they point to the same place + if not exists(fpath2): + os.renames(fpath1, fpath2) + elif realpath(fpath1) == realpath(fpath2): + os.remove(fpath1) + elif isdir(fpath1): share_files(fpath1, fpath2, interpreter, options) elif cmpfile(fpath1, fpath2, shallow=False): os.remove(fpath1) - # XXX: check symlinks - if exists(srcdir) and not os.listdir(srcdir): - os.rmdir(srcdir) + try: + os.removedirs(srcdir) + except OSError: + pass class Scan: @@ -117,6 +127,7 @@ self.options = options self.result = {'requires.txt': set(), + 'egg-info': set(), 'nsp.txt': set(), 'shebangs': set(), 'public_vers': set(), @@ -130,11 +141,26 @@ del dirs[:] continue - self.current_private_dir = None - self.current_pub_version = version = interpreter.parse_public_version(root) - if self.current_pub_version: # i.e. a public site-packages directory + self.current_private_dir = self.current_pub_version = None + version = interpreter.parse_public_dir(root) + if version: + self.current_dir_is_public = True + if version is True: + version = None + else: + self.current_pub_version = version + else: + self.current_dir_is_public = False + + if self.current_dir_is_public: if root.endswith('-packages'): - self.result['public_vers'].add(version) + if version is not None: + self.result['public_vers'].add(version) + for name in ('test', 'tests'): + if name in dirs: + log.debug('removing dist-packages/%s (too common name)', name) + rmtree(join(root, name)) + dirs.remove(name) else: self.current_private_dir = self.check_private_dir(root) if not self.current_private_dir: @@ -208,6 +234,12 @@ if fext == 'py' and self.handle_public_module(fpath) is not False: self.current_result['compile'] = True + if not dirs: + try: + os.removedirs(root) + except OSError: + pass + log.debug("package %s details = %s", package, self.result) @property @@ -222,7 +254,7 @@ def is_unwanted_file(self, fpath): if self.__class__.UNWANTED_FILES.match(fpath): return True - if self.current_pub_version and self.is_dbg_package\ + if self.current_dir_is_public and self.is_dbg_package\ and self.options.clean_dbg_pkg\ and splitext(fpath)[-1][1:] not in ('so', 'h'): return True @@ -260,7 +292,7 @@ This method is invoked for all .so files in public or private directories. """ path, fname = fpath.rsplit('/', 1) - if self.current_pub_version and islink(fpath): + if self.current_dir_is_public and islink(fpath): # replace symlinks with extensions in dist-packages directory dstfpath = fpath links = set() @@ -278,6 +310,7 @@ if MULTIARCH_DIR_TPL.match(fpath): # ignore /lib/i386-linux-gnu/, /usr/lib/x86_64-kfreebsd-gnu/, etc. return fpath + new_fn = self.interpreter.check_extname(fname, self.current_pub_version) if new_fn: # TODO: what about symlinks pointing to this file @@ -365,6 +398,7 @@ else: log.info('renaming %s to %s', name, clean_name) os.rename(fpath, join(root, clean_name)) + self.result['egg-info'].add(join(root, clean_name)) def cleanup(self): if self.is_dbg_package and self.options.clean_dbg_pkg: @@ -373,6 +407,6 @@ for root, dirs, file_names in os.walk(proot, topdown=False): if '-packages/' in root and not file_names: try: - os.rmdir(root) + os.removedirs(root) except Exception: pass diff -Nru dh-python-1.20140128/dhpython/__init__.py dh-python-2.20160818~bpo8+1~trusty/dhpython/__init__.py --- dh-python-1.20140128/dhpython/__init__.py 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dhpython/__init__.py 2016-06-17 20:05:56.000000000 +0000 @@ -77,9 +77,14 @@ PYDIST_DPKG_SEARCH_TPLS = { 'cpython2': "*/{}-?*\.egg-info | grep '/python2\../\|/pyshared/'", 'cpython3': '*python3/*/{}-?*\.egg-info', - 'pypy': '*pypy/*/{}-?\.egg-info'} + 'pypy': '*/pypy/dist-packages/{}-?*\.egg-info'} # DebHelper related +DEPENDS_SUBSTVARS = { + 'cpython2': '${python:Depends}', + 'cpython3': '${python3:Depends}', + 'pypy': '${pypy:Depends}', +} PKG_NAME_TPLS = { 'cpython2': ('python-', 'python2.'), 'cpython3': ('python3-', 'python3.'), diff -Nru dh-python-1.20140128/dhpython/interpreter.py dh-python-2.20160818~bpo8+1~trusty/dhpython/interpreter.py --- dh-python-1.20140128/dhpython/interpreter.py 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dhpython/interpreter.py 2016-06-17 20:05:56.000000000 +0000 @@ -277,15 +277,15 @@ return result - def parse_public_version(self, path): - """Return version assigned to site-packages path.""" + def parse_public_dir(self, path): + """Return version assigned to site-packages path + or True is it's unversioned public dir.""" match = PUBLIC_DIR_RE[self.impl].match(path) if match: vers = match.groups(0) - if vers: + if vers and vers[0]: return Version(vers) - # PyPy is not versioned - return default(self.impl) + return True def should_ignore(self, path): """Return True if path is used by another interpreter implementation.""" @@ -309,8 +309,8 @@ >>> i = Interpreter('python') >>> i.cache_file('foo.py', Version('3.1')) 'foo.pyc' - >>> i.cache_file('bar/foo.py', '3.3') - 'bar/__pycache__/foo.cpython-33.pyc' + >>> i.cache_file('bar/foo.py', '3.4') + 'bar/__pycache__/foo.cpython-34.pyc' """ version = Version(version or self.version) last_char = 'o' if '-O' in self.options else 'c' @@ -335,8 +335,8 @@ """Return Python magic tag (used in __pycache__ dir to tag files). >>> i = Interpreter('python') - >>> i.magic_tag(version='3.3') - 'cpython-33' + >>> i.magic_tag(version='3.4') + 'cpython-34' """ version = Version(version or self.version) if self.impl.startswith('cpython') and version << Version('3.2'): @@ -378,8 +378,8 @@ >>> Interpreter('python2.7').include_dir '/usr/include/python2.7' - >>> Interpreter('python3.3-dbg').include_dir - '/usr/include/python3.3dm' + >>> Interpreter('python3.4-dbg').include_dir + '/usr/include/python3.4dm' """ if self.impl == 'pypy': return '/usr/lib/pypy/include' @@ -419,6 +419,8 @@ def check_extname(self, fname, version=None): """Return extension file name if file can be renamed.""" + if not version and not self.version: + return version = Version(version or self.version) @@ -460,12 +462,13 @@ tmp_multiarch = info['multiarch'] or multiarch result = info['name'] - if self.impl == 'cpython3' and version >> '3.2' and result.endswith('module'): + if result.endswith('module') and (self.impl == 'cpython3' and version >> '3.2' + or self.impl == 'cpython2' and version == '2.7'): result = result[:-6] if tmp_soabi: result = "{}.{}".format(result, tmp_soabi) - if tmp_multiarch and not (self.impl == 'cpython3' and version << '3.3'): + if tmp_multiarch and not (self.impl == 'cpython3' and version << '3.3') and tmp_multiarch not in soabi: result = "{}-{}".format(result, tmp_multiarch) elif self.impl == 'cpython2' and version == '2.7' and tmp_multiarch: result = "{}.{}".format(result, tmp_multiarch) @@ -482,7 +485,7 @@ >>> Interpreter('python3.1').suggest_pkg_name('foo') 'python3-foo' - >>> Interpreter('python3.3').suggest_pkg_name('foo') + >>> Interpreter('python3.4').suggest_pkg_name('foo') 'python3-foo' >>> Interpreter('python2.7-dbg').suggest_pkg_name('bar') 'python-bar-dbg' @@ -509,6 +512,9 @@ 'for i in s.get_config_vars('\ '"SOABI", "MULTIARCH", "INCLUDEPY", "LIBPL", "LDLIBRARY")))' conf_vars = self._execute(cmd, version).split('__SEP__') + if conf_vars[1] in conf_vars[0]: + # Python >= 3.5 includes MILTIARCH in SOABI + conf_vars[0] = conf_vars[0].replace("-%s" % conf_vars[1], '') try: conf_vars[1] = os.environ['DEB_HOST_MULTIARCH'] except KeyError: diff -Nru dh-python-1.20140128/dhpython/pydist.py dh-python-2.20160818~bpo8+1~trusty/dhpython/pydist.py --- dh-python-1.20140128/dhpython/pydist.py 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dhpython/pydist.py 2016-08-27 07:39:16.000000000 +0000 @@ -49,11 +49,13 @@ \s* (?P(?:\[[^\]]*\])?) # ignored for now \s* + \(? # optional parenthesis (?: # optional minimum/maximum version (?P<=?|>=?|==|!=) \s* (?P(\w|[-.])+) )? + \)? # optional closing parenthesis ''', re.VERBOSE) @@ -114,14 +116,16 @@ return result -def guess_dependency(impl, req, version=None): - log.debug('trying to guess dependency for %s (python=%s)', +def guess_dependency(impl, req, version=None, bdep=None): + bdep = bdep or {} + log.debug('trying to find dependency for %s (python=%s)', req, version) if isinstance(version, str): version = Version(version) # some upstreams have weird ideas for distribution name... - name, rest = re.compile('([^><= \[]+)(.*)').match(req).groups() + name, rest = re.compile('([^!><= \(\)\[]+)(.*)').match(req).groups() + # TODO: check stdlib and dist-packaged for name.py and name.so files req = safe_name(name) + rest data = load(impl) @@ -146,13 +150,19 @@ # Debian dependency return item['dependency'] if req_d['version'] and (item['standard'] or item['rules']) and\ - req_d['operator'] not in (None, '=='): + req_d['operator'] not in (None, '==', '!='): v = _translate(req_d['version'], item['rules'], item['standard']) return "%s (%s %s)" % (item['dependency'], req_d['operator'], v) else: + if item['dependency'] in bdep: + if None in bdep[item['dependency']] and bdep[item['dependency']][None]: + return "{} ({})".format(item['dependency'], bdep[item['dependency']][None]) + # if arch in bdep[item['dependency']]: + # TODO: handle architecture specific dependencies from build depends + # (current architecture is needed here) return item['dependency'] - # try dpkg -S + # search for Egg metadata file or directory (using dpkg -S) query = PYDIST_DPKG_SEARCH_TPLS[impl].format(ci_regexp(safe_name(name))) log.debug("invoking dpkg -S %s", query) @@ -173,24 +183,28 @@ else: log.debug('dpkg -S did not find package for %s: %s', name, stderr) - # fall back to python-distname pname = sensible_pname(impl, name) - log.info('Cannot find installed package that provides %s. ' - 'Using %s as package name. Please add "%s correct_package_name" ' - 'line to debian/py3dist-overrides to override it IF this is incorrect.', - name, pname, safe_name(name)) - return pname + log.info('Cannot find package that provides %s. ' + 'Please add package that provides it to Build-Depends or ' + 'add "%s %s" line to %s or add proper ' + ' dependency to Depends by hand and ignore this info.', + name, safe_name(name), pname, PYDIST_OVERRIDES_FNAMES[impl]) + # return pname -def parse_pydep(impl, fname): +def parse_pydep(impl, fname, bdep=None, options=None, + depends_sec=None, recommends_sec=None, suggests_sec=None): + depends_sec = depends_sec or [] + recommends_sec = recommends_sec or [] + suggests_sec = suggests_sec or [] + public_dir = PUBLIC_DIR_RE[impl].match(fname) - if public_dir and len(public_dir.group(1)) != 1: + ver = None + if public_dir and public_dir.groups() and len(public_dir.group(1)) != 1: ver = public_dir.group(1) - else: - ver = None - result = [] - modified = optional_section = False + result = {'depends': [], 'recommends': [], 'suggests': []} + modified = section = False processed = [] with open(fname, 'r', encoding='utf-8') as fp: for line in fp: @@ -199,20 +213,29 @@ processed.append(line) continue if line.startswith('['): - optional_section = True - if optional_section: + section = line[1:-1].strip() processed.append(line) continue - dependency = guess_dependency(impl, line, ver) - if dependency: - result.append(dependency) - if 'setuptools' in line.lower(): - modified = True + if section: + if section in depends_sec: + result_key = 'depends' + elif section in recommends_sec: + result_key = 'recommends' + elif section in suggests_sec: + result_key = 'suggests' else: processed.append(line) + continue + else: + result_key = 'depends' + + dependency = guess_dependency(impl, line, ver, bdep) + if dependency: + result[result_key].append(dependency) + modified = True else: processed.append(line) - if modified: + if modified and public_dir: with open(fname, 'w', encoding='utf-8') as fp: fp.writelines(i + '\n' for i in processed) return result diff -Nru dh-python-1.20140128/dhpython/tools.py dh-python-2.20160818~bpo8+1~trusty/dhpython/tools.py --- dh-python-1.20140128/dhpython/tools.py 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dhpython/tools.py 2016-06-17 20:05:56.000000000 +0000 @@ -42,7 +42,7 @@ """ t = target.split('/') l = link.split('/') - while l[0] == t[0]: + while l and l[0] == t[0]: del l[0], t[0] return '/'.join(['..'] * (len(l) - 1) + t) @@ -70,7 +70,7 @@ def move_matching_files(src, dst, pattern): """Move files (preserving path) that match given pattern. - move_files('foo/bar/', 'foo/baz/', 'spam/.*\.so$') + move_matching_files('foo/bar/', 'foo/baz/', 'spam/.*\.so$') will move foo/bar/a/b/c/spam/file.so to foo/baz/a/b/c/spam/file.so """ match = re.compile(pattern).search @@ -78,7 +78,7 @@ for fn in filenames: spath = join(root, fn) if match(spath): - dpath = join(dst, spath.lstrip(src).lstrip('/')) + dpath = join(dst, relpath(spath, src)) os.renames(spath, dpath) @@ -90,7 +90,7 @@ try: interpreter = Interpreter.from_file(fpath) except Exception as err: - log.error('fix_shebang (%s): %s', fpath, err) + log.debug('fix_shebang (%s): %s', fpath, err) return None if not replacement and interpreter.path != '/usr/bin/': # f.e. /usr/local/* or */bin/env @@ -189,7 +189,7 @@ return result -def execute(command, cwd=None, env=None, log_output=None): +def execute(command, cwd=None, env=None, log_output=None, shell=True): """Execute external shell commad. :param cdw: currennt working directory @@ -199,7 +199,7 @@ * None if output should be included in the returned dict, or * False if output should be redirectored to stdout/stderr """ - args = {'shell': True, 'cwd': cwd, 'env': env} + args = {'shell': shell, 'cwd': cwd, 'env': env} close = False if log_output is False: pass @@ -301,7 +301,7 @@ site_dirs = interpreter.old_sitedirs(package, version) site_dirs.append(interpreter.sitedir(package, version)) for sdir in site_dirs: - files = glob(sdir + details['pattern']) + files = glob(sdir + '/' + details['pattern']) for fpath in files: if isdir(fpath): rmtree(fpath) diff -Nru dh-python-1.20140128/dhpython/version.py dh-python-2.20160818~bpo8+1~trusty/dhpython/version.py --- dh-python-1.20140128/dhpython/version.py 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dhpython/version.py 2016-06-17 20:05:56.000000000 +0000 @@ -425,3 +425,25 @@ if not exists(interpreter.binary(v))) return versions + + +def build_sorted(versions, impl='cpython3'): + """Return sorted list of versions in a build friendly order. + + i.e. default version, if among versions, is sorted last. + + >>> build_sorted([(2, 6), (3, 4), default('cpython3'), (3, 6), (2, 7)])[-1] == default('cpython3') + True + >>> build_sorted(('3.2', (3, 0), '3.1')) + [Version('3.0'), Version('3.1'), Version('3.2')] + """ + default_ver = default(impl) + + result = sorted(Version(v) for v in versions) + try: + result.remove(default_ver) + except ValueError: + pass + else: + result.append(default_ver) + return result diff -Nru dh-python-1.20140128/dh_python2 dh-python-2.20160818~bpo8+1~trusty/dh_python2 --- dh-python-1.20140128/dh_python2 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dh_python2 2016-08-27 07:39:16.000000000 +0000 @@ -79,16 +79,17 @@ if len(pubvers) > 1: for pos, version1 in enumerate(pubvers): dir1 = interpreter.sitedir(package, version1) + if not exists(dir1): + continue for version2 in pubvers[pos + 1:]: dir2 = interpreter.sitedir(package, version2) - dc = dircmp(dir1, dir2) - share_2x(dir1, dir2, dc) - elif len(pubvers) == 1: - # TODO: remove this once file conflicts will not be needed anymore - move_to_pyshared(interpreter.sitedir(package, pubvers[0])) - - for version in stats['ext_vers']: - create_ext_links(interpreter.sitedir(package, version)) + if exists(dir2): + dc = dircmp(dir1, dir2) + share_2x(dir1, dir2, dc) +# elif len(pubvers) == 1: +# move_to_pyshared(interpreter.sitedir(package, pubvers[0])) +# for version in stats['ext_vers']: +# create_ext_links(interpreter.sitedir(package, version)) if options.guess_versions and pubvers: for version in get_requested_versions('cpython2', options.vrange): @@ -115,60 +116,60 @@ stats['nsp.txt'] = set(realpath(i) for i in stats['nsp.txt']) -def move_to_pyshared(dir1): - # dir1 starts with debian/packagename/usr/lib/pythonX.Y/*-packages/ - debian, package, path = dir1.split('/', 2) - dstdir = join(debian, package, 'usr/share/pyshared/', - '/'.join(dir1.split('/')[6:])) - - for i in os.listdir(dir1): - fpath1 = join(dir1, i) - if isdir(fpath1) and not islink(fpath1): - if any(fn for fn in os.listdir(fpath1) if fext(fn) != 'so'): - # at least one file that is not an extension - move_to_pyshared(join(dir1, i)) - else: - if fext(i) == 'so': - continue - fpath2 = join(dstdir, i) - if not exists(fpath2): - if not exists(dstdir): - os.makedirs(dstdir) - if islink(fpath1): - fpath1_target = os.readlink(fpath1) - if isabs(fpath1_target): - os.symlink(fpath1_target, fpath2) - else: - fpath1_target = normpath(join(dir1, fpath1_target)) - relative_symlink(fpath1_target, fpath2) - os.remove(fpath1) - else: - os.rename(fpath1, fpath2) - relative_symlink(fpath2, fpath1) - - -def create_ext_links(dir1): - """Create extension symlinks in /usr/lib/pyshared/pythonX.Y. - - These symlinks are used to let dpkg detect file conflicts with - python-support and python-central packages. - """ - - debian, package, path = dir1.split('/', 2) - python, _, module_subpath = path[8:].split('/', 2) - dstdir = join(debian, package, 'usr/lib/pyshared/', python, module_subpath) - - for i in os.listdir(dir1): - fpath1 = join(dir1, i) - if isdir(fpath1): - create_ext_links(fpath1) - elif fext(i) == 'so': - fpath2 = join(dstdir, i) - if exists(fpath2): - continue - if not exists(dstdir): - os.makedirs(dstdir) - relative_symlink(fpath1, join(dstdir, i)) +# def move_to_pyshared(dir1): +# # dir1 starts with debian/packagename/usr/lib/pythonX.Y/*-packages/ +# debian, package, path = dir1.split('/', 2) +# dstdir = join(debian, package, 'usr/share/pyshared/', +# '/'.join(dir1.split('/')[6:])) +# +# for i in os.listdir(dir1): +# fpath1 = join(dir1, i) +# if isdir(fpath1) and not islink(fpath1): +# if any(fn for fn in os.listdir(fpath1) if fext(fn) != 'so'): +# # at least one file that is not an extension +# move_to_pyshared(join(dir1, i)) +# else: +# if fext(i) == 'so': +# continue +# fpath2 = join(dstdir, i) +# if not exists(fpath2): +# if not exists(dstdir): +# os.makedirs(dstdir) +# if islink(fpath1): +# fpath1_target = os.readlink(fpath1) +# if isabs(fpath1_target): +# os.symlink(fpath1_target, fpath2) +# else: +# fpath1_target = normpath(join(dir1, fpath1_target)) +# relative_symlink(fpath1_target, fpath2) +# os.remove(fpath1) +# else: +# os.rename(fpath1, fpath2) +# relative_symlink(fpath2, fpath1) +# +# +# def create_ext_links(dir1): +# """Create extension symlinks in /usr/lib/pyshared/pythonX.Y. +# +# These symlinks are used to let dpkg detect file conflicts with +# python-support and python-central packages. +# """ +# +# debian, package, path = dir1.split('/', 2) +# python, _, module_subpath = path[8:].split('/', 2) +# dstdir = join(debian, package, 'usr/lib/pyshared/', python, module_subpath) +# +# for i in os.listdir(dir1): +# fpath1 = join(dir1, i) +# if isdir(fpath1): +# create_ext_links(fpath1) +# elif fext(i) == 'so': +# fpath2 = join(dstdir, i) +# if exists(fpath2): +# continue +# if not exists(dstdir): +# os.makedirs(dstdir) +# relative_symlink(fpath1, join(dstdir, i)) def create_public_links(dir1, vrange, root=''): @@ -302,12 +303,21 @@ help='translate given requirements into Debian ' 'dependencies and add them to ${python:Depends}. ' 'Use it for missing items in requires.txt.') + parser.add_option('--depends-section', action='append', + help='translate requirements from given section into Debian ' + 'dependencies and add them to ${python3:Depends}') parser.add_option('--recommends', action='append', help='translate given requirements into Debian ' 'dependencies and add them to ${python:Recommends}') + parser.add_option('--recommends-section', action='append', + help='translate requirements from given section into Debian ' + 'dependencies and add them to ${python3:Recommends}') parser.add_option('--suggests', action='append', help='translate given requirements into Debian ' 'dependencies and add them to ${python:Suggests}') + parser.add_option('--suggests-section', action='append', + help='translate requirements from given section into Debian ' + 'dependencies and add them to ${python3:Suggests}') parser.add_option('--requires', action='append', help='translate requirements from given file into Debian ' 'dependencies and add them to ${python:Depends}') @@ -391,14 +401,14 @@ except Exception as e: log.error('cannot initialize DebHelper: %s', e) exit(2) + if not dh.packages: + log.error('no package to act on (python-foo or one with ${python:Depends} in Depends)') + # exit(7) if not options.vrange and dh.python_version: options.vrange = VersionRange(dh.python_version) interpreter = Interpreter('python') for package, pdetails in dh.packages.items(): - if options.arch is False and pdetails['arch'] != 'all' or \ - options.arch is True and pdetails['arch'] == 'all': - continue log.debug('processing package %s...', package) interpreter.debug = package.endswith('-dbg') @@ -422,7 +432,7 @@ create_public_links(pyshared_dir, options.vrange) stats = Scanner(interpreter, package, private_dir, options).result - dependencies = Dependencies(package, 'cpython2') + dependencies = Dependencies(package, 'cpython2', dh.build_depends) dependencies.parse(stats, options) if stats['public_vers']: @@ -443,7 +453,7 @@ dh.autoscript(package, 'prerm', 'prerm-pyclean', '') pyclean_added = True - for pdir, details in stats['private_dirs'].items(): + for pdir, details in sorted(stats['private_dirs'].items()): if not details.get('compile'): continue if not pyclean_added: @@ -512,7 +522,7 @@ if not exists(dstdir): os.makedirs(dstdir) with open(join(dstdir, package), 'a', encoding='utf-8') as fp: - fp.writelines("%s\n" % i for i in nsp) + fp.writelines("%s\n" % i for i in sorted(nsp)) pyshared = join('debian', package, 'usr/share/pyshared/') if isdir(pyshared) and not os.listdir(pyshared): diff -Nru dh-python-1.20140128/dh_python2.rst dh-python-2.20160818~bpo8+1~trusty/dh_python2.rst --- dh-python-1.20140128/dh_python2.rst 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dh_python2.rst 2016-08-27 07:39:16.000000000 +0000 @@ -21,6 +21,7 @@ * if necessary, describe supported Python versions via X-Python-Version field in debian/control, + * build depends on dh-python * build-depend on python or python-all or python-all-dev (>= 2.6.6-3~), * build module/application using its standard build system, remember to build extensions for all supported Python versions (loop over @@ -45,14 +46,34 @@ dependencies ~~~~~~~~~~~~ -dh_python2 tries to translate Python dependencies from requires.txt file to -Debian dependencies. Use debian/pydist-overrides or --no-guessing-deps option -to override it if the guess is incorrect. If you want dh_python2 to generate -more strict dependencies (f.e. to avoid ABI problems) create -debian/python-foo.pydist file. See /usr/share/doc/dh-python/README.PyDist -for more information. If the pydist file contains PEP386 flag or set of (uscan -like) rules, dh_python2 will make the depedency versioned (version requirements -are ignored by default). +dh_python2 tries to translate Python dependencies from the `requires.txt` file +to Debian dependencies. In many cases, this works without any additional +configuration because dh_python2 comes with a build-in mapping of Python module +names to Debian packages that is periodically regenerated from the Debian +archive. By default, the version information in the Python dependencies is +discarded. If you want dh_python2 to generate more strict dependencies (e.g. to +avoid ABI problems), or if the automatic mapping does not work correctly for +your package, you have to provide dh_python2 with additional rules for the +translation of Python module to Debian package dependencies. + +For a package *python-foo* that depends on a package *python-bar*, there are +two files that may provide such rules: + +#. If the *python-foo* source package ships with a + `debian/pydist-overrides` file, this file is used by dh_python + during the build of *python-foo*. + +#. If the *python-bar* source package ships with a + `debian/python-bar.pydist` file (and uses dh_python), this file + will be included in the binary package as + `/usr/share/dh-python/dist/cpython2/python-bar`. During the build + of *python-foo*, dh_python will then find and use the file. + +Both files have the same format described in +`/usr/share/doc/dh-python/README.PyDist`. If all you want is to generate +versioned dependencies (and assuming that the *python-bar* package provides +the *pybar* Python module), in most cases it will be sufficient to put the line +``pybar python-bar; PEP386`` into either of the above files. namespace feature ~~~~~~~~~~~~~~~~~ @@ -85,8 +106,8 @@ pyinstall files ~~~~~~~~~~~~~~~ Files listed in debian/pkg.pyinstall file will be installed as public modules -for all requested Python versions (dh_install doesn't know about python's site- -vs. dist-packages issue). +(i.e. into .../dist-packages/ directory) for all requested Python versions +(dh_install doesn't know about python's site- vs. dist-packages issue). Syntax: ``path/to/file [VERSION_RANGE] [NAMESPACE]`` @@ -105,9 +126,9 @@ pyremove files ~~~~~~~~~~~~~~ -If you want to remove some files installed by build system (from all supported -Python versions or only from a subset of these versions), add them to -debian/pkg.pyremove file. +If you want to remove some public modules (i.e. files in .../dist-packages/ +directory) installed by build system (from all supported Python versions or +only from a subset of these versions), add them to debian/pkg.pyremove file. Examples: * ``*.pth`` removes .pth files from .../dist-packages/ @@ -167,12 +188,21 @@ --depends=DEPENDS translate given requirements into Debian dependencies and add them to ${python:Depends}. Use it for missing items in requires.txt +--depends-sections=SECTIONS translate requirements from given sections of + requres.txt file into Debian dependencies and add them to ${python:Depends}. + --recommends=RECOMMENDS translate given requirements into Debian dependencies and add them to ${python:Recommends} +--recommends-sections=SECTIONS translate requirements from given sections of + requres.txt file into Debian dependencies and add them to ${python:Recommends}. + --suggests=SUGGESTS translate given requirements into Debian dependencies and add them to ${python:Suggests} +--suggests-sections=SECTIONS translate requirements from given sections of + requres.txt file into Debian dependencies and add them to ${python:Suggests}. + --requires=FILENAME translate requirements from given file(s) into Debian dependencies and add them to ${python:Depends} diff -Nru dh-python-1.20140128/dh_python3 dh-python-2.20160818~bpo8+1~trusty/dh_python3 --- dh-python-1.20140128/dh_python3 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dh_python3 2016-08-27 07:39:16.000000000 +0000 @@ -35,7 +35,7 @@ from dhpython.pydist import validate as validate_pydist from dhpython.fs import fix_locations, Scan from dhpython.option import Option -from dhpython.tools import pyremove +from dhpython.tools import pyinstall, pyremove # initialize script logging.basicConfig(format='%(levelname).1s: dh_python3 ' @@ -98,12 +98,21 @@ help='translate given requirements into Debian ' 'dependencies and add them to ${python3:Depends}. ' 'Use it for missing items in requires.txt.') + parser.add_option('--depends-section', action='append', + help='translate requirements from given section into Debian ' + 'dependencies and add them to ${python3:Depends}') parser.add_option('--recommends', action='append', help='translate given requirements into Debian ' 'dependencies and add them to ${python3:Recommends}') + parser.add_option('--recommends-section', action='append', + help='translate requirements from given section into Debian ' + 'dependencies and add them to ${python3:Recommends}') parser.add_option('--suggests', action='append', help='translate given requirements into Debian ' 'dependencies and add them to ${python3:Suggests}') + parser.add_option('--suggests-section', action='append', + help='translate requirements from given section into Debian ' + 'dependencies and add them to ${python3:Suggests}') parser.add_option('--requires', action='append', help='translate requirements from given file into Debian ' 'dependencies and add them to ${python3:Depends}') @@ -160,19 +169,24 @@ except Exception as e: log.error('cannot initialize DebHelper: %s', e) exit(2) + if not dh.packages: + log.error('no package to act on (python3-foo or one with ${python3:Depends} in Depends)') + # exit(7) if not options.vrange and dh.python_version: options.vrange = VersionRange(dh.python_version) interpreter = Interpreter('python3') for package, pdetails in dh.packages.items(): - if options.arch is False and pdetails['arch'] != 'all' or \ - options.arch is True and pdetails['arch'] == 'all': - continue log.debug('processing package %s...', package) interpreter.debug = package.endswith('-dbg') if not private_dir: try: + pyinstall(interpreter, package, options.vrange) + except Exception as err: + log.error("%s.pyinstall: %s", package, err) + exit(4) + try: pyremove(interpreter, package, options.vrange) except Exception as err: log.error("%s.pyremove: %s", package, err) @@ -180,7 +194,7 @@ fix_locations(package, interpreter, SUPPORTED, options) stats = Scanner(interpreter, package, private_dir, options).result - dependencies = Dependencies(package, 'cpython3') + dependencies = Dependencies(package, 'cpython3', dh.build_depends) dependencies.parse(stats, options) if stats['ext_vers']: @@ -200,7 +214,7 @@ dh.autoscript(package, 'postinst', 'postinst-py3compile', args) dh.autoscript(package, 'prerm', 'prerm-py3clean', '') pyclean_added = True - for pdir, details in stats['private_dirs'].items(): + for pdir, details in sorted(stats['private_dirs'].items()): if not details.get('compile'): continue if not pyclean_added: diff -Nru dh-python-1.20140128/dh_python3.rst dh-python-2.20160818~bpo8+1~trusty/dh_python3.rst --- dh-python-1.20140128/dh_python3.rst 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/dh_python3.rst 2016-08-27 07:39:16.000000000 +0000 @@ -21,6 +21,7 @@ * if necessary, describe supported Python 3 versions via X-Python3-Version field in debian/control, + * build depends on dh-python * build-depend on python3 or python3-all or python3-all-dev, * build module/application using its standard build system, remember to build extensions for all supported Python 3 versions (loop over @@ -38,14 +39,34 @@ dependencies ~~~~~~~~~~~~ -dh_python3 tries to translate Python dependencies from requires.txt file to -Debian dependencies. Use debian/py3dist-overrides or --no-guessing-deps option -to override it if the guess is incorrect. If you want dh_python3 to generate -more strict dependencies (f.e. to avoid ABI problems) create -debian/python3-foo.pydist file. See /usr/share/doc/dh-python/README.PyDist -for more information. If the pydist file contains PEP386 flag or set of (uscan -like) rules, dh_python3 will make the depedency versioned (version requirements -are ignored by default). +dh_python3 tries to translate Python dependencies from the `requires.txt` file +to Debian dependencies. In many cases, this works without any additional +configuration because dh_python3 comes with a build-in mapping of Python module +names to Debian packages that is periodically regenerated from the Debian +archive. By default, the version information in the Python dependencies is +discarded. If you want dh_python3 to generate more strict dependencies (e.g. to +avoid ABI problems), or if the automatic mapping does not work correctly for +your package, you have to provide dh_python3 with additional rules for the +translation of Python module to Debian package dependencies. + +For a package *python3-foo* that depends on a package *python3-bar*, there are +two files that may provide such rules: + +#. If the *python3-foo* source package ships with a + `debian/py3dist-overrides` file, this file is used by dh_python3 + during the build of *python3-foo*. + +#. If the *python3-bar* source package ships with a + `debian/python3-bar.pydist` file (and uses dh_python3), this file + will be included in the binary package as + `/usr/share/dh-python/dist/cpython3/python3-bar`. During the build + of *python3-foo*, dh_python3 will then find and use the file. + +Both files have the same format described in +`/usr/share/doc/dh-python/README.PyDist`. If all you want is to generate +versioned dependencies (and assuming that the *python3-bar* package provides +the *pybar* Python module), in most cases it will be sufficient to put the line +``pybar python3-bar; PEP386`` into either of the above files. private dirs ~~~~~~~~~~~~ @@ -66,6 +87,36 @@ that have extensions different than `so` or `h` are removed by default. Use --no-dbg-cleaning option to disable this feature. +pyinstall files +~~~~~~~~~~~~~~~ +Files listed in debian/pkg.pyinstall file will be installed as public modules +(i.e. into .../dist-packages/ directory) for all requested Python versions. + +Syntax: ``path/to/file [VERSION_RANGE] [NAMESPACE]`` + +debian directory is automatically removed from the path, so you can place your +files in debian/ directory and install them from this location (if you want to +install them in "debian" namespace, set NAMESPACE to debian). If NAMESPACE is +set, all listed files will be installed in .../dist-packages/NAMESPACE/ +directory. + +Examples: + * ``foo.py`` installs .../dist-packages/foo.py for all supported Python versions + * ``foo/bar.py 3.3-`` installs .../dist-packages/foo/bar.py for versions >= 3.3 + * ``foo/bar.py spam`` installs .../dist-packages/spam/bar.py + * ``debian/*.py spam.egg 3.2`` installs .../python3.2/dist-packages/spam/egg/\*.py + files + +pyremove files +~~~~~~~~~~~~~~ +If you want to remove some public modules (i.e. files in .../dist-packages/ +directory) installed by build system (from all supported Python versions or +only from a subset of these versions), add them to debian/pkg.pyremove file. + +Examples: + * ``*.pth`` removes .pth files from .../dist-packages/ + * ``bar/baz.py 3.2`` removes .../python3.2/dist-packages/bar/baz.py + overriding supported / default Python versions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you want to override system's list of supported Python versions or the @@ -87,7 +138,7 @@ --no-dbg-cleaning do not remove any files from debug packages ---no-ext-rename do not add magic tags nor multiarch tuples to extension file names +--no-ext-rename do not add magic tags nor multiarch tuples to extension file names --no-shebang-rewrite do not rewrite shebangs @@ -118,12 +169,21 @@ --depends=DEPENDS translate given requirements into Debian dependencies and add them to ${python3:Depends}. Use it for missing items in requires.txt +--depends-sections=SECTIONS translate requirements from given sections of + requres.txt file into Debian dependencies and add them to ${python3:Depends}. + --recommends=RECOMMENDS translate given requirements into Debian dependencies and add them to ${python3:Recommends} +--recommends-sections=SECTIONS translate requirements from given sections of + requres.txt file into Debian dependencies and add them to ${python3:Recommends}. + --suggests=SUGGESTS translate given requirements into Debian dependencies and add them to ${python3:Suggests} +--suggests-sections=SECTIONS translate requirements from given sections of + requres.txt file into Debian dependencies and add them to ${python3:Suggests}. + --requires=FILENAME translate requirements from given file(s) into Debian dependencies and add them to ${python3:Depends} diff -Nru dh-python-1.20140128/.gitignore dh-python-2.20160818~bpo8+1~trusty/.gitignore --- dh-python-1.20140128/.gitignore 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/.gitignore 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -debian/dh-python/ -.pc -.coverage -__pycache__ -pydist/cache/ -*\.1 -*\.pyc -*\.deb -*\.changes -*\.log -*\.debhelper -*\.substvars -*/*/debian/files -debian/files diff -Nru dh-python-1.20140128/pybuild dh-python-2.20160818~bpo8+1~trusty/pybuild --- dh-python-1.20140128/pybuild 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/pybuild 2016-08-27 07:39:16.000000000 +0000 @@ -23,8 +23,9 @@ import logging import argparse import sys -from os import environ, getcwd, makedirs +from os import environ, getcwd, makedirs, remove from os.path import abspath, exists, join +from shutil import rmtree logging.basicConfig(format='%(levelname).1s: pybuild ' '%(module)s:%(lineno)d: %(message)s') @@ -34,7 +35,7 @@ def main(cfg): log.debug('cfg: %s', cfg) from dhpython import build - from dhpython.version import Version, get_requested_versions + from dhpython.version import Version, build_sorted, get_requested_versions from dhpython.interpreter import Interpreter from dhpython.tools import execute, move_matching_files @@ -50,10 +51,16 @@ env = environ.copy() if 'LC_ALL' not in env: env['LC_ALL'] = 'C.UTF-8' + if 'no_proxy' not in env: + env['no_proxy'] = 'localhost' if 'http_proxy' not in env: env['http_proxy'] = 'http://127.0.0.1:9/' + elif not env['http_proxy']: + del env['http_proxy'] # some tools don't like empty var. if 'https_proxy' not in env: env['https_proxy'] = 'https://127.0.0.1:9/' + elif not env['https_proxy']: + del env['https_proxy'] # some tools don't like empty var. if cfg.system: certainty = 99 @@ -153,14 +160,16 @@ 'home_dir': abspath(home_dir)}) if interpreter == 'pypy': args['install_dir'] = '/usr/lib/pypy/dist-packages/' - if step == 'test': - pp = context['ENV'].get('PYTHONPATH', '') - args['test_dir'] = join(args['destdir'], args['install_dir'].lstrip('/')) - if args['test_dir'] not in pp.split(':'): - pp = "{}:{}".format(pp, args['test_dir']).lstrip(':') - if args['build_dir'] not in pp.split(':'): - pp = "{}:{}".format(pp, args['build_dir']).lstrip(':') - args['PYTHONPATH'] = pp + if step in {'build', 'test'}: + pp = context['ENV'].get('PYTHONPATH') + pp = pp.split(':') if pp else [] + if step == 'test': + args['test_dir'] = join(args['destdir'], args['install_dir'].lstrip('/')) + if args['test_dir'] not in pp: + pp.append(args['test_dir']) + if args['build_dir'] not in pp: + pp.append(args['build_dir']) + args['PYTHONPATH'] = ':'.join(pp) if not exists(args['build_dir']): makedirs(args['build_dir']) @@ -200,11 +209,20 @@ else: log_file = False command = before_cmd.format(**args) + log.info(command) output = execute(command, context['dir'], env, log_file) if output['returncode'] != 0: msg = 'exit code={}: {}'.format(output['returncode'], command) raise Exception(msg) + fpath = join(args['home_dir'], 'build_dirs_to_rm_before_install') + if step == 'install' and exists(fpath): + with open(fpath) as fp: + for line in fp: + dpath = join(args['build_dir'], line.strip('\n')) + if exists(dpath): + rmtree(dpath) + remove(fpath) result = func(context, args) after_cmd = get_option('after_{}'.format(step), interpreter, version) @@ -214,6 +232,7 @@ else: log_file = False command = after_cmd.format(**args) + log.info(command) output = execute(command, context['dir'], env, log_file) if output['returncode'] != 0: msg = 'exit code={}: {}'.format(output['returncode'], command) @@ -237,40 +256,42 @@ step = func.__func__.__name__ if step == 'test' and nocheck: exit(0) - for interpreter in cfg.interpreter: - iversions = versions - if '{version}' not in interpreter and len(versions) > 1: + for i in cfg.interpreter: + ipreter = Interpreter(interpreter.format(version=versions[0])) + iversions = build_sorted(versions, impl=ipreter.impl) + if '{version}' not in i and len(versions) > 1: log.info('limiting Python versions to %s due to missing {version}' - ' in interpreter string', str(versions[0])) - iversions = versions[:1] # just the default or closest to default + ' in interpreter string', str(versions[-1])) + iversions = versions[-1:] # just the default or closest to default for version in iversions: - if is_disabled(step, interpreter, version): + if is_disabled(step, i, version): continue c = dict(context) - c['dir'] = get_option('dir', interpreter, version, cfg.dir) - c['destdir'] = get_option('destdir', interpreter, version, cfg.destdir) + c['dir'] = get_option('dir', i, version, cfg.dir) + c['destdir'] = get_option('destdir', i, version, cfg.destdir) try: - run(func, interpreter, version, c) + run(func, i, version, c) except Exception as err: log.error('%s: plugin %s failed with: %s', step, plugin.NAME, err, exc_info=cfg.verbose) exit(13) if step == 'install': - ext_destdir = get_option('ext_destdir', interpreter, version) + ext_destdir = get_option('ext_destdir', i, version) if ext_destdir: move_matching_files(c['destdir'], ext_destdir, - get_option('ext_pattern', interpreter, version)) + get_option('ext_pattern', i, version)) exit(0) ### all functions for interpreters in batches mode ### try: context_map = {} for i in cfg.interpreter: - iversions = versions + ipreter = Interpreter(interpreter.format(version=versions[0])) + iversions = build_sorted(versions, impl=ipreter.impl) if '{version}' not in i and len(versions) > 1: log.info('limiting Python versions to %s due to missing {version}' - ' in interpreter string', str(versions[0])) - iversions = versions[:1] # just the default or closest to default + ' in interpreter string', str(versions[-1])) + iversions = versions[-1:] # just the default or closest to default for version in iversions: key = (i, version) if key in context_map: @@ -382,18 +403,18 @@ dirs = parser.add_argument_group('DIRECTORIES') dirs.add_argument('-d', '--dir', action='store', metavar='DIR', - default=getcwd(), + default=environ.get('PYBUILD_DIR', getcwd()), help='source files directory - base for other relative dirs [default: CWD]') dirs.add_argument('--dest-dir', action='store', metavar='DIR', dest='destdir', default=environ.get('DESTDIR', 'debian/tmp'), help='destination directory [default: debian/tmp]') dirs.add_argument('--ext-dest-dir', action='store', metavar='DIR', dest='ext_destdir', - default=environ.get('EXT_DESTDIR'), + default=environ.get('PYBUILD_EXT_DESTDIR'), help='destination directory for .so files') dirs.add_argument('--ext-pattern', action='store', metavar='PATTERN', - default=environ.get('EXT_PATTERN', r'\.so(\.[^/]*)?$'), + default=environ.get('PYBUILD_EXT_PATTERN', r'\.so(\.[^/]*)?$'), help='regular expression for files that should be moved' - ' if --ext-destdir is set [default: .so files]') + ' if --ext-dest-dir is set [default: .so files]') dirs.add_argument('--install-dir', action='store', metavar='DIR', help='installation directory [default: .../dist-packages]') dirs.add_argument('--name', action='store', diff -Nru dh-python-1.20140128/pybuild.rst dh-python-2.20160818~bpo8+1~trusty/pybuild.rst --- dh-python-1.20140128/pybuild.rst 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/pybuild.rst 2016-06-17 20:05:56.000000000 +0000 @@ -33,12 +33,6 @@ %: dh $@ --with python2,python3 --buildsystem=pybuild -overriding test command with custom build plugin example:: - - override_dh_auto_test: - PYBUILD_SYSTEM=custom \ - PYBUILD_TEST_ARGS="command --with --options {build_dir}/" dh_auto_test - OPTIONS ======= Most options can be set (in addition to command line) via environment @@ -96,7 +90,7 @@ BUILD SYSTEM ARGUMENTS ---------------------- Additional arguments passed to the build system. - --system=custom requires complete command. + --system=custom requires complete command in --foo-args parameters. --before-clean COMMAND invoked before the clean command @@ -157,7 +151,7 @@ --ext-dest-dir DIR set destination directory for .so files --ext-pattern PATTERN - regular expression for files that should be moved if --ext-destdir is set + regular expression for files that should be moved if --ext-dest-dir is set [default: `\.so(\.[^/]*)?$`] --install-dir DIR set installation directory [default: .../dist-packages] @@ -184,7 +178,7 @@ --disable ITEMS disable action, interpreter, version or any mix of them. Note that f.e. python3 and python3-dbg are two different interpreters, - --disable python3/test doesn't disable python3-dbg's tests. + --disable test/python3 doesn't disable python3-dbg's tests. disable examples ~~~~~~~~~~~~~~~~ @@ -201,4 +195,5 @@ ======== * dh_python2(1) * dh_python3(1) +* https://wiki.debian.org/Python/Pybuild * http://deb.li/pybuild - most recent version of this document diff -Nru dh-python-1.20140128/pydist/cpython2_fallback dh-python-2.20160818~bpo8+1~trusty/pydist/cpython2_fallback --- dh-python-1.20140128/pydist/cpython2_fallback 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/pydist/cpython2_fallback 2016-08-28 19:40:47.000000000 +0000 @@ -2,98 +2,351 @@ setuptools python-pkg-resources wsgiref python (>= 2.5) | python-wsgiref argparse python (>= 2.7) | python-argparse -pil python-imaging -BatchModify trac-batchmodify +pil python-pil +Pillow python-pil +2ping 2ping +3to2 python-3to2 +APLpy python-aplpy +APScheduler python-apscheduler +APacheDEX apachedex +AddOns python-peak.util +Arriero arriero +AuthKit python-authkit +Axiom python-axiom +Babel python-babel +Beaker python-beaker +BeautifulSoup python-beautifulsoup +BitTornado bittornado +BitTorrent python-bittorrent Bitten trac-bitten-slave Blogofile blogofile +Bottleneck python-bottleneck +Box2D python-box2d +Brlapi python-brlapi +Brotli python-brotli +Buffy python-buffy +BytecodeAssembler python-peak.util BzrPipeline bzr-pipeline BzrTools bzrtools CDApplet cairo-dock-dbus-plug-in-interface-python CDBashApplet cairo-dock-dbus-plug-in-interface-python -Calendar_and_Contacts_Server calendarserver +CDDB python-cddb +CMOR python-cmor +CacheControl python-cachecontrol +CairoSVG python-cairosvg +CalendarServer calendarserver +Catwalk python-catwalk CedarBackup2 cedar-backup2 +Cerealizer python-cerealizer +Chameleon python-chameleon +CheMPS2 python-chemps2 +Cheetah python-cheetah CherryPy python-cherrypy3 CherryTree cherrytree ClusterShell clustershell +Codeville codeville +Coffin python-coffin +ConfigArgParse python-configargparse +Connectome_Viewer connectomeviewer +ConsensusCore python-pbconsensuscore +ConsensusCore2 python-consensuscore2 +ControlAula controlaula +Coherence python-coherence +CouchDB python-couchdb +Couchapp couchapp CoverageTestRunner python-coverage-test-runner +Creoleparser python-creoleparser Cython cython DITrack ditrack +DSV python-dsv +DecoratorTools python-peak.util.decorators +DendroPy python-dendropy DiaVisViewPlugin trac-diavisview +DisplayCAL dispcalgui +Django python-django Doconce doconce -Dosage dosage +DouF00 douf00 +EbookLib python-ebooklib +EditObj python-editobj Editra editra +Electrum python-electrum +Elements python-elements +Elixir python-elixir +EnthoughtBase python-enthoughtbase +Epsilon python-epsilon +ExifRead python-exif +Extractor python-extractor +Extremes python-peak.util +FFC python-ffc +FIAT python-fiat Fabric fabric FeinCMS python-django-feincms +FibraNet python-fibranet +Fiona python-fiona +Flask python-flask +Flask_API python-flask-api +Flask_AutoIndex python-flask-autoindex +Flask_Babel python-flask-babel +Flask_Bcrypt python-flask-bcrypt +Flask_FlatPages python-flask-flatpages +Flask_HTTPAuth python-flask-httpauth +Flask_Jsonpify python-jsonpify +Flask_Login python-flask-login +Flask_Migrate python-flask-migrate +Flask_OldSessions python-flask-oldsessions +Flask_OpenID python-flask-openid +Flask_Principal python-flask-principal +Flask_RESTful python-flask-restful +Flask_SQLAlchemy python-flask-sqlalchemy +Flask_Script python-flask-script +Flask_Silk python-flask-silk +Flask_Testing python-flask-testing Flask_WTF python-flaskext.wtf +FormAlchemy python-formalchemy +FormEncode python-formencode +Frozen_Flask python-frozen-flask +GDAL python-gdal +GPlayCli gplaycli +GalleryRemote python-galleryremote GaussSum gausssum +Genetic python-genetic +GenomeTools python-genometools +GenomicConsensus python-pbgenomicconsensus +Genshi python-genshi +GeoIP python-geoip +Geophar geophar +Ghost.py python-ghost GitPython python-git -Glances glances +GooCalendar python-goocalendar +GvGen python-gvgen +Gyoto python-gyoto +Gyoto_std python-gyoto +HTSeq python-htseq +HyPhy python-hyphy +ID3 python-id3 +IMDbPY python-imdbpy +IPy python-ipy ISO8583_Module python-iso8583 Ibid ibid -Isenkram isenkram +Isenkram isenkram-cli +JACK_Client python-jack-client JCC jcc +JPype python-jpype +Jinja2 python-jinja2 +Kajiki python-kajiki +Kivy python-kivy +LEPL python-lepl +LibAppArmor python-libapparmor +Logbook python-logbook Loom bzr-loom +Louie python-louie +M2Crypto python-m2crypto +MACS2 macs MACS macs MAT mat +MDP python-mdp +MIDIUtil python-midiutil +MLPY python-mlpy +MMTK python-mmtk Magic_file_extensions python-magic +Mako python-mako +Markdown python-markdown +MarkupSafe python-markupsafe +MicrobeGPS microbegps +MiniMock python-minimock +Mirage mirage Mnemosyne mnemosyne Model_Builder model-builder +ModestMaps python-modestmaps +Mopidy mopidy +Mopidy_ALSAMixer mopidy-alsamixer +Mopidy_Beets mopidy-beets +Mopidy_Dirble mopidy-dirble +Mopidy_InternetArchive mopidy-internetarchive +Mopidy_Local_SQLite mopidy-local-sqlite +Mopidy_MPRIS mopidy-mpris +Mopidy_Podcast mopidy-podcast +Mopidy_Podcast_gpodder.net mopidy-podcast-gpodder +Mopidy_Podcast_iTunes mopidy-podcast-itunes +Mopidy_Scrobbler mopidy-scrobbler +Mopidy_SomaFM mopidy-somafm +Mopidy_SoundCloud mopidy-soundcloud +Mopidy_TuneIn mopidy-tunein +Mopidy_Youtube mopidy-youtube +Mopidy_dLeyna mopidy-dleyna +MultipartPostHandler python-multipartposthandler MySQL_python python-mysqldb -Nautilus_scripts_manager nautilus-scripts-manager +Myghty python-myghty +MyghtyUtils python-myghtyutils +NavAdd trac-navadd +Nevow python-nevow +Nik4 nik4 Nikola nikola +OERPLib python-oerplib +OWSLib python-owslib +OdooRPC python-odoorpc OdtExportPlugin trac-odtexport +PAM python-pam +PDAL python-pdal +PEAK_Rules python-peak.rules PIDA pida -Patool patool +PLWM python-plwm +Pafy python-pafy +Parsley python-parsley +Paste python-paste +PasteDeploy python-pastedeploy +PasteScript python-pastescript +PasteWebKit python-pastewebkit +Pattern python-pattern +Paver python-paver Photon photon Pillow python-pil +Pint python-pint +Pivy python-pivy +Pmw python-pmw +PocketSphinx python-pocketsphinx PreludeEasy python-prelude +Printrun printrun +PrivateWikis trac-privatewiki +ProxyTypes python-peak.util +PsychoPy psychopy +PuLP python-pulp Pwman3 pwman3 PyAIML python-aiml +PyAVM python-pyavm +PyAssimp python-pyassimp +PyAudio python-pyaudio PyBluez python-bluez PyCAPTCHA python-captcha -PyCoCuMa pycocuma +PyChart python-pychart +PyChef python-chef +PyChromecast python-pychromecast +PyDispatcher python-pydispatch +PyECLib python-pyeclib PyFFTW3 python-fftw PyFeed python-feed +PyFlot python-pyflot +PyGithub python-github +PyGreSQL python-pygresql PyHamcrest python-hamcrest PyHoca_CLI pyhoca-cli PyHoca_GUI pyhoca-gui +PyICU python-pyicu +PyJWT python-jwt +PyKMIP python-pykmip +PyLD python-pyld +PyMTP python-pymtp PyMca pymca -PyNAST pynast +PyMetrics pymetrics +PyMySQL python-pymysql +PyNLPl python-pynlpl +PyNN python-pynn +PyNaCl python-nacl +PyODE python-pyode PyOpenGL python-opengl +PyPDF2 python-pypdf2 +PyProtocols python-protocols +PyPump python-pypump +PyQSO pyqso +PyRRD python-pyrrd +PyRSS2Gen python-pyrss2gen PyRoom pyroom +PySDL2 python-sdl2 +PySocks python-pysocks PyStemmer python-stemmer +PyTango python-pytango +PyVCF python-pyvcf +PyVISA python-pyvisa +PyVISA_py python-pyvisa-py +PyVTK python-pyvtk PyVISA pyvisa PyWavelets python-pywt PyWebDAV python-webdav +PyX python-pyx +PyXB python-pyxb PyYAML python-yaml Py_ python-py++ +Pyevolve python-pyevolve +Pygments python-pygments +Pykka python-pykka +Pylons python-pylons Pymacs pymacs +Pyrex python-pyrex +Pyro pyro Pyro4 python2-pyro4 +Pysolar python-pysolar +Pyste libboost-python1.60-dev +PythonDaap python-daap +PythonQwt python-qwt Pyste libboost-python1.55-dev +Python_fontconfig python-fontconfig +QtAwesome python-qtawesome +QtPy python-qtpy QuantLib_Python quantlib-python +Quixote python-quixote1 +RBTools python-rbtools +Rabbyt python-rabbyt +Radicale python-radicale +Recoll python-recoll +Ren_Py python-renpy +Rivet python-rivet Roadmap_Plugin trac-roadmap +Routes python-routes +Rtree python-rtree RunSnakeRun runsnakerun +SOAPpy python-soappy +SPARQLWrapper python-sparqlwrapper +SQLAlchemy python-sqlalchemy +SQLAlchemy_Utils python-sqlalchemy-utils +SQLObject python-sqlobject +Scrapy python-scrapy ScientificPython python-scientific +SecretStorage python-secretstorage +SetupDocs python-setupdocs +Shapely python-shapely +Shinken shinken-common +SimPy python-simpy +SimpleTAL python-simpletal +SocksiPy_branch python-socksipy +SocksipyChain python-socksipychain +SoftLayer python-softlayer Sonata sonata +SoundFile python-soundfile South python-django-south +Soya python-soya +Sphinx python-sphinx +Sponge python-sponge +SphinxBase python-sphinxbase +SquareMap python-squaremap +Stetl python-stetl +Strongwind python-strongwind +SymbolType python-peak.util +Symbolic python-swiginac +TRML2PDF python-trml2pdf TaskCoach taskcoach -TcosConfigurator tcos-configurator +Tempita python-tempita The_FreeSmartphone_Framework_Daemon fso-frameworkd +Theano python-theano +TileCache tilecache TileStache tilestache +TkinterTreectrl python-tktreectrl +Tofu python-tofu +TornadIO2 python-tornadio2 +ToscaWidgets python-toscawidgets Trac trac TracAccountManager trac-accountmanager TracAnnouncer trac-announcer TracAuthOpenId trac-authopenid -TracBzr trac-bzr TracCodeComments trac-codecomments TracCustomFieldAdmin trac-customfieldadmin -TracDateField trac-datefieldplugin -TracGit trac-git +TracDateField trac-datefield TracHTTPAuth trac-httpauth TracIncludeMacro trac-includemacro TracMasterTickets trac-mastertickets TracMercurial trac-mercurial +TracSpamFilter trac-spamfilter TracSubTicketsPlugin trac-subtickets +TracSubcomponents trac-subcomponents TracTags trac-tags TracVirtualTicketPermissions trac-virtualticketpermissions TracWikiPrintPlugin trac-wikiprint @@ -101,21 +354,117 @@ TracXMLRPC trac-xmlrpc Trac_jsGantt trac-jsgantt TranslatedPages trac-translatedpages +TurboGears2 python-turbogears2 +TurboJson python-turbojson +TurboKid python-turbokid +Twiggy python-twiggy +Twisted python-twisted +Twisted_Conch python-twisted-conch +Twisted_Core python-twisted-core +Twisted_Lore python-twisted-lore +Twisted_Mail python-twisted-mail +Twisted_Names python-twisted-names +Twisted_News python-twisted-news +Twisted_Runner python-twisted-runner +Twisted_Web python-twisted-web +Twisted_Web2 python-twisted-web2 +Twisted_Words python-twisted-words +UFL python-ufl +URLObject python-urlobject +Unidecode python-unidecode +Unipath python-unipath UnknownHorizons unknown-horizons VMDKstream vmdk-stream-converter VirtualMailManager vmm +WALinuxAgent waagent +WSME python-wsme +WTForms python-wtforms +Wand python-wand +WebError python-weberror +WebFlash python-webflash +WebHelpers python-webhelpers +WebOb python-webob +WebTest python-webtest +Werkzeug python-werkzeug +Whoosh python-whoosh WikiTableMacro trac-wikitablemacro WordPress_Library python-wordpresslib +XStatic python-xstatic +XStatic_Angular python-xstatic-angular +XStatic_Angular_Bootstrap python-xstatic-angular-bootstrap +XStatic_Angular_Cookies python-xstatic-angular-cookies +XStatic_Angular_FileUpload python-xstatic-angular-fileupload +XStatic_Angular_Gettext python-xstatic-angular-gettext +XStatic_Angular_Mock python-xstatic-angular-mock +XStatic_Angular_lrdragndrop python-xstatic-angular-lrdragndrop +XStatic_Bootstrap_Datepicker python-xstatic-bootstrap-datepicker +XStatic_Bootstrap_SCSS python-xstatic-bootstrap-scss +XStatic_D3 python-xstatic-d3 +XStatic_Font_Awesome python-xstatic-font-awesome +XStatic_Hogan python-xstatic-hogan +XStatic_JQuery.Bootstrap.Wizard python-xstatic-jquery.bootstrap.wizard +XStatic_JQuery.TableSorter python-xstatic-jquery.tablesorter +XStatic_JQuery.quicksearch python-xstatic-jquery.quicksearch +XStatic_JQuery_Migrate python-xstatic-jquery-migrate +XStatic_JSEncrypt python-xstatic-jsencrypt +XStatic_Jasmine python-xstatic-jasmine +XStatic_Magic_Search python-xstatic-magic-search +XStatic_QUnit python-xstatic-qunit +XStatic_Rickshaw python-xstatic-rickshaw +XStatic_Spin python-xstatic-spin +XStatic_bootswatch python-xstatic-bootswatch +XStatic_jQuery python-xstatic-jquery +XStatic_jquery_ui python-xstatic-jquery-ui +XStatic_mdi python-xstatic-mdi +XStatic_roboto_fontface python-xstatic-roboto-fontface +XStatic_smart_table python-xstatic-smart-table +XStatic_term.js python-xstatic-term.js X_Tile x-tile +XlsxWriter python-xlsxwriter +Yapsy python-yapsy +ZConfig python-zconfig ZODB3 python-zodb +ZSI python-zsi +ZooKeeper python-zookeeper _tifffile python-tifffile +aafigure python-aafigure +abstract_rendering python-abstract-rendering +acme python-acme +actdiag python-actdiag +activipy python-activipy +activity_log_manager activity-log-manager +admesh python-admesh adns_python python-adns -alembic alembic +adodb python-adodb +affine python-affine +agtl agtl +aioeventlet python-aioeventlet +alabaster python-alabaster +albatross python-albatross +alembic python-alembic +altgraph python-altgraph allmydata_tahoe tahoe-lafs +amqp python-amqp +amqplib python-amqplib +androguard androguard +aniso8601 python-aniso8601 ansible ansible +antlr_python_runtime python-antlr3 +anyjson python-anyjson +aodh python-aodh +aodhclient python-aodhclient apache_libcloud python-libcloud -apparmor apparmor-easyprof +apipkg python-apipkg +apns_client python-apns-client +app_catalog_ui python-app-catalog-ui +apparmor python-apparmor +appdirs python-appdirs +apprecommender apprecommender +apptools python-apptools +apsw python-apsw apt_clone apt-clone +apt_p2p apt-p2p +apt_xapian_index apt-xapian-index aptfs aptfs aptoncd aptoncd arandr arandr @@ -134,26 +483,105 @@ archipel_core archipel-core archivemail archivemail archmage archmage +argcomplete python-argcomplete +argh python-argh +args python-args +argvalidate python-argvalidate arista arista +arpy python-arpy +arrayfire python-arrayfire +arrow python-arrow +asdf python-asdf +ase python-ase +astLib python-astlib assword assword +astor python-astor +astroML python-astroml +astroML_addons python-astroml-addons +astroid python-astroid +astropy python-astropy +astropy_helpers python-astropy-helpers +astroquery python-astroquery +astroscrappy python-astroscrappy +async python-async atheist atheist +attrs python-attr +audioread python-audioread +authres python-authres +autobahn python-autobahn autokey autokey-common +automaton python-automaton automx automx +autopep8 python-autopep8 +autoradio autoradio +avc python-avc +avro python-avro +babelfish python-babelfish +backports.shutil_get_terminal_size python-backports-shutil-get-terminal-size +backports.ssl_match_hostname python-backports.ssl-match-hostname +backports_abc python-backports-abc +backup2swift python-backup2swift +bandit python-bandit +barbican python-barbican barman barman +basemap python-mpltoolkits.basemap +bashate python-bashate +bcdoc python-bcdoc +bcrypt python-bcrypt +beanbag python-beanbag +beanstalkc python-beanstalkc beautifulsoup4 python-bs4 +bernhard python-bernhard +betamax python-betamax +bibtexparser python-bibtexparser bicyclerepair bicyclerepair +billiard python-billiard +binaryornot python-binaryornot +binplist python-binplist +bioblend python-bioblend binwalk binwalk +biom_format python-biom-format +biopython python-biopython +biplist python-biplist +bitarray python-bitarray +bitstring python-bitstring +bitstruct python-bitstruct +bjsonrpc python-bjsonrpc +bleach python-bleach +blessed python-blessed +blessings python-blessings bley bley +blinker python-blinker +blist python-blist +blockdiag python-blockdiag +bloom python-bloom bmap_tools bmap-tools +bobo python-bobo bookletimposer bookletimposer +bootstrap_vz bootstrap-vz +boto python-boto +boto3 python-boto3 +botocore python-botocore +bottle python-bottle bpython bpython +braintree python-braintree +breadability python-breadability +breathe python-breathe +brian python-brian +bsddb3 python-bsddb3 +btchip_python python-btchip +btest btest bugs_everywhere bugs-everywhere +bugwarrior bugwarrior buildbot buildbot buildbot_slave buildbot-slave +bunch python-bunch burn burn +burrito python-burrito +buzhug python-buzhug +bz2file python-bz2file bzr python-bzrlib bzr_builddeb bzr-builddeb -bzr_cia cia-clients bzr_email bzr-email bzr_etckeeper etckeeper bzr_fastimport bzr-fastimport @@ -163,393 +591,2207 @@ bzr_tweet bzr-tweet bzr_upload bzr-upload bzr_xmloutput bzr-xmloutput +cached_property python-cached-property +cachetools python-cachetools +cairocffi python-cairocffi +calabash python-calabash +caldav python-caldav calypso calypso cappuccino cappuccino +capstone python-capstone carbon graphite-carbon cardstories cardstories +carrot python-carrot +cassandra_driver python-cassandra +castellan python-castellan +catkin_pkg python-catkin-pkg +cbor python-cbor +ccdproc python-ccdproc +cclib python-cclib +cdo python-cdo cecilia cecilia -cfget cfget +ceilometer python-ceilometer +ceilometermiddleware python-ceilometermiddleware +celery python-celery +celery_haystack python-django-celery-haystack +cement python-cement +ceres python-ceres +certbot python-certbot +certbot_apache python-certbot-apache +certifi python-certifi +cffi python-cffi +cfflib python-cfflib +chaco python-chaco +changelog python-changelog +characteristic python-characteristic +chardet python-chardet +chaussette chaussette +chemfp python-chemfp chirp chirp chm2pdf chm2pdf +cigi python-cigi +cinder python-cinder +cinfony python-cinfony +circuits python-circuits +circus circus +citeproc_py python-citeproc +ck python-ck +ckanclient python-ckanclient +cliapp python-cliapp +click python-click +click_plugins python-click-plugins +cliff python-cliff cliff_tablib cliff-tablib +cligh cligh +cligj python-cligj +clint python-clint closure_linter closure-linter cloud_init cloud-init +cloud_sptheme python-cloud-sptheme +cluster python-cluster +cm config-manager +cmd2 python-cmd2 cmdtest cmdtest +cmislib python-cmislib +cobbler python-cobbler +cobe python-cobe +cobra python-cobra +cogent python-cogent +colander python-colander +colorama python-colorama +colorlog python-colorlog +commando python-commando +configglue python-configglue +configobj python-configobj +configparser python-configparser +congress python-congress +construct python-construct +contextlib2 python-contextlib2 +contract python-contract +convoy python-convoy +cookiecutter python-cookiecutter +cookies python-cookies core_python core-network-daemon core_python_netns core-network-daemon corens3_python core-network-daemon +couchdbkit python-couchdbkit +couleur python-couleur +cov_core python-cov-core +coverage python-coverage +cppman cppman +cpopen python-cpopen +cpuset cpuset +cpyrit_opencl pyrit-opencl +cracklib python-cracklib +cram python-cram +crank python-crank +crcmod python-crcmod +creepy creepy +crit criu +crmsh crmsh +croniter python-croniter +cryptography python-cryptography +cryptography_vectors python-cryptography-vectors +cs python-cs +csa python-csa +csb python-csb +csscompressor python-csscompressor cssmin cssmin +cssselect python-cssselect +cssutils python-cssutils +csvkit python-csvkit +curtsies python-curtsies +cutadapt python-cutadapt +cubictemp python-cubictemp cvs2svn cvs2svn +cvxopt python-cvxopt +cwiid python-cwiid +cwltool cwltool cwm python-swap +cycler python-cycler +cyclone python-cyclone +cymruwhois python-cymruwhois +d2to1 python-d2to1 +d_rats d-rats +daemonize python-daemonize +dap python-dap +darts.util.lru python-darts.lib.utils.lru +datalad python-datalad +datanommer.commands python-datanommer.commands +datanommer.consumer python-datanommer.consumer +datanommer.models python-datanommer.models +dbf python-dbf datapm datapm dblatex dblatex +dcmstack python-dcmstack +dcos python-dcos +dctrl2xml dctrl2xml +ddt python-ddt +deap python-deap +debiancontributors python-debiancontributors +debpartial_mirror debpartial-mirror +debtcollector python-debtcollector +debtagshw python-debtagshw +decorator python-decorator +defer python-defer +defusedxml python-defusedxml deluge deluge-common +demjson python-demjson +derpconf python-derpconf +descartes python-descartes +designate python-designate +designate_dashboard python-designate-dashboard +dexml python-dexml +dfdatetime python-dfdatetime +dfvfs python-dfvfs dh_virtualenv dh-virtualenv -dicompyler dicompyler +dhcpy6d dhcpy6d +dhm python-dhm +diamond python-diamond +diaspy python-diaspy +dib_utils python-dib-utils +diceware diceware +dicoclient python-dicoclient +dictclient python-dictclient +dictdlib python-dictdlib +dictobj python-dictobj +diff_match_patch python-diff-match-patch +dill python-dill +dingus python-dingus +dipy python-dipy +dirspec python-dirspec +diskimage_builder python-diskimage-builder dispcalGUI dispcalgui dissy dissy +distlib python-distlib +distorm3 python-distorm3 +distro_info python-distro-info +djagios djagios +django_admin_sortable python-django-adminsortable +django_adminaudit python-django-adminaudit django_ajax_selects python-ajax-select +django_app_plugins python-django-app-plugins +django_appconf python-django-appconf +django_assets python-django-assets +django_audit_log python-django-audit-log django_appconf python-appconf +django_auth_ldap python-django-auth-ldap +django_authority python-django-authority +django_babel python-django-babel +django_bitfield python-django-bitfield django_bootstrap_form python-bootstrapform +django_braces python-django-braces +django_celery python-django-celery +django_celery_transactions python-django-celery-transactions +django_classy_tags python-django-classy-tags +django_compat python-django-compat +django_compressor python-django-compressor +django_conneg python-django-conneg django_compressor python-compressor +django_contact_form python-django-contact-form +django_cors_headers python-django-cors-headers +django_countries python-django-countries +django_crispy_forms python-django-crispy-forms +django_dajax python-django-dajax +django_dajaxice python-django-dajaxice +django_debug_toolbar python-django-debug-toolbar +django_discover_runner python-django-discover-runner +django_downloadview python-django-downloadview +django_environ python-django-environ +django_evolution python-django-evolution +django_extensions python-django-extensions +django_extra_views python-django-extra-views django_filter python-django-filters +django_floppyforms python-django-floppyforms +django_formtools python-django-formtools +django_fsm python-django-fsm +django_fsm_admin python-django-fsm-admin +django_formfieldset python-django-formfieldset +django_genshi python-django-genshi +django_gravatar2 python-django-gravatar2 +django_guardian python-django-guardian +django_haystack python-django-haystack +django_hijack python-django-hijack +django_housekeeping python-django-housekeeping +django_jinja python-django-jinja +django_jsonfield python-django-jsonfield +django_kvstore python-django-kvstore +django_ldapdb python-django-ldapdb +django_localflavor python-django-localflavor +django_macaddress python-django-macaddress +django_markupfield python-django-markupfield +django_model_utils python-django-model-utils +django_modeltranslation python-django-modeltranslation +django_mptt python-django-mptt +django_navtag python-django-navtag +django_nose python-django-nose +django_notification python-django-notification +django_oauth_toolkit python-django-oauth-toolkit +django_openid_auth python-django-auth-openid django_openstack_auth python-openstack-auth -django_tastypie python-tastypie +django_ordered_model python-django-ordered-model +django_overextends python-django-overextends +django_pagination python-django-pagination +django_picklefield python-django-picklefield +django_pipeline python-django-pipeline +django_piston python-django-piston +django_polymorphic python-django-polymorphic +django_prometheus python-django-prometheus +django_pyscss python-django-pyscss +django_python3_ldap python-django-python3-ldap +django_ratelimit python-django-ratelimit +django_recurrence python-django-recurrence +django_registration python-django-registration +django_rest_framework_nested_resource python-djangorestframework-nested-resource +django_restricted_resource python-django-restricted-resource +django_reversion python-django-reversion +django_rosetta python-django-rosetta +django_sekizai python-django-sekizai +django_session_security python-django-session-security +django_shorturls python-django-shorturls +django_shortuuidfield python-django-shortuuidfield +django_simple_captcha python-django-captcha +django_sitetree python-django-sitetree +django_sortedm2m python-sortedm2m +django_stronghold python-django-stronghold +django_tables2 python-django-tables2 +django_tagging python-django-tagging +django_taggit python-django-taggit +django_tastypie python-django-tastypie +django_testproject django-testproject +django_testscenarios django-testscenarios +django_threaded_multihost python-django-threaded-multihost +django_threadedcomments python-django-threadedcomments +django_treebeard python-django-treebeard +django_uwsgi python-django-uwsgi +django_voting python-django-voting +django_webpack_loader python-django-webpack-loader +django_uuidfield python-django-uuidfield +django_websocket python-django-websocket +django_websocket_redis python-django-websocket-redis +django_xmlrpc python-django-xmlrpc +djangocms_admin_style python-djangocms-admin-style +djangorestframework python-djangorestframework +djangorestframework_gis python-djangorestframework-gis djextdirect python-django-extdirect +djoser python-djoser dkimpy python-dkim +dnspython python-dnspython +dnsq python-dnsq +doc8 python-doc8 +docker_compose docker-compose +docker_py python-docker +dockerpty python-dockerpty +docopt python-docopt +docutils python-docutils +dogpile.cache python-dogpile.cache +dogpile.core python-dogpile.core +dogtail python-dogtail +doit python-doit +dominate python-dominate +dosage dosage +dot2tex dot2tex +doublex python-doublex doxyqml doxyqml +dpkt python-dpkt +dput python-dput +drf_fsm_transitions python-djangorestframework-fsm-transitions +drf_generators python-djangorestframework-generators +drf_haystack python-djangorestframework-haystack driconf driconf +drmaa python-drmaa +drslib python-drslib +dtcwt python-dtcwt dtrx dtrx +duckduckgo2 python-duckduckgo2 +duecredit python-duecredit +dulwich python-dulwich +dumbnet python-dumbnet duplicity duplicity dvbobjects opencaster +dvcs_autosync dvcs-autosync +easygui python-easygui +easywebdav python-easywebdav +easyzone python-easyzone +ecdsa python-ecdsa eficas eficas +elasticsearch python-elasticsearch +elasticsearch_curator python-elasticsearch-curator +elementtidy python-elementtidy +elib.intl python-elib.intl +emcee python-emcee +empy python-empy +enable python-enable +enet python-enet ensymble ensymble +enum python-enum +enum34 python-enum34 +envisage python-envisage +enzyme python-enzyme +ephem python-ephem epigrass epigrass epoptes epoptes +epydoc python-epydoc +esmre python-esmre +et_xmlfile python-et-xmlfile +ethtool python-ethtool +etk.docking python-etk.docking euca2ools euca2ools +eventlet python-eventlet +exabgp exabgp +exam python-exam +execnet python-execnet +expeyes python-expeyes +expiringdict python-expiringdict explorer bzr-explorer +expyriment python-expyriment +extras python-extras +eyeD3 python-eyed3 +fabio python-fabio +fabulous python-fabulous +factory_boy python-factory-boy +fake_factory python-fake-factory +fakeredis python-fakeredis +falcon python-falcon +falcon_kit falconkit +fann2 python-fann2 +fastcluster python-fastcluster +fasteners python-fasteners +fastimport python-fastimport +fastkml python-fastkml +faulthandler python-faulthandler +fbless fbless +fdb python-fdb +fdroidserver fdroidserver +fdsend python-fdsend +feather_format python-feather-format +fedmsg python-fedmsg +fedmsg_meta_debian python-fedmsg-meta-debian +fedmsg_meta_fedora_infrastructure python-fedmsg-meta-fedora-infrastructure +feedgenerator python-feedgenerator +feedparser python-feedparser +ferretmagic python-ferret +file_encryptor python-file-encryptor +file_magic python-magic +ferari python-ferari +first python-first +fisx python-fisx +fitbit python-fitbit +fitsio python-fitsio +fiu python-fiu +fixtures python-fixtures fko libfko-python +flake8 python-flake8 +flaky python-flaky +flashbake flashbake +flashproxy_common flashproxy-common +flask_multistatic python-flaskext.multistatic +flask_rdf python-flask-rdf +flexmock python-flexmock +flickrapi python-flickrapi flickrfs flickrfs +flower python-flower +flufl.bounce python-flufl.bounce +flufl.enum python-flufl.enum +flufl.i18n python-flufl.i18n +flufl.lock python-flufl.lock +flufl.password python-flufl.password +flup python-flup +fmcs python-fmcs +fontforge python-fontforge fontypython fontypython +foolscap python-foolscap +forgetHTML python-forgethtml +forgetSQL python-forgetsql +fpconst python-fpconst +freeipa python-freeipa +freevo python-freevo +freezegun python-freezegun frescobaldi frescobaldi +freshen python-freshen +frozendict python-frozendict +fs python-fs +fswrap python-fswrap +fte python-fte +fteproxy fteproxy +ftp_cloudfs python-ftp-cloudfs fts fts fts_clacks fts-clacks fts_fai fts-fai-ldap fts_ltsp fts-ltsp-ldap fts_opsi fts-opsi +fudge python-fudge +fuel_agent python-fuel-agent +fuel_bootstrap python-fuel-bootstrap-cli +fuel_tasklib python-fuel-tasklib +funcparserlib python-funcparserlib +funcsigs python-funcsigs +functools32 python-functools32 funkload funkload fuse_python python-fuse +fusil fusil +future python-future futures python-concurrent.futures +futurist python-futurist +fuzzywuzzy python-fuzzywuzzy +fysom python-fysom +gWakeOnLan gwakeonlan +gabbi python-gabbi +galternatives galternatives gameclock gameclock +gamera python-gamera +gasp python-gasp +gaphas python-gaphas gaphor gaphor +gastables python-gastables gastablesgui gastables gbp git-buildpackage +gcalcli gcalcli +gccjit python-gccjit +gcircle python-ferret +gcm_client python-gcm-client +gcovr gcovr +gdata python-gdata +gdevilspie gdevilspie gdmodule python-gd +gear python-gear +gearman python-gearman genbackupdata genbackupdata +geneagrapher geneagrapher +genty python-genty +geographiclib python-geographiclib +geojson python-geojson +geolinks python-geolinks +geopandas python-geopandas +geopy python-geopy +germinate python-germinate +gerritlib python-gerritlib +gertty gertty +getdns python-getdns getmail getmail4 +gevent python-gevent +gevent_socketio python-socketio +gevent_websocket python-gevent-websocket geximon geximon +ghp_import ghp-import +ginga python-ginga +git_big_picture git-big-picture git_review git-review -github_cli github-cli +gitdb python-gitdb +gitinspector gitinspector gjots2 gjots2 +glance python-glance +glance_store python-glance-store glipper glipper +glitch python-glitch globs globs +glpk python-glpk +glueviz glueviz glue glue-sprite gmobilemedia gmobilemedia -gnome_app_install gnome-codec-install +gmplot python-gmplot +gmpy python-gmpy +gmpy2 python-gmpy2 +gnatpython python-gnatpython +gnocchi python-gnocchi +gnocchiclient python-gnocchiclient +gnome_activity_journal gnome-activity-journal +gnome_gmail gnome-gmail +gnukhataserver gnukhata-core-engine gnomecatalog gnomecatalog gnuplot_py python-gnuplot go2 go2 google_api_python_client python-googleapi -googlecl googlecl +google_apputils python-google-apputils +googlecloudapis python-googlecloudapis gourmet gourmet +gozerbot gozerbot +gpaw gpaw +gphoto2_cffi python-gphoto2cffi +gpodder gpodder +gps python-gps +gpyconf python-gpyconf gquilt gquilt +grabserial grabserial +grapefruit python-grapefruit graphite_web graphite-web +graphviz trac-graphviz +graypy python-graypy +greenio python-greenio +greenlet python-greenlet grokmirror grokmirror +gssapi python-gssapi +gsw python-gsw +gtextfsm python-gtextfsm +guacamole python-guacamole +guess_language_spirit python-guess-language +guessit python-guessit +guidata python-guidata +guiqwt python-guiqwt +gumbo python-gumbo +gunicorn python-gunicorn gunicorn gunicorn -gvb gvb +guzzle_sphinx_theme python-guzzle-sphinx-theme +gwebsockets python-gwebsockets gyp gyp +h5py python-h5py +hachoir_core python-hachoir-core +hachoir_metadata python-hachoir-metadata +hachoir_parser python-hachoir-parser +hachoir_regex python-hachoir-regex +hachoir_subfile python-hachoir-subfile +hachoir_urwid python-hachoir-urwid +hachoir_wx python-hachoir-wx +hacking python-hacking +halberd python-halberd +happybase python-happybase +haproxy_log_analysis python-haproxy-log-analysis +hashids python-hashids +hdf5storage python-hdf5storage +healpy python-healpy +heat python-heat +heat_cfntools heat-cfntools hgnested mercurial-nested +hgsubversion hgsubversion +hgview hgview-common +hidapi python-hid +hidapi_cffi python-hidapi +hiredis python-hiredis +hkdf python-hkdf +hl7 python-hl7 horizon python-django-horizon +hp3parclient python-hp3parclient +hpack python-hpack +hplefthandclient python-hplefthandclient +html2text python-html2text +html5lib python-html5lib +htmltmpl python-htmltmpl +http_parser python-http-parser +httpbin python-httpbin httpcode httpcode httpie httpie +httplib2 python-httplib2 +httpretty python-httpretty +humanize python-humanize +hunspell python-hunspell +hurry.filesize python-hurry.filesize +hy python-hy hyde hyde +hypothesis python-hypothesis +iapws python-iapws +ibm_db_sa python-ibm-db-sa +ibus_tegaki ibus-tegaki +icalendar python-icalendar icalview trac-icalviewplugin +icinga2 python-icinga2 identicurse identicurse +idna python-idna +ijson python-ijson +imagesize python-imagesize +imaplib2 python-imaplib2 +impacket python-impacket +imposm python-imposm imposm.parser python-imposm-parser +inflect python-inflect +influxdb python-influxdb +iniparse python-iniparse +inotifyx python-inotifyx +instant python-instant +invocations python-invocations +invoke python-invoke +ioprocess python-ioprocess ioprofiler ioapps iotop iotop +iowait python-iowait +ipaddr python-ipaddr +ipaddress python-ipaddress +ipaplatform python-freeipa +ipapython python-freeipa +ipatests freeipa-tests +ipcalc python-ipcalc +ipdb python-ipdb +iplib python-iplib +ipp python-libtrace ipython ipython -isoquery isoquery +ipython_genutils python-ipython-genutils +irc python-irc +ironic python-ironic +ironic_fa_deploy python-ironic-fa-deploy +ironic_inspector python-ironic-inspector +ironic_lib python-ironic-lib +isbnlib python-isbnlib +iso8601 python-iso8601 +isodate python-isodate +isort python-isort +isoweek python-isoweek +isso isso +itsdangerous python-itsdangerous +jabber.py python-jabber +jabberbot python-jabberbot +jack jack +jaxml python-jaxml +jdcal python-jdcal +jedi python-jedi +jenkins_job_builder python-jenkins-job-builder +jenkinsapi python-jenkinsapi +jingo python-jingo +jinja2_time python-jinja2-time +jmespath python-jmespath +joblib python-joblib +jpy python-jpy +jpylyzer python-jpylyzer +jsb jsonbot +jsmin python-jsmin +json_schema_validator python-json-schema-validator +jsonpatch python-jsonpatch +jsonpath_rw python-jsonpath-rw +jsonpath_rw_ext python-jsonpath-rw-ext +jsonpickle python-jsonpickle +jsonpipe python-jsonpipe jsonpointer python-json-pointer +jsonrpc2 python-jsonrpc2 +jsonrpclib python-jsonrpclib +jsonschema python-jsonschema +junit_xml python-junit.xml +junitxml python-junitxml +junos_eznc python-junos-eznc +kaa_base python-kaa-base +kaa_imlib2 python-kaa-imlib2 +kaa_metadata python-kaa-metadata +kafka_python python-kafka +kapidox kapidox +kazoo python-kazoo +kdtree python-kdtree kedpm kedpm +keepkey python-keepkey keepnote keepnote key_mon key-mon keymapper keymapper +keyring python-keyring +keyrings.alt python-keyrings.alt +keystone python-keystone +keystoneauth1 python-keystoneauth1 +keystonemiddleware python-keystonemiddleware keysync keysync +keyutils python-keyutils +kid python-kid kiki kiki +kineticsTools python-kineticstools +kinterbasdb python-kinterbasdb +kitchen python-kitchen +kiwi python-kiwi +kjbuckets python-kjbuckets +klaus klaus +klein python-klein +kmodpy python-kmodpy +knockpy knockpy +kombu python-kombu +laditools python-laditools +lamson python-lamson +landslide python-landslide +larch python-larch +latexcodec python-latexcodec +launchpadlib python-launchpadlib +lava_coordinator lava-coordinator +lava_dispatcher lava-dispatcher +lava_server lava-server +lava_tool lava-tool +lavapdu lavapdu-daemon +lazr.config python-lazr.config +lazr.delegates python-lazr.delegates +lazr.restfulclient python-lazr.restfulclient +lazr.smtptest python-lazr.smtptest +lazr.uri python-lazr.uri +lazy_object_proxy python-lazy-object-proxy +lazyarray python-lazyarray lazygal lazygal +ldap3 python-ldap3 +ldappool python-ldappool +ldif3 python-ldif3 +ledger_autosync ledger-autosync legit legit +lesscpy python-lesscpy +leveldb python-leveldb +lhapdf python-lhapdf +lib389 python-lib389 +libLAS python-liblas +libarchive_c python-libarchive-c +libconcord python-libconcord +libiio python-libiio +liblarch python-liblarch +libnacl python-libnacl +libsass python-libsass +libtiff python-libtiff +libturpial python-libturpial libvirt_python python-libvirt -lio lio-utils +lightblue python-lightblue +linecache2 python-linecache2 +linop python-linop +live_wrapper live-wrapper +livereload python-livereload +livestreamer python-livestreamer +llfuse python-llfuse llnl_babel python-sidl llnl_babel_sidl_sidlx python-sidl +lmdb python-lmdb llvmpy python-llvm +lmfit python-lmfit +lockfile python-lockfile loggerhead loggerhead +logging_tree python-logging-tree +logilab_astng python-logilab-astng +logilab_common python-logilab-common +logilab_constraint python-logilab-constraint logster logster +logutils python-logutils +londonlaw londonlaw +loofah python-loofah +louis python-louis lptools lptools +lua python-lua lshell lshell +lucene python-lucene ludev_t ludevit +lunch python-lunch +lvm python-lvm2 +lxc_python2 python-lxc +lxml python-lxml lybniz lybniz +lz4 python-lz4 +m2ext python-m2ext +m3u8 python-m3u8 +macaron python-macaron +macholib python-macholib +macsyfinder macsyfinder +magnum python-magnum +mailer python-mailer +mailman_api mailman-api mailnag mailnag +mandrill python-mandrill +manila python-manila +manila_ui python-manila-ui +manuel python-manuel +mapnik python-mapnik +mapper python-libmapper +marisa python-marisa +mate_menu mate-menu +matplotlib python-matplotlib +matplotlib_venn python-matplotlib-venn +maxminddb python-maxminddb mayavi mayavi2 +mccabe python-mccabe mcomix mcomix +measurement python-measurement mecab_python python-mecab +mechanize python-mechanize +medusa python-medusa melange python-cream.melange +meld meld +meld3 python-meld3 +meliae python-meliae +memory_profiler python-memory-profiler +memprof python-memprof mercurial mercurial-common +mercurial_extension_utils mercurial-extension-utils mercurial_keyring mercurial-keyring +metaconfig python-metaconfig metastudent metastudent +microversion_parse python-microversion-parse +mididings python-mididings +mido python-mido +mimms mimms mingc python-ming +mini_buildd python-mini-buildd +mini_dinstall mini-dinstall +minieigen python-minieigen +mininet mininet +miniupnpc python-miniupnpc +mipp python-mipp +misaka python-misaka +mistral python-mistral +mistune python-mistune mitmproxy mitmproxy +mlbviewer mlbviewer +mne python-mne +mnemonic python-mnemonic +mock python-mock +mocker python-mocker +mockito python-mockito +mockldap python-mockldap mod_python libapache2-mod-python +mod_pywebsocket python-mod-pywebsocket +model_mommy python-model-mommy moin python-moinmoin +moksha.common python-moksha.common +moksha.hub python-moksha.hub +monajat python-monajat +mongoengine python-mongoengine monkeysign monkeysign +monotonic python-monotonic +montage_wrapper python-montage-wrapper moosic moosic +morris python-morris +mousetrap gnome-mousetrap +mox python-mox +mox3 python-mox3 mozilla_devscripts mozilla-devscripts -mpDris mpdris +mpegdash python-mpegdash +mpi4py python-mpi4py +mpld3 python-mpld3 +mplexporter python-mplexporter +mpmath python-mpmath +mpop python-mpop +mps_youtube mps-youtube +mrjob python-mrjob +mrtparse python-mrtparse msgpack_python python-msgpack +multi_key_dict python-multi-key-dict +multicorn python-multicorn +multipletau python-multipletau +munch python-munch +munkres python-munkres +murano python-murano +murano_agent murano-agent +murano_dashboard python-murano-dashboard +museek_python_bindings python-museek +musicbrainzngs python-musicbrainzngs +mutagen python-mutagen +mwparserfromhell python-mwparserfromhell +mygpoclient python-mygpoclient +mysql_connector_python python-mysql.connector mysql_utilities mysql-utilities -nautilus_pastebin nautilus-pastebin +mysqlclient python-mysqldb +nagiosplugin python-nagiosplugin +nailgun python-nailgun +nameparser python-nameparser +nanomsg python-nanomsg +napalm_base python-napalm-base +napalm_eos python-napalm-eos +napalm_fortios python-napalm-fortios +napalm_ios python-napalm-ios +napalm_iosxr python-napalm-iosxr +napalm_junos python-napalm-junos +natkit python-libtrace +natsort python-natsort +naturalsort python-naturalsort +nbxmpp python-nbxmpp +ncap python-ncap +ncclient python-ncclient +ndg_httpsclient python-ndg-httpsclient +nemu python-nemu +neo python-neo +netCDF4 python-netcdf4 neso tryton-neso +netaddr python-netaddr +netfilter python-netfilter +netifaces python-netifaces +netlib python-netlib +netmiko python-netmiko netsnmp_python python-netsnmp +netsyslog python-netsyslog +networking_arista python-networking-arista +networking_l2gw python-networking-l2gw +networking_mlnx python-networking-mlnx +networking_ovs_dpdk python-networking-ovs-dpdk +networkx python-networkx +neuroshare python-neuroshare +neutron python-neutron +neutron_fwaas python-neutron-fwaas +neutron_lbaas python-neutron-lbaas +neutron_lib python-neutron-lib +neutron_vpnaas python-neutron-vpnaas +nglister nglister +ngs python-ngs +nibabel python-nibabel +nine python-nine +nipy python-nipy +nipype python-nipype +nitime python-nitime +nltk python-nltk nml nml +nordugrid_arc_gangliarc nordugrid-arc-gangliarc +nordugrid_arc_nagios_plugins nordugrid-arc-nagios-plugins +nose python-nose +nose2 python-nose2 +nose2_cov python-nose2-cov +nose_exclude python-nose-exclude +nose_parameterized python-nose-parameterized +nose_testconfig python-nose-testconfig +nose_timer python-nose-timer +nosehtmloutput python-nosehtmloutput +nosexcover python-nosexcover +notify2 python-notify2 +notmuch python-notmuch +nova python-nova +nsscache nsscache +ntplib python-ntplib +numexpr python-numexpr +numm python-numm +numpy python-numpy +numpydoc python-numpydoc +nwdiag python-nwdiag +nwsclient python-nwsclient +nwsserver python-nwsserver nxt_python python-nxt +oauth python-oauth +oauth2client python-oauth2client +oauthlib python-oauthlib +obMenu obmenu +obexftp python-obexftp obfsproxy obfsproxy +objgraph python-objgraph obnam obnam oboinus oboinus +ocsmanager python-ocsmanager odfpy python-odf -offlineimap offlineimap +offtrac python-offtrac +ofxclient python-ofxclient +ofxhome python-ofxhome +ofxparse python-ofxparse oidua oidua +ooniprobe ooniprobe ooo2dbk ooo2dbk ooolib_python python-ooolib +openbabel python-openbabel openbmap_logger openbmap-logger +openopt python-openopt +openpyxl python-openpyxl +opensesame opensesame +openslide_python python-openslide +openstack.nose_plugin python-openstack.nose-plugin +openstack_doc_tools python-openstack-doc-tools +openstackdocstheme python-openstackdocstheme +openstacksdk python-openstacksdk +opster python-opster +optcomplete python-optcomplete +os_apply_config python-os-apply-config +os_brick python-os-brick +os_client_config python-os-client-config +os_cloud_config python-os-cloud-config +os_collect_config python-os-collect-config +os_net_config python-os-net-config +os_refresh_config python-os-refresh-config +os_testr python-os-testr +os_win python-os-win osc osc -pYsearch python-yahoo +oslo.cache python-oslo.cache +oslo.concurrency python-oslo.concurrency +oslo.config python-oslo.config +oslo.context python-oslo.context +oslo.db python-oslo.db +oslo.i18n python-oslo.i18n +oslo.log python-oslo.log +oslo.messaging python-oslo.messaging +oslo.middleware python-oslo.middleware +oslo.policy python-oslo.policy +oslo.privsep python-oslo.privsep +oslo.reports python-oslo.reports +oslo.rootwrap python-oslo.rootwrap +oslo.serialization python-oslo.serialization +oslo.service python-oslo.service +oslo.utils python-oslo.utils +oslo.versionedobjects python-oslo.versionedobjects +oslo.vmware python-oslo.vmware +oslosphinx python-oslosphinx +oslotest python-oslotest +osmapi python-osmapi +osprofiler python-osprofiler +overpass python-overpass +ow python-ow +ownet python-ownet +oz oz +packaging python-packaging +pacparser python-pacparser +padme python-padme +pagekite pagekite +pager python-pager +paisley python-paisley pam python-pampy -pbundler pbundler +pandas python-pandas +pandocfilters python-pandocfilters +paramiko python-paramiko +park python-park +parse python-parse +parsedatetime python-parsedatetime +passlib python-passlib +path.py python-path +path_and_address python-path-and-address +pathlib python-pathlib +pathlib2 python-pathlib2 +pathtools python-pathtools +patool patool +patsy python-patsy +paypal python-paypal +pbalign python-pbalign +pbbarcode pbbarcode +pbcommand python-pbcommand +pbcore python-pbcore +pbh5tools python-pbh5tools +pbkdf2 python-pbkdf2 +pbr python-pbr +pcapdump python-libbtbb-pcapdump +pcapy python-pcapy +pcp python-pcp +pcs python-pcs +pdfminer python-pdfminer +pdfrw python-pdfrw pdfshuffler pdfshuffler +pdftools python-pdftools +pebl python-pebl +pecan python-pecan +pefile python-pefile +pelican pelican +pep257 pep257 +pelican python-pelican pep8 pep8 +pep8_naming python-pep8-naming perroquet perroquet +persistent python-persistent +petsc4py python-petsc4py +pex python-pex +pexif python-pexif +pexpect python-pexpect +pg8000 python-pg8000 pg_activity pg-activity +pglistener pglistener +pgmagick python-pgmagick +pgpdump python-pgpdump +pgspecial python-pgspecial pgxnclient pgxnclient photo_uploader photo-uploader -photofilmstrip photofilmstrip +photutils python-photutils +phply python-phply +phpserialize python-phpserialize +pickleshare python-pickleshare +piggyphoto python-piggyphoto +pika python-pika +pika_pool python-pika-pool +pilkit python-pilkit +pip python-pip +pipedviewer python-ferret +pisa python-pisa +pius pius +pjsua python-pjproject pithos pithos +pkgconfig python-pkgconfig +pkginfo python-pkginfo +pkpgcounter pkpgcounter +plasTeX python-plastex +plaso plaso +pldns python-libtrace +plip plip +plotly python-plotly +plt python-libtrace +pluggy python-pluggy +plumbum python-plumbum +ply python-ply +pmock python-pmock +polib python-polib pondus pondus +poretools poretools +portalocker python-portalocker +positional python-positional +posix_ipc python-posix-ipc +poster python-poster +power python-power +powerline_status python-powerline +pp python-pp +praw python-praw +preggy python-preggy +prelude python-prelude +prelude_correlator prelude-correlator +prelude_notify prelude-notify +preludedb python-preludedb preprocess preprocess presage_dbus_service presage-dbus +presentty presentty +pretend python-pretend +prettytable python-prettytable prewikka prewikka +prioritized_methods python-peak.rules +proboscis python-proboscis +profitbricks python-profitbricks +profitbricks_client python-profitbricks-client +progress python-progress +progressbar python-progressbar +proliantutils python-proliantutils +prometheus_client python-prometheus-client +prompt_toolkit python-prompt-toolkit +proteus tryton-proteus +protobix python-protobix +protobuf python-protobuf +protobuf.socketrpc python-protobuf.socketrpc +protorpc_standalone python-protorpc-standalone +prowlpy python-prowlpy +psphere python-psphere +pssh pssh +psutil python-psutil +psycogreen python-psycogreen +psycopg2 python-psycopg2 ptex2tex ptex2tex +pthreading python-pthreading +ptk python-ptk +ptyprocess python-ptyprocess +publicsuffix python-publicsuffix +pudb python-pudb +puddletag puddletag +pulseaudio_dlna pulseaudio-dlna +puppet_vswitch puppet-module-vswitch purity_ng purity-ng +purl python-purl +pushy python-pushy +pwquality python-pwquality +py python-py +pyCardDAV python-pycarddav +pyClamd python-pyclamd +pyDoubles python-pydoubles +pyEOS python-pyeos pyExcelerator python-excelerator +pyFAI python-pyfai pyFAI pyfai +pyFFTW python-pyfftw +pyIOSXR python-pyiosxr pyLibravatar python-libravatar -pyOwnCloud python-owncloud +pyMapperGUI pymappergui +pyNFFT python-pynfft +pyOpenSSL python-openssl +pyPdf python-pypdf +pyPortMidi python-pypm +pyRFC3339 python-rfc3339 pySFML python-sfml +pyScss python-pyscss +pyVows python-pyvows py_Asterisk python-asterisk py_bcrypt python-bcrypt +py_libmpdclient python-mpdclient +py_moneyed python-moneyed py_pypcap python-pypcap py_rrdtool python-rrdtool pyacidobasic python-acidobasic pyacoustid python-acoustid +pyalsa python-pyalsa pyalsaaudio python-alsaaudio +pyapi_gitlab python-gitlab +pyasn1 python-pyasn1 +pyasn1_modules python-pyasn1-modules +pybloom python-bloomfilter +pybloomfiltermmap python-pybloomfiltermmap pyblosxom pyblosxom pybridge pybridge +pybtex pybtex pybugz bugz +pycadf python-pycadf +pycalendar python-pycalendar +pycassa python-pycassa +pycha python-pycha pychecker pychecker pychess pychess +pychm python-chm +pyclamav python-pyclamav pyclips python-clips +pycoast python-pycoast pycollada python-collada +pycorrfit pycorrfit +pycountry python-pycountry +pycparser python-pycparser pycrypto python-crypto +pycryptopp python-pycryptopp pycups python-cups +pycurl python-pycurl +pydds python-pydds +pydhcplib python-pydhcplib pydicom python-dicom +pydirector python-pydirector pydns python-dns +pydoctor python-pydoctor +pydot python-pydot +pydot_ng python-pydot-ng +pydotplus python-pydotplus +pyds9 python-pyds9 +pyeapi python-pyeapi +pyelftools python-pyelftools +pyelliptic python-pyelliptic pyenchant python-enchant +pyentropy python-pyentropy +pyepl python-pyepl pyepr python-epr +pyface python-pyface +pyfacebook python-facebook +pyfann python-pyfann +pyfaidx python-pyfaidx +pyferret python-ferret +pyfg python-pyfg +pyfiglet python-pyfiglet +pyfits python-pyfits pyflakes pyflakes +pyfribidi python-pyfribidi +pyftpdlib python-pyftpdlib +pygal python-pygal +pygame python-pygame +pygame_sdl2 python-pygame-sdl2 +pygccxml python-pygccxml +pygdchart python-gdchart2 +pygeoif python-pygeoif +pyghmi python-pyghmi +pygit2 python-pygit2 +pyglet python-pyglet pygmi wmii pygobject python-gi +pygooglechart python-pygooglechart pygopherd pygopherd -pygpgme python-gpgme +pygpgme python-pyme pygpiv python-gpiv +pygrace python-pygrace +pygraphviz python-pygraphviz pygrib python-grib +pygtail python-pygtail pygtkspellcheck python-gtkspellcheck pygts python-gts +pyhsm python-pyhsm +pyinotify python-pyinotify +pyip python-pyip +pyjavaproperties python-pyjavaproperties +pykaraoke python-pykaraoke +pykdtree python-pykdtree +pyke python-pyke +pykerberos python-kerberos +pykickstart python-pykickstart +pyknon python-pyknon +pylast python-pylast +pylibacl python-pylibacl pyliblo python-liblo +pyliblzma python-lzma +pylibmc python-pylibmc pylibpcap python-libpcap +pylibssh2 python-libssh2 pylibtiff python-libtiff pylint pylint +pylint_celery python-pylint-celery +pylint_common python-pylint-common +pylint_django python-pylint-django +pylint_flask python-pylint-flask +pylint_plugin_utils python-pylint-plugin-utils +pylirc python-pylirc pylogsparser python-logsparser +pylxd python-pylxd +pymacaroons python-pymacaroons +pymad python-pymad +pymc python-pymc pymecavideo python-mecavideo +pymemcache python-pymemcache +pymetar python-pymetar pymia python-mia pymilter python-milter +pymodbus python-pymodbus pymol pymol pymtbl python-mtbl +pymucipher python-museek +pymvpa2 python-mvpa2 +pynast pynast pyneighborhood pyneighborhood +pynzb python-pynzb +pyo python-pyo +pyogg python-ogg +pyopencl python-pyopencl +pyorbital python-pyorbital +pyosd python-pyosd pyp pyp pyparallel python-parallel +pyparsing python-pyparsing +pyparted python-parted +pyproj python-pyproj pyprompter pyprompter +pyptlib python-pyptlib +pypureomapi python-pypureomapi pyqi pyqi +pyqtgraph python-pyqtgraph +pyquery python-pyquery +pyrad python-pyrad +pyramid python-pyramid +pyramid_beaker python-pyramid-beaker +pyramid_multiauth python-pyramid-multiauth +pyramid_tm python-pyramid-tm +pyramid_zcml python-pyramid-zcml +pyrax python-pyrax +pyregion python-pyregion pyremctl python-remctl +pyresample python-pyresample +pyrit pyrit +pyroma python-pyroma +pyroute2 python-pyroute2 +pyrite_publisher pyrite-publisher +pysam python-pysam +pysaml2 python-pysaml2 pysane python-sane pysatellites python-satellites +pyscanfcs pyscanfcs +pyscard python-pyscard +pyscript python-pyscript +pysendfile python-sendfile pyserial python-serial +pyshp python-pyshp +pysmbc python-smbc pysnmp python-pysnmp4 pysnmp_apps python-pysnmp4-apps pysnmp_mibs python-pysnmp4-mibs +pysolr python-pysolr pysparse python-sparse +pyspatialite python-pyspatialite pyspf python-spf pysqlite python-pysqlite2 +pysrs python-srs +pysrt python-pysrt +pyssim python-pyssim +pyst python-pyst +pystache python-pystache pysubnettree python-subnettree +pysurfer python-surfer +pysynphot python-pysynphot pytagsfs pytagsfs +pytc python-pytc pytcpwrap python-tcpwrap +pyte python-pyte +pytest python-pytest +pytest_catchlog python-pytest-catchlog +pytest_cov python-pytest-cov +pytest_django python-pytest-django +pytest_httpbin python-pytest-httpbin +pytest_instafail python-pytest-instafail +pytest_localserver python-pytest-localserver +pytest_mock python-pytest-mock +pytest_multihost python-pytest-multihost +pytest_pylint python-pytest-pylint +pytest_runner python-pytest-runner +pytest_sourceorder python-pytest-sourceorder +pytest_timeout python-pytest-timeout +pytest_tornado python-pytest-tornado +pytest_xdist python-pytest-xdist +pyth python-pyth +python2_biggles python-pybiggles +python2_pythondialog python-dialog +python3_ldap python-ldap3 +python_Levenshtein python-levenshtein +python_aalib python-aalib +python_afl python-afl +python_application python-application +python_apt python-apt +python_augeas python-augeas +python_axolotl python-axolotl +python_axolotl_curve25519 python-axolotl-curve25519 +python_barbicanclient python-barbicanclient +python_bibtex python-bibtex +python_bitbucket python-bitbucket +python_bugzilla python-bugzilla +python_casacore python-casacore +python_catcher python-catcher +python_cdd python-cdd +python_ceilometerclient python-ceilometerclient +python_cinderclient python-cinderclient +python_cjson python-cjson +python_cloudfiles python-cloudfiles +python_congressclient python-congressclient +python_corepywrap python-corepywrap +python_cpl python-cpl +python_cream python-cream +python_crontab python-crontab +python_daemon python-daemon +python_dateutil python-dateutil +python_dbusmock python-dbusmock +python_debian python-debian +python_debianbts python-debianbts +python_default_encoding python-freeipa +python_designateclient python-designateclient +python_distutils_extra python-distutils-extra +python_djvulibre python-djvu +python_dmidecode python-dmidecode +python_e_dbus python-edbus +python_editor python-editor +python_espeak python-espeak +python_etcd python-etcd +python_evtx python-evtx +python_exconsole python-exconsole +python_fcgi python-fcgi +python_fedora python-fedora +python_freecontact python-freecontact +python_fuelclient python-fuelclient +python_gammu python-gammu +python_geohash python-geohash +python_geoclue python-geoclue +python_gflags python-gflags +python_glanceclient python-glanceclient +python_gnupg python-gnupg +python_gnutls python-gnutls +python_graph_core python-pygraph +python_graph_dot python-pygraph +python_gtkmvc python-gtkmvc +python_heatclient python-heatclient +python_hglib python-hglib +python_hpilo python-hpilo +python_igraph python-igraph +python_instagram python-instagram +python_ironic_inspector_client python-ironic-inspector-client +python_ironicclient python-ironicclient +python_jenkins python-jenkins +python_jswebkit python-jswebkit +python_keyczar python-keyczar +python_keystoneclient python-keystoneclient +python_ldap python-ldap +python_libdiscid python-libdiscid python_libgearman python-gearman.libgearman +python_libguess python-libguess +python_libpisock python-pisock +python_librtmp python-librtmp +python_libtorrent python-libtorrent python_logging_extra python-loggingx +python_ly python-ly +python_lzo python-lzo +python_magnumclient python-magnumclient +python_manilaclient python-manilaclient python_memcached python-memcache +python_messaging python-messaging +python_mhash python-mhash +python_mimeparse python-mimeparse +python_mistralclient python-mistralclient +python_mk_livestatus python-mk-livestatus +python_monascaclient python-monascaclient +python_mpd python-mpd +python_muranoclient python-muranoclient +python_musicbrainz2 python-musicbrainz2 +python_networkmanager python-networkmanager +python_neutronclient python-neutronclient +python_nmap python-nmap +python_novaclient python-novaclient +python_novnc python-novnc +python_nss python-nss +python_ntlm python-ntlm +python_openid python-openid +python_openid_cla python-openid-cla +python_openid_teams python-openid-teams +python_openstackclient python-openstackclient +python_pam python-pampy +python_passfd python-passfd +python_phoneutils python-phoneutils +python_popcon python-popcon +python_poppler_qt4 python-poppler-qt4 +python_potr python-potr +python_prctl python-prctl +python_presage python-presage +python_pskc python-pskc +python_ptrace python-ptrace +python_redmine python-redmine +python_saharaclient python-saharaclient +python_sane python-sane +python_scciclient python-scciclient +python_savannaclient python-savannaclient +python_seamicroclient python-seamicroclient +python_senlinclient python-senlinclient +python_slugify python-slugify +python_snappy python-snappy +python_social_auth python-social-auth +python_sql python-sql +python_stdnum python-stdnum +python_subunit python-subunit +python_svipc python-svipc +python_swiftclient python-swiftclient +python_systemd python-systemd +python_termstyle python-termstyle +python_troveclient python-troveclient +python_tuskarclient python-tuskarclient +python_tvrage python-tvrage +python_twitter python-twitter +python_u2flib_server python-u2flib-server +python_unshare python-unshare +python_vagrant python-vagrant +python_xlib python-xlib +python_xmltv python-xmltv +python_xmp_toolkit python-libxmp +python_yapps yapps2 +python_yubico python-yubico +python_zaqarclient python-zaqarclient +pythontracer pythontracer pytidylib python-tidylib +pytils python-pytils pytimechart pytimechart +pytimeparse python-pytimeparse +pytoml python-pytoml +pytools python-pytools +pytrainer pytrainer +pytsk3 python-tsk +pytyrant python-pytyrant pytz python-tz +pyuca python-pyuca +pyudev python-pyudev pyusb python-usb +pyviennacl python-pyviennacl +pyvmomi python-pyvmomi +pyvorbis python-pyvorbis +pywapi python-pywapi +pywbem python-pywbem +pywcs python-pywcs pyweblib python-weblib +pywinrm python-winrm +pywps python-pywps +pyxattr python-pyxattr pyxdg python-xdg +pyxenstore python-pyxenstore +pyxid python-pyxid +pyxmpp python-pyxmpp +pyxnat python-pyxnat pyxp wmii pyzmq python-zmq +pyzolib python-pyzolib +pyzor pyzor +q python-q qbzr qbzr +qcli python-qcli qct qct qmtest qmtest qpid_python python-qpid qpid_qmf python-qpid-extras-qmf qpid_tools qpid-tools +qrcode python-qrcode +qrencode python-qrencode +qrtools python-qrtools +qt4reactor python-qt4reactor +qtile python-qtile +quantities python-quantities +queuelib python-queuelib quisk quisk quodlibet exfalso rabbitvcs rabbitvcs-core radiotray radiotray -rapid_spring rapid-spring +radix python-radix +rainbow python-rainbow +rally python-rally +ranger ranger +rarfile python-rarfile +rasterio python-rasterio +rawdog rawdog +rcssmin python-rcssmin +rdflib python-rdflib +rdflib_jsonld python-rdflib-jsonld rdiff_backup rdiff-backup rebuildd rebuildd recaptcha_client python-recaptcha +reclass python-reclass +reconfigure python-reconfigure +redis python-redis +rednose python-rednose +regex python-regex +relatorio python-relatorio +releases python-releases +rencode python-rencode +reno python-reno remuco remuco-base +reportbug python-reportbug +reportlab python-reportlab +repoze.lru python-repoze.lru +repoze.sphinx.autointerface python-repoze.sphinx.autointerface +repoze.tm2 python-repoze.tm2 +repoze.what python-repoze.what +repoze.what.plugins.sql python-repoze.what-plugins +repoze.what.plugins.xml python-repoze.what-plugins +repoze.what_pylons python-repoze.what-plugins +repoze.what_quickstart python-repoze.what-plugins +repoze.who python-repoze.who +reproject python-reproject +repoze.who.plugins.ldap python-repoze.who-plugins +repoze.who.plugins.openid python-repoze.who-plugins +repoze.who.plugins.sa python-repoze.who-plugins +repoze.who_friendlyform python-repoze.who-plugins +repoze.who_testutil python-repoze.who-plugins +requestbuilder python-requestbuilder +requests python-requests requests_aws python-awsauth +requests_cache python-requests-cache +requests_futures python-requests-futures +requests_kerberos python-requests-kerberos +requests_mock python-requests-mock +requests_oauthlib python-requests-oauthlib +requests_toolbelt python-requests-toolbelt +requests_unixsocket python-requests-unixsocket +requestsexceptions python-requestsexceptions +requirements_detector python-requirements-detector +responses python-responses +restkit python-restkit +restless python-restless +restructuredtext_lint python-restructuredtext-lint +retrying python-retrying +rfc3986 python-rfc3986 +rfoo python-rfoo +rgain python-rgain +rhn python-rhn +ricky python-ricky +riemann_client python-riemann-client +ripe.atlas.cousteau python-ripe-atlas-cousteau +ripe.atlas.sagan python-ripe-atlas-sagan +ripe.atlas.tools ripe-atlas-tools +rjsmin python-rjsmin +roman python-roman +rope python-rope +ropemacs python-ropemacs +ropemode python-ropemode +rosdep python-rosdep +rosdistro python-rosdistro +rosinstall python-rosinstall +rosinstall_generator python-rosinstall-generator +rospkg python-rospkg +rows python-rows roundup roundup rpl rpl +rply python-rply +rpm_python python-rpm +rpy python-rpy +rpy2 python-rpy2 +rsa python-rsa +rst2pdf rst2pdf +rtslib_fb python-rtslib-fb +ruamel.ordereddict python-ruamel.ordereddict +ruamel.yaml python-ruamel.yaml +rubber rubber +rudolf python-rudolf +ruffus python-ruffus +ryu python-ryu +s3cmd s3cmd +sahara python-sahara +sahara_dashboard python-sahara-dashboard salt salt-common +sanlock_python python-sanlock +sardana python-sardana +scales python-scales +scapy python-scapy +scgi python-scgi +schedule python-schedule +schema_salad python-schema-salad +schroot python-schroot scikit_image python-skimage scikit_learn python-sklearn +scipy python-scipy +sciscipy python-sciscipy +sclapp python-sclapp +scoop python-scoop +scour python-scour +scp python-scp +screed python-screed screenkey screenkey -seivot seivot +screenlets screenlets +scripttest python-scripttest +scruffington python-scruffy +scrypt python-scrypt +seaborn python-seaborn +securepass python-securepass +selenium python-selenium +semantic_version python-semantic-version +semver python-semver +senlin python-senlin sensitivetickets trac-sensitivetickets +sepolicy python-sepolicy +seqdiag python-seqdiag +serpent python2-serpent servefile servefile +service_identity python-service-identity +setoptconf python-setoptconf +setproctitle python-setproctitle +setuptools_git python-setuptools-git +setuptools_scm python-setuptools-scm +sfepy python-sfepy sftp_cloudfs sftpcloudfs +sh python-sh +shade python-shade +shadowsocks shadowsocks shedskin shedskin +shellescape python-shellescape +shelltoolbox python-shelltoolbox +shortuuid python-shortuuid +shotgun python-shotgun +sievelib python-sievelib +simpleeval python-simpleeval +simplegeneric python-simplegeneric +simplejson python-simplejson +simpy python-simpy3 +singledispatch python-singledispatch +sireader python-sireader +six python-six +sklearn_pandas python-sklearn-pandas slapos.core slapos-client +sleekxmpp python-sleekxmpp +slepc4py python-slepc4py +slides python-slides slimit slimit +slimmer python-slimmer +slip python-slip slip.dbus python-slip-dbus slip.gtk python-slip-gtk +slowaes python-slowaes smart python-smartpm +smartypants python-smartypants +smbpasswd python-smbpasswd +smbus python-smbus +smmap python-smmap +smstrade python-smstrade snimpy snimpy snmpsim snmpsim +snowballstemmer python-snowballstemmer +snuggs python-snuggs +soaplib python-soaplib +socketIO_client python-socketio-client +socketpool python-socketpool +sockjs_tornado python-sockjs-tornado +sorl_thumbnail python-sorl-thumbnail +sortedcontainers python-sortedcontainers soundgrain soundgrain +sourcecodegen python-sourcecodegen +spake2 python-spake2 spambayes spambayes +specan ubertooth +speaklater python-speaklater +spectacle spectacle specto specto +spectral_cube python-spectral-cube +specutils python-specutils +speedtest_cli speedtest-cli +sphere python-sphere +sphinx_argparse python-sphinx-argparse +sphinx_bootstrap_theme python-sphinx-bootstrap-theme +sphinx_paramlinks python-sphinx-paramlinks +sphinx_patchqueue python-sphinx-patchqueue +sphinx_rtd_theme python-sphinx-rtd-theme +sphinx_testing python-sphinx-testing sphinxcontrib_actdiag python-sphinxcontrib.actdiag +sphinxcontrib_autoprogram sphinxcontrib-autoprogram sphinxcontrib_blockdiag python-sphinxcontrib.blockdiag +sphinxcontrib_docbookrestapi python-sphinxcontrib.docbookrestapi +sphinxcontrib_doxylink python-sphinxcontrib.doxylink +sphinxcontrib_httpdomain python-sphinxcontrib.httpdomain +sphinxcontrib_issuetracker python-sphinxcontrib.issuetracker sphinxcontrib_nwdiag python-sphinxcontrib.nwdiag +sphinxcontrib_pecanwsme python-sphinxcontrib-pecanwsme sphinxcontrib_phpdomain python-sphinxcontrib.phpdomain +sphinxcontrib_plantuml python-sphinxcontrib.plantuml +sphinxcontrib_programoutput python-sphinxcontrib.programoutput +sphinxcontrib_rubydomain python-sphinxcontrib.rubydomain sphinxcontrib_seqdiag python-sphinxcontrib.seqdiag +sphinxcontrib_spelling python-sphinxcontrib.spelling +sphinxcontrib_youtube python-sphinxcontrib.youtube +springpython python-springpython +sprox python-sprox +sptest python-sptest +spur python-spur spyder python-spyderlib +spykeutils python-spykeutils spykeviewer spykeviewer +spyne python-spyne sqlalchemy_migrate python-migrate +sqlkit python-sqlkit +sqlparse python-sqlparse +sqlsoup python-sqlsoup +srp python-srp +ssdeep python-ssdeep ssh_import_id ssh-import-id +stackapplet stackapplet +starpy python-starpy +statsd python-statsd +statsmodels python-statsmodels +stdeb python-stdeb +steadymark python-steadymark +stem python-stem +stepic python-stepic +stevedore python-stevedore +stgit stgit +stomper python-stomper +stompy python-stompy +storm python-storm +straight.plugin python-straight.plugin +stringtemplate3 python-stringtemplate3 +structlog python-structlog +stsci.distutils python-stsci.distutils +subliminal python-subliminal +subprocess32 python-subprocess32 +subvertpy python-subvertpy +suds_jurko python-suds +suds python-suds summain summain +sunlight python-sunlight +sunpy python-sunpy supervisor supervisor +supybot supybot +sure python-sure suricatasc suricata +svg.path python-svg.path +svgwrite python-svgwrite svnmailer svnmailer +swauth swauth +swift python-swift swift3 swift-plugin-s3 +swift_bench swift-bench +swiftsc python-swiftsc +swiginac python-swiginac +sympy python-sympy synaptiks kde-config-touchpad +syslogng syslog-ng-mod-python system_storage_manager system-storage-manager +sysv_ipc python-sysv-ipc +tables python-tables +tablib python-tablib +tabulate python-tabulate +tagpy python-tagpy +tahoe_lafs tahoe-lafs +tails_installer tails-installer targetcli targetcli -tcm lio-utils -tcosconfig tcosconfig +taskflow python-taskflow +taskw python-taskw +taurus python-taurus +tblib python-tblib +tegaki_pygtk python-tegaki-gtk +tegaki_python python-tegaki +tegaki_tools python-tegakitools +tegaki_train tegaki-train +tempest tempest +tempest_lib python-tempest-lib +templayer python-templayer +termcolor python-termcolor +terminado python-terminado +testrepository python-testrepository +testresources python-testresources +testscenarios python-testscenarios +testtools python-testtools +textile python-textile +texttable python-texttable +tftpy python-tftpy +tg.devtools python-tg.devtools +tgext.admin python-tgext.admin +tgext.crud python-tgext.admin +thrift python-thrift +tinyeartrainer tinyeartrainer tilelite tilelite +tkSnack python-tksnack +tlsh python-tlsh +tlslite_ng python-tlslite-ng +tnetstring python-tnetstring +tomahawk python-tomahawk +toml python-toml +tooz python-tooz +toposort python-toposort +tornado python-tornado +tornado_pyvows python-tornado-pyvows +tornadorpc python-tornadorpc +toro python-toro tortoisehg tortoisehg +tosca_parser python-tosca-parser totalopenstation totalopenstation +tqdm python-tqdm +traceback2 python-traceback2 +tracer python-tracer +tracing python-tracing +traitlets python-traitlets +traits python-traits +traitsui python-traitsui +transaction python-transaction transifex_client transifex-client translate_toolkit translate-toolkit +translationstring python-translationstring +translitcodec python-translitcodec +transmissionrpc python-transmissionrpc trash_cli trash-cli +treq python-treq +trezor python-trezor +trimage trimage +tripleo_heat_templates python-tripleo-heat-templates +tripleo_image_elements python-tripleo-image-elements +tritium tritium +trollius python-trollius +trove python-trove +trove_dashboard python-trove-dashboard tryton tryton-client trytond tryton-server trytond_account tryton-modules-account +trytond_account_asset tryton-modules-account-asset trytond_account_be tryton-modules-account-be +trytond_account_credit_limit tryton-modules-account-credit-limit trytond_account_de_skr03 tryton-modules-account-de-skr03 +trytond_account_deposit tryton-modules-account-deposit +trytond_account_dunning tryton-modules-account-dunning +trytond_account_dunning_letter tryton-modules-account-dunning-letter +trytond_account_fr tryton-modules-account-fr trytond_account_invoice tryton-modules-account-invoice trytond_account_invoice_history tryton-modules-account-invoice-history trytond_account_invoice_line_standalone tryton-modules-account-invoice-line-standalone +trytond_account_invoice_stock tryton-modules-account-invoice-stock +trytond_account_payment tryton-modules-account-payment +trytond_account_payment_clearing tryton-modules-account-payment-clearing +trytond_account_payment_sepa tryton-modules-account-payment-sepa +trytond_account_payment_sepa_cfonb tryton-modules-account-payment-sepa-cfonb trytond_account_product tryton-modules-account-product trytond_account_statement tryton-modules-account-statement +trytond_account_stock_anglo_saxon tryton-modules-account-stock-anglo-saxon +trytond_account_stock_continental tryton-modules-account-stock-continental +trytond_account_stock_landed_cost tryton-modules-account-stock-landed-cost +trytond_account_stock_landed_cost_weight tryton-modules-account-stock-landed-cost-weight +trytond_account_tax_rule_country tryton-modules-account-tax-rule-country trytond_analytic_account tryton-modules-analytic-account trytond_analytic_invoice tryton-modules-analytic-invoice trytond_analytic_purchase tryton-modules-analytic-purchase trytond_analytic_sale tryton-modules-analytic-sale +trytond_bank tryton-modules-bank trytond_calendar tryton-modules-calendar trytond_calendar_classification tryton-modules-calendar-classification trytond_calendar_scheduling tryton-modules-calendar-scheduling trytond_calendar_todo tryton-modules-calendar-todo +trytond_carrier tryton-modules-carrier +trytond_carrier_percentage tryton-modules-carrier-percentage +trytond_carrier_weight tryton-modules-carrier-weight +trytond_commission tryton-modules-commission +trytond_commission_waiting tryton-modules-commission-waiting trytond_company tryton-modules-company trytond_company_work_time tryton-modules-company-work-time trytond_country tryton-modules-country trytond_currency tryton-modules-currency +trytond_customs tryton-modules-customs trytond_dashboard tryton-modules-dashboard trytond_google_maps tryton-modules-google-maps trytond_ldap_authentication tryton-modules-ldap-authentication -trytond_ldap_connection tryton-modules-ldap-connection trytond_party tryton-modules-party +trytond_party_relationship tryton-modules-party-relationship trytond_party_siret tryton-modules-party-siret trytond_party_vcarddav tryton-modules-party-vcarddav trytond_product tryton-modules-product +trytond_product_attribute tryton-modules-product-attribute +trytond_product_classification tryton-modules-product-classification +trytond_product_classification_taxonomic tryton-modules-product-classification-taxonomic trytond_product_cost_fifo tryton-modules-product-cost-fifo trytond_product_cost_history tryton-modules-product-cost-history +trytond_product_measurements tryton-modules-product-measurements trytond_product_price_list tryton-modules-product-price-list +trytond_production tryton-modules-production +trytond_production_routing tryton-modules-production-routing +trytond_production_work tryton-modules-production-work trytond_project tryton-modules-project +trytond_project_invoice tryton-modules-project-invoice trytond_project_plan tryton-modules-project-plan trytond_project_revenue tryton-modules-project-revenue trytond_purchase tryton-modules-purchase trytond_purchase_invoice_line_standalone tryton-modules-purchase-invoice-line-standalone +trytond_purchase_request tryton-modules-purchase-request +trytond_purchase_shipment_cost tryton-modules-purchase-shipment-cost trytond_sale tryton-modules-sale +trytond_sale_complaint tryton-modules-sale-complaint +trytond_sale_credit_limit tryton-modules-sale-credit-limit +trytond_sale_extra tryton-modules-sale-extra +trytond_sale_invoice_grouping tryton-modules-sale-invoice-grouping trytond_sale_opportunity tryton-modules-sale-opportunity trytond_sale_price_list tryton-modules-sale-price-list +trytond_sale_promotion tryton-modules-sale-promotion +trytond_sale_shipment_cost tryton-modules-sale-shipment-cost +trytond_sale_shipment_grouping tryton-modules-sale-shipment-grouping +trytond_sale_stock_quantity tryton-modules-sale-stock-quantity +trytond_sale_supply tryton-modules-sale-supply +trytond_sale_supply_drop_shipment tryton-modules-sale-supply-drop-shipment trytond_stock tryton-modules-stock trytond_stock_forecast tryton-modules-stock-forecast trytond_stock_inventory_location tryton-modules-stock-inventory-location trytond_stock_location_sequence tryton-modules-stock-location-sequence trytond_stock_lot tryton-modules-stock-lot +trytond_stock_lot_sled tryton-modules-stock-lot-sled +trytond_stock_package tryton-modules-stock-package trytond_stock_product_location tryton-modules-stock-product-location +trytond_stock_split tryton-modules-stock-split trytond_stock_supply tryton-modules-stock-supply trytond_stock_supply_day tryton-modules-stock-supply-day +trytond_stock_supply_forecast tryton-modules-stock-supply-forecast +trytond_stock_supply_production tryton-modules-stock-supply-production trytond_timesheet tryton-modules-timesheet +trytond_timesheet_cost tryton-modules-timesheet-cost +trytond_webdav tryton-modules-webdav ttb ttb +ttystatus python-ttystatus +tunigo python-tunigo +turnin_ng turnin-ng turpial turpial -turses turses -typecatcher typecatcher +tw.forms python-toscawidgets +tweepy python-tweepy +twextpy python-twext +twill python-twill +twython python-twython +txAWS python-txaws +txLibravatar python-txlibravatar +txWS python-txws +txZMQ python-txzmq +txaio python-txaio +txosc python-txosc +txsocksx python-txsocksx +txtorcon python-txtorcon +txzookeeper python-txzookeeper +typogrify python-typogrify +tzlocal python-tzlocal +u1db python-u1db +uTidylib python-utidylib ubuntu_dev_tools ubuntu-dev-tools +ucltip python-ucltip udev_discover udev-discover +ufo2otf ufo2otf +ufw python-ufw +ujson python-ujson +uncertainties python-uncertainties +unicodecsv python-unicodecsv +uniconvertor python-uniconvertor +unittest2 python-unittest2 unittest_xml_reporting python-xmlrunner +uritemplate python-uritemplate +uritools python-uritools +urlgrabber python-urlgrabber +urllib3 python-urllib3 urlscan urlscan +urwid python-urwid +urwid_satext python-urwid-satext +urwidtrees python-urwidtrees +usbtc08 python-usbtc08 +validictory python-validictory vamos undertaker +van.pydeb python-van.pydeb +variety variety +vatnumber python-vatnumber +vcrpy python-vcr +vcstools python-vcstools +vcversioner python-vcversioner +venusian python-venusian +versiontools python-versiontools +versuchung python-versuchung +vinetto vinetto +viper python-viper virtaal virtaal virtualbricks virtualbricks +virtualenv python-virtualenv virtualenv_clone virtualenv-clone virtualenvwrapper virtualenvwrapper +visionegg python-visionegg +vispy python-vispy +vizigrep vizigrep +vmdebootstrap vmdebootstrap +vmware_nsx python-vmware-nsx +vobject python-vobject volatility volatility +voluptuous python-voluptuous +vsgui python-vsgui +vulndb python-vulndb +w3lib python-w3lib +wadllib python-wadllib +waitress python-waitress wammu wammu +wapiti wapiti +warlock python-warlock +watchdog python-watchdog +wchartype python-wchartype +wcsaxes python-wcsaxes +wcwidth python-wcwidth +weakrefmethod python-weakrefmethod web.py python-webpy -weboob python-weboob-core +webassets python-webassets +webcolors python-webcolors +weboob python-weboob websocket_client python-websocket websockify websockify +webunit python-webunit +wget python-wget +whatmaps whatmaps +wheel python-wheel +whichcraft python-whichcraft +whisper python-whisper +whois python-whois whyteboard whyteboard +wicd python-wicd wikipediafs wikipediafs winpdb winpdb -wxPython_common python-wxgtk2.8 -wxgeometrie wxgeometrie +wit python-wit +withsqlite python-withsqlite +wokkel python-wokkel +woo python-woo +wrapt python-wrapt +ws4py python-ws4py +wsgi_intercept python-wsgi-intercept +wsgicors python-wsgicors +wsgilog python-wsgilog +wstool python-wstool +wstools python-wstools +wxGlade python-wxglade +wxPython_common python-wxgtk3.0 +wxmpl python-wxmpl +x2go python-x2go xapers xapers +xappy python-xappy +xattr python-xattr +xcffib python-xcffib +xdo python-xdo xdot xdot +xe python-xe xgflib xgridfit +xia xia +xkcd python-xkcd +xlrd python-xlrd +xlwt python-xlwt xmds2 xmds2 xml_marshaller python-xmlmarshaller -xpra_all xpra +xmlbuilder python-xmlbuilder +xmldiff xmldiff +xmltodict python-xmltodict +xmms2tray xmms2tray +xpra xpra +xtermcolor python-xtermcolor +xvfbwrapper python-xvfbwrapper +xxdiff_scripts xxdiff-scripts +yagtd yagtd +yanc python-nose-yanc +yaql python-yaql yara_python python-yara +yattag python-yattag +yenc python-yenc yokadi yokadi youtube_dl youtube-dl +yowsup2 python-yowsup +yt python-yt +yubikey_neo_manager yubikey-neo-manager +yubikey_piv_manager yubikey-piv-manager +yubioath_desktop yubioath-desktop yum_metadata_parser python-sqlitecachec +zake python-zake +zaqar python-zaqar +zc.buildout python-zc.buildout +zc.lockfile python-zc.lockfile +zdaemon python-zdaemon zeitgeist_explorer zeitgeist-explorer zenmap zenmap -zeroinstall_injector zeroinstall-injector +zenoss python-zenoss +zeroconf python-zeroconf +zfec python-zfec +zhpy python-zhpy zim zim +zinnia_python python-zinnia +zipstream python-zipstream +zope.authentication python-zope.authentication +zope.browser python-zope.browser +zope.cachedescriptors python-zope.cachedescriptors +zope.component python-zope.component +zope.configuration python-zope.configuration +zope.contenttype python-zope.contenttype +zope.copy python-zope.copy +zope.deprecation python-zope.deprecation +zope.dottedname python-zope.dottedname +zope.event python-zope.event +zope.exceptions python-zope.exceptions +zope.hookable python-zope.hookable +zope.i18n python-zope.i18n +zope.i18nmessageid python-zope.i18nmessageid +zope.interface python-zope.interface +zope.location python-zope.location +zope.proxy python-zope.proxy +zope.publisher python-zope.publisher +zope.schema python-zope.schema +zope.security python-zope.security +zope.sendmail python-zope.sendmail +zope.sqlalchemy python-zope.sqlalchemy +zope.testbrowser python-zope.testbrowser +zope.testing python-zope.testing +zope.testrunner python-zope.testrunner +zope.traversing python-zope.traversing +zxcvbn python-zxcvbn +zyne zyne +zzzeeksphinx python-zzzeeksphinx diff -Nru dh-python-1.20140128/pydist/cpython3_fallback dh-python-2.20160818~bpo8+1~trusty/pydist/cpython3_fallback --- dh-python-1.20140128/pydist/cpython3_fallback 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/pydist/cpython3_fallback 2016-08-28 19:40:47.000000000 +0000 @@ -1,65 +1,1462 @@ +pil python3-pil +Pillow python3-pil setuptools python3-pkg-resources +argparse python3 (>= 3.2) +3to2 python3-3to2 +APLpy python3-aplpy +APScheduler python3-apscheduler Attic attic +Babel python3-babel +Beaker python3-beaker +Bottleneck python3-bottleneck +Brlapi python3-brlapi +Brotli python3-brotli CDApplet cairo-dock-dbus-plug-in-interface-python CDBashApplet cairo-dock-dbus-plug-in-interface-python +CacheControl python3-cachecontrol +CairoSVG python3-cairosvg +CedarBackup3 cedar-backup3 +Cerealizer python3-cerealizer +Chameleon python3-chameleon CherryPy python3-cherrypy3 +Coffin python3-coffin +ConfigArgParse python3-configargparse +ConsensusCore python3-pbconsensuscore +ConsensusCore2 python3-consensuscore2 Cython cython3 +DendroPy python3-dendropy +Django python3-django +EbookLib python3-ebooklib +ExifRead python3-exif +FeinCMS python3-django-feincms +Fiona python3-fiona +Fastaq fastaq +Flask python3-flask +Flask_API python3-flask-api +Flask_AutoIndex python3-flask-autoindex +Flask_Babel python3-flask-babel +Flask_Bcrypt python3-flask-bcrypt +Flask_FlatPages python3-flask-flatpages +Flask_Migrate python3-flask-migrate +Flask_OpenID python3-flask-openid +Flask_Principal python3-flask-principal +Flask_RESTful python3-flask-restful +Flask_SQLAlchemy python3-flask-sqlalchemy +Flask_Script python3-flask-script +Flask_Silk python3-flask-silk +Flask_Testing python3-flask-testing +Flask_WTF python3-flaskext.wtf +FormEncode python3-formencode +Frozen_Flask python3-frozen-flask +GDAL python3-gdal +GaussSum gausssum +Genshi python3-genshi +GeoIP python3-geoip +Ghost.py python3-ghost +GitPython python3-git +Glances glances +Gyoto python3-gyoto +Gyoto_std python3-gyoto +HyPhy python3-hyphy +IPy python3-ipy +JACK_Client python3-jack-client +Jinja2 python3-jinja2 +JsonTest python3-jsontest +Kajiki python3-kajiki +Kivy python3-kivy Kyoto_Cabinet python3-kyotocabinet +LEPL python3-lepl +LibAppArmor python3-libapparmor +Logbook python3-logbook +MDP python3-mdp +MIDIUtil python3-midiutil +MPD_sima mpd-sima Magic_file_extensions python3-magic +Mako python3-mako +Markdown python3-markdown +MarkupSafe python3-markupsafe +Markups python3-markups +Nautilus_scripts_manager nautilus-scripts-manager +OWSLib python3-owslib +OdooRPC python3-odoorpc +OnionBalance onionbalance +PDAL python3-pdal +Paste python3-paste +PasteDeploy python3-pastedeploy Pillow python3-pil +Pint python3-pint +Plinth plinth +PuLP python3-pulp +PyAVM python3-pyavm +PyAudio python3-pyaudio +PyDispatcher python3-pydispatch +PyECLib python3-pyeclib +PyGithub python3-github PyHamcrest python3-hamcrest PyICU python3-icu +PyJWT python3-jwt +PyKCS11 python3-pykcs11 +PyKMIP python3-pykmip +PyLD python3-pyld +PyMySQL python3-pymysql +PyNLPl python3-pynlpl +PyNaCl python3-nacl PyOpenGL python3-opengl +PyPDF2 python3-pypdf2 +PyPump python3-pypump +PyRSS2Gen python3-pyrss2gen +PySDL2 python3-sdl2 +PySocks python3-pysocks PyStemmer python3-stemmer +PyTango python3-pytango +PyUtilib python3-pyutilib +PyVCF python3-pyvcf +PyVISA python3-pyvisa +PyVISA_py python3-pyvisa-py +PyWavelets python3-pywt +PyX python3-pyx +PyXB python3-pyxb PyYAML python3-yaml +Pygments python3-pygments +Pykka python3-pykka +Pyomo pyomo +Pyro4 python3-pyro4 +Pysolar python3-pysolar +PythonQwt python3-qwt +Python_fontconfig python3-fontconfig +QtAwesome python3-qtawesome +QtPy python3-qtpy +Radicale python3-radicale +Recoll python3-recoll +Routes python3-routes +Rtree python3-rtree +SPARQLWrapper python3-sparqlwrapper +SQLAlchemy python3-sqlalchemy +SQLAlchemy_Utils python3-sqlalchemy-utils +SQLObject python3-sqlobject +SecretStorage python3-secretstorage +Shapely python3-shapely +Signaller python3-signaller +SimPy python3-simpy +SocksiPy_branch python3-socksipy +SoftLayer python3-softlayer +SoundFile python3-soundfile +Sphinx python3-sphinx +Tempita python3-tempita +Theano python3-theano +TornadIO2 python3-tornadio2 +Twiggy python3-twiggy +Twisted python3-twisted +URLObject python3-urlobject +Unidecode python3-unidecode +WSME python3-wsme +WTForms python3-wtforms +Wand python3-wand +WebOb python3-webob +WebTest python3-webtest +Werkzeug python3-werkzeug +Whoosh python3-whoosh +XStatic python3-xstatic +XStatic_Angular python3-xstatic-angular +XStatic_Angular_Bootstrap python3-xstatic-angular-bootstrap +XStatic_Angular_Cookies python3-xstatic-angular-cookies +XStatic_Angular_FileUpload python3-xstatic-angular-fileupload +XStatic_Angular_Gettext python3-xstatic-angular-gettext +XStatic_Angular_Mock python3-xstatic-angular-mock +XStatic_Angular_lrdragndrop python3-xstatic-angular-lrdragndrop +XStatic_Bootstrap_Datepicker python3-xstatic-bootstrap-datepicker +XStatic_Bootstrap_SCSS python3-xstatic-bootstrap-scss +XStatic_D3 python3-xstatic-d3 +XStatic_Font_Awesome python3-xstatic-font-awesome +XStatic_Hogan python3-xstatic-hogan +XStatic_JQuery.Bootstrap.Wizard python3-xstatic-jquery.bootstrap.wizard +XStatic_JQuery.TableSorter python3-xstatic-jquery.tablesorter +XStatic_JQuery.quicksearch python3-xstatic-jquery.quicksearch +XStatic_JQuery_Migrate python3-xstatic-jquery-migrate +XStatic_JSEncrypt python3-xstatic-jsencrypt +XStatic_Jasmine python3-xstatic-jasmine +XStatic_Magic_Search python3-xstatic-magic-search +XStatic_QUnit python3-xstatic-qunit +XStatic_Rickshaw python3-xstatic-rickshaw +XStatic_Spin python3-xstatic-spin +XStatic_bootswatch python3-xstatic-bootswatch +XStatic_jQuery python3-xstatic-jquery +XStatic_jquery_ui python3-xstatic-jquery-ui +XStatic_mdi python3-xstatic-mdi +XStatic_roboto_fontface python3-xstatic-roboto-fontface +XStatic_smart_table python3-xstatic-smart-table +XStatic_term.js python3-xstatic-term.js +XlsxWriter python3-xlsxwriter +Yapsy python3-yapsy +_lxc lxc +abstract_rendering python3-abstract-rendering +acme python3-acme +acme_tiny acme-tiny +actdiag python3-actdiag +activipy python3-activipy +admesh python3-admesh +aeidon python3-aeidon +affine python3-affine +aiocoap python3-aiocoap +aioeventlet python3-aioeventlet +aiohttp python3-aiohttp +aiopg python3-aiopg +aioredis python3-aioredis +aioxmlrpc python3-aioxmlrpc +aiozmq python3-aiozmq +alabaster python3-alabaster +alembic python3-alembic +altgraph python3-altgraph +amqp python3-amqp +amqplib python3-amqplib +aniso8601 python3-aniso8601 +anyjson python3-anyjson +aodhclient python3-aodhclient +apache_libcloud python3-libcloud +apparmor python3-apparmor +appdirs python3-appdirs +apsw python3-apsw +apt_clone apt-clone +apt_venv apt-venv +argcomplete python3-argcomplete +argh python3-argh +args python3-args +ariba ariba +arpy python3-arpy +arrayfire python3-arrayfire +arrow python3-arrow +asciinema asciinema +asdf python3-asdf +ase python3-ase +assword assword +astLib python3-astlib +astor python3-astor +astroML python3-astroml +astroML_addons python3-astroml-addons +astroid python3-astroid +astropy python3-astropy +astropy_helpers python3-astropy-helpers +astroquery python3-astroquery +astroscrappy python3-astroscrappy +async python3-async +asyncssh python3-asyncssh +attrs python3-attr +audioread python3-audioread +audiotools audiotools +autobahn python3-autobahn +automaton python3-automaton +avro_python3 python3-avro +authres python3-authres +babelfish python3-babelfish +backup2swift python3-backup2swift +backupchecker backupchecker +bandit python3-bandit +basemap python3-mpltoolkits.basemap +bashate python3-bashate +bcdoc python3-bcdoc +bcrypt python3-bcrypt +beanbag python3-beanbag beautifulsoup4 python3-bs4 +betamax python3-betamax +bibtexparser python3-bibtexparser +billiard python3-billiard +binaryornot python3-binaryornot +binwalk python3-binwalk +bioblend python3-bioblend +biom_format python3-biom-format +biopython python3-biopython +bitarray python3-bitarray +bitstring python3-bitstring +bitstruct python3-bitstruct +bleach python3-bleach +blessed python3-blessed +blessings python3-blessings +blinker python3-blinker +blist python3-blist +blockdiag python3-blockdiag +borgbackup borgbackup +boto python3-boto +boto3 python3-boto3 +botocore python3-botocore +bottle python3-bottle bpython bpython3 +brainstorm python3-brainstorm +braintree python3-braintree +breathe python3-breathe brebis brebis +bsddb3 python3-bsddb3 +bumpversion bumpversion +burrito python3-burrito +bz2file python3-bz2file +cached_property python3-cached-property +cachetools python3-cachetools +caffeine caffeine +cairocffi python3-cairocffi +cassandra_driver python3-cassandra +castellan python3-castellan +cbor python3-cbor +ccdproc python3-ccdproc +cclib python3-cclib +cdist cdist +cdo python3-cdo +celery python3-celery +celery_haystack python3-django-celery-haystack +cement python3-cement +certifi python3-certifi +cffi python3-cffi +changelog python3-changelog +characteristic python3-characteristic +chardet python3-chardet +checkbox_ng python3-checkbox-ng +checkbox_support python3-checkbox-support +cigi python3-cigi +circlator circlator +circuits python3-circuits +citeproc_py python3-citeproc +ck python3-ck +click python3-click +click_plugins python3-click-plugins +cliff python3-cliff +cligj python3-cligj +clint python3-clint +cloud_init cloud-init +cloud_sptheme python3-cloud-sptheme +cmd2 python3-cmd2 +cobra python3-cobra +colander python3-colander +colorama python3-colorama +colorlog python3-colorlog +configobj python3-configobj +construct python3-construct +contextlib2 python3-contextlib2 +cookiecutter python3-cookiecutter +cookies python3-cookies +cov_core python3-cov-core +coverage python3-coverage +cppman cppman +cracklib python3-cracklib +cram python3-cram +crank python3-crank +crcmod python3-crcmod +croniter python3-croniter +cryptography python3-cryptography +cryptography_vectors python3-cryptography-vectors +cs python3-cs +csb python3-csb +csscompressor python3-csscompressor +cssselect python3-cssselect +cssutils python3-cssutils +csvkit python3-csvkit +ctop ctop +cupshelpers python3-cupshelpers +curtsies python3-curtsies +cutadapt python3-cutadapt +cycler python3-cycler +cymruwhois python3-cymruwhois +d2to1 python3-d2to1 +daemonize python3-daemonize +darts.util.lru python3-darts.lib.utils.lru +db2twitter db2twitter +dbf python3-dbf +dcos python3-dcos +ddt python3-ddt +deap python3-deap +debdry debdry +debiancontributors python3-debiancontributors debmake debmake +debocker debocker +debtags debtags +debtcollector python3-debtcollector +debtagshw python3-debtagshw +decorator python3-decorator +defer python3-defer +defusedxml python3-defusedxml +demjson python3-demjson +dep11 python3-dep11 +descartes python3-descartes devscripts devscripts +dexml python3-dexml +dfdatetime python3-dfdatetime +diaspy python3-diaspy +dib_utils python3-dib-utils +dictobj python3-dictobj +diff_match_patch python3-diff-match-patch +diffoscope diffoscope +dill python3-dill +dirspec python3-dirspec +dirtbike dirtbike +distlib python3-distlib +distro_info python3-distro-info +django_admin_sortable python3-django-adminsortable +django_ajax_selects python3-ajax-select +django_appconf python3-django-appconf +django_assets python3-django-assets +django_babel python3-django-babel +django_bitfield python3-django-bitfield +django_appconf python3-appconf +django_bootstrap_form python3-bootstrapform +django_braces python3-django-braces +django_celery python3-django-celery +django_celery_transactions python3-django-celery-transactions +django_classy_tags python3-django-classy-tags +django_compat python3-django-compat +django_compressor python3-django-compressor +django_contact_form python3-django-contact-form +django_cors_headers python3-django-cors-headers +django_countries python3-django-countries +django_crispy_forms python3-django-crispy-forms +django_debug_toolbar python3-django-debug-toolbar +django_discover_runner python3-django-discover-runner +django_downloadview python3-django-downloadview +django_environ python3-django-environ +django_extensions python3-django-extensions +django_filter python3-django-filters +django_floppyforms python3-django-floppyforms +django_formtools python3-django-formtools +django_fsm python3-django-fsm +django_fsm_admin python3-django-fsm-admin +django_gravatar2 python3-django-gravatar2 +django_guardian python3-django-guardian +django_haystack python3-django-haystack +django_hijack python3-django-hijack +django_housekeeping python3-django-housekeeping +django_jinja python3-django-jinja +django_jsonfield python3-django-jsonfield +django_localflavor python3-django-localflavor +django_macaddress python3-django-macaddress +django_markupfield python3-django-markupfield +django_model_utils python3-django-model-utils +django_modeltranslation python3-django-modeltranslation +django_mptt python3-django-mptt +django_navtag python3-django-navtag +django_nose python3-django-nose +django_notification python3-django-notification +django_oauth_toolkit python3-django-oauth-toolkit +django_openstack_auth python3-django-openstack-auth +django_ordered_model python3-django-ordered-model +django_overextends python3-django-overextends +django_picklefield python3-django-picklefield +django_pipeline python3-django-pipeline +django_polymorphic python3-django-polymorphic +django_prometheus python3-django-prometheus +django_pyscss python3-django-pyscss +django_python3_ldap python3-django-python3-ldap +django_ratelimit python3-django-ratelimit +django_recurrence python3-django-recurrence +django_reversion python3-django-reversion +django_sekizai python3-django-sekizai +django_session_security python3-django-session-security +django_shortuuidfield python3-django-shortuuidfield +django_simple_captcha python3-django-captcha +django_sitetree python3-django-sitetree +django_sortedm2m python3-sortedm2m +django_stronghold python3-django-stronghold +django_tables2 python3-django-tables2 +django_taggit python3-django-taggit +django_tastypie python3-django-tastypie +django_treebeard python3-django-treebeard +django_uwsgi python3-django-uwsgi +django_webpack_loader python3-django-webpack-loader +django_websocket_redis python3-django-websocket-redis +django_xmlrpc python3-django-xmlrpc +djangocms_admin_style python3-djangocms-admin-style +djangorestframework python3-djangorestframework +djangorestframework_gis python3-djangorestframework-gis +djoser python3-djoser +djvubind djvubind dkimpy python3-dkim +dnspython python3-dnspython dnspython3 python3-dnspython +dnsq python3-dnsq +doc8 python3-doc8 +docker_py python3-docker +dockerpty python3-dockerpty +docopt python3-docopt +docutils python3-docutils +dodgy dodgy +dogpile.cache python3-dogpile.cache +dogpile.core python3-dogpile.core +doit python3-doit +dominate python3-dominate +doublex python3-doublex +drf_fsm_transitions python3-djangorestframework-fsm-transitions +drf_generators python3-djangorestframework-generators +drf_haystack python3-djangorestframework-haystack +drslib python3-drslib +dtcwt python3-dtcwt +duecredit python3-duecredit +dugong python3-dugong +dulwich python3-dulwich +easygui python3-easygui +easywebdav python3-easywebdav +ecdsa python3-ecdsa +elasticsearch python3-elasticsearch +elasticsearch_curator python3-elasticsearch-curator +emcee python3-emcee +empy python3-empy +enjarify enjarify +enum34 python3-enum34 +enzyme python3-enzyme +ephem python3-ephem +esmre python3-esmre +et_xmlfile python3-et-xmlfile +eventlet python3-eventlet +exam python3-exam +expeyes python-expeyes +expiringdict python3-expiringdict +extras python3-extras +fabio python3-fabio +factory_boy python3-factory-boy +fades fades +fail2ban fail2ban +fake_factory python3-fake-factory +fakeredis python3-fakeredis +falcon python3-falcon +fann2 python3-fann2 +fastcluster python3-fastcluster +fasteners python3-fasteners +fastimport python3-fastimport +fastkml python3-fastkml +fdb python3-fdb +feather_format python3-feather-format +feedgenerator python3-feedgenerator +feedparser python3-feedparser +file_encryptor python3-file-encryptor +file_magic python3-magic +first python3-first +fisx python3-fisx +fitsio python3-fitsio +fiu python3-fiu +fixtures python3-fixtures +flake8 python3-flake8 +flaky python3-flaky +flask_multistatic python3-flaskext.multistatic +flask_rdf python3-flask-rdf +flexmock python3-flexmock +flickrapi python3-flickrapi +flufl.bounce python3-flufl.bounce +flufl.enum python3-flufl.enum +flufl.i18n python3-flufl.i18n +flufl.lock python3-flufl.lock +flufl.password python3-flufl.password +freezegun python3-freezegun +frozendict python3-frozendict +fudge python3-fudge +fuel_agent python3-fuel-agent +fuel_bootstrap python3-fuel-bootstrap-cli +funcparserlib python3-funcparserlib +funcsigs python3-funcsigs +future python3-future +futurist python3-futurist +fuzzywuzzy python3-fuzzywuzzy +fysom python3-fysom +gTranscribe gtranscribe +gabbi python3-gabbi +galileo galileo +gccjit python3-gccjit +gear python3-gear +genty python3-genty +geographiclib python3-geographiclib +geojson python3-geojson +geolinks python3-geolinks +geopandas python3-geopandas +geopy python3-geopy +germinate python3-germinate +gerritlib python3-gerritlib +getdns python3-getdns +gevent python3-gevent +ginga python3-ginga +git_build_recipe git-build-recipe +gitdb python3-gitdb +glance_store python3-glance-store +glue glue-sprite +glueviz python3-glue +gmplot python3-gmplot +gmpy2 python3-gmpy2 +gnocchiclient python3-gnocchiclient +google_api_python_client python3-googleapi +google_apputils python3-google-apputils +googlecloudapis python3-googlecloudapis +gphoto2_cffi python3-gphoto2cffi +gramps gramps +graphite_api graphite-api +graypy python3-graypy +greenio python3-greenio +greenlet python3-greenlet +gssapi python3-gssapi +gsw python3-gsw gtimelog gtimelog +guacamole python3-guacamole +guess_language_spirit python3-guess-language +guessit python3-guessit +guidata python3-guidata +guiqwt python3-guiqwt +gumbo python3-gumbo +gunicorn python3-gunicorn +gvb gvb +h5py python3-h5py +hacking python3-hacking +haproxy_log_analysis python3-haproxy-log-analysis +hashids python3-hashids +hdf5storage python3-hdf5storage +healpy python3-healpy +hidapi_cffi python3-hidapi +hiredis python3-hiredis +hkdf python3-hkdf +hl7 python3-hl7 +howdoi howdoi +hpack python3-hpack +hplefthandclient python3-hplefthandclient +html2text python3-html2text +html5lib python3-html5lib +http_parser python3-http-parser +httpbin python3-httpbin +httplib2 python3-httplib2 +httpretty python3-httpretty +humanize python3-humanize +hunspell python3-hunspell +hurry.filesize python3-hurry.filesize +hy python3-hy +hypothesis python3-hypothesis +iapws python3-iapws +icalendar python3-icalendar +idna python3-idna +ijson python3-ijson +imagesize python3-imagesize +imaplib2 python3-imaplib2 +img2pdf python3-img2pdf +inflect python3-inflect +influxdb python3-influxdb +iniparse python3-iniparse +invocations python3-invocations +invoke python3-invoke +iowait python3-iowait +ipdb python3-ipdb +ipp python3-libtrace ipython ipython3 +ipython_genutils python3-ipython-genutils +ironic_fa_deploy python3-ironic-fa-deploy +ironic_lib python3-ironic-lib +isbnlib python3-isbnlib +iso8601 python3-iso8601 +isodate python3-isodate +isort python3-isort +isoweek python3-isoweek +itsdangerous python3-itsdangerous +iva iva +jdcal python3-jdcal +jedi python3-jedi +jellyfish python3-jellyfish +jenkins_job_builder python3-jenkins-job-builder +jingo python3-jingo +jinja2_time python3-jinja2-time +jmespath python3-jmespath +joblib python3-joblib +jpy python3-jpy +jsmin python3-jsmin +jsonpatch python3-jsonpatch +jsonpath_rw python3-jsonpath-rw +jsonpath_rw_ext python3-jsonpath-rw-ext +jsonpickle python3-jsonpickle jsonpointer python3-json-pointer +jsonschema python3-jsonschema +junit_xml python3-junit.xml +junitxml python3-junitxml +kafka_python python3-kafka kazam kazam +kazoo python3-kazoo +kdtree python3-kdtree +keyring python3-keyring +keyrings.alt python3-keyrings.alt +keystoneauth1 python3-keystoneauth1 +keystonemiddleware python3-keystonemiddleware +keyutils python3-keyutils +khmer khmer +kitchen python3-kitchen +klein python3-klein +kombu python3-kombu +latexcodec python3-latexcodec +launchpadlib python3-launchpadlib +lazr.config python3-lazr.config +lazr.delegates python3-lazr.delegates +lazr.restfulclient python3-lazr.restfulclient +lazr.smtptest python3-lazr.smtptest +lazr.uri python3-lazr.uri +lazy_object_proxy python3-lazy-object-proxy +ldap3 python3-ldap3 +ldif3 python3-ldif3 +lensfun python3-lensfun +lesscpy python3-lesscpy +leveldb python3-leveldb +lfm lfm +libarchive_c python3-libarchive-c +libhfst_swig python3-libhfst +libnacl python3-libnacl +libsass python3-libsass +libvirt_python python3-libvirt +lift lift +lightdm_gtk_greeter_settings lightdm-gtk-greeter-settings +limnoria limnoria +linecache2 python3-linecache2 +linop python3-linop +lios lios +livereload python3-livereload +livestreamer python3-livestreamer +llfuse python3-llfuse +lmdb python3-lmdb +lmfit python3-lmfit +lockfile python3-lockfile +logging_tree python3-logging-tree +logilab_astng python3-logilab-astng +logilab_common python3-logilab-common +logutils python3-logutils +louis python3-louis +lshell lshell +lttnganalyses python3-lttnganalyses +lttngust python3-lttngust +lvm python3-lvm2 +lxml python3-lxml +lz4 python3-lz4 +m3u8 python3-m3u8 +macholib python3-macholib +magcode_core python3-magcode-core +manuel python3-manuel +mapnik python3-mapnik +marisa python3-marisa +mate_tweak mate-tweak +matplotlib python3-matplotlib +matplotlib_venn python3-matplotlib-venn +maxminddb python3-maxminddb +mccabe python3-mccabe +measurement python3-measurement +meld3 python3-meld3 +memory_profiler python3-memory-profiler +memprof python3-memprof menulibre menulibre +metaconfig python3-metaconfig +microversion_parse python3-microversion-parse +mido python3-mido +minieigen python3-minieigen +misaka python3-misaka +mistune python3-mistune +mkdocs mkdocs +mock python3-mock +mockito python3-mockito +model_mommy python3-model-mommy +mongoengine python3-mongoengine +monotonic python3-monotonic +montage_wrapper python3-montage-wrapper +morris python3-morris +mockldap python3-mockldap +mox3 python3-mox3 +mpegdash python3-mpegdash +mpi4py python3-mpi4py +mpld3 python3-mpld3 +mplexporter python3-mplexporter +mpmath python3-mpmath +mps_youtube mps-youtube +mrtparse python3-mrtparse msgpack_python python3-msgpack +mugshot mugshot +multi_key_dict python3-multi-key-dict +multicorn python3-multicorn +multipletau python3-multipletau +munch python3-munch +munkres python3-munkres +musicbrainzngs python3-musicbrainzngs +mutagen python3-mutagen +mwparserfromhell python3-mwparserfromhell +mypy_lang mypy +mysql_connector_python python3-mysql.connector +mysqlclient python3-mysqldb +nagiosplugin python3-nagiosplugin +nameparser python3-nameparser +nanomsg python3-nanomsg +natkit python3-libtrace +natsort python3-natsort +nbxmpp python3-nbxmpp +ndg_httpsclient python3-ndg-httpsclient +netCDF4 python3-netcdf4 +netaddr python3-netaddr +netfilter python3-netfilter +netifaces python3-netifaces +netmiko python3-netmiko +networkx python3-networkx +neutron_lib python3-neutron-lib +ngs python3-ngs +nibabel python3-nibabel +nine python3-nine +nltk python3-nltk +nml nml +nodeenv nodeenv +nose python3-nose +nose2 python3-nose2 +nose2_cov python3-nose2-cov +nose_exclude python3-nose-exclude +nose_parameterized python3-nose-parameterized +nose_timer python3-nose-timer +nosexcover python3-nosexcover +notify2 python3-notify2 +notmuch python3-notmuch +npm2deb npm2deb +ntplib python3-ntplib +numexpr python3-numexpr +numpy python3-numpy +numpydoc python3-numpydoc +nwdiag python3-nwdiag +oauth python3-oauth +oauth2client python3-oauth2client +oauthlib python3-oauthlib +objgraph python3-objgraph +ocrmypdf ocrmypdf +odfpy python3-odf +offtrac python3-offtrac +ofxparse python3-ofxparse +onboard onboard +onioncircuits onioncircuits +openalpr python3-openalpr +openpyxl python3-openpyxl +openslide_python python3-openslide +openstack.nose_plugin python3-openstack.nose-plugin +openstack_doc_tools python3-openstack-doc-tools +openstackdocstheme python3-openstackdocstheme +openstacksdk python3-openstacksdk +os_brick python3-os-brick +os_client_config python3-os-client-config +os_testr python3-os-testr +os_win python3-os-win +oslo.cache python3-oslo.cache +oslo.concurrency python3-oslo.concurrency +oslo.config python3-oslo.config +oslo.context python3-oslo.context +oslo.db python3-oslo.db +oslo.i18n python3-oslo.i18n +oslo.log python3-oslo.log +oslo.messaging python3-oslo.messaging +oslo.middleware python3-oslo.middleware +oslo.policy python3-oslo.policy +oslo.privsep python3-oslo.privsep +oslo.reports python3-oslo.reports +oslo.rootwrap python3-oslo.rootwrap +oslo.serialization python3-oslo.serialization +oslo.service python3-oslo.service +oslo.utils python3-oslo.utils +oslo.versionedobjects python3-oslo.versionedobjects +oslo.vmware python3-oslo.vmware +oslotest python3-oslotest +osmapi python3-osmapi +osprofiler python3-osprofiler +overpass python3-overpass +packaging python3-packaging +pacparser python3-pacparser +padme python3-padme +pafy python3-pafy +pager python3-pager +pandas python3-pandas +pandocfilters python3-pandocfilters +paramiko python3-paramiko +passlib python3-passlib +path.py python3-path +path_and_address python3-path-and-address +pathspider pathspider +pathtools python3-pathtools +patsy python3-patsy +paypal python3-paypal +pbkdf2 python3-pbkdf2 +pbr python3-pbr +pcp python3-pcp +pdfrw python3-pdfrw +pecan python3-pecan +pefile python3-pefile +pep8 python3-pep8 +pep8_naming python3-pep8-naming +persistent python3-persistent +pex python3-pex +pexpect python3-pexpect +pgmagick python3-pgmagick +pgpdump python3-pgpdump +pgspecial python3-pgspecial +photocollage photocollage +photutils python3-photutils +phply python3-phply +phpserialize python3-phpserialize +pickleshare python3-pickleshare +pika python3-pika +pika_pool python3-pika-pool +pilkit python3-pilkit +pip python3-pip +pkgconfig python3-pkgconfig +pkginfo python3-pkginfo +plainbox python3-plainbox +planetfilter planetfilter +playitslowly playitslowly +pldns python3-libtrace +plotly python3-plotly +plt python3-libtrace +pluggy python3-pluggy +plumbum python3-plumbum +ply python3-ply +polib python3-polib +portalocker python3-portalocker +positional python3-positional +posix_ipc python3-posix-ipc +power python3-power +powerline_status python3-powerline +praw python3-praw +pretend python3-pretend +prettytable python3-prettytable +proboscis python3-proboscis +profitbricks python3-profitbricks +progress python3-progress +progressbar python3-progressbar +proliantutils python3-proliantutils +prometheus_client python3-prometheus-client +prometheus_pgbouncer_exporter prometheus-pgbouncer-exporter +prompt_toolkit python3-prompt-toolkit +proselint python3-proselint +protobix python3-protobix +protorpc_standalone python3-protorpc-standalone +psutil python3-psutil +psycopg2 python3-psycopg2 +ptk python3-ptk +ptyprocess python3-ptyprocess +publicsuffix python3-publicsuffix +pudb python3-pudb +purl python3-purl +py python3-py py3dns python3-dns +pyClamd python3-pyclamd +pyFAI python3-pyfai +pyFFTW python3-pyfftw pyLibravatar python3-libravatar +pyNFFT python3-pynfft pyOpenSSL python3-openssl +pyRFC3339 python3-rfc3339 pySFML python3-sfml +pyScss python3-pyscss +py_enigma python3-enigma +py_moneyed python3-moneyed py_bcrypt python3-bcrypt py_postgresql python3-postgresql +pyacoustid python3-acoustid +pyapi_gitlab python3-gitlab +pyasn1 python3-pyasn1 +pyasn1_modules python3-pyasn1-modules +pycadf python3-pycadf +pycountry python3-pycountry +pycparser python3-pycparser pycrypto python3-crypto +pycups python3-cups +pycurl python3-pycurl +pydicom python3-dicom +pydocstyle pydocstyle +pydot python3-pydot +pydotplus python3-pydotplus +pyds9 python3-pyds9 +pyeapi python3-pyeapi +pyelftools python3-pyelftools +pyelliptic python3-pyelliptic pyenchant python3-enchant pyepr python3-epr +pyfaidx python3-pyfaidx +pyfastaq fastaq +pyfiglet python3-pyfiglet +pyfits python3-pyfits +pyflakes python3-pyflakes +pyftpdlib python3-pyftpdlib +pygccxml python3-pygccxml +pygeoif python3-pygeoif +pygit2 python3-pygit2 pyflakes pyflakes pygobject python3-gi +pygpgme python3-gpgme +pygrace python3-pygrace +pygraphviz python3-pygraphviz pygrib python3-grib +pygtail python3-pygtail pygtkspellcheck python3-gtkspellcheck +pyinfra pyinfra +pyinotify python3-pyinotify +pykdtree python3-pykdtree +pykerberos python3-kerberos +pylast python3-pylast +pylibacl python3-pylibacl pyliblo python3-liblo +pylibmc python3-pylibmc +pylint pylint3 +pylint_celery python3-pylint-celery +pylint_common python3-pylint-common +pylint_django python3-pylint-django +pylint_flask python3-pylint-flask +pylint_plugin_utils python3-pylint-plugin-utils +pylxd python3-pylxd +pymacaroons python3-pymacaroons +pymad python3-pymad +pymemcache python3-pymemcache pymia python3-mia +pymummer python3-pymummer +pymzml python3-pymzml +pyngus python3-pyngus +pynmea2 python3-nmea2 +pyocr python3-pyocr +pyodbc python3-pyodbc +pyopencl python3-pyopencl +pyoperators python3-pyoperators +pyorick python3-pyorick +pyosmium python3-pyosmium +pyotp python3-pyotp +pypandoc python3-pypandoc +pyparsing python3-pyparsing +pyparted python3-parted +pypass pypass +pyperclip python3-pyperclip pypolicyd_spf postfix-policyd-spf-python pyppd pyppd +pyproj python3-pyproj +pypuppetdb python3-pypuppetdb +pypureomapi python3-pypureomapi +pyqtgraph python3-pyqtgraph +pyquery python3-pyquery +pyrad python3-pyrad +pyramid python3-pyramid +pyramid_multiauth python3-pyramid-multiauth +pyregion python3-pyregion +pyresample python3-pyresample +pyroma python3-pyroma +pyroute2 python3-pyroute2 +pysam python3-pysam +pysaml2 python3-pysaml2 pysane python3-sane +pyscard python3-pyscard +pysendfile python3-sendfile pyserial python3-serial +pyshp python3-pyshp +pysmbc python3-smbc pysnmp python3-pysnmp4 +pysolr python3-pysolr pyspf python3-spf +pysrt python3-pysrt +pyssim python3-pyssim +pystache python3-pystache pysubnettree python3-subnettree pytaglib python3-taglib +pyte python3-pyte +pytest python3-pytest +pytest_catchlog python3-pytest-catchlog +pytest_cov python3-pytest-cov +pytest_django python3-pytest-django +pytest_httpbin python3-pytest-httpbin +pytest_instafail python3-pytest-instafail +pytest_localserver python3-pytest-localserver +pytest_mock python3-pytest-mock +pytest_multihost python3-pytest-multihost +pytest_pylint python3-pytest-pylint +pytest_runner python3-pytest-runner +pytest_sourceorder python3-pytest-sourceorder +pytest_timeout python3-pytest-timeout +pytest_tornado python3-pytest-tornado +python3_ldap python3-ldap3 python3_libgearman python3-gearman.libgearman +python3_openid python3-openid +python_Levenshtein python3-levenshtein +python_aalib python3-aalib +python_afl python3-afl +python_apt python3-apt +python_augeas python3-augeas +python_axolotl_curve25519 python3-axolotl-curve25519 +python_barbicanclient python3-barbicanclient +python_bugzilla python3-bugzilla +python_casacore python3-casacore +python_ceilometerclient python3-ceilometerclient +python_cinderclient python3-cinderclient +python_congressclient python3-congressclient +python_cpl python3-cpl +python_crontab python3-crontab +python_daemon python3-daemon +python_dateutil python3-dateutil +python_dbusmock python3-dbusmock +python_debian python3-debian +python_debianbts python3-debianbts +python_designateclient python3-designateclient +python_distutils_extra python3-distutils-extra +python_djvulibre python3-djvu +python_dvdvideo python3-dvdvideo +python_editor python3-editor +python_espeak python3-espeak +python_etcd python3-etcd +python_fuelclient python3-fuelclient +python_gammu python3-gammu +python_gflags python3-gflags +python_glanceclient python3-glanceclient +python_gnupg python3-gnupg python_graph_core python3-pygraph python_graph_dot python3-pygraph +python_heatclient python3-heatclient +python_hglib python3-hglib +python_hpilo python3-hpilo +python_igraph python3-igraph +python_instagram python3-instagram +python_ironic_inspector_client python3-ironic-inspector-client +python_ironicclient python3-ironicclient +python_jenkins python3-jenkins +python_keystoneclient python3-keystoneclient +python_libdiscid python3-libdiscid +python_libguess python3-libguess +python_librtmp python3-librtmp +python_libtorrent python3-libtorrent +python_ly python3-ly +python_magnumclient python3-magnumclient +python_manilaclient python3-manilaclient +python_memcached python3-memcache +python_mimeparse python3-mimeparse +python_mistralclient python3-mistralclient +python_monascaclient python3-monascaclient +python_muranoclient python3-muranoclient +python_musicpd python3-musicpd +python_neutronclient python3-neutronclient +python_nmap python3-nmap +python_novaclient python3-novaclient +python_openid_cla python3-openid-cla +python_openid_teams python3-openid-teams +python_openstackclient python3-openstackclient +python_pam python3-pampy +python_popcon python3-popcon +python_poppler_qt4 python3-poppler-qt4 +python_poppler_qt5 python3-poppler-qt5 +python_potr python3-potr +python_pskc python3-pskc +python_qpid_proton python3-qpid-proton +python_redmine python3-redmine +python_saharaclient python3-saharaclient +python_sane python3-sane +python_scciclient python3-scciclient +python_senlinclient python3-senlinclient +python_slugify python3-slugify +python_snappy python3-snappy +python_social_auth python3-social-auth +python_sql python3-sql +python_stdnum python3-stdnum +python_subunit python3-subunit +python_svipc python3-svipc +python_swiftclient python3-swiftclient +python_systemd python3-systemd +python_termstyle python3-termstyle +python_troveclient python3-troveclient +python_vagrant python3-vagrant +python_xlib python3-xlib +python_xmp_toolkit python3-libxmp +python_zaqarclient python3-zaqarclient +pythondialog python3-dialog +pytidylib python3-tidylib +pytils python3-pytils +pytimeparse python3-pytimeparse +pytoml python3-pytoml +pytools python3-pytools +pytsk3 python3-tsk pytz python3-tz +pyuca python3-pyuca +pyudev python3-pyudev +pyusb python3-usb +pyviennacl python3-pyviennacl +pyvmomi python3-pyvmomi +pywapi python3-pywapi +pywinrm python3-winrm +pyxattr python3-pyxattr pyxdg python3-xdg pyzmq python3-zmq +pyzolib python3-pyzolib +q python3-q +qrcode python3-qrcode +qtile python3-qtile +queuelib python3-queuelib +qweborf qweborf +rarfile python3-rarfile +rasterio python3-rasterio +rcssmin python3-rcssmin +rdflib python3-rdflib +rdflib_jsonld python3-rdflib-jsonld +reconfigure python3-reconfigure +redis python3-redis +rednose python3-rednose +regex python3-regex +relational python3-relational +relational_gui relational +relational_readline relational-cli +relatorio python3-relatorio +releases python3-releases +rencode python3-rencode +reno python3-reno +reportlab python3-reportlab +repoze.lru python3-repoze.lru +repoze.sphinx.autointerface python3-repoze.sphinx.autointerface +repoze.tm2 python3-repoze.tm2 +repoze.who python3-repoze.who +reproject python3-reproject +reprotest reprotest +requests python3-requests requests_aws python3-awsauth +requests_cache python3-requests-cache +requests_futures python3-requests-futures +requests_kerberos python3-requests-kerberos +requests_mock python3-requests-mock +requests_oauthlib python3-requests-oauthlib +requests_toolbelt python3-requests-toolbelt +requests_unixsocket python3-requests-unixsocket +requestsexceptions python3-requestsexceptions +requirements_detector python3-requirements-detector +responses python3-responses +restless python3-restless +restructuredtext_lint python3-restructuredtext-lint +retrying python3-retrying +retweet retweet +rfc3986 python3-rfc3986 rhythmbox_ampache rhythmbox-ampache +ripe.atlas.cousteau python3-ripe-atlas-cousteau +ripe.atlas.sagan python3-ripe-atlas-sagan +rjsmin python3-rjsmin +roman python3-roman +rply python3-rply +rpm_python python3-rpm +rpy2 python3-rpy2 +rsa python3-rsa +rss2email rss2email +rtslib_fb python3-rtslib-fb +ruamel.yaml python3-ruamel.yaml +ruffus python3-ruffus +scales python3-scales +schedule python3-schedule +schroot python3-schroot +scikit_bio python3-skbio scikit_image python3-skimage +scikit_learn python3-sklearn +scipy python3-scipy +scoop python3-scoop +scour python3-scour +scp python3-scp +screed python3-screed +scripttest python3-scripttest +scruffington python3-scruffy +seaborn python3-seaborn +selenium python3-selenium +semantic_version python3-semantic-version +semver python3-semver +sen sen +seqdiag python3-seqdiag +serpent python3-serpent +service_identity python3-service-identity +setoptconf python3-setoptconf +setproctitle python3-setproctitle +setuptools_git python3-setuptools-git +setuptools_scm python3-setuptools-scm +sh python3-sh shatag shatag +shellescape python3-shellescape +shortuuid python3-shortuuid +sievelib python3-sievelib +simple_cdd python3-simple-cdd +simpleeval python3-simpleeval +simplegeneric python3-simplegeneric +simplejson python3-simplejson +simpy python3-simpy3 +sireader python3-sireader +six python3-six +sklearn_pandas python3-sklearn-pandas +sleekxmpp python3-sleekxmpp +slimmer python3-slimmer +slip python3-slip +slip.dbus python3-slip-dbus +smartypants python3-smartypants +smmap python3-smmap +smstrade python3-smstrade +snakemake snakemake +snimpy python3-snimpy +snowballstemmer python3-snowballstemmer +snuggs python3-snuggs +socketIO_client python3-socketio-client +socketpool python3-socketpool +sockjs_tornado python3-sockjs-tornado +sopel sopel +sorl_thumbnail python3-sorl-thumbnail +sortedcontainers python3-sortedcontainers +spake2 python3-spake2 +spectral_cube python3-spectral-cube +specutils python3-specutils +sphere python3-sphere +sphinx_argparse python3-sphinx-argparse +sphinx_bootstrap_theme python3-sphinx-bootstrap-theme +sphinx_paramlinks python3-sphinx-paramlinks +sphinx_rtd_theme python3-sphinx-rtd-theme +sphinx_testing python3-sphinx-testing +sphinxcontrib_actdiag python3-sphinxcontrib.actdiag +sphinxcontrib_autoprogram python3-sphinxcontrib.autoprogram +sphinxcontrib_blockdiag python3-sphinxcontrib.blockdiag +sphinxcontrib_doxylink python3-sphinxcontrib.doxylink +sphinxcontrib_httpdomain python3-sphinxcontrib.httpdomain +sphinxcontrib_nwdiag python3-sphinxcontrib.nwdiag +sphinxcontrib_plantuml python3-sphinxcontrib.plantuml +sphinxcontrib_programoutput python3-sphinxcontrib.programoutput +sphinxcontrib_rubydomain python3-sphinxcontrib.rubydomain +sphinxcontrib_seqdiag python3-sphinxcontrib.seqdiag +sphinxcontrib_spelling python3-sphinxcontrib.spelling +sphinxcontrib_youtube python3-sphinxcontrib.youtube +spur python3-spur +spyder python3-spyderlib +sqlacodegen sqlacodegen +sqlalchemy_migrate python3-migrate +sqlparse python3-sqlparse +srp python3-srp +ssdeep python3-ssdeep +sshuttle sshuttle +staticsite staticsite +statsd python3-statsd +stdeb python3-stdeb +stem python3-stem +stevedore python3-stevedore +straight.plugin python3-straight.plugin +structlog python3-structlog +stsci.distutils python3-stsci.distutils +subliminal python3-subliminal +subuser subuser +suds_jurko python3-suds +sunlight python3-sunlight +sunpy python3-sunpy +sure python3-sure +svg.path python3-svg.path +svgwrite python3-svgwrite +swiftsc python3-swiftsc +sympy python3-sympy +sysv_ipc python3-sysv-ipc +tables python3-tables +tabulate python3-tabulate +taskflow python3-taskflow +taskw python3-taskw +tblib python3-tblib +tempest_lib python3-tempest-lib +termcolor python3-termcolor +terminado python3-terminado +testrepository python3-testrepository +testresources python3-testresources +testscenarios python3-testscenarios +testtools python3-testtools +textile python3-textile +texttable python3-texttable +tkSnack python3-tksnack +tldp python3-tldp +tlsh python3-tlsh +tlslite_ng python3-tlslite-ng +tomahawk python3-tomahawk +toml python3-toml +tooz python3-tooz +toposort python3-toposort +tornado python3-tornado +toro python3-toro +tosca_parser python3-tosca-parser +tox tox +tqdm python3-tqdm +traceback2 python3-traceback2 +traitlets python3-traitlets +traits python3-traits +tox python-tox +transaction python3-transaction +translationstring python3-translationstring +transmissionrpc python3-transmissionrpc +treq python3-treq +trollius python3-trollius +tunigo python3-tunigo +tweepy python3-tweepy +twine twine +twitterwatch twitterwatch +twython python3-twython +txZMQ python3-txzmq +txaio python3-txaio +typecatcher typecatcher +typogrify python3-typogrify +tz_converter tz-converter +tzlocal python3-tzlocal +ubuntu_dev_tools python3-ubuntutools +udiskie udiskie ufw ufw +ujson python3-ujson unattended_upgrades unattended-upgrades +uncertainties python3-uncertainties +unicodecsv python3-unicodecsv +unittest2 python3-unittest2 +uritemplate python3-uritemplate +uritools python3-uritools +urllib3 python3-urllib3 +urlscan urlscan +urwid python3-urwid +urwidtrees python3-urwidtrees uucp_lmtp uucp-lmtp +validictory python3-validictory +vatnumber python3-vatnumber +vcrpy python3-vcr +vcversioner python3-vcversioner +venusian python3-venusian +versiontools python3-versiontools +virtualenv python3-virtualenv +vispy python3-vispy +vobject python3-vobject +voltron voltron +voluptuous python3-voluptuous +vulture vulture +w3lib python3-w3lib +wadllib python3-wadllib +waitress python3-waitress +warlock python3-warlock +watchdog python3-watchdog +wchartype python3-wchartype +wcsaxes python3-wcsaxes +wcwidth python3-wcwidth +webassets python3-webassets +webcolors python3-webcolors +websocket_client python3-websocket +websockets python3-websockets +wget python3-wget +wheel python3-wheel +whichcraft python3-whichcraft +whois python3-whois +wlc wlc +woo python3-woo +wrapt python3-wrapt +ws4py python3-ws4py +wsgi_intercept python3-wsgi-intercept +wsgicors python3-wsgicors +xcffib python3-xcffib +xdo python3-xdo +xdot xdot +xkcd python3-xkcd +xkcdpass xkcdpass +xlrd python3-xlrd +xmltodict python3-xmltodict +xonsh xonsh +xtermcolor python3-xtermcolor +xvfbwrapper python3-xvfbwrapper +yamllint yamllint +yaql python3-yaql yara_python python3-yara -zeroinstall_injector zeroinstall-injector +yattag python3-yattag +yt python3-yt +zake python3-zake +zenoss python3-zenoss +zeroconf python3-zeroconf +zipstream python3-zipstream +zope.browser python3-zope.browser +zope.component python3-zope.component +zope.configuration python3-zope.configuration +zope.contenttype python3-zope.contenttype +zope.deprecation python3-zope.deprecation +zope.event python3-zope.event +zope.exceptions python3-zope.exceptions +zope.fixers python3-zope.fixers +zope.hookable python3-zope.hookable +zope.i18n python3-zope.i18n +zope.i18nmessageid python3-zope.i18nmessageid +zope.interface python3-zope.interface +zope.location python3-zope.location +zope.proxy python3-zope.proxy +zope.schema python3-zope.schema +zope.security python3-zope.security +zope.testing python3-zope.testing +zope.testrunner python3-zope.testrunner +zzzeeksphinx python3-zzzeeksphinx diff -Nru dh-python-1.20140128/pydist/generate_fallback_list.py dh-python-2.20160818~bpo8+1~trusty/pydist/generate_fallback_list.py --- dh-python-1.20140128/pydist/generate_fallback_list.py 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/pydist/generate_fallback_list.py 2016-08-28 19:23:21.000000000 +0000 @@ -1,5 +1,5 @@ #! /usr/bin/python3 -# Copyright © 2010-2013 Piotr Ożarowski +# Copyright © 2010-2015 Piotr Ożarowski # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -21,12 +21,21 @@ import re import sys +try: + from distro_info import DistroInfo # python3-distro-info package +except ImportError: + DistroInfo = None from gzip import decompress from os import chdir, mkdir from os.path import dirname, exists, isdir, join, split from urllib.request import urlopen -SOURCE = 'http://ftp.debian.org/debian/dists/unstable/main/Contents-amd64.gz' +if '--ubuntu' in sys.argv and DistroInfo: + SOURCE = 'http://archive.ubuntu.com/ubuntu/dists/%s/Contents-amd64.gz' % \ + DistroInfo('ubuntu').devel() +else: + SOURCE = 'http://ftp.debian.org/debian/dists/jessie/main/Contents-amd64.gz' + IGNORED_PKGS = {'python-setuptools', 'python3-setuptools', 'pypy-setuptools'} DEFAULTS = { 'cpython2': [ @@ -35,9 +44,13 @@ 'wsgiref python (>= 2.5) | python-wsgiref\n', 'argparse python (>= 2.7) | python-argparse\n', # not recognized due to .pth file (egg-info is in PIL/ and not in *-packages/) - 'pil python-imaging\n'], + 'pil python-pil\n', + 'Pillow python-pil\n'], 'cpython3': [ - 'setuptools python3-pkg-resources\n'], + 'pil python3-pil\n', + 'Pillow python3-pil\n', + 'setuptools python3-pkg-resources\n', + 'argparse python3 (>= 3.2)\n'], 'pypy': [] } @@ -76,7 +89,10 @@ fp.write(data) else: data = open(cache_fpath, 'rb').read() -data = str(decompress(data), encoding='UTF-8') +try: + data = str(decompress(data), encoding='UTF-8') +except UnicodeDecodeError as e: # Ubuntu + data = str(decompress(data), encoding='ISO-8859-15') result = { 'cpython2': {}, @@ -89,7 +105,11 @@ if line.startswith('FILE'): is_header = False continue - path, desc = line.rsplit(maxsplit=1) + try: + path, desc = line.rsplit(maxsplit=1) + except ValueError: + # NOTE(jamespage) some lines in Ubuntu are not parseable. + continue path = '/' + path.rstrip() section, pkg_name = desc.rsplit('/', 1) if pkg_name in IGNORED_PKGS: diff -Nru dh-python-1.20140128/pydist/Makefile dh-python-2.20160818~bpo8+1~trusty/pydist/Makefile --- dh-python-1.20140128/pydist/Makefile 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/pydist/Makefile 2016-06-17 20:05:56.000000000 +0000 @@ -1,12 +1,14 @@ #!/usr/bin/make -f +FALLBACK_FLAGS = $(shell dpkg-vendor --is ubuntu && echo '--ubuntu') + clean: rm -rf cache #rm -f dist_fallback rm -f README.PyDist.html dist_fallback: - python3 ./generate_fallback_list.py --skip-sensible-names + python3 ./generate_fallback_list.py $(FALLBACK_FLAGS) README.PyDist.html: README.PyDist rst2html $< $@ diff -Nru dh-python-1.20140128/pydist/pypy_fallback dh-python-2.20160818~bpo8+1~trusty/pydist/pypy_fallback --- dh-python-1.20140128/pydist/pypy_fallback 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/pydist/pypy_fallback 2016-08-28 19:40:47.000000000 +0000 @@ -1,2 +1,23 @@ +Unidecode pypy-unidecode +Wand pypy-wand +appdirs pypy-appdirs +attrs pypy-attr beautifulsoup4 pypy-bs4 +dulwich pypy-dulwich +enum34 pypy-enum34 +fastimport pypy-fastimport +flaky pypy-flaky +genty pypy-genty +idna pypy-idna +ipaddress pypy-ipaddress +iso8601 pypy-iso8601 +mutagen pypy-mutagen +packaging pypy-packaging +pretend pypy-pretend +pyasn1 pypy-pyasn1 +pyparsing pypy-pyparsing pyzmq pypy-zmq +rply pypy-rply +simplejson pypy-simplejson +six pypy-six +sqlparse pypy-sqlparse diff -Nru dh-python-1.20140128/pydist/README.PyDist dh-python-2.20160818~bpo8+1~trusty/pydist/README.PyDist --- dh-python-1.20140128/pydist/README.PyDist 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/pydist/README.PyDist 2016-08-27 07:39:16.000000000 +0000 @@ -7,7 +7,27 @@ PyDist files help tools like dh_python2/3 to translate Python dependencies (from setup.py's install_requires or egg's requires.txt file) to Debian -dependencies. +dependencies if given Python distribution file / directory is not installed +(hint: add proper package to Build-Depends and PyDist file might not be needed) +or if detection is not correct. + +Before checking for package that provides installed egg-info file or directory +dh_python3 is checking these locations for overrides: + + * debian/py3dist-overrides + * /usr/share/python3/dist/* + * /usr/share/dh-python/dist/cpython3_fallback + +debian/python3-foo.pydist is copied into /usr/share/python3/dist/ automatically. + +For Python 2.X it's adequately: pydist-overrides, /usr/share/python/dist/* and +/usr/share/dh-python/dist/cpython2_fallback + +For PyPy it's adequately: pypydist-overrides, /usr/share/pypy/dist/* and +/usr/share/dh-python/dist/pypy_fallback + +*NOTE:* There's no need to add an override if build-depending on a package that +provides searched egg-info results in correctly recognized dependency. Required fields: diff -Nru dh-python-1.20140128/README.rst dh-python-2.20160818~bpo8+1~trusty/README.rst --- dh-python-1.20140128/README.rst 1970-01-01 00:00:00.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/README.rst 2016-06-17 20:05:56.000000000 +0000 @@ -0,0 +1,192 @@ +=========== + dh-python +=========== + +``dh-python`` provides various tools that help packaging Python related files +in Debian. + +* ``pybuild`` is a tool that implements ``dh`` sequencer's ``dh_auto_foo`` + commands (but it can be used outside ``dh`` as well). It builds and installs + files. + +* ``dh_python2`` / ``dh_python3`` / ``dh_pypy`` are tools that take what + ``pybuild`` produces and generates runtime dependencies and maintainer + scripts. It fixes some common mistakes, like installing files into + ``site-packages`` instead of ``dist-packages``, ``/usr/local/bin/`` + shebangs, removes ``.py`` files from ``-dbg`` packages, etc.) + + To translate ``requires.txt`` (a file installed in + ``dist-packages/foo.egg-info/``) into Debian dependencies, a list of + packages that provide given egg distribution is used. If the dependency + is not found there, ``dpkg -S`` is used (i.e. a given dependency has to be + installed; you need it in ``Build-Depends`` in order to run tests anyway). + See *dependencies* section in ``dh_python3``'s manpage for more details. + + * ``dh_python2`` works on ``./debian/python-foo/`` files and other binary + packages that have ``${python:Depends}`` in the ``Depends`` field. + It ignores Python 3.X and PyPy specific directories. + See ``dh_python2`` manpage for more details. + + * ``dh_python3`` works on ``./debian/python3-foo/`` files and other binary + packages that have ``${python3:Depends}`` in the ``Depends`` field. + It ignores Python 2.X and PyPy specific directories. + See ``dh_python3`` manpage for more details. + + * ``dh_pypy`` works on ``./debian/pypy-foo/`` files and other binary + packages that have ``${pypy:Depends}`` in the ``Depends`` field. + It ignores Python 2.X and Python 3.X specific directories. + See ``dh_pypy`` manpage for more details. + + +How it works +============ + +A simplified work flow looks like this: + +.. code:: python + + # dh_auto_clean stage + for interpreter in REQUESTED_INTERPRETERS: + for version in interpreter.REQUESTED_VERSIONS: + PYBUILD_BEFORE_CLEAN + pybuild --clean + PYBUILD_AFTER_CLEAN + + plenty_of_other_dh_foo_tools_invoked_here + + # dh_auto_configure stage + for interpreter in REQUESTED_INTERPRETERS: + for version in interpreter.REQUESTED_VERSIONS: + PYBUILD_BEFORE_CONFIGURE + pybuild --configure + PYBUILD_AFTER_CONFIGURE + + plenty_of_other_dh_foo_tools_invoked_here + + # dh_auto_build stage + for interpreter in REQUESTED_INTERPRETERS: + for version in interpreter.REQUESTED_VERSIONS: + PYBUILD_BEFORE_BUILD + pybuild --build + PYBUILD_AFTER_BUILD + + plenty_of_other_dh_foo_tools_invoked_here + + # dh_auto_test stage + for interpreter in REQUESTED_INTERPRETERS: + for version in interpreter.REQUESTED_VERSIONS: + PYBUILD_BEFORE_TEST + pybuild --test + PYBUILD_AFTER_TEST + + plenty_of_other_dh_foo_tools_invoked_here + + # dh_auto_install stage + for interpreter in REQUESTED_INTERPRETERS: + for version in interpreter.REQUESTED_VERSIONS: + PYBUILD_BEFORE_INSTALL + pybuild --install + PYBUILD_AFTER_INSTALL + + plenty_of_other_dh_foo_tools_invoked_here + + dh_python2 + dh_python3 + dh_pypy + + plenty_of_other_dh_foo_tools_invoked_here + + +pybuild --$step +--------------- + +This command is auto-detected, it currently supports distutils, autotools, +cmake and a custom build system where you can define your own set of +commands. Why do we need it? ``dh_auto_foo`` doesn't know each command has to +be invoked for each interpreter and version. + + +REQUESTED_INTERPRETERS +---------------------- + +is parsed from ``Build-Depends`` if ``--buildsystem=pybuild`` is set. If it's +not, you have to pass ``--interpreter`` to ``pybuild`` (more in its manpage) + +* ``python{3,}-all{,-dev}`` - all CPython interpreters (for packages that + provide public modules / extensions) +* ``python{3,}-all-dbg`` - all CPython debug interpreters (if ``-dbg`` package + is provided) +* ``python{3,}`` - default CPython or closest to default interpreter only (use + this if you build a Python application) +* ``python{3,}-dbg`` - default CPython debug (or closest to the default one) + only +* ``pypy`` - PyPy interpreter + + +REQUESTED_VERSIONS +------------------ + +is parsed from ``X-Python{,3}-Version`` and ``Build-Depends`` (the right +``X-*-Version`` is parsed based on interpreters listed in ``Build-Depends``, +see above) See also Debian Python Policy for ``X-Python-Version`` description. + + +BEFORE and AFTER commands +------------------------- + +can be different for each interpreter and/or version, examples: + +* ``PYBUILD_AFTER_BUILD_python3.5=rm {destdir}/{build_dir}/foo/bar2X.py`` +* ``PYBUILD_BEFORE_INSTALL_python3=touch {destdir}/{install_dir}/foo/bar/__init__.py`` + +These commands should be used only if overriding ``dh_auto_foo`` is not enough +(example below) + +.. code:: + + override_dh_auto_install: + before_auto_install_commands + dh_auto_install + after_auto_install_commands + +See the ``pybuild`` manpage for more details (search for ``BUILD SYSTEM ARGUMENTS``) + + +overrides +--------- + +How to override ``pybuild`` autodetected options: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +* Each ``pybuild`` call can be disabled (for given interpreter, version or + stage). See the ``pybuild`` manpage for more details (search for + ``--disable`` description). +* You can pass options in ``override_dh_auto_foo`` via command line options: + + .. code:: + + dh_auto_test -- --system=custom --test-args='{interpreter} setup.py test' + + or env. variables: + + .. code:: + + PYBUILD_SYSTEM=custom PYBUILD_TEST_ARGS='{interpreter} setup.py test' dh_auto_test + +* You can export env. variables globally at the beginning of debian/rules + + .. code:: + + export PYBUILD_TEST_ARGS={dir}/tests/ + +How to override dh_python* options: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + * via command line, f.e. + +.. code:: + + override_dh_python3: + dh_python3 --shebang=/usr/bin/python3 + diff -Nru dh-python-1.20140128/tests/Makefile dh-python-2.20160818~bpo8+1~trusty/tests/Makefile --- dh-python-1.20140128/tests/Makefile 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/tests/Makefile 2016-08-27 07:39:12.000000000 +0000 @@ -3,9 +3,9 @@ # hardcode default/supported Python versions to make tests more reliable # Note that all these packages have to be installed during tests export DEBPYTHON_DEFAULT=2.7 -export DEBPYTHON_SUPPORTED=2.6,2.7 -export DEBPYTHON3_DEFAULT=3.3 -export DEBPYTHON3_SUPPORTED=3.2,3.3 +export DEBPYTHON_SUPPORTED=2.7 +export DEBPYTHON3_DEFAULT=3.4 +export DEBPYTHON3_SUPPORTED=3.4 # enable or disable tests here: TESTS := test101 test201 test202 test203 test204 test205 test206 test207 test301 test302 test303 test304 diff -Nru dh-python-1.20140128/tests/t202/debian/install dh-python-2.20160818~bpo8+1~trusty/tests/t202/debian/install --- dh-python-1.20140128/tests/t202/debian/install 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/tests/t202/debian/install 2016-06-17 20:05:56.000000000 +0000 @@ -1,3 +1,4 @@ foo.py /usr/share/pyshared/ __init__.py /usr/share/pyshared/bar/ +__init__.py /usr/share/pyshared/tests/ bar.py /usr/share/pyshared/bar/ diff -Nru dh-python-1.20140128/tests/t202/Makefile dh-python-2.20160818~bpo8+1~trusty/tests/t202/Makefile --- dh-python-1.20140128/tests/t202/Makefile 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/tests/t202/Makefile 2016-06-17 20:05:56.000000000 +0000 @@ -4,7 +4,8 @@ clean: clean-common check: - test -f debian/python-foo/usr/lib/python2.6/dist-packages/foo.py - test -f debian/python-foo/usr/lib/python2.6/dist-packages/bar/bar.py + test -f debian/python-foo/usr/lib/python2.7/dist-packages/foo.py + test -f debian/python-foo/usr/lib/python2.7/dist-packages/bar/bar.py + test \! -f debian/python-foo/usr/lib/python2.7/dist-packages/tests/__init__.py grep -q pycompile debian/python-foo/DEBIAN/postinst grep -q pyclean debian/python-foo/DEBIAN/prerm diff -Nru dh-python-1.20140128/tests/t204/Makefile dh-python-2.20160818~bpo8+1~trusty/tests/t204/Makefile --- dh-python-1.20140128/tests/t204/Makefile 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/tests/t204/Makefile 2014-07-01 18:20:52.000000000 +0000 @@ -5,7 +5,7 @@ check: grep -q python2.6 debian/foo/usr/share/foo/foo.py - grep -q Depends:.*python2.6 debian/foo/DEBIAN/control + grep -q Depends:.*python debian/foo/DEBIAN/control #grep -q python2.5 debian/foo/usr/share/bar/bar.py #grep -q Depends:.*python2.5 debian/foo/DEBIAN/control grep -q python2.4 debian/foo/usr/share/foo/baz.py diff -Nru dh-python-1.20140128/tests/t206/Makefile dh-python-2.20160818~bpo8+1~trusty/tests/t206/Makefile --- dh-python-1.20140128/tests/t206/Makefile 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/tests/t206/Makefile 2014-07-01 18:20:52.000000000 +0000 @@ -13,6 +13,6 @@ grep -q '\-V 2.5 /usr/share/bar25' debian/foo/usr/share/python/runtime.d/foo.rtupdate grep -q '/usr/share/bar25 \-V 2.5' debian/foo/DEBIAN/postinst # python2.6 hardcoded via shebang - grep -q Depends:.*python2.6 debian/foo/DEBIAN/control + #grep -q Depends:.*python2.6 debian/foo/DEBIAN/control grep -q '\-V 2.6 /usr/share/foo' debian/foo/usr/share/python/runtime.d/foo.rtupdate grep -q '/usr/share/foo \-V 2.6' debian/foo/DEBIAN/postinst diff -Nru dh-python-1.20140128/tests/t304/foo.py dh-python-2.20160818~bpo8+1~trusty/tests/t304/foo.py --- dh-python-1.20140128/tests/t304/foo.py 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/tests/t304/foo.py 2014-07-01 18:20:52.000000000 +0000 @@ -1,2 +1,2 @@ -#!/usr/local/bin/python3.3 -"/usr/local/bin/python3.3 hardcoded in shebang" +#!/usr/local/bin/python3.4 +"/usr/local/bin/python3.4 hardcoded in shebang" diff -Nru dh-python-1.20140128/tests/t304/Makefile dh-python-2.20160818~bpo8+1~trusty/tests/t304/Makefile --- dh-python-1.20140128/tests/t304/Makefile 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/tests/t304/Makefile 2014-07-01 18:20:52.000000000 +0000 @@ -6,10 +6,10 @@ check: # python3.2 hardcoded via `dh_python3 --shebang ...python3.2` grep -q '#! /usr/bin/python3.2 -OO' debian/foo/usr/share/baz32/baz.py - # python3.3 hardcoded via shebang - grep -q '/usr/share/foo \-V 3.3' debian/foo/DEBIAN/postinst + # python3.4 hardcoded via shebang + grep -q '/usr/share/foo \-V 3.4' debian/foo/DEBIAN/postinst # /env removed from shebang grep -q '#! /usr/bin/python3' debian/foo/usr/share/bar/bar.py # /local removed from shebang grep -q '#! /usr/bin/python3' debian/foo/usr/share/foo/baz.py - grep -q '#! /usr/bin/python3.3' debian/foo/usr/share/foo/foo.py + grep -q '#! /usr/bin/python3.4' debian/foo/usr/share/foo/foo.py diff -Nru dh-python-1.20140128/tests/test_depends.py dh-python-2.20160818~bpo8+1~trusty/tests/test_depends.py --- dh-python-1.20140128/tests/test_depends.py 1970-01-01 00:00:00.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/tests/test_depends.py 2016-08-27 07:39:16.000000000 +0000 @@ -0,0 +1,131 @@ +import os +import unittest +from copy import deepcopy +from pickle import dumps +from tempfile import TemporaryDirectory + +from dhpython.depends import Dependencies + + +class FakeOptions: + def __init__(self, **kwargs): + opts = { + 'depends': (), + 'depends_section': (), + 'guess_deps': False, + 'recommends': (), + 'recommends_section': (), + 'requires': (), + 'suggests': (), + 'suggests_section': (), + 'vrange': None, + } + opts.update(kwargs) + for k, v in opts.items(): + setattr(self, k, v) + + +def prime_pydist(impl, pydist): + """Fake the pydist data for impl. Returns a cleanup function""" + from dhpython.pydist import load + + for name, entries in pydist.items(): + if not isinstance(entries, list): + pydist[name] = entries = [entries] + for i, entry in enumerate(entries): + if isinstance(entry, str): + entries[i] = entry = {'dependency': entry} + entry.setdefault('name', name) + entry.setdefault('standard', '') + entry.setdefault('rules', []) + entry.setdefault('versions', set()) + + key = dumps(((impl,), {})) + load.cache[key] = pydist + return lambda: load.cache.pop(key) + + +class DependenciesTestCase(unittest.TestCase): + pkg = 'foo' + impl = 'cpython3' + pydist = {} + stats = { + 'compile': False, + 'egg-info': set(), + 'ext_no_version': set(), + 'ext_vers': set(), + 'nsp.txt': set(), + 'private_dirs': {}, + 'public_vers': set(), + 'requires.txt': set(), + 'shebangs': set(), + } + requires = {} + options = FakeOptions() + + def setUp(self): + self.d = Dependencies(self.pkg, self.impl) + + stats = deepcopy(self.stats) + if self.requires: + self.tempdir = TemporaryDirectory() + self.addCleanup(self.tempdir.cleanup) + old_wd = os.getcwd() + os.chdir(self.tempdir.name) + self.addCleanup(os.chdir, old_wd) + + for fn, lines in self.requires.items(): + os.makedirs(os.path.dirname(fn)) + with open(fn, 'w') as f: + f.write('\n'.join(lines)) + stats['requires.txt'].add(fn) + + cleanup = prime_pydist(self.impl, self.pydist) + self.addCleanup(cleanup) + + self.d.parse(stats, self.options) + + +class TestRequiresCPython3(DependenciesTestCase): + options = FakeOptions(guess_deps=True) + pydist = { + 'bar': 'python3-bar', + 'baz': {'dependency': 'python3-baz', 'standard': 'PEP386'}, + 'quux': {'dependency': 'python3-quux', 'standard': 'PEP386'}, + } + requires = { + 'debian/foo/usr/lib/python3/dist-packages/foo.egg-info/requires.txt': ( + 'bar', + 'baz >= 1.0', + 'quux', + ), + } + + def test_depends_on_bar(self): + self.assertIn('python3-bar', self.d.depends) + + def test_depends_on_baz(self): + self.assertIn('python3-baz (>= 1.0)', self.d.depends) + + +class TestRequiresPyPy(DependenciesTestCase): + impl = 'pypy' + options = FakeOptions(guess_deps=True) + pydist = { + 'bar': 'pypy-bar', + 'baz': {'dependency': 'pypy-baz', 'standard': 'PEP386'}, + 'quux': {'dependency': 'pypy-quux', 'standard': 'PEP386'}, + } + requires = { + 'debian/foo/usr/lib/pypy/dist-packages/foo.egg-info/requires.txt': ( + 'bar', + 'baz >= 1.0', + 'quux', + ) + } + + def test_depends_on_bar(self): + self.assertIn('pypy-bar', self.d.depends) + + def test_depends_on_baz(self): + self.assertIn('pypy-baz (>= 1.0)', self.d.depends) diff -Nru dh-python-1.20140128/tests/test_interpreter.py dh-python-2.20160818~bpo8+1~trusty/tests/test_interpreter.py --- dh-python-1.20140128/tests/test_interpreter.py 2014-01-28 17:20:25.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/tests/test_interpreter.py 2016-06-17 20:05:56.000000000 +0000 @@ -45,7 +45,7 @@ self.assertIsNone(i.check_extname('foo.MYARCH_d.so')) self.assertIsNone(i.check_extname('foo.abi3.so')) self.assertIsNone(i.check_extname('foo.OTHER.so')) # different architecture - self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), 'foo/bar/bazmodule.MYARCH.so') + self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), 'foo/bar/baz.MYARCH.so') @unittest.skipUnless(exists('/usr/bin/python2.7-dbg'), 'python2.7-dbg is not installed') def test_python27dbg(self): @@ -55,7 +55,7 @@ self.assertEqual(i.check_extname('foo_d.so'), 'foo.MYARCH_d.so') self.assertIsNone(i.check_extname('foo.MYARCH_d.so')) self.assertIsNone(i.check_extname('foo.OTHER_d.so')) # different architecture - self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), 'foo/bar/bazmodule.MYARCH_d.so') + self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), 'foo/bar/baz.MYARCH_d.so') @unittest.skipUnless(exists('/usr/bin/python3.1'), 'python3.1 is not installed') def test_python31(self): @@ -93,26 +93,68 @@ self.assertIsNone(i.check_extname('foo.abi3.so')) self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), r'foo/bar/bazmodule.cpython-32dmu.so') - @unittest.skipUnless(exists('/usr/bin/python3.3'), 'python3.3 is not installed') - def test_python33(self): - i = Interpreter('python3.3') - self.assertEqual(i.soabi(), 'cpython-33m') - self.assertEqual(i.check_extname('foo.so'), r'foo.cpython-33m-MYARCH.so') - self.assertIsNone(i.check_extname('foo.cpython-32m.so')) # different version - self.assertIsNone(i.check_extname('foo.cpython-33m-OTHER.so')) # different architecture - self.assertEqual(i.check_extname('foo.cpython-33m.so'), r'foo.cpython-33m-MYARCH.so') - self.assertIsNone(i.check_extname('foo.abi3.so')) - self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), r'foo/bar/baz.cpython-33m-MYARCH.so') - - @unittest.skipUnless(exists('/usr/bin/python3.3-dbg'), 'python3.3-dbg is not installed') - def test_python33dbg(self): - i = Interpreter('python3.3-dbg') - self.assertEqual(i.soabi(), 'cpython-33dm') - self.assertEqual(i.check_extname('foo.so'), r'foo.cpython-33dm-MYARCH.so') + @unittest.skipUnless(exists('/usr/bin/python3.4'), 'python3.4 is not installed') + def test_python34(self): + i = Interpreter('python3.4') + self.assertEqual(i.soabi(), 'cpython-34m') + self.assertEqual(i.check_extname('foo.so'), r'foo.cpython-34m-MYARCH.so') self.assertIsNone(i.check_extname('foo.cpython-32m.so')) # different version - self.assertIsNone(i.check_extname('foo.cpython-33m-OTHER.so')) # different architecture + self.assertIsNone(i.check_extname('foo.cpython-34m-OTHER.so')) # different architecture + self.assertEqual(i.check_extname('foo.cpython-34m.so'), r'foo.cpython-34m-MYARCH.so') self.assertIsNone(i.check_extname('foo.abi3.so')) - self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), r'foo/bar/baz.cpython-33dm-MYARCH.so') + self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), r'foo/bar/baz.cpython-34m-MYARCH.so') + + @unittest.skipUnless(exists('/usr/bin/python3.4-dbg'), 'python3.4-dbg is not installed') + def test_python34dbg(self): + i = Interpreter('python3.4-dbg') + self.assertEqual(i.soabi(), 'cpython-34dm') + self.assertEqual(i.check_extname('foo.so'), r'foo.cpython-34dm-MYARCH.so') + self.assertIsNone(i.check_extname('foo.cpython-32m.so')) # different version + self.assertIsNone(i.check_extname('foo.cpython-34m-OTHER.so')) # different architecture + self.assertIsNone(i.check_extname('foo.abi3.so')) + self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), r'foo/bar/baz.cpython-34dm-MYARCH.so') + + @unittest.skipUnless(exists('/usr/bin/python3.5'), 'python3.5 is not installed') + def test_python35(self): + i = Interpreter('python3.5') + self.assertEqual(i.soabi(), 'cpython-35m') + self.assertEqual(i.check_extname('foo.so'), r'foo.cpython-35m-MYARCH.so') + self.assertIsNone(i.check_extname('foo.cpython-32m.so')) # different version + self.assertIsNone(i.check_extname('foo.cpython-35m-OTHER.so')) # different architecture + self.assertEqual(i.check_extname('foo.cpython-35m.so'), r'foo.cpython-35m-MYARCH.so') + self.assertIsNone(i.check_extname('foo.abi3.so')) + self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), r'foo/bar/baz.cpython-35m-MYARCH.so') + + @unittest.skipUnless(exists('/usr/bin/python3.5-dbg'), 'python3.5-dbg is not installed') + def test_python35dbg(self): + i = Interpreter('python3.5-dbg') + self.assertEqual(i.soabi(), 'cpython-35dm') + self.assertEqual(i.check_extname('foo.so'), r'foo.cpython-35dm-MYARCH.so') + self.assertIsNone(i.check_extname('foo.cpython-32m.so')) # different version + self.assertIsNone(i.check_extname('foo.cpython-35m-OTHER.so')) # different architecture + self.assertIsNone(i.check_extname('foo.abi3.so')) + self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), r'foo/bar/baz.cpython-35dm-MYARCH.so') + + @unittest.skipUnless(exists('/usr/bin/python3.6'), 'python3.6 is not installed') + def test_python36(self): + i = Interpreter('python3.6') + self.assertEqual(i.soabi(), 'cpython-36m') + self.assertEqual(i.check_extname('foo.so'), r'foo.cpython-36m-MYARCH.so') + self.assertIsNone(i.check_extname('foo.cpython-32m.so')) # different version + self.assertIsNone(i.check_extname('foo.cpython-36m-OTHER.so')) # different architecture + self.assertEqual(i.check_extname('foo.cpython-36m.so'), r'foo.cpython-36m-MYARCH.so') + self.assertIsNone(i.check_extname('foo.abi3.so')) + self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), r'foo/bar/baz.cpython-36m-MYARCH.so') + + @unittest.skipUnless(exists('/usr/bin/python3.6-dbg'), 'python3.6-dbg is not installed') + def test_python36dbg(self): + i = Interpreter('python3.6-dbg') + self.assertEqual(i.soabi(), 'cpython-36dm') + self.assertEqual(i.check_extname('foo.so'), r'foo.cpython-36dm-MYARCH.so') + self.assertIsNone(i.check_extname('foo.cpython-32m.so')) # different version + self.assertIsNone(i.check_extname('foo.cpython-36m-OTHER.so')) # different architecture + self.assertIsNone(i.check_extname('foo.abi3.so')) + self.assertEqual(i.check_extname('foo/bar/bazmodule.so'), r'foo/bar/baz.cpython-36dm-MYARCH.so') def test_version(self): i = Interpreter(impl='cpython2') diff -Nru dh-python-1.20140128/tests/test_tools.py dh-python-2.20160818~bpo8+1~trusty/tests/test_tools.py --- dh-python-1.20140128/tests/test_tools.py 1970-01-01 00:00:00.000000000 +0000 +++ dh-python-2.20160818~bpo8+1~trusty/tests/test_tools.py 2016-06-17 20:05:56.000000000 +0000 @@ -0,0 +1,44 @@ +from tempfile import TemporaryDirectory +import os +import unittest + +from dhpython.tools import relpath, move_matching_files + + +class TestRelpath(unittest.TestCase): + def test_common_parent_dir(self): + r = relpath('/usr/share/python-foo/foo.py', '/usr/bin/foo') + self.assertEqual(r, '../share/python-foo/foo.py') + + def test_strips_common_prefix(self): + r = relpath('/usr/share/python-foo/foo.py', '/usr/share') + self.assertEqual(r, 'python-foo/foo.py') + + def test_trailing_slash_ignored(self): + r = relpath('/usr/share/python-foo/foo.py', '/usr/share/') + self.assertEqual(r, 'python-foo/foo.py') + + +class TestMoveMatchingFiles(unittest.TestCase): + def setUp(self): + self.tmpdir = TemporaryDirectory() + self.addCleanup(self.tmpdir.cleanup) + os.makedirs(self.tmppath('foo/bar/a/b/c/spam')) + for path in ('foo/bar/a/b/c/spam/file.so', + 'foo/bar/a/b/c/spam/file.py'): + open(self.tmppath(path), 'w').close() + + move_matching_files(self.tmppath('foo/bar/'), + self.tmppath('foo/baz/'), + 'spam/.*\.so$') + + def tmppath(self, *path): + return os.path.join(self.tmpdir.name, *path) + + def test_moved_matching_file(self): + self.assertTrue(os.path.exists( + self.tmppath('foo/baz/a/b/c/spam/file.so'))) + + def test_left_non_matching_file(self): + self.assertTrue(os.path.exists( + self.tmppath('foo/bar/a/b/c/spam/file.py')))