From 92295fcd7153ab79f42bd0bb95f6e5e9fd7689af Mon Sep 17 00:00:00 2001 From: Soutaro Matsumoto Date: Tue, 18 Jul 2023 16:43:14 +0900 Subject: [PATCH] Spec may be missing when `rbs_collection.yaml` declares dependency --- .../collection/config/lockfile_generator.rb | 10 +++- test/rbs/collection/config_test.rb | 59 +++++++++++++++++++ 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/lib/rbs/collection/config/lockfile_generator.rb b/lib/rbs/collection/config/lockfile_generator.rb index 30bc0b5dc..f788ba04e 100644 --- a/lib/rbs/collection/config/lockfile_generator.rb +++ b/lib/rbs/collection/config/lockfile_generator.rb @@ -133,10 +133,14 @@ def generate end end - gem_hash[name].dependencies.each do |dep| - if spec = gem_hash[dep.name] - assign_gem(name: dep.name, version: spec.version, src_data: nil, ignored_gems: ignored_gems) + if spec = gem_hash.fetch(name, nil) + spec.dependencies.each do |dep| + if dep_spec = gem_hash[dep.name] + assign_gem(name: dep.name, version: dep_spec.version, src_data: nil, ignored_gems: ignored_gems) + end end + else + RBS.logger.warn "Cannot find `#{name}` gem. Using incorrect Bundler context? (#{definition.lockfile})" end end diff --git a/test/rbs/collection/config_test.rb b/test/rbs/collection/config_test.rb index 1809062b6..ce56664b5 100644 --- a/test/rbs/collection/config_test.rb +++ b/test/rbs/collection/config_test.rb @@ -702,6 +702,65 @@ def test_generate_lockfile_dependency_with_platform end end + def test_generate_lockfile__gems_not_included_in_gemfile + mktmpdir do |tmpdir| + config_path = tmpdir / 'rbs_collection.yaml' + config_path.write [CONFIG, <<~YAML].join("\n") + sources: + - type: git + name: ruby/gem_rbs_collection + remote: https://github.com/ruby/gem_rbs_collection.git + revision: cde6057e7546843ace6420c5783dd945c6ccda54 + repo_dir: gems + path: '.gem_rbs_collection' + gems: + - name: ast + YAML + gemfile_path = tmpdir / 'Gemfile' + gemfile_path.write <<~GEMFILE + source 'https://rubygems.org' + GEMFILE + gemfile_lock_path = tmpdir / 'Gemfile.lock' + gemfile_lock_path.write <<~GEMFILE_LOCK + GEM + remote: https://rubygems.org/ + specs: + + PLATFORMS + x86_64-linux + + DEPENDENCIES + + BUNDLED WITH + 2.2.0 + GEMFILE_LOCK + + definition = Bundler::Definition.build(gemfile_path, gemfile_lock_path, false) + _config, lockfile = RBS::Collection::Config.generate_lockfile(config_path: config_path, definition: definition) + string = YAML.dump(lockfile.to_lockfile) + + assert_config <<~YAML, string + sources: + - type: git + name: ruby/gem_rbs_collection + remote: https://github.com/ruby/gem_rbs_collection.git + revision: cde6057e7546843ace6420c5783dd945c6ccda54 + repo_dir: gems + path: ".gem_rbs_collection" + gemfile_lock_path: 'Gemfile.lock' + gems: + - name: ast + version: "2.4" + source: + name: ruby/gem_rbs_collection + remote: https://github.com/ruby/gem_rbs_collection.git + revision: cde6057e7546843ace6420c5783dd945c6ccda54 + repo_dir: gems + type: git + YAML + end + end + private def assert_config(expected_str, actual_str) assert_equal YAML.load(expected_str), YAML.load(actual_str) end