Skip to content

Commit

Permalink
Added --include and --exclude cli options
Browse files Browse the repository at this point in the history
These 2 options allow you to pass in a regular expressions that determine
whether files/directories are included or excluded in the recursive file
search.
  • Loading branch information
autophagy committed May 30, 2018
1 parent 8ebbd26 commit 384ef08
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 21 deletions.
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,14 @@ Options:
**kwargs. [default: per-file auto-detection]
-S, --skip-string-normalization
Don't normalize string quotes or prefixes.
--include TEXT A regular expression that matches files and
directories that should be included on
recursive searches. [default: \.pyi?$]
--exclude TEXT A regular expression that matches files and
directories that should be excluded on
recursive searches. [default: build\/|buck-o
ut\/|dist\/|_build\/|.git\/|.hg\/|.mypy_cach
e\/|.tox\/|.venv\/]
--version Show the version and exit.
--help Show this message and exit.
```
Expand Down Expand Up @@ -698,6 +706,8 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md).

### 18.6b0

* added `--include` and `--exclude` (#270)

* added `--skip-string-normalization` (#118)


Expand Down
67 changes: 46 additions & 21 deletions black.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@

__version__ = "18.5b1"
DEFAULT_LINE_LENGTH = 88
DEFAULT_EXCLUDES = (
"build\/|buck-out\/|dist\/|_build\/|.git\/|.hg\/|.mypy_cache\/|.tox\/|.venv\/"
)
DEFAULT_INCLUDES = "\.pyi?$"
CACHE_DIR = Path(user_cache_dir("black", version=__version__))


Expand Down Expand Up @@ -189,6 +193,26 @@ class FileMode(Flag):
is_flag=True,
help="Don't normalize string quotes or prefixes.",
)
@click.option(
"--include",
type=str,
default=DEFAULT_INCLUDES,
help=(
"A regular expression that matches files and directories that should be "
"included on recursive searches."
),
show_default=True,
)
@click.option(
"--exclude",
type=str,
default=DEFAULT_EXCLUDES,
help=(
"A regular expression that matches files and directories that should be "
"excluded on recursive searches."
),
show_default=True,
)
@click.version_option(version=__version__)
@click.argument(
"src",
Expand All @@ -208,14 +232,28 @@ def main(
py36: bool,
skip_string_normalization: bool,
quiet: bool,
include: str,
exclude: str,
src: List[str],
) -> None:
"""The uncompromising code formatter."""
sources: List[Path] = []
for s in src:
p = Path(s)
if p.is_dir():
sources.extend(gen_python_files_in_dir(p))
try:
include_regex = re.compile(include)
except Exception as exc:
raise SyntaxError(
"Invalid regular expression for include given: {}".format(include)
)
try:
exclude_regex = re.compile(exclude)
except Exception as esc:
raise SyntaxError(
"Invalid regular expression for exclude given: {}".format(exclude)
)
sources.extend(gen_python_files_in_dir(p, include_regex, exclude_regex))
elif p.is_file():
# if a file was explicitly given, we don't care about its extension
sources.append(p)
Expand Down Expand Up @@ -2750,32 +2788,19 @@ def get_future_imports(node: Node) -> Set[str]:
return imports


PYTHON_EXTENSIONS = {".py", ".pyi"}
BLACKLISTED_DIRECTORIES = {
"build",
"buck-out",
"dist",
"_build",
".git",
".hg",
".mypy_cache",
".tox",
".venv",
}


def gen_python_files_in_dir(path: Path) -> Iterator[Path]:
"""Generate all files under `path` which aren't under BLACKLISTED_DIRECTORIES
and have one of the PYTHON_EXTENSIONS.
def gen_python_files_in_dir(path: Path, include, exclude) -> Iterator[Path]:
"""Generate all files under `path` whose paths are not excluded by the
`exclude` regex, but are included by the `include` regex.
"""
for child in path.iterdir():
if child.is_dir():
if child.name in BLACKLISTED_DIRECTORIES:
child_path = str(child) + "/"
if exclude.search(child_path) is not None:
continue

yield from gen_python_files_in_dir(child)
yield from gen_python_files_in_dir(child, include, exclude)

elif child.is_file() and child.suffix in PYTHON_EXTENSIONS:
elif child.is_file() and include.search(str(child)):
yield child


Expand Down

0 comments on commit 384ef08

Please sign in to comment.