diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index 7cf6cfae..00000000 --- a/.coveragerc +++ /dev/null @@ -1,37 +0,0 @@ -[run] -branch = True -source = . -omit = - .tox/* - /usr/* - setup.py - # Don't complain if non-runnable code isn't run - */__main__.py - pre_commit/resources/* - -[report] -show_missing = True -skip_covered = True -exclude_lines = - # Have to re-enable the standard pragma - \#\s*pragma: no cover - # We optionally substitute this - ${COVERAGE_IGNORE_WINDOWS} - - # Don't complain if tests don't hit defensive assertion code: - ^\s*raise AssertionError\b - ^\s*raise NotImplementedError\b - ^\s*return NotImplemented\b - ^\s*raise$ - - # Ignore typing-related things - ^if (False|TYPE_CHECKING): - : \.\.\.$ - - # Don't complain if non-runnable code isn't run: - ^if __name__ == ['"]__main__['"]:$ - -[html] -directory = coverage-html - -# vim:ft=dosini diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c51b4a5f..9b385b4c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -18,9 +18,6 @@ jobs: parameters: toxenvs: [py37] os: windows - additional_variables: - COVERAGE_IGNORE_WINDOWS: '# pragma: windows no cover' - TOX_TESTENV_PASSENV: COVERAGE_IGNORE_WINDOWS pre_test: - powershell: Write-Host "##vso[task.prependpath]$env:CONDA\Scripts" displayName: Add conda to PATH diff --git a/pre_commit/color.py b/pre_commit/color.py index caf4cb08..5fa70421 100644 --- a/pre_commit/color.py +++ b/pre_commit/color.py @@ -50,7 +50,7 @@ if sys.platform == 'win32': # pragma: no cover (windows) terminal_supports_color = False else: terminal_supports_color = True -else: # pragma: windows no cover +else: # pragma: win32 no cover terminal_supports_color = True RED = '\033[41m' diff --git a/pre_commit/commands/install_uninstall.py b/pre_commit/commands/install_uninstall.py index 70118731..c8b7633b 100644 --- a/pre_commit/commands/install_uninstall.py +++ b/pre_commit/commands/install_uninstall.py @@ -46,7 +46,7 @@ def _hook_paths( def is_our_script(filename: str) -> bool: - if not os.path.exists(filename): # pragma: windows no cover (symlink) + if not os.path.exists(filename): # pragma: win32 no cover (symlink) return False with open(filename) as f: contents = f.read() diff --git a/pre_commit/file_lock.py b/pre_commit/file_lock.py index 241923c7..ff0dc5e6 100644 --- a/pre_commit/file_lock.py +++ b/pre_commit/file_lock.py @@ -47,7 +47,7 @@ if os.name == 'nt': # pragma: no cover (windows) # before closing a file or exiting the program." # TODO: https://github.com/python/typeshed/pull/3607 msvcrt.locking(fileno, msvcrt.LK_UNLCK, _region) # type: ignore -else: # pragma: windows no cover +else: # pragma: win32 no cover import fcntl @contextlib.contextmanager diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index 921401f5..f4495847 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -17,16 +17,16 @@ get_default_version = helpers.basic_get_default_version healthy = helpers.basic_healthy -def md5(s: str) -> str: # pragma: windows no cover +def md5(s: str) -> str: # pragma: win32 no cover return hashlib.md5(s.encode()).hexdigest() -def docker_tag(prefix: Prefix) -> str: # pragma: windows no cover +def docker_tag(prefix: Prefix) -> str: # pragma: win32 no cover md5sum = md5(os.path.basename(prefix.prefix_dir)).lower() return f'pre-commit-{md5sum}' -def docker_is_running() -> bool: # pragma: windows no cover +def docker_is_running() -> bool: # pragma: win32 no cover try: cmd_output_b('docker', 'ps') except CalledProcessError: @@ -35,7 +35,7 @@ def docker_is_running() -> bool: # pragma: windows no cover return True -def assert_docker_available() -> None: # pragma: windows no cover +def assert_docker_available() -> None: # pragma: win32 no cover assert docker_is_running(), ( 'Docker is either not running or not configured in this environment' ) @@ -45,7 +45,7 @@ def build_docker_image( prefix: Prefix, *, pull: bool, -) -> None: # pragma: windows no cover +) -> None: # pragma: win32 no cover cmd: Tuple[str, ...] = ( 'docker', 'build', '--tag', docker_tag(prefix), @@ -60,7 +60,7 @@ def build_docker_image( def install_environment( prefix: Prefix, version: str, additional_dependencies: Sequence[str], -) -> None: # pragma: windows no cover +) -> None: # pragma: win32 no cover helpers.assert_version_default('docker', version) helpers.assert_no_additional_deps('docker', additional_dependencies) assert_docker_available() @@ -76,14 +76,14 @@ def install_environment( os.mkdir(directory) -def get_docker_user() -> str: # pragma: windows no cover +def get_docker_user() -> str: # pragma: win32 no cover try: return f'{os.getuid()}:{os.getgid()}' except AttributeError: return '1000:1000' -def docker_cmd() -> Tuple[str, ...]: # pragma: windows no cover +def docker_cmd() -> Tuple[str, ...]: # pragma: win32 no cover return ( 'docker', 'run', '--rm', @@ -100,7 +100,7 @@ def run_hook( hook: Hook, file_args: Sequence[str], color: bool, -) -> Tuple[int, bytes]: # pragma: windows no cover +) -> Tuple[int, bytes]: # pragma: win32 no cover assert_docker_available() # Rebuild the docker image in case it has gone missing, as many people do # automated cleanup of docker images. diff --git a/pre_commit/languages/docker_image.py b/pre_commit/languages/docker_image.py index 980c6ef3..0c51df62 100644 --- a/pre_commit/languages/docker_image.py +++ b/pre_commit/languages/docker_image.py @@ -16,7 +16,7 @@ def run_hook( hook: Hook, file_args: Sequence[str], color: bool, -) -> Tuple[int, bytes]: # pragma: windows no cover +) -> Tuple[int, bytes]: # pragma: win32 no cover assert_docker_available() cmd = docker_cmd() + hook.cmd return helpers.run_xargs(hook, cmd, file_args, color=color) diff --git a/pre_commit/languages/node.py b/pre_commit/languages/node.py index 787bcd72..79ff807a 100644 --- a/pre_commit/languages/node.py +++ b/pre_commit/languages/node.py @@ -35,7 +35,7 @@ def get_env_patch(venv: str) -> PatchesT: elif sys.platform == 'win32': # pragma: no cover install_prefix = bin_dir(venv) lib_dir = 'Scripts' - else: # pragma: windows no cover + else: # pragma: win32 no cover install_prefix = venv lib_dir = 'lib' return ( diff --git a/pre_commit/languages/ruby.py b/pre_commit/languages/ruby.py index 26bd5be4..61241f85 100644 --- a/pre_commit/languages/ruby.py +++ b/pre_commit/languages/ruby.py @@ -25,7 +25,7 @@ healthy = helpers.basic_healthy def get_env_patch( venv: str, language_version: str, -) -> PatchesT: # pragma: windows no cover +) -> PatchesT: # pragma: win32 no cover patches: PatchesT = ( ('GEM_HOME', os.path.join(venv, 'gems')), ('RBENV_ROOT', venv), @@ -43,7 +43,7 @@ def get_env_patch( return patches -@contextlib.contextmanager # pragma: windows no cover +@contextlib.contextmanager # pragma: win32 no cover def in_env( prefix: Prefix, language_version: str, @@ -64,7 +64,7 @@ def _extract_resource(filename: str, dest: str) -> None: def _install_rbenv( prefix: Prefix, version: str = C.DEFAULT, -) -> None: # pragma: windows no cover +) -> None: # pragma: win32 no cover directory = helpers.environment_dir(ENVIRONMENT_DIR, version) _extract_resource('rbenv.tar.gz', prefix.path('.')) @@ -80,7 +80,7 @@ def _install_rbenv( def _install_ruby( prefix: Prefix, version: str, -) -> None: # pragma: windows no cover +) -> None: # pragma: win32 no cover try: helpers.run_setup_cmd(prefix, ('rbenv', 'download', version)) except CalledProcessError: # pragma: no cover (usually find with download) @@ -90,7 +90,7 @@ def _install_ruby( def install_environment( prefix: Prefix, version: str, additional_dependencies: Sequence[str], -) -> None: # pragma: windows no cover +) -> None: # pragma: win32 no cover additional_dependencies = tuple(additional_dependencies) directory = helpers.environment_dir(ENVIRONMENT_DIR, version) with clean_path_on_failure(prefix.path(directory)): @@ -121,6 +121,6 @@ def run_hook( hook: Hook, file_args: Sequence[str], color: bool, -) -> Tuple[int, bytes]: # pragma: windows no cover +) -> Tuple[int, bytes]: # pragma: win32 no cover with in_env(hook.prefix, hook.language_version): return helpers.run_xargs(hook, hook.cmd, file_args, color=color) diff --git a/pre_commit/languages/swift.py b/pre_commit/languages/swift.py index a022bcee..66aadc8b 100644 --- a/pre_commit/languages/swift.py +++ b/pre_commit/languages/swift.py @@ -21,12 +21,12 @@ BUILD_DIR = '.build' BUILD_CONFIG = 'release' -def get_env_patch(venv: str) -> PatchesT: # pragma: windows no cover +def get_env_patch(venv: str) -> PatchesT: # pragma: win32 no cover bin_path = os.path.join(venv, BUILD_DIR, BUILD_CONFIG) return (('PATH', (bin_path, os.pathsep, Var('PATH'))),) -@contextlib.contextmanager # pragma: windows no cover +@contextlib.contextmanager # pragma: win32 no cover def in_env(prefix: Prefix) -> Generator[None, None, None]: envdir = prefix.path( helpers.environment_dir(ENVIRONMENT_DIR, C.DEFAULT), @@ -37,7 +37,7 @@ def in_env(prefix: Prefix) -> Generator[None, None, None]: def install_environment( prefix: Prefix, version: str, additional_dependencies: Sequence[str], -) -> None: # pragma: windows no cover +) -> None: # pragma: win32 no cover helpers.assert_version_default('swift', version) helpers.assert_no_additional_deps('swift', additional_dependencies) directory = prefix.path( @@ -59,6 +59,6 @@ def run_hook( hook: Hook, file_args: Sequence[str], color: bool, -) -> Tuple[int, bytes]: # pragma: windows no cover +) -> Tuple[int, bytes]: # pragma: win32 no cover with in_env(hook.prefix): return helpers.run_xargs(hook, hook.cmd, file_args, color=color) diff --git a/pre_commit/parse_shebang.py b/pre_commit/parse_shebang.py index 7b9a0582..d344a1da 100644 --- a/pre_commit/parse_shebang.py +++ b/pre_commit/parse_shebang.py @@ -59,7 +59,7 @@ def normexe(orig: str) -> str: _error('is a directory') elif not os.path.isfile(orig): _error('not found') - elif not os.access(orig, os.X_OK): # pragma: windows no cover + elif not os.access(orig, os.X_OK): # pragma: win32 no cover _error('is not executable') else: return orig diff --git a/pre_commit/util.py b/pre_commit/util.py index 65775710..7da41c44 100644 --- a/pre_commit/util.py +++ b/pre_commit/util.py @@ -149,7 +149,7 @@ def cmd_output(*cmd: str, **kwargs: Any) -> Tuple[int, str, Optional[str]]: return returncode, stdout, stderr -if os.name != 'nt': # pragma: windows no cover +if os.name != 'nt': # pragma: win32 no cover from os import openpty import termios diff --git a/requirements-dev.txt b/requirements-dev.txt index 9dfea92d..d6a13dc4 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,5 +1,4 @@ --e . - +covdefaults coverage pytest pytest-env diff --git a/setup.cfg b/setup.cfg index 4536e9e7..8cdf960e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -52,6 +52,10 @@ exclude = [bdist_wheel] universal = True +[coverage:run] +plugins = covdefaults +omit = pre_commit/resources/* + [mypy] check_untyped_defs = true disallow_any_generics = true diff --git a/tests/commands/install_uninstall_test.py b/tests/commands/install_uninstall_test.py index 2f6c49fb..66b91903 100644 --- a/tests/commands/install_uninstall_test.py +++ b/tests/commands/install_uninstall_test.py @@ -25,7 +25,6 @@ from testing.fixtures import write_config from testing.util import cmd_output_mocked_pre_commit_home from testing.util import cwd from testing.util import git_commit -from testing.util import xfailif_windows def test_is_not_script(): @@ -823,7 +822,6 @@ def test_prepare_commit_msg_legacy( assert 'Signed off by: ' in f.read() -@xfailif_windows # pragma: windows no cover (once AP has git 2.24) def test_pre_merge_commit_integration(tempdir_factory, store): expected = re.compile( r'^\[INFO\] Initializing environment for .+\n' diff --git a/tests/languages/python_test.py b/tests/languages/python_test.py index 19890d74..245c73a0 100644 --- a/tests/languages/python_test.py +++ b/tests/languages/python_test.py @@ -11,10 +11,10 @@ from pre_commit.prefix import Prefix def test_norm_version_expanduser(): home = os.path.expanduser('~') - if os.name == 'nt': # pragma: no cover (nt) + if os.name == 'nt': # pragma: nt cover path = r'~\python343' expected_path = fr'{home}\python343' - else: # pragma: windows no cover + else: # pragma: nt no cover path = '~/.pyenv/versions/3.4.3/bin/python' expected_path = f'{home}/.pyenv/versions/3.4.3/bin/python' result = python.norm_version(path) diff --git a/tests/parse_shebang_test.py b/tests/parse_shebang_test.py index 62eb81e5..0bb19c78 100644 --- a/tests/parse_shebang_test.py +++ b/tests/parse_shebang_test.py @@ -93,7 +93,7 @@ def test_normexe_does_not_exist_sep(): @pytest.mark.xfail(os.name == 'nt', reason='posix only') -def test_normexe_not_executable(tmpdir): # pragma: windows no cover +def test_normexe_not_executable(tmpdir): # pragma: win32 no cover tmpdir.join('exe').ensure() with tmpdir.as_cwd(), pytest.raises(OSError) as excinfo: parse_shebang.normexe('./exe') diff --git a/tests/repository_test.py b/tests/repository_test.py index 2d36df88..df7e7d1b 100644 --- a/tests/repository_test.py +++ b/tests/repository_test.py @@ -197,7 +197,7 @@ def test_versioned_python_hook(tempdir_factory, store): ) -@skipif_cant_run_docker # pragma: windows no cover +@skipif_cant_run_docker # pragma: win32 no cover def test_run_a_docker_hook(tempdir_factory, store): _test_hook_repo( tempdir_factory, store, 'docker_hooks_repo', @@ -206,7 +206,7 @@ def test_run_a_docker_hook(tempdir_factory, store): ) -@skipif_cant_run_docker # pragma: windows no cover +@skipif_cant_run_docker # pragma: win32 no cover def test_run_a_docker_hook_with_entry_args(tempdir_factory, store): _test_hook_repo( tempdir_factory, store, 'docker_hooks_repo', @@ -215,7 +215,7 @@ def test_run_a_docker_hook_with_entry_args(tempdir_factory, store): ) -@skipif_cant_run_docker # pragma: windows no cover +@skipif_cant_run_docker # pragma: win32 no cover def test_run_a_failing_docker_hook(tempdir_factory, store): _test_hook_repo( tempdir_factory, store, 'docker_hooks_repo', @@ -226,7 +226,7 @@ def test_run_a_failing_docker_hook(tempdir_factory, store): ) -@skipif_cant_run_docker # pragma: windows no cover +@skipif_cant_run_docker # pragma: win32 no cover @pytest.mark.parametrize('hook_id', ('echo-entrypoint', 'echo-cmd')) def test_run_a_docker_image_hook(tempdir_factory, store, hook_id): _test_hook_repo( @@ -297,7 +297,7 @@ def test_system_hook_with_spaces(tempdir_factory, store): ) -@skipif_cant_run_swift # pragma: windows no cover +@skipif_cant_run_swift # pragma: win32 no cover def test_swift_hook(tempdir_factory, store): _test_hook_repo( tempdir_factory, store, 'swift_hooks_repo', @@ -514,7 +514,7 @@ def test_additional_dependencies_roll_forward(tempdir_factory, store): assert 'mccabe' not in cmd_output('pip', 'freeze', '-l')[1] -@xfailif_windows_no_ruby # pragma: windows no cover +@xfailif_windows_no_ruby # pragma: win32 no cover def test_additional_ruby_dependencies_installed(tempdir_factory, store): path = make_repo(tempdir_factory, 'ruby_hooks_repo') config = make_config_from_repo(path) @@ -758,7 +758,7 @@ def local_python_config(): return {'repo': 'local', 'hooks': hooks} -@pytest.mark.xfail( # pragma: windows no cover +@pytest.mark.xfail( # pragma: win32 no cover sys.platform == 'win32', reason='microsoft/azure-pipelines-image-generation#989', ) diff --git a/tox.ini b/tox.ini index 7fd0bf6a..d9f9420c 100644 --- a/tox.ini +++ b/tox.ini @@ -7,7 +7,7 @@ passenv = HOME LOCALAPPDATA RUSTUP_HOME commands = coverage erase coverage run -m pytest {posargs:tests} - coverage report --fail-under 100 + coverage report pre-commit install [testenv:pre-commit]