Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion testing/resources/ruby_hooks_repo/.gitignore

This file was deleted.

5 changes: 0 additions & 5 deletions testing/resources/ruby_hooks_repo/.pre-commit-hooks.yaml

This file was deleted.

3 changes: 0 additions & 3 deletions testing/resources/ruby_hooks_repo/bin/ruby_hook

This file was deleted.

Empty file.
9 changes: 0 additions & 9 deletions testing/resources/ruby_hooks_repo/ruby_hook.gemspec

This file was deleted.

1 change: 0 additions & 1 deletion testing/resources/ruby_versioned_hooks_repo/.gitignore

This file was deleted.

This file was deleted.

4 changes: 0 additions & 4 deletions testing/resources/ruby_versioned_hooks_repo/bin/ruby_hook

This file was deleted.

Empty file.
9 changes: 0 additions & 9 deletions testing/resources/ruby_versioned_hooks_repo/ruby_hook.gemspec

This file was deleted.

125 changes: 87 additions & 38 deletions tests/languages/ruby_test.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
from __future__ import annotations

import os.path
import tarfile
from unittest import mock

import pytest

import pre_commit.constants as C
from pre_commit import parse_shebang
from pre_commit.envcontext import envcontext
from pre_commit.languages import ruby
from pre_commit.prefix import Prefix
from pre_commit.util import cmd_output
from pre_commit.store import _make_local_repo
from pre_commit.util import resource_bytesio
from testing.language_helpers import run_language
from testing.util import cwd
from testing.util import xfailif_windows


Expand All @@ -34,56 +35,104 @@ def test_uses_system_if_both_gem_and_ruby_are_available(find_exe_mck):
assert ACTUAL_GET_DEFAULT_VERSION() == 'system'


@pytest.fixture
def fake_gem_prefix(tmpdir):
@pytest.mark.parametrize(
'filename',
('rbenv.tar.gz', 'ruby-build.tar.gz', 'ruby-download.tar.gz'),
)
def test_archive_root_stat(filename):
with resource_bytesio(filename) as f:
with tarfile.open(fileobj=f) as tarf:
root, _, _ = filename.partition('.')
assert oct(tarf.getmember(root).mode) == '0o755'


def _setup_hello_world(tmp_path):
bin_dir = tmp_path.joinpath('bin')
bin_dir.mkdir()
bin_dir.joinpath('ruby_hook').write_text(
'#!/usr/bin/env ruby\n'
"puts 'Hello world from a ruby hook'\n",
)
gemspec = '''\
Gem::Specification.new do |s|
s.name = 'pre_commit_placeholder_package'
s.version = '0.0.0'
s.summary = 'placeholder gem for pre-commit hooks'
s.name = 'ruby_hook'
s.version = '0.1.0'
s.authors = ['Anthony Sottile']
s.summary = 'A ruby hook!'
s.description = 'A ruby hook!'
s.files = ['bin/ruby_hook']
s.executables = ['ruby_hook']
end
'''
tmpdir.join('placeholder_gem.gemspec').write(gemspec)
yield Prefix(tmpdir)
tmp_path.joinpath('ruby_hook.gemspec').write_text(gemspec)


@xfailif_windows # pragma: win32 no cover
def test_install_ruby_system(fake_gem_prefix):
ruby.install_environment(fake_gem_prefix, 'system', ())
def test_ruby_hook_system(tmp_path):
assert ruby.get_default_version() == 'system'

_setup_hello_world(tmp_path)

ret = run_language(tmp_path, ruby, 'ruby_hook')
assert ret == (0, b'Hello world from a ruby hook\n')

# Should be able to activate and use rbenv install
with ruby.in_env(fake_gem_prefix, 'system'):
_, out, _ = cmd_output('gem', 'list')
assert 'pre_commit_placeholder_package' in out

def test_ruby_with_user_install_set(tmp_path):
gemrc = tmp_path.joinpath('gemrc')
gemrc.write_text('gem: --user-install\n')

with envcontext((('GEMRC', str(gemrc)),)):
test_ruby_hook_system(tmp_path)


def test_ruby_additional_deps(tmp_path):
_make_local_repo(tmp_path)

ret = run_language(
tmp_path,
ruby,
'ruby -e',
args=('require "tins"',),
deps=('tins',),
)
assert ret == (0, b'')


@xfailif_windows # pragma: win32 no cover
def test_install_ruby_default(fake_gem_prefix):
ruby.install_environment(fake_gem_prefix, C.DEFAULT, ())
# Should have created rbenv directory
assert os.path.exists(fake_gem_prefix.path('rbenv-default'))
def test_ruby_hook_default(tmp_path):
_setup_hello_world(tmp_path)

# Should be able to activate using our script and access rbenv
with ruby.in_env(fake_gem_prefix, 'default'):
cmd_output('rbenv', '--help')
out, ret = run_language(tmp_path, ruby, 'rbenv --help', version='default')
assert out == 0
assert ret.startswith(b'Usage: rbenv ')


@xfailif_windows # pragma: win32 no cover
def test_install_ruby_with_version(fake_gem_prefix):
ruby.install_environment(fake_gem_prefix, '3.2.0', ())
def test_ruby_hook_language_version(tmp_path):
_setup_hello_world(tmp_path)
tmp_path.joinpath('bin', 'ruby_hook').write_text(
'#!/usr/bin/env ruby\n'
'puts RUBY_VERSION\n'
"puts 'Hello world from a ruby hook'\n",
)

# Should be able to activate and use rbenv install
with ruby.in_env(fake_gem_prefix, '3.2.0'):
cmd_output('rbenv', 'install', '--help')
ret = run_language(tmp_path, ruby, 'ruby_hook', version='3.2.0')
assert ret == (0, b'3.2.0\nHello world from a ruby hook\n')


@pytest.mark.parametrize(
'filename',
('rbenv.tar.gz', 'ruby-build.tar.gz', 'ruby-download.tar.gz'),
)
def test_archive_root_stat(filename):
with resource_bytesio(filename) as f:
with tarfile.open(fileobj=f) as tarf:
root, _, _ = filename.partition('.')
assert oct(tarf.getmember(root).mode) == '0o755'
@xfailif_windows # pragma: win32 no cover
def test_ruby_with_bundle_disable_shared_gems(tmp_path):
workdir = tmp_path.joinpath('workdir')
workdir.mkdir()
# this Gemfile is missing `source`
workdir.joinpath('Gemfile').write_text('gem "lol_hai"\n')
# this bundle config causes things to be written elsewhere
bundle = workdir.joinpath('.bundle')
bundle.mkdir()
bundle.joinpath('config').write_text(
'BUNDLE_DISABLE_SHARED_GEMS: true\n'
'BUNDLE_PATH: vendor/gem\n',
)

with cwd(workdir):
# `3.2.0` has new enough `gem` requiring `source` and reading `.bundle`
test_ruby_hook_language_version(tmp_path)
58 changes: 0 additions & 58 deletions tests/repository_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
from pre_commit.languages import helpers
from pre_commit.languages import node
from pre_commit.languages import python
from pre_commit.languages import ruby
from pre_commit.languages.all import languages
from pre_commit.prefix import Prefix
from pre_commit.repository import _hook_installed
Expand All @@ -33,7 +32,6 @@
from testing.util import cwd
from testing.util import get_resource_path
from testing.util import skipif_cant_run_docker
from testing.util import xfailif_windows


def _norm_out(b):
Expand Down Expand Up @@ -227,52 +225,6 @@ def test_node_hook_with_npm_userconfig_set(tempdir_factory, store, tmpdir):
test_run_a_node_hook(tempdir_factory, store)


def test_run_a_ruby_hook(tempdir_factory, store):
_test_hook_repo(
tempdir_factory, store, 'ruby_hooks_repo',
'ruby_hook', [os.devnull], b'Hello world from a ruby hook\n',
)


def test_run_a_ruby_hook_with_user_install_set(tempdir_factory, store, tmpdir):
gemrc = tmpdir.join('gemrc')
gemrc.write('gem: --user-install\n')
with envcontext((('GEMRC', str(gemrc)),)):
test_run_a_ruby_hook(tempdir_factory, store)


@xfailif_windows # pragma: win32 no cover
def test_run_versioned_ruby_hook(tempdir_factory, store):
_test_hook_repo(
tempdir_factory, store, 'ruby_versioned_hooks_repo',
'ruby_hook',
[os.devnull],
b'3.2.0\nHello world from a ruby hook\n',
)


@xfailif_windows # pragma: win32 no cover
def test_run_ruby_hook_with_disable_shared_gems(
tempdir_factory,
store,
tmpdir,
):
"""Make sure a Gemfile in the project doesn't interfere."""
tmpdir.join('Gemfile').write('gem "lol_hai"')
tmpdir.join('.bundle').mkdir()
tmpdir.join('.bundle', 'config').write(
'BUNDLE_DISABLE_SHARED_GEMS: true\n'
'BUNDLE_PATH: vendor/gem\n',
)
with cwd(tmpdir.strpath):
_test_hook_repo(
tempdir_factory, store, 'ruby_versioned_hooks_repo',
'ruby_hook',
[os.devnull],
b'3.2.0\nHello world from a ruby hook\n',
)


def test_system_hook_with_spaces(tempdir_factory, store):
_test_hook_repo(
tempdir_factory, store, 'system_hook_with_spaces_repo',
Expand Down Expand Up @@ -530,16 +482,6 @@ def test_repository_state_compatibility(tempdir_factory, store, v):
assert _hook_installed(hook) is True


def test_additional_ruby_dependencies_installed(tempdir_factory, store):
path = make_repo(tempdir_factory, 'ruby_hooks_repo')
config = make_config_from_repo(path)
config['hooks'][0]['additional_dependencies'] = ['tins']
hook = _get_hook(config, store, 'ruby_hook')
with ruby.in_env(hook.prefix, hook.language_version):
output = cmd_output('gem', 'list', '--local')[1]
assert 'tins' in output


def test_additional_node_dependencies_installed(tempdir_factory, store):
path = make_repo(tempdir_factory, 'node_hooks_repo')
config = make_config_from_repo(path)
Expand Down