rubygems-update 1.8.30 → 2.0.0.preview2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rubygems-update might be problematic. Click here for more details.
- checksums.yaml +6 -6
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +3 -0
- data/.autotest +6 -3
- data/History.txt +137 -63
- data/LICENSE.txt +1 -5
- data/Manifest.txt +69 -32
- data/README.rdoc +11 -9
- data/Rakefile +24 -38
- data/bin/gem +0 -9
- data/bin/update_rubygems +1 -0
- data/lib/rubygems.rb +193 -405
- data/lib/rubygems/available_set.rb +95 -0
- data/lib/rubygems/command.rb +88 -45
- data/lib/rubygems/command_manager.rb +67 -40
- data/lib/rubygems/commands/build_command.rb +5 -23
- data/lib/rubygems/commands/cert_command.rb +199 -57
- data/lib/rubygems/commands/check_command.rb +14 -39
- data/lib/rubygems/commands/cleanup_command.rb +9 -1
- data/lib/rubygems/commands/contents_command.rb +30 -12
- data/lib/rubygems/commands/dependency_command.rb +3 -8
- data/lib/rubygems/commands/environment_command.rb +13 -8
- data/lib/rubygems/commands/fetch_command.rb +3 -16
- data/lib/rubygems/commands/generate_index_command.rb +7 -47
- data/lib/rubygems/commands/help_command.rb +1 -1
- data/lib/rubygems/commands/install_command.rb +69 -36
- data/lib/rubygems/commands/list_command.rb +6 -4
- data/lib/rubygems/commands/lock_command.rb +1 -1
- data/lib/rubygems/commands/mirror_command.rb +17 -0
- data/lib/rubygems/commands/outdated_command.rb +6 -3
- data/lib/rubygems/commands/owner_command.rb +13 -5
- data/lib/rubygems/commands/pristine_command.rb +19 -4
- data/lib/rubygems/commands/push_command.rb +12 -1
- data/lib/rubygems/commands/query_command.rb +43 -27
- data/lib/rubygems/commands/rdoc_command.rb +23 -28
- data/lib/rubygems/commands/search_command.rb +4 -18
- data/lib/rubygems/commands/server_command.rb +1 -1
- data/lib/rubygems/commands/setup_command.rb +124 -38
- data/lib/rubygems/commands/sources_command.rb +16 -16
- data/lib/rubygems/commands/specification_command.rb +11 -13
- data/lib/rubygems/commands/uninstall_command.rb +24 -7
- data/lib/rubygems/commands/unpack_command.rb +7 -3
- data/lib/rubygems/commands/update_command.rb +22 -36
- data/lib/rubygems/commands/yank_command.rb +98 -0
- data/lib/rubygems/compatibility.rb +51 -0
- data/lib/rubygems/config_file.rb +82 -54
- data/lib/rubygems/core_ext/kernel_gem.rb +53 -0
- data/lib/rubygems/core_ext/kernel_require.rb +119 -0
- data/lib/rubygems/defaults.rb +10 -21
- data/lib/rubygems/dependency.rb +61 -10
- data/lib/rubygems/dependency_installer.rb +157 -69
- data/lib/rubygems/dependency_list.rb +11 -19
- data/lib/rubygems/dependency_resolver.rb +562 -0
- data/lib/rubygems/deprecate.rb +40 -40
- data/lib/rubygems/errors.rb +77 -24
- data/lib/rubygems/exceptions.rb +25 -7
- data/lib/rubygems/ext/builder.rb +20 -23
- data/lib/rubygems/ext/configure_builder.rb +2 -2
- data/lib/rubygems/ext/ext_conf_builder.rb +5 -45
- data/lib/rubygems/ext/rake_builder.rb +2 -2
- data/lib/rubygems/gem_runner.rb +3 -16
- data/lib/rubygems/gemcutter_utilities.rb +22 -7
- data/lib/rubygems/indexer.rb +6 -159
- data/lib/rubygems/install_message.rb +12 -0
- data/lib/rubygems/install_update_options.rb +56 -18
- data/lib/rubygems/installer.rb +244 -134
- data/lib/rubygems/installer_test_case.rb +71 -19
- data/lib/rubygems/mock_gem_ui.rb +17 -0
- data/lib/rubygems/name_tuple.rb +110 -0
- data/lib/rubygems/package.rb +514 -43
- data/lib/rubygems/package/digest_io.rb +64 -0
- data/lib/rubygems/package/old.rb +147 -0
- data/lib/rubygems/package/tar_header.rb +18 -55
- data/lib/rubygems/package/tar_reader.rb +20 -3
- data/lib/rubygems/package/tar_writer.rb +63 -7
- data/lib/rubygems/package_task.rb +3 -4
- data/lib/rubygems/path_support.rb +14 -7
- data/lib/rubygems/platform.rb +19 -26
- data/lib/rubygems/rdoc.rb +316 -0
- data/lib/rubygems/remote_fetcher.rb +117 -54
- data/lib/rubygems/request_set.rb +182 -0
- data/lib/rubygems/requirement.rb +63 -26
- data/lib/rubygems/security.rb +295 -555
- data/lib/rubygems/security/policies.rb +115 -0
- data/lib/rubygems/security/policy.rb +227 -0
- data/lib/rubygems/security/signer.rb +136 -0
- data/lib/rubygems/security/trust_dir.rb +104 -0
- data/lib/rubygems/server.rb +45 -55
- data/lib/rubygems/source.rb +144 -0
- data/lib/rubygems/source_list.rb +87 -0
- data/lib/rubygems/source_local.rb +92 -0
- data/lib/rubygems/source_specific_file.rb +28 -0
- data/lib/rubygems/spec_fetcher.rb +116 -184
- data/lib/rubygems/specification.rb +731 -335
- data/lib/rubygems/ssl_certs/AddTrustExternalCARoot.pem +88 -30
- data/lib/rubygems/ssl_certs/Entrust_net-Secure-Server-Certification-Authority.pem +90 -0
- data/lib/rubygems/ssl_certs/VerisignClass3PublicPrimaryCertificationAuthority-G2.pem +57 -0
- data/lib/rubygems/syck_hack.rb +2 -0
- data/lib/rubygems/test_case.rb +199 -109
- data/lib/rubygems/test_utilities.rb +25 -5
- data/lib/rubygems/uninstaller.rb +62 -20
- data/lib/rubygems/user_interaction.rb +10 -0
- data/lib/rubygems/validator.rb +33 -40
- data/lib/rubygems/version.rb +19 -8
- data/setup.rb +8 -1
- data/test/rubygems/alternate_cert.pem +9 -0
- data/test/rubygems/alternate_cert_32.pem +9 -0
- data/test/rubygems/alternate_key.pem +9 -0
- data/test/rubygems/bad_rake.rb +1 -0
- data/test/rubygems/child_cert.pem +9 -0
- data/test/rubygems/child_cert_32.pem +9 -0
- data/test/rubygems/child_key.pem +9 -0
- data/test/rubygems/data/null-type.gemspec.rz +0 -0
- data/test/rubygems/expired_cert.pem +9 -0
- data/test/rubygems/future_cert.pem +9 -0
- data/test/rubygems/future_cert_32.pem +9 -0
- data/test/rubygems/good_rake.rb +1 -0
- data/test/rubygems/grandchild_cert.pem +9 -0
- data/test/rubygems/grandchild_cert_32.pem +9 -0
- data/test/rubygems/grandchild_key.pem +9 -0
- data/test/rubygems/invalid_issuer_cert.pem +9 -0
- data/test/rubygems/invalid_issuer_cert_32.pem +9 -0
- data/test/rubygems/invalid_key.pem +9 -0
- data/test/rubygems/invalid_signer_cert.pem +9 -0
- data/test/rubygems/invalid_signer_cert_32.pem +9 -0
- data/test/rubygems/invalidchild_cert.pem +9 -0
- data/test/rubygems/invalidchild_cert_32.pem +9 -0
- data/test/rubygems/invalidchild_key.pem +9 -0
- data/test/rubygems/plugin/exception/rubygems_plugin.rb +1 -1
- data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +1 -1
- data/test/rubygems/private_key.pem +7 -25
- data/test/rubygems/public_cert.pem +8 -18
- data/test/rubygems/public_cert_32.pem +10 -0
- data/test/rubygems/public_key.pem +4 -0
- data/test/rubygems/rubygems/commands/crash_command.rb +1 -1
- data/test/rubygems/test_config.rb +4 -6
- data/test/rubygems/test_deprecate.rb +76 -0
- data/test/rubygems/test_gem.rb +318 -83
- data/test/rubygems/test_gem_available_set.rb +106 -0
- data/test/rubygems/test_gem_command.rb +10 -0
- data/test/rubygems/test_gem_command_manager.rb +55 -9
- data/test/rubygems/test_gem_commands_build_command.rb +11 -19
- data/test/rubygems/test_gem_commands_cert_command.rb +441 -42
- data/test/rubygems/test_gem_commands_cleanup_command.rb +29 -1
- data/test/rubygems/test_gem_commands_contents_command.rb +23 -0
- data/test/rubygems/test_gem_commands_dependency_command.rb +5 -0
- data/test/rubygems/test_gem_commands_fetch_command.rb +19 -20
- data/test/rubygems/test_gem_commands_generate_index_command.rb +2 -83
- data/test/rubygems/test_gem_commands_help_command.rb +2 -1
- data/test/rubygems/test_gem_commands_install_command.rb +647 -48
- data/test/rubygems/test_gem_commands_mirror.rb +32 -0
- data/test/rubygems/test_gem_commands_owner_command.rb +4 -8
- data/test/rubygems/test_gem_commands_pristine_command.rb +99 -4
- data/test/rubygems/test_gem_commands_push_command.rb +62 -8
- data/test/rubygems/test_gem_commands_query_command.rb +51 -0
- data/test/rubygems/test_gem_commands_search_command.rb +25 -0
- data/test/rubygems/test_gem_commands_setup_command.rb +45 -0
- data/test/rubygems/test_gem_commands_sources_command.rb +21 -6
- data/test/rubygems/test_gem_commands_specification_command.rb +33 -1
- data/test/rubygems/test_gem_commands_uninstall_command.rb +91 -31
- data/test/rubygems/test_gem_commands_unpack_command.rb +3 -3
- data/test/rubygems/test_gem_commands_update_command.rb +56 -38
- data/test/rubygems/test_gem_commands_which_command.rb +4 -4
- data/test/rubygems/test_gem_commands_yank_command.rb +97 -0
- data/test/rubygems/test_gem_config_file.rb +66 -21
- data/test/rubygems/test_gem_dependency.rb +46 -0
- data/test/rubygems/test_gem_dependency_installer.rb +228 -18
- data/test/rubygems/test_gem_dependency_list.rb +0 -9
- data/test/rubygems/test_gem_dependency_resolver.rb +327 -0
- data/test/rubygems/test_gem_ext_configure_builder.rb +4 -4
- data/test/rubygems/test_gem_ext_ext_conf_builder.rb +21 -49
- data/test/rubygems/test_gem_ext_rake_builder.rb +13 -13
- data/test/rubygems/test_gem_gem_runner.rb +27 -5
- data/test/rubygems/test_gem_gemcutter_utilities.rb +19 -0
- data/test/rubygems/test_gem_indexer.rb +14 -227
- data/test/rubygems/test_gem_install_update_options.rb +83 -3
- data/test/rubygems/test_gem_installer.rb +211 -236
- data/test/rubygems/test_gem_local_remote_options.rb +8 -2
- data/test/rubygems/test_gem_name_tuple.rb +15 -0
- data/test/rubygems/test_gem_package.rb +547 -0
- data/test/rubygems/test_gem_package_old.rb +37 -0
- data/test/rubygems/test_gem_package_tar_reader.rb +32 -0
- data/test/rubygems/test_gem_package_tar_writer.rb +84 -1
- data/test/rubygems/test_gem_path_support.rb +4 -30
- data/test/rubygems/test_gem_platform.rb +3 -6
- data/test/rubygems/test_gem_rdoc.rb +245 -0
- data/test/rubygems/test_gem_remote_fetcher.rb +51 -5
- data/test/rubygems/test_gem_request_set.rb +70 -0
- data/test/rubygems/test_gem_requirement.rb +53 -24
- data/test/rubygems/test_gem_security.rb +189 -43
- data/test/rubygems/test_gem_security_policy.rb +376 -0
- data/test/rubygems/test_gem_security_signer.rb +184 -0
- data/test/rubygems/test_gem_security_trust_dir.rb +94 -0
- data/test/rubygems/test_gem_server.rb +31 -36
- data/test/rubygems/test_gem_silent_ui.rb +2 -2
- data/test/rubygems/test_gem_source.rb +188 -0
- data/test/rubygems/test_gem_source_list.rb +87 -0
- data/test/rubygems/test_gem_source_local.rb +83 -0
- data/test/rubygems/test_gem_source_specific_file.rb +33 -0
- data/test/rubygems/test_gem_spec_fetcher.rb +91 -255
- data/test/rubygems/test_gem_specification.rb +293 -39
- data/test/rubygems/test_gem_uninstaller.rb +136 -13
- data/test/rubygems/test_gem_validator.rb +14 -41
- data/test/rubygems/test_gem_version.rb +15 -21
- data/test/rubygems/test_require.rb +193 -0
- data/test/rubygems/wrong_key_cert.pem +9 -0
- data/test/rubygems/wrong_key_cert_32.pem +9 -0
- metadata +171 -83
- metadata.gz.sig +1 -0
- data/CVE-2013-4287.txt +0 -36
- data/CVE-2013-4363.txt +0 -45
- data/ci_build.sh +0 -27
- data/cruise_config.rb +0 -32
- data/lib/rbconfig/datadir.rb +0 -13
- data/lib/rubygems/builder.rb +0 -99
- data/lib/rubygems/custom_require.rb +0 -69
- data/lib/rubygems/doc_manager.rb +0 -243
- data/lib/rubygems/format.rb +0 -82
- data/lib/rubygems/gem_openssl.rb +0 -90
- data/lib/rubygems/gem_path_searcher.rb +0 -172
- data/lib/rubygems/old_format.rb +0 -153
- data/lib/rubygems/package/f_sync_dir.rb +0 -23
- data/lib/rubygems/package/tar_input.rb +0 -234
- data/lib/rubygems/package/tar_output.rb +0 -146
- data/lib/rubygems/require_paths_builder.rb +0 -18
- data/lib/rubygems/source_index.rb +0 -406
- data/lib/rubygems/ssl_certs/AddTrustExternalCARoot-2048.pem +0 -25
- data/lib/rubygems/ssl_certs/Class3PublicPrimaryCertificationAuthority.pem +0 -14
- data/lib/rubygems/ssl_certs/DigiCertHighAssuranceEVRootCA.pem +0 -23
- data/lib/rubygems/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem +0 -28
- data/lib/rubygems/ssl_certs/GeoTrustGlobalCA.pem +0 -20
- data/test/rubygems/test_bundled_ca.rb +0 -59
- data/test/rubygems/test_gem_builder.rb +0 -44
- data/test/rubygems/test_gem_doc_manager.rb +0 -32
- data/test/rubygems/test_gem_ext_builder.rb +0 -58
- data/test/rubygems/test_gem_format.rb +0 -88
- data/test/rubygems/test_gem_gem_path_searcher.rb +0 -94
- data/test/rubygems/test_gem_package_tar_input.rb +0 -129
- data/test/rubygems/test_gem_package_tar_output.rb +0 -101
- data/test/rubygems/test_gem_source_index.rb +0 -250
- data/util/update_bundled_ca_certificates.rb +0 -103
@@ -1,36 +1,59 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
1
|
#--
|
3
2
|
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
|
4
3
|
# All rights reserved.
|
5
4
|
# See LICENSE.txt for permissions.
|
6
5
|
#++
|
7
6
|
|
7
|
+
##
|
8
|
+
# The Specification class contains the information for a Gem. Typically
|
9
|
+
# defined in a .gemspec file or a Rakefile, and looks like this:
|
10
|
+
#
|
11
|
+
# Gem::Specification.new do |s|
|
12
|
+
# s.name = 'example'
|
13
|
+
# s.version = '0.1.0'
|
14
|
+
# s.summary = "This is an example!"
|
15
|
+
# s.description = "Much longer explanation of the example!"
|
16
|
+
# s.authors = ["Ruby Coder"]
|
17
|
+
# s.email = 'rubycoder@example.com'
|
18
|
+
# s.files = ["lib/example.rb"]
|
19
|
+
# s.homepage = 'http://rubygems.org/gems/example'
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# Starting in RubyGems 1.9.0, a Specification can hold arbitrary
|
23
|
+
# metadata. This metadata is accessed via Specification#metadata
|
24
|
+
# and has the following restrictions:
|
25
|
+
#
|
26
|
+
# * Must be a Hash object
|
27
|
+
# * All keys and values must be Strings
|
28
|
+
# * Keys can be a maximum of 128 bytes and values can be a
|
29
|
+
# maximum of 1024 bytes
|
30
|
+
# * All strings must be UTF8, no binary data is allowed
|
31
|
+
#
|
32
|
+
# For example, to add metadata for the location of a bugtracker:
|
33
|
+
#
|
34
|
+
# s.metadata = { "bugtracker" => "http://somewhere.com/blah" }
|
35
|
+
#
|
36
|
+
|
37
|
+
|
8
38
|
require 'rubygems/version'
|
9
39
|
require 'rubygems/requirement'
|
10
40
|
require 'rubygems/platform'
|
11
|
-
require
|
41
|
+
require 'rubygems/deprecate'
|
12
42
|
|
13
43
|
# :stopdoc:
|
14
|
-
|
44
|
+
# date.rb can't be loaded for `make install` due to miniruby
|
45
|
+
# Date is needed for old gems that stored #date as Date instead of Time.
|
46
|
+
class Date; end
|
15
47
|
# :startdoc:
|
16
48
|
|
17
|
-
##
|
18
|
-
# The Specification class contains the metadata for a Gem. Typically
|
19
|
-
# defined in a .gemspec file or a Rakefile, and looks like this:
|
20
|
-
#
|
21
|
-
# spec = Gem::Specification.new do |s|
|
22
|
-
# s.name = 'example'
|
23
|
-
# s.version = '1.0'
|
24
|
-
# s.summary = 'Example gem specification'
|
25
|
-
# ...
|
26
|
-
# end
|
27
|
-
#
|
28
|
-
# For a great way to package gems, use Hoe.
|
29
|
-
|
30
49
|
class Gem::Specification
|
31
50
|
|
51
|
+
# REFACTOR: Consider breaking out this version stuff into a separate
|
52
|
+
# module. There's enough special stuff around it that it may justify
|
53
|
+
# a separate class.
|
54
|
+
|
32
55
|
##
|
33
|
-
# The
|
56
|
+
# The version number of a specification that does not specify one
|
34
57
|
# (i.e. RubyGems 0.7 or earlier).
|
35
58
|
|
36
59
|
NONEXISTENT_SPECIFICATION_VERSION = -1
|
@@ -50,17 +73,37 @@ class Gem::Specification
|
|
50
73
|
# 2 0.9.5 2007-10-01 Added "required_rubygems_version"
|
51
74
|
# Now forward-compatible with future versions
|
52
75
|
# 3 1.3.2 2009-01-03 Added Fixnum validation to specification_version
|
76
|
+
# 4 1.9.0 2011-06-07 Added metadata
|
53
77
|
#--
|
54
78
|
# When updating this number, be sure to also update #to_ruby.
|
55
79
|
#
|
56
80
|
# NOTE RubyGems < 1.2 cannot load specification versions > 2.
|
57
81
|
|
58
|
-
CURRENT_SPECIFICATION_VERSION =
|
59
|
-
|
60
|
-
|
82
|
+
CURRENT_SPECIFICATION_VERSION = 4
|
83
|
+
|
84
|
+
##
|
85
|
+
# An informal list of changes to the specification. The highest-valued
|
86
|
+
# key should be equal to the CURRENT_SPECIFICATION_VERSION.
|
87
|
+
|
88
|
+
SPECIFICATION_VERSION_HISTORY = {
|
89
|
+
-1 => ['(RubyGems versions up to and including 0.7 did not have versioned specifications)'],
|
90
|
+
1 => [
|
91
|
+
'Deprecated "test_suite_file" in favor of the new, but equivalent, "test_files"',
|
92
|
+
'"test_file=x" is a shortcut for "test_files=[x]"'
|
93
|
+
],
|
94
|
+
2 => [
|
95
|
+
'Added "required_rubygems_version"',
|
96
|
+
'Now forward-compatible with future versions',
|
97
|
+
],
|
98
|
+
3 => [
|
99
|
+
'Added Fixnum validation to the specification_version'
|
100
|
+
],
|
101
|
+
4 => [
|
102
|
+
'Added sandboxed freeform metadata to the specification version.'
|
103
|
+
]
|
104
|
+
}
|
61
105
|
|
62
|
-
|
63
|
-
MARSHAL_FIELDS = { -1 => 16, 1 => 16, 2 => 16, 3 => 17 }
|
106
|
+
MARSHAL_FIELDS = { -1 => 16, 1 => 16, 2 => 16, 3 => 17, 4 => 18 }
|
64
107
|
|
65
108
|
today = Time.now.utc
|
66
109
|
TODAY = Time.utc(today.year, today.month, today.day)
|
@@ -96,6 +139,7 @@ class Gem::Specification
|
|
96
139
|
:files => [],
|
97
140
|
:homepage => nil,
|
98
141
|
:licenses => [],
|
142
|
+
:metadata => {},
|
99
143
|
:name => nil,
|
100
144
|
:platform => Gem::Platform::RUBY,
|
101
145
|
:post_install_message => nil,
|
@@ -123,19 +167,37 @@ class Gem::Specification
|
|
123
167
|
# :section: Required gemspec attributes
|
124
168
|
|
125
169
|
##
|
126
|
-
# This gem's name
|
170
|
+
# This gem's name.
|
171
|
+
#
|
172
|
+
# Usage:
|
173
|
+
#
|
174
|
+
# spec.name = 'rake'
|
127
175
|
|
128
176
|
attr_accessor :name
|
129
177
|
|
130
178
|
##
|
131
|
-
# This gem's version
|
179
|
+
# This gem's version.
|
180
|
+
#
|
181
|
+
# The version string can contain numbers and periods, such as +1.0.0+.
|
182
|
+
# A gem is a 'prerelease' gem if the version has a letter in it, such as
|
183
|
+
# +1.0.0.pre+.
|
184
|
+
#
|
185
|
+
# Usage:
|
186
|
+
#
|
187
|
+
# spec.version = '0.4.1'
|
132
188
|
|
133
189
|
attr_reader :version
|
134
190
|
|
135
191
|
##
|
136
|
-
# Paths in the gem to add to
|
192
|
+
# Paths in the gem to add to <tt>$LOAD_PATH</tt> when this gem is activated.
|
137
193
|
#
|
138
|
-
#
|
194
|
+
# Usage:
|
195
|
+
#
|
196
|
+
# # If all library files are in the root directory...
|
197
|
+
# spec.require_path = '.'
|
198
|
+
#
|
199
|
+
# # If you have 'lib' and 'ext' directories...
|
200
|
+
# spec.require_paths << 'ext'
|
139
201
|
|
140
202
|
attr_accessor :require_paths
|
141
203
|
|
@@ -147,32 +209,113 @@ class Gem::Specification
|
|
147
209
|
attr_accessor :rubygems_version
|
148
210
|
|
149
211
|
##
|
150
|
-
#
|
212
|
+
# A short summary of this gem's description. Displayed in `gem list -d`.
|
151
213
|
#
|
152
|
-
#
|
214
|
+
# The description should be more detailed than the summary.
|
215
|
+
#
|
216
|
+
# Usage:
|
217
|
+
#
|
218
|
+
# spec.summary = "This is a small summary of my gem"
|
153
219
|
|
154
|
-
|
220
|
+
attr_reader :summary
|
155
221
|
|
156
222
|
##
|
157
|
-
#
|
223
|
+
# The platform this gem runs on.
|
158
224
|
#
|
159
|
-
#
|
160
|
-
#
|
225
|
+
# This is usually Gem::Platform::RUBY or Gem::Platform::CURRENT.
|
226
|
+
#
|
227
|
+
# Most gems contain pure Ruby code; they should simply leave the default value
|
228
|
+
# in place. Some gems contain C (or other) code to be compiled into a Ruby
|
229
|
+
# “extension”. The should leave the default value in place unless their code
|
230
|
+
# will only compile on a certain type of system. Some gems consist of
|
231
|
+
# pre-compiled code (“binary gems”). It’s especially important that they set
|
232
|
+
# the platform attribute appropriately. A shortcut is to set the platform to
|
233
|
+
# Gem::Platform::CURRENT, which will cause the gem builder to set the platform
|
234
|
+
# to the appropriate value for the system on which the build is being performed.
|
235
|
+
#
|
236
|
+
# If this attribute is set to a non-default value, it will be included in the
|
237
|
+
# filename of the gem when it is built, e.g. fxruby-1.2.0-win32.gem.
|
238
|
+
#
|
239
|
+
# Usage:
|
240
|
+
#
|
241
|
+
# spec.platform = Gem::Platform::Win32
|
161
242
|
|
162
|
-
|
243
|
+
def platform= platform
|
244
|
+
if @original_platform.nil? or
|
245
|
+
@original_platform == Gem::Platform::RUBY then
|
246
|
+
@original_platform = platform
|
247
|
+
end
|
163
248
|
|
164
|
-
|
165
|
-
|
249
|
+
case platform
|
250
|
+
when Gem::Platform::CURRENT then
|
251
|
+
@new_platform = Gem::Platform.local
|
252
|
+
@original_platform = @new_platform.to_s
|
253
|
+
|
254
|
+
when Gem::Platform then
|
255
|
+
@new_platform = platform
|
256
|
+
|
257
|
+
# legacy constants
|
258
|
+
when nil, Gem::Platform::RUBY then
|
259
|
+
@new_platform = Gem::Platform::RUBY
|
260
|
+
when 'mswin32' then # was Gem::Platform::WIN32
|
261
|
+
@new_platform = Gem::Platform.new 'x86-mswin32'
|
262
|
+
when 'i586-linux' then # was Gem::Platform::LINUX_586
|
263
|
+
@new_platform = Gem::Platform.new 'x86-linux'
|
264
|
+
when 'powerpc-darwin' then # was Gem::Platform::DARWIN
|
265
|
+
@new_platform = Gem::Platform.new 'ppc-darwin'
|
266
|
+
else
|
267
|
+
@new_platform = Gem::Platform.new platform
|
268
|
+
end
|
269
|
+
|
270
|
+
@platform = @new_platform.to_s
|
271
|
+
|
272
|
+
invalidate_memoized_attributes
|
273
|
+
|
274
|
+
@new_platform
|
275
|
+
end
|
166
276
|
|
167
277
|
##
|
168
|
-
#
|
278
|
+
# Files included in this gem. You cannot append to this accessor, you must
|
279
|
+
# assign to it.
|
169
280
|
#
|
170
|
-
#
|
281
|
+
# Only add files you can require to this list, not directories, etc.
|
282
|
+
#
|
283
|
+
# Directories are automatically stripped from this list when building a gem,
|
284
|
+
# other non-files cause an error.
|
285
|
+
#
|
286
|
+
# Usage:
|
287
|
+
#
|
288
|
+
# require 'rake'
|
289
|
+
# spec.files = FileList['lib/**/*.rb',
|
290
|
+
# 'bin/*',
|
291
|
+
# '[A-Z]*',
|
292
|
+
# 'test/**/*'].to_a
|
293
|
+
#
|
294
|
+
# # or without Rake...
|
295
|
+
# spec.files = Dir['lib/**/*.rb'] + Dir['bin/*']
|
296
|
+
# spec.files += Dir['[A-Z]*'] + Dir['test/**/*']
|
297
|
+
# spec.files.reject! { |fn| fn.include? "CVS" }
|
171
298
|
|
172
|
-
|
299
|
+
def files
|
300
|
+
# DO NOT CHANGE TO ||= ! This is not a normal accessor. (yes, it sucks)
|
301
|
+
# DOC: Why isn't it normal? Why does it suck? How can we fix this?
|
302
|
+
@files = [@files,
|
303
|
+
@test_files,
|
304
|
+
add_bindir(@executables),
|
305
|
+
@extra_rdoc_files,
|
306
|
+
@extensions,
|
307
|
+
].flatten.uniq.compact
|
308
|
+
end
|
309
|
+
|
310
|
+
######################################################################
|
311
|
+
# :section: Optional gemspec attributes
|
173
312
|
|
174
313
|
##
|
175
314
|
# The path in the gem for executable scripts. Usually 'bin'
|
315
|
+
#
|
316
|
+
# Usage:
|
317
|
+
#
|
318
|
+
# spec.bindir = 'bin'
|
176
319
|
|
177
320
|
attr_accessor :bindir
|
178
321
|
|
@@ -184,39 +327,241 @@ class Gem::Specification
|
|
184
327
|
|
185
328
|
##
|
186
329
|
# A long description of this gem
|
330
|
+
#
|
331
|
+
# The description should be more detailed than the summary.
|
332
|
+
#
|
333
|
+
# Usage:
|
334
|
+
#
|
335
|
+
# spec.description = <<-EOF
|
336
|
+
# Rake is a Make-like program implemented in Ruby. Tasks and
|
337
|
+
# dependencies are specified in standard Ruby syntax.
|
338
|
+
# EOF
|
187
339
|
|
188
340
|
attr_reader :description
|
189
341
|
|
190
342
|
##
|
191
|
-
#
|
343
|
+
# A contact email for this gem
|
192
344
|
#
|
193
|
-
#
|
345
|
+
# Usage:
|
346
|
+
#
|
347
|
+
# spec.email = 'john.jones@example.com'
|
348
|
+
# spec.email = ['jack@example.com', 'jill@example.com']
|
194
349
|
|
195
|
-
|
350
|
+
attr_accessor :email
|
196
351
|
|
197
352
|
##
|
198
|
-
#
|
353
|
+
# The URL of this gem's home page
|
199
354
|
#
|
200
|
-
#
|
201
|
-
#
|
355
|
+
# Usage:
|
356
|
+
#
|
357
|
+
# spec.homepage = 'http://rake.rubyforge.org'
|
358
|
+
|
359
|
+
attr_accessor :homepage
|
360
|
+
|
361
|
+
##
|
362
|
+
# A message that gets displayed after the gem is installed.
|
202
363
|
#
|
203
|
-
#
|
364
|
+
# Usage:
|
204
365
|
#
|
205
|
-
#
|
366
|
+
# spec.post_install_message = "Thanks for installing!"
|
206
367
|
|
207
|
-
attr_accessor :
|
368
|
+
attr_accessor :post_install_message
|
208
369
|
|
209
370
|
##
|
210
|
-
# The
|
371
|
+
# The key used to sign this gem. See Gem::Security for details.
|
211
372
|
|
212
|
-
attr_accessor :
|
373
|
+
attr_accessor :signing_key
|
213
374
|
|
214
375
|
##
|
215
|
-
#
|
376
|
+
# :attr_accessor: metadata
|
377
|
+
#
|
378
|
+
# Arbitrary metadata for this gem. An instance of Hash.
|
379
|
+
#
|
380
|
+
# metadata is simply a Symbol => String association that contains arbitary
|
381
|
+
# data that could be useful to other consumers.
|
382
|
+
|
383
|
+
attr_accessor :metadata
|
384
|
+
|
385
|
+
##
|
386
|
+
# Adds a development dependency named +gem+ with +requirements+ to this
|
387
|
+
# gem.
|
388
|
+
#
|
389
|
+
# Usage:
|
390
|
+
#
|
391
|
+
# spec.add_development_dependency 'example', '~> 1.1', '>= 1.1.4'
|
392
|
+
#
|
393
|
+
# Development dependencies aren't installed by default and aren't
|
394
|
+
# activated when a gem is required.
|
395
|
+
|
396
|
+
def add_development_dependency(gem, *requirements)
|
397
|
+
add_dependency_with_type(gem, :development, *requirements)
|
398
|
+
end
|
399
|
+
|
400
|
+
##
|
401
|
+
# Adds a runtime dependency named +gem+ with +requirements+ to this gem.
|
402
|
+
#
|
403
|
+
# Usage:
|
404
|
+
#
|
405
|
+
# spec.add_runtime_dependency 'example', '~> 1.1', '>= 1.1.4'
|
406
|
+
|
407
|
+
def add_runtime_dependency(gem, *requirements)
|
408
|
+
add_dependency_with_type(gem, :runtime, *requirements)
|
409
|
+
end
|
410
|
+
|
411
|
+
##
|
412
|
+
# Singular writer for #authors
|
413
|
+
#
|
414
|
+
# Usage:
|
415
|
+
#
|
416
|
+
# spec.author = 'John Jones'
|
417
|
+
|
418
|
+
def author= o
|
419
|
+
self.authors = [o]
|
420
|
+
end
|
421
|
+
|
422
|
+
##
|
423
|
+
# Sets the list of authors, ensuring it is an array.
|
424
|
+
#
|
425
|
+
# Usage:
|
426
|
+
#
|
427
|
+
# spec.authors = ['John Jones', 'Mary Smith']
|
428
|
+
|
429
|
+
def authors= value
|
430
|
+
@authors = Array(value).flatten.grep(String)
|
431
|
+
end
|
432
|
+
|
433
|
+
##
|
434
|
+
# Executables included in the gem.
|
435
|
+
#
|
436
|
+
# For example, the rake gem has rake as an executable. You don’t specify the
|
437
|
+
# full path (as in bin/rake); all application-style files are expected to be
|
438
|
+
# found in bindir. These files must be executable ruby files. Files that
|
439
|
+
# use bash or other interpreters will not work.
|
440
|
+
#
|
441
|
+
# Usage:
|
442
|
+
#
|
443
|
+
# spec.executables << 'rake'
|
444
|
+
|
445
|
+
def executables
|
446
|
+
@executables ||= []
|
447
|
+
end
|
448
|
+
|
449
|
+
##
|
450
|
+
# Extensions to build when installing the gem, specifically the paths to
|
451
|
+
# extconf.rb-style files used to compile extensions.
|
452
|
+
#
|
453
|
+
# These files will be run when the gem is installed, causing the C (or
|
454
|
+
# whatever) code to be compiled on the user’s machine.
|
455
|
+
#
|
456
|
+
# Usage:
|
457
|
+
#
|
458
|
+
# spec.extensions << 'ext/rmagic/extconf.rb'
|
459
|
+
|
460
|
+
def extensions
|
461
|
+
@extensions ||= []
|
462
|
+
end
|
216
463
|
|
217
|
-
|
464
|
+
##
|
465
|
+
# Extra files to add to RDoc such as README or doc/examples.txt
|
466
|
+
#
|
467
|
+
# When the user elects to generate the RDoc documentation for a gem (typically
|
468
|
+
# at install time), all the library files are sent to RDoc for processing.
|
469
|
+
# This option allows you to have some non-code files included for a more
|
470
|
+
# complete set of documentation.
|
471
|
+
#
|
472
|
+
# Usage:
|
473
|
+
#
|
474
|
+
# spec.extra_rdoc_files = ['README', 'doc/user-guide.txt']
|
218
475
|
|
219
|
-
|
476
|
+
def extra_rdoc_files
|
477
|
+
@extra_rdoc_files ||= []
|
478
|
+
end
|
479
|
+
|
480
|
+
##
|
481
|
+
# The license for this gem.
|
482
|
+
#
|
483
|
+
# The license must be a short name, no more than 64 characters.
|
484
|
+
#
|
485
|
+
# This should just be the name of your license. The full
|
486
|
+
# text of the license should be inside of the gem when you build it.
|
487
|
+
#
|
488
|
+
# Usage:
|
489
|
+
# spec.license = 'MIT'
|
490
|
+
|
491
|
+
def license=o
|
492
|
+
self.licenses = [o]
|
493
|
+
end
|
494
|
+
|
495
|
+
##
|
496
|
+
# The license(s) for the library.
|
497
|
+
#
|
498
|
+
# Each license must be a short name, no more than 64 characters.
|
499
|
+
#
|
500
|
+
# This should just be the name of your license. The full
|
501
|
+
# text of the license should be inside of the gem when you build it.
|
502
|
+
#
|
503
|
+
# Usage:
|
504
|
+
# spec.licenses = ['MIT', 'GPL-2']
|
505
|
+
|
506
|
+
def licenses= licenses
|
507
|
+
@licenses = Array licenses
|
508
|
+
end
|
509
|
+
|
510
|
+
##
|
511
|
+
# Specifies the rdoc options to be used when generating API documentation.
|
512
|
+
#
|
513
|
+
# Usage:
|
514
|
+
#
|
515
|
+
# spec.rdoc_options << '--title' << 'Rake -- Ruby Make' <<
|
516
|
+
# '--main' << 'README' <<
|
517
|
+
# '--line-numbers'
|
518
|
+
|
519
|
+
def rdoc_options
|
520
|
+
@rdoc_options ||= []
|
521
|
+
end
|
522
|
+
|
523
|
+
##
|
524
|
+
# The version of ruby required by this gem
|
525
|
+
#
|
526
|
+
# Usage:
|
527
|
+
#
|
528
|
+
# # If it will work with 1.8.6 or greater...
|
529
|
+
# spec.required_ruby_version = '>= 1.8.6'
|
530
|
+
#
|
531
|
+
# # Hopefully by now:
|
532
|
+
# spec.required_ruby_version = '>= 1.9.2'
|
533
|
+
|
534
|
+
def required_ruby_version= req
|
535
|
+
@required_ruby_version = Gem::Requirement.create req
|
536
|
+
end
|
537
|
+
|
538
|
+
##
|
539
|
+
# Lists the external (to RubyGems) requirements that must be met for this gem
|
540
|
+
# to work. It’s simply information for the user.
|
541
|
+
#
|
542
|
+
# Usage:
|
543
|
+
#
|
544
|
+
# spec.requirements << 'libmagick, v6.0'
|
545
|
+
# spec.requirements << 'A good graphics card'
|
546
|
+
|
547
|
+
def requirements
|
548
|
+
@requirements ||= []
|
549
|
+
end
|
550
|
+
|
551
|
+
##
|
552
|
+
# A collection of unit test files. They will be loaded as unit tests when
|
553
|
+
# the user requests a gem to be unit tested.
|
554
|
+
#
|
555
|
+
# Usage:
|
556
|
+
# spec.test_files = Dir.glob('test/tc_*.rb')
|
557
|
+
# spec.test_files = ['tests/test-suite.rb']
|
558
|
+
|
559
|
+
def test_files= files
|
560
|
+
@test_files = Array files
|
561
|
+
end
|
562
|
+
|
563
|
+
######################################################################
|
564
|
+
# :section: Specification internals
|
220
565
|
|
221
566
|
##
|
222
567
|
# True when this gemspec has been activated. This attribute is not persisted.
|
@@ -225,6 +570,20 @@ class Gem::Specification
|
|
225
570
|
|
226
571
|
alias :activated? :activated
|
227
572
|
|
573
|
+
##
|
574
|
+
# Autorequire was used by old RubyGems to automatically require a file.
|
575
|
+
#
|
576
|
+
# Deprecated: It is neither supported nor functional.
|
577
|
+
|
578
|
+
attr_accessor :autorequire
|
579
|
+
|
580
|
+
##
|
581
|
+
# Sets the default executable for this gem.
|
582
|
+
#
|
583
|
+
# Deprecated: You must now specify the executable name to Gem.bin_path.
|
584
|
+
|
585
|
+
attr_writer :default_executable
|
586
|
+
|
228
587
|
##
|
229
588
|
# Path this gemspec was loaded from. This attribute is not persisted.
|
230
589
|
|
@@ -235,11 +594,6 @@ class Gem::Specification
|
|
235
594
|
|
236
595
|
attr_writer :original_platform # :nodoc:
|
237
596
|
|
238
|
-
##
|
239
|
-
# A message that gets displayed after the gem is installed
|
240
|
-
|
241
|
-
attr_accessor :post_install_message
|
242
|
-
|
243
597
|
##
|
244
598
|
# The version of ruby required by this gem
|
245
599
|
|
@@ -249,7 +603,6 @@ class Gem::Specification
|
|
249
603
|
# The RubyGems version required by this gem
|
250
604
|
|
251
605
|
attr_reader :required_rubygems_version
|
252
|
-
|
253
606
|
##
|
254
607
|
# The rubyforge project this gem lives under. i.e. RubyGems'
|
255
608
|
# rubyforge_project is "rubygems".
|
@@ -257,22 +610,49 @@ class Gem::Specification
|
|
257
610
|
attr_accessor :rubyforge_project
|
258
611
|
|
259
612
|
##
|
260
|
-
# The
|
613
|
+
# The Gem::Specification version of this gemspec.
|
614
|
+
#
|
615
|
+
# Do not set this, it is set automatically when the gem is packaged.
|
261
616
|
|
262
|
-
attr_accessor :
|
617
|
+
attr_accessor :specification_version
|
263
618
|
|
264
|
-
|
265
|
-
|
266
|
-
|
619
|
+
class << self
|
620
|
+
def default_specifications_dir
|
621
|
+
File.join(Gem.default_dir, "specifications", "default")
|
622
|
+
end
|
267
623
|
|
268
|
-
|
624
|
+
private
|
625
|
+
def each_spec(search_dirs) # :nodoc:
|
626
|
+
search_dirs.each { |dir|
|
269
627
|
Dir[File.join(dir, "*.gemspec")].each { |path|
|
270
628
|
spec = Gem::Specification.load path.untaint
|
271
629
|
# #load returns nil if the spec is bad, so we just ignore
|
272
630
|
# it at this stage
|
273
|
-
|
631
|
+
yield(spec) if spec
|
274
632
|
}
|
275
633
|
}
|
634
|
+
end
|
635
|
+
|
636
|
+
def each_default(&block) # :nodoc:
|
637
|
+
each_spec([default_specifications_dir],
|
638
|
+
&block)
|
639
|
+
end
|
640
|
+
|
641
|
+
def each_normal(&block) # :nodoc:
|
642
|
+
each_spec(dirs, &block)
|
643
|
+
end
|
644
|
+
end
|
645
|
+
|
646
|
+
def self._all # :nodoc:
|
647
|
+
unless defined?(@@all) && @@all then
|
648
|
+
|
649
|
+
specs = {}
|
650
|
+
each_default do |spec|
|
651
|
+
specs[spec.full_name] ||= spec
|
652
|
+
end
|
653
|
+
each_normal do |spec|
|
654
|
+
specs[spec.full_name] ||= spec
|
655
|
+
end
|
276
656
|
|
277
657
|
@@all = specs.values
|
278
658
|
|
@@ -289,6 +669,15 @@ class Gem::Specification
|
|
289
669
|
}
|
290
670
|
end
|
291
671
|
|
672
|
+
##
|
673
|
+
# Loads the default specifications. It should be called only once.
|
674
|
+
|
675
|
+
def self.load_defaults
|
676
|
+
each_default do |spec|
|
677
|
+
Gem.register_default_spec(spec)
|
678
|
+
end
|
679
|
+
end
|
680
|
+
|
292
681
|
##
|
293
682
|
# Adds +spec+ to the known specifications, keeping the collection
|
294
683
|
# properly sorted.
|
@@ -381,7 +770,7 @@ class Gem::Specification
|
|
381
770
|
|
382
771
|
def self.dirs
|
383
772
|
@@dirs ||= Gem.path.collect { |dir|
|
384
|
-
File.join dir, "specifications"
|
773
|
+
File.join dir.dup.untaint, "specifications"
|
385
774
|
}
|
386
775
|
end
|
387
776
|
|
@@ -445,12 +834,22 @@ class Gem::Specification
|
|
445
834
|
}
|
446
835
|
end
|
447
836
|
|
837
|
+
##
|
838
|
+
# Return the best specification that contains the file matching +path+
|
839
|
+
# amongst the specs that are not activated.
|
840
|
+
|
841
|
+
def self.find_inactive_by_path path
|
842
|
+
self.find { |spec|
|
843
|
+
spec.contains_requirable_file? path unless spec.activated?
|
844
|
+
}
|
845
|
+
end
|
846
|
+
|
448
847
|
##
|
449
848
|
# Return currently unresolved specs that contain the file matching +path+.
|
450
849
|
|
451
850
|
def self.find_in_unresolved path
|
452
851
|
# TODO: do we need these?? Kill it
|
453
|
-
specs =
|
852
|
+
specs = unresolved_deps.values.map { |dep| dep.to_specs }.flatten
|
454
853
|
|
455
854
|
specs.find_all { |spec| spec.contains_requirable_file? path }
|
456
855
|
end
|
@@ -460,7 +859,7 @@ class Gem::Specification
|
|
460
859
|
# specs that contain the file matching +path+.
|
461
860
|
|
462
861
|
def self.find_in_unresolved_tree path
|
463
|
-
specs =
|
862
|
+
specs = unresolved_deps.values.map { |dep| dep.to_specs }.flatten
|
464
863
|
|
465
864
|
specs.reverse_each do |spec|
|
466
865
|
trails = []
|
@@ -499,12 +898,8 @@ class Gem::Specification
|
|
499
898
|
raise Gem::Exception, "YAML data doesn't evaluate to gem specification"
|
500
899
|
end
|
501
900
|
|
502
|
-
|
503
|
-
|
504
|
-
spec.instance_variable_get :@specification_version
|
505
|
-
spec.instance_variable_set :@specification_version,
|
506
|
-
NONEXISTENT_SPECIFICATION_VERSION
|
507
|
-
end
|
901
|
+
spec.instance_eval { @specification_version ||= NONEXISTENT_SPECIFICATION_VERSION }
|
902
|
+
spec.reset_nil_attributes_to_default
|
508
903
|
|
509
904
|
spec
|
510
905
|
end
|
@@ -534,9 +929,9 @@ class Gem::Specification
|
|
534
929
|
# Loads Ruby format gemspec from +file+.
|
535
930
|
|
536
931
|
def self.load file
|
537
|
-
return unless file
|
538
|
-
|
932
|
+
return unless file
|
539
933
|
file = file.dup.untaint
|
934
|
+
return unless File.file?(file)
|
540
935
|
|
541
936
|
code = if defined? Encoding
|
542
937
|
File.read file, :mode => 'r:UTF-8:-'
|
@@ -596,9 +991,9 @@ class Gem::Specification
|
|
596
991
|
|
597
992
|
latest_specs.each do |local|
|
598
993
|
dependency = Gem::Dependency.new local.name, ">= #{local.version}"
|
599
|
-
remotes
|
600
|
-
remotes
|
601
|
-
latest
|
994
|
+
remotes, _ = fetcher.search_for_dependency dependency
|
995
|
+
remotes = remotes.map { |n, _| n.version }
|
996
|
+
latest = remotes.sort.last
|
602
997
|
|
603
998
|
outdateds << local.name if latest and local.version < latest
|
604
999
|
end
|
@@ -636,14 +1031,27 @@ class Gem::Specification
|
|
636
1031
|
|
637
1032
|
def self.reset
|
638
1033
|
@@dirs = nil
|
639
|
-
|
640
|
-
# warn ""
|
641
|
-
# warn "NOTE: Specification.reset from #{from.inspect}"
|
642
|
-
Gem.pre_reset_hooks.each { |hook| hook.call }
|
1034
|
+
Gem.pre_reset_hooks.each { |hook| hook.call }
|
643
1035
|
@@all = nil
|
1036
|
+
unresolved = unresolved_deps
|
1037
|
+
unless unresolved.empty? then
|
1038
|
+
w = "W" + "ARN"
|
1039
|
+
warn "#{w}: Unresolved specs during Gem::Specification.reset:"
|
1040
|
+
unresolved.values.each do |dep|
|
1041
|
+
warn " #{dep}"
|
1042
|
+
end
|
1043
|
+
warn "#{w}: Clearing out unresolved specs."
|
1044
|
+
warn "Please report a bug if this causes problems."
|
1045
|
+
unresolved.clear
|
1046
|
+
end
|
644
1047
|
Gem.post_reset_hooks.each { |hook| hook.call }
|
645
1048
|
end
|
646
1049
|
|
1050
|
+
# DOC: This method needs documented or nodoc'd
|
1051
|
+
def self.unresolved_deps
|
1052
|
+
@unresolved_deps ||= Hash.new { |h, n| h[n] = Gem::Dependency.new n }
|
1053
|
+
end
|
1054
|
+
|
647
1055
|
##
|
648
1056
|
# Load custom marshal format, re-initializing defaults as needed
|
649
1057
|
|
@@ -691,6 +1099,7 @@ class Gem::Specification
|
|
691
1099
|
spec.instance_variable_set :@new_platform, array[16]
|
692
1100
|
spec.instance_variable_set :@platform, array[16].to_s
|
693
1101
|
spec.instance_variable_set :@license, array[17]
|
1102
|
+
spec.instance_variable_set :@metadata, array[18]
|
694
1103
|
spec.instance_variable_set :@loaded, false
|
695
1104
|
spec.instance_variable_set :@activated, false
|
696
1105
|
|
@@ -733,7 +1142,8 @@ class Gem::Specification
|
|
733
1142
|
@homepage,
|
734
1143
|
true, # has_rdoc
|
735
1144
|
@new_platform,
|
736
|
-
@licenses
|
1145
|
+
@licenses,
|
1146
|
+
@metadata
|
737
1147
|
]
|
738
1148
|
end
|
739
1149
|
|
@@ -764,6 +1174,8 @@ class Gem::Specification
|
|
764
1174
|
# resolved later, as needed.
|
765
1175
|
|
766
1176
|
def activate_dependencies
|
1177
|
+
unresolved = Gem::Specification.unresolved_deps
|
1178
|
+
|
767
1179
|
self.runtime_dependencies.each do |spec_dep|
|
768
1180
|
if loaded = Gem.loaded_specs[spec_dep.name]
|
769
1181
|
next if spec_dep.matches_spec? loaded
|
@@ -781,11 +1193,11 @@ class Gem::Specification
|
|
781
1193
|
specs.first.activate
|
782
1194
|
else
|
783
1195
|
name = spec_dep.name
|
784
|
-
|
1196
|
+
unresolved[name] = unresolved[name].merge spec_dep
|
785
1197
|
end
|
786
1198
|
end
|
787
1199
|
|
788
|
-
|
1200
|
+
unresolved.delete self.name
|
789
1201
|
end
|
790
1202
|
|
791
1203
|
##
|
@@ -814,48 +1226,26 @@ class Gem::Specification
|
|
814
1226
|
Gem::Requirement.default
|
815
1227
|
else
|
816
1228
|
requirements.flatten
|
817
|
-
end
|
818
|
-
|
819
|
-
unless dependency.respond_to?(:name) &&
|
820
|
-
dependency.respond_to?(:version_requirements)
|
821
|
-
|
822
|
-
dependency = Gem::Dependency.new(dependency, requirements, type)
|
823
|
-
end
|
824
|
-
|
825
|
-
dependencies << dependency
|
826
|
-
end
|
827
|
-
|
828
|
-
private :add_dependency_with_type
|
829
|
-
|
830
|
-
##
|
831
|
-
# Adds a development dependency named +gem+ with +requirements+ to this
|
832
|
-
# Gem. For example:
|
833
|
-
#
|
834
|
-
# spec.add_development_dependency 'example', '~> 1.1', '>= 1.1.4'
|
835
|
-
#
|
836
|
-
# Development dependencies aren't installed by default and aren't
|
837
|
-
# activated when a gem is required.
|
838
|
-
|
839
|
-
def add_development_dependency(gem, *requirements)
|
840
|
-
add_dependency_with_type(gem, :development, *requirements)
|
841
|
-
end
|
1229
|
+
end
|
842
1230
|
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
# spec.add_runtime_dependency 'example', '~> 1.1', '>= 1.1.4'
|
1231
|
+
unless dependency.respond_to?(:name) &&
|
1232
|
+
dependency.respond_to?(:version_requirements)
|
1233
|
+
dependency = Gem::Dependency.new(dependency, requirements, type)
|
1234
|
+
end
|
848
1235
|
|
849
|
-
|
850
|
-
add_dependency_with_type(gem, :runtime, *requirements)
|
1236
|
+
dependencies << dependency
|
851
1237
|
end
|
852
1238
|
|
1239
|
+
private :add_dependency_with_type
|
1240
|
+
|
853
1241
|
alias add_dependency add_runtime_dependency
|
854
1242
|
|
855
1243
|
##
|
856
1244
|
# Adds this spec's require paths to LOAD_PATH, in the proper location.
|
857
1245
|
|
858
1246
|
def add_self_to_load_path
|
1247
|
+
return if default_gem?
|
1248
|
+
|
859
1249
|
paths = require_paths.map do |path|
|
860
1250
|
File.join full_gem_path, path
|
861
1251
|
end
|
@@ -879,34 +1269,13 @@ class Gem::Specification
|
|
879
1269
|
val = authors and val.first
|
880
1270
|
end
|
881
1271
|
|
882
|
-
##
|
883
|
-
# Singular writer for #authors
|
884
|
-
|
885
|
-
def author= o
|
886
|
-
self.authors = [o]
|
887
|
-
end
|
888
|
-
|
889
1272
|
##
|
890
1273
|
# The list of author names who wrote this gem.
|
891
|
-
#
|
892
|
-
# If you are providing multiple authors and multiple emails they should be
|
893
|
-
# in the same order such that:
|
894
|
-
#
|
895
|
-
# Hash[*spec.authors.zip(spec.emails).flatten]
|
896
|
-
#
|
897
|
-
# Gives a hash of author name to email address.
|
898
1274
|
|
899
1275
|
def authors
|
900
1276
|
@authors ||= []
|
901
1277
|
end
|
902
1278
|
|
903
|
-
##
|
904
|
-
# Sets the list of authors, ensuring it is an array.
|
905
|
-
|
906
|
-
def authors= value
|
907
|
-
@authors = Array(value).flatten.grep(String)
|
908
|
-
end
|
909
|
-
|
910
1279
|
##
|
911
1280
|
# Returns the full path to the base gem directory.
|
912
1281
|
#
|
@@ -934,6 +1303,32 @@ class Gem::Specification
|
|
934
1303
|
File.join bin_dir, name
|
935
1304
|
end
|
936
1305
|
|
1306
|
+
##
|
1307
|
+
# Returns the build_args used to install the gem
|
1308
|
+
|
1309
|
+
def build_args
|
1310
|
+
if File.exists? build_info_file
|
1311
|
+
File.readlines(build_info_file).map { |x| x.strip }
|
1312
|
+
else
|
1313
|
+
[]
|
1314
|
+
end
|
1315
|
+
end
|
1316
|
+
|
1317
|
+
##
|
1318
|
+
# Returns the full path to the build info directory
|
1319
|
+
|
1320
|
+
def build_info_dir
|
1321
|
+
File.join base_dir, "build_info"
|
1322
|
+
end
|
1323
|
+
|
1324
|
+
##
|
1325
|
+
# Returns the full path to the file containing the build
|
1326
|
+
# information generated when the gem was installed
|
1327
|
+
|
1328
|
+
def build_info_file
|
1329
|
+
File.join build_info_dir, "#{full_name}.info"
|
1330
|
+
end
|
1331
|
+
|
937
1332
|
##
|
938
1333
|
# Returns the full path to the cache directory containing this
|
939
1334
|
# spec's cached gem.
|
@@ -949,8 +1344,6 @@ class Gem::Specification
|
|
949
1344
|
@cache_file ||= File.join cache_dir, "#{full_name}.gem"
|
950
1345
|
end
|
951
1346
|
|
952
|
-
alias :cache_gem :cache_file
|
953
|
-
|
954
1347
|
##
|
955
1348
|
# Return any possible conflicts against the currently loaded specs.
|
956
1349
|
|
@@ -970,17 +1363,13 @@ class Gem::Specification
|
|
970
1363
|
# Return true if this spec can require +file+.
|
971
1364
|
|
972
1365
|
def contains_requirable_file? file
|
973
|
-
root
|
1366
|
+
root = full_gem_path
|
1367
|
+
suffixes = Gem.suffixes
|
974
1368
|
|
975
|
-
require_paths.
|
1369
|
+
require_paths.any? do |lib|
|
976
1370
|
base = "#{root}/#{lib}/#{file}"
|
977
|
-
|
978
|
-
path = "#{base}#{suf}"
|
979
|
-
return true if File.file? path
|
980
|
-
end
|
1371
|
+
suffixes.any? { |suf| File.file? "#{base}#{suf}" }
|
981
1372
|
end
|
982
|
-
|
983
|
-
return false
|
984
1373
|
end
|
985
1374
|
|
986
1375
|
##
|
@@ -990,10 +1379,15 @@ class Gem::Specification
|
|
990
1379
|
@date ||= TODAY
|
991
1380
|
end
|
992
1381
|
|
1382
|
+
DateTimeFormat = /\A
|
1383
|
+
(\d{4})-(\d{2})-(\d{2})
|
1384
|
+
(\s+ \d{2}:\d{2}:\d{2}\.\d+ \s* (Z | [-+]\d\d:\d\d) )?
|
1385
|
+
\Z/x
|
1386
|
+
|
993
1387
|
##
|
994
1388
|
# The date this gem was created
|
995
1389
|
#
|
996
|
-
#
|
1390
|
+
# DO NOT set this, it is set automatically when the gem is packaged.
|
997
1391
|
|
998
1392
|
def date= date
|
999
1393
|
# We want to end up with a Time object with one-day resolution.
|
@@ -1001,7 +1395,7 @@ class Gem::Specification
|
|
1001
1395
|
# way to do it.
|
1002
1396
|
@date = case date
|
1003
1397
|
when String then
|
1004
|
-
if
|
1398
|
+
if DateTimeFormat =~ date then
|
1005
1399
|
Time.utc($1.to_i, $2.to_i, $3.to_i)
|
1006
1400
|
|
1007
1401
|
# Workaround for where the date format output from psych isn't
|
@@ -1061,6 +1455,7 @@ class Gem::Specification
|
|
1061
1455
|
# [depending_gem, dependency, [list_of_gems_that_satisfy_dependency]]
|
1062
1456
|
|
1063
1457
|
def dependent_gems
|
1458
|
+
# REFACTOR: out = []; each; out; ? Really? No #collect love?
|
1064
1459
|
out = []
|
1065
1460
|
Gem::Specification.each do |spec|
|
1066
1461
|
spec.dependencies.each do |dep|
|
@@ -1098,10 +1493,21 @@ class Gem::Specification
|
|
1098
1493
|
end
|
1099
1494
|
|
1100
1495
|
##
|
1101
|
-
# Returns the full path to this spec's documentation directory.
|
1496
|
+
# Returns the full path to this spec's documentation directory. If +type+
|
1497
|
+
# is given it will be appended to the end. For examlpe:
|
1498
|
+
#
|
1499
|
+
# spec.doc_dir # => "/path/to/gem_repo/doc/a-1"
|
1500
|
+
#
|
1501
|
+
# spec.doc_dir 'ri' # => "/path/to/gem_repo/doc/a-1/ri"
|
1102
1502
|
|
1103
|
-
def doc_dir
|
1503
|
+
def doc_dir type = nil
|
1104
1504
|
@doc_dir ||= File.join base_dir, 'doc', full_name
|
1505
|
+
|
1506
|
+
if type then
|
1507
|
+
File.join @doc_dir, type
|
1508
|
+
else
|
1509
|
+
@doc_dir
|
1510
|
+
end
|
1105
1511
|
end
|
1106
1512
|
|
1107
1513
|
def encode_with coder # :nodoc:
|
@@ -1143,13 +1549,6 @@ class Gem::Specification
|
|
1143
1549
|
self.executables = [o]
|
1144
1550
|
end
|
1145
1551
|
|
1146
|
-
##
|
1147
|
-
# Executables included in the gem.
|
1148
|
-
|
1149
|
-
def executables
|
1150
|
-
@executables ||= []
|
1151
|
-
end
|
1152
|
-
|
1153
1552
|
##
|
1154
1553
|
# Sets executables to +value+, ensuring it is an array. Don't
|
1155
1554
|
# use this, push onto the array instead.
|
@@ -1159,14 +1558,6 @@ class Gem::Specification
|
|
1159
1558
|
@executables = Array(value)
|
1160
1559
|
end
|
1161
1560
|
|
1162
|
-
##
|
1163
|
-
# Extensions to build when installing the gem. See
|
1164
|
-
# Gem::Installer#build_extensions for valid values.
|
1165
|
-
|
1166
|
-
def extensions
|
1167
|
-
@extensions ||= []
|
1168
|
-
end
|
1169
|
-
|
1170
1561
|
##
|
1171
1562
|
# Sets extensions to +extensions+, ensuring it is an array. Don't
|
1172
1563
|
# use this, push onto the array instead.
|
@@ -1176,13 +1567,6 @@ class Gem::Specification
|
|
1176
1567
|
@extensions = Array extensions
|
1177
1568
|
end
|
1178
1569
|
|
1179
|
-
##
|
1180
|
-
# Extra files to add to RDoc such as README or doc/examples.txt
|
1181
|
-
|
1182
|
-
def extra_rdoc_files
|
1183
|
-
@extra_rdoc_files ||= []
|
1184
|
-
end
|
1185
|
-
|
1186
1570
|
##
|
1187
1571
|
# Sets extra_rdoc_files to +files+, ensuring it is an array. Don't
|
1188
1572
|
# use this, push onto the array instead.
|
@@ -1201,25 +1585,6 @@ class Gem::Specification
|
|
1201
1585
|
"#{full_name}.gem"
|
1202
1586
|
end
|
1203
1587
|
|
1204
|
-
##
|
1205
|
-
# Files included in this gem. You cannot append to this accessor, you must
|
1206
|
-
# assign to it.
|
1207
|
-
#
|
1208
|
-
# Only add files you can require to this list, not directories, etc.
|
1209
|
-
#
|
1210
|
-
# Directories are automatically stripped from this list when building a gem,
|
1211
|
-
# other non-files cause an error.
|
1212
|
-
|
1213
|
-
def files
|
1214
|
-
# DO NOT CHANGE TO ||= ! This is not a normal accessor. (yes, it sucks)
|
1215
|
-
@files = [@files,
|
1216
|
-
@test_files,
|
1217
|
-
add_bindir(@executables),
|
1218
|
-
@extra_rdoc_files,
|
1219
|
-
@extensions,
|
1220
|
-
].flatten.uniq.compact
|
1221
|
-
end
|
1222
|
-
|
1223
1588
|
##
|
1224
1589
|
# Sets files to +files+, ensuring it is an array.
|
1225
1590
|
|
@@ -1254,11 +1619,14 @@ class Gem::Specification
|
|
1254
1619
|
# The full path to the gem (install path + full name).
|
1255
1620
|
|
1256
1621
|
def full_gem_path
|
1257
|
-
# TODO:
|
1622
|
+
# TODO: This is a heavily used method by gems, so we'll need
|
1623
|
+
# to aleast just alias it to #gem_dir rather than remove it.
|
1624
|
+
|
1258
1625
|
# TODO: also, shouldn't it default to full_name if it hasn't been written?
|
1259
1626
|
return @full_gem_path if defined?(@full_gem_path) && @full_gem_path
|
1260
1627
|
|
1261
1628
|
@full_gem_path = File.expand_path File.join(gems_dir, full_name)
|
1629
|
+
@full_gem_path.untaint
|
1262
1630
|
|
1263
1631
|
return @full_gem_path if File.directory? @full_gem_path
|
1264
1632
|
|
@@ -1271,11 +1639,11 @@ class Gem::Specification
|
|
1271
1639
|
# default Ruby platform.
|
1272
1640
|
|
1273
1641
|
def full_name
|
1274
|
-
if platform == Gem::Platform::RUBY or platform.nil? then
|
1275
|
-
|
1276
|
-
|
1277
|
-
|
1278
|
-
|
1642
|
+
@full_name ||= if platform == Gem::Platform::RUBY or platform.nil? then
|
1643
|
+
"#{@name}-#{@version}".untaint
|
1644
|
+
else
|
1645
|
+
"#{@name}-#{@version}-#{platform}".untaint
|
1646
|
+
end
|
1279
1647
|
end
|
1280
1648
|
|
1281
1649
|
##
|
@@ -1373,13 +1741,9 @@ class Gem::Specification
|
|
1373
1741
|
# Duplicates array_attributes from +other_spec+ so state isn't shared.
|
1374
1742
|
|
1375
1743
|
def initialize_copy other_spec
|
1376
|
-
other_ivars = other_spec.instance_variables
|
1377
|
-
other_ivars = other_ivars.map { |ivar| ivar.intern } if # for 1.9
|
1378
|
-
String === other_ivars.first
|
1379
|
-
|
1380
1744
|
self.class.array_attributes.each do |name|
|
1381
1745
|
name = :"@#{name}"
|
1382
|
-
next unless
|
1746
|
+
next unless other_spec.instance_variable_defined? name
|
1383
1747
|
|
1384
1748
|
begin
|
1385
1749
|
val = other_spec.instance_variable_get(name)
|
@@ -1399,11 +1763,22 @@ class Gem::Specification
|
|
1399
1763
|
end
|
1400
1764
|
|
1401
1765
|
##
|
1402
|
-
#
|
1403
|
-
#
|
1766
|
+
# Expire memoized instance variables that can incorrectly generate, replace
|
1767
|
+
# or miss files due changes in certain attributes used to compute them.
|
1768
|
+
|
1769
|
+
def invalidate_memoized_attributes
|
1770
|
+
@full_name = nil
|
1771
|
+
@cache_file = nil
|
1772
|
+
end
|
1773
|
+
|
1774
|
+
private :invalidate_memoized_attributes
|
1404
1775
|
|
1405
|
-
def
|
1406
|
-
|
1776
|
+
def inspect
|
1777
|
+
if $DEBUG
|
1778
|
+
super
|
1779
|
+
else
|
1780
|
+
"#<#{self.class}:0x#{__id__.to_s(16)} #{full_name}>"
|
1781
|
+
end
|
1407
1782
|
end
|
1408
1783
|
|
1409
1784
|
##
|
@@ -1426,7 +1801,7 @@ class Gem::Specification
|
|
1426
1801
|
def lib_files
|
1427
1802
|
@files.select do |file|
|
1428
1803
|
require_paths.any? do |path|
|
1429
|
-
file.
|
1804
|
+
file.start_with? path
|
1430
1805
|
end
|
1431
1806
|
end
|
1432
1807
|
end
|
@@ -1439,33 +1814,31 @@ class Gem::Specification
|
|
1439
1814
|
end
|
1440
1815
|
|
1441
1816
|
##
|
1442
|
-
#
|
1443
|
-
|
1444
|
-
def license=o
|
1445
|
-
self.licenses = [o]
|
1446
|
-
end
|
1447
|
-
|
1448
|
-
##
|
1449
|
-
# The license(s) for the library. Each license must be a short name, no
|
1450
|
-
# more than 64 characters.
|
1817
|
+
# Plural accessor for setting licenses
|
1451
1818
|
|
1452
1819
|
def licenses
|
1453
1820
|
@licenses ||= []
|
1454
1821
|
end
|
1455
1822
|
|
1456
|
-
##
|
1457
|
-
# Set licenses to +licenses+, ensuring it is an array.
|
1458
|
-
|
1459
|
-
def licenses= licenses
|
1460
|
-
@licenses = Array licenses
|
1461
|
-
end
|
1462
|
-
|
1463
1823
|
##
|
1464
1824
|
# Set the location a Specification was loaded from. +obj+ is converted
|
1465
1825
|
# to a String.
|
1466
1826
|
|
1467
1827
|
def loaded_from= path
|
1468
|
-
@loaded_from
|
1828
|
+
@loaded_from = path.to_s
|
1829
|
+
|
1830
|
+
# reset everything @loaded_from depends upon
|
1831
|
+
@base_dir = nil
|
1832
|
+
@bin_dir = nil
|
1833
|
+
@cache_dir = nil
|
1834
|
+
@cache_file = nil
|
1835
|
+
@doc_dir = nil
|
1836
|
+
@full_gem_path = nil
|
1837
|
+
@gem_dir = nil
|
1838
|
+
@gems_dir = nil
|
1839
|
+
@ri_dir = nil
|
1840
|
+
@spec_dir = nil
|
1841
|
+
@spec_file = nil
|
1469
1842
|
end
|
1470
1843
|
|
1471
1844
|
##
|
@@ -1517,6 +1890,13 @@ class Gem::Specification
|
|
1517
1890
|
@extra_rdoc_files = @extra_rdoc_files.uniq if @extra_rdoc_files
|
1518
1891
|
end
|
1519
1892
|
|
1893
|
+
##
|
1894
|
+
# Return a NameTuple that represents this Specification
|
1895
|
+
|
1896
|
+
def name_tuple
|
1897
|
+
Gem::NameTuple.new name, version, original_platform
|
1898
|
+
end
|
1899
|
+
|
1520
1900
|
##
|
1521
1901
|
# Returns the full name (name-version) of this gemspec using the original
|
1522
1902
|
# platform. For use with legacy gems.
|
@@ -1543,44 +1923,6 @@ class Gem::Specification
|
|
1543
1923
|
@new_platform ||= Gem::Platform::RUBY
|
1544
1924
|
end
|
1545
1925
|
|
1546
|
-
##
|
1547
|
-
# The platform this gem runs on. See Gem::Platform for details.
|
1548
|
-
#
|
1549
|
-
# Setting this to any value other than Gem::Platform::RUBY or
|
1550
|
-
# Gem::Platform::CURRENT is probably wrong.
|
1551
|
-
|
1552
|
-
def platform= platform
|
1553
|
-
if @original_platform.nil? or
|
1554
|
-
@original_platform == Gem::Platform::RUBY then
|
1555
|
-
@original_platform = platform
|
1556
|
-
end
|
1557
|
-
|
1558
|
-
case platform
|
1559
|
-
when Gem::Platform::CURRENT then
|
1560
|
-
@new_platform = Gem::Platform.local
|
1561
|
-
@original_platform = @new_platform.to_s
|
1562
|
-
|
1563
|
-
when Gem::Platform then
|
1564
|
-
@new_platform = platform
|
1565
|
-
|
1566
|
-
# legacy constants
|
1567
|
-
when nil, Gem::Platform::RUBY then
|
1568
|
-
@new_platform = Gem::Platform::RUBY
|
1569
|
-
when 'mswin32' then # was Gem::Platform::WIN32
|
1570
|
-
@new_platform = Gem::Platform.new 'x86-mswin32'
|
1571
|
-
when 'i586-linux' then # was Gem::Platform::LINUX_586
|
1572
|
-
@new_platform = Gem::Platform.new 'x86-linux'
|
1573
|
-
when 'powerpc-darwin' then # was Gem::Platform::DARWIN
|
1574
|
-
@new_platform = Gem::Platform.new 'ppc-darwin'
|
1575
|
-
else
|
1576
|
-
@new_platform = Gem::Platform.new platform
|
1577
|
-
end
|
1578
|
-
|
1579
|
-
@platform = @new_platform.to_s
|
1580
|
-
|
1581
|
-
@new_platform
|
1582
|
-
end
|
1583
|
-
|
1584
1926
|
def pretty_print(q) # :nodoc:
|
1585
1927
|
q.group 2, 'Gem::Specification.new do |s|', 'end' do
|
1586
1928
|
q.breakable
|
@@ -1639,13 +1981,6 @@ class Gem::Specification
|
|
1639
1981
|
end
|
1640
1982
|
end
|
1641
1983
|
|
1642
|
-
##
|
1643
|
-
# An ARGV style array of options to RDoc
|
1644
|
-
|
1645
|
-
def rdoc_options
|
1646
|
-
@rdoc_options ||= []
|
1647
|
-
end
|
1648
|
-
|
1649
1984
|
##
|
1650
1985
|
# Sets rdoc_options to +value+, ensuring it is an array. Don't
|
1651
1986
|
# use this, push onto the array instead.
|
@@ -1669,13 +2004,6 @@ class Gem::Specification
|
|
1669
2004
|
self.require_paths = [path]
|
1670
2005
|
end
|
1671
2006
|
|
1672
|
-
##
|
1673
|
-
# The version of ruby required by this gem
|
1674
|
-
|
1675
|
-
def required_ruby_version= req
|
1676
|
-
@required_ruby_version = Gem::Requirement.create req
|
1677
|
-
end
|
1678
|
-
|
1679
2007
|
##
|
1680
2008
|
# The RubyGems version required by this gem
|
1681
2009
|
|
@@ -1683,14 +2011,6 @@ class Gem::Specification
|
|
1683
2011
|
@required_rubygems_version = Gem::Requirement.create req
|
1684
2012
|
end
|
1685
2013
|
|
1686
|
-
##
|
1687
|
-
# An array or things required by this gem. Not used by anything
|
1688
|
-
# presently.
|
1689
|
-
|
1690
|
-
def requirements
|
1691
|
-
@requirements ||= []
|
1692
|
-
end
|
1693
|
-
|
1694
2014
|
##
|
1695
2015
|
# Set requirements to +req+, ensuring it is an array. Don't
|
1696
2016
|
# use this, push onto the array instead.
|
@@ -1715,15 +2035,16 @@ class Gem::Specification
|
|
1715
2035
|
case obj
|
1716
2036
|
when String then obj.dump
|
1717
2037
|
when Array then '[' + obj.map { |x| ruby_code x }.join(", ") + ']'
|
2038
|
+
when Hash then
|
2039
|
+
seg = obj.keys.sort.map { |k| "#{k.to_s.dump} => #{obj[k].to_s.dump}" }
|
2040
|
+
"{ #{seg.join(', ')} }"
|
1718
2041
|
when Gem::Version then obj.to_s.dump
|
1719
2042
|
when Date then obj.strftime('%Y-%m-%d').dump
|
1720
2043
|
when Time then obj.strftime('%Y-%m-%d').dump
|
1721
2044
|
when Numeric then obj.inspect
|
1722
2045
|
when true, false, nil then obj.inspect
|
1723
2046
|
when Gem::Platform then "Gem::Platform.new(#{obj.to_a.inspect})"
|
1724
|
-
when Gem::Requirement then
|
1725
|
-
list = obj.as_list
|
1726
|
-
"Gem::Requirement.new(#{ruby_code(list.size == 1 ? obj.to_s : list)})"
|
2047
|
+
when Gem::Requirement then "Gem::Requirement.new(#{obj.to_s.inspect})"
|
1727
2048
|
else raise Gem::Exception, "ruby_code case not handled: #{obj.class}"
|
1728
2049
|
end
|
1729
2050
|
end
|
@@ -1803,7 +2124,7 @@ class Gem::Specification
|
|
1803
2124
|
end
|
1804
2125
|
|
1805
2126
|
##
|
1806
|
-
# Singular
|
2127
|
+
# Singular mutator for #test_files
|
1807
2128
|
|
1808
2129
|
def test_file= file
|
1809
2130
|
self.test_files = [file]
|
@@ -1828,28 +2149,14 @@ class Gem::Specification
|
|
1828
2149
|
end
|
1829
2150
|
end
|
1830
2151
|
|
1831
|
-
##
|
1832
|
-
# Set test_files to +files+, ensuring it is an array.
|
1833
|
-
|
1834
|
-
def test_files= files
|
1835
|
-
@test_files = Array files
|
1836
|
-
end
|
1837
|
-
|
1838
|
-
def test_suite_file # :nodoc:
|
1839
|
-
# TODO: deprecate
|
1840
|
-
test_files.first
|
1841
|
-
end
|
1842
|
-
|
1843
|
-
def test_suite_file= file # :nodoc:
|
1844
|
-
# TODO: deprecate
|
1845
|
-
@test_files = [] unless defined? @test_files
|
1846
|
-
@test_files << file
|
1847
|
-
end
|
1848
|
-
|
1849
2152
|
##
|
1850
2153
|
# Returns a Ruby code representation of this specification, such that it can
|
1851
2154
|
# be eval'ed and reconstruct the same specification later. Attributes that
|
1852
2155
|
# still have their default values are omitted.
|
2156
|
+
#
|
2157
|
+
# REFACTOR: This, plus stuff like #ruby_code and #pretty_print, should
|
2158
|
+
# probably be extracted out into some sort of separate class. SRP, do you
|
2159
|
+
# speak it!??!
|
1853
2160
|
|
1854
2161
|
def to_ruby
|
1855
2162
|
mark_version
|
@@ -1866,6 +2173,10 @@ class Gem::Specification
|
|
1866
2173
|
result << ""
|
1867
2174
|
result << " s.required_rubygems_version = #{ruby_code required_rubygems_version} if s.respond_to? :required_rubygems_version="
|
1868
2175
|
|
2176
|
+
if metadata and !metadata.empty?
|
2177
|
+
result << " s.metadata = #{ruby_code metadata} if s.respond_to? :metadata="
|
2178
|
+
end
|
2179
|
+
|
1869
2180
|
handled = [
|
1870
2181
|
:dependencies,
|
1871
2182
|
:name,
|
@@ -1875,6 +2186,7 @@ class Gem::Specification
|
|
1875
2186
|
:version,
|
1876
2187
|
:has_rdoc,
|
1877
2188
|
:default_executable,
|
2189
|
+
:metadata
|
1878
2190
|
]
|
1879
2191
|
|
1880
2192
|
@@attributes.each do |attr_name|
|
@@ -1886,34 +2198,36 @@ class Gem::Specification
|
|
1886
2198
|
end
|
1887
2199
|
end
|
1888
2200
|
|
1889
|
-
|
1890
|
-
|
1891
|
-
|
1892
|
-
|
2201
|
+
unless dependencies.empty? then
|
2202
|
+
result << nil
|
2203
|
+
result << " if s.respond_to? :specification_version then"
|
2204
|
+
result << " s.specification_version = #{specification_version}"
|
2205
|
+
result << nil
|
1893
2206
|
|
1894
|
-
|
2207
|
+
result << " if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then"
|
1895
2208
|
|
1896
|
-
|
1897
|
-
|
1898
|
-
|
1899
|
-
|
1900
|
-
|
2209
|
+
dependencies.each do |dep|
|
2210
|
+
req = dep.requirements_list.inspect
|
2211
|
+
dep.instance_variable_set :@type, :runtime if dep.type.nil? # HACK
|
2212
|
+
result << " s.add_#{dep.type}_dependency(%q<#{dep.name}>, #{req})"
|
2213
|
+
end
|
1901
2214
|
|
1902
|
-
|
2215
|
+
result << " else"
|
1903
2216
|
|
1904
|
-
|
1905
|
-
|
1906
|
-
|
1907
|
-
|
2217
|
+
dependencies.each do |dep|
|
2218
|
+
version_reqs_param = dep.requirements_list.inspect
|
2219
|
+
result << " s.add_dependency(%q<#{dep.name}>, #{version_reqs_param})"
|
2220
|
+
end
|
1908
2221
|
|
1909
|
-
|
2222
|
+
result << ' end'
|
1910
2223
|
|
1911
|
-
|
2224
|
+
result << " else"
|
1912
2225
|
dependencies.each do |dep|
|
1913
2226
|
version_reqs_param = dep.requirements_list.inspect
|
1914
2227
|
result << " s.add_dependency(%q<#{dep.name}>, #{version_reqs_param})"
|
1915
2228
|
end
|
1916
|
-
|
2229
|
+
result << " end"
|
2230
|
+
end
|
1917
2231
|
|
1918
2232
|
result << "end"
|
1919
2233
|
result << nil
|
@@ -2061,12 +2375,42 @@ class Gem::Specification
|
|
2061
2375
|
end
|
2062
2376
|
end
|
2063
2377
|
|
2378
|
+
# FIX: uhhhh single element array.each?
|
2064
2379
|
[:authors].each do |field|
|
2065
2380
|
val = self.send field
|
2066
2381
|
raise Gem::InvalidSpecificationException, "#{field} may not be empty" if
|
2067
2382
|
val.empty?
|
2068
2383
|
end
|
2069
2384
|
|
2385
|
+
unless Hash === metadata
|
2386
|
+
raise Gem::InvalidSpecificationException,
|
2387
|
+
'metadata must be a hash'
|
2388
|
+
end
|
2389
|
+
|
2390
|
+
metadata.keys.each do |k|
|
2391
|
+
if !k.kind_of?(String)
|
2392
|
+
raise Gem::InvalidSpecificationException,
|
2393
|
+
'metadata keys must be a String'
|
2394
|
+
end
|
2395
|
+
|
2396
|
+
if k.size > 128
|
2397
|
+
raise Gem::InvalidSpecificationException,
|
2398
|
+
"metadata key too large (#{k.size} > 128)"
|
2399
|
+
end
|
2400
|
+
end
|
2401
|
+
|
2402
|
+
metadata.values.each do |k|
|
2403
|
+
if !k.kind_of?(String)
|
2404
|
+
raise Gem::InvalidSpecificationException,
|
2405
|
+
'metadata values must be a String'
|
2406
|
+
end
|
2407
|
+
|
2408
|
+
if k.size > 1024
|
2409
|
+
raise Gem::InvalidSpecificationException,
|
2410
|
+
"metadata value too large (#{k.size} > 1024)"
|
2411
|
+
end
|
2412
|
+
end
|
2413
|
+
|
2070
2414
|
licenses.each { |license|
|
2071
2415
|
if license.length > 64
|
2072
2416
|
raise Gem::InvalidSpecificationException,
|
@@ -2074,8 +2418,13 @@ class Gem::Specification
|
|
2074
2418
|
end
|
2075
2419
|
}
|
2076
2420
|
|
2421
|
+
alert_warning 'licenses is empty' if licenses.empty?
|
2422
|
+
|
2423
|
+
validate_permissions
|
2424
|
+
|
2077
2425
|
# reject lazy developers:
|
2078
2426
|
|
2427
|
+
# FIX: Doesn't this just evaluate to "FIXME" or "TODO"?
|
2079
2428
|
lazy = '"FIxxxXME" or "TOxxxDO"'.gsub(/xxx/, '')
|
2080
2429
|
|
2081
2430
|
unless authors.grep(/FI XME|TO DO/x).empty? then
|
@@ -2121,9 +2470,36 @@ class Gem::Specification
|
|
2121
2470
|
alert_warning "#{executable_path} is missing #! line" unless shebang
|
2122
2471
|
end
|
2123
2472
|
|
2473
|
+
dependencies.each do |dep|
|
2474
|
+
prerelease_dep = dep.requirements_list.any? do |req|
|
2475
|
+
Gem::Requirement.new(req).prerelease?
|
2476
|
+
end
|
2477
|
+
|
2478
|
+
alert_warning "prerelease dependency on #{dep} is not recommended" if
|
2479
|
+
prerelease_dep
|
2480
|
+
end
|
2481
|
+
|
2124
2482
|
true
|
2125
2483
|
end
|
2126
2484
|
|
2485
|
+
##
|
2486
|
+
# Checks to see if the files to be packaged are world-readable.
|
2487
|
+
|
2488
|
+
def validate_permissions
|
2489
|
+
return if Gem.win_platform?
|
2490
|
+
|
2491
|
+
files.each do |file|
|
2492
|
+
next if File.stat(file).mode & 0444 == 0444
|
2493
|
+
alert_warning "#{file} is not world-readable"
|
2494
|
+
end
|
2495
|
+
|
2496
|
+
executables.each do |name|
|
2497
|
+
exec = File.join @bindir, name
|
2498
|
+
next if File.stat(exec).executable?
|
2499
|
+
alert_warning "#{exec} is not executable"
|
2500
|
+
end
|
2501
|
+
end
|
2502
|
+
|
2127
2503
|
##
|
2128
2504
|
# Set the version to +version+, potentially also setting
|
2129
2505
|
# required_rubygems_version if +version+ indicates it is a
|
@@ -2132,6 +2508,8 @@ class Gem::Specification
|
|
2132
2508
|
def version= version
|
2133
2509
|
@version = Gem::Version.create(version)
|
2134
2510
|
self.required_rubygems_version = '> 1.3.1' if @version.prerelease?
|
2511
|
+
invalidate_memoized_attributes
|
2512
|
+
|
2135
2513
|
return @version
|
2136
2514
|
end
|
2137
2515
|
|
@@ -2151,15 +2529,33 @@ class Gem::Specification
|
|
2151
2529
|
self.platform = Gem::Platform.new @platform
|
2152
2530
|
end
|
2153
2531
|
|
2532
|
+
##
|
2533
|
+
# Reset nil attributes to their default values to make the spec valid
|
2534
|
+
|
2535
|
+
def reset_nil_attributes_to_default
|
2536
|
+
nil_attributes = self.class.non_nil_attributes.find_all do |name|
|
2537
|
+
!instance_variable_defined?("@#{name}") || instance_variable_get("@#{name}").nil?
|
2538
|
+
end
|
2539
|
+
|
2540
|
+
nil_attributes.each do |attribute|
|
2541
|
+
default = self.default_value attribute
|
2542
|
+
|
2543
|
+
value = case default
|
2544
|
+
when Time, Numeric, Symbol, true, false, nil then default
|
2545
|
+
else default.dup
|
2546
|
+
end
|
2547
|
+
|
2548
|
+
instance_variable_set "@#{attribute}", value
|
2549
|
+
end
|
2550
|
+
end
|
2551
|
+
|
2552
|
+
def default_gem?
|
2553
|
+
loaded_from &&
|
2554
|
+
File.dirname(loaded_from) == self.class.default_specifications_dir
|
2555
|
+
end
|
2556
|
+
|
2154
2557
|
extend Gem::Deprecate
|
2155
2558
|
|
2156
|
-
deprecate :test_suite_file, :test_file, 2011, 10
|
2157
|
-
deprecate :test_suite_file=, :test_file=, 2011, 10
|
2158
|
-
deprecate :loaded, :activated, 2011, 10
|
2159
|
-
deprecate :loaded?, :activated?, 2011, 10
|
2160
|
-
deprecate :loaded=, :activated=, 2011, 10
|
2161
|
-
deprecate :installation_path, :base_dir, 2011, 10
|
2162
|
-
deprecate :cache_gem, :cache_file, 2011, 10
|
2163
2559
|
# TODO:
|
2164
2560
|
# deprecate :has_rdoc, :none, 2011, 10
|
2165
2561
|
# deprecate :has_rdoc?, :none, 2011, 10
|
@@ -2171,5 +2567,5 @@ class Gem::Specification
|
|
2171
2567
|
# deprecate :full_gem_path, :cache_file, 2011, 10
|
2172
2568
|
end
|
2173
2569
|
|
2570
|
+
# DOC: What is this and why is it here, randomly, at the end of this file?
|
2174
2571
|
Gem.clear_paths
|
2175
|
-
|