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: 1 addition & 0 deletions lib/tapioca/commands/abstract_gem.rb
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ def initialize(
@include_doc = include_doc #: bool
@include_loc = include_loc #: bool
@include_exported_rbis = include_exported_rbis
@skipped_gems = [] #: Array[String]
@halt_upon_load_error = halt_upon_load_error
end

Expand Down
24 changes: 20 additions & 4 deletions lib/tapioca/commands/gem_generate.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,18 @@ def execute
end
end

unless @skipped_gems.empty?
say("\nNote: Tapioca skipped RBI generation for the following gems because they are ignored by default:", [:yellow, :bold])
say(@skipped_gems.join(", "), [:yellow, :bold])
end

user_excluded_gems = @gem_names & @exclude

unless user_excluded_gems.empty?
say("\nNote: Tapioca skipped RBI generation for the following gems because they were excluded:", [:yellow, :bold])
say(user_excluded_gems.join(", "), [:yellow, :bold])
end

if anything_done
validate_rbi_files(
command: default_command(:gem, @gem_names.join(" ")),
Expand All @@ -56,11 +68,15 @@ def gems_to_generate(gem_names)
gem = @bundle.gem(gem_name)

if gem.nil?
next if @lsp_addon

raise Tapioca::Error, set_color("Error: Cannot find gem '#{gem_name}'", :red)
if @lsp_addon
next
elsif Gemfile::GemSpec::IGNORED_GEMS.include?(gem_name)
@skipped_gems << gem_name
next
else
raise Tapioca::Error, set_color("Error: Cannot find gem '#{gem_name}'", :red)
end
end

gems.concat(gem_dependencies(gem)) if @include_dependencies
gems << gem
end
Expand Down
81 changes: 81 additions & 0 deletions spec/tapioca/cli/gem_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -877,6 +877,87 @@ class Secret; end
assert_success_status(result)
end

it "reports explicitly requested ignored gems" do
Comment thread
written-fresh marked this conversation as resolved.
result = @project.tapioca("gem sorbet", exclude: [])

assert_stdout_includes(result, <<~OUT)
Note: Tapioca skipped RBI generation for the following gems because they are ignored by default:
sorbet
OUT
refute_includes(result.out, "Compiled sorbet")

assert_empty_stderr(result)
assert_success_status(result)
end

it "reports gems excluded by built-in and user configuration" do
result = @project.tapioca("gem sorbet rbi --exclude rbi")

assert_stdout_includes(result, <<~OUT)
Note: Tapioca skipped RBI generation for the following gems because they are ignored by default:
sorbet
OUT
assert_stdout_includes(result, <<~OUT)
Note: Tapioca skipped RBI generation for the following gems because they were excluded:
rbi
OUT
refute_includes(result.out, "Compiled rbi")

assert_empty_stderr(result)
assert_success_status(result)
end

it "reports gems excluded by user configuration" do
result = @project.tapioca("gem rbi --exclude rbi")

assert_stdout_includes(result, <<~OUT)
Note: Tapioca skipped RBI generation for the following gems because they were excluded:
rbi
OUT
refute_includes(result.out, "Compiled rbi")

assert_empty_stderr(result)
assert_success_status(result)
end

it "does not generate dependencies of explicitly excluded gems" do
@project.require_mock_gem(mock_gem("foo", "0.0.1", dependencies: ["bar"]))
@project.require_mock_gem(mock_gem("bar", "0.0.1"))
# Keep foo materialized after Bundler excludes it as a direct dependency.
@project.require_mock_gem(mock_gem("baz", "0.0.1", dependencies: ["foo"]))
@project.bundle_install!

result = @project.tapioca("gem foo --include-dependencies --exclude foo")

assert_stdout_includes(result, <<~OUT)
Note: Tapioca skipped RBI generation for the following gems because they were excluded:
foo
OUT
refute_includes(result.out, "Compiled foo")
refute_includes(result.out, "Compiled bar")

assert_empty_stderr(result)
assert_success_status(result)
end

it "does not report exclusions when no gems are explicitly requested" do
result = @project.tapioca("gem --exclude rbi")

refute_includes(result.out, "because they were excluded")

assert_empty_stderr(result)
assert_success_status(result)
end

it "does not report exclusions when all gems are requested" do
result = @project.tapioca("gem --all --exclude rbi")

refute_includes(result.out, "because they were excluded")

assert_empty_stderr(result)
assert_success_status(result)
end

it "fails with error when gem cannot be found" do
result = @project.tapioca("gem non_existent_gem")

Expand Down
Loading