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

Skip to content

Commit 9b92f96

Browse files
author
Ben Picolo
committed
Code cleanup and tests
1 parent 5f392f0 commit 9b92f96

7 files changed

Lines changed: 92 additions & 21 deletions

File tree

.travis.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ before_install:
2020
- git --version
2121
after_success:
2222
- coveralls
23-
sudo: false
23+
sudo: required
24+
services:
25+
- docker
2426
cache:
2527
directories:
2628
- $HOME/.cache/pip

CONTRIBUTING.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22

33
## Local development
44

5-
- The tests depend on having at least the following installed (possibly not
5+
- The complete test suite depends on having at least the following installed (possibly not
66
a complete list)
77
- git (A sufficiently newer version is required to run pre-push tests)
88
- python
99
- python3.4 (Required by a test which checks different python versions)
1010
- python3.5 (Required by a test which checks different python versions)
1111
- tox (or virtualenv)
1212
- ruby + gem
13+
- docker
1314

1415
### Setting up an environemnt
1516

@@ -63,7 +64,7 @@ function_call(
6364
```
6465

6566
Some notable features:
66-
- The intial parenthese is at the end of the line
67+
- The initial parenthesis is at the end of the line
6768
- Parameters are indented one indentation level further than the function name
6869
- The last parameter contains a trailing comma (This helps make `git blame`
6970
more accurate and reduces merge conflicts when adding / removing parameters).

pre_commit/languages/docker.py

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
1+
from __future__ import absolute_import
12
from __future__ import unicode_literals
23

34
import hashlib
45
import os
56

7+
from pre_commit import five
68
from pre_commit.languages import helpers
79
from pre_commit.util import clean_path_on_failure
810
from pre_commit.util import mkdirp
911
from pre_commit.xargs import xargs
1012

1113

1214
ENVIRONMENT_DIR = 'docker'
15+
PRE_COMMIT_LABEL = 'PRE_COMMIT'
1316

1417

1518
def md5(s):
16-
m = hashlib.md5()
17-
m.update(s)
18-
return m.hexdigest()
19+
return five.to_text(hashlib.md5(s).hexdigest())
1920

2021

2122
def docker_tag(repo_cmd_runner):
@@ -24,39 +25,62 @@ def docker_tag(repo_cmd_runner):
2425
).lower()
2526

2627

28+
def docker_is_running():
29+
return xargs(('docker',), ['ps'])[0] == 0
30+
31+
32+
def assert_docker_available():
33+
assert docker_is_running(), (
34+
'Docker is either not running or not configured in this environment'
35+
)
36+
37+
38+
def build_docker_image(repo_cmd_runner):
39+
cmd = (
40+
'docker', 'build', '--pull',
41+
'--tag', docker_tag(repo_cmd_runner),
42+
'--label', PRE_COMMIT_LABEL,
43+
'.'
44+
)
45+
helpers.run_setup_cmd(repo_cmd_runner, cmd)
46+
47+
2748
def install_environment(
2849
repo_cmd_runner,
2950
version='default',
3051
additional_dependencies=(),
3152
):
32-
assert repo_cmd_runner.exists('Dockerfile')
33-
# I don't know of anybody trying to juggle multiple docker installations
34-
# so this seems sufficient
53+
assert repo_cmd_runner.exists('Dockerfile'), (
54+
'No Dockerfile was found in the hook repository'
55+
)
56+
assert version == 'default', (
57+
'Pre-commit does not support language_version for docker '
58+
)
59+
assert_docker_available()
60+
3561
directory = helpers.environment_dir(ENVIRONMENT_DIR, 'default')
3662
mkdirp(os.path.join(repo_cmd_runner.path(), directory))
3763

38-
cmd = (
39-
'docker', 'build', '--pull',
40-
'--tag', docker_tag(repo_cmd_runner),
41-
'.'
42-
)
43-
4464
# Docker doesn't really have relevant disk environment, but pre-commit
4565
# still needs to cleanup it's state files on failure
4666
env_dir = repo_cmd_runner.path(directory)
4767
with clean_path_on_failure(env_dir):
48-
helpers.run_setup_cmd(repo_cmd_runner, cmd)
68+
build_docker_image(repo_cmd_runner)
4969

5070

5171
def run_hook(repo_cmd_runner, hook, file_args):
72+
assert_docker_available()
73+
# Rebuild the docker image in case it has gone missing, as many people do
74+
# automated cleanup of docker images.
75+
build_docker_image(repo_cmd_runner)
76+
# the docker lib doesn't return stdout on non-zero exit codes,
77+
# so we run the container directly on the command line
5278
cmd = (
5379
'docker', 'run',
54-
'-t',
80+
'--rm',
5581
'-v', '{}:/src'.format(os.getcwd()),
5682
'--workdir', '/src',
83+
'--entrypoint', hook['entry'],
5784
docker_tag(repo_cmd_runner)
5885
)
59-
60-
return xargs(
61-
cmd + (hook['entry'],) + tuple(hook['args']), file_args,
62-
)
86+
return xargs(cmd + tuple(hook['args']), file_args)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
FROM cogniteev/echo
2+
3+
CMD ["echo", "This is overwritten by the hooks.yaml 'entry'"]
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
- id: docker-hook
2+
name: Docker test hook
3+
entry: echo
4+
language: docker
5+
files: \.txt$
6+
7+
- id: docker-hook-failing
8+
name: Docker test hook with nonzero exit code
9+
entry: bork
10+
language: docker
11+
files: \.txt$

testing/util.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import jsonschema
77
import pytest
88

9+
from pre_commit.languages.docker import docker_is_running
910
from pre_commit.util import cmd_output
1011
from pre_commit.util import cwd
1112

@@ -57,6 +58,11 @@ def cmd_output_mocked_pre_commit_home(*args, **kwargs):
5758
return cmd_output(*args, env=env, **kwargs)
5859

5960

61+
skipif_cant_run_docker = pytest.mark.skipif(
62+
docker_is_running() is False,
63+
reason='Docker isn\'t running or can\'t be accessed'
64+
)
65+
6066
skipif_slowtests_false = pytest.mark.skipif(
6167
os.environ.get('slowtests') == 'false',
6268
reason='slowtests=false',

tests/repository_test.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from testing.fixtures import make_config_from_repo
3030
from testing.fixtures import make_repo
3131
from testing.fixtures import modify_manifest
32+
from testing.util import skipif_cant_run_docker
3233
from testing.util import skipif_slowtests_false
3334
from testing.util import xfailif_no_pcre_support
3435
from testing.util import xfailif_windows_no_node
@@ -129,6 +130,29 @@ def test_versioned_python_hook(tempdir_factory, store):
129130
)
130131

131132

133+
@skipif_slowtests_false
134+
@skipif_cant_run_docker
135+
@pytest.mark.integration
136+
def test_run_a_docker_hook(tempdir_factory, store):
137+
_test_hook_repo(
138+
tempdir_factory, store, 'docker_hooks_repo',
139+
'docker-hook',
140+
['Hello World from docker'], b'Hello World from docker\n',
141+
)
142+
143+
144+
@skipif_slowtests_false
145+
@skipif_cant_run_docker
146+
@pytest.mark.integration
147+
def test_run_a_failing_docker_hook(tempdir_factory, store):
148+
_test_hook_repo(
149+
tempdir_factory, store, 'docker_hooks_repo',
150+
'docker-hook-failing',
151+
['Hello World from docker'], b'',
152+
expected_return_code=1
153+
)
154+
155+
132156
@skipif_slowtests_false
133157
@xfailif_windows_no_node
134158
@pytest.mark.integration

0 commit comments

Comments
 (0)