summaryrefslogtreecommitdiffstats
path: root/testing/util.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/util.py')
-rw-r--r--testing/util.py113
1 files changed, 113 insertions, 0 deletions
diff --git a/testing/util.py b/testing/util.py
new file mode 100644
index 0000000..439bee7
--- /dev/null
+++ b/testing/util.py
@@ -0,0 +1,113 @@
+import contextlib
+import os.path
+import subprocess
+
+import pytest
+
+from pre_commit import parse_shebang
+from pre_commit.languages.docker import docker_is_running
+from pre_commit.util import cmd_output
+from testing.auto_namedtuple import auto_namedtuple
+
+
+TESTING_DIR = os.path.abspath(os.path.dirname(__file__))
+
+
+def get_resource_path(path):
+ return os.path.join(TESTING_DIR, 'resources', path)
+
+
+def cmd_output_mocked_pre_commit_home(
+ *args, tempdir_factory, pre_commit_home=None, env=None, **kwargs,
+):
+ if pre_commit_home is None:
+ pre_commit_home = tempdir_factory.get()
+ env = env if env is not None else os.environ
+ kwargs.setdefault('stderr', subprocess.STDOUT)
+ # Don't want to write to the home directory
+ env = dict(env, PRE_COMMIT_HOME=pre_commit_home)
+ ret, out, _ = cmd_output(*args, env=env, **kwargs)
+ return ret, out.replace('\r\n', '\n'), None
+
+
+skipif_cant_run_docker = pytest.mark.skipif(
+ os.name == 'nt' or not docker_is_running(),
+ reason="Docker isn't running or can't be accessed",
+)
+skipif_cant_run_swift = pytest.mark.skipif(
+ parse_shebang.find_executable('swift') is None,
+ reason="swift isn't installed or can't be found",
+)
+xfailif_windows_no_ruby = pytest.mark.xfail(
+ os.name == 'nt',
+ reason='Ruby support not yet implemented on windows.',
+)
+xfailif_windows = pytest.mark.xfail(os.name == 'nt', reason='windows')
+
+
+def supports_venv(): # pragma: no cover (platform specific)
+ try:
+ __import__('ensurepip')
+ __import__('venv')
+ return True
+ except ImportError:
+ return False
+
+
+xfailif_no_venv = pytest.mark.xfail(
+ not supports_venv(), reason='Does not support venv module',
+)
+
+
+def run_opts(
+ all_files=False,
+ files=(),
+ color=False,
+ verbose=False,
+ hook=None,
+ from_ref='',
+ to_ref='',
+ remote_name='',
+ remote_url='',
+ hook_stage='commit',
+ show_diff_on_failure=False,
+ commit_msg_filename='',
+ checkout_type='',
+):
+ # These are mutually exclusive
+ assert not (all_files and files)
+ return auto_namedtuple(
+ all_files=all_files,
+ files=files,
+ color=color,
+ verbose=verbose,
+ hook=hook,
+ from_ref=from_ref,
+ to_ref=to_ref,
+ remote_name=remote_name,
+ remote_url=remote_url,
+ hook_stage=hook_stage,
+ show_diff_on_failure=show_diff_on_failure,
+ commit_msg_filename=commit_msg_filename,
+ checkout_type=checkout_type,
+ )
+
+
+@contextlib.contextmanager
+def cwd(path):
+ original_cwd = os.getcwd()
+ os.chdir(path)
+ try:
+ yield
+ finally:
+ os.chdir(original_cwd)
+
+
+def git_commit(*args, fn=cmd_output, msg='commit!', **kwargs):
+ kwargs.setdefault('stderr', subprocess.STDOUT)
+
+ cmd = ('git', 'commit', '--allow-empty', '--no-gpg-sign', '-a') + args
+ if msg is not None: # allow skipping `-m` with `msg=None`
+ cmd += ('-m', msg)
+ ret, out, _ = fn(*cmd, **kwargs)
+ return ret, out.replace('\r\n', '\n')