Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9143fc3

Browse files
authored
Merge pull request #3577 from pre-commit/language-unsupported
rename system and script languages to unsupported / unsupported_script
2 parents 3815e2e + 725acc9 commit 9143fc3

9 files changed

Lines changed: 88 additions & 26 deletions

File tree

pre_commit/all_languages.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
from pre_commit.languages import r
2020
from pre_commit.languages import ruby
2121
from pre_commit.languages import rust
22-
from pre_commit.languages import script
2322
from pre_commit.languages import swift
24-
from pre_commit.languages import system
23+
from pre_commit.languages import unsupported
24+
from pre_commit.languages import unsupported_script
2525

2626

2727
languages: dict[str, Language] = {
@@ -43,8 +43,8 @@
4343
'r': r,
4444
'ruby': ruby,
4545
'rust': rust,
46-
'script': script,
4746
'swift': swift,
48-
'system': system,
47+
'unsupported': unsupported,
48+
'unsupported_script': unsupported_script,
4949
}
5050
language_names = sorted(languages)

pre_commit/clientlib.py

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import re
77
import shlex
88
import sys
9+
from collections.abc import Callable
910
from collections.abc import Sequence
1011
from typing import Any
1112
from typing import NamedTuple
@@ -190,6 +191,42 @@ def remove_default(self, dct: dict[str, Any]) -> None:
190191
raise NotImplementedError
191192

192193

194+
def _translate_language(name: str) -> str:
195+
return {
196+
'system': 'unsupported',
197+
'script': 'unsupported_script',
198+
}.get(name, name)
199+
200+
201+
class LanguageMigration(NamedTuple): # remove
202+
key: str
203+
check_fn: Callable[[object], None]
204+
205+
def check(self, dct: dict[str, Any]) -> None:
206+
if self.key not in dct:
207+
return
208+
209+
with cfgv.validate_context(f'At key: {self.key}'):
210+
self.check_fn(_translate_language(dct[self.key]))
211+
212+
def apply_default(self, dct: dict[str, Any]) -> None:
213+
if self.key not in dct:
214+
return
215+
216+
dct[self.key] = _translate_language(dct[self.key])
217+
218+
def remove_default(self, dct: dict[str, Any]) -> None:
219+
raise NotImplementedError
220+
221+
222+
class LanguageMigrationRequired(LanguageMigration): # replace with Required
223+
def check(self, dct: dict[str, Any]) -> None:
224+
if self.key not in dct:
225+
raise cfgv.ValidationError(f'Missing required key: {self.key}')
226+
227+
super().check(dct)
228+
229+
193230
MANIFEST_HOOK_DICT = cfgv.Map(
194231
'Hook', 'id',
195232

@@ -203,7 +240,7 @@ def remove_default(self, dct: dict[str, Any]) -> None:
203240
cfgv.Required('id', cfgv.check_string),
204241
cfgv.Required('name', cfgv.check_string),
205242
cfgv.Required('entry', cfgv.check_string),
206-
cfgv.Required('language', cfgv.check_one_of(language_names)),
243+
LanguageMigrationRequired('language', cfgv.check_one_of(language_names)),
207244
cfgv.Optional('alias', cfgv.check_string, ''),
208245

209246
cfgv.Optional('files', check_string_regex, ''),
@@ -368,8 +405,10 @@ def check(self, dct: dict[str, Any]) -> None:
368405
'Hook', 'id',
369406
cfgv.Required('id', cfgv.check_string),
370407
cfgv.Required('id', cfgv.check_one_of(tuple(k for k, _ in _meta))),
371-
# language must be system
372-
cfgv.Optional('language', cfgv.check_one_of({'system'}), 'system'),
408+
# language must be `unsupported`
409+
cfgv.Optional(
410+
'language', cfgv.check_one_of({'unsupported'}), 'unsupported',
411+
),
373412
# entry cannot be overridden
374413
NotAllowed('entry', cfgv.check_any),
375414
*(
@@ -402,8 +441,10 @@ def check(self, dct: dict[str, Any]) -> None:
402441
for item in MANIFEST_HOOK_DICT.items
403442
if item.key != 'id'
404443
if item.key != 'stages'
444+
if item.key != 'language' # remove
405445
),
406446
StagesMigrationNoDefault('stages', []),
447+
LanguageMigration('language', cfgv.check_one_of(language_names)), # remove
407448
*_COMMON_HOOK_WARNINGS,
408449
)
409450
LOCAL_HOOK_DICT = cfgv.Map(
File renamed without changes.

tests/clientlib_test.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,26 @@ def test_no_warning_for_non_deprecated_default_stages(caplog):
380380
assert caplog.record_tuples == []
381381

382382

383+
def test_unsupported_language_migration():
384+
cfg = {'repos': [sample_local_config(), sample_local_config()]}
385+
cfg['repos'][0]['hooks'][0]['language'] = 'system'
386+
cfg['repos'][1]['hooks'][0]['language'] = 'script'
387+
388+
cfgv.validate(cfg, CONFIG_SCHEMA)
389+
ret = cfgv.apply_defaults(cfg, CONFIG_SCHEMA)
390+
391+
assert ret['repos'][0]['hooks'][0]['language'] == 'unsupported'
392+
assert ret['repos'][1]['hooks'][0]['language'] == 'unsupported_script'
393+
394+
395+
def test_unsupported_language_migration_language_required():
396+
cfg = {'repos': [sample_local_config()]}
397+
del cfg['repos'][0]['hooks'][0]['language']
398+
399+
with pytest.raises(cfgv.ValidationError):
400+
cfgv.validate(cfg, CONFIG_SCHEMA)
401+
402+
383403
@pytest.mark.parametrize(
384404
'manifest_obj',
385405
(

tests/languages/system_test.py

Lines changed: 0 additions & 9 deletions
This file was deleted.
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
from __future__ import annotations
22

3-
from pre_commit.languages import script
3+
from pre_commit.languages import unsupported_script
44
from pre_commit.util import make_executable
55
from testing.language_helpers import run_language
66

77

8-
def test_script_language(tmp_path):
8+
def test_unsupported_script_language(tmp_path):
99
exe = tmp_path.joinpath('main')
1010
exe.write_text('#!/usr/bin/env bash\necho hello hello world\n')
1111
make_executable(exe)
1212

1313
expected = (0, b'hello hello world\n')
14-
assert run_language(tmp_path, script, 'main') == expected
14+
assert run_language(tmp_path, unsupported_script, 'main') == expected
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from __future__ import annotations
2+
3+
from pre_commit.languages import unsupported
4+
from testing.language_helpers import run_language
5+
6+
7+
def test_unsupported_language(tmp_path):
8+
expected = (0, b'hello hello world\n')
9+
ret = run_language(tmp_path, unsupported, 'echo hello hello world')
10+
assert ret == expected

tests/repository_test.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from pre_commit.clientlib import load_manifest
1818
from pre_commit.hook import Hook
1919
from pre_commit.languages import python
20-
from pre_commit.languages import system
20+
from pre_commit.languages import unsupported
2121
from pre_commit.prefix import Prefix
2222
from pre_commit.repository import _hook_installed
2323
from pre_commit.repository import all_hooks
@@ -424,7 +424,7 @@ def test_manifest_hooks(tempdir_factory, store):
424424
exclude_types=[],
425425
files='',
426426
id='bash_hook',
427-
language='script',
427+
language='unsupported_script',
428428
language_version='default',
429429
log_file='',
430430
minimum_pre_commit_version='0',
@@ -457,7 +457,7 @@ def test_non_installable_hook_error_for_language_version(store, caplog):
457457
'hooks': [{
458458
'id': 'system-hook',
459459
'name': 'system-hook',
460-
'language': 'system',
460+
'language': 'unsupported',
461461
'entry': 'python3 -c "import sys; print(sys.version)"',
462462
'language_version': 'python3.10',
463463
}],
@@ -469,7 +469,7 @@ def test_non_installable_hook_error_for_language_version(store, caplog):
469469
msg, = caplog.messages
470470
assert msg == (
471471
'The hook `system-hook` specifies `language_version` but is using '
472-
'language `system` which does not install an environment. '
472+
'language `unsupported` which does not install an environment. '
473473
'Perhaps you meant to use a specific language?'
474474
)
475475

@@ -480,7 +480,7 @@ def test_non_installable_hook_error_for_additional_dependencies(store, caplog):
480480
'hooks': [{
481481
'id': 'system-hook',
482482
'name': 'system-hook',
483-
'language': 'system',
483+
'language': 'unsupported',
484484
'entry': 'python3 -c "import sys; print(sys.version)"',
485485
'additional_dependencies': ['astpretty'],
486486
}],
@@ -492,14 +492,14 @@ def test_non_installable_hook_error_for_additional_dependencies(store, caplog):
492492
msg, = caplog.messages
493493
assert msg == (
494494
'The hook `system-hook` specifies `additional_dependencies` but is '
495-
'using language `system` which does not install an environment. '
495+
'using language `unsupported` which does not install an environment. '
496496
'Perhaps you meant to use a specific language?'
497497
)
498498

499499

500500
def test_args_with_spaces_and_quotes(tmp_path):
501501
ret = run_language(
502-
tmp_path, system,
502+
tmp_path, unsupported,
503503
f"{shlex.quote(sys.executable)} -c 'import sys; print(sys.argv[1:])'",
504504
('i have spaces', 'and"\'quotes', '$and !this'),
505505
)

0 commit comments

Comments
 (0)