diff --git a/CHANGES.rst b/CHANGES.rst index c95deb1..121add7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,8 +3,8 @@ Change History ============== -0.10.0 (TBD) ------------- +0.10.0 (2022-08-30) +------------------- Major changes: diff --git a/README-dist.rst b/README-dist.rst index b2b83ab..4514466 100644 --- a/README-dist.rst +++ b/README-dist.rst @@ -1,6 +1,6 @@ -*pathspec*: Path Specification -============================== +PathSpec +======== *pathspec* is a utility library for pattern matching of file paths. So far this only includes Git's wildmatch pattern matching which itself is @@ -19,7 +19,7 @@ certain files, and ignore others depending on certain conditions:: >>> import pathspec >>> # The gitignore-style patterns for files to select, but we're including >>> # instead of ignoring. - >>> spec = """ + >>> spec_text = """ ... ... # This is a comment because the line begins with a hash: "#" ... @@ -51,23 +51,23 @@ certain files, and ignore others depending on certain conditions:: We want to use the ``GitWildMatchPattern`` class to compile our patterns. The ``PathSpec`` class provides an interface around pattern implementations:: - >>> spec = pathspec.PathSpec.from_lines(pathspec.patterns.GitWildMatchPattern, spec.splitlines()) + >>> spec = pathspec.PathSpec.from_lines(pathspec.patterns.GitWildMatchPattern, spec_text.splitlines()) That may be a mouthful but it allows for additional patterns to be implemented in the future without them having to deal with anything but matching the paths sent to them. ``GitWildMatchPattern`` is the implementation of the actual -pattern which internally gets converted into a regular expression. -``PathSpec`` is a simple wrapper around a list of compiled patterns. +pattern which internally gets converted into a regular expression. ``PathSpec`` +is a simple wrapper around a list of compiled patterns. To make things simpler, we can use the registered name for a pattern class instead of always having to provide a reference to the class itself. The ``GitWildMatchPattern`` class is registered as **gitwildmatch**:: - >>> spec = pathspec.PathSpec.from_lines('gitwildmatch', spec.splitlines()) + >>> spec = pathspec.PathSpec.from_lines('gitwildmatch', spec_text.splitlines()) If we wanted to manually compile the patterns we can just do the following:: - >>> patterns = map(pathspec.patterns.GitWildMatchPattern, spec.splitlines()) + >>> patterns = map(pathspec.patterns.GitWildMatchPattern, spec_text.splitlines()) >>> spec = PathSpec(patterns) ``PathSpec.from_lines()`` is simply a class method which does just that. @@ -90,6 +90,14 @@ Or check to see if an individual file matches:: >>> is_matched = spec.match_file(file_path) +There is a specialized class, ``pathspec.GitIgnoreSpec``, which more closely +implements the behavior of **gitignore**. This uses ``GitWildMatchPattern`` +pattern by default and handles some edge cases differently from the generic +``PathSpec`` class. ``GitIgnoreSpec`` can be used without specifying the pattern +factory:: + + >>> spec = pathspec.GitIgnoreSpec.from_lines(spec_text.splitlines()) + License ------- @@ -113,28 +121,32 @@ Source ------ The source code for *pathspec* is available from the GitHub repo -`cpburnz/python-path-specification`_. +`cpburnz/python-pathspec`_. -.. _`cpburnz/python-path-specification`: https://github.com/cpburnz/python-path-specification +.. _`cpburnz/python-pathspec`: https://github.com/cpburnz/python-pathspec Installation ------------ -*pathspec* requires the following packages: +*pathspec* is available for install through `PyPI`_:: -- `setuptools`_ + pip install pathspec -*pathspec* can be installed from source with:: +*pathspec* can also be built from source. The following packages will be +required: - python setup.py install +- `build`_ (>=0.6.0) +- `setuptools`_ (>=40.8.0) -*pathspec* is also available for install through `PyPI`_:: +*pathspec* can then be built and installed with:: - pip install pathspec + python -m build + pip install dist/pathspec-*-py3-none-any.whl -.. _`setuptools`: https://pypi.python.org/pypi/setuptools .. _`PyPI`: http://pypi.python.org/pypi/pathspec +.. _`build`: https://pypi.org/project/build/ +.. _`setuptools`: https://pypi.org/project/setuptools/ Documentation @@ -142,15 +154,17 @@ Documentation Documentation for *pathspec* is available on `Read the Docs`_. -.. _`Read the Docs`: http://python-path-specification.readthedocs.io +.. _`Read the Docs`: https://python-path-specification.readthedocs.io Other Languages --------------- -*pathspec* is also available as a `Ruby gem`_. +The related project `pathspec-ruby`_ (by *highb*) provides a similar library as +a `Ruby gem`_. -.. _`Ruby gem`: https://github.com/highb/pathspec-ruby +.. _`pathspec-ruby`: https://github.com/highb/pathspec-ruby +.. _`Ruby gem`: https://rubygems.org/gems/pathspec @@ -158,6 +172,66 @@ Change History ============== +0.10.0 (2022-08-30) +------------------- + +Major changes: + +- Dropped support of EOL Python 2.7, 3.5, 3.6. See `Issue #47`_. +- The *gitwildmatch* pattern `dir/*` is now handled the same as `dir/`. This means `dir/*` will now match all descendants rather than only direct children. See `Issue #19`_. +- Added `pathspec.GitIgnoreSpec` class (see new features). +- Changed build system to `pyproject.toml`_ and build backend to `setuptools.build_meta`_ which may have unforeseen consequences. +- Renamed GitHub project from `python-path-specification`_ to `python-pathspec`_. See `Issue #35`_. + +API changes: + +- Deprecated: `pathspec.util.match_files()` is an old function no longer used. +- Deprecated: `pathspec.match_files()` is an old function no longer used. +- Deprecated: `pathspec.util.normalize_files()` is no longer used. +- Deprecated: `pathspec.util.iter_tree()` is an alias for `pathspec.util.iter_tree_files()`. +- Deprecated: `pathspec.iter_tree()` is an alias for `pathspec.util.iter_tree_files()`. +- Deprecated: `pathspec.pattern.Pattern.match()` is no longer used. Use or implement + `pathspec.pattern.Pattern.match_file()`. + +New features: + +- Added class `pathspec.gitignore.GitIgnoreSpec` (with alias `pathspec.GitIgnoreSpec`) to implement *gitignore* behavior not possible with standard `PathSpec` class. The particular *gitignore* behavior implemented is prioritizing patterns matching the file directly over matching an ancestor directory. + +Bug fixes: + +- `Issue #19`_: Files inside an ignored sub-directory are not matched. +- `Issue #41`_: Incorrectly (?) matches files inside directories that do match. +- `Issue #51`_: Refactor deprecated unittest aliases for Python 3.11 compatibility. +- `Issue #53`_: Symlink pathspec_meta.py breaks Windows. +- `Issue #54`_: test_util.py uses os.symlink which can fail on Windows. +- `Issue #55`_: Backslashes at start of pattern not handled correctly. +- `Issue #56`_: pyproject.toml: include subpackages in setuptools config +- `Issue #57`_: `!` doesn't exclude files in directories if the pattern doesn't have a trailing slash. + +Improvements: + +- Support Python 3.10, 3.11. +- Modernize code to Python 3.7. +- `Issue #52`_: match_files() is not a pure generator function, and it impacts tree_*() gravely. + + +.. _`python-path-specification`: https://github.com/cpburnz/python-path-specification +.. _`python-pathspec`: https://github.com/cpburnz/python-pathspec +.. _`pyproject.toml`: https://pip.pypa.io/en/stable/reference/build-system/pyproject-toml/ +.. _`setuptools.build_meta`: https://setuptools.pypa.io/en/latest/build_meta.html +.. _`Issue #19`: https://github.com/cpburnz/python-pathspec/issues/19 +.. _`Issue #35`: https://github.com/cpburnz/python-pathspec/issues/35 +.. _`Issue #41`: https://github.com/cpburnz/python-pathspec/issues/41 +.. _`Issue #47`: https://github.com/cpburnz/python-pathspec/issues/47 +.. _`Issue #51`: https://github.com/cpburnz/python-pathspec/pull/51 +.. _`Issue #52`: https://github.com/cpburnz/python-pathspec/issues/52 +.. _`Issue #53`: https://github.com/cpburnz/python-pathspec/issues/53 +.. _`Issue #54`: https://github.com/cpburnz/python-pathspec/issues/54 +.. _`Issue #55`: https://github.com/cpburnz/python-pathspec/issues/55 +.. _`Issue #56`: https://github.com/cpburnz/python-pathspec/pull/56 +.. _`Issue #57`: https://github.com/cpburnz/python-pathspec/issues/57 + + 0.9.0 (2021-07-17) ------------------ @@ -167,10 +241,10 @@ Change History - API change: `util.normalize_files()` now returns a `Dict[str, List[pathlike]]` instead of a `Dict[str, pathlike]`. - Added type hinting. -.. _`Issue #44`: https://github.com/cpburnz/python-path-specification/issues/44 -.. _`Issue #45`: https://github.com/cpburnz/python-path-specification/pull/45 -.. _`Issue #46`: https://github.com/cpburnz/python-path-specification/issues/46 -.. _`Issue #50`: https://github.com/cpburnz/python-path-specification/pull/50 +.. _`Issue #44`: https://github.com/cpburnz/python-pathspec/issues/44 +.. _`Issue #45`: https://github.com/cpburnz/python-pathspec/pull/45 +.. _`Issue #46`: https://github.com/cpburnz/python-pathspec/issues/46 +.. _`Issue #50`: https://github.com/cpburnz/python-pathspec/pull/50 0.8.1 (2020-11-07) @@ -178,7 +252,7 @@ Change History - `Issue #43`_: Add support for addition operator. -.. _`Issue #43`: https://github.com/cpburnz/python-path-specification/pull/43 +.. _`Issue #43`: https://github.com/cpburnz/python-pathspec/pull/43 0.8.0 (2020-04-09) @@ -191,9 +265,9 @@ Change History - API change: `match_tree()` has been renamed to `match_tree_files()`. The old name `match_tree()` is still available as an alias. - API change: `match_tree_files()` now returns symlinks. This is a bug fix but it will change the returned results. -.. _`Issue #30`: https://github.com/cpburnz/python-path-specification/issues/30 -.. _`Issue #31`: https://github.com/cpburnz/python-path-specification/issues/31 -.. _`Issue #34`: https://github.com/cpburnz/python-path-specification/issues/34 +.. _`Issue #30`: https://github.com/cpburnz/python-pathspec/issues/30 +.. _`Issue #31`: https://github.com/cpburnz/python-pathspec/issues/31 +.. _`Issue #34`: https://github.com/cpburnz/python-pathspec/issues/34 0.7.0 (2019-12-27) @@ -202,8 +276,8 @@ Change History - `Issue #28`_: Add support for Python 3.8, and drop Python 3.4. - `Issue #29`_: Publish bdist wheel. -.. _`Issue #28`: https://github.com/cpburnz/python-path-specification/pull/28 -.. _`Issue #29`: https://github.com/cpburnz/python-path-specification/pull/29 +.. _`Issue #28`: https://github.com/cpburnz/python-pathspec/pull/28 +.. _`Issue #29`: https://github.com/cpburnz/python-pathspec/pull/29 0.6.0 (2019-10-03) @@ -213,9 +287,9 @@ Change History - `Issue #25`_: Update README.rst. - `Issue #26`_: Method to escape gitwildmatch. -.. _`Issue #24`: https://github.com/cpburnz/python-path-specification/pull/24 -.. _`Issue #25`: https://github.com/cpburnz/python-path-specification/pull/25 -.. _`Issue #26`: https://github.com/cpburnz/python-path-specification/pull/26 +.. _`Issue #24`: https://github.com/cpburnz/python-pathspec/pull/24 +.. _`Issue #25`: https://github.com/cpburnz/python-pathspec/pull/25 +.. _`Issue #26`: https://github.com/cpburnz/python-pathspec/pull/26 0.5.9 (2018-09-15) @@ -232,7 +306,7 @@ Change History - Improved byte string handling in Python 3. - `Issue #22`_: Handle dangling symlinks. -.. _`Issue #22`: https://github.com/cpburnz/python-path-specification/issues/22 +.. _`Issue #22`: https://github.com/cpburnz/python-pathspec/issues/22 0.5.7 (2018-08-14) @@ -240,7 +314,7 @@ Change History - `Issue #21`_: Fix collections deprecation warning. -.. _`Issue #21`: https://github.com/cpburnz/python-path-specification/issues/21 +.. _`Issue #21`: https://github.com/cpburnz/python-pathspec/issues/21 0.5.6 (2018-04-06) @@ -250,7 +324,7 @@ Change History - Improved type checking. - `Issue #20`_: Support current directory prefix. -.. _`Issue #20`: https://github.com/cpburnz/python-path-specification/issues/20 +.. _`Issue #20`: https://github.com/cpburnz/python-pathspec/issues/20 0.5.5 (2017-09-09) @@ -265,7 +339,7 @@ Change History - `Issue #17`_: Add link to Ruby implementation of *pathspec*. - Add sphinx documentation. -.. _`Issue #17`: https://github.com/cpburnz/python-path-specification/pull/17 +.. _`Issue #17`: https://github.com/cpburnz/python-pathspec/pull/17 0.5.3 (2017-07-01) @@ -275,9 +349,9 @@ Change History - `Issue #15`_: Include "LICENSE" in source package. - `Issue #16`_: Support Python 2.6. -.. _`Issue #14`: https://github.com/cpburnz/python-path-specification/issues/14 -.. _`Issue #15`: https://github.com/cpburnz/python-path-specification/pull/15 -.. _`Issue #16`: https://github.com/cpburnz/python-path-specification/issues/16 +.. _`Issue #14`: https://github.com/cpburnz/python-pathspec/issues/14 +.. _`Issue #15`: https://github.com/cpburnz/python-pathspec/pull/15 +.. _`Issue #16`: https://github.com/cpburnz/python-pathspec/issues/16 0.5.2 (2017-04-04) @@ -291,7 +365,7 @@ Change History - `Issue #13`_: Add equality methods to `PathSpec` and `RegexPattern`. -.. _`Issue #13`: https://github.com/cpburnz/python-path-specification/pull/13 +.. _`Issue #13`: https://github.com/cpburnz/python-pathspec/pull/13 0.5.0 (2016-08-22) @@ -301,7 +375,7 @@ Change History - Renamed `gitignore.GitIgnorePattern` to `patterns.gitwildmatch.GitWildMatchPattern`. - Deprecated `gitignore.GitIgnorePattern`. -.. _`Issue #12`: https://github.com/cpburnz/python-path-specification/issues/12 +.. _`Issue #12`: https://github.com/cpburnz/python-pathspec/issues/12 0.4.0 (2016-07-15) @@ -310,7 +384,7 @@ Change History - `Issue #11`_: Support converting patterns into regular expressions without compiling them. - API change: Subclasses of `RegexPattern` should implement `pattern_to_regex()`. -.. _`Issue #11`: https://github.com/cpburnz/python-path-specification/issues/11 +.. _`Issue #11`: https://github.com/cpburnz/python-pathspec/issues/11 0.3.4 (2015-08-24) @@ -322,9 +396,9 @@ Change History - Fixed recursion detection. - Fixed trivial incompatibility with Python 3.2. -.. _`Issue #7`: https://github.com/cpburnz/python-path-specification/pull/7 -.. _`Issue #8`: https://github.com/cpburnz/python-path-specification/pull/8 -.. _`Issue #9`: https://github.com/cpburnz/python-path-specification/pull/9 +.. _`Issue #7`: https://github.com/cpburnz/python-pathspec/pull/7 +.. _`Issue #8`: https://github.com/cpburnz/python-pathspec/pull/8 +.. _`Issue #9`: https://github.com/cpburnz/python-pathspec/pull/9 0.3.3 (2014-11-21) @@ -341,8 +415,8 @@ Change History - Improved documentation. - API change: `spec.match_tree()` and `spec.match_files()` now return iterators instead of sets. -.. _`Issue #5`: https://github.com/cpburnz/python-path-specification/pull/5 -.. _`Issue #6`: https://github.com/cpburnz/python-path-specification/issues/6 +.. _`Issue #5`: https://github.com/cpburnz/python-pathspec/pull/5 +.. _`Issue #6`: https://github.com/cpburnz/python-pathspec/issues/6 0.3.1 (2014-09-17) @@ -358,8 +432,8 @@ Change History - `Issue #4`_: Fixed test for trailing slash in gitignore patterns. - Added registered patterns. -.. _`Issue #3`: https://github.com/cpburnz/python-path-specification/pull/3 -.. _`Issue #4`: https://github.com/cpburnz/python-path-specification/pull/4 +.. _`Issue #3`: https://github.com/cpburnz/python-pathspec/pull/3 +.. _`Issue #4`: https://github.com/cpburnz/python-pathspec/pull/4 0.2.2 (2013-12-17) diff --git a/pathspec/_meta.py b/pathspec/_meta.py index 66040ed..71de4e5 100644 --- a/pathspec/_meta.py +++ b/pathspec/_meta.py @@ -46,4 +46,4 @@ "jack1142 ", ] __license__ = "MPL 2.0" -__version__ = "0.10.0.dev1" +__version__ = "0.10.0"