Skip to content

Commit f492723

Browse files
henryiiiasottile
authored andcommitted
support types_or
1 parent b223cb3 commit f492723

4 files changed

Lines changed: 76 additions & 9 deletions

File tree

pre_commit_mirror_maker/all/.pre-commit-hooks.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@
66
args: {args}
77
require_serial: {require_serial}
88
additional_dependencies: {additional_dependencies}
9+
minimum_pre_commit_version: {minimum_pre_commit_version}

pre_commit_mirror_maker/main.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
4747
mutex.add_argument(
4848
'--files-regex', help='Files regex to use in hooks.yaml',
4949
)
50-
mutex.add_argument('--types', help='`identify` type to match')
50+
mutex.add_argument('--types', help='`identify` type to AND match')
51+
mutex.add_argument(
52+
'--types-or', action='append', help='`identify` type to OR match',
53+
)
5154

5255
parser.add_argument(
5356
'--id', help='Hook id, defaults to the entry point.',
@@ -70,16 +73,30 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
7073
)
7174
args = parser.parse_args(argv)
7275

76+
minimum_pre_commit_version = '0'
77+
78+
if args.types_or:
79+
match_key = 'types_or'
80+
match_val = '[{}]'.format(', '.join(args.types_or))
81+
minimum_pre_commit_version = '2.9.2'
82+
elif args.types:
83+
match_key = 'types'
84+
match_val = f'[{args.types}]'
85+
else:
86+
match_key = 'files'
87+
match_val = args.files_regex
88+
7389
make_repo(
7490
args.repo_path,
7591
name=args.package_name,
7692
language=args.language,
7793
entry=args.entry or args.package_name,
7894
id=args.id or args.entry or args.package_name,
79-
match_key='types' if args.types else 'files',
80-
match_val=f'[{args.types}]' if args.types else args.files_regex,
95+
match_key=match_key,
96+
match_val=match_val,
8197
args=json.dumps(split_by_commas(args.args)),
8298
require_serial=json.dumps(args.require_serial),
99+
minimum_pre_commit_version=minimum_pre_commit_version,
83100
)
84101
return 0
85102

tests/main_test.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def test_main_passes_args(mock_make_repo):
4040
'.',
4141
language='ruby', name='scss-lint', entry='scss-lint-entry',
4242
id='scss-lint-id', match_key='files', match_val=r'\.scss$', args='[]',
43-
require_serial='false',
43+
require_serial='false', minimum_pre_commit_version='0',
4444
)
4545

4646

@@ -75,3 +75,48 @@ def test_main_with_args(mock_make_repo):
7575
))
7676
expected = '["-i", "--ignore=E265,E501"]'
7777
assert mock_make_repo.call_args[1]['args'] == expected
78+
79+
80+
def test_main_with_types_and_types_or(mock_make_repo, capsys):
81+
with pytest.raises(SystemExit) as exc_info:
82+
main.main((
83+
'.',
84+
'--language', 'python',
85+
'--package-name', 'yapf',
86+
'--types=c',
87+
'--types-or=c',
88+
'--types-or=c++',
89+
))
90+
91+
assert exc_info.value.args[0] == 2
92+
93+
out, err = capsys.readouterr()
94+
assert out == ''
95+
assert 'argument --types-or: not allowed with argument --types' in err
96+
97+
98+
def test_main_types(mock_make_repo):
99+
assert not main.main((
100+
'.',
101+
'--language', 'python',
102+
'--package-name', 'yapf',
103+
'--types=c',
104+
))
105+
print(mock_make_repo.call_args[1])
106+
assert mock_make_repo.call_args[1]['match_key'] == 'types'
107+
assert mock_make_repo.call_args[1]['match_val'] == '[c]'
108+
assert mock_make_repo.call_args[1]['minimum_pre_commit_version'] == '0'
109+
110+
111+
def test_main_types_or_multi(mock_make_repo):
112+
assert not main.main((
113+
'.',
114+
'--language', 'python',
115+
'--package-name', 'yapf',
116+
'--types-or=c++',
117+
'--types-or=c',
118+
))
119+
print(mock_make_repo.call_args[1])
120+
assert mock_make_repo.call_args[1]['match_key'] == 'types_or'
121+
assert mock_make_repo.call_args[1]['match_val'] == '[c++, c]'
122+
assert mock_make_repo.call_args[1]['minimum_pre_commit_version'] == '2.9.2'

tests/make_repo_test.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ def test_commit_version(in_git_dir):
6666
version='0.24.1', language='ruby', name='scss-lint', entry='scss-lint',
6767
id='scss-lint', match_key='files', match_val=r'\.scss$', args='[]',
6868
additional_dependencies='[]', require_serial='false',
69+
minimum_pre_commit_version='0',
6970
)
7071

7172
# Assert that our things got copied over
@@ -86,6 +87,7 @@ def test_arguments(in_git_dir):
8687
version='0.6.2', language='python', name='yapf', entry='yapf',
8788
id='yapf', match_key='files', match_val=r'\.py$', args='["-i"]',
8889
additional_dependencies='["scikit-learn"]', require_serial='false',
90+
minimum_pre_commit_version='2.9.0',
8991
)
9092
contents = in_git_dir.join('.pre-commit-hooks.yaml').read()
9193
assert yaml.safe_load(contents) == [{
@@ -97,6 +99,7 @@ def test_arguments(in_git_dir):
9799
'args': ['-i'],
98100
'require_serial': False,
99101
'additional_dependencies': ['scikit-learn'],
102+
'minimum_pre_commit_version': '2.9.0',
100103
}]
101104

102105

@@ -112,7 +115,7 @@ def test_make_repo_starting_empty(in_git_dir, fake_versions):
112115
'.',
113116
language='ruby', name='scss-lint', entry='scss-lint', id='scss-lint',
114117
match_key='files', match_val=r'\.scss$', args='[]',
115-
require_serial='false',
118+
require_serial='false', minimum_pre_commit_version='0',
116119
)
117120

118121
# Assert that our things got copied over
@@ -144,7 +147,7 @@ def test_make_repo_starting_at_version(in_git_dir, fake_versions):
144147
'.',
145148
language='ruby', name='scss-lint', entry='scss-lint', id='scss-lint',
146149
match_key='files', match_val=r'\.scss$', args='[]',
147-
require_serial='false',
150+
require_serial='false', minimum_pre_commit_version='0',
148151
)
149152

150153
assert not in_git_dir.join('hooks.yaml').exists()
@@ -164,7 +167,7 @@ def test_ruby_integration(in_git_dir):
164167
'.',
165168
language='ruby', name='scss-lint', entry='scss-lint', id='scss-lint',
166169
match_key='files', match_val=r'\.scss$', args='[]',
167-
require_serial='false',
170+
require_serial='false', minimum_pre_commit_version='0',
168171
)
169172
# Our files should exist
170173
assert in_git_dir.join('.version').exists()
@@ -184,7 +187,7 @@ def test_node_integration(in_git_dir):
184187
'.',
185188
language='node', name='jshint', entry='jshint', id='jshint',
186189
match_key='files', match_val=r'\.js$', args='[]',
187-
require_serial='false',
190+
require_serial='false', minimum_pre_commit_version='0',
188191
)
189192
# Our files should exist
190193
assert in_git_dir.join('.version').exists()
@@ -204,7 +207,7 @@ def test_python_integration(in_git_dir):
204207
'.',
205208
language='python', name='flake8', entry='flake8', id='flake8',
206209
match_key='files', match_val=r'\.py$', args='[]',
207-
require_serial='false',
210+
require_serial='false', minimum_pre_commit_version='0',
208211
)
209212
# Our files should exist
210213
assert in_git_dir.join('.version').exists()
@@ -228,6 +231,7 @@ def test_rust_integration(in_git_dir):
228231
language='rust', name='shellharden', entry='shellharden',
229232
id='shellharden', match_key='types', match_val='shell',
230233
args='["--replace"]', require_serial='false',
234+
minimum_pre_commit_version='0',
231235
)
232236
# Our files should exist
233237
assert in_git_dir.join('.version').exists()

0 commit comments

Comments
 (0)