Skip to content

Commit

Permalink
ENH: rewrite Executor as context manager (#315)
Browse files Browse the repository at this point in the history
* DOC: explain `Executor` usage
* DX: remove lower limit on pytest durations
* ENH: improve profiling output
  • Loading branch information
redeboer authored Mar 10, 2024
1 parent 2bb9db6 commit 8fe4c2c
Show file tree
Hide file tree
Showing 28 changed files with 574 additions and 521 deletions.
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ addopts = [
"--color=yes",
"--doctest-continue-on-failure",
"--doctest-modules",
"--durations-min=0",
"--durations=3",
]
filterwarnings = [
Expand Down
108 changes: 54 additions & 54 deletions src/compwa_policy/check_dev_files/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,63 +50,63 @@ def main(argv: Sequence[str] | None = None) -> int:
args.repo_title = args.repo_name
has_notebooks = not args.no_notebooks
dev_python_version = __get_python_version(args.dev_python_version)
executor = Executor()
executor(citation.main)
executor(commitlint.main)
executor(conda.main, dev_python_version)
executor(cspell.main, args.no_cspell_update)
executor(dependabot.main, args.dependabot)
executor(editorconfig.main, args.no_python)
if not args.allow_labels:
executor(github_labels.main)
if not args.no_github_actions:
executor(
github_workflows.main,
allow_deprecated=args.allow_deprecated_workflows,
doc_apt_packages=_to_list(args.doc_apt_packages),
github_pages=args.github_pages,
keep_pr_linting=args.keep_pr_linting,
no_macos=args.no_macos,
no_pypi=args.no_pypi,
no_version_branches=args.no_version_branches,
python_version=dev_python_version,
single_threaded=args.pytest_single_threaded,
skip_tests=_to_list(args.ci_skipped_tests),
test_extras=_to_list(args.ci_test_extras),
)
if has_notebooks:
executor(jupyter.main)
executor(nbstripout.main)
executor(toml.main) # has to run before pre-commit
executor(prettier.main, args.no_prettierrc)
if is_python_repo:
if args.no_ruff:
executor(black.main, has_notebooks)
with Executor(raise_exception=False) as do:
do(citation.main)
do(commitlint.main)
do(conda.main, dev_python_version)
do(cspell.main, args.no_cspell_update)
do(dependabot.main, args.dependabot)
do(editorconfig.main, args.no_python)
if not args.allow_labels:
do(github_labels.main)
if not args.no_github_actions:
executor(
release_drafter.main,
args.repo_name,
args.repo_title,
do(
github_workflows.main,
allow_deprecated=args.allow_deprecated_workflows,
doc_apt_packages=_to_list(args.doc_apt_packages),
github_pages=args.github_pages,
keep_pr_linting=args.keep_pr_linting,
no_macos=args.no_macos,
no_pypi=args.no_pypi,
no_version_branches=args.no_version_branches,
python_version=dev_python_version,
single_threaded=args.pytest_single_threaded,
skip_tests=_to_list(args.ci_skipped_tests),
test_extras=_to_list(args.ci_test_extras),
)
executor(mypy.main)
executor(pyright.main)
executor(pytest.main)
executor(pyupgrade.main, args.no_ruff)
if not args.no_ruff:
executor(ruff.main, has_notebooks)
if args.pin_requirements != "no":
executor(
update_pip_constraints.main,
frequency=args.pin_requirements,
)
executor(readthedocs.main, dev_python_version)
executor(remove_deprecated_tools, args.keep_issue_templates)
executor(vscode.main, has_notebooks)
executor(gitpod.main, args.no_gitpod, dev_python_version)
executor(precommit.main)
executor(tox.main, has_notebooks)
return executor.finalize(exception=False)
if has_notebooks:
do(jupyter.main)
do(nbstripout.main)
do(toml.main) # has to run before pre-commit
do(prettier.main, args.no_prettierrc)
if is_python_repo:
if args.no_ruff:
do(black.main, has_notebooks)
if not args.no_github_actions:
do(
release_drafter.main,
args.repo_name,
args.repo_title,
github_pages=args.github_pages,
)
do(mypy.main)
do(pyright.main)
do(pytest.main)
do(pyupgrade.main, args.no_ruff)
if not args.no_ruff:
do(ruff.main, has_notebooks)
if args.pin_requirements != "no":
do(
update_pip_constraints.main,
frequency=args.pin_requirements,
)
do(readthedocs.main, dev_python_version)
do(remove_deprecated_tools, args.keep_issue_templates)
do(vscode.main, has_notebooks)
do(gitpod.main, args.no_gitpod, dev_python_version)
do(precommit.main)
do(tox.main, has_notebooks)
return 1 if do.error_messages else 0


def _create_argparse() -> ArgumentParser:
Expand Down
58 changes: 29 additions & 29 deletions src/compwa_policy/check_dev_files/black.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,36 +18,36 @@ def main(has_notebooks: bool) -> None:
if not CONFIG_PATH.pyproject.exists():
return
pyproject = PyprojectTOML.load()
executor = Executor()
executor(_remove_outdated_settings, pyproject)
executor(_update_black_settings, pyproject)
executor(
remove_precommit_hook,
hook_id="black",
repo_url="https://github.com/psf/black",
)
executor(
remove_precommit_hook,
hook_id="black-jupyter",
repo_url="https://github.com/psf/black",
)
executor(_update_precommit_repo, has_notebooks)
executor(vscode.add_extension_recommendation, "ms-python.black-formatter")
executor(
vscode.update_settings, {"black-formatter.importStrategy": "fromEnvironment"}
)
executor(
vscode.update_settings,
{
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter",
"editor.rulers": [88],
with Executor() as do:
do(_remove_outdated_settings, pyproject)
do(_update_black_settings, pyproject)
do(
remove_precommit_hook,
hook_id="black",
repo_url="https://github.com/psf/black",
)
do(
remove_precommit_hook,
hook_id="black-jupyter",
repo_url="https://github.com/psf/black",
)
do(_update_precommit_repo, has_notebooks)
do(vscode.add_extension_recommendation, "ms-python.black-formatter")
do(
vscode.update_settings,
{"black-formatter.importStrategy": "fromEnvironment"},
)
do(
vscode.update_settings,
{
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter",
"editor.rulers": [88],
},
},
},
)
executor(remove_precommit_hook, "nbqa-black")
executor(pyproject.finalize)
executor.finalize()
)
do(remove_precommit_hook, "nbqa-black")
do(pyproject.finalize)


def _remove_outdated_settings(pyproject: PyprojectTOML) -> None:
Expand Down
23 changes: 11 additions & 12 deletions src/compwa_policy/check_dev_files/citation.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,17 @@


def main() -> None:
executor = Executor()
if CONFIG_PATH.zenodo.exists():
executor(convert_zenodo_json)
executor(remove_zenodo_json)
if CONFIG_PATH.citation.exists():
with Executor() as do:
if CONFIG_PATH.zenodo.exists():
executor(remove_zenodo_json)
executor(check_citation_keys)
executor(add_json_schema_precommit)
executor(vscode.add_extension_recommendation, "redhat.vscode-yaml")
executor(update_vscode_settings)
executor.finalize()
do(convert_zenodo_json)
do(remove_zenodo_json)
if CONFIG_PATH.citation.exists():
if CONFIG_PATH.zenodo.exists():
do(remove_zenodo_json)
do(check_citation_keys)
do(add_json_schema_precommit)
do(vscode.add_extension_recommendation, "redhat.vscode-yaml")
do(update_vscode_settings)


def convert_zenodo_json() -> None:
Expand Down Expand Up @@ -162,7 +161,7 @@ def check_citation_keys() -> None:
sorted_keys = sorted(missing_keys)
msg = f"""
{CONFIG_PATH.citation} is missing the following keys:
{', '.join(sorted_keys)}. More info on the keys can be found on
{", ".join(sorted_keys)}. More info on the keys can be found on
https://github.com/citation-file-format/citation-file-format/blob/main/schema-guide.md#valid-keys
"""
msg = dedent(msg).strip()
Expand Down
38 changes: 18 additions & 20 deletions src/compwa_policy/check_dev_files/cspell.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,22 +46,21 @@

def main(no_cspell_update: bool) -> None:
rename_file("cspell.json", str(CONFIG_PATH.cspell))
executor = Executor()
executor(_update_cspell_repo_url)
has_cspell_hook = False
if CONFIG_PATH.cspell.exists():
config = load_precommit_config()
has_cspell_hook = find_repo(config, __REPO_URL) is not None
if not has_cspell_hook:
executor(_remove_configuration)
else:
executor(_update_precommit_repo)
if not no_cspell_update:
executor(_update_config_content)
executor(_sort_config_entries)
executor(add_badge, __BADGE)
executor(vscode.add_extension_recommendation, __VSCODE_EXTENSION_NAME)
executor.finalize()
with Executor() as do:
do(_update_cspell_repo_url)
has_cspell_hook = False
if CONFIG_PATH.cspell.exists():
config = load_precommit_config()
has_cspell_hook = find_repo(config, __REPO_URL) is not None
if not has_cspell_hook:
do(_remove_configuration)
else:
do(_update_precommit_repo)
if not no_cspell_update:
do(_update_config_content)
do(_sort_config_entries)
do(add_badge, __BADGE)
do(vscode.add_extension_recommendation, __VSCODE_EXTENSION_NAME)


def _update_cspell_repo_url(path: Path = CONFIG_PATH.precommit) -> None:
Expand Down Expand Up @@ -97,10 +96,9 @@ def _remove_configuration() -> None:
" required and has been removed"
)
raise PrecommitError(msg)
executor = Executor()
executor(remove_badge, __BADGE_PATTERN)
executor(vscode.remove_extension_recommendation, __VSCODE_EXTENSION_NAME)
executor.finalize()
with Executor() as do:
do(remove_badge, __BADGE_PATTERN)
do(vscode.remove_extension_recommendation, __VSCODE_EXTENSION_NAME)


def _update_precommit_repo() -> None:
Expand Down
34 changes: 16 additions & 18 deletions src/compwa_policy/check_dev_files/deprecated.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,12 @@


def remove_deprecated_tools(keep_issue_templates: bool) -> None:
executor = Executor()
if not keep_issue_templates:
executor(_remove_github_issue_templates)
executor(_remove_markdownlint)
for directory in ["docs", "doc"]:
executor(_remove_relink_references, directory)
executor.finalize()
with Executor() as do:
if not keep_issue_templates:
do(_remove_github_issue_templates)
do(_remove_markdownlint)
for directory in ["docs", "doc"]:
do(_remove_relink_references, directory)


def _remove_github_issue_templates() -> None:
Expand All @@ -26,17 +25,16 @@ def _remove_github_issue_templates() -> None:


def _remove_markdownlint() -> None:
executor = Executor()
executor(remove_configs, [".markdownlint.json", ".markdownlint.yaml"])
executor(remove_from_gitignore, ".markdownlint.json")
executor(
vscode.remove_extension_recommendation,
# cspell:ignore davidanson markdownlint
extension_name="davidanson.vscode-markdownlint",
unwanted=True,
)
executor(remove_precommit_hook, "markdownlint")
executor.finalize()
with Executor() as do:
do(remove_configs, [".markdownlint.json", ".markdownlint.yaml"])
do(remove_from_gitignore, ".markdownlint.json")
do(
vscode.remove_extension_recommendation,
# cspell:ignore davidanson markdownlint
extension_name="davidanson.vscode-markdownlint",
unwanted=True,
)
do(remove_precommit_hook, "markdownlint")


def _remove_relink_references(directory: str) -> None:
Expand Down
Loading

0 comments on commit 8fe4c2c

Please sign in to comment.