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
.
1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 |
# File 'lib/rubygems/specification.rb', line 1331 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.
1478 1479 1480 1481 1482 1483 1484 1485 |
# File 'lib/rubygems/specification.rb', line 1478 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.
1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 |
# File 'lib/rubygems/specification.rb', line 1016 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
.
1522 1523 1524 |
# File 'lib/rubygems/specification.rb', line 1522 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 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 |
# File 'lib/rubygems/specification.rb', line 263 def self._all # :nodoc: unless defined?(@@all) && @@all then specs = [] self.dirs.reverse_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 if spec } } @@all = specs _resort! end @@all end |
._load(str) ⇒ Object
Load custom marshal format, re-initializing defaults as needed
648 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 |
# File 'lib/rubygems/specification.rb', line 648 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 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.instance_variable_set :@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:
282 283 284 285 286 287 288 |
# File 'lib/rubygems/specification.rb', line 282 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.
294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 |
# File 'lib/rubygems/specification.rb', line 294 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.
314 315 316 317 318 319 320 321 322 323 324 |
# File 'lib/rubygems/specification.rb', line 314 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.
330 331 332 333 334 |
# File 'lib/rubygems/specification.rb', line 330 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
348 349 350 |
# File 'lib/rubygems/specification.rb', line 348 def self.all= specs @@all = specs end |
.all_names ⇒ Object
Return full names of all specs in sorted order.
355 356 357 |
# File 'lib/rubygems/specification.rb', line 355 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…
364 365 366 |
# File 'lib/rubygems/specification.rb', line 364 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…
373 374 375 |
# File 'lib/rubygems/specification.rb', line 373 def self.attribute_names @@attributes.dup end |
.dirs ⇒ Object
Return the directories that Specification uses to find specs.
380 381 382 383 384 |
# File 'lib/rubygems/specification.rb', line 380 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.
390 391 392 393 394 395 396 397 398 |
# File 'lib/rubygems/specification.rb', line 390 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.
406 407 408 409 410 411 412 |
# File 'lib/rubygems/specification.rb', line 406 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
.
417 418 419 420 421 422 423 |
# File 'lib/rubygems/specification.rb', line 417 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.
429 430 431 432 433 434 435 |
# File 'lib/rubygems/specification.rb', line 429 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
.
440 441 442 443 444 |
# File 'lib/rubygems/specification.rb', line 440 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
.
449 450 451 452 453 454 |
# File 'lib/rubygems/specification.rb', line 449 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
.
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 |
# File 'lib/rubygems/specification.rb', line 460 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.
486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 |
# File 'lib/rubygems/specification.rb', line 486 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.
514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 |
# File 'lib/rubygems/specification.rb', line 514 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
.
534 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 |
# File 'lib/rubygems/specification.rb', line 534 def self.load file return unless file && File.file?(file) file = file.dup.untaint code = if defined? Encoding File.read file, :encoding => "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
568 569 570 |
# File 'lib/rubygems/specification.rb', line 568 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
575 576 577 578 579 580 581 582 583 |
# File 'lib/rubygems/specification.rb', line 575 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.
589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 |
# File 'lib/rubygems/specification.rb', line 589 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.
610 611 612 613 614 615 |
# File 'lib/rubygems/specification.rb', line 610 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?
620 621 622 |
# File 'lib/rubygems/specification.rb', line 620 def self.required_attribute?(name) @@required_attributes.include? name.to_sym end |
.required_attributes ⇒ Object
Required specification attributes
627 628 629 |
# File 'lib/rubygems/specification.rb', line 627 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.
635 636 637 638 639 640 641 642 643 |
# File 'lib/rubygems/specification.rb', line 635 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:
693 694 695 |
# File 'lib/rubygems/specification.rb', line 693 def <=>(other) # :nodoc: sort_obj <=> other.sort_obj end |
#==(other) ⇒ Object
:nodoc:
697 698 699 700 701 702 |
# File 'lib/rubygems/specification.rb', line 697 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)
710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 |
# File 'lib/rubygems/specification.rb', line 710 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, , @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.
739 740 741 742 743 744 745 746 747 748 749 750 751 752 |
# File 'lib/rubygems/specification.rb', line 739 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.
759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 |
# File 'lib/rubygems/specification.rb', line 759 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
788 789 790 791 792 793 794 795 796 797 798 |
# File 'lib/rubygems/specification.rb', line 788 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.
832 833 834 |
# File 'lib/rubygems/specification.rb', line 832 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'
842 843 844 |
# File 'lib/rubygems/specification.rb', line 842 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.
851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 |
# File 'lib/rubygems/specification.rb', line 851 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
871 872 873 |
# File 'lib/rubygems/specification.rb', line 871 def val = and val.first end |
#author=(o) ⇒ Object
Singular writer for #authors
878 879 880 |
# File 'lib/rubygems/specification.rb', line 878 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.
892 893 894 |
# File 'lib/rubygems/specification.rb', line 892 def ||= [] end |
#authors=(value) ⇒ Object
Sets the list of authors, ensuring it is an array.
899 900 901 |
# File 'lib/rubygems/specification.rb', line 899 def value = 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
908 909 910 911 |
# File 'lib/rubygems/specification.rb', line 908 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.
919 920 921 |
# File 'lib/rubygems/specification.rb', line 919 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.
926 927 928 |
# File 'lib/rubygems/specification.rb', line 926 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.
934 935 936 |
# File 'lib/rubygems/specification.rb', line 934 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.
941 942 943 |
# File 'lib/rubygems/specification.rb', line 941 def cache_file @cache_file ||= File.join cache_dir, "#{full_name}.gem" end |
#conflicts ⇒ Object
Return any possible conflicts against the currently loaded specs.
950 951 952 953 954 955 956 957 958 959 960 |
# File 'lib/rubygems/specification.rb', line 950 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
.
965 966 967 968 969 970 971 972 973 974 975 976 977 |
# File 'lib/rubygems/specification.rb', line 965 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.
982 983 984 |
# File 'lib/rubygems/specification.rb', line 982 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.
991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 |
# File 'lib/rubygems/specification.rb', line 991 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) 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
1030 1031 1032 |
# File 'lib/rubygems/specification.rb', line 1030 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.
1040 1041 1042 |
# File 'lib/rubygems/specification.rb', line 1040 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]]
1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 |
# File 'lib/rubygems/specification.rb', line 1050 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.
1069 1070 1071 |
# File 'lib/rubygems/specification.rb', line 1069 def dependent_specs runtime_dependencies.map { |dep| dep.to_specs }.flatten end |
#development_dependencies ⇒ Object
List of dependencies that are used for development
1083 1084 1085 |
# File 'lib/rubygems/specification.rb', line 1083 def development_dependencies dependencies.select { |d| d.type == :development } end |
#doc_dir ⇒ Object
Returns the full path to this spec’s documentation directory.
1090 1091 1092 |
# File 'lib/rubygems/specification.rb', line 1090 def doc_dir @doc_dir ||= File.join base_dir, 'doc', full_name end |
#encode_with(coder) ⇒ Object
:nodoc:
1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 |
# File 'lib/rubygems/specification.rb', line 1094 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:
1115 1116 1117 |
# File 'lib/rubygems/specification.rb', line 1115 def eql? other # :nodoc: self.class === other && same_attributes?(other) end |
#executable ⇒ Object
Singular accessor for #executables
1122 1123 1124 |
# File 'lib/rubygems/specification.rb', line 1122 def executable val = executables and val.first end |
#executable=(o) ⇒ Object
Singular accessor for #executables
1129 1130 1131 |
# File 'lib/rubygems/specification.rb', line 1129 def executable=o self.executables = [o] end |
#executables ⇒ Object
Executables included in the gem.
1136 1137 1138 |
# File 'lib/rubygems/specification.rb', line 1136 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.
1144 1145 1146 1147 |
# File 'lib/rubygems/specification.rb', line 1144 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.
1153 1154 1155 |
# File 'lib/rubygems/specification.rb', line 1153 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.
1161 1162 1163 1164 |
# File 'lib/rubygems/specification.rb', line 1161 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
1169 1170 1171 |
# File 'lib/rubygems/specification.rb', line 1169 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.
1177 1178 1179 1180 |
# File 'lib/rubygems/specification.rb', line 1177 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"
1187 1188 1189 |
# File 'lib/rubygems/specification.rb', line 1187 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.
1200 1201 1202 1203 1204 1205 1206 1207 1208 |
# File 'lib/rubygems/specification.rb', line 1200 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.
1213 1214 1215 |
# File 'lib/rubygems/specification.rb', line 1213 def files= files @files = Array files end |
#for_cache ⇒ Object
Creates a duplicate spec without large blobs that aren’t used at runtime.
1231 1232 1233 1234 1235 1236 1237 1238 |
# File 'lib/rubygems/specification.rb', line 1231 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).
1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 |
# File 'lib/rubygems/specification.rb', line 1243 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.
1260 1261 1262 1263 1264 1265 1266 |
# File 'lib/rubygems/specification.rb', line 1260 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
1272 1273 1274 |
# File 'lib/rubygems/specification.rb', line 1272 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
1280 1281 1282 1283 |
# File 'lib/rubygems/specification.rb', line 1280 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.
1290 1291 1292 |
# File 'lib/rubygems/specification.rb', line 1290 def has_rdoc true end |
#has_rdoc=(ignored) ⇒ Object
Deprecated and ignored.
Formerly used to indicate this gem was RDoc-capable.
1299 1300 1301 |
# File 'lib/rubygems/specification.rb', line 1299 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
1308 1309 1310 |
# File 'lib/rubygems/specification.rb', line 1308 def has_unit_tests? not test_files.empty? end |
#hash ⇒ Object
:startdoc:
1316 1317 1318 1319 1320 |
# File 'lib/rubygems/specification.rb', line 1316 def hash # :nodoc: @@attributes.inject(0) { |hash_code, (name, _)| hash_code ^ self.send(name).hash } end |
#init_with(coder) ⇒ Object
:nodoc:
1322 1323 1324 |
# File 'lib/rubygems/specification.rb', line 1322 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.
1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 |
# File 'lib/rubygems/specification.rb', line 1362 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 else 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
1392 1393 1394 |
# File 'lib/rubygems/specification.rb', line 1392 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.
1400 1401 1402 1403 1404 1405 1406 1407 1408 |
# File 'lib/rubygems/specification.rb', line 1400 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
1413 1414 1415 1416 1417 1418 1419 |
# File 'lib/rubygems/specification.rb', line 1413 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
1424 1425 1426 |
# File 'lib/rubygems/specification.rb', line 1424 def license val = licenses and val.first end |
#license=(o) ⇒ Object
Singular accessor for #licenses
1431 1432 1433 |
# File 'lib/rubygems/specification.rb', line 1431 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.
1439 1440 1441 |
# File 'lib/rubygems/specification.rb', line 1439 def licenses @licenses ||= [] end |
#licenses=(licenses) ⇒ Object
Set licenses to licenses
, ensuring it is an array.
1446 1447 1448 |
# File 'lib/rubygems/specification.rb', line 1446 def licenses= licenses @licenses = Array licenses end |
#mark_version ⇒ Object
Sets the rubygems_version to the current RubyGems version.
1461 1462 1463 |
# File 'lib/rubygems/specification.rb', line 1461 def mark_version @rubygems_version = Gem::VERSION end |
#matches_for_glob(glob) ⇒ Object
Return all files in this gem that match for glob
.
1468 1469 1470 1471 1472 1473 |
# File 'lib/rubygems/specification.rb', line 1468 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.
1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 |
# File 'lib/rubygems/specification.rb', line 1493 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.
1511 1512 1513 1514 1515 1516 1517 |
# File 'lib/rubygems/specification.rb', line 1511 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.
1529 1530 1531 |
# File 'lib/rubygems/specification.rb', line 1529 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.
1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 |
# File 'lib/rubygems/specification.rb', line 1539 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:
1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 |
# File 'lib/rubygems/specification.rb', line 1571 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.
1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 |
# File 'lib/rubygems/specification.rb', line 1600 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
1632 1633 1634 |
# File 'lib/rubygems/specification.rb', line 1632 def ||= [] end |
#rdoc_options=(options) ⇒ Object
Sets rdoc_options to value
, ensuring it is an array. Don’t use this, push onto the array instead.
1640 1641 1642 1643 |
# File 'lib/rubygems/specification.rb', line 1640 def # TODO: warn about setting instead of pushing = Array end |
#require_path ⇒ Object
Singular accessor for #require_paths
1648 1649 1650 |
# File 'lib/rubygems/specification.rb', line 1648 def require_path val = require_paths and val.first end |
#require_path=(path) ⇒ Object
Singular accessor for #require_paths
1655 1656 1657 |
# File 'lib/rubygems/specification.rb', line 1655 def require_path= path self.require_paths = [path] end |
#requirements ⇒ Object
An array or things required by this gem. Not used by anything presently.
1677 1678 1679 |
# File 'lib/rubygems/specification.rb', line 1677 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.
1685 1686 1687 1688 |
# File 'lib/rubygems/specification.rb', line 1685 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.
1693 1694 1695 |
# File 'lib/rubygems/specification.rb', line 1693 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.
1721 1722 1723 |
# File 'lib/rubygems/specification.rb', line 1721 def runtime_dependencies dependencies.select { |d| d.type == :runtime } end |
#satisfies_requirement?(dependency) ⇒ Boolean
Checks if this specification meets the requirement of dependency
.
1737 1738 1739 1740 |
# File 'lib/rubygems/specification.rb', line 1737 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.
1745 1746 1747 1748 |
# File 'lib/rubygems/specification.rb', line 1745 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
1754 1755 1756 |
# File 'lib/rubygems/specification.rb', line 1754 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
1762 1763 1764 |
# File 'lib/rubygems/specification.rb', line 1762 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"
1771 1772 1773 |
# File 'lib/rubygems/specification.rb', line 1771 def spec_name "#{full_name}.gemspec" end |
#test_file ⇒ Object
Singular accessor for #test_files
1786 1787 1788 |
# File 'lib/rubygems/specification.rb', line 1786 def test_file val = test_files and val.first end |
#test_file=(file) ⇒ Object
Singular accessor for #test_files
1793 1794 1795 |
# File 'lib/rubygems/specification.rb', line 1793 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.
1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 |
# File 'lib/rubygems/specification.rb', line 1801 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.
1819 1820 1821 |
# File 'lib/rubygems/specification.rb', line 1819 def test_files= files @test_files = Array files end |
#test_suite_file ⇒ Object
:nodoc:
1823 1824 1825 1826 |
# File 'lib/rubygems/specification.rb', line 1823 def test_suite_file # :nodoc: # TODO: deprecate test_files.first end |
#test_suite_file=(file) ⇒ Object
:nodoc:
1828 1829 1830 1831 1832 |
# File 'lib/rubygems/specification.rb', line 1828 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.
1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 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 |
# File 'lib/rubygems/specification.rb', line 1839 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.
1915 1916 1917 |
# File 'lib/rubygems/specification.rb', line 1915 def to_ruby_for_cache for_cache.to_ruby end |
#to_s ⇒ Object
:nodoc:
1919 1920 1921 |
# File 'lib/rubygems/specification.rb', line 1919 def to_s # :nodoc: "#<Gem::Specification name=#{@name} version=#{@version}>" end |
#to_yaml(opts = {}) ⇒ Object
:nodoc:
1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 |
# File 'lib/rubygems/specification.rb', line 1923 def to_yaml(opts = {}) # :nodoc: if YAML.const_defined?(:ENGINE) && !YAML::ENGINE.syck? then super.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.
1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 |
# File 'lib/rubygems/specification.rb', line 1939 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..
1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 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 |
# File 'lib/rubygems/specification.rb', line 1957 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
2108 2109 2110 2111 2112 2113 2114 2115 |
# File 'lib/rubygems/specification.rb', line 2108 def yaml_initialize(tag, vals) # :nodoc: vals.each do |ivar, val| instance_variable_set "@#{ivar}", val end @original_platform = @platform # for backwards compatibility self.platform = Gem::Platform.new @platform end |