Class: Gem::Specification
- Inherits:
-
Object
- Object
- Gem::Specification
- Extended by:
- Enumerable, Deprecate
- Defined in:
- lib/rubygems/specification.rb
Overview
The Specification class contains the metadata for a Gem. Typically defined in a .gemspec file or a Rakefile, and looks like this:
spec = Gem::Specification.new do |s|
s.name = 'example'
s.version = '1.0'
s.summary = 'Example gem specification'
...
end
For a great way to package gems, use Hoe.
Constant Summary collapse
- NONEXISTENT_SPECIFICATION_VERSION =
The the version number of a specification that does not specify one (i.e. RubyGems 0.7 or earlier).
-1
- CURRENT_SPECIFICATION_VERSION =
The specification version applied to any new Specification instances created. This should be bumped whenever something in the spec format changes.
Specification Version History:
spec ruby ver ver yyyy-mm-dd description -1 <0.8.0 pre-spec-version-history 1 0.8.0 2004-08-01 Deprecated "test_suite_file" for "test_files" "test_file=x" is a shortcut for "test_files=[x]" 2 0.9.5 2007-10-01 Added "required_rubygems_version" Now forward-compatible with future versions 3 1.3.2 2009-01-03 Added Fixnum validation to specification_version
-- When updating this number, be sure to also update #to_ruby.
NOTE RubyGems < 1.2 cannot load specification versions > 2.
3
- MARSHAL_FIELDS =
version => # of fields
{ -1 => 16, 1 => 16, 2 => 16, 3 => 17 }
- TODAY =
Time.utc(today.year, today.month, today.day)
- @@required_attributes =
List of attribute names: [:name, :version, ...]
[:rubygems_version, :specification_version, :name, :version, :date, :summary, :require_paths]
- @@default_value =
Map of attribute names to default values.
{ :authors => [], :autorequire => nil, :bindir => 'bin', :cert_chain => [], :date => TODAY, :dependencies => [], :description => nil, :email => nil, :executables => [], :extensions => [], :extra_rdoc_files => [], :files => [], :homepage => nil, :licenses => [], :name => nil, :platform => Gem::Platform::RUBY, :post_install_message => nil, :rdoc_options => [], :require_paths => ['lib'], :required_ruby_version => Gem::Requirement.default, :required_rubygems_version => Gem::Requirement.default, :requirements => [], :rubyforge_project => nil, :rubygems_version => Gem::VERSION, :signing_key => nil, :specification_version => CURRENT_SPECIFICATION_VERSION, :summary => nil, :test_files => [], :version => nil, }
- @@attributes =
@@default_value.keys.sort_by { |s| s.to_s }
- @@array_attributes =
@@default_value.reject { |k,v| v != [] }.keys
Instance Attribute Summary collapse
-
#activated ⇒ Object
(also: #activated?)
True when this gemspec has been activated.
-
#autorequire ⇒ Object
Autorequire was used by old RubyGems to automatically require a file.
-
#bindir ⇒ Object
The path in the gem for executable scripts.
-
#cert_chain ⇒ Object
The certificate chain used to sign this gem.
-
#default_executable ⇒ Object
The default executable for this gem.
-
#description ⇒ Object
A long description of this gem.
-
#email ⇒ Object
A contact email for this gem.
-
#homepage ⇒ Object
The URL of this gem's home page.
-
#loaded ⇒ Object
(also: #loaded?)
True when this gemspec has been activated.
-
#loaded_from ⇒ Object
Path this gemspec was loaded from.
-
#name ⇒ Object
This gem's name.
-
#original_platform ⇒ Object
Cruft.
-
#post_install_message ⇒ Object
A message that gets displayed after the gem is installed.
-
#require_paths ⇒ Object
Paths in the gem to add to $LOAD_PATH when this gem is activated.
-
#required_ruby_version ⇒ Object
The version of ruby required by this gem.
-
#required_rubygems_version ⇒ Object
The RubyGems version required by this gem.
-
#rubyforge_project ⇒ Object
The rubyforge project this gem lives under.
-
#rubygems_version ⇒ Object
The version of RubyGems used to create this gem.
-
#signing_key ⇒ Object
The key used to sign this gem.
-
#specification_version ⇒ Object
The Gem::Specification version of this gemspec.
-
#summary ⇒ Object
A short summary of this gem's description.
-
#version ⇒ Object
This gem's version.
Class Method Summary collapse
-
._all ⇒ Object
:nodoc:.
-
._load(str) ⇒ Object
Load custom marshal format, re-initializing defaults as needed.
-
._resort! ⇒ Object
:nodoc:.
-
.add_spec(spec) ⇒ Object
Adds
spec
to the known specifications, keeping the collection properly sorted. -
.add_specs(*specs) ⇒ Object
Adds multiple specs to the known specifications.
-
.all ⇒ Object
Returns all specifications.
-
.all=(specs) ⇒ Object
Sets the known specs to
specs
. -
.all_names ⇒ Object
Return full names of all specs in sorted order.
-
.array_attributes ⇒ Object
Return the list of all array-oriented instance variables.
-
.attribute_names ⇒ Object
Return the list of all instance variables.
-
.dirs ⇒ Object
Return the directories that Specification uses to find specs.
-
.dirs=(dirs) ⇒ Object
Set the directories that Specification uses to find specs.
-
.each ⇒ Object
Enumerate every known spec.
-
.find_all_by_name(name, *requirements) ⇒ Object
Returns every spec that matches
name
and optionalrequirements
. -
.find_by_name(name, *requirements) ⇒ Object
Find the best specification matching a
name
andrequirements
. -
.find_by_path(path) ⇒ Object
Return the best specification that contains the file matching
path
. -
.find_in_unresolved(path) ⇒ Object
Return currently unresolved specs that contain the file matching
path
. -
.find_in_unresolved_tree(path) ⇒ Object
Search through all unresolved deps and sub-dependencies and return specs that contain the file matching
path
. -
.from_yaml(input) ⇒ Object
Special loader for YAML files.
-
.latest_specs(prerelease = false) ⇒ Object
Return the latest specs, optionally including prerelease specs if
prerelease
is true. -
.load(file) ⇒ Object
Loads Ruby format gemspec from
file
. -
.non_nil_attributes ⇒ Object
Specification attributes that must be non-nil.
-
.normalize_yaml_input(input) ⇒ Object
Make sure the YAML specification is properly formatted with dashes.
-
.outdated ⇒ Object
Return a list of all outdated specifications.
-
.remove_spec(spec) ⇒ Object
Removes
spec
from the known specs. -
.required_attribute?(name) ⇒ Boolean
Is
name
a required attribute?. -
.required_attributes ⇒ Object
Required specification attributes.
-
.reset ⇒ Object
Reset the list of known specs, running pre and post reset hooks registered in Gem.
Instance Method Summary collapse
-
#<=>(other) ⇒ Object
:nodoc:.
-
#==(other) ⇒ Object
:nodoc:.
-
#_dump(limit) ⇒ Object
Dump only crucial instance variables.
-
#activate ⇒ Object
Activate this spec, registering it as a loaded spec and adding it's lib paths to $LOAD_PATH.
-
#activate_dependencies ⇒ Object
Activate all unambiguously resolved runtime dependencies of this spec.
-
#add_bindir(executables) ⇒ Object
Returns an array with bindir attached to each executable in the
executables
list. -
#add_development_dependency(gem, *requirements) ⇒ Object
Adds a development dependency named
gem
withrequirements
to this Gem. -
#add_runtime_dependency(gem, *requirements) ⇒ Object
(also: #add_dependency)
Adds a runtime dependency named
gem
withrequirements
to this Gem. -
#add_self_to_load_path ⇒ Object
Adds this spec's require paths to LOAD_PATH, in the proper location.
-
#author ⇒ Object
Singular reader for #authors.
-
#author=(o) ⇒ Object
Singular writer for #authors.
-
#authors ⇒ Object
The list of author names who wrote this gem.
-
#authors=(value) ⇒ Object
Sets the list of authors, ensuring it is an array.
-
#base_dir ⇒ Object
Returns the full path to the base gem directory.
-
#bin_dir ⇒ Object
Returns the full path to installed gem's bin directory.
-
#bin_file(name) ⇒ Object
Returns the full path to an executable named
name
in this gem. -
#cache_dir ⇒ Object
Returns the full path to the cache directory containing this spec's cached gem.
-
#cache_file ⇒ Object
(also: #cache_gem)
Returns the full path to the cached gem for this spec.
-
#conflicts ⇒ Object
Return any possible conflicts against the currently loaded specs.
-
#contains_requirable_file?(file) ⇒ Boolean
Return true if this spec can require
file
. -
#date ⇒ Object
The date this gem was created.
-
#date=(date) ⇒ Object
The date this gem was created.
-
#default_value(name) ⇒ Object
The default value for specification attribute
name
. -
#dependencies ⇒ Object
A list of Gem::Dependency objects this gem depends on.
-
#dependent_gems ⇒ Object
Return a list of all gems that have a dependency on this gemspec.
-
#dependent_specs ⇒ Object
Returns all specs that matches this spec's runtime dependencies.
-
#development_dependencies ⇒ Object
List of dependencies that are used for development.
-
#doc_dir ⇒ Object
Returns the full path to this spec's documentation directory.
-
#encode_with(coder) ⇒ Object
:nodoc:.
-
#eql?(other) ⇒ Boolean
:nodoc:.
-
#executable ⇒ Object
Singular accessor for #executables.
-
#executable=(o) ⇒ Object
Singular accessor for #executables.
-
#executables ⇒ Object
Executables included in the gem.
-
#executables=(value) ⇒ Object
Sets executables to
value
, ensuring it is an array. -
#extensions ⇒ Object
Extensions to build when installing the gem.
-
#extensions=(extensions) ⇒ Object
Sets extensions to
extensions
, ensuring it is an array. -
#extra_rdoc_files ⇒ Object
Extra files to add to RDoc such as README or doc/examples.txt.
-
#extra_rdoc_files=(files) ⇒ Object
Sets extra_rdoc_files to
files
, ensuring it is an array. -
#file_name ⇒ Object
The default (generated) file name of the gem.
-
#files ⇒ Object
Files included in this gem.
-
#files=(files) ⇒ Object
Sets files to
files
, ensuring it is an array. -
#for_cache ⇒ Object
Creates a duplicate spec without large blobs that aren't used at runtime.
-
#full_gem_path ⇒ Object
The full path to the gem (install path + full name).
-
#full_name ⇒ Object
Returns the full name (name-version) of this Gem.
-
#gem_dir ⇒ Object
Returns the full path to this spec's gem directory.
-
#gems_dir ⇒ Object
Returns the full path to the gems directory containing this spec's gem directory.
-
#has_rdoc ⇒ Object
(also: #has_rdoc?)
Deprecated and ignored, defaults to true.
-
#has_rdoc=(ignored) ⇒ Object
Deprecated and ignored.
-
#has_unit_tests? ⇒ Boolean
(also: #has_test_suite?)
True if this gem has files in test_files.
-
#hash ⇒ Object
:startdoc:.
-
#init_with(coder) ⇒ Object
:nodoc:.
-
#initialize(name = nil, version = nil) {|_self| ... } ⇒ Specification
constructor
Specification constructor.
-
#initialize_copy(other_spec) ⇒ Object
Duplicates array_attributes from
other_spec
so state isn't shared. -
#installation_path ⇒ Object
The directory that this gem was installed into.
-
#lib_dirs_glob ⇒ Object
Returns a string usable in Dir.glob to match all requirable paths for this spec.
-
#lib_files ⇒ Object
Files in the Gem under one of the require_paths.
-
#license ⇒ Object
Singular accessor for #licenses.
-
#license=(o) ⇒ Object
Singular accessor for #licenses.
-
#licenses ⇒ Object
The license(s) for the library.
-
#licenses=(licenses) ⇒ Object
Set licenses to
licenses
, ensuring it is an array. -
#mark_version ⇒ Object
Sets the rubygems_version to the current RubyGems version.
-
#matches_for_glob(glob) ⇒ Object
Return all files in this gem that match for
glob
. -
#method_missing(sym, *a, &b) ⇒ Object
Warn about unknown attributes while loading a spec.
-
#normalize ⇒ Object
Normalize the list of files so that: * All file lists have redundancies removed.
-
#original_name ⇒ Object
Returns the full name (name-version) of this gemspec using the original platform.
-
#platform ⇒ Object
The platform this gem runs on.
-
#platform=(platform) ⇒ Object
The platform this gem runs on.
-
#pretty_print(q) ⇒ Object
:nodoc:.
-
#raise_if_conflicts ⇒ Object
Check the spec for possible conflicts and freak out if there are any.
-
#rdoc_options ⇒ Object
An ARGV style array of options to RDoc.
-
#rdoc_options=(options) ⇒ Object
Sets rdoc_options to
value
, ensuring it is an array. -
#require_path ⇒ Object
Singular accessor for #require_paths.
-
#require_path=(path) ⇒ Object
Singular accessor for #require_paths.
-
#requirements ⇒ Object
An array or things required by this gem.
-
#requirements=(req) ⇒ Object
Set requirements to
req
, ensuring it is an array. -
#ri_dir ⇒ Object
Returns the full path to this spec's ri directory.
-
#runtime_dependencies ⇒ Object
List of dependencies that will automatically be activated at runtime.
-
#satisfies_requirement?(dependency) ⇒ Boolean
Checks if this specification meets the requirement of
dependency
. -
#sort_obj ⇒ Object
Returns an object you can use to sort specifications in #sort_by.
-
#spec_dir ⇒ Object
Returns the full path to the directory containing this spec's gemspec file.
-
#spec_file ⇒ Object
Returns the full path to this spec's gemspec file.
-
#spec_name ⇒ Object
The default name of the gemspec.
-
#test_file ⇒ Object
Singular accessor for #test_files.
-
#test_file=(file) ⇒ Object
Singular accessor for #test_files.
-
#test_files ⇒ Object
Test files included in this gem.
-
#test_files=(files) ⇒ Object
Set test_files to
files
, ensuring it is an array. -
#test_suite_file ⇒ Object
:nodoc:.
-
#test_suite_file=(file) ⇒ Object
:nodoc:.
-
#to_ruby ⇒ Object
Returns a Ruby code representation of this specification, such that it can be eval'ed and reconstruct the same specification later.
-
#to_ruby_for_cache ⇒ Object
Returns a Ruby lighter-weight code representation of this specification, used for indexing only.
-
#to_s ⇒ Object
:nodoc:.
-
#to_yaml(opts = {}) ⇒ Object
:nodoc:.
-
#traverse(trail = [], &block) ⇒ Object
Recursively walk dependencies of this spec, executing the
block
for each hop. -
#validate(packaging = true) ⇒ Object
Checks that the specification contains all required fields, and does a very basic sanity check.
-
#yaml_initialize(tag, vals) ⇒ Object
FIX: have this handle the platform/new_platform/original_platform bullshit.
Methods included from Deprecate
deprecate, skip, skip=, skip_during
Constructor Details
#initialize(name = nil, version = nil) {|_self| ... } ⇒ Specification
Specification constructor. Assigns the default values to the attributes and yields itself for further initialization. Optionally takes name
and version
.
1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 |
# File 'lib/rubygems/specification.rb', line 1343 def initialize name = nil, version = nil @loaded = false @activated = false @loaded_from = nil @original_platform = nil @@nil_attributes.each do |key| instance_variable_set "@#{key}", nil end @@non_nil_attributes.each do |key| default = default_value(key) value = case default when Time, Numeric, Symbol, true, false, nil then default else default.dup end instance_variable_set "@#{key}", value end @new_platform = Gem::Platform::RUBY self.name = name if name self.version = version if version yield self if block_given? end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(sym, *a, &b) ⇒ Object
Warn about unknown attributes while loading a spec.
1490 1491 1492 1493 1494 1495 1496 1497 |
# File 'lib/rubygems/specification.rb', line 1490 def method_missing(sym, *a, &b) # :nodoc: if @specification_version > CURRENT_SPECIFICATION_VERSION and sym.to_s =~ /=$/ then warn "ignoring #{sym} loading #{full_name}" if $DEBUG else super end end |
Instance Attribute Details
#activated ⇒ Object Also known as: activated?
True when this gemspec has been activated. This attribute is not persisted.
223 224 225 |
# File 'lib/rubygems/specification.rb', line 223 def activated @activated end |
#autorequire ⇒ Object
Autorequire was used by old RubyGems to automatically require a file.
Deprecated: It is neither supported nor functional.
171 172 173 |
# File 'lib/rubygems/specification.rb', line 171 def autorequire @autorequire end |
#bindir ⇒ Object
The path in the gem for executable scripts. Usually 'bin'
176 177 178 |
# File 'lib/rubygems/specification.rb', line 176 def bindir @bindir end |
#cert_chain ⇒ Object
The certificate chain used to sign this gem. See Gem::Security for details.
182 183 184 |
# File 'lib/rubygems/specification.rb', line 182 def cert_chain @cert_chain end |
#default_executable ⇒ Object
The default executable for this gem.
Deprecated: The name of the gem is assumed to be the name of the executable now. See Gem.bin_path.
1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 |
# File 'lib/rubygems/specification.rb', line 1028 def default_executable if defined?(@default_executable) and @default_executable result = @default_executable elsif @executables and @executables.size == 1 result = Array(@executables).first else result = nil end result end |
#description ⇒ Object
A long description of this gem
187 188 189 |
# File 'lib/rubygems/specification.rb', line 187 def description @description end |
#email ⇒ Object
A contact email for this gem
If you are providing multiple authors and multiple emails they should be in the same order such that:
Hash[*spec..zip(spec.emails).flatten]
Gives a hash of author name to email address.
206 207 208 |
# File 'lib/rubygems/specification.rb', line 206 def email @email end |
#homepage ⇒ Object
The URL of this gem's home page
211 212 213 |
# File 'lib/rubygems/specification.rb', line 211 def homepage @homepage end |
#loaded ⇒ Object Also known as: loaded?
True when this gemspec has been activated. This attribute is not persisted.
216 217 218 |
# File 'lib/rubygems/specification.rb', line 216 def loaded @loaded end |
#loaded_from ⇒ Object
Path this gemspec was loaded from. This attribute is not persisted.
230 231 232 |
# File 'lib/rubygems/specification.rb', line 230 def loaded_from @loaded_from end |
#name ⇒ Object
This gem's name
127 128 129 |
# File 'lib/rubygems/specification.rb', line 127 def name @name end |
#original_platform ⇒ Object
Cruft. Use platform
.
1534 1535 1536 |
# File 'lib/rubygems/specification.rb', line 1534 def original_platform # :nodoc: @original_platform ||= platform end |
#post_install_message ⇒ Object
A message that gets displayed after the gem is installed
240 241 242 |
# File 'lib/rubygems/specification.rb', line 240 def @post_install_message end |
#require_paths ⇒ Object
Paths in the gem to add to $LOAD_PATH when this gem is activated.
The default ['lib'] is typically sufficient.
139 140 141 |
# File 'lib/rubygems/specification.rb', line 139 def require_paths @require_paths end |
#required_ruby_version ⇒ Object
The version of ruby required by this gem
245 246 247 |
# File 'lib/rubygems/specification.rb', line 245 def required_ruby_version @required_ruby_version end |
#required_rubygems_version ⇒ Object
The RubyGems version required by this gem
250 251 252 |
# File 'lib/rubygems/specification.rb', line 250 def required_rubygems_version @required_rubygems_version end |
#rubyforge_project ⇒ Object
The rubyforge project this gem lives under. i.e. RubyGems' rubyforge_project is "rubygems".
256 257 258 |
# File 'lib/rubygems/specification.rb', line 256 def rubyforge_project @rubyforge_project end |
#rubygems_version ⇒ Object
The version of RubyGems used to create this gem.
Do not set this, it is set automatically when the gem is packaged.
146 147 148 |
# File 'lib/rubygems/specification.rb', line 146 def rubygems_version @rubygems_version end |
#signing_key ⇒ Object
The key used to sign this gem. See Gem::Security for details.
261 262 263 |
# File 'lib/rubygems/specification.rb', line 261 def signing_key @signing_key end |
#specification_version ⇒ Object
The Gem::Specification version of this gemspec.
Do not set this, it is set automatically when the gem is packaged.
153 154 155 |
# File 'lib/rubygems/specification.rb', line 153 def specification_version @specification_version end |
#summary ⇒ Object
A short summary of this gem's description. Displayed in 'gem list -d`.
The description should be more detailed than the summary. For example, you might wish to copy the entire README into the description.
161 162 163 |
# File 'lib/rubygems/specification.rb', line 161 def summary @summary end |
#version ⇒ Object
This gem's version
132 133 134 |
# File 'lib/rubygems/specification.rb', line 132 def version @version end |
Class Method Details
._all ⇒ Object
:nodoc:
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 |
# File 'lib/rubygems/specification.rb', line 263 def self._all # :nodoc: unless defined?(@@all) && @@all then specs = {} self.dirs.each { |dir| Dir[File.join(dir, "*.gemspec")].each { |path| spec = Gem::Specification.load path.untaint # #load returns nil if the spec is bad, so we just ignore # it at this stage specs[spec.full_name] ||= spec if spec } } @@all = specs.values _resort! end @@all end |
._load(str) ⇒ Object
Load custom marshal format, re-initializing defaults as needed
649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 |
# File 'lib/rubygems/specification.rb', line 649 def self._load(str) array = Marshal.load str spec = Gem::Specification.new spec.instance_variable_set :@specification_version, array[1] current_version = CURRENT_SPECIFICATION_VERSION field_count = if spec.specification_version > current_version then spec.instance_variable_set :@specification_version, current_version MARSHAL_FIELDS[current_version] else MARSHAL_FIELDS[spec.specification_version] end if array.size < field_count then raise TypeError, "invalid Gem::Specification format #{array.inspect}" end # Cleanup any YAML::PrivateType. They only show up for an old bug # where nil => null, so just convert them to nil based on the type. array.map! { |e| e.kind_of?(YAML::PrivateType) ? nil : e } spec.instance_variable_set :@rubygems_version, array[0] # spec version spec.instance_variable_set :@name, array[2] spec.instance_variable_set :@version, array[3] spec.date = array[4] spec.instance_variable_set :@summary, array[5] spec.instance_variable_set :@required_ruby_version, array[6] spec.instance_variable_set :@required_rubygems_version, array[7] spec.instance_variable_set :@original_platform, array[8] spec.instance_variable_set :@dependencies, array[9] spec.instance_variable_set :@rubyforge_project, array[10] spec.instance_variable_set :@email, array[11] spec.instance_variable_set :@authors, array[12] spec.instance_variable_set :@description, array[13] spec.instance_variable_set :@homepage, array[14] spec.instance_variable_set :@has_rdoc, array[15] spec.instance_variable_set :@new_platform, array[16] spec.instance_variable_set :@platform, array[16].to_s spec.instance_variable_set :@license, array[17] spec.instance_variable_set :@loaded, false spec.instance_variable_set :@activated, false spec end |
._resort! ⇒ Object
:nodoc:
283 284 285 286 287 288 289 |
# File 'lib/rubygems/specification.rb', line 283 def self._resort! # :nodoc: @@all.sort! { |a, b| names = a.name <=> b.name next names if names.nonzero? b.version <=> a.version } end |
.add_spec(spec) ⇒ Object
Adds spec
to the known specifications, keeping the collection properly sorted.
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 |
# File 'lib/rubygems/specification.rb', line 295 def self.add_spec spec # TODO: find all extraneous adds # puts # p :add_spec => [spec.full_name, caller.reject { |s| s =~ /minitest/ }] # TODO: flush the rest of the crap from the tests # raise "no dupes #{spec.full_name} in #{all_names.inspect}" if # _all.include? spec raise "nil spec!" unless spec # TODO: remove once we're happy with tests return if _all.include? spec _all << spec _resort! end |
.add_specs(*specs) ⇒ Object
Adds multiple specs to the known specifications.
315 316 317 318 319 320 321 322 323 324 325 |
# File 'lib/rubygems/specification.rb', line 315 def self.add_specs *specs raise "nil spec!" if specs.any?(&:nil?) # TODO: remove once we're happy # TODO: this is much more efficient, but we need the extra checks for now # _all.concat specs # _resort! specs.each do |spec| # TODO: slow add_spec spec end end |
.all ⇒ Object
Returns all specifications. This method is discouraged from use. You probably want to use one of the Enumerable methods instead.
331 332 333 334 335 |
# File 'lib/rubygems/specification.rb', line 331 def self.all warn "NOTE: Specification.all called from #{caller.first}" unless Gem::Deprecate.skip _all end |
.all=(specs) ⇒ Object
Sets the known specs to specs
. Not guaranteed to work for you in the future. Use at your own risk. Caveat emptor. Doomy doom doom. Etc etc.
-- Makes specs
the known specs Listen, time is a river Winter comes, code breaks
-- wilsonb
349 350 351 |
# File 'lib/rubygems/specification.rb', line 349 def self.all= specs @@all = specs end |
.all_names ⇒ Object
Return full names of all specs in sorted order.
356 357 358 |
# File 'lib/rubygems/specification.rb', line 356 def self.all_names self._all.map(&:full_name) end |
.array_attributes ⇒ Object
Return the list of all array-oriented instance variables. -- Not sure why we need to use so much stupid reflection in here...
365 366 367 |
# File 'lib/rubygems/specification.rb', line 365 def self.array_attributes @@array_attributes.dup end |
.attribute_names ⇒ Object
Return the list of all instance variables. -- Not sure why we need to use so much stupid reflection in here...
374 375 376 |
# File 'lib/rubygems/specification.rb', line 374 def self.attribute_names @@attributes.dup end |
.dirs ⇒ Object
Return the directories that Specification uses to find specs.
381 382 383 384 385 |
# File 'lib/rubygems/specification.rb', line 381 def self.dirs @@dirs ||= Gem.path.collect { |dir| File.join dir, "specifications" } end |
.dirs=(dirs) ⇒ Object
Set the directories that Specification uses to find specs. Setting this resets the list of known specs.
391 392 393 394 395 396 397 398 399 |
# File 'lib/rubygems/specification.rb', line 391 def self.dirs= dirs # TODO: find extra calls to dir= # warn "NOTE: dirs= called from #{caller.first} for #{dirs.inspect}" self.reset # ugh @@dirs = Array(dirs).map { |dir| File.join dir, "specifications" } end |
.each ⇒ Object
Enumerate every known spec. See ::dirs= and ::add_spec to set the list of specs.
407 408 409 410 411 412 413 |
# File 'lib/rubygems/specification.rb', line 407 def self.each return enum_for(:each) unless block_given? self._all.each do |x| yield x end end |
.find_all_by_name(name, *requirements) ⇒ Object
Returns every spec that matches name
and optional requirements
.
418 419 420 421 422 423 424 |
# File 'lib/rubygems/specification.rb', line 418 def self.find_all_by_name name, *requirements requirements = Gem::Requirement.default if requirements.empty? # TODO: maybe try: find_all { |s| spec === dep } Gem::Dependency.new(name, *requirements).matching_specs end |
.find_by_name(name, *requirements) ⇒ Object
Find the best specification matching a name
and requirements
. Raises if the dependency doesn't resolve to a valid specification.
430 431 432 433 434 435 436 |
# File 'lib/rubygems/specification.rb', line 430 def self.find_by_name name, *requirements requirements = Gem::Requirement.default if requirements.empty? # TODO: maybe try: find { |s| spec === dep } Gem::Dependency.new(name, *requirements).to_spec end |
.find_by_path(path) ⇒ Object
Return the best specification that contains the file matching path
.
441 442 443 444 445 |
# File 'lib/rubygems/specification.rb', line 441 def self.find_by_path path self.find { |spec| spec.contains_requirable_file? path } end |
.find_in_unresolved(path) ⇒ Object
Return currently unresolved specs that contain the file matching path
.
450 451 452 453 454 455 |
# File 'lib/rubygems/specification.rb', line 450 def self.find_in_unresolved path # TODO: do we need these?? Kill it specs = Gem.unresolved_deps.values.map { |dep| dep.to_specs }.flatten specs.find_all { |spec| spec.contains_requirable_file? path } end |
.find_in_unresolved_tree(path) ⇒ Object
Search through all unresolved deps and sub-dependencies and return specs that contain the file matching path
.
461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 |
# File 'lib/rubygems/specification.rb', line 461 def self.find_in_unresolved_tree path specs = Gem.unresolved_deps.values.map { |dep| dep.to_specs }.flatten specs.reverse_each do |spec| trails = [] spec.traverse do |from_spec, dep, to_spec, trail| next unless to_spec.conflicts.empty? trails << trail if to_spec.contains_requirable_file? path end next if trails.empty? return trails.map(&:reverse).sort.first.reverse end [] end |
.from_yaml(input) ⇒ Object
Special loader for YAML files. When a Specification object is loaded from a YAML file, it bypasses the normal Ruby object initialization routine (#initialize). This method makes up for that and deals with gems of different ages.
input
can be anything that YAML.load() accepts: String or IO.
487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 |
# File 'lib/rubygems/specification.rb', line 487 def self.from_yaml(input) Gem.load_yaml input = normalize_yaml_input input spec = YAML.load input if spec && spec.class == FalseClass then raise Gem::EndOfYAMLException end unless Gem::Specification === spec then raise Gem::Exception, "YAML data doesn't evaluate to gem specification" end unless (spec.instance_variables.include? '@specification_version' or spec.instance_variables.include? :@specification_version) and spec.instance_variable_get :@specification_version spec.instance_variable_set :@specification_version, NONEXISTENT_SPECIFICATION_VERSION end spec end |
.latest_specs(prerelease = false) ⇒ Object
Return the latest specs, optionally including prerelease specs if prerelease
is true.
515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 |
# File 'lib/rubygems/specification.rb', line 515 def self.latest_specs prerelease = false result = Hash.new { |h,k| h[k] = {} } native = {} Gem::Specification._all.reverse_each do |spec| next if spec.version.prerelease? unless prerelease native[spec.name] = spec.version if spec.platform == Gem::Platform::RUBY result[spec.name][spec.platform] = spec end result.map(&:last).map(&:values).flatten.reject { |spec| minimum = native[spec.name] minimum && spec.version < minimum } end |
.load(file) ⇒ Object
Loads Ruby format gemspec from file
.
535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 |
# File 'lib/rubygems/specification.rb', line 535 def self.load file return unless file && File.file?(file) file = file.dup.untaint code = if defined? Encoding File.read file, :mode => 'r:UTF-8:-' else File.read file end code.untaint begin spec = eval code, binding, file if Gem::Specification === spec spec.loaded_from = file.to_s return spec end warn "[#{file}] isn't a Gem::Specification (#{spec.class} instead)." rescue SignalException, SystemExit raise rescue SyntaxError, Exception => e warn "Invalid gemspec in [#{file}]: #{e}" end nil end |
.non_nil_attributes ⇒ Object
Specification attributes that must be non-nil
569 570 571 |
# File 'lib/rubygems/specification.rb', line 569 def self.non_nil_attributes @@non_nil_attributes.dup end |
.normalize_yaml_input(input) ⇒ Object
Make sure the YAML specification is properly formatted with dashes
576 577 578 579 580 581 582 583 584 |
# File 'lib/rubygems/specification.rb', line 576 def self.normalize_yaml_input(input) result = input.respond_to?(:read) ? input.read : input result = "--- " + result unless result =~ /\A--- / result.gsub!(/ !!null \n/, " \n") # date: 2011-04-26 00:00:00.000000000Z # date: 2011-04-26 00:00:00.000000000 Z result.gsub!(/^(date: \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+?)Z/, '\1 Z') result end |
.outdated ⇒ Object
Return a list of all outdated specifications. This method is HEAVY as it must go fetch specifications from the server.
590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 |
# File 'lib/rubygems/specification.rb', line 590 def self.outdated outdateds = [] # TODO: maybe we should switch to rubygems' version service? fetcher = Gem::SpecFetcher.fetcher latest_specs.each do |local| dependency = Gem::Dependency.new local.name, ">= #{local.version}" remotes = fetcher.find_matching dependency remotes = remotes.map { |(_, version, _), _| version } latest = remotes.sort.last outdateds << local.name if latest and local.version < latest end outdateds end |
.remove_spec(spec) ⇒ Object
Removes spec
from the known specs.
611 612 613 614 615 616 |
# File 'lib/rubygems/specification.rb', line 611 def self.remove_spec spec # TODO: beat on the tests raise "wtf: #{spec.full_name} not in #{all_names.inspect}" unless _all.include? spec _all.delete spec end |
.required_attribute?(name) ⇒ Boolean
Is name
a required attribute?
621 622 623 |
# File 'lib/rubygems/specification.rb', line 621 def self.required_attribute?(name) @@required_attributes.include? name.to_sym end |
.required_attributes ⇒ Object
Required specification attributes
628 629 630 |
# File 'lib/rubygems/specification.rb', line 628 def self.required_attributes @@required_attributes.dup end |
.reset ⇒ Object
Reset the list of known specs, running pre and post reset hooks registered in Gem.
636 637 638 639 640 641 642 643 644 |
# File 'lib/rubygems/specification.rb', line 636 def self.reset @@dirs = nil # from = caller.first(10).reject { |s| s =~ /minitest/ } # warn "" # warn "NOTE: Specification.reset from #{from.inspect}" Gem.pre_reset_hooks.each { |hook| hook.call } @@all = nil Gem.post_reset_hooks.each { |hook| hook.call } end |
Instance Method Details
#<=>(other) ⇒ Object
:nodoc:
699 700 701 |
# File 'lib/rubygems/specification.rb', line 699 def <=>(other) # :nodoc: sort_obj <=> other.sort_obj end |
#==(other) ⇒ Object
:nodoc:
703 704 705 706 707 708 |
# File 'lib/rubygems/specification.rb', line 703 def == other # :nodoc: self.class === other && name == other.name && version == other.version && platform == other.platform end |
#_dump(limit) ⇒ Object
Dump only crucial instance variables. -- MAINTAIN ORDER! (down with the man)
716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 |
# File 'lib/rubygems/specification.rb', line 716 def _dump(limit) Marshal.dump [ @rubygems_version, @specification_version, @name, @version, date, @summary, @required_ruby_version, @required_rubygems_version, @original_platform, @dependencies, @rubyforge_project, @email, @authors, @description, @homepage, true, # has_rdoc @new_platform, @licenses ] end |
#activate ⇒ Object
Activate this spec, registering it as a loaded spec and adding it's lib paths to $LOAD_PATH. Returns true if the spec was activated, false if it was previously activated. Freaks out if there are conflicts upon activation.
745 746 747 748 749 750 751 752 753 754 755 756 757 758 |
# File 'lib/rubygems/specification.rb', line 745 def activate raise_if_conflicts return false if Gem.loaded_specs[self.name] activate_dependencies add_self_to_load_path Gem.loaded_specs[self.name] = self @activated = true @loaded = true return true end |
#activate_dependencies ⇒ Object
Activate all unambiguously resolved runtime dependencies of this spec. Add any ambigous dependencies to the unresolved list to be resolved later, as needed.
765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 |
# File 'lib/rubygems/specification.rb', line 765 def activate_dependencies self.runtime_dependencies.each do |spec_dep| if loaded = Gem.loaded_specs[spec_dep.name] next if spec_dep.matches_spec? loaded msg = "can't satisfy '#{spec_dep}', already activated '#{loaded.full_name}'" e = Gem::LoadError.new msg e.name = spec_dep.name raise e end specs = spec_dep.to_specs if specs.size == 1 then specs.first.activate else name = spec_dep.name Gem.unresolved_deps[name] = Gem.unresolved_deps[name].merge spec_dep end end Gem.unresolved_deps.delete self.name end |
#add_bindir(executables) ⇒ Object
Returns an array with bindir attached to each executable in the executables
list
794 795 796 797 798 799 800 801 802 803 804 |
# File 'lib/rubygems/specification.rb', line 794 def add_bindir(executables) return nil if executables.nil? if @bindir then Array(executables).map { |e| File.join(@bindir, e) } else executables end rescue return nil end |
#add_development_dependency(gem, *requirements) ⇒ Object
Adds a development dependency named gem
with requirements
to this Gem. For example:
spec.add_development_dependency 'example', '~> 1.1', '>= 1.1.4'
Development dependencies aren't installed by default and aren't activated when a gem is required.
838 839 840 |
# File 'lib/rubygems/specification.rb', line 838 def add_development_dependency(gem, *requirements) add_dependency_with_type(gem, :development, *requirements) end |
#add_runtime_dependency(gem, *requirements) ⇒ Object Also known as: add_dependency
Adds a runtime dependency named gem
with requirements
to this Gem. For example:
spec.add_runtime_dependency 'example', '~> 1.1', '>= 1.1.4'
848 849 850 |
# File 'lib/rubygems/specification.rb', line 848 def add_runtime_dependency(gem, *requirements) add_dependency_with_type(gem, :runtime, *requirements) end |
#add_self_to_load_path ⇒ Object
Adds this spec's require paths to LOAD_PATH, in the proper location.
857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 |
# File 'lib/rubygems/specification.rb', line 857 def add_self_to_load_path paths = require_paths.map do |path| File.join full_gem_path, path end # gem directories must come after -I and ENV['RUBYLIB'] insert_index = Gem.load_path_insert_index if insert_index then # gem directories must come after -I and ENV['RUBYLIB'] $LOAD_PATH.insert(insert_index, *paths) else # we are probably testing in core, -I and RUBYLIB don't apply $LOAD_PATH.unshift(*paths) end end |
#author ⇒ Object
Singular reader for #authors
877 878 879 |
# File 'lib/rubygems/specification.rb', line 877 def val = and val.first end |
#author=(o) ⇒ Object
Singular writer for #authors
884 885 886 |
# File 'lib/rubygems/specification.rb', line 884 def o self. = [o] end |
#authors ⇒ Object
The list of author names who wrote this gem.
If you are providing multiple authors and multiple emails they should be in the same order such that:
Hash[*spec..zip(spec.emails).flatten]
Gives a hash of author name to email address.
898 899 900 |
# File 'lib/rubygems/specification.rb', line 898 def @authors ||= [] end |
#authors=(value) ⇒ Object
Sets the list of authors, ensuring it is an array.
905 906 907 |
# File 'lib/rubygems/specification.rb', line 905 def value @authors = Array(value).flatten.grep(String) end |
#base_dir ⇒ Object
Returns the full path to the base gem directory.
eg: /usr/local/lib/ruby/gems/1.8
914 915 916 917 |
# File 'lib/rubygems/specification.rb', line 914 def base_dir return Gem.dir unless loaded_from @base_dir ||= File.dirname File.dirname loaded_from end |
#bin_dir ⇒ Object
Returns the full path to installed gem's bin directory.
NOTE: do not confuse this with bindir
, which is just 'bin', not a full path.
925 926 927 |
# File 'lib/rubygems/specification.rb', line 925 def bin_dir @bin_dir ||= File.join gem_dir, bindir # TODO: this is unfortunate end |
#bin_file(name) ⇒ Object
Returns the full path to an executable named name
in this gem.
932 933 934 |
# File 'lib/rubygems/specification.rb', line 932 def bin_file name File.join bin_dir, name end |
#cache_dir ⇒ Object
Returns the full path to the cache directory containing this spec's cached gem.
940 941 942 |
# File 'lib/rubygems/specification.rb', line 940 def cache_dir @cache_dir ||= File.join base_dir, "cache" end |
#cache_file ⇒ Object Also known as: cache_gem
Returns the full path to the cached gem for this spec.
947 948 949 |
# File 'lib/rubygems/specification.rb', line 947 def cache_file @cache_file ||= File.join cache_dir, "#{full_name}.gem" end |
#conflicts ⇒ Object
Return any possible conflicts against the currently loaded specs.
956 957 958 959 960 961 962 963 964 965 966 |
# File 'lib/rubygems/specification.rb', line 956 def conflicts conflicts = {} Gem.loaded_specs.values.each do |spec| bad = self.runtime_dependencies.find_all { |dep| spec.name == dep.name and not spec.satisfies_requirement? dep } conflicts[spec] = bad unless bad.empty? end conflicts end |
#contains_requirable_file?(file) ⇒ Boolean
Return true if this spec can require file
.
971 972 973 974 975 976 977 978 979 980 981 982 983 |
# File 'lib/rubygems/specification.rb', line 971 def contains_requirable_file? file root = full_gem_path require_paths.each do |lib| base = "#{root}/#{lib}/#{file}" Gem.suffixes.each do |suf| path = "#{base}#{suf}" return true if File.file? path end end return false end |
#date ⇒ Object
The date this gem was created. Lazily defaults to TODAY.
988 989 990 |
# File 'lib/rubygems/specification.rb', line 988 def date @date ||= TODAY end |
#date=(date) ⇒ Object
The date this gem was created
Do not set this, it is set automatically when the gem is packaged.
997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 |
# File 'lib/rubygems/specification.rb', line 997 def date= date # We want to end up with a Time object with one-day resolution. # This is the cleanest, most-readable, faster-than-using-Date # way to do it. @date = case date when String then if /\A(\d{4})-(\d{2})-(\d{2})\Z/ =~ date then Time.utc($1.to_i, $2.to_i, $3.to_i) # Workaround for where the date format output from psych isn't # parsed as a Time object by syck and thus comes through as a # string. elsif /\A(\d{4})-(\d{2})-(\d{2}) \d{2}:\d{2}:\d{2}\.\d+?Z\z/ =~ date then Time.utc($1.to_i, $2.to_i, $3.to_i) else raise(Gem::InvalidSpecificationException, "invalid date format in specification: #{date.inspect}") end when Time, Date then Time.utc(date.year, date.month, date.day) else TODAY end end |
#default_value(name) ⇒ Object
The default value for specification attribute name
1042 1043 1044 |
# File 'lib/rubygems/specification.rb', line 1042 def default_value name @@default_value[name] end |
#dependencies ⇒ Object
A list of Gem::Dependency objects this gem depends on.
Use #add_dependency or #add_development_dependency to add dependencies to a gem.
1052 1053 1054 |
# File 'lib/rubygems/specification.rb', line 1052 def dependencies @dependencies ||= [] end |
#dependent_gems ⇒ Object
Return a list of all gems that have a dependency on this gemspec. The list is structured with entries that conform to:
[depending_gem, dependency, [list_of_gems_that_satisfy_dependency]]
1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 |
# File 'lib/rubygems/specification.rb', line 1062 def dependent_gems out = [] Gem::Specification.each do |spec| spec.dependencies.each do |dep| if self.satisfies_requirement?(dep) then sats = [] find_all_satisfiers(dep) do |sat| sats << sat end out << [spec, dep, sats] end end end out end |
#dependent_specs ⇒ Object
Returns all specs that matches this spec's runtime dependencies.
1081 1082 1083 |
# File 'lib/rubygems/specification.rb', line 1081 def dependent_specs runtime_dependencies.map { |dep| dep.to_specs }.flatten end |
#development_dependencies ⇒ Object
List of dependencies that are used for development
1095 1096 1097 |
# File 'lib/rubygems/specification.rb', line 1095 def development_dependencies dependencies.select { |d| d.type == :development } end |
#doc_dir ⇒ Object
Returns the full path to this spec's documentation directory.
1102 1103 1104 |
# File 'lib/rubygems/specification.rb', line 1102 def doc_dir @doc_dir ||= File.join base_dir, 'doc', full_name end |
#encode_with(coder) ⇒ Object
:nodoc:
1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 |
# File 'lib/rubygems/specification.rb', line 1106 def encode_with coder # :nodoc: mark_version coder.add 'name', @name coder.add 'version', @version platform = case @original_platform when nil, '' then 'ruby' when String then @original_platform else @original_platform.to_s end coder.add 'platform', platform attributes = @@attributes.map(&:to_s) - %w[name version platform] attributes.each do |name| coder.add name, instance_variable_get("@#{name}") end end |
#eql?(other) ⇒ Boolean
:nodoc:
1127 1128 1129 |
# File 'lib/rubygems/specification.rb', line 1127 def eql? other # :nodoc: self.class === other && same_attributes?(other) end |
#executable ⇒ Object
Singular accessor for #executables
1134 1135 1136 |
# File 'lib/rubygems/specification.rb', line 1134 def executable val = executables and val.first end |
#executable=(o) ⇒ Object
Singular accessor for #executables
1141 1142 1143 |
# File 'lib/rubygems/specification.rb', line 1141 def executable=o self.executables = [o] end |
#executables ⇒ Object
Executables included in the gem.
1148 1149 1150 |
# File 'lib/rubygems/specification.rb', line 1148 def executables @executables ||= [] end |
#executables=(value) ⇒ Object
Sets executables to value
, ensuring it is an array. Don't use this, push onto the array instead.
1156 1157 1158 1159 |
# File 'lib/rubygems/specification.rb', line 1156 def executables= value # TODO: warn about setting instead of pushing @executables = Array(value) end |
#extensions ⇒ Object
Extensions to build when installing the gem. See Gem::Installer#build_extensions for valid values.
1165 1166 1167 |
# File 'lib/rubygems/specification.rb', line 1165 def extensions @extensions ||= [] end |
#extensions=(extensions) ⇒ Object
Sets extensions to extensions
, ensuring it is an array. Don't use this, push onto the array instead.
1173 1174 1175 1176 |
# File 'lib/rubygems/specification.rb', line 1173 def extensions= extensions # TODO: warn about setting instead of pushing @extensions = Array extensions end |
#extra_rdoc_files ⇒ Object
Extra files to add to RDoc such as README or doc/examples.txt
1181 1182 1183 |
# File 'lib/rubygems/specification.rb', line 1181 def extra_rdoc_files @extra_rdoc_files ||= [] end |
#extra_rdoc_files=(files) ⇒ Object
Sets extra_rdoc_files to files
, ensuring it is an array. Don't use this, push onto the array instead.
1189 1190 1191 1192 |
# File 'lib/rubygems/specification.rb', line 1189 def extra_rdoc_files= files # TODO: warn about setting instead of pushing @extra_rdoc_files = Array files end |
#file_name ⇒ Object
The default (generated) file name of the gem. See also #spec_name.
spec.file_name # => "example-1.0.gem"
1199 1200 1201 |
# File 'lib/rubygems/specification.rb', line 1199 def file_name "#{full_name}.gem" end |
#files ⇒ Object
Files included in this gem. You cannot append to this accessor, you must assign to it.
Only add files you can require to this list, not directories, etc.
Directories are automatically stripped from this list when building a gem, other non-files cause an error.
1212 1213 1214 1215 1216 1217 1218 1219 1220 |
# File 'lib/rubygems/specification.rb', line 1212 def files # DO NOT CHANGE TO ||= ! This is not a normal accessor. (yes, it sucks) @files = [@files, @test_files, add_bindir(@executables), @extra_rdoc_files, @extensions, ].flatten.uniq.compact end |
#files=(files) ⇒ Object
Sets files to files
, ensuring it is an array.
1225 1226 1227 |
# File 'lib/rubygems/specification.rb', line 1225 def files= files @files = Array files end |
#for_cache ⇒ Object
Creates a duplicate spec without large blobs that aren't used at runtime.
1243 1244 1245 1246 1247 1248 1249 1250 |
# File 'lib/rubygems/specification.rb', line 1243 def for_cache spec = dup spec.files = nil spec.test_files = nil spec end |
#full_gem_path ⇒ Object
The full path to the gem (install path + full name).
1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 |
# File 'lib/rubygems/specification.rb', line 1255 def full_gem_path # TODO: try to get rid of this... or the awkward # TODO: also, shouldn't it default to full_name if it hasn't been written? return @full_gem_path if defined?(@full_gem_path) && @full_gem_path @full_gem_path = File. File.join(gems_dir, full_name) return @full_gem_path if File.directory? @full_gem_path @full_gem_path = File. File.join(gems_dir, original_name) end |
#full_name ⇒ Object
Returns the full name (name-version) of this Gem. Platform information is included (name-version-platform) if it is specified and not the default Ruby platform.
1272 1273 1274 1275 1276 1277 1278 |
# File 'lib/rubygems/specification.rb', line 1272 def full_name if platform == Gem::Platform::RUBY or platform.nil? then "#{@name}-#{@version}" else "#{@name}-#{@version}-#{platform}" end end |
#gem_dir ⇒ Object
Returns the full path to this spec's gem directory. eg: /usr/local/lib/ruby/1.8/gems/mygem-1.0
1284 1285 1286 |
# File 'lib/rubygems/specification.rb', line 1284 def gem_dir @gem_dir ||= File. File.join(gems_dir, full_name) end |
#gems_dir ⇒ Object
Returns the full path to the gems directory containing this spec's gem directory. eg: /usr/local/lib/ruby/1.8/gems
1292 1293 1294 1295 |
# File 'lib/rubygems/specification.rb', line 1292 def gems_dir # TODO: this logic seems terribly broken, but tests fail if just base_dir @gems_dir ||= File.join(loaded_from && base_dir || Gem.dir, "gems") end |
#has_rdoc ⇒ Object Also known as: has_rdoc?
Deprecated and ignored, defaults to true.
Formerly used to indicate this gem was RDoc-capable.
1302 1303 1304 |
# File 'lib/rubygems/specification.rb', line 1302 def has_rdoc true end |
#has_rdoc=(ignored) ⇒ Object
Deprecated and ignored.
Formerly used to indicate this gem was RDoc-capable.
1311 1312 1313 |
# File 'lib/rubygems/specification.rb', line 1311 def has_rdoc= ignored @has_rdoc = true end |
#has_unit_tests? ⇒ Boolean Also known as: has_test_suite?
True if this gem has files in test_files
1320 1321 1322 |
# File 'lib/rubygems/specification.rb', line 1320 def has_unit_tests? not test_files.empty? end |
#hash ⇒ Object
:startdoc:
1328 1329 1330 1331 1332 |
# File 'lib/rubygems/specification.rb', line 1328 def hash # :nodoc: @@attributes.inject(0) { |hash_code, (name, _)| hash_code ^ self.send(name).hash } end |
#init_with(coder) ⇒ Object
:nodoc:
1334 1335 1336 |
# File 'lib/rubygems/specification.rb', line 1334 def init_with coder # :nodoc: yaml_initialize coder.tag, coder.map end |
#initialize_copy(other_spec) ⇒ Object
Duplicates array_attributes from other_spec
so state isn't shared.
1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 |
# File 'lib/rubygems/specification.rb', line 1374 def initialize_copy other_spec other_ivars = other_spec.instance_variables other_ivars = other_ivars.map { |ivar| ivar.intern } if # for 1.9 String === other_ivars.first self.class.array_attributes.each do |name| name = :"@#{name}" next unless other_ivars.include? name begin val = other_spec.instance_variable_get(name) if val then instance_variable_set name, val.dup elsif Gem.configuration.really_verbose warn "WARNING: #{full_name} has an invalid nil value for #{name}" end rescue TypeError e = Gem::FormatException.new \ "#{full_name} has an invalid value for #{name}" e.file_path = loaded_from raise e end end end |
#installation_path ⇒ Object
The directory that this gem was installed into. TODO: rename - horrible. this is the base_dir for a gem path
1404 1405 1406 |
# File 'lib/rubygems/specification.rb', line 1404 def installation_path loaded_from && base_dir end |
#lib_dirs_glob ⇒ Object
Returns a string usable in Dir.glob to match all requirable paths for this spec.
1412 1413 1414 1415 1416 1417 1418 1419 1420 |
# File 'lib/rubygems/specification.rb', line 1412 def lib_dirs_glob dirs = if self.require_paths.size > 1 then "{#{self.require_paths.join(',')}}" else self.require_paths.first end "#{self.full_gem_path}/#{dirs}" end |
#lib_files ⇒ Object
Files in the Gem under one of the require_paths
1425 1426 1427 1428 1429 1430 1431 |
# File 'lib/rubygems/specification.rb', line 1425 def lib_files @files.select do |file| require_paths.any? do |path| file.index(path) == 0 end end end |
#license ⇒ Object
Singular accessor for #licenses
1436 1437 1438 |
# File 'lib/rubygems/specification.rb', line 1436 def license val = licenses and val.first end |
#license=(o) ⇒ Object
Singular accessor for #licenses
1443 1444 1445 |
# File 'lib/rubygems/specification.rb', line 1443 def license=o self.licenses = [o] end |
#licenses ⇒ Object
The license(s) for the library. Each license must be a short name, no more than 64 characters.
1451 1452 1453 |
# File 'lib/rubygems/specification.rb', line 1451 def licenses @licenses ||= [] end |
#licenses=(licenses) ⇒ Object
Set licenses to licenses
, ensuring it is an array.
1458 1459 1460 |
# File 'lib/rubygems/specification.rb', line 1458 def licenses= licenses @licenses = Array licenses end |
#mark_version ⇒ Object
Sets the rubygems_version to the current RubyGems version.
1473 1474 1475 |
# File 'lib/rubygems/specification.rb', line 1473 def mark_version @rubygems_version = Gem::VERSION end |
#matches_for_glob(glob) ⇒ Object
Return all files in this gem that match for glob
.
1480 1481 1482 1483 1484 1485 |
# File 'lib/rubygems/specification.rb', line 1480 def matches_for_glob glob # TODO: rename? # TODO: do we need these?? Kill it glob = File.join(self.lib_dirs_glob, glob) Dir[glob].map { |f| f.untaint } # FIX our tests are broken, run w/ SAFE=1 end |
#normalize ⇒ Object
Normalize the list of files so that:
-
All file lists have redundancies removed.
-
Files referenced in the extra_rdoc_files are included in the package file list.
1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 |
# File 'lib/rubygems/specification.rb', line 1505 def normalize if defined?(@extra_rdoc_files) and @extra_rdoc_files then @extra_rdoc_files.uniq! @files ||= [] @files.concat(@extra_rdoc_files) end @files = @files.uniq if @files @extensions = @extensions.uniq if @extensions @test_files = @test_files.uniq if @test_files @executables = @executables.uniq if @executables @extra_rdoc_files = @extra_rdoc_files.uniq if @extra_rdoc_files end |
#original_name ⇒ Object
Returns the full name (name-version) of this gemspec using the original platform. For use with legacy gems.
1523 1524 1525 1526 1527 1528 1529 |
# File 'lib/rubygems/specification.rb', line 1523 def original_name # :nodoc: if platform == Gem::Platform::RUBY or platform.nil? then "#{@name}-#{@version}" else "#{@name}-#{@version}-#{@original_platform}" end end |
#platform ⇒ Object
The platform this gem runs on. See Gem::Platform for details.
1541 1542 1543 |
# File 'lib/rubygems/specification.rb', line 1541 def platform @new_platform ||= Gem::Platform::RUBY end |
#platform=(platform) ⇒ Object
The platform this gem runs on. See Gem::Platform for details.
Setting this to any value other than Gem::Platform::RUBY or Gem::Platform::CURRENT is probably wrong.
1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 |
# File 'lib/rubygems/specification.rb', line 1551 def platform= platform if @original_platform.nil? or @original_platform == Gem::Platform::RUBY then @original_platform = platform end case platform when Gem::Platform::CURRENT then @new_platform = Gem::Platform.local @original_platform = @new_platform.to_s when Gem::Platform then @new_platform = platform # legacy constants when nil, Gem::Platform::RUBY then @new_platform = Gem::Platform::RUBY when 'mswin32' then # was Gem::Platform::WIN32 @new_platform = Gem::Platform.new 'x86-mswin32' when 'i586-linux' then # was Gem::Platform::LINUX_586 @new_platform = Gem::Platform.new 'x86-linux' when 'powerpc-darwin' then # was Gem::Platform::DARWIN @new_platform = Gem::Platform.new 'ppc-darwin' else @new_platform = Gem::Platform.new platform end @platform = @new_platform.to_s @new_platform end |
#pretty_print(q) ⇒ Object
:nodoc:
1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 |
# File 'lib/rubygems/specification.rb', line 1583 def pretty_print(q) # :nodoc: q.group 2, 'Gem::Specification.new do |s|', 'end' do q.breakable # REFACTOR: each_attr - use in to_yaml as well @@attributes.each do |attr_name| current_value = self.send attr_name if current_value != default_value(attr_name) or self.class.required_attribute? attr_name then q.text "s.#{attr_name} = " if attr_name == :date then current_value = current_value.utc q.text "Time.utc(#{current_value.year}, #{current_value.month}, #{current_value.day})" else q.pp current_value end q.breakable end end end end |
#raise_if_conflicts ⇒ Object
Check the spec for possible conflicts and freak out if there are any.
1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 |
# File 'lib/rubygems/specification.rb', line 1612 def raise_if_conflicts other = Gem.loaded_specs[self.name] if other and self.version != other.version then # This gem is already loaded. If the currently loaded gem is not in the # list of candidate gems, then we have a version conflict. msg = "can't activate #{full_name}, already activated #{other.full_name}" e = Gem::LoadError.new msg e.name = self.name # TODO: e.requirement = dep.requirement raise e end conf = self.conflicts unless conf.empty? then y = conf.map { |act,con| "#{act.full_name} conflicts with #{con.join(", ")}" }.join ", " # TODO: improve message by saying who activated `con` raise Gem::LoadError, "Unable to activate #{self.full_name}, because #{y}" end end |
#rdoc_options ⇒ Object
An ARGV style array of options to RDoc
1644 1645 1646 |
# File 'lib/rubygems/specification.rb', line 1644 def @rdoc_options ||= [] end |
#rdoc_options=(options) ⇒ Object
Sets rdoc_options to value
, ensuring it is an array. Don't use this, push onto the array instead.
1652 1653 1654 1655 |
# File 'lib/rubygems/specification.rb', line 1652 def # TODO: warn about setting instead of pushing @rdoc_options = Array end |
#require_path ⇒ Object
Singular accessor for #require_paths
1660 1661 1662 |
# File 'lib/rubygems/specification.rb', line 1660 def require_path val = require_paths and val.first end |
#require_path=(path) ⇒ Object
Singular accessor for #require_paths
1667 1668 1669 |
# File 'lib/rubygems/specification.rb', line 1667 def require_path= path self.require_paths = [path] end |
#requirements ⇒ Object
An array or things required by this gem. Not used by anything presently.
1689 1690 1691 |
# File 'lib/rubygems/specification.rb', line 1689 def requirements @requirements ||= [] end |
#requirements=(req) ⇒ Object
Set requirements to req
, ensuring it is an array. Don't use this, push onto the array instead.
1697 1698 1699 1700 |
# File 'lib/rubygems/specification.rb', line 1697 def requirements= req # TODO: warn about setting instead of pushing @requirements = Array req end |
#ri_dir ⇒ Object
Returns the full path to this spec's ri directory.
1705 1706 1707 |
# File 'lib/rubygems/specification.rb', line 1705 def ri_dir @ri_dir ||= File.join base_dir, 'ri', full_name end |
#runtime_dependencies ⇒ Object
List of dependencies that will automatically be activated at runtime.
1733 1734 1735 |
# File 'lib/rubygems/specification.rb', line 1733 def runtime_dependencies dependencies.select { |d| d.type == :runtime } end |
#satisfies_requirement?(dependency) ⇒ Boolean
Checks if this specification meets the requirement of dependency
.
1749 1750 1751 1752 |
# File 'lib/rubygems/specification.rb', line 1749 def satisfies_requirement? dependency return @name == dependency.name && dependency.requirement.satisfied_by?(@version) end |
#sort_obj ⇒ Object
Returns an object you can use to sort specifications in #sort_by.
1757 1758 1759 1760 |
# File 'lib/rubygems/specification.rb', line 1757 def sort_obj # TODO: this is horrible. Deprecate it. [@name, @version, @new_platform == Gem::Platform::RUBY ? -1 : 1] end |
#spec_dir ⇒ Object
Returns the full path to the directory containing this spec's gemspec file. eg: /usr/local/lib/ruby/gems/1.8/specifications
1766 1767 1768 |
# File 'lib/rubygems/specification.rb', line 1766 def spec_dir @spec_dir ||= File.join base_dir, "specifications" end |
#spec_file ⇒ Object
Returns the full path to this spec's gemspec file. eg: /usr/local/lib/ruby/gems/1.8/specifications/mygem-1.0.gemspec
1774 1775 1776 |
# File 'lib/rubygems/specification.rb', line 1774 def spec_file @spec_file ||= File.join spec_dir, "#{full_name}.gemspec" end |
#spec_name ⇒ Object
The default name of the gemspec. See also #file_name
spec.spec_name # => "example-1.0.gemspec"
1783 1784 1785 |
# File 'lib/rubygems/specification.rb', line 1783 def spec_name "#{full_name}.gemspec" end |
#test_file ⇒ Object
Singular accessor for #test_files
1798 1799 1800 |
# File 'lib/rubygems/specification.rb', line 1798 def test_file val = test_files and val.first end |
#test_file=(file) ⇒ Object
Singular accessor for #test_files
1805 1806 1807 |
# File 'lib/rubygems/specification.rb', line 1805 def test_file= file self.test_files = [file] end |
#test_files ⇒ Object
Test files included in this gem. You cannot append to this accessor, you must assign to it.
1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 |
# File 'lib/rubygems/specification.rb', line 1813 def test_files # Handle the possibility that we have @test_suite_file but not # @test_files. This will happen when an old gem is loaded via # YAML. if defined? @test_suite_file then @test_files = [@test_suite_file].flatten @test_suite_file = nil end if defined?(@test_files) and @test_files then @test_files else @test_files = [] end end |
#test_files=(files) ⇒ Object
Set test_files to files
, ensuring it is an array.
1831 1832 1833 |
# File 'lib/rubygems/specification.rb', line 1831 def test_files= files @test_files = Array files end |
#test_suite_file ⇒ Object
:nodoc:
1835 1836 1837 1838 |
# File 'lib/rubygems/specification.rb', line 1835 def test_suite_file # :nodoc: # TODO: deprecate test_files.first end |
#test_suite_file=(file) ⇒ Object
:nodoc:
1840 1841 1842 1843 1844 |
# File 'lib/rubygems/specification.rb', line 1840 def test_suite_file= file # :nodoc: # TODO: deprecate @test_files = [] unless defined? @test_files @test_files << file end |
#to_ruby ⇒ Object
Returns a Ruby code representation of this specification, such that it can be eval'ed and reconstruct the same specification later. Attributes that still have their default values are omitted.
1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 |
# File 'lib/rubygems/specification.rb', line 1851 def to_ruby mark_version result = [] result << "# -*- encoding: utf-8 -*-" result << nil result << "Gem::Specification.new do |s|" result << " s.name = #{ruby_code name}" result << " s.version = #{ruby_code version}" unless platform.nil? or platform == Gem::Platform::RUBY then result << " s.platform = #{ruby_code original_platform}" end result << "" result << " s.required_rubygems_version = #{ruby_code required_rubygems_version} if s.respond_to? :required_rubygems_version=" handled = [ :dependencies, :name, :platform, :required_rubygems_version, :specification_version, :version, :has_rdoc, :default_executable, ] @@attributes.each do |attr_name| next if handled.include? attr_name current_value = self.send(attr_name) if current_value != default_value(attr_name) or self.class.required_attribute? attr_name then result << " s.#{attr_name} = #{ruby_code current_value}" end end result << nil result << " if s.respond_to? :specification_version then" result << " s.specification_version = #{specification_version}" result << nil result << " if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then" dependencies.each do |dep| req = dep.requirements_list.inspect dep.instance_variable_set :@type, :runtime if dep.type.nil? # HACK result << " s.add_#{dep.type}_dependency(%q<#{dep.name}>, #{req})" end result << " else" dependencies.each do |dep| version_reqs_param = dep.requirements_list.inspect result << " s.add_dependency(%q<#{dep.name}>, #{version_reqs_param})" end result << ' end' result << " else" dependencies.each do |dep| version_reqs_param = dep.requirements_list.inspect result << " s.add_dependency(%q<#{dep.name}>, #{version_reqs_param})" end result << " end" result << "end" result << nil result.join "\n" end |
#to_ruby_for_cache ⇒ Object
Returns a Ruby lighter-weight code representation of this specification, used for indexing only.
See #to_ruby.
1927 1928 1929 |
# File 'lib/rubygems/specification.rb', line 1927 def to_ruby_for_cache for_cache.to_ruby end |
#to_s ⇒ Object
:nodoc:
1931 1932 1933 |
# File 'lib/rubygems/specification.rb', line 1931 def to_s # :nodoc: "#<Gem::Specification name=#{@name} version=#{@version}>" end |
#to_yaml(opts = {}) ⇒ Object
:nodoc:
1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 |
# File 'lib/rubygems/specification.rb', line 1935 def to_yaml(opts = {}) # :nodoc: if YAML.const_defined?(:ENGINE) && !YAML::ENGINE.syck? then # Because the user can switch the YAML engine behind our # back, we have to check again here to make sure that our # psych code was properly loaded, and load it if not. unless Gem.const_defined?(:NoAliasYAMLTree) require 'rubygems/psych_tree' end builder = Gem::NoAliasYAMLTree.new({}) builder << self ast = builder.tree io = StringIO.new Psych::Visitors::Emitter.new(io).accept(ast) io.string.gsub(/ !!null \n/, " \n") else YAML.quick_emit object_id, opts do |out| out.map taguri, to_yaml_style do |map| encode_with map end end end end |
#traverse(trail = [], &block) ⇒ Object
Recursively walk dependencies of this spec, executing the block
for each hop.
1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 |
# File 'lib/rubygems/specification.rb', line 1966 def traverse trail = [], &block trail = trail + [self] runtime_dependencies.each do |dep| dep.to_specs.each do |dep_spec| block[self, dep, dep_spec, trail + [dep_spec]] dep_spec.traverse(trail, &block) unless trail.map(&:name).include? dep_spec.name end end end |
#validate(packaging = true) ⇒ Object
Checks that the specification contains all required fields, and does a very basic sanity check.
Raises InvalidSpecificationException if the spec does not pass the checks..
1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 |
# File 'lib/rubygems/specification.rb', line 1984 def validate packaging = true require 'rubygems/user_interaction' extend Gem::UserInteraction normalize nil_attributes = self.class.non_nil_attributes.find_all do |name| instance_variable_get("@#{name}").nil? end unless nil_attributes.empty? then raise Gem::InvalidSpecificationException, "#{nil_attributes.join ', '} must not be nil" end if packaging and rubygems_version != Gem::VERSION then raise Gem::InvalidSpecificationException, "expected RubyGems version #{Gem::VERSION}, was #{rubygems_version}" end @@required_attributes.each do |symbol| unless self.send symbol then raise Gem::InvalidSpecificationException, "missing value for attribute #{symbol}" end end unless String === name then raise Gem::InvalidSpecificationException, "invalid value for attribute name: \"#{name.inspect}\"" end if require_paths.empty? then raise Gem::InvalidSpecificationException, 'specification must have at least one require_path' end @files.delete_if { |x| File.directory?(x) } @test_files.delete_if { |x| File.directory?(x) } @executables.delete_if { |x| File.directory?(File.join(@bindir, x)) } @extra_rdoc_files.delete_if { |x| File.directory?(x) } @extensions.delete_if { |x| File.directory?(x) } non_files = files.reject { |x| File.file?(x) } unless not packaging or non_files.empty? then raise Gem::InvalidSpecificationException, "[\"#{non_files.join "\", \""}\"] are not files" end unless specification_version.is_a?(Fixnum) raise Gem::InvalidSpecificationException, 'specification_version must be a Fixnum (did you mean version?)' end case platform when Gem::Platform, Gem::Platform::RUBY then # ok else raise Gem::InvalidSpecificationException, "invalid platform #{platform.inspect}, see Gem::Platform" end self.class.array_attributes.each do |field| val = self.send field klass = case field when :dependencies Gem::Dependency else String end unless Array === val and val.all? { |x| x.kind_of?(klass) } then raise(Gem::InvalidSpecificationException, "#{field} must be an Array of #{klass}") end end [:authors].each do |field| val = self.send field raise Gem::InvalidSpecificationException, "#{field} may not be empty" if val.empty? end licenses.each { |license| if license.length > 64 raise Gem::InvalidSpecificationException, "each license must be 64 characters or less" end } # reject lazy developers: lazy = '"FIxxxXME" or "TOxxxDO"'.gsub(/xxx/, '') unless .grep(/FI XME|TO DO/x).empty? then raise Gem::InvalidSpecificationException, "#{lazy} is not an author" end unless Array(email).grep(/FI XME|TO DO/x).empty? then raise Gem::InvalidSpecificationException, "#{lazy} is not an email" end if description =~ /FI XME|TO DO/x then raise Gem::InvalidSpecificationException, "#{lazy} is not a description" end if summary =~ /FI XME|TO DO/x then raise Gem::InvalidSpecificationException, "#{lazy} is not a summary" end if homepage and not homepage.empty? and homepage !~ /\A[a-z][a-z\d+.-]*:/i then raise Gem::InvalidSpecificationException, "\"#{homepage}\" is not a URI" end # Warnings %w[author description email homepage summary].each do |attribute| value = self.send attribute alert_warning "no #{attribute} specified" if value.nil? or value.empty? end if description == summary then alert_warning 'description and summary are identical' end # TODO: raise at some given date alert_warning "deprecated autorequire specified" if autorequire executables.each do |executable| executable_path = File.join(bindir, executable) shebang = File.read(executable_path, 2) == '#!' alert_warning "#{executable_path} is missing #! line" unless shebang end true end |
#yaml_initialize(tag, vals) ⇒ Object
FIX: have this handle the platform/new_platform/original_platform bullshit
2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 |
# File 'lib/rubygems/specification.rb', line 2135 def yaml_initialize(tag, vals) # :nodoc: vals.each do |ivar, val| case ivar when "date" # Force Date to go through the extra coerce logic in date= self.date = val.untaint else instance_variable_set "@#{ivar}", val.untaint end end @original_platform = @platform # for backwards compatibility self.platform = Gem::Platform.new @platform end |