Skip to content

Commit d3883ce

Browse files
committed
move languages.all and languages.helpers out of languages
1 parent 5bc5688 commit d3883ce

30 files changed

+274
-282
lines changed

pre_commit/all_languages.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
from __future__ import annotations
2+
3+
from pre_commit.lang_base import Language
4+
from pre_commit.languages import conda
5+
from pre_commit.languages import coursier
6+
from pre_commit.languages import dart
7+
from pre_commit.languages import docker
8+
from pre_commit.languages import docker_image
9+
from pre_commit.languages import dotnet
10+
from pre_commit.languages import fail
11+
from pre_commit.languages import golang
12+
from pre_commit.languages import lua
13+
from pre_commit.languages import node
14+
from pre_commit.languages import perl
15+
from pre_commit.languages import pygrep
16+
from pre_commit.languages import python
17+
from pre_commit.languages import r
18+
from pre_commit.languages import ruby
19+
from pre_commit.languages import rust
20+
from pre_commit.languages import script
21+
from pre_commit.languages import swift
22+
from pre_commit.languages import system
23+
24+
25+
languages: dict[str, Language] = {
26+
'conda': conda,
27+
'coursier': coursier,
28+
'dart': dart,
29+
'docker': docker,
30+
'docker_image': docker_image,
31+
'dotnet': dotnet,
32+
'fail': fail,
33+
'golang': golang,
34+
'lua': lua,
35+
'node': node,
36+
'perl': perl,
37+
'pygrep': pygrep,
38+
'python': python,
39+
'r': r,
40+
'ruby': ruby,
41+
'rust': rust,
42+
'script': script,
43+
'swift': swift,
44+
'system': system,
45+
# TODO: fully deprecate `python_venv`
46+
'python_venv': python,
47+
}
48+
language_names = sorted(languages)

pre_commit/clientlib.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
from identify.identify import ALL_TAGS
1313

1414
import pre_commit.constants as C
15+
from pre_commit.all_languages import language_names
1516
from pre_commit.errors import FatalError
16-
from pre_commit.languages.all import all_languages
1717
from pre_commit.yaml import yaml_load
1818

1919
logger = logging.getLogger('pre_commit')
@@ -49,7 +49,7 @@ def check_min_version(version: str) -> None:
4949
cfgv.Required('id', cfgv.check_string),
5050
cfgv.Required('name', cfgv.check_string),
5151
cfgv.Required('entry', cfgv.check_string),
52-
cfgv.Required('language', cfgv.check_one_of(all_languages)),
52+
cfgv.Required('language', cfgv.check_one_of(language_names)),
5353
cfgv.Optional('alias', cfgv.check_string, ''),
5454

5555
cfgv.Optional('files', check_string_regex, ''),
@@ -281,8 +281,8 @@ def check(self, dct: dict[str, Any]) -> None:
281281
)
282282
DEFAULT_LANGUAGE_VERSION = cfgv.Map(
283283
'DefaultLanguageVersion', None,
284-
cfgv.NoAdditionalKeys(all_languages),
285-
*(cfgv.Optional(x, cfgv.check_string, C.DEFAULT) for x in all_languages),
284+
cfgv.NoAdditionalKeys(language_names),
285+
*(cfgv.Optional(x, cfgv.check_string, C.DEFAULT) for x in language_names),
286286
)
287287
CONFIG_SCHEMA = cfgv.Map(
288288
'Config', None,

pre_commit/commands/run.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
from pre_commit import color
2020
from pre_commit import git
2121
from pre_commit import output
22+
from pre_commit.all_languages import languages
2223
from pre_commit.clientlib import load_config
2324
from pre_commit.hook import Hook
24-
from pre_commit.languages.all import languages
2525
from pre_commit.repository import all_hooks
2626
from pre_commit.repository import install_hook_envs
2727
from pre_commit.staged_files_only import staged_files_only
Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
import re
88
import shlex
99
from typing import Any
10+
from typing import ContextManager
1011
from typing import Generator
1112
from typing import NoReturn
13+
from typing import Protocol
1214
from typing import Sequence
1315

1416
import pre_commit.constants as C
@@ -22,6 +24,47 @@
2224
SHIMS_RE = re.compile(r'[/\\]shims[/\\]')
2325

2426

27+
class Language(Protocol):
28+
# Use `None` for no installation / environment
29+
@property
30+
def ENVIRONMENT_DIR(self) -> str | None: ...
31+
# return a value to replace `'default` for `language_version`
32+
def get_default_version(self) -> str: ...
33+
# return whether the environment is healthy (or should be rebuilt)
34+
def health_check(self, prefix: Prefix, version: str) -> str | None: ...
35+
36+
# install a repository for the given language and language_version
37+
def install_environment(
38+
self,
39+
prefix: Prefix,
40+
version: str,
41+
additional_dependencies: Sequence[str],
42+
) -> None:
43+
...
44+
45+
# modify the environment for hook execution
46+
def in_env(
47+
self,
48+
prefix: Prefix,
49+
version: str,
50+
) -> ContextManager[None]:
51+
...
52+
53+
# execute a hook and return the exit code and output
54+
def run_hook(
55+
self,
56+
prefix: Prefix,
57+
entry: str,
58+
args: Sequence[str],
59+
file_args: Sequence[str],
60+
*,
61+
is_local: bool,
62+
require_serial: bool,
63+
color: bool,
64+
) -> tuple[int, bytes]:
65+
...
66+
67+
2568
def exe_exists(exe: str) -> bool:
2669
found = parse_shebang.find_executable(exe)
2770
if found is None: # exe exists
@@ -45,7 +88,7 @@ def exe_exists(exe: str) -> bool:
4588
)
4689

4790

48-
def run_setup_cmd(prefix: Prefix, cmd: tuple[str, ...], **kwargs: Any) -> None:
91+
def setup_cmd(prefix: Prefix, cmd: tuple[str, ...], **kwargs: Any) -> None:
4992
cmd_output_b(*cmd, cwd=prefix.prefix_dir, **kwargs)
5093

5194

pre_commit/languages/all.py

Lines changed: 0 additions & 99 deletions
This file was deleted.

pre_commit/languages/conda.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@
55
from typing import Generator
66
from typing import Sequence
77

8+
from pre_commit import lang_base
89
from pre_commit.envcontext import envcontext
910
from pre_commit.envcontext import PatchesT
1011
from pre_commit.envcontext import SubstitutionT
1112
from pre_commit.envcontext import UNSET
1213
from pre_commit.envcontext import Var
13-
from pre_commit.languages import helpers
1414
from pre_commit.prefix import Prefix
1515
from pre_commit.util import cmd_output_b
1616

1717
ENVIRONMENT_DIR = 'conda'
18-
get_default_version = helpers.basic_get_default_version
19-
health_check = helpers.basic_health_check
20-
run_hook = helpers.basic_run_hook
18+
get_default_version = lang_base.basic_get_default_version
19+
health_check = lang_base.basic_health_check
20+
run_hook = lang_base.basic_run_hook
2121

2222

2323
def get_env_patch(env: str) -> PatchesT:
@@ -41,7 +41,7 @@ def get_env_patch(env: str) -> PatchesT:
4141

4242
@contextlib.contextmanager
4343
def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
44-
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version)
44+
envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
4545
with envcontext(get_env_patch(envdir)):
4646
yield
4747

@@ -60,11 +60,11 @@ def install_environment(
6060
version: str,
6161
additional_dependencies: Sequence[str],
6262
) -> None:
63-
helpers.assert_version_default('conda', version)
63+
lang_base.assert_version_default('conda', version)
6464

6565
conda_exe = _conda_exe()
6666

67-
env_dir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version)
67+
env_dir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
6868
cmd_output_b(
6969
conda_exe, 'env', 'create', '-p', env_dir, '--file',
7070
'environment.yml', cwd=prefix.prefix_dir,

pre_commit/languages/coursier.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,27 @@
55
from typing import Generator
66
from typing import Sequence
77

8+
from pre_commit import lang_base
89
from pre_commit.envcontext import envcontext
910
from pre_commit.envcontext import PatchesT
1011
from pre_commit.envcontext import Var
1112
from pre_commit.errors import FatalError
12-
from pre_commit.languages import helpers
1313
from pre_commit.parse_shebang import find_executable
1414
from pre_commit.prefix import Prefix
1515

1616
ENVIRONMENT_DIR = 'coursier'
1717

18-
get_default_version = helpers.basic_get_default_version
19-
health_check = helpers.basic_health_check
20-
run_hook = helpers.basic_run_hook
18+
get_default_version = lang_base.basic_get_default_version
19+
health_check = lang_base.basic_health_check
20+
run_hook = lang_base.basic_run_hook
2121

2222

2323
def install_environment(
2424
prefix: Prefix,
2525
version: str,
2626
additional_dependencies: Sequence[str],
2727
) -> None:
28-
helpers.assert_version_default('coursier', version)
28+
lang_base.assert_version_default('coursier', version)
2929

3030
# Support both possible executable names (either "cs" or "coursier")
3131
cs = find_executable('cs') or find_executable('coursier')
@@ -35,12 +35,12 @@ def install_environment(
3535
'executables in the application search path',
3636
)
3737

38-
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version)
38+
envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
3939

4040
def _install(*opts: str) -> None:
4141
assert cs is not None
42-
helpers.run_setup_cmd(prefix, (cs, 'fetch', *opts))
43-
helpers.run_setup_cmd(prefix, (cs, 'install', '--dir', envdir, *opts))
42+
lang_base.setup_cmd(prefix, (cs, 'fetch', *opts))
43+
lang_base.setup_cmd(prefix, (cs, 'install', '--dir', envdir, *opts))
4444

4545
with in_env(prefix, version):
4646
channel = prefix.path('.pre-commit-channel')
@@ -71,6 +71,6 @@ def get_env_patch(target_dir: str) -> PatchesT:
7171

7272
@contextlib.contextmanager
7373
def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
74-
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version)
74+
envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
7575
with envcontext(get_env_patch(envdir)):
7676
yield

0 commit comments

Comments
 (0)