class BundlerFixture
Attributes
dir[R]
Public Class Methods
bundler_version_or_higher(version)
click to toggle source
# File lib/bundler/fixture.rb, line 8 def self.bundler_version_or_higher(version) Gem::Version.new(Bundler::VERSION) >= Gem::Version.new(version) end
new(dir: File.join(Dir.tmpdir, 'fake_project_root'), gemfile: 'Gemfile')
click to toggle source
# File lib/bundler/fixture.rb, line 12 def initialize(dir: File.join(Dir.tmpdir, 'fake_project_root'), gemfile: 'Gemfile') @dir = dir @gemfile = gemfile FileUtils.makedirs @dir @sources = Bundler::SourceList.new @sources.add_rubygems_remote('https://rubygems.org') end
Public Instance Methods
bundler_version_or_higher(version)
click to toggle source
# File lib/bundler/fixture.rb, line 21 def bundler_version_or_higher(version) self.class.bundler_version_or_higher(version) end
clean_up()
click to toggle source
# File lib/bundler/fixture.rb, line 25 def clean_up FileUtils.rmtree @dir end
create_config(hash)
click to toggle source
# File lib/bundler/fixture.rb, line 93 def create_config(hash) config_dir = File.join(@dir, '.bundle') FileUtils.makedirs config_dir s = Bundler::Settings.new(config_dir) hash.each_pair do |k, v| # never support set_global, we don't want a test fixture jacking with an entire machine's bundler config s.set_local(k, v) if k.to_s == 'path' if v.nil? s.set_local('disable_shared_gems', nil) else s.set_local('disable_shared_gems', 'true') end end end end
create_definition(gem_dependencies:, source_specs:, ensure_sources:, update_gems:, ruby_version: nil)
click to toggle source
# File lib/bundler/fixture.rb, line 50 def create_definition(gem_dependencies:, source_specs:, ensure_sources:, update_gems:, ruby_version: nil) index = Bundler::Index.new Array(source_specs).flatten.each { |s| index << s } if bundler_version_or_higher('1.14.0') index << Gem::Specification.new("ruby\0", Bundler::RubyVersion.system.to_gem_version_with_patchlevel) index << Gem::Specification.new("rubygems\0", Gem::VERSION) end Array(gem_dependencies).each do |dep| index << create_spec(dep.name, dep.requirement.requirements.first.last) end if ensure_sources update_hash = update_gems === true ? true : {gems: Array(update_gems)} ruby_version_obj = Bundler::RubyVersion.new(ruby_version, nil, nil, nil) dfn = Bundler::Definition.new(lockfile_filename, Array(gem_dependencies), @sources, update_hash, ruby_version_obj) dfn.instance_variable_set('@index', index) # reading an existing lockfile in will overwrite the hacked up sources with detected # ones from lockfile, so this needs to go here after the constructor is called. source.instance_variable_set('@specs', index) dfn end
create_dependency(name, *requirements)
click to toggle source
# File lib/bundler/fixture.rb, line 147 def create_dependency(name, *requirements) Bundler::Dependency.new(name, requirements, {'source' => source}) end
create_gemfile(gem_dependencies:, ruby_version: nil)
click to toggle source
# File lib/bundler/fixture.rb, line 72 def create_gemfile(gem_dependencies:, ruby_version: nil) lines = [] lines << "source 'https://rubygems.org'" Array(gem_dependencies).each do |spec| name, requirement = case spec when Array spec when Gem::Dependency, Bundler::Dependency [spec.name, spec.requirement] end line = "gem '#{name}'" if requirement req_output = requirement_to_s(requirement) line << ", #{req_output}" unless req_output.empty? end lines << line end lines << "ruby '#{ruby_version}'" if ruby_version File.open(gemfile_filename, 'w') { |f| f.puts lines } end
create_lockfile(gem_dependencies:, source_specs: [], ensure_sources: true, update_gems: [], gemfile: nil, ruby_version: nil)
click to toggle source
@param [Gem::Specification] gem_dependencies This simulates gem requirements in Gemfile. @param [Gem::Specification] source_specs This simulates gems in the source index. @param [boolean] ensure_sources Default is true, makes sure a source exists for each gem_dependency.
Set this to false to require sending in sources in @param source_specs.
@param [Array boolean] update_gems An array of gem names to update to latest, or `true` to update all.
Default is empty Array.
# File lib/bundler/fixture.rb, line 35 def create_lockfile(gem_dependencies:, source_specs: [], ensure_sources: true, update_gems: [], gemfile: nil, ruby_version: nil) @gemfile = gemfile if gemfile dfn = create_definition(gem_dependencies: gem_dependencies, source_specs: source_specs, ensure_sources: ensure_sources, update_gems: update_gems, ruby_version: ruby_version) dfn.lock(lockfile_filename) end
create_spec(name, version, dependencies={})
click to toggle source
# File lib/bundler/fixture.rb, line 155 def create_spec(name, version, dependencies={}) Gem::Specification.new do |s| s.name = name s.version = Gem::Version.new(version) s.platform = 'ruby' s.source = source dependencies.each do |name, requirement| s.add_dependency name, requirement end end end
create_specs(name, versions, dependencies={})
click to toggle source
# File lib/bundler/fixture.rb, line 167 def create_specs(name, versions, dependencies={}) versions.map do |version| create_spec(name, version, dependencies) end end
gemfile_filename()
click to toggle source
# File lib/bundler/fixture.rb, line 127 def gemfile_filename File.join(@dir, "#{@gemfile}") end
lockfile_contents()
click to toggle source
# File lib/bundler/fixture.rb, line 135 def lockfile_contents File.read(lockfile_filename) end
lockfile_filename()
click to toggle source
# File lib/bundler/fixture.rb, line 131 def lockfile_filename File.join(@dir, "#{@gemfile}.lock") end
parsed_lockfile()
click to toggle source
# File lib/bundler/fixture.rb, line 139 def parsed_lockfile Bundler::LockfileParser.new(lockfile_contents) end
parsed_lockfile_spec(gem_name)
click to toggle source
# File lib/bundler/fixture.rb, line 143 def parsed_lockfile_spec(gem_name) parsed_lockfile.specs.detect { |s| s.name == gem_name } end
requirement_to_s(req)
click to toggle source
# File lib/bundler/fixture.rb, line 110 def requirement_to_s(req) case req when Gem::Requirement req.as_list.delete_if do |r| r == '>= 0' end.map do |r| "'#{r.gsub(/^= /, '')}'" end.join(', ') when String "'#{req}'" when Array req.map { |r| "'#{r}'" }.join(', ') else req end end
source()
click to toggle source
# File lib/bundler/fixture.rb, line 151 def source @sources.all_sources.first end