diff --git a/lib/tapioca/commands/abstract_gem.rb b/lib/tapioca/commands/abstract_gem.rb index 83c52e355..baabaa1af 100644 --- a/lib/tapioca/commands/abstract_gem.rb +++ b/lib/tapioca/commands/abstract_gem.rb @@ -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 diff --git a/lib/tapioca/commands/gem_generate.rb b/lib/tapioca/commands/gem_generate.rb index 6362655e5..732c2c0cb 100644 --- a/lib/tapioca/commands/gem_generate.rb +++ b/lib/tapioca/commands/gem_generate.rb @@ -17,7 +17,9 @@ def execute halt_upon_load_error: @halt_upon_load_error, ) - gem_queue = gems_to_generate(@gem_names).reject { |gem| @exclude.include?(gem.name) } + gem_queue = gems_to_generate(@gem_names) + user_excluded_gems = user_excluded_gem_names(gem_queue) + gem_queue.reject! { |gem| @exclude.include?(gem.name) } anything_done = [ perform_removals, gem_queue.any?, @@ -44,6 +46,14 @@ def execute else say("No operations performed, all RBIs are up-to-date.", [:green, :bold]) end + unless @skipped_gems.empty? + say("\nNote: Tapioca is skipping gem rbi generation for following gems due to the built-in configuration:", [:yellow, :bold]) + say(@skipped_gems.join(", "), [:yellow, :bold]) + end + unless user_excluded_gems.empty? + say("\nNote: Tapioca is skipping gem rbi generation for following gems due to user configuration:", [:yellow, :bold]) + say(user_excluded_gems.join(", "), [:yellow, :bold]) + end ensure GitAttributes.create_generated_attribute_file(@outpath) end @@ -56,16 +66,28 @@ 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 end + #: (Array[Gemfile::GemSpec] gem_queue) -> Array[String] + def user_excluded_gem_names(gem_queue) + @exclude.uniq.select do |gem_name| + @bundle.gem(gem_name) && + (@gem_names.include?(gem_name) || gem_queue.any? { |gem| gem.name == gem_name }) + end + end + #: (Gemfile::GemSpec gem, ?Array[Gemfile::GemSpec] dependencies) -> Array[Gemfile::GemSpec] def gem_dependencies(gem, dependencies = []) direct_dependencies = gem.dependencies.filter_map { |dependency| @bundle.gem(dependency.name) } diff --git a/spec/tapioca/cli/gem_spec.rb b/spec/tapioca/cli/gem_spec.rb index 61484ad51..5b8be1f4d 100644 --- a/spec/tapioca/cli/gem_spec.rb +++ b/spec/tapioca/cli/gem_spec.rb @@ -877,6 +877,49 @@ class Secret; end assert_success_status(result) end + it "reports explicitly requested ignored gems" do + result = @project.tapioca("gem sorbet", exclude: []) + + assert_stdout_includes(result, <<~OUT) + Note: Tapioca is skipping gem rbi generation for following gems due to the built-in configuration: + 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 is skipping gem rbi generation for following gems due to the built-in configuration: + sorbet + OUT + assert_stdout_includes(result, <<~OUT) + Note: Tapioca is skipping gem rbi generation for following gems due to user configuration: + 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 is skipping gem rbi generation for following gems due to user configuration: + rbi + OUT + refute_includes(result.out, "Compiled rbi") + + 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")