105 lines
2.4 KiB
Python
105 lines
2.4 KiB
Python
"""
|
|
This module provides aggregated private data and utilities functions about the
|
|
available backends.
|
|
|
|
WARNING: The *pathspec._backends* package is not part of the public API. Its
|
|
contents and structure are likely to change.
|
|
"""
|
|
|
|
from collections.abc import (
|
|
Sequence)
|
|
from typing import (
|
|
cast)
|
|
|
|
from pathspec.backend import (
|
|
BackendNamesHint,
|
|
_Backend)
|
|
from pathspec.pattern import (
|
|
Pattern,
|
|
RegexPattern)
|
|
|
|
from .hyperscan.base import (
|
|
hyperscan_error)
|
|
from .hyperscan.gitignore import (
|
|
HyperscanGiBackend)
|
|
from .hyperscan.pathspec import (
|
|
HyperscanPsBackend)
|
|
from .re2.base import (
|
|
re2_error)
|
|
from .re2.gitignore import (
|
|
Re2GiBackend)
|
|
from .re2.pathspec import (
|
|
Re2PsBackend)
|
|
from .simple.gitignore import (
|
|
SimpleGiBackend)
|
|
from .simple.pathspec import (
|
|
SimplePsBackend)
|
|
|
|
_BEST_BACKEND: BackendNamesHint
|
|
"""
|
|
The best available backend.
|
|
"""
|
|
|
|
if re2_error is None:
|
|
_BEST_BACKEND = 're2'
|
|
elif hyperscan_error is None:
|
|
_BEST_BACKEND = 'hyperscan'
|
|
else:
|
|
_BEST_BACKEND = 'simple'
|
|
|
|
|
|
def make_gitignore_backend(
|
|
name: BackendNamesHint,
|
|
patterns: Sequence[Pattern],
|
|
) -> _Backend:
|
|
"""
|
|
Create the specified backend with the supplied patterns for
|
|
:class:`~pathspec.gitignore.GitIgnoreSpec`.
|
|
|
|
*name* (:class:`str`) is the name of the backend.
|
|
|
|
*patterns* (:class:`.Iterable` of :class:`.Pattern`) contains the compiled
|
|
patterns.
|
|
|
|
Returns the backend (:class:`._Backend`).
|
|
"""
|
|
if name == 'best':
|
|
name = _BEST_BACKEND
|
|
|
|
if name == 'hyperscan':
|
|
return HyperscanGiBackend(cast(Sequence[RegexPattern], patterns))
|
|
elif name == 're2':
|
|
return Re2GiBackend(cast(Sequence[RegexPattern], patterns))
|
|
elif name == 'simple':
|
|
return SimpleGiBackend(cast(Sequence[RegexPattern], patterns))
|
|
else:
|
|
raise ValueError(f"Backend {name=!r} is invalid.")
|
|
|
|
|
|
def make_pathspec_backend(
|
|
name: BackendNamesHint,
|
|
patterns: Sequence[Pattern],
|
|
) -> _Backend:
|
|
"""
|
|
Create the specified backend with the supplied patterns for
|
|
:class:`~pathspec.pathspec.PathSpec`.
|
|
|
|
*name* (:class:`str`) is the name of the backend.
|
|
|
|
*patterns* (:class:`Iterable` of :class:`Pattern`) contains the compiled
|
|
patterns.
|
|
|
|
Returns the backend (:class:`._Backend`).
|
|
"""
|
|
if name == 'best':
|
|
name = _BEST_BACKEND
|
|
|
|
if name == 'hyperscan':
|
|
return HyperscanPsBackend(cast(Sequence[RegexPattern], patterns))
|
|
elif name == 're2':
|
|
return Re2PsBackend(cast(Sequence[RegexPattern], patterns))
|
|
elif name == 'simple':
|
|
return SimplePsBackend(patterns)
|
|
else:
|
|
raise ValueError(f"Backend {name=!r} is invalid.")
|