Source code

Revision control

Copy as Markdown

Other Tools

Metadata-Version: 2.1
Name: pathspec
Version: 0.9.0
Summary: Utility library for gitignore style pattern matching of file paths.
Author: Caleb P. Burns
Author-email: cpburnz@gmail.com
License: MPL 2.0
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Utilities
Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7
Description-Content-Type: text/x-rst
*pathspec*: Path Specification
==============================
*pathspec* is a utility library for pattern matching of file paths. So
far this only includes Git's wildmatch pattern matching which itself is
derived from Rsync's wildmatch. Git uses wildmatch for its `gitignore`_
files.
Tutorial
--------
Say you have a "Projects" directory and you want to back it up, but only
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 = """
...
... # This is a comment because the line begins with a hash: "#"
...
... # Include several project directories (and all descendants) relative to
... # the current directory. To reference a directory you must end with a
... # slash: "/"
... /project-a/
... /project-b/
... /project-c/
...
... # Patterns can be negated by prefixing with exclamation mark: "!"
...
... # Ignore temporary files beginning or ending with "~" and ending with
... # ".swp".
... !~*
... !*~
... !*.swp
...
... # These are python projects so ignore compiled python files from
... # testing.
... !*.pyc
...
... # Ignore the build directories but only directly under the project
... # directories.
... !/*/build/
...
... """
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())
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.
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())
If we wanted to manually compile the patterns we can just do the following::
>>> patterns = map(pathspec.patterns.GitWildMatchPattern, spec.splitlines())
>>> spec = PathSpec(patterns)
``PathSpec.from_lines()`` is simply a class method which does just that.
If you want to load the patterns from file, you can pass the file instance
directly as well::
>>> with open('patterns.list', 'r') as fh:
>>> spec = pathspec.PathSpec.from_lines('gitwildmatch', fh)
You can perform matching on a whole directory tree with::
>>> matches = spec.match_tree('path/to/directory')
Or you can perform matching on a specific set of file paths with::
>>> matches = spec.match_files(file_paths)
Or check to see if an individual file matches::
>>> is_matched = spec.match_file(file_path)
License
-------
*pathspec* is licensed under the `Mozilla Public License Version 2.0`_. See
`LICENSE`_ or the `FAQ`_ for more information.
In summary, you may use *pathspec* with any closed or open source project
without affecting the license of the larger work so long as you:
- give credit where credit is due,
- and release any custom changes made to *pathspec*.
.. _`Mozilla Public License Version 2.0`: http://www.mozilla.org/MPL/2.0
.. _`LICENSE`: LICENSE
Source
------
The source code for *pathspec* is available from the GitHub repo
`cpburnz/python-path-specification`_.
.. _`cpburnz/python-path-specification`: https://github.com/cpburnz/python-path-specification
Installation
------------
*pathspec* requires the following packages:
- `setuptools`_
*pathspec* can be installed from source with::
python setup.py install
*pathspec* is also available for install through `PyPI`_::
pip install pathspec
Documentation
-------------
Documentation for *pathspec* is available on `Read the Docs`_.
Other Languages
---------------
*pathspec* is also available as a `Ruby gem`_.
Change History
==============
0.9.0 (2021-07-17)
------------------
- `Issue #44`_/`Issue #50`_: Raise `GitWildMatchPatternError` for invalid git patterns.
- `Issue #45`_: Fix for duplicate leading double-asterisk, and edge cases.
- `Issue #46`_: Fix matching absolute paths.
- API change: `util.normalize_files()` now returns a `Dict[str, List[pathlike]]` instead of a `Dict[str, pathlike]`.
- Added type hinting.
0.8.1 (2020-11-07)
------------------
- `Issue #43`_: Add support for addition operator.
0.8.0 (2020-04-09)
------------------
- `Issue #30`_: Expose what patterns matched paths. Added `util.detailed_match_files()`.
- `Issue #31`_: `match_tree()` doesn't return symlinks.
- `Issue #34`_: Support `pathlib.Path`\ s.
- Add `PathSpec.match_tree_entries` and `util.iter_tree_entries()` to support directories and symlinks.
- 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.
0.7.0 (2019-12-27)
------------------
- `Issue #28`_: Add support for Python 3.8, and drop Python 3.4.
- `Issue #29`_: Publish bdist wheel.
0.6.0 (2019-10-03)
------------------
- `Issue #24`_: Drop support for Python 2.6, 3.2, and 3.3.
- `Issue #25`_: Update README.rst.
- `Issue #26`_: Method to escape gitwildmatch.
0.5.9 (2018-09-15)
------------------
- Fixed file system error handling.
0.5.8 (2018-09-15)
------------------
- Improved type checking.
- Created scripts to test Python 2.6 because Tox removed support for it.
- Improved byte string handling in Python 3.
- `Issue #22`_: Handle dangling symlinks.
0.5.7 (2018-08-14)
------------------
- `Issue #21`_: Fix collections deprecation warning.
0.5.6 (2018-04-06)
------------------
- Improved unit tests.
- Improved type checking.
- `Issue #20`_: Support current directory prefix.
0.5.5 (2017-09-09)
------------------
- Add documentation link to README.
0.5.4 (2017-09-09)
------------------
- `Issue #17`_: Add link to Ruby implementation of *pathspec*.
- Add sphinx documentation.
0.5.3 (2017-07-01)
------------------
- `Issue #14`_: Fix byte strings for Python 3.
- `Issue #15`_: Include "LICENSE" in source package.
- `Issue #16`_: Support Python 2.6.
0.5.2 (2017-04-04)
------------------
- Fixed change log.
0.5.1 (2017-04-04)
------------------
- `Issue #13`_: Add equality methods to `PathSpec` and `RegexPattern`.
0.5.0 (2016-08-22)
------------------
- `Issue #12`_: Add `PathSpec.match_file()`.
- Renamed `gitignore.GitIgnorePattern` to `patterns.gitwildmatch.GitWildMatchPattern`.
- Deprecated `gitignore.GitIgnorePattern`.
0.4.0 (2016-07-15)
------------------
- `Issue #11`_: Support converting patterns into regular expressions without compiling them.
- API change: Subclasses of `RegexPattern` should implement `pattern_to_regex()`.
0.3.4 (2015-08-24)
------------------
- `Issue #7`_: Fixed non-recursive links.
- `Issue #8`_: Fixed edge cases in gitignore patterns.
- `Issue #9`_: Fixed minor usage documentation.
- Fixed recursion detection.
- Fixed trivial incompatibility with Python 3.2.
0.3.3 (2014-11-21)
------------------
- Improved documentation.
0.3.2 (2014-11-08)
------------------
- `Issue #5`_: Use tox for testing.
- `Issue #6`_: Fixed matching Windows paths.
- Improved documentation.
- API change: `spec.match_tree()` and `spec.match_files()` now return iterators instead of sets.
0.3.1 (2014-09-17)
------------------
- Updated README.
0.3.0 (2014-09-17)
------------------
- `Issue #3`_: Fixed trailing slash in gitignore patterns.
- `Issue #4`_: Fixed test for trailing slash in gitignore patterns.
- Added registered patterns.
0.2.2 (2013-12-17)
------------------
- Fixed setup.py.
0.2.1 (2013-12-17)
------------------
- Added tests.
- Fixed comment gitignore patterns.
- Fixed relative path gitignore patterns.
0.2.0 (2013-12-07)
------------------
- Initial release.