Skip to content

Commit b4edf2c

Browse files
committed
Add tests for Rust
1 parent 2a37fcd commit b4edf2c

File tree

6 files changed

+74
-4
lines changed

6 files changed

+74
-4
lines changed

pre_commit/languages/rust.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ def in_env(prefix):
3939
def _add_dependencies(cargo_toml_path, additional_dependencies):
4040
with open(cargo_toml_path, 'r+') as f:
4141
cargo_toml = toml.load(f)
42+
cargo_toml.setdefault('dependencies', {})
4243
for dep in additional_dependencies:
4344
name, _, spec = dep.partition(':')
4445
cargo_toml['dependencies'][name] = spec or '*'
@@ -47,7 +48,7 @@ def _add_dependencies(cargo_toml_path, additional_dependencies):
4748
f.truncate()
4849

4950

50-
def install_environment(prefix, version, additional_deps):
51+
def install_environment(prefix, version, additional_dependencies):
5152
helpers.assert_version_default('rust', version)
5253
directory = prefix.path(
5354
helpers.environment_dir(ENVIRONMENT_DIR, 'default'),
@@ -63,14 +64,23 @@ def install_environment(prefix, version, additional_deps):
6364
#
6465
# Because of this, we allow specifying "cli" dependencies by prefixing
6566
# with 'cli:'.
66-
cli_deps = {dep for dep in additional_deps if dep.startswith('cli:')}
67-
lib_deps = set(additional_deps) - cli_deps
67+
cli_deps = {
68+
dep for dep in additional_dependencies if dep.startswith('cli:')
69+
}
70+
lib_deps = set(additional_dependencies) - cli_deps
6871

6972
if len(lib_deps) > 0:
7073
_add_dependencies(prefix.path('Cargo.toml'), lib_deps)
7174

7275
with clean_path_on_failure(directory):
73-
packages_to_install = {()} | {(dep[len('cli:'):],) for dep in cli_deps}
76+
packages_to_install = {()}
77+
for cli_dep in cli_deps:
78+
cli_dep = cli_dep[len('cli:'):]
79+
package, _, version = cli_dep.partition(':')
80+
if version != '':
81+
packages_to_install.add((package, '--version', version))
82+
else:
83+
packages_to_install.add((package,))
7484

7585
for package in packages_to_install:
7686
cmd_output(
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
- id: rust-hook
2+
name: rust example hook
3+
entry: rust-hello-world
4+
language: rust
5+
files: ''

testing/resources/rust_hooks_repo/Cargo.lock

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[package]
2+
name = "rust-hello-world"
3+
version = "0.1.0"
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fn main() {
2+
println!("hello world");
3+
}

tests/repository_test.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from pre_commit.languages import pcre
2121
from pre_commit.languages import python
2222
from pre_commit.languages import ruby
23+
from pre_commit.languages import rust
2324
from pre_commit.repository import Repository
2425
from pre_commit.util import cmd_output
2526
from testing.fixtures import config_with_local_hooks
@@ -282,6 +283,51 @@ def test_golang_hook(tempdir_factory, store):
282283
)
283284

284285

286+
@pytest.mark.integration
287+
def test_rust_hook(tempdir_factory, store):
288+
_test_hook_repo(
289+
tempdir_factory, store, 'rust_hooks_repo',
290+
'rust-hook', [], b'hello world\n',
291+
)
292+
293+
294+
@pytest.mark.integration
295+
@pytest.mark.parametrize('dep', ('cli:shellharden:3.1.0', 'cli:shellharden'))
296+
def test_additional_rust_cli_dependencies_installed(
297+
tempdir_factory, store, dep,
298+
):
299+
path = make_repo(tempdir_factory, 'rust_hooks_repo')
300+
config = make_config_from_repo(path)
301+
# A small rust package with no dependencies.
302+
config['hooks'][0]['additional_dependencies'] = [dep]
303+
repo = Repository.create(config, store)
304+
repo.require_installed()
305+
(prefix, _, _, _), = repo._venvs()
306+
binaries = os.listdir(prefix.path(
307+
helpers.environment_dir(rust.ENVIRONMENT_DIR, 'default'), 'bin',
308+
))
309+
assert 'shellharden' in binaries
310+
311+
312+
@pytest.mark.integration
313+
def test_additional_rust_lib_dependencies_installed(
314+
tempdir_factory, store,
315+
):
316+
path = make_repo(tempdir_factory, 'rust_hooks_repo')
317+
config = make_config_from_repo(path)
318+
# A small rust package with no dependencies.
319+
deps = ['shellharden:3.1.0']
320+
config['hooks'][0]['additional_dependencies'] = deps
321+
repo = Repository.create(config, store)
322+
repo.require_installed()
323+
(prefix, _, _, _), = repo._venvs()
324+
binaries = os.listdir(prefix.path(
325+
helpers.environment_dir(rust.ENVIRONMENT_DIR, 'default'), 'bin',
326+
))
327+
assert 'rust-hello-world' in binaries
328+
assert 'shellharden' not in binaries
329+
330+
285331
@pytest.mark.integration
286332
def test_missing_executable(tempdir_factory, store):
287333
_test_hook_repo(

0 commit comments

Comments
 (0)