Hello community, here is the log from the commit of package python-path.py for openSUSE:Factory checked in at 2017-07-11 08:25:13 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-path.py (Old) and /work/SRC/openSUSE:Factory/.python-path.py.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-path.py" Tue Jul 11 08:25:13 2017 rev:2 rq:508338 version:10.3.1 Changes: -------- --- /work/SRC/openSUSE:Factory/python-path.py/python-path.py.changes 2015-09-30 05:50:46.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.python-path.py.new/python-path.py.changes 2017-07-11 08:25:13.940635533 +0200 @@ -1,0 +2,54 @@ +Tue Jul 4 09:45:39 UTC 2017 - [email protected] + +- Update to version 10.3.1 + * #124: Fixed ``rmdir_p`` raising ``FileNotFoundError`` when + directory does not exist on Windows. + 10.3: + * #115: Added a new performance-optimized implementation + for listdir operations, optimizing ``listdir``, ``walk``, + ``walkfiles``, ``walkdirs``, and ``fnmatch``, presented + as the ``FastPath`` class. + Please direct feedback on this implementation to the ticket, + especially if the performance benefits justify it replacing + the default ``Path`` class. + 10.2: + * Symlink no longer requires the ``newlink`` parameter + and will default to the basename of the target in the + current working directory. + 10.1: + * #123: Implement ``Path.__fspath__`` per PEP 519. + 10.0: + * Once again as in 8.0 remove deprecated ``path.path``. + 9.1: + * #121: Removed workaround for #61 added in 5.2. ``path.py`` + now only supports file system paths that can be effectively + decoded to text. It is the responsibility of the system + implementer to ensure that filenames on the system are + decodeable by ``sys.getfilesystemencoding()``. + 9.0: + * Drop support for Python 2.6 and 3.2 as integration + dependencies (pip) no longer support these versions. + 8.3: + * Merge with latest skeleton, adding badges and test runs by + default under tox instead of pytest-runner. + * Documentation is no longer hosted with PyPI. + 8.2.1: + * #112: Update Travis CI usage to only deploy on Python 3.5. + 8.2: + * Refreshed project metadata based on `jaraco's project + skeleton <https://github.com/jaraco/skeleton/tree/spaces>_. + * Releases are now automatically published via Travis-CI. + * #111: More aggressively trap errors when importing + ``pkg_resources``. + 8.1.2: + * #105: By using unicode literals, avoid errors rendering the + backslash in __get_owner_windows. + +- Converted to single-spec + +------------------------------------------------------------------- +Tue Jul 4 09:40:55 UTC 2017 - [email protected] + +- Update to version 10.3.1 (see CHANGES.rst) + +------------------------------------------------------------------- Old: ---- path.py-8.1.1.tar.gz New: ---- path.py-10.3.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-path.py.spec ++++++ --- /var/tmp/diff_new_pack.YYAPLj/_old 2017-07-11 08:25:14.496557124 +0200 +++ /var/tmp/diff_new_pack.YYAPLj/_new 2017-07-11 08:25:14.500556560 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-path.py # -# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -16,28 +16,24 @@ # +%{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-path.py -Version: 8.1.1 +Version: 10.3.1 Release: 0 Summary: A module wrapper for os.path License: MIT Group: Development/Languages/Python -Url: http://github.com/jaraco/path.py -Source: http://pypi.python.org/packages/source/p/path.py/path.py-%{version}.tar.gz -BuildRequires: python-devel -BuildRequires: python-pytest -BuildRequires: python-pytest-runner >= 2.6 -BuildRequires: python-setuptools -BuildRequires: python-setuptools_scm -BuildRequires: python-appdirs -Requires: python-appdirs +Url: https://github.com/jaraco/path.py +Source: https://files.pythonhosted.org/packages/source/p/path.py/path.py-%{version}.tar.gz +BuildRequires: %{python_module base} +BuildRequires: %{python_module pytest-runner >= 2.6} +BuildRequires: %{python_module pytest} +BuildRequires: %{python_module setuptools_scm} +BuildRequires: %{python_module setuptools} +BuildRequires: python-rpm-macros BuildRoot: %{_tmppath}/%{name}-%{version}-build -%if 0%{?suse_version} && 0%{?suse_version} <= 1110 -BuildRequires: python-importlib -%{!?python_sitelib: %global python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} -%else BuildArch: noarch -%endif +%python_subpackages %description The path.py package implements a path objects as first-class @@ -46,19 +42,20 @@ %prep %setup -q -n path.py-%{version} +rm -rf path.py.egg-info %build -python setup.py build +%python_build %install -python setup.py install --prefix=%{_prefix} --root=%{buildroot} +%python_install %check # need to set locale to avoid UnicodeEncodeError export LANG=en_US.UTF-8 -python setup.py test +%python_exec %{_bindir}/py.test build/lib -%files +%files %{python_files} %defattr(-,root,root,-) %doc CHANGES.rst README.rst %{python_sitelib}/* ++++++ path.py-8.1.1.tar.gz -> path.py-10.3.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/.hgtags new/path.py-10.3.1/.hgtags --- old/path.py-8.1.1/.hgtags 2015-09-10 09:59:51.000000000 +0200 +++ new/path.py-10.3.1/.hgtags 1970-01-01 01:00:00.000000000 +0100 @@ -1,35 +0,0 @@ -9401857d62dd5d4784dc06656ab13992847b5e76 2.4 -69851aaf75f1c6ff63c72daf8d1a82692e04b301 2.4.1 -6ba869f2260f54ac6d66ffc08b9ce546846c6c9c 2.5 -5a008a763604cd3237ce83bb402fca41e4456001 2.6 -be871d26bce9185c8a4b2c20314f541508e99c1f 2.6.1 -5b78897bb40297548a7a01b35ce842eaa30d19de 3.0 -a5539b0050d4377bd1bdeb74eed06e0e4a775a99 3.0.1 -137d1b8b6d4ca80382efeda217d9236d1570ab70 3.1 -13f2731fa9d98314aedb2fdd55cce97b381b564f 3.2 -97899c3ef1421a247b0864f5486dd480ad31b41f 4.0 -9652fb4e2b486d2ce32f7ed3806304d1c0d653f7 4.1 -f922c0423dbf87f11643724ce3b7c2bc78303a8d 4.2 -38282c28271f66ed07d3c9b52bfa55e26280833d 4.3 -2ed42cef0b080079ad26de6f082fa6d722813087 4.4 -47206e8c59c858e074f6ea1ba80cefb3a37045fd 5.0 -0382bd2f0348cfd73e4e09cd55799a428e75a131 5.1 -7bf7fe39edc888b2f14faf76a70c75b5b17502e6 5.2 -83dcd6b47278aedcbf52f1a6798bd333c515b818 5.3 -2d5f08983462a86cdd41963fca6626ff87dc3ba1 6.0 -55c924ecc419dbf1038254436be512c5cb18bd15 6.1 -be72beb60a11f64344cd9e4c6029b330d49cd830 6.2 -698ac3acb84034fb17487b5009153c8956c5d596 7.0 -793192a17ea0e78640a6d6b133a2948f6cecf43f 7.1 -abeebd8675eaa4626619cb3083c8e1af48a2f2ce 7.2 -581040c32e0c2154cb7aa455734edf1c41021607 7.3 -b96177b0522706277881ddc3f1fce41077eb9993 7.4 -76fab4bb56d10e83f2af64ce7a7e39d56e88eb70 7.5 -a96c4d592397e79e2fa16b632fcc89b48ed63d04 7.6 -06d6fdfddc0a69a56d4b378816d7e5b59ae4a018 7.6.1 -cf0bb158f8d370f5195b95c917201f51aa53c0a9 7.6.2 -cfc54169af8f0fdc98fff6f06b98d325a81dfaeb 7.7 -baa58fde6e3b8820bbd77d5721760ec3f8f08716 7.7.1 -936d47e8d38319be37b06f0e05b1356eeaf7390e 8.0 -06219e4168be20471a7ceedf617f7464c0e63f6b 8.1 -095ad9f1f5db19d1dfc69f67d66e63b38f50270b 8.1.1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/.travis.yml new/path.py-10.3.1/.travis.yml --- old/path.py-8.1.1/.travis.yml 2015-08-09 21:47:58.000000000 +0200 +++ new/path.py-10.3.1/.travis.yml 2017-04-18 05:00:17.000000000 +0200 @@ -1,13 +1,27 @@ sudo: false language: python - python: - - 2.6 - - 2.7 - - 3.2 - - 3.3 - - 3.4 - - pypy - +- 2.7 +- 3.3 +- 3.4 +- 3.5 +- 3.6 +install: +- pip install tox "setuptools>=28.2" script: - - python setup.py test +- tox +branches: + except: + - skeleton +deploy: + provider: pypi + server: https://upload.pypi.org/legacy/ + on: + tags: true + all_branches: true + python: 3.6 + user: jaraco + distributions: dists + password: + secure: fggUs33qP6DB+j/q7KGScfohgGq7OwsW5BMW6ZZvSlq+9pnNDZxSVrfCw0wb9vdq/Hb9nH4Of+wDoyh+Ul6GN28GRX7qj1HTjbc65nhRp9aA1Ib9Y3KJwGR8k5gPJZmx/zKP0r7COSXsOdXDkVSJ/UjCfuKhcsSHpi0lAYG6BSA= + skip_upload_docs: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/CHANGES.rst new/path.py-10.3.1/CHANGES.rst --- old/path.py-8.1.1/CHANGES.rst 2015-08-27 18:26:36.000000000 +0200 +++ new/path.py-10.3.1/CHANGES.rst 2017-04-18 05:00:17.000000000 +0200 @@ -1,7 +1,89 @@ +10.3.1 +------ + +- #124: Fixed ``rmdir_p`` raising ``FileNotFoundError`` when + directory does not exist on Windows. + +10.3 +---- + +- #115: Added a new performance-optimized implementation + for listdir operations, optimizing ``listdir``, ``walk``, + ``walkfiles``, ``walkdirs``, and ``fnmatch``, presented + as the ``FastPath`` class. + + Please direct feedback on this implementation to the ticket, + especially if the performance benefits justify it replacing + the default ``Path`` class. + +10.2 +---- + +- Symlink no longer requires the ``newlink`` parameter + and will default to the basename of the target in the + current working directory. + +10.1 +---- + +- #123: Implement ``Path.__fspath__`` per PEP 519. + +10.0 +---- + +- Once again as in 8.0 remove deprecated ``path.path``. + +9.1 +--- + +- #121: Removed workaround for #61 added in 5.2. ``path.py`` + now only supports file system paths that can be effectively + decoded to text. It is the responsibility of the system + implementer to ensure that filenames on the system are + decodeable by ``sys.getfilesystemencoding()``. + +9.0 +--- + +- Drop support for Python 2.6 and 3.2 as integration + dependencies (pip) no longer support these versions. + +8.3 +--- + +- Merge with latest skeleton, adding badges and test runs by + default under tox instead of pytest-runner. +- Documentation is no longer hosted with PyPI. + +8.2.1 +----- + +- #112: Update Travis CI usage to only deploy on Python 3.5. + +8.2 +--- + +- Refreshed project metadata based on `jaraco's project + skeleton <https://github.com/jaraco/skeleton/tree/spaces>_. +- Releases are now automatically published via Travis-CI. +- #111: More aggressively trap errors when importing + ``pkg_resources``. + +8.1.2 +----- + +- #105: By using unicode literals, avoid errors rendering the + backslash in __get_owner_windows. + +8.1.1 +----- + +- #102: Reluctantly restored reference to path.path in ``__all__``. + 8.1 --- -Restored ``path.path`` with a DeprecationWarning. +- #102: Restored ``path.path`` with a DeprecationWarning. 8.0 --- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/PKG-INFO new/path.py-10.3.1/PKG-INFO --- old/path.py-8.1.1/PKG-INFO 2015-09-10 10:00:02.000000000 +0200 +++ new/path.py-10.3.1/PKG-INFO 2017-04-18 05:00:48.000000000 +0200 @@ -1,12 +1,30 @@ -Metadata-Version: 1.1 +Metadata-Version: 1.2 Name: path.py -Version: 8.1.1 +Version: 10.3.1 Summary: A module wrapper for os.path -Home-page: http://github.com/jaraco/path.py +Home-page: https://github.com/jaraco/path.py Author: Jason R. Coombs Author-email: [email protected] -License: MIT License -Description: path.py +License: UNKNOWN +Description: .. image:: https://img.shields.io/pypi/v/path.py.svg + :target: https://pypi.org/project/path.py + + .. image:: https://img.shields.io/pypi/pyversions/path.py.svg + + .. image:: https://img.shields.io/pypi/dm/path.py.svg + + .. image:: https://img.shields.io/travis/jaraco/path.py/master.svg + :target: http://travis-ci.org/jaraco/path.py + + + License + ======= + + License is indicated in the project metadata (typically one or more + of the Trove classifiers). For more details, see `this explanation + <https://github.com/jaraco/skeleton/issues/1>`_. + + path.py ======= ``path.py`` implements a path objects as first-class entities, allowing @@ -22,7 +40,7 @@ ``path.py`` is `hosted at Github <https://github.com/jaraco/path.py>`_. - Documentation is `hosted with PyPI <https://pythonhosted.org/path.py/>`_. + Find `the documentatation here <https://pathpy.readthedocs.io>`_. Guides and Testimonials ======================= @@ -65,13 +83,22 @@ To run the tests, refer to the ``.travis.yml`` file for the steps run on the Travis-CI hosts. + Releasing + ========= + + Tagged releases are automatically published to PyPI by Travis-CI, assuming + the Python 3 build passes. + Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable -Classifier: License :: OSI Approved :: MIT License Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=2.7 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/README.rst new/path.py-10.3.1/README.rst --- old/path.py-8.1.1/README.rst 2015-08-09 17:32:32.000000000 +0200 +++ new/path.py-10.3.1/README.rst 2017-04-18 05:00:17.000000000 +0200 @@ -1,3 +1,21 @@ +.. image:: https://img.shields.io/pypi/v/path.py.svg + :target: https://pypi.org/project/path.py + +.. image:: https://img.shields.io/pypi/pyversions/path.py.svg + +.. image:: https://img.shields.io/pypi/dm/path.py.svg + +.. image:: https://img.shields.io/travis/jaraco/path.py/master.svg + :target: http://travis-ci.org/jaraco/path.py + + +License +======= + +License is indicated in the project metadata (typically one or more +of the Trove classifiers). For more details, see `this explanation +<https://github.com/jaraco/skeleton/issues/1>`_. + path.py ======= @@ -14,7 +32,7 @@ ``path.py`` is `hosted at Github <https://github.com/jaraco/path.py>`_. -Documentation is `hosted with PyPI <https://pythonhosted.org/path.py/>`_. +Find `the documentatation here <https://pathpy.readthedocs.io>`_. Guides and Testimonials ======================= @@ -56,3 +74,9 @@ To run the tests, refer to the ``.travis.yml`` file for the steps run on the Travis-CI hosts. + +Releasing +========= + +Tagged releases are automatically published to PyPI by Travis-CI, assuming +the Python 3 build passes. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/appveyor.yml new/path.py-10.3.1/appveyor.yml --- old/path.py-8.1.1/appveyor.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/path.py-10.3.1/appveyor.yml 2017-04-18 05:00:17.000000000 +0200 @@ -0,0 +1,19 @@ +environment: + + APPVEYOR: true + + matrix: + - PYTHON: "C:\\Python35-x64" + - PYTHON: "C:\\Python27-x64" + +install: + # symlink python from a directory with a space + - "mklink /d \"C:\\Program Files\\Python\" %PYTHON%" + - "SET PYTHON=\"C:\\Program Files\\Python\"" + - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%" + +build: off + +test_script: + - "python -m pip install tox" + - "tox" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/docs/api.rst new/path.py-10.3.1/docs/api.rst --- old/path.py-8.1.1/docs/api.rst 2013-10-27 19:03:16.000000000 +0100 +++ new/path.py-10.3.1/docs/api.rst 2017-04-18 05:00:17.000000000 +0200 @@ -2,6 +2,10 @@ API === +.. important:: + The documented methods' signatures are not always correct. + See :class:`path.Path`. + .. automodule:: path :members: :undoc-members: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/docs/conf.py new/path.py-10.3.1/docs/conf.py --- old/path.py-8.1.1/docs/conf.py 2015-08-09 21:47:58.000000000 +0200 +++ new/path.py-10.3.1/docs/conf.py 2017-04-18 05:00:17.000000000 +0200 @@ -1,16 +1,15 @@ -# encoding: utf-8 +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- -project = 'path.py' -copyright = '2013, Mikhail Gusarov, Jason R. Coombs' - -import path -import re - -release = path.__version__ -version = re.match('[^.]+[.][^.]+', release).group(0) +extensions = [ + 'sphinx.ext.autodoc', + 'jaraco.packaging.sphinx', + 'rst.linker', + 'sphinx.ext.intersphinx', +] pygments_style = 'sphinx' -html_theme = 'default' +html_theme = 'alabaster' html_static_path = ['_static'] htmlhelp_basename = 'pathpydoc' templates_path = ['_templates'] @@ -18,24 +17,30 @@ source_suffix = '.rst' master_doc = 'index' -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'rst.linker'] - intersphinx_mapping = {'python': ('http://docs.python.org/', None)} link_files = { - 'CHANGES.rst': dict( - using=dict( - GH='https://github.com', - ), - replace=[ - dict( - pattern=r"(Issue )?#(?P<issue>\d+)", - url='{GH}/jaraco/path.py/issues/{issue}', - ), - dict( - pattern=r"Pull Request ?#(?P<pull_request>\d+)", - url='{GH}/jaraco/path.py/pull/{pull_request}', - ), - ], - ), + '../CHANGES.rst': dict( + using=dict( + GH='https://github.com', + ), + replace=[ + dict( + pattern=r'(Issue )?#(?P<issue>\d+)', + url='{package_url}/issues/{issue}', + ), + dict( + pattern=r"Pull Request ?#(?P<pull_request>\d+)", + url='{package_url}/pull/{pull_request}', + ), + dict( + pattern=r'^(?m)((?P<scm_version>v?\d+(\.\d+){1,2}))\n[-=]+\n', + with_scm='{text}\n{rev[timestamp]:%d %b %Y}\n', + ), + dict( + pattern=r'PEP[- ](?P<pep_number>\d+)', + url='https://www.python.org/dev/peps/pep-{pep_number:0>4}/', + ), + ], + ), } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/docs/index.rst new/path.py-10.3.1/docs/index.rst --- old/path.py-8.1.1/docs/index.rst 2015-08-09 21:47:58.000000000 +0200 +++ new/path.py-10.3.1/docs/index.rst 2017-04-18 05:00:17.000000000 +0200 @@ -1,15 +1,10 @@ -.. path.py documentation master file, created by - sphinx-quickstart on Tue Apr 9 10:25:52 2013. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - Welcome to path.py's documentation! =================================== -Contents: +Contents: .. toctree:: - :maxdepth: 2 + :maxdepth: 1 api history diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/docs/requirements.txt new/path.py-10.3.1/docs/requirements.txt --- old/path.py-8.1.1/docs/requirements.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/path.py-10.3.1/docs/requirements.txt 2017-04-18 05:00:17.000000000 +0200 @@ -0,0 +1,4 @@ +. +sphinx +jaraco.packaging>=3.2 +rst.linker>=1.9 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/path.py new/path.py-10.3.1/path.py --- old/path.py-8.1.1/path.py 2015-09-10 09:57:54.000000000 +0200 +++ new/path.py-10.3.1/path.py 2017-04-18 05:00:17.000000000 +0200 @@ -33,6 +33,8 @@ f.chmod(0o755) """ +from __future__ import unicode_literals + import sys import warnings import os @@ -48,8 +50,9 @@ import re import contextlib import io -from distutils import dir_util +import distutils.dir_util import importlib +import itertools try: import win32security @@ -74,7 +77,6 @@ string_types = str, text_type = str getcwdu = os.getcwd -u = lambda x: x def surrogate_escape(error): """ @@ -91,8 +93,8 @@ string_types = __builtin__.basestring, text_type = __builtin__.unicode getcwdu = os.getcwdu - u = lambda x: codecs.unicode_escape_decode(x)[0] codecs.register_error('surrogateescape', surrogate_escape) + map = itertools.imap @contextlib.contextmanager def io_error_compat(): @@ -110,20 +112,18 @@ __all__ = ['Path', 'CaseInsensitivePattern'] -LINESEPS = [u('\r\n'), u('\r'), u('\n')] -U_LINESEPS = LINESEPS + [u('\u0085'), u('\u2028'), u('\u2029')] +LINESEPS = ['\r\n', '\r', '\n'] +U_LINESEPS = LINESEPS + ['\u0085', '\u2028', '\u2029'] NEWLINE = re.compile('|'.join(LINESEPS)) U_NEWLINE = re.compile('|'.join(U_LINESEPS)) -NL_END = re.compile(u(r'(?:{0})$').format(NEWLINE.pattern)) -U_NL_END = re.compile(u(r'(?:{0})$').format(U_NEWLINE.pattern)) +NL_END = re.compile(r'(?:{0})$'.format(NEWLINE.pattern)) +U_NL_END = re.compile(r'(?:{0})$'.format(U_NEWLINE.pattern)) try: import pkg_resources __version__ = pkg_resources.require('path.py')[0].version -except ImportError: - __version__ = 'unknown' -except pkg_resources.DistributionNotFound: +except Exception: __version__ = 'unknown' @@ -202,6 +202,8 @@ @simple_cache def using_module(cls, module): subclass_name = cls.__name__ + '_' + module.__name__ + if PY2: + subclass_name = str(subclass_name) bases = (cls,) ns = {'module': module} return type(subclass_name, bases, ns) @@ -214,16 +216,6 @@ """ return cls - @classmethod - def _always_unicode(cls, path): - """ - Ensure the path as retrieved from a Python API, such as :func:`os.listdir`, - is a proper Unicode string. - """ - if PY3 or isinstance(path, text_type): - return path - return path.decode(sys.getfilesystemencoding(), 'surrogateescape') - # --- Special Python methods. def __repr__(self): @@ -277,6 +269,9 @@ def __exit__(self, *_): os.chdir(self._old_dir) + def __fspath__(self): + return self + @classmethod def getcwd(cls): """ Return the current working directory as a path object. @@ -533,7 +528,7 @@ pattern = '*' return [ self / child - for child in map(self._always_unicode, os.listdir(self)) + for child in os.listdir(self) if self._next_class(child).fnmatch(pattern) ] @@ -1086,11 +1081,11 @@ return os.lstat(self) def __get_owner_windows(self): - r""" + """ Return the name of the owner of this file or directory. Follow symbolic links. - Return a name of the form ``ur'DOMAIN\User Name'``; may be a group. + Return a name of the form ``r'DOMAIN\\User Name'``; may be a group. .. seealso:: :attr:`owner` """ @@ -1098,7 +1093,7 @@ self, win32security.OWNER_SECURITY_INFORMATION) sid = desc.GetSecurityDescriptorOwner() account, domain, typecode = win32security.LookupAccountSid(None, sid) - return domain + u('\\') + account + return domain + '\\' + account def __get_owner_unix(self): """ @@ -1236,7 +1231,8 @@ self.rmdir() except OSError: _, e, _ = sys.exc_info() - if e.errno != errno.ENOTEMPTY and e.errno != errno.EEXIST: + bypass_codes = errno.ENOTEMPTY, errno.EEXIST, errno.ENOENT + if e.errno not in bypass_codes: raise return self @@ -1306,11 +1302,16 @@ return self._next_class(newpath) if hasattr(os, 'symlink'): - def symlink(self, newlink): + def symlink(self, newlink=None): """ Create a symbolic link at `newlink`, pointing here. + If newlink is not supplied, the symbolic link will assume + the name self.basename(), creating the link in the cwd. + .. seealso:: :func:`os.symlink` """ + if newlink is None: + newlink = self.basename() os.symlink(self, newlink) return self._next_class(newlink) @@ -1390,8 +1391,12 @@ self.copytree(stage, symlinks, *args, **kwargs) # now copy everything from the stage directory using # the semantics of dir_util.copy_tree - dir_util.copy_tree(stage, dst, preserve_symlinks=symlinks, - update=update) + distutils.dir_util.copy_tree( + stage, + dst, + preserve_symlinks=symlinks, + update=update, + ) # # --- Special stuff from os @@ -1558,6 +1563,8 @@ @classmethod def for_class(cls, path_cls): name = 'Multi' + path_cls.__name__ + if PY2: + name = str(name) return type(name, (cls, path_cls), {}) @classmethod @@ -1707,14 +1714,188 @@ def normcase(self): return __import__('ntpath').normcase -######################## -# Backward-compatibility -class path(Path): - def __new__(cls, *args, **kwargs): - msg = "path is deprecated. Use Path instead." - warnings.warn(msg, DeprecationWarning) - return Path.__new__(cls, *args, **kwargs) +class FastPath(Path): + """ + Performance optimized version of Path for use + on embedded platforms and other systems with limited + CPU. See #115 and #116 for background. + """ + + def listdir(self, pattern=None): + children = os.listdir(self) + if pattern is None: + return [self / child for child in children] + + pattern, normcase = self.__prepare(pattern) + return [ + self / child + for child in children + if self._next_class(child).__fnmatch(pattern, normcase) + ] + + def walk(self, pattern=None, errors='strict'): + class Handlers: + def strict(msg): + raise + + def warn(msg): + warnings.warn(msg, TreeWalkWarning) + + def ignore(msg): + pass + + if not callable(errors) and errors not in vars(Handlers): + raise ValueError("invalid errors parameter") + errors = vars(Handlers).get(errors, errors) + + if pattern: + pattern, normcase = self.__prepare(pattern) + else: + normcase = None + + return self.__walk(pattern, normcase, errors) + + def __walk(self, pattern, normcase, errors): + """ Prepared version of walk """ + try: + childList = self.listdir() + except Exception: + exc = sys.exc_info()[1] + tmpl = "Unable to list directory '%(self)s': %(exc)s" + msg = tmpl % locals() + errors(msg) + return + + for child in childList: + if pattern is None or child.__fnmatch(pattern, normcase): + yield child + try: + isdir = child.isdir() + except Exception: + exc = sys.exc_info()[1] + tmpl = "Unable to access '%(child)s': %(exc)s" + msg = tmpl % locals() + errors(msg) + isdir = False + + if isdir: + for item in child.__walk(pattern, normcase, errors): + yield item + + def walkdirs(self, pattern=None, errors='strict'): + if errors not in ('strict', 'warn', 'ignore'): + raise ValueError("invalid errors parameter") + + if pattern: + pattern, normcase = self.__prepare(pattern) + else: + normcase = None + + return self.__walkdirs(pattern, normcase, errors) + + def __walkdirs(self, pattern, normcase, errors): + """ Prepared version of walkdirs """ + try: + dirs = self.dirs() + except Exception: + if errors == 'ignore': + return + elif errors == 'warn': + warnings.warn( + "Unable to list directory '%s': %s" + % (self, sys.exc_info()[1]), + TreeWalkWarning) + return + else: + raise + + for child in dirs: + if pattern is None or child.__fnmatch(pattern, normcase): + yield child + for subsubdir in child.__walkdirs(pattern, normcase, errors): + yield subsubdir + + def walkfiles(self, pattern=None, errors='strict'): + if errors not in ('strict', 'warn', 'ignore'): + raise ValueError("invalid errors parameter") + + if pattern: + pattern, normcase = self.__prepare(pattern) + else: + normcase = None + + return self.__walkfiles(pattern, normcase, errors) + + def __walkfiles(self, pattern, normcase, errors): + """ Prepared version of walkfiles """ + try: + childList = self.listdir() + except Exception: + if errors == 'ignore': + return + elif errors == 'warn': + warnings.warn( + "Unable to list directory '%s': %s" + % (self, sys.exc_info()[1]), + TreeWalkWarning) + return + else: + raise + + for child in childList: + try: + isfile = child.isfile() + isdir = not isfile and child.isdir() + except: + if errors == 'ignore': + continue + elif errors == 'warn': + warnings.warn( + "Unable to access '%s': %s" + % (self, sys.exc_info()[1]), + TreeWalkWarning) + continue + else: + raise + + if isfile: + if pattern is None or child.__fnmatch(pattern, normcase): + yield child + elif isdir: + for f in child.__walkfiles(pattern, normcase, errors): + yield f + + def __fnmatch(self, pattern, normcase): + """ Return ``True`` if `self.name` matches the given `pattern`, + prepared version. + `pattern` - A filename pattern with wildcards, + for example ``'*.py'``. The pattern is expected to be normcase'd + already. + `normcase` - A function used to normalize the pattern and + filename before matching. + .. seealso:: :func:`Path.fnmatch` + """ + return fnmatch.fnmatchcase(normcase(self.name), pattern) + + def __prepare(self, pattern, normcase=None): + """ Prepares a fmatch_pattern for use with ``FastPath.__fnmatch`. + `pattern` - A filename pattern with wildcards, + for example ``'*.py'``. If the pattern contains a `normcase` + attribute, it is applied to the name and path prior to comparison. + `normcase` - (optional) A function used to normalize the pattern and + filename before matching. Defaults to :meth:`self.module`, which defaults + to :meth:`os.path.normcase`. + .. seealso:: :func:`FastPath.__fnmatch` + """ + if not normcase: + normcase = getattr(pattern, 'normcase', self.module.normcase) + pattern = normcase(pattern) + return pattern, normcase + + def fnmatch(self, pattern, normcase=None): + if not pattern: + raise ValueError("No pattern provided") -__all__ += ['path'] -######################## + pattern, normcase = self.__prepare(pattern, normcase) + return self.__fnmatch(pattern, normcase) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/path.py.egg-info/PKG-INFO new/path.py-10.3.1/path.py.egg-info/PKG-INFO --- old/path.py-8.1.1/path.py.egg-info/PKG-INFO 2015-09-10 10:00:02.000000000 +0200 +++ new/path.py-10.3.1/path.py.egg-info/PKG-INFO 2017-04-18 05:00:48.000000000 +0200 @@ -1,12 +1,30 @@ -Metadata-Version: 1.1 +Metadata-Version: 1.2 Name: path.py -Version: 8.1.1 +Version: 10.3.1 Summary: A module wrapper for os.path -Home-page: http://github.com/jaraco/path.py +Home-page: https://github.com/jaraco/path.py Author: Jason R. Coombs Author-email: [email protected] -License: MIT License -Description: path.py +License: UNKNOWN +Description: .. image:: https://img.shields.io/pypi/v/path.py.svg + :target: https://pypi.org/project/path.py + + .. image:: https://img.shields.io/pypi/pyversions/path.py.svg + + .. image:: https://img.shields.io/pypi/dm/path.py.svg + + .. image:: https://img.shields.io/travis/jaraco/path.py/master.svg + :target: http://travis-ci.org/jaraco/path.py + + + License + ======= + + License is indicated in the project metadata (typically one or more + of the Trove classifiers). For more details, see `this explanation + <https://github.com/jaraco/skeleton/issues/1>`_. + + path.py ======= ``path.py`` implements a path objects as first-class entities, allowing @@ -22,7 +40,7 @@ ``path.py`` is `hosted at Github <https://github.com/jaraco/path.py>`_. - Documentation is `hosted with PyPI <https://pythonhosted.org/path.py/>`_. + Find `the documentatation here <https://pathpy.readthedocs.io>`_. Guides and Testimonials ======================= @@ -65,13 +83,22 @@ To run the tests, refer to the ``.travis.yml`` file for the steps run on the Travis-CI hosts. + Releasing + ========= + + Tagged releases are automatically published to PyPI by Travis-CI, assuming + the Python 3 build passes. + Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable -Classifier: License :: OSI Approved :: MIT License Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=2.7 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/path.py.egg-info/SOURCES.txt new/path.py-10.3.1/path.py.egg-info/SOURCES.txt --- old/path.py-8.1.1/path.py.egg-info/SOURCES.txt 2015-09-10 10:00:02.000000000 +0200 +++ new/path.py-10.3.1/path.py.egg-info/SOURCES.txt 2017-04-18 05:00:48.000000000 +0200 @@ -1,9 +1,9 @@ .gitignore -.hgtags .travis.yml CHANGES.rst MANIFEST.in README.rst +appveyor.yml path.py pytest.ini setup.cfg @@ -15,8 +15,9 @@ docs/conf.py docs/history.rst docs/index.rst +docs/requirements.txt path.py.egg-info/PKG-INFO path.py.egg-info/SOURCES.txt path.py.egg-info/dependency_links.txt -path.py.egg-info/requires.txt -path.py.egg-info/top_level.txt \ No newline at end of file +path.py.egg-info/top_level.txt +tests/requirements.txt \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/path.py.egg-info/requires.txt new/path.py-10.3.1/path.py.egg-info/requires.txt --- old/path.py-8.1.1/path.py.egg-info/requires.txt 2015-09-10 10:00:02.000000000 +0200 +++ new/path.py-10.3.1/path.py.egg-info/requires.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1,3 +0,0 @@ - -[:python_version=="2.6"] -importlib diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/pytest.ini new/path.py-10.3.1/pytest.ini --- old/path.py-8.1.1/pytest.ini 2015-04-14 13:36:09.000000000 +0200 +++ new/path.py-10.3.1/pytest.ini 2017-04-18 05:00:17.000000000 +0200 @@ -1,2 +1,4 @@ [pytest] -addopts=--doctest-modules --ignore=build +norecursedirs=dist build .tox +addopts=--doctest-modules +doctest_optionflags=ALLOW_UNICODE ELLIPSIS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/setup.cfg new/path.py-10.3.1/setup.cfg --- old/path.py-8.1.1/setup.cfg 2015-09-10 10:00:02.000000000 +0200 +++ new/path.py-10.3.1/setup.cfg 2017-04-18 05:00:48.000000000 +0200 @@ -1,6 +1,6 @@ [aliases] -test = pytest -release = sdist bdist_wheel upload upload_docs +release = dists upload +dists = clean --all sdist bdist_wheel [wheel] universal = 1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/setup.py new/path.py-10.3.1/setup.py --- old/path.py-8.1.1/setup.py 2015-08-23 15:04:35.000000000 +0200 +++ new/path.py-10.3.1/setup.py 2017-04-18 05:00:17.000000000 +0200 @@ -1,49 +1,51 @@ #!/usr/bin/env python -import sys +# Project skeleton maintained at https://github.com/jaraco/skeleton + +import io import setuptools -with open('README.rst') as ld_file: - long_description = ld_file.read() +with io.open('README.rst', encoding='utf-8') as readme: + long_description = readme.read() -needs_sphinx = set(['build_sphinx', 'upload_docs', 'release']).intersection(sys.argv) -sphinx_req = ['sphinx', 'rst.linker'] if needs_sphinx else [] -needs_pytest = set(['pytest', 'test']).intersection(sys.argv) -pytest_runner = ['pytest-runner>=2.6'] if needs_pytest else [] +name = 'path.py' +description = 'A module wrapper for os.path' -setup_params = dict( - name="path.py", +params = dict( + name=name, use_scm_version=True, - description="A module wrapper for os.path", - long_description=long_description, author="Jason Orendorff", author_email="[email protected]", maintainer="Jason R. Coombs", maintainer_email="[email protected]", - url="http://github.com/jaraco/path.py", - license="MIT License", + description=description or name, + long_description=long_description, + url="https://github.com/jaraco/" + name, py_modules=['path', 'test_path'], - classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'License :: OSI Approved :: MIT License', - 'Intended Audience :: Developers', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Programming Language :: Python :: 2.6', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Topic :: Software Development :: Libraries :: Python Modules' + python_requires='>=2.7', + install_requires=[ ], - setup_requires=[ - 'setuptools_scm', - ] + sphinx_req + pytest_runner, - tests_require=['pytest', 'appdirs'], extras_require={ - ':python_version=="2.6"': ['importlib'], + }, + setup_requires=[ + 'setuptools_scm>=1.15.0', + ], + classifiers=[ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.3", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Topic :: Software Development :: Libraries :: Python Modules", + ], + entry_points={ }, ) - - if __name__ == '__main__': - setuptools.setup(**setup_params) + setuptools.setup(**params) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/test_path.py new/path.py-10.3.1/test_path.py --- old/path.py-8.1.1/test_path.py 2015-08-23 15:04:35.000000000 +0200 +++ new/path.py-10.3.1/test_path.py 2017-04-18 05:00:17.000000000 +0200 @@ -30,17 +30,28 @@ import pytest -from path import Path, tempdir +import path +from path import tempdir from path import CaseInsensitivePattern as ci from path import SpecialResolver from path import Multi +Path = None + def p(**choices): """ Choose a value from several possible values, based on os.name """ return choices[os.name] [email protected](autouse=True, params=[path.Path, path.FastPath]) +def path_class(request, monkeypatch): + """ + Invoke tests on any number of Path classes. + """ + monkeypatch.setitem(globals(), 'Path', request.param) + + class TestBasics: def test_relpath(self): root = Path(p(nt='C:\\', posix='/')) @@ -351,6 +362,8 @@ except: pass + @pytest.mark.xfail(platform.system() == 'Linux' and path.PY2, + reason="Can't decode bytes in FS. See #121") def test_listdir_other_encoding(self, tmpdir): """ Some filesystems allow non-character sequences in path names. @@ -680,6 +693,26 @@ self.fail("Calling `rmtree_p` on non-existent directory " "should not raise an exception.") + def test_rmdir_p_exists(self, tmpdir): + """ + Invocation of rmdir_p on an existant directory should + remove the directory. + """ + d = Path(tmpdir) + sub = d / 'subfolder' + sub.mkdir() + sub.rmdir_p() + assert not sub.exists() + + def test_rmdir_p_nonexistent(self, tmpdir): + """ + A non-existent file should not raise an exception. + """ + d = Path(tmpdir) + sub = d / 'subfolder' + assert not sub.exists() + sub.rmdir_p() + class TestMergeTree: @pytest.fixture(autouse=True) @@ -701,6 +734,11 @@ else: self.test_file.copy(self.test_link) + def check_link(self): + target = Path(self.subdir_b / self.test_link.name) + check = target.islink if hasattr(os, 'symlink') else target.isfile + assert check() + def test_with_nonexisting_dst_kwargs(self): self.subdir_a.merge_tree(self.subdir_b, symlinks=True) assert self.subdir_b.isdir() @@ -709,7 +747,7 @@ self.subdir_b / self.test_link.name, )) assert set(self.subdir_b.listdir()) == expected - assert Path(self.subdir_b / self.test_link.name).islink() + self.check_link() def test_with_nonexisting_dst_args(self): self.subdir_a.merge_tree(self.subdir_b, True) @@ -719,7 +757,7 @@ self.subdir_b / self.test_link.name, )) assert set(self.subdir_b.listdir()) == expected - assert Path(self.subdir_b / self.test_link.name).islink() + self.check_link() def test_with_existing_dst(self): self.subdir_b.rmtree() @@ -740,7 +778,7 @@ self.subdir_b / test_new.name, )) assert set(self.subdir_b.listdir()) == expected - assert Path(self.subdir_b / self.test_link.name).islink() + self.check_link() assert len(Path(self.subdir_b / self.test_file.name).bytes()) == 5000 def test_copytree_parameters(self): @@ -781,17 +819,17 @@ class TestSubclass: - class PathSubclass(Path): - pass def test_subclass_produces_same_class(self): """ When operations are invoked on a subclass, they should produce another instance of that subclass. """ - p = self.PathSubclass('/foo') + class PathSubclass(Path): + pass + p = PathSubclass('/foo') subdir = p / 'bar' - assert isinstance(subdir, self.PathSubclass) + assert isinstance(subdir, PathSubclass) class TestTempDir: @@ -801,7 +839,7 @@ One should be able to readily construct a temporary directory """ d = tempdir() - assert isinstance(d, Path) + assert isinstance(d, path.Path) assert d.exists() assert d.isdir() d.rmdir() @@ -814,7 +852,7 @@ """ d = tempdir() sub = d / 'subdir' - assert isinstance(sub, Path) + assert isinstance(sub, path.Path) d.rmdir() def test_context_manager(self): @@ -1023,8 +1061,9 @@ def test_unix_paths_fallback(self, tmpdir, monkeypatch, feign_linux): "Without XDG_CONFIG_HOME set, ~/.config should be used." fake_home = tmpdir / '_home' + monkeypatch.delitem(os.environ, 'XDG_CONFIG_HOME', raising=False) monkeypatch.setitem(os.environ, 'HOME', str(fake_home)) - expected = str(tmpdir / '_home' / '.config') + expected = Path('~/.config').expanduser() assert SpecialResolver(Path).user.config == expected def test_property(self): @@ -1075,7 +1114,8 @@ cls = Multi.for_class(Path) assert issubclass(cls, Path) assert issubclass(cls, Multi) - assert cls.__name__ == 'MultiPath' + expected_name = 'Multi' + Path.__name__ + assert cls.__name__ == expected_name def test_detect_no_pathsep(self): """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/tests/requirements.txt new/path.py-10.3.1/tests/requirements.txt --- old/path.py-8.1.1/tests/requirements.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/path.py-10.3.1/tests/requirements.txt 2017-04-18 05:00:17.000000000 +0200 @@ -0,0 +1,3 @@ +pytest >= 2.8 +pytest-sugar +appdirs diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/path.py-8.1.1/tox.ini new/path.py-10.3.1/tox.ini --- old/path.py-8.1.1/tox.ini 2015-03-13 01:42:37.000000000 +0100 +++ new/path.py-10.3.1/tox.ini 2017-04-18 05:00:17.000000000 +0200 @@ -1,11 +1,6 @@ -# Tox (http://tox.testrun.org/) is a tool for running tests -# in multiple virtualenvs. This configuration file will run the -# test suite on all supported python versions. To use it, "pip install tox" -# and then run "tox" from this directory. - -[tox] -envlist = py26, py27, pypy, py32, py33, py34 - [testenv] +deps = + -rtests/requirements.txt + commands = py.test {posargs} -deps = pytest +usedevelop = True
