lib/rbs/collection/config/lockfile_generator.rb in rbs-3.0.0.dev.1 vs lib/rbs/collection/config/lockfile_generator.rb in rbs-3.0.0.dev.2

- old
+ new

@@ -18,42 +18,45 @@ Actual Gemfile.lock: #{@actual} MESSAGE end end - attr_reader :config, :lockfile, :gemfile_lock, :existing_lockfile + attr_reader :config, :lockfile, :definition, :existing_lockfile, :gem_hash - def self.generate(config:, gemfile_lock_path:, with_lockfile: true) - generator = new(config: config, gemfile_lock_path: gemfile_lock_path, with_lockfile: with_lockfile) + def self.generate(config:, definition:, with_lockfile: true) + generator = new(config: config, definition: definition, with_lockfile: with_lockfile) generator.generate generator.lockfile end - def initialize(config:, gemfile_lock_path:, with_lockfile:) + def initialize(config:, definition:, with_lockfile:) @config = config lockfile_path = Config.to_lockfile_path(config.config_path) lockfile_dir = lockfile_path.parent @lockfile = Lockfile.new( lockfile_path: lockfile_path, path: config.repo_path_data, - gemfile_lock_path: gemfile_lock_path.relative_path_from(lockfile_dir) + gemfile_lock_path: definition.lockfile.relative_path_from(lockfile_dir) ) config.sources.each do |source| case source when Sources::Git lockfile.sources[source.name] = source end end if with_lockfile && lockfile_path.file? @existing_lockfile = Lockfile.from_lockfile(lockfile_path: lockfile_path, data: YAML.load_file(lockfile_path.to_s)) - validate_gemfile_lock_path!(lock: @existing_lockfile, gemfile_lock_path: gemfile_lock_path) + validate_gemfile_lock_path!(lock: @existing_lockfile, gemfile_lock_path: definition.lockfile) end - @gemfile_lock = Bundler::LockfileParser.new(gemfile_lock_path.read) + @definition = definition + @gem_hash = definition.locked_gems.specs.each.with_object({}) do |spec, hash| #$ Hash[String, Bundler::LazySpecification] + hash[spec.name] = spec + end end def generate ignored_gems = config.gems.select {|gem| gem["ignore"] }.map {|gem| gem["name"] }.to_set @@ -65,12 +68,17 @@ else assign_gem(name: gem["name"], version: gem["version"], ignored_gems: ignored_gems, src_data: gem["source"]) end end - gemfile_lock_gems do |spec| - assign_gem(name: spec.name, version: spec.version, ignored_gems: ignored_gems, src_data: nil) + definition.dependencies.each do |dep| + if dep.autorequire && dep.autorequire.empty? + next + end + + spec = gem_hash[dep.name] or raise "Cannot find `#{dep.name}` in bundler context" + assign_gem(name: dep.name, version: spec.version, ignored_gems: ignored_gems, src_data: nil) end lockfile.lockfile_path.write(YAML.dump(lockfile.to_lockfile)) end @@ -80,11 +88,11 @@ unless lock.gemfile_lock_fullpath == gemfile_lock_path raise GemfileLockMismatchError.new(expected: lock.gemfile_lock_fullpath, actual: gemfile_lock_path) end end - private def assign_gem(name:, version:, ignored_gems:, src_data:) + private def assign_gem(name:, version:, src_data:, ignored_gems:) return if ignored_gems.include?(name) return if lockfile.gems.key?(name) # @type var locked: Lockfile::library? @@ -97,13 +105,12 @@ unless locked source = if src_data Sources.from_config_entry(src_data) else - find_source(name: name) + find_source(name: name) or return end - return unless source installed_version = version best_version = find_best_version(version: installed_version, versions: source.versions(name)) locked = { @@ -114,15 +121,19 @@ end locked or raise lockfile.gems[name] = locked - source = locked[:source] - source.dependencies_of(locked[:name], locked[:version])&.each do |dep| + locked[:source].dependencies_of(locked[:name], locked[:version])&.each do |dep| assign_stdlib(name: dep["name"], from_gem: name) end + + gem_hash[name].dependencies.each do |dep| + spec = gem_hash[dep.name] + assign_gem(name: dep.name, version: spec.version, src_data: nil, ignored_gems: ignored_gems) + end end private def assign_stdlib(name:, from_gem:) return if lockfile.gems.key?(name) @@ -145,15 +156,9 @@ if deps = source.dependencies_of(name, "0") deps.each do |dep| assign_stdlib(name: dep["name"], from_gem: name) end - end - end - - private def gemfile_lock_gems(&block) - gemfile_lock.specs.each do |spec| - yield spec end end private def find_source(name:) sources = config.sources