Class: Gem::RequestSet::GemDependencyAPI

Inherits:
Object
  • Object
show all
Defined in:
lib/rubygems/request_set/gem_dependency_api.rb

Overview

A semi-compatible DSL for the Bundler Gemfile and Isolate formats.

Constant Summary collapse

ENGINE_MAP =

:nodoc:

{ # :nodoc:
  :jruby        => %w[jruby],
  :jruby_18     => %w[jruby],
  :jruby_19     => %w[jruby],
  :maglev       => %w[maglev],
  :mri          => %w[ruby],
  :mri_18       => %w[ruby],
  :mri_19       => %w[ruby],
  :mri_20       => %w[ruby],
  :mri_21       => %w[ruby],
  :rbx          => %w[rbx],
  :ruby         => %w[ruby rbx maglev],
  :ruby_18      => %w[ruby rbx maglev],
  :ruby_19      => %w[ruby rbx maglev],
  :ruby_20      => %w[ruby rbx maglev],
  :ruby_21      => %w[ruby rbx maglev],
}
PLATFORM_MAP =

:nodoc:

{ # :nodoc:
  :jruby        => Gem::Platform::RUBY,
  :jruby_18     => Gem::Platform::RUBY,
  :jruby_19     => Gem::Platform::RUBY,
  :maglev       => Gem::Platform::RUBY,
  :mingw        => x86_mingw,
  :mingw_18     => x86_mingw,
  :mingw_19     => x86_mingw,
  :mingw_20     => x86_mingw,
  :mingw_21     => x86_mingw,
  :mri          => Gem::Platform::RUBY,
  :mri_18       => Gem::Platform::RUBY,
  :mri_19       => Gem::Platform::RUBY,
  :mri_20       => Gem::Platform::RUBY,
  :mri_21       => Gem::Platform::RUBY,
  :mswin        => Gem::Platform::RUBY,
  :rbx          => Gem::Platform::RUBY,
  :ruby         => Gem::Platform::RUBY,
  :ruby_18      => Gem::Platform::RUBY,
  :ruby_19      => Gem::Platform::RUBY,
  :ruby_20      => Gem::Platform::RUBY,
  :ruby_21      => Gem::Platform::RUBY,
  :x64_mingw    => x64_mingw,
  :x64_mingw_20 => x64_mingw,
  :x64_mingw_21 => x64_mingw
}
VERSION_MAP =

:nodoc:

{ # :nodoc:
  :jruby        => gt_eq_0,
  :jruby_18     => tilde_gt_1_8_0,
  :jruby_19     => tilde_gt_1_9_0,
  :maglev       => gt_eq_0,
  :mingw        => gt_eq_0,
  :mingw_18     => tilde_gt_1_8_0,
  :mingw_19     => tilde_gt_1_9_0,
  :mingw_20     => tilde_gt_2_0_0,
  :mingw_21     => tilde_gt_2_1_0,
  :mri          => gt_eq_0,
  :mri_18       => tilde_gt_1_8_0,
  :mri_19       => tilde_gt_1_9_0,
  :mri_20       => tilde_gt_2_0_0,
  :mri_21       => tilde_gt_2_1_0,
  :mswin        => gt_eq_0,
  :rbx          => gt_eq_0,
  :ruby         => gt_eq_0,
  :ruby_18      => tilde_gt_1_8_0,
  :ruby_19      => tilde_gt_1_9_0,
  :ruby_20      => tilde_gt_2_0_0,
  :ruby_21      => tilde_gt_2_1_0,
  :x64_mingw    => gt_eq_0,
  :x64_mingw_20 => tilde_gt_2_0_0,
  :x64_mingw_21 => tilde_gt_2_1_0,
}
WINDOWS =

:nodoc:

{ # :nodoc:
  :mingw        => :only,
  :mingw_18     => :only,
  :mingw_19     => :only,
  :mingw_20     => :only,
  :mingw_21     => :only,
  :mri          => :never,
  :mri_18       => :never,
  :mri_19       => :never,
  :mri_20       => :never,
  :mri_21       => :never,
  :mswin        => :only,
  :rbx          => :never,
  :ruby         => :never,
  :ruby_18      => :never,
  :ruby_19      => :never,
  :ruby_20      => :never,
  :ruby_21      => :never,
  :x64_mingw    => :only,
  :x64_mingw_20 => :only,
  :x64_mingw_21 => :only,
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(set, path) ⇒ GemDependencyAPI

Creates a new GemDependencyAPI that will add dependencies to the Gem::RequestSet set based on the dependency API description in path.



134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/rubygems/request_set/gem_dependency_api.rb', line 134

def initialize set, path
  @set = set
  @path = path

  @current_groups     = nil
  @current_platform   = nil
  @current_repository = nil
  @default_sources    = true
  @git_set            = @set.git_set
  @requires           = Hash.new { |h, name| h[name] = [] }
  @vendor_set         = @set.vendor_set
  @gem_sources        = {}
  @without_groups     = []
end

Instance Attribute Details

#git_setObject (readonly)

A set of gems that are loaded via the :git option to #gem



113
114
115
# File 'lib/rubygems/request_set/gem_dependency_api.rb', line 113

def git_set
  @git_set
end

#requiresObject (readonly)

A Hash containing gem names and files to require from those gems.



118
119
120
# File 'lib/rubygems/request_set/gem_dependency_api.rb', line 118

def requires
  @requires
end

#vendor_setObject (readonly)

A set of gems that are loaded via the :path option to #gem



123
124
125
# File 'lib/rubygems/request_set/gem_dependency_api.rb', line 123

def vendor_set
  @vendor_set
end

#without_groupsObject

The groups of gems to exclude from installation



128
129
130
# File 'lib/rubygems/request_set/gem_dependency_api.rb', line 128

def without_groups
  @without_groups
end

Instance Method Details

#find_gemspec(name, path) ⇒ Object

Finds a gemspec with the given name that lives at path.



166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/rubygems/request_set/gem_dependency_api.rb', line 166

def find_gemspec name, path # :nodoc:
  glob = File.join path, "#{name}.gemspec"

  spec_files = Dir[glob]

  case spec_files.length
  when 1 then
    spec_file = spec_files.first

    spec = Gem::Specification.load spec_file

    return spec if spec

    raise ArgumentError, "invalid gemspec #{spec_file}"
  when 0 then
    raise ArgumentError, "no gemspecs found at #{Dir.pwd}"
  else
    raise ArgumentError,
      "found multiple gemspecs at #{Dir.pwd}, " +
      "use the name: option to specify the one you want"
  end
end

#gem(name, *requirements) ⇒ Object

:category: Gem Dependencies DSL :call-seq:

gem(name)
gem(name, *requirements)
gem(name, *requirements, options)

Specifies a gem dependency with the given name and requirements. You may also supply options following the requirements



206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
# File 'lib/rubygems/request_set/gem_dependency_api.rb', line 206

def gem name, *requirements
  options = requirements.pop if requirements.last.kind_of?(Hash)
  options ||= {}

  options[:git] = @current_repository if @current_repository

  source_set = false

  source_set ||= gem_path   name, options
  source_set ||= gem_git    name, options
  source_set ||= gem_github name, options

  return unless gem_platforms options

  groups = gem_group name, options

  return unless (groups & @without_groups).empty?

  pin_gem_source name, :default unless source_set

  gem_requires name, options

  @set.gem name, *requirements
end

#gem_deps_fileObject

Returns the basename of the file the dependencies were loaded from



378
379
380
# File 'lib/rubygems/request_set/gem_dependency_api.rb', line 378

def gem_deps_file # :nodoc:
  File.basename @path
end

#gemspec(options = {}) ⇒ Object

:category: Gem Dependencies DSL

Loads dependencies from a gemspec file.



387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
# File 'lib/rubygems/request_set/gem_dependency_api.rb', line 387

def gemspec options = {}
  name              = options.delete(:name) || '{,*}'
  path              = options.delete(:path) || '.'
  development_group = options.delete(:development_group) || :development

  spec = find_gemspec name, path

  groups = gem_group spec.name, {}

  add_dependencies groups, spec.runtime_dependencies

  groups << development_group

  add_dependencies groups, spec.development_dependencies

  gem_requires spec.name, options
end

#git(repository) ⇒ Object

:category: Gem Dependencies DSL

Block form for specifying gems from a git repository.



366
367
368
369
370
371
372
373
# File 'lib/rubygems/request_set/gem_dependency_api.rb', line 366

def git repository
  @current_repository = repository

  yield

ensure
  @current_repository = nil
end

#group(*groups) ⇒ Object

:category: Gem Dependencies DSL Block form for placing a dependency in the given groups.



409
410
411
412
413
414
415
416
# File 'lib/rubygems/request_set/gem_dependency_api.rb', line 409

def group *groups
  @current_groups = groups

  yield

ensure
  @current_groups = nil
end

#loadObject

Loads the gem dependency file



192
193
194
# File 'lib/rubygems/request_set/gem_dependency_api.rb', line 192

def load
  instance_eval File.read(@path).untaint, @path, 1
end

#platform(what) ⇒ Object Also known as: platforms

:category: Gem Dependencies DSL

Block form for restricting gems to a particular platform.



445
446
447
448
449
450
451
452
# File 'lib/rubygems/request_set/gem_dependency_api.rb', line 445

def platform what
  @current_platform = what

  yield

ensure
  @current_platform = nil
end

#ruby(version, options = {}) ⇒ Object

:category: Gem Dependencies DSL Restricts this gem dependencies file to the given ruby version. The :engine options from Bundler are currently ignored.

Raises:

  • (ArgumentError)


466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
# File 'lib/rubygems/request_set/gem_dependency_api.rb', line 466

def ruby version, options = {}
  engine         = options[:engine]
  engine_version = options[:engine_version]

  raise ArgumentError,
        'you must specify engine_version along with the ruby engine' if
          engine and not engine_version

  unless RUBY_VERSION == version then
    message = "Your Ruby version is #{RUBY_VERSION}, " +
              "but your #{gem_deps_file} requires #{version}"

    raise Gem::RubyVersionMismatch, message
  end

  if engine and engine != Gem.ruby_engine then
    message = "Your ruby engine is #{Gem.ruby_engine}, " +
              "but your #{gem_deps_file} requires #{engine}"

    raise Gem::RubyVersionMismatch, message
  end

  if engine_version then
    my_engine_version = Object.const_get "#{Gem.ruby_engine.upcase}_VERSION"

    if engine_version != my_engine_version then
      message =
        "Your ruby engine version is #{Gem.ruby_engine} #{my_engine_version}, " +
        "but your #{gem_deps_file} requires #{engine} #{engine_version}"

      raise Gem::RubyVersionMismatch, message
    end
  end

  return true
end

#source(url) ⇒ Object

:category: Gem Dependencies DSL

Sets url as a source for gems for this dependency API.



508
509
510
511
512
513
514
# File 'lib/rubygems/request_set/gem_dependency_api.rb', line 508

def source url
  Gem.sources.clear if @default_sources

  @default_sources = false

  Gem.sources << url
end