move languages.all and languages.helpers out of languages

This commit is contained in:
Anthony Sottile 2023-02-20 17:59:15 -05:00
parent 5bc56889e9
commit d3883ce7f7
30 changed files with 274 additions and 282 deletions

View file

@ -0,0 +1,48 @@
from __future__ import annotations
from pre_commit.lang_base import Language
from pre_commit.languages import conda
from pre_commit.languages import coursier
from pre_commit.languages import dart
from pre_commit.languages import docker
from pre_commit.languages import docker_image
from pre_commit.languages import dotnet
from pre_commit.languages import fail
from pre_commit.languages import golang
from pre_commit.languages import lua
from pre_commit.languages import node
from pre_commit.languages import perl
from pre_commit.languages import pygrep
from pre_commit.languages import python
from pre_commit.languages import r
from pre_commit.languages import ruby
from pre_commit.languages import rust
from pre_commit.languages import script
from pre_commit.languages import swift
from pre_commit.languages import system
languages: dict[str, Language] = {
'conda': conda,
'coursier': coursier,
'dart': dart,
'docker': docker,
'docker_image': docker_image,
'dotnet': dotnet,
'fail': fail,
'golang': golang,
'lua': lua,
'node': node,
'perl': perl,
'pygrep': pygrep,
'python': python,
'r': r,
'ruby': ruby,
'rust': rust,
'script': script,
'swift': swift,
'system': system,
# TODO: fully deprecate `python_venv`
'python_venv': python,
}
language_names = sorted(languages)

View file

@ -12,8 +12,8 @@ import cfgv
from identify.identify import ALL_TAGS from identify.identify import ALL_TAGS
import pre_commit.constants as C import pre_commit.constants as C
from pre_commit.all_languages import language_names
from pre_commit.errors import FatalError from pre_commit.errors import FatalError
from pre_commit.languages.all import all_languages
from pre_commit.yaml import yaml_load from pre_commit.yaml import yaml_load
logger = logging.getLogger('pre_commit') logger = logging.getLogger('pre_commit')
@ -49,7 +49,7 @@ MANIFEST_HOOK_DICT = cfgv.Map(
cfgv.Required('id', cfgv.check_string), cfgv.Required('id', cfgv.check_string),
cfgv.Required('name', cfgv.check_string), cfgv.Required('name', cfgv.check_string),
cfgv.Required('entry', cfgv.check_string), cfgv.Required('entry', cfgv.check_string),
cfgv.Required('language', cfgv.check_one_of(all_languages)), cfgv.Required('language', cfgv.check_one_of(language_names)),
cfgv.Optional('alias', cfgv.check_string, ''), cfgv.Optional('alias', cfgv.check_string, ''),
cfgv.Optional('files', check_string_regex, ''), cfgv.Optional('files', check_string_regex, ''),
@ -281,8 +281,8 @@ CONFIG_REPO_DICT = cfgv.Map(
) )
DEFAULT_LANGUAGE_VERSION = cfgv.Map( DEFAULT_LANGUAGE_VERSION = cfgv.Map(
'DefaultLanguageVersion', None, 'DefaultLanguageVersion', None,
cfgv.NoAdditionalKeys(all_languages), cfgv.NoAdditionalKeys(language_names),
*(cfgv.Optional(x, cfgv.check_string, C.DEFAULT) for x in all_languages), *(cfgv.Optional(x, cfgv.check_string, C.DEFAULT) for x in language_names),
) )
CONFIG_SCHEMA = cfgv.Map( CONFIG_SCHEMA = cfgv.Map(
'Config', None, 'Config', None,

View file

@ -19,9 +19,9 @@ from identify.identify import tags_from_path
from pre_commit import color from pre_commit import color
from pre_commit import git from pre_commit import git
from pre_commit import output from pre_commit import output
from pre_commit.all_languages import languages
from pre_commit.clientlib import load_config from pre_commit.clientlib import load_config
from pre_commit.hook import Hook from pre_commit.hook import Hook
from pre_commit.languages.all import languages
from pre_commit.repository import all_hooks from pre_commit.repository import all_hooks
from pre_commit.repository import install_hook_envs from pre_commit.repository import install_hook_envs
from pre_commit.staged_files_only import staged_files_only from pre_commit.staged_files_only import staged_files_only

View file

@ -7,8 +7,10 @@ import random
import re import re
import shlex import shlex
from typing import Any from typing import Any
from typing import ContextManager
from typing import Generator from typing import Generator
from typing import NoReturn from typing import NoReturn
from typing import Protocol
from typing import Sequence from typing import Sequence
import pre_commit.constants as C import pre_commit.constants as C
@ -22,6 +24,47 @@ FIXED_RANDOM_SEED = 1542676187
SHIMS_RE = re.compile(r'[/\\]shims[/\\]') SHIMS_RE = re.compile(r'[/\\]shims[/\\]')
class Language(Protocol):
# Use `None` for no installation / environment
@property
def ENVIRONMENT_DIR(self) -> str | None: ...
# return a value to replace `'default` for `language_version`
def get_default_version(self) -> str: ...
# return whether the environment is healthy (or should be rebuilt)
def health_check(self, prefix: Prefix, version: str) -> str | None: ...
# install a repository for the given language and language_version
def install_environment(
self,
prefix: Prefix,
version: str,
additional_dependencies: Sequence[str],
) -> None:
...
# modify the environment for hook execution
def in_env(
self,
prefix: Prefix,
version: str,
) -> ContextManager[None]:
...
# execute a hook and return the exit code and output
def run_hook(
self,
prefix: Prefix,
entry: str,
args: Sequence[str],
file_args: Sequence[str],
*,
is_local: bool,
require_serial: bool,
color: bool,
) -> tuple[int, bytes]:
...
def exe_exists(exe: str) -> bool: def exe_exists(exe: str) -> bool:
found = parse_shebang.find_executable(exe) found = parse_shebang.find_executable(exe)
if found is None: # exe exists if found is None: # exe exists
@ -45,7 +88,7 @@ def exe_exists(exe: str) -> bool:
) )
def run_setup_cmd(prefix: Prefix, cmd: tuple[str, ...], **kwargs: Any) -> None: def setup_cmd(prefix: Prefix, cmd: tuple[str, ...], **kwargs: Any) -> None:
cmd_output_b(*cmd, cwd=prefix.prefix_dir, **kwargs) cmd_output_b(*cmd, cwd=prefix.prefix_dir, **kwargs)

View file

@ -1,99 +0,0 @@
from __future__ import annotations
from typing import ContextManager
from typing import Protocol
from typing import Sequence
from pre_commit.languages import conda
from pre_commit.languages import coursier
from pre_commit.languages import dart
from pre_commit.languages import docker
from pre_commit.languages import docker_image
from pre_commit.languages import dotnet
from pre_commit.languages import fail
from pre_commit.languages import golang
from pre_commit.languages import lua
from pre_commit.languages import node
from pre_commit.languages import perl
from pre_commit.languages import pygrep
from pre_commit.languages import python
from pre_commit.languages import r
from pre_commit.languages import ruby
from pre_commit.languages import rust
from pre_commit.languages import script
from pre_commit.languages import swift
from pre_commit.languages import system
from pre_commit.prefix import Prefix
class Language(Protocol):
# Use `None` for no installation / environment
@property
def ENVIRONMENT_DIR(self) -> str | None: ...
# return a value to replace `'default` for `language_version`
def get_default_version(self) -> str: ...
# return whether the environment is healthy (or should be rebuilt)
def health_check(
self,
prefix: Prefix,
language_version: str,
) -> str | None:
...
# install a repository for the given language and language_version
def install_environment(
self,
prefix: Prefix,
version: str,
additional_dependencies: Sequence[str],
) -> None:
...
# modify the environment for hook execution
def in_env(
self,
prefix: Prefix,
version: str,
) -> ContextManager[None]:
...
# execute a hook and return the exit code and output
def run_hook(
self,
prefix: Prefix,
entry: str,
args: Sequence[str],
file_args: Sequence[str],
*,
is_local: bool,
require_serial: bool,
color: bool,
) -> tuple[int, bytes]:
...
languages: dict[str, Language] = {
'conda': conda,
'coursier': coursier,
'dart': dart,
'docker': docker,
'docker_image': docker_image,
'dotnet': dotnet,
'fail': fail,
'golang': golang,
'lua': lua,
'node': node,
'perl': perl,
'pygrep': pygrep,
'python': python,
'r': r,
'ruby': ruby,
'rust': rust,
'script': script,
'swift': swift,
'system': system,
# TODO: fully deprecate `python_venv`
'python_venv': python,
}
all_languages = sorted(languages)

View file

@ -5,19 +5,19 @@ import os
from typing import Generator from typing import Generator
from typing import Sequence from typing import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext from pre_commit.envcontext import envcontext
from pre_commit.envcontext import PatchesT from pre_commit.envcontext import PatchesT
from pre_commit.envcontext import SubstitutionT from pre_commit.envcontext import SubstitutionT
from pre_commit.envcontext import UNSET from pre_commit.envcontext import UNSET
from pre_commit.envcontext import Var from pre_commit.envcontext import Var
from pre_commit.languages import helpers
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
from pre_commit.util import cmd_output_b from pre_commit.util import cmd_output_b
ENVIRONMENT_DIR = 'conda' ENVIRONMENT_DIR = 'conda'
get_default_version = helpers.basic_get_default_version get_default_version = lang_base.basic_get_default_version
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
run_hook = helpers.basic_run_hook run_hook = lang_base.basic_run_hook
def get_env_patch(env: str) -> PatchesT: def get_env_patch(env: str) -> PatchesT:
@ -41,7 +41,7 @@ def get_env_patch(env: str) -> PatchesT:
@contextlib.contextmanager @contextlib.contextmanager
def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
with envcontext(get_env_patch(envdir)): with envcontext(get_env_patch(envdir)):
yield yield
@ -60,11 +60,11 @@ def install_environment(
version: str, version: str,
additional_dependencies: Sequence[str], additional_dependencies: Sequence[str],
) -> None: ) -> None:
helpers.assert_version_default('conda', version) lang_base.assert_version_default('conda', version)
conda_exe = _conda_exe() conda_exe = _conda_exe()
env_dir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) env_dir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
cmd_output_b( cmd_output_b(
conda_exe, 'env', 'create', '-p', env_dir, '--file', conda_exe, 'env', 'create', '-p', env_dir, '--file',
'environment.yml', cwd=prefix.prefix_dir, 'environment.yml', cwd=prefix.prefix_dir,

View file

@ -5,19 +5,19 @@ import os.path
from typing import Generator from typing import Generator
from typing import Sequence from typing import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext from pre_commit.envcontext import envcontext
from pre_commit.envcontext import PatchesT from pre_commit.envcontext import PatchesT
from pre_commit.envcontext import Var from pre_commit.envcontext import Var
from pre_commit.errors import FatalError from pre_commit.errors import FatalError
from pre_commit.languages import helpers
from pre_commit.parse_shebang import find_executable from pre_commit.parse_shebang import find_executable
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
ENVIRONMENT_DIR = 'coursier' ENVIRONMENT_DIR = 'coursier'
get_default_version = helpers.basic_get_default_version get_default_version = lang_base.basic_get_default_version
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
run_hook = helpers.basic_run_hook run_hook = lang_base.basic_run_hook
def install_environment( def install_environment(
@ -25,7 +25,7 @@ def install_environment(
version: str, version: str,
additional_dependencies: Sequence[str], additional_dependencies: Sequence[str],
) -> None: ) -> None:
helpers.assert_version_default('coursier', version) lang_base.assert_version_default('coursier', version)
# Support both possible executable names (either "cs" or "coursier") # Support both possible executable names (either "cs" or "coursier")
cs = find_executable('cs') or find_executable('coursier') cs = find_executable('cs') or find_executable('coursier')
@ -35,12 +35,12 @@ def install_environment(
'executables in the application search path', 'executables in the application search path',
) )
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
def _install(*opts: str) -> None: def _install(*opts: str) -> None:
assert cs is not None assert cs is not None
helpers.run_setup_cmd(prefix, (cs, 'fetch', *opts)) lang_base.setup_cmd(prefix, (cs, 'fetch', *opts))
helpers.run_setup_cmd(prefix, (cs, 'install', '--dir', envdir, *opts)) lang_base.setup_cmd(prefix, (cs, 'install', '--dir', envdir, *opts))
with in_env(prefix, version): with in_env(prefix, version):
channel = prefix.path('.pre-commit-channel') channel = prefix.path('.pre-commit-channel')
@ -71,6 +71,6 @@ def get_env_patch(target_dir: str) -> PatchesT:
@contextlib.contextmanager @contextlib.contextmanager
def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
with envcontext(get_env_patch(envdir)): with envcontext(get_env_patch(envdir)):
yield yield

View file

@ -7,19 +7,19 @@ import tempfile
from typing import Generator from typing import Generator
from typing import Sequence from typing import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext from pre_commit.envcontext import envcontext
from pre_commit.envcontext import PatchesT from pre_commit.envcontext import PatchesT
from pre_commit.envcontext import Var from pre_commit.envcontext import Var
from pre_commit.languages import helpers
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
from pre_commit.util import win_exe from pre_commit.util import win_exe
from pre_commit.yaml import yaml_load from pre_commit.yaml import yaml_load
ENVIRONMENT_DIR = 'dartenv' ENVIRONMENT_DIR = 'dartenv'
get_default_version = helpers.basic_get_default_version get_default_version = lang_base.basic_get_default_version
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
run_hook = helpers.basic_run_hook run_hook = lang_base.basic_run_hook
def get_env_patch(venv: str) -> PatchesT: def get_env_patch(venv: str) -> PatchesT:
@ -30,7 +30,7 @@ def get_env_patch(venv: str) -> PatchesT:
@contextlib.contextmanager @contextlib.contextmanager
def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
with envcontext(get_env_patch(envdir)): with envcontext(get_env_patch(envdir)):
yield yield
@ -40,9 +40,9 @@ def install_environment(
version: str, version: str,
additional_dependencies: Sequence[str], additional_dependencies: Sequence[str],
) -> None: ) -> None:
helpers.assert_version_default('dart', version) lang_base.assert_version_default('dart', version)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
bin_dir = os.path.join(envdir, 'bin') bin_dir = os.path.join(envdir, 'bin')
def _install_dir(prefix_p: Prefix, pub_cache: str) -> None: def _install_dir(prefix_p: Prefix, pub_cache: str) -> None:
@ -51,10 +51,10 @@ def install_environment(
with open(prefix_p.path('pubspec.yaml')) as f: with open(prefix_p.path('pubspec.yaml')) as f:
pubspec_contents = yaml_load(f) pubspec_contents = yaml_load(f)
helpers.run_setup_cmd(prefix_p, ('dart', 'pub', 'get'), env=dart_env) lang_base.setup_cmd(prefix_p, ('dart', 'pub', 'get'), env=dart_env)
for executable in pubspec_contents['executables']: for executable in pubspec_contents['executables']:
helpers.run_setup_cmd( lang_base.setup_cmd(
prefix_p, prefix_p,
( (
'dart', 'compile', 'exe', 'dart', 'compile', 'exe',
@ -77,7 +77,7 @@ def install_environment(
else: else:
dep_cmd = (dep,) dep_cmd = (dep,)
helpers.run_setup_cmd( lang_base.setup_cmd(
prefix, prefix,
('dart', 'pub', 'cache', 'add', *dep_cmd), ('dart', 'pub', 'cache', 'add', *dep_cmd),
env={**os.environ, 'PUB_CACHE': dep_tmp}, env={**os.environ, 'PUB_CACHE': dep_tmp},

View file

@ -5,16 +5,16 @@ import json
import os import os
from typing import Sequence from typing import Sequence
from pre_commit.languages import helpers from pre_commit import lang_base
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
from pre_commit.util import CalledProcessError from pre_commit.util import CalledProcessError
from pre_commit.util import cmd_output_b from pre_commit.util import cmd_output_b
ENVIRONMENT_DIR = 'docker' ENVIRONMENT_DIR = 'docker'
PRE_COMMIT_LABEL = 'PRE_COMMIT' PRE_COMMIT_LABEL = 'PRE_COMMIT'
get_default_version = helpers.basic_get_default_version get_default_version = lang_base.basic_get_default_version
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
in_env = helpers.no_env # no special environment for docker in_env = lang_base.no_env # no special environment for docker
def _is_in_docker() -> bool: def _is_in_docker() -> bool:
@ -84,16 +84,16 @@ def build_docker_image(
cmd += ('--pull',) cmd += ('--pull',)
# This must come last for old versions of docker. See #477 # This must come last for old versions of docker. See #477
cmd += ('.',) cmd += ('.',)
helpers.run_setup_cmd(prefix, cmd) lang_base.setup_cmd(prefix, cmd)
def install_environment( def install_environment(
prefix: Prefix, version: str, additional_dependencies: Sequence[str], prefix: Prefix, version: str, additional_dependencies: Sequence[str],
) -> None: # pragma: win32 no cover ) -> None: # pragma: win32 no cover
helpers.assert_version_default('docker', version) lang_base.assert_version_default('docker', version)
helpers.assert_no_additional_deps('docker', additional_dependencies) lang_base.assert_no_additional_deps('docker', additional_dependencies)
directory = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) directory = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
# Docker doesn't really have relevant disk environment, but pre-commit # Docker doesn't really have relevant disk environment, but pre-commit
# still needs to cleanup its state files on failure # still needs to cleanup its state files on failure
@ -135,10 +135,10 @@ def run_hook(
# automated cleanup of docker images. # automated cleanup of docker images.
build_docker_image(prefix, pull=False) build_docker_image(prefix, pull=False)
entry_exe, *cmd_rest = helpers.hook_cmd(entry, args) entry_exe, *cmd_rest = lang_base.hook_cmd(entry, args)
entry_tag = ('--entrypoint', entry_exe, docker_tag(prefix)) entry_tag = ('--entrypoint', entry_exe, docker_tag(prefix))
return helpers.run_xargs( return lang_base.run_xargs(
(*docker_cmd(), *entry_tag, *cmd_rest), (*docker_cmd(), *entry_tag, *cmd_rest),
file_args, file_args,
require_serial=require_serial, require_serial=require_serial,

View file

@ -2,15 +2,15 @@ from __future__ import annotations
from typing import Sequence from typing import Sequence
from pre_commit.languages import helpers from pre_commit import lang_base
from pre_commit.languages.docker import docker_cmd from pre_commit.languages.docker import docker_cmd
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
ENVIRONMENT_DIR = None ENVIRONMENT_DIR = None
get_default_version = helpers.basic_get_default_version get_default_version = lang_base.basic_get_default_version
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
install_environment = helpers.no_install install_environment = lang_base.no_install
in_env = helpers.no_env in_env = lang_base.no_env
def run_hook( def run_hook(
@ -23,8 +23,8 @@ def run_hook(
require_serial: bool, require_serial: bool,
color: bool, color: bool,
) -> tuple[int, bytes]: # pragma: win32 no cover ) -> tuple[int, bytes]: # pragma: win32 no cover
cmd = docker_cmd() + helpers.hook_cmd(entry, args) cmd = docker_cmd() + lang_base.hook_cmd(entry, args)
return helpers.run_xargs( return lang_base.run_xargs(
cmd, cmd,
file_args, file_args,
require_serial=require_serial, require_serial=require_serial,

View file

@ -9,18 +9,18 @@ import zipfile
from typing import Generator from typing import Generator
from typing import Sequence from typing import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext from pre_commit.envcontext import envcontext
from pre_commit.envcontext import PatchesT from pre_commit.envcontext import PatchesT
from pre_commit.envcontext import Var from pre_commit.envcontext import Var
from pre_commit.languages import helpers
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
ENVIRONMENT_DIR = 'dotnetenv' ENVIRONMENT_DIR = 'dotnetenv'
BIN_DIR = 'bin' BIN_DIR = 'bin'
get_default_version = helpers.basic_get_default_version get_default_version = lang_base.basic_get_default_version
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
run_hook = helpers.basic_run_hook run_hook = lang_base.basic_run_hook
def get_env_patch(venv: str) -> PatchesT: def get_env_patch(venv: str) -> PatchesT:
@ -31,7 +31,7 @@ def get_env_patch(venv: str) -> PatchesT:
@contextlib.contextmanager @contextlib.contextmanager
def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
with envcontext(get_env_patch(envdir)): with envcontext(get_env_patch(envdir)):
yield yield
@ -57,14 +57,14 @@ def install_environment(
version: str, version: str,
additional_dependencies: Sequence[str], additional_dependencies: Sequence[str],
) -> None: ) -> None:
helpers.assert_version_default('dotnet', version) lang_base.assert_version_default('dotnet', version)
helpers.assert_no_additional_deps('dotnet', additional_dependencies) lang_base.assert_no_additional_deps('dotnet', additional_dependencies)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
build_dir = prefix.path('pre-commit-build') build_dir = prefix.path('pre-commit-build')
# Build & pack nupkg file # Build & pack nupkg file
helpers.run_setup_cmd( lang_base.setup_cmd(
prefix, prefix,
( (
'dotnet', 'pack', 'dotnet', 'pack',
@ -99,7 +99,7 @@ def install_environment(
# Install to bin dir # Install to bin dir
with _nuget_config_no_sources() as nuget_config: with _nuget_config_no_sources() as nuget_config:
helpers.run_setup_cmd( lang_base.setup_cmd(
prefix, prefix,
( (
'dotnet', 'tool', 'install', 'dotnet', 'tool', 'install',

View file

@ -2,14 +2,14 @@ from __future__ import annotations
from typing import Sequence from typing import Sequence
from pre_commit.languages import helpers from pre_commit import lang_base
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
ENVIRONMENT_DIR = None ENVIRONMENT_DIR = None
get_default_version = helpers.basic_get_default_version get_default_version = lang_base.basic_get_default_version
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
install_environment = helpers.no_install install_environment = lang_base.no_install
in_env = helpers.no_env in_env = lang_base.no_env
def run_hook( def run_hook(

View file

@ -19,17 +19,17 @@ from typing import Protocol
from typing import Sequence from typing import Sequence
import pre_commit.constants as C import pre_commit.constants as C
from pre_commit import lang_base
from pre_commit.envcontext import envcontext from pre_commit.envcontext import envcontext
from pre_commit.envcontext import PatchesT from pre_commit.envcontext import PatchesT
from pre_commit.envcontext import Var from pre_commit.envcontext import Var
from pre_commit.languages import helpers
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
from pre_commit.util import cmd_output from pre_commit.util import cmd_output
from pre_commit.util import rmtree from pre_commit.util import rmtree
ENVIRONMENT_DIR = 'golangenv' ENVIRONMENT_DIR = 'golangenv'
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
run_hook = helpers.basic_run_hook run_hook = lang_base.basic_run_hook
_ARCH_ALIASES = { _ARCH_ALIASES = {
'x86_64': 'amd64', 'x86_64': 'amd64',
@ -60,7 +60,7 @@ else: # pragma: win32 no cover
@functools.lru_cache(maxsize=1) @functools.lru_cache(maxsize=1)
def get_default_version() -> str: def get_default_version() -> str:
if helpers.exe_exists('go'): if lang_base.exe_exists('go'):
return 'system' return 'system'
else: else:
return C.DEFAULT return C.DEFAULT
@ -121,7 +121,7 @@ def _install_go(version: str, dest: str) -> None:
@contextlib.contextmanager @contextlib.contextmanager
def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
with envcontext(get_env_patch(envdir, version)): with envcontext(get_env_patch(envdir, version)):
yield yield
@ -131,7 +131,7 @@ def install_environment(
version: str, version: str,
additional_dependencies: Sequence[str], additional_dependencies: Sequence[str],
) -> None: ) -> None:
env_dir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) env_dir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
if version != 'system': if version != 'system':
_install_go(version, env_dir) _install_go(version, env_dir)
@ -149,9 +149,9 @@ def install_environment(
os.path.join(env_dir, '.go', 'bin'), os.environ['PATH'], os.path.join(env_dir, '.go', 'bin'), os.environ['PATH'],
)) ))
helpers.run_setup_cmd(prefix, ('go', 'install', './...'), env=env) lang_base.setup_cmd(prefix, ('go', 'install', './...'), env=env)
for dependency in additional_dependencies: for dependency in additional_dependencies:
helpers.run_setup_cmd(prefix, ('go', 'install', dependency), env=env) lang_base.setup_cmd(prefix, ('go', 'install', dependency), env=env)
# save some disk space -- we don't need this after installation # save some disk space -- we don't need this after installation
pkgdir = os.path.join(env_dir, 'pkg') pkgdir = os.path.join(env_dir, 'pkg')

View file

@ -6,17 +6,17 @@ import sys
from typing import Generator from typing import Generator
from typing import Sequence from typing import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext from pre_commit.envcontext import envcontext
from pre_commit.envcontext import PatchesT from pre_commit.envcontext import PatchesT
from pre_commit.envcontext import Var from pre_commit.envcontext import Var
from pre_commit.languages import helpers
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
from pre_commit.util import cmd_output from pre_commit.util import cmd_output
ENVIRONMENT_DIR = 'lua_env' ENVIRONMENT_DIR = 'lua_env'
get_default_version = helpers.basic_get_default_version get_default_version = lang_base.basic_get_default_version
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
run_hook = helpers.basic_run_hook run_hook = lang_base.basic_run_hook
def _get_lua_version() -> str: # pragma: win32 no cover def _get_lua_version() -> str: # pragma: win32 no cover
@ -45,7 +45,7 @@ def get_env_patch(d: str) -> PatchesT: # pragma: win32 no cover
@contextlib.contextmanager # pragma: win32 no cover @contextlib.contextmanager # pragma: win32 no cover
def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
with envcontext(get_env_patch(envdir)): with envcontext(get_env_patch(envdir)):
yield yield
@ -55,9 +55,9 @@ def install_environment(
version: str, version: str,
additional_dependencies: Sequence[str], additional_dependencies: Sequence[str],
) -> None: # pragma: win32 no cover ) -> None: # pragma: win32 no cover
helpers.assert_version_default('lua', version) lang_base.assert_version_default('lua', version)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
with in_env(prefix, version): with in_env(prefix, version):
# luarocks doesn't bootstrap a tree prior to installing # luarocks doesn't bootstrap a tree prior to installing
# so ensure the directory exists. # so ensure the directory exists.
@ -66,10 +66,10 @@ def install_environment(
# Older luarocks (e.g., 2.4.2) expect the rockspec as an arg # Older luarocks (e.g., 2.4.2) expect the rockspec as an arg
for rockspec in prefix.star('.rockspec'): for rockspec in prefix.star('.rockspec'):
make_cmd = ('luarocks', '--tree', envdir, 'make', rockspec) make_cmd = ('luarocks', '--tree', envdir, 'make', rockspec)
helpers.run_setup_cmd(prefix, make_cmd) lang_base.setup_cmd(prefix, make_cmd)
# luarocks can't install multiple packages at once # luarocks can't install multiple packages at once
# so install them individually. # so install them individually.
for dependency in additional_dependencies: for dependency in additional_dependencies:
cmd = ('luarocks', '--tree', envdir, 'install', dependency) cmd = ('luarocks', '--tree', envdir, 'install', dependency)
helpers.run_setup_cmd(prefix, cmd) lang_base.setup_cmd(prefix, cmd)

View file

@ -8,11 +8,11 @@ from typing import Generator
from typing import Sequence from typing import Sequence
import pre_commit.constants as C import pre_commit.constants as C
from pre_commit import lang_base
from pre_commit.envcontext import envcontext from pre_commit.envcontext import envcontext
from pre_commit.envcontext import PatchesT from pre_commit.envcontext import PatchesT
from pre_commit.envcontext import UNSET from pre_commit.envcontext import UNSET
from pre_commit.envcontext import Var from pre_commit.envcontext import Var
from pre_commit.languages import helpers
from pre_commit.languages.python import bin_dir from pre_commit.languages.python import bin_dir
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
from pre_commit.util import cmd_output from pre_commit.util import cmd_output
@ -20,7 +20,7 @@ from pre_commit.util import cmd_output_b
from pre_commit.util import rmtree from pre_commit.util import rmtree
ENVIRONMENT_DIR = 'node_env' ENVIRONMENT_DIR = 'node_env'
run_hook = helpers.basic_run_hook run_hook = lang_base.basic_run_hook
@functools.lru_cache(maxsize=1) @functools.lru_cache(maxsize=1)
@ -30,7 +30,7 @@ def get_default_version() -> str:
return C.DEFAULT return C.DEFAULT
# if node is already installed, we can save a bunch of setup time by # if node is already installed, we can save a bunch of setup time by
# using the installed version # using the installed version
elif all(helpers.exe_exists(exe) for exe in ('node', 'npm')): elif all(lang_base.exe_exists(exe) for exe in ('node', 'npm')):
return 'system' return 'system'
else: else:
return C.DEFAULT return C.DEFAULT
@ -60,13 +60,13 @@ def get_env_patch(venv: str) -> PatchesT:
@contextlib.contextmanager @contextlib.contextmanager
def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
with envcontext(get_env_patch(envdir)): with envcontext(get_env_patch(envdir)):
yield yield
def health_check(prefix: Prefix, language_version: str) -> str | None: def health_check(prefix: Prefix, version: str) -> str | None:
with in_env(prefix, language_version): with in_env(prefix, version):
retcode, _, _ = cmd_output_b('node', '--version', check=False) retcode, _, _ = cmd_output_b('node', '--version', check=False)
if retcode != 0: # pragma: win32 no cover if retcode != 0: # pragma: win32 no cover
return f'`node --version` returned {retcode}' return f'`node --version` returned {retcode}'
@ -78,7 +78,7 @@ def install_environment(
prefix: Prefix, version: str, additional_dependencies: Sequence[str], prefix: Prefix, version: str, additional_dependencies: Sequence[str],
) -> None: ) -> None:
assert prefix.exists('package.json') assert prefix.exists('package.json')
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
# https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx?f=255&MSPPError=-2147217396#maxpath # https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx?f=255&MSPPError=-2147217396#maxpath
if sys.platform == 'win32': # pragma: no cover if sys.platform == 'win32': # pragma: no cover
@ -96,13 +96,13 @@ def install_environment(
'npm', 'install', '--dev', '--prod', 'npm', 'install', '--dev', '--prod',
'--ignore-prepublish', '--no-progress', '--no-save', '--ignore-prepublish', '--no-progress', '--no-save',
) )
helpers.run_setup_cmd(prefix, local_install_cmd) lang_base.setup_cmd(prefix, local_install_cmd)
_, pkg, _ = cmd_output('npm', 'pack', cwd=prefix.prefix_dir) _, pkg, _ = cmd_output('npm', 'pack', cwd=prefix.prefix_dir)
pkg = prefix.path(pkg.strip()) pkg = prefix.path(pkg.strip())
install = ('npm', 'install', '-g', pkg, *additional_dependencies) install = ('npm', 'install', '-g', pkg, *additional_dependencies)
helpers.run_setup_cmd(prefix, install) lang_base.setup_cmd(prefix, install)
# clean these up after installation # clean these up after installation
if prefix.exists('node_modules'): # pragma: win32 no cover if prefix.exists('node_modules'): # pragma: win32 no cover

View file

@ -6,16 +6,16 @@ import shlex
from typing import Generator from typing import Generator
from typing import Sequence from typing import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext from pre_commit.envcontext import envcontext
from pre_commit.envcontext import PatchesT from pre_commit.envcontext import PatchesT
from pre_commit.envcontext import Var from pre_commit.envcontext import Var
from pre_commit.languages import helpers
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
ENVIRONMENT_DIR = 'perl_env' ENVIRONMENT_DIR = 'perl_env'
get_default_version = helpers.basic_get_default_version get_default_version = lang_base.basic_get_default_version
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
run_hook = helpers.basic_run_hook run_hook = lang_base.basic_run_hook
def get_env_patch(venv: str) -> PatchesT: def get_env_patch(venv: str) -> PatchesT:
@ -34,7 +34,7 @@ def get_env_patch(venv: str) -> PatchesT:
@contextlib.contextmanager @contextlib.contextmanager
def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
with envcontext(get_env_patch(envdir)): with envcontext(get_env_patch(envdir)):
yield yield
@ -42,9 +42,9 @@ def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
def install_environment( def install_environment(
prefix: Prefix, version: str, additional_dependencies: Sequence[str], prefix: Prefix, version: str, additional_dependencies: Sequence[str],
) -> None: ) -> None:
helpers.assert_version_default('perl', version) lang_base.assert_version_default('perl', version)
with in_env(prefix, version): with in_env(prefix, version):
helpers.run_setup_cmd( lang_base.setup_cmd(
prefix, ('cpan', '-T', '.', *additional_dependencies), prefix, ('cpan', '-T', '.', *additional_dependencies),
) )

View file

@ -7,16 +7,16 @@ from typing import NamedTuple
from typing import Pattern from typing import Pattern
from typing import Sequence from typing import Sequence
from pre_commit import lang_base
from pre_commit import output from pre_commit import output
from pre_commit.languages import helpers
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
from pre_commit.xargs import xargs from pre_commit.xargs import xargs
ENVIRONMENT_DIR = None ENVIRONMENT_DIR = None
get_default_version = helpers.basic_get_default_version get_default_version = lang_base.basic_get_default_version
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
install_environment = helpers.no_install install_environment = lang_base.no_install
in_env = helpers.no_env in_env = lang_base.no_env
def _process_filename_by_line(pattern: Pattern[bytes], filename: str) -> int: def _process_filename_by_line(pattern: Pattern[bytes], filename: str) -> int:

View file

@ -8,11 +8,11 @@ from typing import Generator
from typing import Sequence from typing import Sequence
import pre_commit.constants as C import pre_commit.constants as C
from pre_commit import lang_base
from pre_commit.envcontext import envcontext from pre_commit.envcontext import envcontext
from pre_commit.envcontext import PatchesT from pre_commit.envcontext import PatchesT
from pre_commit.envcontext import UNSET from pre_commit.envcontext import UNSET
from pre_commit.envcontext import Var from pre_commit.envcontext import Var
from pre_commit.languages import helpers
from pre_commit.parse_shebang import find_executable from pre_commit.parse_shebang import find_executable
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
from pre_commit.util import CalledProcessError from pre_commit.util import CalledProcessError
@ -21,7 +21,7 @@ from pre_commit.util import cmd_output_b
from pre_commit.util import win_exe from pre_commit.util import win_exe
ENVIRONMENT_DIR = 'py_env' ENVIRONMENT_DIR = 'py_env'
run_hook = helpers.basic_run_hook run_hook = lang_base.basic_run_hook
@functools.lru_cache(maxsize=None) @functools.lru_cache(maxsize=None)
@ -153,13 +153,13 @@ def norm_version(version: str) -> str | None:
@contextlib.contextmanager @contextlib.contextmanager
def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
with envcontext(get_env_patch(envdir)): with envcontext(get_env_patch(envdir)):
yield yield
def health_check(prefix: Prefix, language_version: str) -> str | None: def health_check(prefix: Prefix, version: str) -> str | None:
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, language_version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
pyvenv_cfg = os.path.join(envdir, 'pyvenv.cfg') pyvenv_cfg = os.path.join(envdir, 'pyvenv.cfg')
# created with "old" virtualenv # created with "old" virtualenv
@ -202,7 +202,7 @@ def install_environment(
version: str, version: str,
additional_dependencies: Sequence[str], additional_dependencies: Sequence[str],
) -> None: ) -> None:
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
venv_cmd = [sys.executable, '-mvirtualenv', envdir] venv_cmd = [sys.executable, '-mvirtualenv', envdir]
python = norm_version(version) python = norm_version(version)
if python is not None: if python is not None:
@ -211,4 +211,4 @@ def install_environment(
cmd_output_b(*venv_cmd, cwd='/') cmd_output_b(*venv_cmd, cwd='/')
with in_env(prefix, version): with in_env(prefix, version):
helpers.run_setup_cmd(prefix, install_cmd) lang_base.setup_cmd(prefix, install_cmd)

View file

@ -7,18 +7,18 @@ import shutil
from typing import Generator from typing import Generator
from typing import Sequence from typing import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext from pre_commit.envcontext import envcontext
from pre_commit.envcontext import PatchesT from pre_commit.envcontext import PatchesT
from pre_commit.envcontext import UNSET from pre_commit.envcontext import UNSET
from pre_commit.languages import helpers
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
from pre_commit.util import cmd_output_b from pre_commit.util import cmd_output_b
from pre_commit.util import win_exe from pre_commit.util import win_exe
ENVIRONMENT_DIR = 'renv' ENVIRONMENT_DIR = 'renv'
RSCRIPT_OPTS = ('--no-save', '--no-restore', '--no-site-file', '--no-environ') RSCRIPT_OPTS = ('--no-save', '--no-restore', '--no-site-file', '--no-environ')
get_default_version = helpers.basic_get_default_version get_default_version = lang_base.basic_get_default_version
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
def get_env_patch(venv: str) -> PatchesT: def get_env_patch(venv: str) -> PatchesT:
@ -30,7 +30,7 @@ def get_env_patch(venv: str) -> PatchesT:
@contextlib.contextmanager @contextlib.contextmanager
def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
with envcontext(get_env_patch(envdir)): with envcontext(get_env_patch(envdir)):
yield yield
@ -93,7 +93,7 @@ def install_environment(
version: str, version: str,
additional_dependencies: Sequence[str], additional_dependencies: Sequence[str],
) -> None: ) -> None:
env_dir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) env_dir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
os.makedirs(env_dir, exist_ok=True) os.makedirs(env_dir, exist_ok=True)
shutil.copy(prefix.path('renv.lock'), env_dir) shutil.copy(prefix.path('renv.lock'), env_dir)
shutil.copytree(prefix.path('renv'), os.path.join(env_dir, 'renv')) shutil.copytree(prefix.path('renv'), os.path.join(env_dir, 'renv'))
@ -166,7 +166,7 @@ def run_hook(
color: bool, color: bool,
) -> tuple[int, bytes]: ) -> tuple[int, bytes]:
cmd = _cmd_from_hook(prefix, entry, args, is_local=is_local) cmd = _cmd_from_hook(prefix, entry, args, is_local=is_local)
return helpers.run_xargs( return lang_base.run_xargs(
cmd, cmd,
file_args, file_args,
require_serial=require_serial, require_serial=require_serial,

View file

@ -9,23 +9,23 @@ from typing import Generator
from typing import Sequence from typing import Sequence
import pre_commit.constants as C import pre_commit.constants as C
from pre_commit import lang_base
from pre_commit.envcontext import envcontext from pre_commit.envcontext import envcontext
from pre_commit.envcontext import PatchesT from pre_commit.envcontext import PatchesT
from pre_commit.envcontext import UNSET from pre_commit.envcontext import UNSET
from pre_commit.envcontext import Var from pre_commit.envcontext import Var
from pre_commit.languages import helpers
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
from pre_commit.util import CalledProcessError from pre_commit.util import CalledProcessError
from pre_commit.util import resource_bytesio from pre_commit.util import resource_bytesio
ENVIRONMENT_DIR = 'rbenv' ENVIRONMENT_DIR = 'rbenv'
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
run_hook = helpers.basic_run_hook run_hook = lang_base.basic_run_hook
@functools.lru_cache(maxsize=1) @functools.lru_cache(maxsize=1)
def get_default_version() -> str: def get_default_version() -> str:
if all(helpers.exe_exists(exe) for exe in ('ruby', 'gem')): if all(lang_base.exe_exists(exe) for exe in ('ruby', 'gem')):
return 'system' return 'system'
else: else:
return C.DEFAULT return C.DEFAULT
@ -68,7 +68,7 @@ def get_env_patch(
@contextlib.contextmanager @contextlib.contextmanager
def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
with envcontext(get_env_patch(envdir, version)): with envcontext(get_env_patch(envdir, version)):
yield yield
@ -83,7 +83,7 @@ def _install_rbenv(
prefix: Prefix, prefix: Prefix,
version: str, version: str,
) -> None: # pragma: win32 no cover ) -> None: # pragma: win32 no cover
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
_extract_resource('rbenv.tar.gz', prefix.path('.')) _extract_resource('rbenv.tar.gz', prefix.path('.'))
shutil.move(prefix.path('rbenv'), envdir) shutil.move(prefix.path('rbenv'), envdir)
@ -100,10 +100,10 @@ def _install_ruby(
version: str, version: str,
) -> None: # pragma: win32 no cover ) -> None: # pragma: win32 no cover
try: try:
helpers.run_setup_cmd(prefix, ('rbenv', 'download', version)) lang_base.setup_cmd(prefix, ('rbenv', 'download', version))
except CalledProcessError: # pragma: no cover (usually find with download) except CalledProcessError: # pragma: no cover (usually find with download)
# Failed to download from mirror for some reason, build it instead # Failed to download from mirror for some reason, build it instead
helpers.run_setup_cmd(prefix, ('rbenv', 'install', version)) lang_base.setup_cmd(prefix, ('rbenv', 'install', version))
def install_environment( def install_environment(
@ -114,17 +114,17 @@ def install_environment(
with in_env(prefix, version): with in_env(prefix, version):
# Need to call this before installing so rbenv's directories # Need to call this before installing so rbenv's directories
# are set up # are set up
helpers.run_setup_cmd(prefix, ('rbenv', 'init', '-')) lang_base.setup_cmd(prefix, ('rbenv', 'init', '-'))
if version != C.DEFAULT: if version != C.DEFAULT:
_install_ruby(prefix, version) _install_ruby(prefix, version)
# Need to call this after installing to set up the shims # Need to call this after installing to set up the shims
helpers.run_setup_cmd(prefix, ('rbenv', 'rehash')) lang_base.setup_cmd(prefix, ('rbenv', 'rehash'))
with in_env(prefix, version): with in_env(prefix, version):
helpers.run_setup_cmd( lang_base.setup_cmd(
prefix, ('gem', 'build', *prefix.star('.gemspec')), prefix, ('gem', 'build', *prefix.star('.gemspec')),
) )
helpers.run_setup_cmd( lang_base.setup_cmd(
prefix, prefix,
( (
'gem', 'install', 'gem', 'install',

View file

@ -11,19 +11,19 @@ from typing import Generator
from typing import Sequence from typing import Sequence
import pre_commit.constants as C import pre_commit.constants as C
from pre_commit import lang_base
from pre_commit import parse_shebang from pre_commit import parse_shebang
from pre_commit.envcontext import envcontext from pre_commit.envcontext import envcontext
from pre_commit.envcontext import PatchesT from pre_commit.envcontext import PatchesT
from pre_commit.envcontext import Var from pre_commit.envcontext import Var
from pre_commit.languages import helpers
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
from pre_commit.util import cmd_output_b from pre_commit.util import cmd_output_b
from pre_commit.util import make_executable from pre_commit.util import make_executable
from pre_commit.util import win_exe from pre_commit.util import win_exe
ENVIRONMENT_DIR = 'rustenv' ENVIRONMENT_DIR = 'rustenv'
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
run_hook = helpers.basic_run_hook run_hook = lang_base.basic_run_hook
@functools.lru_cache(maxsize=1) @functools.lru_cache(maxsize=1)
@ -63,7 +63,7 @@ def get_env_patch(target_dir: str, version: str) -> PatchesT:
@contextlib.contextmanager @contextlib.contextmanager
def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
with envcontext(get_env_patch(envdir, version)): with envcontext(get_env_patch(envdir, version)):
yield yield
@ -78,7 +78,7 @@ def _add_dependencies(
crate = f'{name}@{spec or "*"}' crate = f'{name}@{spec or "*"}'
crates.append(crate) crates.append(crate)
helpers.run_setup_cmd(prefix, ('cargo', 'add', *crates)) lang_base.setup_cmd(prefix, ('cargo', 'add', *crates))
def install_rust_with_toolchain(toolchain: str) -> None: def install_rust_with_toolchain(toolchain: str) -> None:
@ -116,7 +116,7 @@ def install_environment(
version: str, version: str,
additional_dependencies: Sequence[str], additional_dependencies: Sequence[str],
) -> None: ) -> None:
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
# There are two cases where we might want to specify more dependencies: # There are two cases where we might want to specify more dependencies:
# as dependencies for the library being built, and as binary packages # as dependencies for the library being built, and as binary packages

View file

@ -2,14 +2,14 @@ from __future__ import annotations
from typing import Sequence from typing import Sequence
from pre_commit.languages import helpers from pre_commit import lang_base
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
ENVIRONMENT_DIR = None ENVIRONMENT_DIR = None
get_default_version = helpers.basic_get_default_version get_default_version = lang_base.basic_get_default_version
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
install_environment = helpers.no_install install_environment = lang_base.no_install
in_env = helpers.no_env in_env = lang_base.no_env
def run_hook( def run_hook(
@ -22,9 +22,9 @@ def run_hook(
require_serial: bool, require_serial: bool,
color: bool, color: bool,
) -> tuple[int, bytes]: ) -> tuple[int, bytes]:
cmd = helpers.hook_cmd(entry, args) cmd = lang_base.hook_cmd(entry, args)
cmd = (prefix.path(cmd[0]), *cmd[1:]) cmd = (prefix.path(cmd[0]), *cmd[1:])
return helpers.run_xargs( return lang_base.run_xargs(
cmd, cmd,
file_args, file_args,
require_serial=require_serial, require_serial=require_serial,

View file

@ -5,10 +5,10 @@ import os
from typing import Generator from typing import Generator
from typing import Sequence from typing import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext from pre_commit.envcontext import envcontext
from pre_commit.envcontext import PatchesT from pre_commit.envcontext import PatchesT
from pre_commit.envcontext import Var from pre_commit.envcontext import Var
from pre_commit.languages import helpers
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
from pre_commit.util import cmd_output_b from pre_commit.util import cmd_output_b
@ -16,9 +16,9 @@ BUILD_DIR = '.build'
BUILD_CONFIG = 'release' BUILD_CONFIG = 'release'
ENVIRONMENT_DIR = 'swift_env' ENVIRONMENT_DIR = 'swift_env'
get_default_version = helpers.basic_get_default_version get_default_version = lang_base.basic_get_default_version
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
run_hook = helpers.basic_run_hook run_hook = lang_base.basic_run_hook
def get_env_patch(venv: str) -> PatchesT: # pragma: win32 no cover def get_env_patch(venv: str) -> PatchesT: # pragma: win32 no cover
@ -28,7 +28,7 @@ def get_env_patch(venv: str) -> PatchesT: # pragma: win32 no cover
@contextlib.contextmanager # pragma: win32 no cover @contextlib.contextmanager # pragma: win32 no cover
def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
with envcontext(get_env_patch(envdir)): with envcontext(get_env_patch(envdir)):
yield yield
@ -36,9 +36,9 @@ def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]:
def install_environment( def install_environment(
prefix: Prefix, version: str, additional_dependencies: Sequence[str], prefix: Prefix, version: str, additional_dependencies: Sequence[str],
) -> None: # pragma: win32 no cover ) -> None: # pragma: win32 no cover
helpers.assert_version_default('swift', version) lang_base.assert_version_default('swift', version)
helpers.assert_no_additional_deps('swift', additional_dependencies) lang_base.assert_no_additional_deps('swift', additional_dependencies)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version) envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
# Build the swift package # Build the swift package
os.mkdir(envdir) os.mkdir(envdir)

View file

@ -1,10 +1,10 @@
from __future__ import annotations from __future__ import annotations
from pre_commit.languages import helpers from pre_commit import lang_base
ENVIRONMENT_DIR = None ENVIRONMENT_DIR = None
get_default_version = helpers.basic_get_default_version get_default_version = lang_base.basic_get_default_version
health_check = helpers.basic_health_check health_check = lang_base.basic_health_check
install_environment = helpers.no_install install_environment = lang_base.no_install
in_env = helpers.no_env in_env = lang_base.no_env
run_hook = helpers.basic_run_hook run_hook = lang_base.basic_run_hook

View file

@ -8,13 +8,13 @@ from typing import Any
from typing import Sequence from typing import Sequence
import pre_commit.constants as C import pre_commit.constants as C
from pre_commit.all_languages import languages
from pre_commit.clientlib import load_manifest from pre_commit.clientlib import load_manifest
from pre_commit.clientlib import LOCAL from pre_commit.clientlib import LOCAL
from pre_commit.clientlib import META from pre_commit.clientlib import META
from pre_commit.clientlib import parse_version from pre_commit.clientlib import parse_version
from pre_commit.hook import Hook from pre_commit.hook import Hook
from pre_commit.languages.all import languages from pre_commit.lang_base import environment_dir
from pre_commit.languages.helpers import environment_dir
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
from pre_commit.store import Store from pre_commit.store import Store
from pre_commit.util import clean_path_on_failure from pre_commit.util import clean_path_on_failure

View file

@ -3,7 +3,7 @@ from __future__ import annotations
import os import os
from typing import Sequence from typing import Sequence
from pre_commit.languages.all import Language from pre_commit.lang_base import Language
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix

View file

@ -1,6 +1,6 @@
from __future__ import annotations from __future__ import annotations
from pre_commit.languages.all import languages from pre_commit.all_languages import languages
def test_python_venv_is_an_alias_to_python(): def test_python_venv_is_an_alias_to_python():

View file

@ -8,8 +8,8 @@ from unittest import mock
import pytest import pytest
import pre_commit.constants as C import pre_commit.constants as C
from pre_commit import lang_base
from pre_commit import parse_shebang from pre_commit import parse_shebang
from pre_commit.languages import helpers
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
from pre_commit.util import CalledProcessError from pre_commit.util import CalledProcessError
@ -32,42 +32,42 @@ def homedir_mck():
def test_exe_exists_does_not_exist(find_exe_mck, homedir_mck): def test_exe_exists_does_not_exist(find_exe_mck, homedir_mck):
find_exe_mck.return_value = None find_exe_mck.return_value = None
assert helpers.exe_exists('ruby') is False assert lang_base.exe_exists('ruby') is False
def test_exe_exists_exists(find_exe_mck, homedir_mck): def test_exe_exists_exists(find_exe_mck, homedir_mck):
find_exe_mck.return_value = os.path.normpath('/usr/bin/ruby') find_exe_mck.return_value = os.path.normpath('/usr/bin/ruby')
assert helpers.exe_exists('ruby') is True assert lang_base.exe_exists('ruby') is True
def test_exe_exists_false_if_shim(find_exe_mck, homedir_mck): def test_exe_exists_false_if_shim(find_exe_mck, homedir_mck):
find_exe_mck.return_value = os.path.normpath('/foo/shims/ruby') find_exe_mck.return_value = os.path.normpath('/foo/shims/ruby')
assert helpers.exe_exists('ruby') is False assert lang_base.exe_exists('ruby') is False
def test_exe_exists_false_if_homedir(find_exe_mck, homedir_mck): def test_exe_exists_false_if_homedir(find_exe_mck, homedir_mck):
find_exe_mck.return_value = os.path.normpath('/home/me/somedir/ruby') find_exe_mck.return_value = os.path.normpath('/home/me/somedir/ruby')
assert helpers.exe_exists('ruby') is False assert lang_base.exe_exists('ruby') is False
def test_exe_exists_commonpath_raises_ValueError(find_exe_mck, homedir_mck): def test_exe_exists_commonpath_raises_ValueError(find_exe_mck, homedir_mck):
find_exe_mck.return_value = os.path.normpath('/usr/bin/ruby') find_exe_mck.return_value = os.path.normpath('/usr/bin/ruby')
with mock.patch.object(os.path, 'commonpath', side_effect=ValueError): with mock.patch.object(os.path, 'commonpath', side_effect=ValueError):
assert helpers.exe_exists('ruby') is True assert lang_base.exe_exists('ruby') is True
def test_exe_exists_true_when_homedir_is_slash(find_exe_mck): def test_exe_exists_true_when_homedir_is_slash(find_exe_mck):
find_exe_mck.return_value = os.path.normpath('/usr/bin/ruby') find_exe_mck.return_value = os.path.normpath('/usr/bin/ruby')
with mock.patch.object(os.path, 'expanduser', return_value=os.sep): with mock.patch.object(os.path, 'expanduser', return_value=os.sep):
assert helpers.exe_exists('ruby') is True assert lang_base.exe_exists('ruby') is True
def test_basic_get_default_version(): def test_basic_get_default_version():
assert helpers.basic_get_default_version() == C.DEFAULT assert lang_base.basic_get_default_version() == C.DEFAULT
def test_basic_health_check(): def test_basic_health_check():
assert helpers.basic_health_check(Prefix('.'), 'default') is None assert lang_base.basic_health_check(Prefix('.'), 'default') is None
def test_failed_setup_command_does_not_unicode_error(): def test_failed_setup_command_does_not_unicode_error():
@ -79,12 +79,12 @@ def test_failed_setup_command_does_not_unicode_error():
# an assertion that this does not raise `UnicodeError` # an assertion that this does not raise `UnicodeError`
with pytest.raises(CalledProcessError): with pytest.raises(CalledProcessError):
helpers.run_setup_cmd(Prefix('.'), (sys.executable, '-c', script)) lang_base.setup_cmd(Prefix('.'), (sys.executable, '-c', script))
def test_assert_no_additional_deps(): def test_assert_no_additional_deps():
with pytest.raises(AssertionError) as excinfo: with pytest.raises(AssertionError) as excinfo:
helpers.assert_no_additional_deps('lang', ['hmmm']) lang_base.assert_no_additional_deps('lang', ['hmmm'])
msg, = excinfo.value.args msg, = excinfo.value.args
assert msg == ( assert msg == (
'for now, pre-commit does not support additional_dependencies for ' 'for now, pre-commit does not support additional_dependencies for '
@ -96,19 +96,19 @@ def test_assert_no_additional_deps():
def test_target_concurrency_normal(): def test_target_concurrency_normal():
with mock.patch.object(multiprocessing, 'cpu_count', return_value=123): with mock.patch.object(multiprocessing, 'cpu_count', return_value=123):
with mock.patch.dict(os.environ, {}, clear=True): with mock.patch.dict(os.environ, {}, clear=True):
assert helpers.target_concurrency() == 123 assert lang_base.target_concurrency() == 123
def test_target_concurrency_testing_env_var(): def test_target_concurrency_testing_env_var():
with mock.patch.dict( with mock.patch.dict(
os.environ, {'PRE_COMMIT_NO_CONCURRENCY': '1'}, clear=True, os.environ, {'PRE_COMMIT_NO_CONCURRENCY': '1'}, clear=True,
): ):
assert helpers.target_concurrency() == 1 assert lang_base.target_concurrency() == 1
def test_target_concurrency_on_travis(): def test_target_concurrency_on_travis():
with mock.patch.dict(os.environ, {'TRAVIS': '1'}, clear=True): with mock.patch.dict(os.environ, {'TRAVIS': '1'}, clear=True):
assert helpers.target_concurrency() == 2 assert lang_base.target_concurrency() == 2
def test_target_concurrency_cpu_count_not_implemented(): def test_target_concurrency_cpu_count_not_implemented():
@ -116,17 +116,17 @@ def test_target_concurrency_cpu_count_not_implemented():
multiprocessing, 'cpu_count', side_effect=NotImplementedError, multiprocessing, 'cpu_count', side_effect=NotImplementedError,
): ):
with mock.patch.dict(os.environ, {}, clear=True): with mock.patch.dict(os.environ, {}, clear=True):
assert helpers.target_concurrency() == 1 assert lang_base.target_concurrency() == 1
def test_shuffled_is_deterministic(): def test_shuffled_is_deterministic():
seq = [str(i) for i in range(10)] seq = [str(i) for i in range(10)]
expected = ['4', '0', '5', '1', '8', '6', '2', '3', '7', '9'] expected = ['4', '0', '5', '1', '8', '6', '2', '3', '7', '9']
assert helpers._shuffled(seq) == expected assert lang_base._shuffled(seq) == expected
def test_xargs_require_serial_is_not_shuffled(): def test_xargs_require_serial_is_not_shuffled():
ret, out = helpers.run_xargs( ret, out = lang_base.run_xargs(
('echo',), [str(i) for i in range(10)], ('echo',), [str(i) for i in range(10)],
require_serial=True, require_serial=True,
color=False, color=False,

View file

@ -6,9 +6,9 @@ import pytest
import re_assert import re_assert
import pre_commit.constants as C import pre_commit.constants as C
from pre_commit import lang_base
from pre_commit.envcontext import envcontext from pre_commit.envcontext import envcontext
from pre_commit.languages import golang from pre_commit.languages import golang
from pre_commit.languages import helpers
from pre_commit.store import _make_local_repo from pre_commit.store import _make_local_repo
from testing.language_helpers import run_language from testing.language_helpers import run_language
@ -18,7 +18,7 @@ ACTUAL_GET_DEFAULT_VERSION = golang.get_default_version.__wrapped__
@pytest.fixture @pytest.fixture
def exe_exists_mck(): def exe_exists_mck():
with mock.patch.object(helpers, 'exe_exists') as mck: with mock.patch.object(lang_base, 'exe_exists') as mck:
yield mck yield mck

View file

@ -10,12 +10,12 @@ import pytest
import re_assert import re_assert
import pre_commit.constants as C import pre_commit.constants as C
from pre_commit import lang_base
from pre_commit.all_languages import languages
from pre_commit.clientlib import CONFIG_SCHEMA from pre_commit.clientlib import CONFIG_SCHEMA
from pre_commit.clientlib import load_manifest from pre_commit.clientlib import load_manifest
from pre_commit.hook import Hook from pre_commit.hook import Hook
from pre_commit.languages import helpers
from pre_commit.languages import python from pre_commit.languages import python
from pre_commit.languages.all import languages
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
from pre_commit.repository import _hook_installed from pre_commit.repository import _hook_installed
from pre_commit.repository import all_hooks from pre_commit.repository import all_hooks
@ -275,7 +275,7 @@ def test_repository_state_compatibility(tempdir_factory, store, v):
config = make_config_from_repo(path) config = make_config_from_repo(path)
hook = _get_hook(config, store, 'foo') hook = _get_hook(config, store, 'foo')
envdir = helpers.environment_dir( envdir = lang_base.environment_dir(
hook.prefix, hook.prefix,
python.ENVIRONMENT_DIR, python.ENVIRONMENT_DIR,
hook.language_version, hook.language_version,
@ -327,7 +327,7 @@ def test_control_c_control_c_on_install(tempdir_factory, store):
# raise as well. # raise as well.
with pytest.raises(MyKeyboardInterrupt): with pytest.raises(MyKeyboardInterrupt):
with mock.patch.object( with mock.patch.object(
helpers, 'run_setup_cmd', side_effect=MyKeyboardInterrupt, lang_base, 'setup_cmd', side_effect=MyKeyboardInterrupt,
): ):
with mock.patch.object( with mock.patch.object(
shutil, 'rmtree', side_effect=MyKeyboardInterrupt, shutil, 'rmtree', side_effect=MyKeyboardInterrupt,
@ -336,7 +336,7 @@ def test_control_c_control_c_on_install(tempdir_factory, store):
# Should have made an environment, however this environment is broken! # Should have made an environment, however this environment is broken!
hook, = hooks hook, = hooks
envdir = helpers.environment_dir( envdir = lang_base.environment_dir(
hook.prefix, hook.prefix,
python.ENVIRONMENT_DIR, python.ENVIRONMENT_DIR,
hook.language_version, hook.language_version,
@ -359,7 +359,7 @@ def test_invalidated_virtualenv(tempdir_factory, store):
hook = _get_hook(config, store, 'foo') hook = _get_hook(config, store, 'foo')
# Simulate breaking of the virtualenv # Simulate breaking of the virtualenv
envdir = helpers.environment_dir( envdir = lang_base.environment_dir(
hook.prefix, hook.prefix,
python.ENVIRONMENT_DIR, python.ENVIRONMENT_DIR,
hook.language_version, hook.language_version,