rubygems-update 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rubygems-update might be problematic. Click here for more details.
- data.tar.gz.sig +2 -4
- data/ChangeLog +155 -0
- data/Rakefile +20 -5
- data/doc/release_notes/rel_1_3_0.rdoc +125 -0
- data/lib/rubygems.rb +107 -15
- data/lib/rubygems/commands/contents_command.rb +1 -1
- data/lib/rubygems/commands/environment_command.rb +40 -0
- data/lib/rubygems/commands/help_command.rb +2 -2
- data/lib/rubygems/commands/install_command.rb +15 -0
- data/lib/rubygems/commands/lock_command.rb +15 -6
- data/lib/rubygems/commands/outdated_command.rb +1 -1
- data/lib/rubygems/commands/pristine_command.rb +1 -1
- data/lib/rubygems/commands/query_command.rb +14 -9
- data/lib/rubygems/commands/rdoc_command.rb +5 -1
- data/lib/rubygems/commands/specification_command.rb +2 -2
- data/lib/rubygems/commands/unpack_command.rb +1 -1
- data/lib/rubygems/commands/update_command.rb +23 -14
- data/lib/rubygems/commands/which_command.rb +4 -3
- data/lib/rubygems/config_file.rb +25 -3
- data/lib/rubygems/defaults.rb +42 -11
- data/lib/rubygems/dependency_installer.rb +19 -15
- data/lib/rubygems/doc_manager.rb +162 -115
- data/lib/rubygems/ext/builder.rb +2 -2
- data/lib/rubygems/ext/rake_builder.rb +1 -1
- data/lib/rubygems/gem_path_searcher.rb +35 -19
- data/lib/rubygems/indexer.rb +15 -6
- data/lib/rubygems/install_update_options.rb +7 -0
- data/lib/rubygems/installer.rb +85 -9
- data/lib/rubygems/local_remote_options.rb +7 -0
- data/lib/rubygems/package/tar_reader.rb +7 -7
- data/lib/rubygems/platform.rb +1 -18
- data/lib/rubygems/remote_fetcher.rb +45 -54
- data/lib/rubygems/rubygems_version.rb +1 -1
- data/lib/rubygems/source_index.rb +22 -7
- data/lib/rubygems/source_info_cache.rb +9 -0
- data/lib/rubygems/spec_fetcher.rb +18 -20
- data/lib/rubygems/specification.rb +502 -293
- data/lib/rubygems/test_utilities.rb +19 -8
- data/lib/rubygems/uninstaller.rb +60 -26
- data/setup.rb +15 -7
- data/test/gemutilities.rb +84 -0
- data/test/mockgemui.rb +22 -2
- data/test/test_gem.rb +118 -13
- data/test/test_gem_commands_dependency_command.rb +1 -1
- data/test/test_gem_commands_list_command.rb +37 -0
- data/test/test_gem_commands_lock_command.rb +69 -0
- data/test/test_gem_commands_query_command.rb +40 -1
- data/test/test_gem_commands_uninstall_command.rb +60 -0
- data/test/test_gem_config_file.rb +51 -17
- data/test/test_gem_ext_configure_builder.rb +9 -9
- data/test/test_gem_ext_rake_builder.rb +21 -12
- data/test/test_gem_gem_path_searcher.rb +15 -7
- data/test/test_gem_indexer.rb +35 -1
- data/test/test_gem_install_update_options.rb +26 -5
- data/test/test_gem_installer.rb +93 -21
- data/test/test_gem_local_remote_options.rb +12 -0
- data/test/test_gem_platform.rb +6 -13
- data/test/test_gem_remote_fetcher.rb +121 -31
- data/test/test_gem_source_index.rb +74 -21
- data/test/test_gem_source_info_cache.rb +2 -1
- data/test/test_gem_spec_fetcher.rb +13 -3
- data/test/test_gem_specification.rb +13 -7
- data/test/test_gem_uninstaller.rb +25 -2
- metadata +6 -2
- metadata.gz.sig +0 -0
@@ -7,7 +7,9 @@
|
|
7
7
|
require 'rubygems'
|
8
8
|
require 'rubygems/user_interaction'
|
9
9
|
require 'rubygems/specification'
|
10
|
-
|
10
|
+
module Gem
|
11
|
+
autoload(:SpecFetcher, 'rubygems/spec_fetcher')
|
12
|
+
end
|
11
13
|
|
12
14
|
##
|
13
15
|
# The SourceIndex object indexes all the gems available from a
|
@@ -80,8 +82,14 @@ class Gem::SourceIndex
|
|
80
82
|
|
81
83
|
def load_specification(file_name)
|
82
84
|
begin
|
83
|
-
spec_code =
|
85
|
+
spec_code = if RUBY_VERSION < '1.9' then
|
86
|
+
File.read file_name
|
87
|
+
else
|
88
|
+
File.read file_name, :encoding => 'UTF-8'
|
89
|
+
end.untaint
|
90
|
+
|
84
91
|
gemspec = eval spec_code, binding, file_name
|
92
|
+
|
85
93
|
if gemspec.is_a?(Gem::Specification)
|
86
94
|
gemspec.loaded_from = file_name
|
87
95
|
return gemspec
|
@@ -93,7 +101,7 @@ class Gem::SourceIndex
|
|
93
101
|
alert_warning e
|
94
102
|
alert_warning spec_code
|
95
103
|
rescue Exception => e
|
96
|
-
alert_warning
|
104
|
+
alert_warning "#{e.inspect}\n#{spec_code}"
|
97
105
|
alert_warning "Invalid .gemspec format in '#{file_name}'"
|
98
106
|
end
|
99
107
|
return nil
|
@@ -230,7 +238,8 @@ class Gem::SourceIndex
|
|
230
238
|
# Find a gem by an exact match on the short name.
|
231
239
|
|
232
240
|
def find_name(gem_name, version_requirement = Gem::Requirement.default)
|
233
|
-
|
241
|
+
dep = Gem::Dependency.new(/^#{gem_name}$/, version_requirement)
|
242
|
+
search dep
|
234
243
|
end
|
235
244
|
|
236
245
|
##
|
@@ -246,7 +255,13 @@ class Gem::SourceIndex
|
|
246
255
|
version_requirement = nil
|
247
256
|
only_platform = false
|
248
257
|
|
249
|
-
|
258
|
+
# TODO - Remove support and warning for legacy arguments after 2008/11
|
259
|
+
unless Gem::Dependency === gem_pattern
|
260
|
+
warn "Gem::SourceIndex#search support for #{gem_pattern.class} patterns is deprecated"
|
261
|
+
warn "#{caller[0]} is outdated"
|
262
|
+
end
|
263
|
+
|
264
|
+
case gem_pattern
|
250
265
|
when Regexp then
|
251
266
|
version_requirement = platform_only || Gem::Requirement.default
|
252
267
|
when Gem::Dependency then
|
@@ -270,7 +285,7 @@ class Gem::SourceIndex
|
|
270
285
|
|
271
286
|
specs = @gems.values.select do |spec|
|
272
287
|
spec.name =~ gem_pattern and
|
273
|
-
|
288
|
+
version_requirement.satisfied_by? spec.version
|
274
289
|
end
|
275
290
|
|
276
291
|
if only_platform then
|
@@ -539,7 +554,7 @@ module Gem
|
|
539
554
|
# objects to load properly.
|
540
555
|
Cache = SourceIndex
|
541
556
|
|
542
|
-
# :
|
557
|
+
# :startdoc:
|
543
558
|
|
544
559
|
end
|
545
560
|
|
@@ -284,6 +284,10 @@ class Gem::SourceInfoCache
|
|
284
284
|
|
285
285
|
cache_data.map do |source_uri, sic_entry|
|
286
286
|
next unless Gem.sources.include? source_uri
|
287
|
+
# TODO - Remove this gunk after 2008/11
|
288
|
+
unless pattern.kind_of?(Gem::Dependency)
|
289
|
+
pattern = Gem::Dependency.new(pattern, Gem::Requirement.default)
|
290
|
+
end
|
287
291
|
sic_entry.source_index.search pattern, platform_only
|
288
292
|
end.flatten.compact
|
289
293
|
end
|
@@ -300,6 +304,11 @@ class Gem::SourceInfoCache
|
|
300
304
|
cache_data.map do |source_uri, sic_entry|
|
301
305
|
next unless Gem.sources.include? source_uri
|
302
306
|
|
307
|
+
# TODO - Remove this gunk after 2008/11
|
308
|
+
unless pattern.kind_of?(Gem::Dependency)
|
309
|
+
pattern = Gem::Dependency.new(pattern, Gem::Requirement.default)
|
310
|
+
end
|
311
|
+
|
303
312
|
sic_entry.source_index.search(pattern, only_platform).each do |spec|
|
304
313
|
results << [spec, source_uri]
|
305
314
|
end
|
@@ -167,7 +167,7 @@ class Gem::SpecFetcher
|
|
167
167
|
|
168
168
|
if all and @specs.include? source_uri then
|
169
169
|
list[source_uri] = @specs[source_uri]
|
170
|
-
elsif @latest_specs.include? source_uri then
|
170
|
+
elsif not all and @latest_specs.include? source_uri then
|
171
171
|
list[source_uri] = @latest_specs[source_uri]
|
172
172
|
else
|
173
173
|
specs = load_specs source_uri, file
|
@@ -182,30 +182,28 @@ class Gem::SpecFetcher
|
|
182
182
|
list
|
183
183
|
end
|
184
184
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
spec_path = source_uri + file_name
|
189
|
-
|
190
|
-
cache_dir = cache_dir spec_path
|
185
|
+
##
|
186
|
+
# Loads specs in +file+, fetching from +source_uri+ if the on-disk cache is
|
187
|
+
# out of date.
|
191
188
|
|
192
|
-
|
189
|
+
def load_specs(source_uri, file)
|
190
|
+
file_name = "#{file}.#{Gem.marshal_version}"
|
191
|
+
spec_path = source_uri + "#{file_name}.gz"
|
192
|
+
cache_dir = cache_dir spec_path
|
193
|
+
local_file = File.join(cache_dir, file_name)
|
194
|
+
loaded = false
|
193
195
|
|
194
196
|
if File.exist? local_file then
|
195
|
-
|
196
|
-
|
197
|
-
remote_file = spec_path.dup
|
198
|
-
remote_file.path = remote_file.path.chomp '.gz'
|
199
|
-
remote_size = @fetcher.fetch_size remote_file
|
197
|
+
spec_dump = @fetcher.fetch_path spec_path, File.mtime(local_file)
|
200
198
|
|
201
|
-
spec_dump
|
202
|
-
|
203
|
-
|
204
|
-
|
199
|
+
if spec_dump.nil? then
|
200
|
+
spec_dump = Gem.read_binary local_file
|
201
|
+
else
|
202
|
+
loaded = true
|
203
|
+
end
|
204
|
+
else
|
205
|
+
spec_dump = @fetcher.fetch_path spec_path
|
205
206
|
loaded = true
|
206
|
-
|
207
|
-
spec_dump_gz = @fetcher.fetch_path spec_path
|
208
|
-
spec_dump = Gem.gunzip spec_dump_gz
|
209
207
|
end
|
210
208
|
|
211
209
|
specs = Marshal.load spec_dump
|
@@ -24,6 +24,7 @@ class Date; end # for ruby_code if date.rb wasn't required
|
|
24
24
|
|
25
25
|
module Gem
|
26
26
|
|
27
|
+
##
|
27
28
|
# == Gem::Specification
|
28
29
|
#
|
29
30
|
# The Specification class contains the metadata for a Gem. Typically
|
@@ -38,7 +39,7 @@ module Gem
|
|
38
39
|
#
|
39
40
|
# There are many <em>gemspec attributes</em>, and the best place to learn
|
40
41
|
# about them in the "Gemspec Reference" linked from the RubyGems wiki.
|
41
|
-
|
42
|
+
|
42
43
|
class Specification
|
43
44
|
|
44
45
|
##
|
@@ -46,8 +47,6 @@ module Gem
|
|
46
47
|
|
47
48
|
attr_accessor :original_platform # :nodoc:
|
48
49
|
|
49
|
-
# ------------------------- Specification version constants.
|
50
|
-
|
51
50
|
##
|
52
51
|
# The the version number of a specification that does not specify one
|
53
52
|
# (i.e. RubyGems 0.7 or earlier).
|
@@ -88,77 +87,98 @@ module Gem
|
|
88
87
|
TODAY = now - ((now.to_i + now.gmt_offset) % 86400)
|
89
88
|
# :startdoc:
|
90
89
|
|
91
|
-
|
92
|
-
|
90
|
+
##
|
93
91
|
# List of Specification instances.
|
92
|
+
|
94
93
|
@@list = []
|
95
94
|
|
95
|
+
##
|
96
96
|
# Optional block used to gather newly defined instances.
|
97
|
+
|
97
98
|
@@gather = nil
|
98
99
|
|
100
|
+
##
|
99
101
|
# List of attribute names: [:name, :version, ...]
|
100
102
|
@@required_attributes = []
|
101
103
|
|
102
|
-
|
104
|
+
##
|
105
|
+
# List of _all_ attributes and default values:
|
106
|
+
#
|
107
|
+
# [[:name, nil],
|
108
|
+
# [:bindir, 'bin'],
|
109
|
+
# ...]
|
110
|
+
|
103
111
|
@@attributes = []
|
104
112
|
|
105
113
|
@@nil_attributes = []
|
106
114
|
@@non_nil_attributes = [:@original_platform]
|
107
115
|
|
116
|
+
##
|
108
117
|
# List of array attributes
|
118
|
+
|
109
119
|
@@array_attributes = []
|
110
120
|
|
121
|
+
##
|
111
122
|
# Map of attribute names to default values.
|
123
|
+
|
112
124
|
@@default_value = {}
|
113
125
|
|
114
|
-
|
126
|
+
##
|
127
|
+
# Names of all specification attributes
|
115
128
|
|
116
129
|
def self.attribute_names
|
117
130
|
@@attributes.map { |name, default| name }
|
118
131
|
end
|
119
132
|
|
133
|
+
##
|
134
|
+
# Default values for specification attributes
|
135
|
+
|
120
136
|
def self.attribute_defaults
|
121
137
|
@@attributes.dup
|
122
138
|
end
|
123
139
|
|
140
|
+
##
|
141
|
+
# The default value for specification attribute +name+
|
142
|
+
|
124
143
|
def self.default_value(name)
|
125
144
|
@@default_value[name]
|
126
145
|
end
|
127
146
|
|
147
|
+
##
|
148
|
+
# Required specification attributes
|
149
|
+
|
128
150
|
def self.required_attributes
|
129
151
|
@@required_attributes.dup
|
130
152
|
end
|
131
153
|
|
154
|
+
##
|
155
|
+
# Is +name+ a required attribute?
|
156
|
+
|
132
157
|
def self.required_attribute?(name)
|
133
158
|
@@required_attributes.include? name.to_sym
|
134
159
|
end
|
135
160
|
|
161
|
+
##
|
162
|
+
# Specification attributes that are arrays (appendable and so-forth)
|
163
|
+
|
136
164
|
def self.array_attributes
|
137
165
|
@@array_attributes.dup
|
138
166
|
end
|
139
167
|
|
140
|
-
|
168
|
+
##
|
169
|
+
# A list of Specification instances that have been defined in this Ruby
|
170
|
+
# instance.
|
141
171
|
|
142
|
-
# A list of Specification instances that have been defined in this Ruby instance.
|
143
172
|
def self.list
|
144
173
|
@@list
|
145
174
|
end
|
146
175
|
|
147
|
-
|
148
|
-
#
|
149
|
-
#
|
150
|
-
# and @@default_value map
|
151
|
-
# * a standard _writer_ method (<tt>attribute=</tt>) is created
|
152
|
-
# * a non-standard _reader method (<tt>attribute</tt>) is created
|
153
|
-
#
|
154
|
-
# The reader method behaves like this:
|
155
|
-
# def attribute
|
156
|
-
# @attribute ||= (copy of default value)
|
157
|
-
# end
|
158
|
-
#
|
159
|
-
# This allows lazy initialization of attributes to their default
|
160
|
-
# values.
|
176
|
+
##
|
177
|
+
# Specifies the +name+ and +default+ for a specification attribute, and
|
178
|
+
# creates a reader and writer method like Module#attr_accessor.
|
161
179
|
#
|
180
|
+
# The reader method returns the default if the value hasn't been set.
|
181
|
+
|
162
182
|
def self.attribute(name, default=nil)
|
163
183
|
ivar_name = "@#{name}".intern
|
164
184
|
if default.nil? then
|
@@ -172,8 +192,10 @@ module Gem
|
|
172
192
|
attr_accessor(name)
|
173
193
|
end
|
174
194
|
|
175
|
-
|
176
|
-
# attribute
|
195
|
+
##
|
196
|
+
# Same as :attribute, but ensures that values assigned to the attribute
|
197
|
+
# are array values by applying :to_a to the value.
|
198
|
+
|
177
199
|
def self.array_attribute(name)
|
178
200
|
@@non_nil_attributes << ["@#{name}".intern, []]
|
179
201
|
|
@@ -192,51 +214,60 @@ module Gem
|
|
192
214
|
module_eval code, __FILE__, __LINE__ - 9
|
193
215
|
end
|
194
216
|
|
217
|
+
##
|
195
218
|
# Same as attribute above, but also records this attribute as mandatory.
|
219
|
+
|
196
220
|
def self.required_attribute(*args)
|
197
221
|
@@required_attributes << args.first
|
198
222
|
attribute(*args)
|
199
223
|
end
|
200
224
|
|
201
|
-
|
225
|
+
##
|
226
|
+
# Sometimes we don't want the world to use a setter method for a
|
227
|
+
# particular attribute.
|
228
|
+
#
|
202
229
|
# +read_only+ makes it private so we can still use it internally.
|
230
|
+
|
203
231
|
def self.read_only(*names)
|
204
232
|
names.each do |name|
|
205
233
|
private "#{name}="
|
206
234
|
end
|
207
235
|
end
|
208
236
|
|
209
|
-
# Shortcut for creating several attributes at once (each with a default
|
210
|
-
# +nil+).
|
237
|
+
# Shortcut for creating several attributes at once (each with a default
|
238
|
+
# value of +nil+).
|
239
|
+
|
211
240
|
def self.attributes(*args)
|
212
241
|
args.each do |arg|
|
213
242
|
attribute(arg, nil)
|
214
243
|
end
|
215
244
|
end
|
216
245
|
|
217
|
-
|
218
|
-
#
|
246
|
+
##
|
247
|
+
# Some attributes require special behaviour when they are accessed. This
|
248
|
+
# allows for that.
|
249
|
+
|
219
250
|
def self.overwrite_accessor(name, &block)
|
220
251
|
remove_method name
|
221
252
|
define_method(name, &block)
|
222
253
|
end
|
223
254
|
|
224
|
-
|
225
|
-
#
|
226
|
-
#
|
227
|
-
# appends it to the array.
|
228
|
-
# that in a spec, one can write
|
255
|
+
##
|
256
|
+
# Defines a _singular_ version of an existing _plural_ attribute (i.e. one
|
257
|
+
# whose value is expected to be an array). This means just creating a
|
258
|
+
# helper method that takes a single value and appends it to the array.
|
259
|
+
# These are created for convenience, so that in a spec, one can write
|
229
260
|
#
|
230
261
|
# s.require_path = 'mylib'
|
231
262
|
#
|
232
|
-
# instead of
|
263
|
+
# instead of:
|
233
264
|
#
|
234
265
|
# s.require_paths = ['mylib']
|
235
266
|
#
|
236
|
-
# That above convenience is available courtesy of
|
267
|
+
# That above convenience is available courtesy of:
|
237
268
|
#
|
238
269
|
# attribute_alias_singular :require_path, :require_paths
|
239
|
-
|
270
|
+
|
240
271
|
def self.attribute_alias_singular(singular, plural)
|
241
272
|
define_method("#{singular}=") { |val|
|
242
273
|
send("#{plural}=", [val])
|
@@ -320,189 +351,45 @@ module Gem
|
|
320
351
|
spec
|
321
352
|
end
|
322
353
|
|
323
|
-
|
324
|
-
|
325
|
-
required_attribute :rubygems_version, Gem::RubyGemsVersion
|
326
|
-
required_attribute :specification_version, CURRENT_SPECIFICATION_VERSION
|
327
|
-
required_attribute :name
|
328
|
-
required_attribute :version
|
329
|
-
required_attribute :date, TODAY
|
330
|
-
required_attribute :summary
|
331
|
-
required_attribute :require_paths, ['lib']
|
332
|
-
|
333
|
-
# OPTIONAL gemspec attributes ------------------------------------
|
334
|
-
|
335
|
-
attributes :email, :homepage, :rubyforge_project, :description
|
336
|
-
attributes :autorequire, :default_executable
|
337
|
-
|
338
|
-
attribute :bindir, 'bin'
|
339
|
-
attribute :has_rdoc, false
|
340
|
-
attribute :required_ruby_version, Gem::Requirement.default
|
341
|
-
attribute :required_rubygems_version, Gem::Requirement.default
|
342
|
-
attribute :platform, Gem::Platform::RUBY
|
343
|
-
|
344
|
-
attribute :signing_key, nil
|
345
|
-
attribute :cert_chain, []
|
346
|
-
attribute :post_install_message, nil
|
347
|
-
|
348
|
-
array_attribute :authors
|
349
|
-
array_attribute :files
|
350
|
-
array_attribute :test_files
|
351
|
-
array_attribute :rdoc_options
|
352
|
-
array_attribute :extra_rdoc_files
|
353
|
-
array_attribute :executables
|
354
|
-
|
355
|
-
# Array of extensions to build. See Gem::Installer#build_extensions for
|
356
|
-
# valid values.
|
357
|
-
|
358
|
-
array_attribute :extensions
|
359
|
-
array_attribute :requirements
|
360
|
-
array_attribute :dependencies
|
361
|
-
|
362
|
-
read_only :dependencies
|
354
|
+
##
|
355
|
+
# List of depedencies that will automatically be activated at runtime.
|
363
356
|
|
364
357
|
def runtime_dependencies
|
365
358
|
dependencies.select { |d| d.type == :runtime || d.type == nil }
|
366
359
|
end
|
367
360
|
|
361
|
+
##
|
362
|
+
# List of dependencies that are used for development
|
363
|
+
|
368
364
|
def development_dependencies
|
369
365
|
dependencies.select { |d| d.type == :development }
|
370
366
|
end
|
371
367
|
|
372
|
-
|
373
|
-
|
374
|
-
attribute_alias_singular :executable, :executables
|
375
|
-
attribute_alias_singular :author, :authors
|
376
|
-
attribute_alias_singular :require_path, :require_paths
|
377
|
-
attribute_alias_singular :test_file, :test_files
|
378
|
-
|
379
|
-
# DEPRECATED gemspec attributes ----------------------------------
|
380
|
-
|
381
|
-
def test_suite_file
|
368
|
+
def test_suite_file # :nodoc:
|
382
369
|
warn 'test_suite_file deprecated, use test_files'
|
383
370
|
test_files.first
|
384
371
|
end
|
385
372
|
|
386
|
-
def test_suite_file=(val)
|
373
|
+
def test_suite_file=(val) # :nodoc:
|
387
374
|
warn 'test_suite_file= deprecated, use test_files='
|
388
375
|
@test_files = [] unless defined? @test_files
|
389
376
|
@test_files << val
|
390
377
|
end
|
391
378
|
|
379
|
+
##
|
392
380
|
# true when this gemspec has been loaded from a specifications directory.
|
393
381
|
# This attribute is not persisted.
|
394
382
|
|
395
|
-
|
383
|
+
attr_accessor :loaded
|
396
384
|
|
385
|
+
##
|
397
386
|
# Path this gemspec was loaded from. This attribute is not persisted.
|
398
|
-
attr_accessor :loaded_from
|
399
|
-
|
400
|
-
# Special accessor behaviours (overwriting default) --------------
|
401
|
-
|
402
|
-
overwrite_accessor :version= do |version|
|
403
|
-
@version = Version.create(version)
|
404
|
-
end
|
405
|
-
|
406
|
-
overwrite_accessor :platform do
|
407
|
-
@new_platform
|
408
|
-
end
|
409
|
-
|
410
|
-
overwrite_accessor :platform= do |platform|
|
411
|
-
if @original_platform.nil? or
|
412
|
-
@original_platform == Gem::Platform::RUBY then
|
413
|
-
@original_platform = platform
|
414
|
-
end
|
415
|
-
|
416
|
-
case platform
|
417
|
-
when Gem::Platform::CURRENT then
|
418
|
-
@new_platform = Gem::Platform.local
|
419
|
-
@original_platform = @new_platform.to_s
|
420
|
-
|
421
|
-
when Gem::Platform then
|
422
|
-
@new_platform = platform
|
423
|
-
|
424
|
-
# legacy constants
|
425
|
-
when nil, Gem::Platform::RUBY then
|
426
|
-
@new_platform = Gem::Platform::RUBY
|
427
|
-
when 'mswin32' then # was Gem::Platform::WIN32
|
428
|
-
@new_platform = Gem::Platform.new 'x86-mswin32'
|
429
|
-
when 'i586-linux' then # was Gem::Platform::LINUX_586
|
430
|
-
@new_platform = Gem::Platform.new 'x86-linux'
|
431
|
-
when 'powerpc-darwin' then # was Gem::Platform::DARWIN
|
432
|
-
@new_platform = Gem::Platform.new 'ppc-darwin'
|
433
|
-
else
|
434
|
-
@new_platform = Gem::Platform.new platform
|
435
|
-
end
|
436
|
-
|
437
|
-
@platform = @new_platform.to_s
|
438
|
-
|
439
|
-
@new_platform
|
440
|
-
end
|
441
|
-
|
442
|
-
overwrite_accessor :required_ruby_version= do |value|
|
443
|
-
@required_ruby_version = Gem::Requirement.create(value)
|
444
|
-
end
|
445
|
-
|
446
|
-
overwrite_accessor :required_rubygems_version= do |value|
|
447
|
-
@required_rubygems_version = Gem::Requirement.create(value)
|
448
|
-
end
|
449
|
-
|
450
|
-
overwrite_accessor :date= do |date|
|
451
|
-
# We want to end up with a Time object with one-day resolution.
|
452
|
-
# This is the cleanest, most-readable, faster-than-using-Date
|
453
|
-
# way to do it.
|
454
|
-
case date
|
455
|
-
when String then
|
456
|
-
@date = if /\A(\d{4})-(\d{2})-(\d{2})\Z/ =~ date then
|
457
|
-
Time.local($1.to_i, $2.to_i, $3.to_i)
|
458
|
-
else
|
459
|
-
require 'time'
|
460
|
-
Time.parse date
|
461
|
-
end
|
462
|
-
when Time then
|
463
|
-
@date = Time.local(date.year, date.month, date.day)
|
464
|
-
when Date then
|
465
|
-
@date = Time.local(date.year, date.month, date.day)
|
466
|
-
else
|
467
|
-
@date = TODAY
|
468
|
-
end
|
469
|
-
end
|
470
|
-
|
471
|
-
overwrite_accessor :date do
|
472
|
-
self.date = nil if @date.nil? # HACK Sets the default value for date
|
473
|
-
@date
|
474
|
-
end
|
475
|
-
|
476
|
-
overwrite_accessor :summary= do |str|
|
477
|
-
@summary = if str then
|
478
|
-
str.strip.
|
479
|
-
gsub(/(\w-)\n[ \t]*(\w)/, '\1\2').
|
480
|
-
gsub(/\n[ \t]*/, " ")
|
481
|
-
end
|
482
|
-
end
|
483
387
|
|
484
|
-
|
485
|
-
@description = if str then
|
486
|
-
str.strip.
|
487
|
-
gsub(/(\w-)\n[ \t]*(\w)/, '\1\2').
|
488
|
-
gsub(/\n[ \t]*/, " ")
|
489
|
-
end
|
490
|
-
end
|
388
|
+
attr_accessor :loaded_from
|
491
389
|
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
result = @default_executable
|
496
|
-
elsif @executables and @executables.size == 1
|
497
|
-
result = Array(@executables).first
|
498
|
-
else
|
499
|
-
result = nil
|
500
|
-
end
|
501
|
-
result
|
502
|
-
rescue
|
503
|
-
nil
|
504
|
-
end
|
505
|
-
end
|
390
|
+
##
|
391
|
+
# Returns an array with bindir attached to each executable in the
|
392
|
+
# executables list
|
506
393
|
|
507
394
|
def add_bindir(executables)
|
508
395
|
return nil if executables.nil?
|
@@ -516,17 +403,9 @@ module Gem
|
|
516
403
|
return nil
|
517
404
|
end
|
518
405
|
|
519
|
-
|
520
|
-
result = []
|
521
|
-
result.push(*@files) if defined?(@files)
|
522
|
-
result.push(*@test_files) if defined?(@test_files)
|
523
|
-
result.push(*(add_bindir(@executables)))
|
524
|
-
result.push(*@extra_rdoc_files) if defined?(@extra_rdoc_files)
|
525
|
-
result.push(*@extensions) if defined?(@extensions)
|
526
|
-
result.uniq.compact
|
527
|
-
end
|
528
|
-
|
406
|
+
##
|
529
407
|
# Files in the Gem under one of the require_paths
|
408
|
+
|
530
409
|
def lib_files
|
531
410
|
@files.select do |file|
|
532
411
|
require_paths.any? do |path|
|
@@ -535,34 +414,25 @@ module Gem
|
|
535
414
|
end
|
536
415
|
end
|
537
416
|
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
else
|
549
|
-
@test_files = []
|
550
|
-
end
|
417
|
+
##
|
418
|
+
# True if this gem was loaded from disk
|
419
|
+
|
420
|
+
alias :loaded? :loaded
|
421
|
+
|
422
|
+
##
|
423
|
+
# True if this gem has files in test_files
|
424
|
+
|
425
|
+
def has_unit_tests?
|
426
|
+
not test_files.empty?
|
551
427
|
end
|
552
428
|
|
553
|
-
#
|
554
|
-
|
555
|
-
def loaded?; @loaded ? true : false ; end
|
556
|
-
def has_rdoc?; has_rdoc ? true : false ; end
|
557
|
-
def has_unit_tests?; not test_files.empty?; end
|
558
|
-
alias has_test_suite? has_unit_tests? # (deprecated)
|
559
|
-
|
560
|
-
# Constructors ---------------------------------------------------
|
429
|
+
alias has_test_suite? has_unit_tests? # :nodoc: deprecated
|
561
430
|
|
431
|
+
##
|
562
432
|
# Specification constructor. Assigns the default values to the
|
563
433
|
# attributes, adds this spec to the list of loaded specs (see
|
564
434
|
# Specification.list), and yields itself for further initialization.
|
565
|
-
|
435
|
+
|
566
436
|
def initialize
|
567
437
|
@new_platform = nil
|
568
438
|
assign_defaults
|
@@ -575,11 +445,13 @@ module Gem
|
|
575
445
|
@@gather.call(self) if @@gather
|
576
446
|
end
|
577
447
|
|
578
|
-
|
579
|
-
#
|
580
|
-
#
|
581
|
-
#
|
582
|
-
# each specification instance has its
|
448
|
+
##
|
449
|
+
# Each attribute has a default value (possibly nil). Here, we initialize
|
450
|
+
# all attributes to their default value. This is done through the
|
451
|
+
# accessor methods, so special behaviours will be honored. Furthermore,
|
452
|
+
# we take a _copy_ of the default so each specification instance has its
|
453
|
+
# own empty arrays, etc.
|
454
|
+
|
583
455
|
def assign_defaults
|
584
456
|
@@nil_attributes.each do |name|
|
585
457
|
instance_variable_set name, nil
|
@@ -598,13 +470,14 @@ module Gem
|
|
598
470
|
instance_variable_set :@new_platform, Gem::Platform::RUBY
|
599
471
|
end
|
600
472
|
|
601
|
-
|
602
|
-
#
|
603
|
-
#
|
604
|
-
# that and deals with
|
473
|
+
##
|
474
|
+
# Special loader for YAML files. When a Specification object is loaded
|
475
|
+
# from a YAML file, it bypasses the normal Ruby object initialization
|
476
|
+
# routine (#initialize). This method makes up for that and deals with
|
477
|
+
# gems of different ages.
|
605
478
|
#
|
606
479
|
# 'input' can be anything that YAML.load() accepts: String or IO.
|
607
|
-
|
480
|
+
|
608
481
|
def self.from_yaml(input)
|
609
482
|
input = normalize_yaml_input input
|
610
483
|
spec = YAML.load input
|
@@ -627,6 +500,9 @@ module Gem
|
|
627
500
|
spec
|
628
501
|
end
|
629
502
|
|
503
|
+
##
|
504
|
+
# Loads ruby format gemspec from +filename+
|
505
|
+
|
630
506
|
def self.load(filename)
|
631
507
|
gemspec = nil
|
632
508
|
fail "NESTED Specification.load calls not allowed!" if @@gather
|
@@ -638,22 +514,25 @@ module Gem
|
|
638
514
|
@@gather = nil
|
639
515
|
end
|
640
516
|
|
641
|
-
|
517
|
+
##
|
518
|
+
# Make sure the YAML specification is properly formatted with dashes
|
519
|
+
|
642
520
|
def self.normalize_yaml_input(input)
|
643
521
|
result = input.respond_to?(:read) ? input.read : input
|
644
522
|
result = "--- " + result unless result =~ /^--- /
|
645
523
|
result
|
646
524
|
end
|
647
525
|
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
#
|
526
|
+
##
|
527
|
+
# Sets the rubygems_version to the current RubyGems version
|
528
|
+
|
652
529
|
def mark_version
|
653
530
|
@rubygems_version = RubyGemsVersion
|
654
531
|
end
|
655
532
|
|
656
|
-
|
533
|
+
##
|
534
|
+
# Ignore unknown attributes while loading
|
535
|
+
|
657
536
|
def method_missing(sym, *a, &b) # :nodoc:
|
658
537
|
if @specification_version > CURRENT_SPECIFICATION_VERSION and
|
659
538
|
sym.to_s =~ /=$/ then
|
@@ -663,35 +542,39 @@ module Gem
|
|
663
542
|
end
|
664
543
|
end
|
665
544
|
|
666
|
-
|
667
|
-
#
|
668
|
-
#
|
545
|
+
##
|
546
|
+
# Adds a development dependency named +gem+ with +requirements+ to this
|
547
|
+
# Gem. For example:
|
669
548
|
#
|
670
|
-
#
|
671
|
-
# aren't activated when a gem is required.
|
549
|
+
# spec.add_development_dependency 'jabber4r', '> 0.1', '<= 0.5'
|
672
550
|
#
|
673
|
-
#
|
674
|
-
#
|
551
|
+
# Development dependencies aren't installed by default and aren't
|
552
|
+
# activated when a gem is required.
|
553
|
+
|
675
554
|
def add_development_dependency(gem, *requirements)
|
676
555
|
add_dependency_with_type(gem, :development, *requirements)
|
677
556
|
end
|
678
557
|
|
679
|
-
|
680
|
-
#
|
681
|
-
#
|
558
|
+
##
|
559
|
+
# Adds a runtime dependency named +gem+ with +requirements+ to this Gem.
|
560
|
+
# For example:
|
682
561
|
#
|
683
|
-
#
|
684
|
-
|
562
|
+
# spec.add_runtime_dependency 'jabber4r', '> 0.1', '<= 0.5'
|
563
|
+
|
685
564
|
def add_runtime_dependency(gem, *requirements)
|
686
565
|
add_dependency_with_type(gem, :runtime, *requirements)
|
687
566
|
end
|
688
567
|
|
568
|
+
##
|
569
|
+
# Adds a runtime dependency
|
570
|
+
|
689
571
|
alias add_dependency add_runtime_dependency
|
690
572
|
|
573
|
+
##
|
691
574
|
# Returns the full name (name-version) of this Gem. Platform information
|
692
|
-
# is included (name-version-platform) if it is specified
|
693
|
-
# default Ruby platform
|
694
|
-
|
575
|
+
# is included (name-version-platform) if it is specified and not the
|
576
|
+
# default Ruby platform.
|
577
|
+
|
695
578
|
def full_name
|
696
579
|
if platform == Gem::Platform::RUBY or platform.nil? then
|
697
580
|
"#{@name}-#{@version}"
|
@@ -700,9 +583,10 @@ module Gem
|
|
700
583
|
end
|
701
584
|
end
|
702
585
|
|
586
|
+
##
|
703
587
|
# Returns the full name (name-version) of this gemspec using the original
|
704
|
-
# platform.
|
705
|
-
|
588
|
+
# platform. For use with legacy gems.
|
589
|
+
|
706
590
|
def original_name # :nodoc:
|
707
591
|
if platform == Gem::Platform::RUBY or platform.nil? then
|
708
592
|
"#{@name}-#{@version}"
|
@@ -736,18 +620,16 @@ module Gem
|
|
736
620
|
File.expand_path path
|
737
621
|
end
|
738
622
|
|
739
|
-
|
740
|
-
# dependency
|
741
|
-
|
742
|
-
# dependency:: [Gem::Dependency] the dependency to check
|
743
|
-
# return:: [Boolean] true if dependency is met, otherwise false
|
744
|
-
#
|
623
|
+
##
|
624
|
+
# Checks if this specification meets the requirement of +dependency+.
|
625
|
+
|
745
626
|
def satisfies_requirement?(dependency)
|
746
627
|
return @name == dependency.name &&
|
747
628
|
dependency.version_requirements.satisfied_by?(@version)
|
748
629
|
end
|
749
630
|
|
750
|
-
|
631
|
+
##
|
632
|
+
# Returns an object you can use to sort specifications in #sort_by.
|
751
633
|
|
752
634
|
def sort_obj
|
753
635
|
[@name, @version.to_ints, @new_platform == Gem::Platform::RUBY ? -1 : 1]
|
@@ -757,19 +639,25 @@ module Gem
|
|
757
639
|
sort_obj <=> other.sort_obj
|
758
640
|
end
|
759
641
|
|
642
|
+
##
|
760
643
|
# Tests specs for equality (across all attributes).
|
644
|
+
|
761
645
|
def ==(other) # :nodoc:
|
762
646
|
self.class === other && same_attributes?(other)
|
763
647
|
end
|
764
648
|
|
765
649
|
alias eql? == # :nodoc:
|
766
650
|
|
651
|
+
##
|
652
|
+
# True if this gem has the same attributes as +other+.
|
653
|
+
|
767
654
|
def same_attributes?(other)
|
768
655
|
@@attributes.each do |name, default|
|
769
656
|
return false unless self.send(name) == other.send(name)
|
770
657
|
end
|
771
658
|
true
|
772
659
|
end
|
660
|
+
|
773
661
|
private :same_attributes?
|
774
662
|
|
775
663
|
def hash # :nodoc:
|
@@ -779,8 +667,6 @@ module Gem
|
|
779
667
|
}
|
780
668
|
end
|
781
669
|
|
782
|
-
# Export methods (YAML and Ruby code) ----------------------------
|
783
|
-
|
784
670
|
def to_yaml(opts = {}) # :nodoc:
|
785
671
|
mark_version
|
786
672
|
|
@@ -825,6 +711,8 @@ module Gem
|
|
825
711
|
def to_ruby
|
826
712
|
mark_version
|
827
713
|
result = []
|
714
|
+
result << "# -*- encoding: utf-8 -*-"
|
715
|
+
result << nil
|
828
716
|
result << "Gem::Specification.new do |s|"
|
829
717
|
|
830
718
|
result << " s.name = #{ruby_code name}"
|
@@ -861,7 +749,7 @@ module Gem
|
|
861
749
|
result << " s.specification_version = #{specification_version}"
|
862
750
|
result << nil
|
863
751
|
|
864
|
-
result << " if
|
752
|
+
result << " if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then"
|
865
753
|
|
866
754
|
unless dependencies.empty? then
|
867
755
|
dependencies.each do |dep|
|
@@ -895,16 +783,15 @@ module Gem
|
|
895
783
|
result.join "\n"
|
896
784
|
end
|
897
785
|
|
898
|
-
|
899
|
-
|
900
|
-
#
|
901
|
-
# does a very basic sanity check.
|
786
|
+
##
|
787
|
+
# Checks that the specification contains all required fields, and does a
|
788
|
+
# very basic sanity check.
|
902
789
|
#
|
903
|
-
# Raises InvalidSpecificationException if the spec does not pass
|
904
|
-
#
|
790
|
+
# Raises InvalidSpecificationException if the spec does not pass the
|
791
|
+
# checks..
|
792
|
+
|
905
793
|
def validate
|
906
794
|
extend Gem::UserInteraction
|
907
|
-
|
908
795
|
normalize
|
909
796
|
|
910
797
|
if rubygems_version != RubyGemsVersion then
|
@@ -959,13 +846,14 @@ module Gem
|
|
959
846
|
true
|
960
847
|
end
|
961
848
|
|
849
|
+
##
|
962
850
|
# Normalize the list of files so that:
|
963
851
|
# * All file lists have redundancies removed.
|
964
|
-
# * Files referenced in the extra_rdoc_files are included in the
|
965
|
-
#
|
852
|
+
# * Files referenced in the extra_rdoc_files are included in the package
|
853
|
+
# file list.
|
966
854
|
#
|
967
|
-
# Also, the summary and description are converted to a normal
|
968
|
-
|
855
|
+
# Also, the summary and description are converted to a normal format.
|
856
|
+
|
969
857
|
def normalize
|
970
858
|
if defined?(@extra_rdoc_files) and @extra_rdoc_files then
|
971
859
|
@extra_rdoc_files.uniq!
|
@@ -975,15 +863,12 @@ module Gem
|
|
975
863
|
@files.uniq! if @files
|
976
864
|
end
|
977
865
|
|
978
|
-
|
979
|
-
|
980
|
-
#
|
981
|
-
# gemspec. The list is structured with entries that conform to:
|
866
|
+
##
|
867
|
+
# Return a list of all gems that have a dependency on this gemspec. The
|
868
|
+
# list is structured with entries that conform to:
|
982
869
|
#
|
983
870
|
# [depending_gem, dependency, [list_of_gems_that_satisfy_dependency]]
|
984
|
-
|
985
|
-
# return:: [Array] [[dependent_gem, dependency, [list_of_satisfiers]]]
|
986
|
-
#
|
871
|
+
|
987
872
|
def dependent_gems
|
988
873
|
out = []
|
989
874
|
Gem.source_index.each do |name,gem|
|
@@ -1004,8 +889,6 @@ module Gem
|
|
1004
889
|
"#<Gem::Specification name=#{@name} version=#{@version}>"
|
1005
890
|
end
|
1006
891
|
|
1007
|
-
private
|
1008
|
-
|
1009
892
|
def add_dependency_with_type(dependency, type, *requirements)
|
1010
893
|
requirements = if requirements.empty? then
|
1011
894
|
Gem::Requirement.default
|
@@ -1022,6 +905,8 @@ module Gem
|
|
1022
905
|
dependencies << dependency
|
1023
906
|
end
|
1024
907
|
|
908
|
+
private :add_dependency_with_type
|
909
|
+
|
1025
910
|
def find_all_satisfiers(dep)
|
1026
911
|
Gem.source_index.each do |name,gem|
|
1027
912
|
if(gem.satisfies_requirement?(dep)) then
|
@@ -1030,8 +915,12 @@ module Gem
|
|
1030
915
|
end
|
1031
916
|
end
|
1032
917
|
|
1033
|
-
|
1034
|
-
|
918
|
+
private :find_all_satisfiers
|
919
|
+
|
920
|
+
##
|
921
|
+
# Return a string containing a Ruby code representation of the given
|
922
|
+
# object.
|
923
|
+
|
1035
924
|
def ruby_code(obj)
|
1036
925
|
case obj
|
1037
926
|
when String then '%q{' + obj + '}'
|
@@ -1046,6 +935,326 @@ module Gem
|
|
1046
935
|
else raise Exception, "ruby_code case not handled: #{obj.class}"
|
1047
936
|
end
|
1048
937
|
end
|
938
|
+
|
939
|
+
private :ruby_code
|
940
|
+
|
941
|
+
# :section: Required gemspec attributes
|
942
|
+
|
943
|
+
##
|
944
|
+
# The version of RubyGems used to create this gem
|
945
|
+
|
946
|
+
required_attribute :rubygems_version, Gem::RubyGemsVersion
|
947
|
+
|
948
|
+
##
|
949
|
+
# The Gem::Specification version of this gemspec
|
950
|
+
|
951
|
+
required_attribute :specification_version, CURRENT_SPECIFICATION_VERSION
|
952
|
+
|
953
|
+
##
|
954
|
+
# This gem's name
|
955
|
+
|
956
|
+
required_attribute :name
|
957
|
+
|
958
|
+
##
|
959
|
+
# This gem's version
|
960
|
+
|
961
|
+
required_attribute :version
|
962
|
+
|
963
|
+
##
|
964
|
+
# The date this gem was created
|
965
|
+
|
966
|
+
required_attribute :date, TODAY
|
967
|
+
|
968
|
+
##
|
969
|
+
# A short summary of this gem's description. Displayed in `gem list -d`.
|
970
|
+
|
971
|
+
required_attribute :summary
|
972
|
+
|
973
|
+
##
|
974
|
+
# Paths in the gem to add to $LOAD_PATH when this gem is activated
|
975
|
+
|
976
|
+
required_attribute :require_paths, ['lib']
|
977
|
+
|
978
|
+
# :section: Optional gemspec attributes
|
979
|
+
|
980
|
+
##
|
981
|
+
# A contact email for this gem
|
982
|
+
|
983
|
+
attribute :email
|
984
|
+
|
985
|
+
##
|
986
|
+
# The URL of this gem's home page
|
987
|
+
|
988
|
+
attribute :homepage
|
989
|
+
|
990
|
+
##
|
991
|
+
# The rubyforge project this gem lives under. i.e. RubyGems'
|
992
|
+
# rubyforge_project is "rubygems".
|
993
|
+
|
994
|
+
attribute :rubyforge_project
|
995
|
+
|
996
|
+
##
|
997
|
+
# A long description of this gem
|
998
|
+
|
999
|
+
attribute :description
|
1000
|
+
|
1001
|
+
##
|
1002
|
+
# Autorequire was used by old RubyGems to automatically require a file.
|
1003
|
+
# It no longer is supported.
|
1004
|
+
|
1005
|
+
attribute :autorequire
|
1006
|
+
|
1007
|
+
##
|
1008
|
+
# The default executable for this gem.
|
1009
|
+
|
1010
|
+
attribute :default_executable
|
1011
|
+
|
1012
|
+
##
|
1013
|
+
# The path in the gem for executable scripts
|
1014
|
+
|
1015
|
+
attribute :bindir, 'bin'
|
1016
|
+
|
1017
|
+
##
|
1018
|
+
# True if this gem is RDoc-compliant
|
1019
|
+
|
1020
|
+
attribute :has_rdoc, false
|
1021
|
+
|
1022
|
+
##
|
1023
|
+
# True if this gem supports RDoc
|
1024
|
+
|
1025
|
+
alias :has_rdoc? :has_rdoc
|
1026
|
+
|
1027
|
+
##
|
1028
|
+
# The ruby of version required by this gem
|
1029
|
+
|
1030
|
+
attribute :required_ruby_version, Gem::Requirement.default
|
1031
|
+
|
1032
|
+
##
|
1033
|
+
# The RubyGems version required by this gem
|
1034
|
+
|
1035
|
+
attribute :required_rubygems_version, Gem::Requirement.default
|
1036
|
+
|
1037
|
+
##
|
1038
|
+
# The platform this gem runs on. See Gem::Platform for details.
|
1039
|
+
|
1040
|
+
attribute :platform, Gem::Platform::RUBY
|
1041
|
+
|
1042
|
+
##
|
1043
|
+
# The key used to sign this gem. See Gem::Security for details.
|
1044
|
+
|
1045
|
+
attribute :signing_key, nil
|
1046
|
+
|
1047
|
+
##
|
1048
|
+
# The certificate chain used to sign this gem. See Gem::Security for
|
1049
|
+
# details.
|
1050
|
+
|
1051
|
+
attribute :cert_chain, []
|
1052
|
+
|
1053
|
+
##
|
1054
|
+
# A message that gets displayed after the gem is installed
|
1055
|
+
|
1056
|
+
attribute :post_install_message, nil
|
1057
|
+
|
1058
|
+
##
|
1059
|
+
# The list of authors who wrote this gem
|
1060
|
+
|
1061
|
+
array_attribute :authors
|
1062
|
+
|
1063
|
+
##
|
1064
|
+
# Files included in this gem
|
1065
|
+
|
1066
|
+
array_attribute :files
|
1067
|
+
|
1068
|
+
##
|
1069
|
+
# Test files included in this gem
|
1070
|
+
|
1071
|
+
array_attribute :test_files
|
1072
|
+
|
1073
|
+
##
|
1074
|
+
# An ARGV-style array of options to RDoc
|
1075
|
+
|
1076
|
+
array_attribute :rdoc_options
|
1077
|
+
|
1078
|
+
##
|
1079
|
+
# Extra files to add to RDoc
|
1080
|
+
|
1081
|
+
array_attribute :extra_rdoc_files
|
1082
|
+
|
1083
|
+
##
|
1084
|
+
# Executables included in the gem
|
1085
|
+
|
1086
|
+
array_attribute :executables
|
1087
|
+
|
1088
|
+
##
|
1089
|
+
# Extensions to build when installing the gem. See
|
1090
|
+
# Gem::Installer#build_extensions for valid values.
|
1091
|
+
|
1092
|
+
array_attribute :extensions
|
1093
|
+
|
1094
|
+
##
|
1095
|
+
# An array or things required by this gem. Not used by anything
|
1096
|
+
# presently.
|
1097
|
+
|
1098
|
+
array_attribute :requirements
|
1099
|
+
|
1100
|
+
##
|
1101
|
+
# A list of Gem::Dependency objects this gem depends on. Only appendable.
|
1102
|
+
|
1103
|
+
array_attribute :dependencies
|
1104
|
+
|
1105
|
+
read_only :dependencies
|
1106
|
+
|
1107
|
+
# :section: Aliased gemspec attributes
|
1108
|
+
|
1109
|
+
##
|
1110
|
+
# Singular accessor for executables
|
1111
|
+
|
1112
|
+
attribute_alias_singular :executable, :executables
|
1113
|
+
|
1114
|
+
##
|
1115
|
+
# Singular accessor for authors
|
1116
|
+
|
1117
|
+
attribute_alias_singular :author, :authors
|
1118
|
+
|
1119
|
+
##
|
1120
|
+
# Singular accessor for require_paths
|
1121
|
+
|
1122
|
+
attribute_alias_singular :require_path, :require_paths
|
1123
|
+
|
1124
|
+
##
|
1125
|
+
# Singular accessor for test_files
|
1126
|
+
|
1127
|
+
attribute_alias_singular :test_file, :test_files
|
1128
|
+
|
1129
|
+
overwrite_accessor :version= do |version|
|
1130
|
+
@version = Version.create(version)
|
1131
|
+
end
|
1132
|
+
|
1133
|
+
overwrite_accessor :platform do
|
1134
|
+
@new_platform
|
1135
|
+
end
|
1136
|
+
|
1137
|
+
overwrite_accessor :platform= do |platform|
|
1138
|
+
if @original_platform.nil? or
|
1139
|
+
@original_platform == Gem::Platform::RUBY then
|
1140
|
+
@original_platform = platform
|
1141
|
+
end
|
1142
|
+
|
1143
|
+
case platform
|
1144
|
+
when Gem::Platform::CURRENT then
|
1145
|
+
@new_platform = Gem::Platform.local
|
1146
|
+
@original_platform = @new_platform.to_s
|
1147
|
+
|
1148
|
+
when Gem::Platform then
|
1149
|
+
@new_platform = platform
|
1150
|
+
|
1151
|
+
# legacy constants
|
1152
|
+
when nil, Gem::Platform::RUBY then
|
1153
|
+
@new_platform = Gem::Platform::RUBY
|
1154
|
+
when 'mswin32' then # was Gem::Platform::WIN32
|
1155
|
+
@new_platform = Gem::Platform.new 'x86-mswin32'
|
1156
|
+
when 'i586-linux' then # was Gem::Platform::LINUX_586
|
1157
|
+
@new_platform = Gem::Platform.new 'x86-linux'
|
1158
|
+
when 'powerpc-darwin' then # was Gem::Platform::DARWIN
|
1159
|
+
@new_platform = Gem::Platform.new 'ppc-darwin'
|
1160
|
+
else
|
1161
|
+
@new_platform = Gem::Platform.new platform
|
1162
|
+
end
|
1163
|
+
|
1164
|
+
@platform = @new_platform.to_s
|
1165
|
+
|
1166
|
+
@new_platform
|
1167
|
+
end
|
1168
|
+
|
1169
|
+
overwrite_accessor :required_ruby_version= do |value|
|
1170
|
+
@required_ruby_version = Gem::Requirement.create(value)
|
1171
|
+
end
|
1172
|
+
|
1173
|
+
overwrite_accessor :required_rubygems_version= do |value|
|
1174
|
+
@required_rubygems_version = Gem::Requirement.create(value)
|
1175
|
+
end
|
1176
|
+
|
1177
|
+
overwrite_accessor :date= do |date|
|
1178
|
+
# We want to end up with a Time object with one-day resolution.
|
1179
|
+
# This is the cleanest, most-readable, faster-than-using-Date
|
1180
|
+
# way to do it.
|
1181
|
+
case date
|
1182
|
+
when String then
|
1183
|
+
@date = if /\A(\d{4})-(\d{2})-(\d{2})\Z/ =~ date then
|
1184
|
+
Time.local($1.to_i, $2.to_i, $3.to_i)
|
1185
|
+
else
|
1186
|
+
require 'time'
|
1187
|
+
Time.parse date
|
1188
|
+
end
|
1189
|
+
when Time then
|
1190
|
+
@date = Time.local(date.year, date.month, date.day)
|
1191
|
+
when Date then
|
1192
|
+
@date = Time.local(date.year, date.month, date.day)
|
1193
|
+
else
|
1194
|
+
@date = TODAY
|
1195
|
+
end
|
1196
|
+
end
|
1197
|
+
|
1198
|
+
overwrite_accessor :date do
|
1199
|
+
self.date = nil if @date.nil? # HACK Sets the default value for date
|
1200
|
+
@date
|
1201
|
+
end
|
1202
|
+
|
1203
|
+
overwrite_accessor :summary= do |str|
|
1204
|
+
@summary = if str then
|
1205
|
+
str.strip.
|
1206
|
+
gsub(/(\w-)\n[ \t]*(\w)/, '\1\2').
|
1207
|
+
gsub(/\n[ \t]*/, " ")
|
1208
|
+
end
|
1209
|
+
end
|
1210
|
+
|
1211
|
+
overwrite_accessor :description= do |str|
|
1212
|
+
@description = if str then
|
1213
|
+
str.strip.
|
1214
|
+
gsub(/(\w-)\n[ \t]*(\w)/, '\1\2').
|
1215
|
+
gsub(/\n[ \t]*/, " ")
|
1216
|
+
end
|
1217
|
+
end
|
1218
|
+
|
1219
|
+
overwrite_accessor :default_executable do
|
1220
|
+
begin
|
1221
|
+
if defined?(@default_executable) and @default_executable
|
1222
|
+
result = @default_executable
|
1223
|
+
elsif @executables and @executables.size == 1
|
1224
|
+
result = Array(@executables).first
|
1225
|
+
else
|
1226
|
+
result = nil
|
1227
|
+
end
|
1228
|
+
result
|
1229
|
+
rescue
|
1230
|
+
nil
|
1231
|
+
end
|
1232
|
+
end
|
1233
|
+
|
1234
|
+
overwrite_accessor :test_files do
|
1235
|
+
# Handle the possibility that we have @test_suite_file but not
|
1236
|
+
# @test_files. This will happen when an old gem is loaded via
|
1237
|
+
# YAML.
|
1238
|
+
if defined? @test_suite_file then
|
1239
|
+
@test_files = [@test_suite_file].flatten
|
1240
|
+
@test_suite_file = nil
|
1241
|
+
end
|
1242
|
+
if defined?(@test_files) and @test_files then
|
1243
|
+
@test_files
|
1244
|
+
else
|
1245
|
+
@test_files = []
|
1246
|
+
end
|
1247
|
+
end
|
1248
|
+
|
1249
|
+
overwrite_accessor :files do
|
1250
|
+
result = []
|
1251
|
+
result.push(*@files) if defined?(@files)
|
1252
|
+
result.push(*@test_files) if defined?(@test_files)
|
1253
|
+
result.push(*(add_bindir(@executables)))
|
1254
|
+
result.push(*@extra_rdoc_files) if defined?(@extra_rdoc_files)
|
1255
|
+
result.push(*@extensions) if defined?(@extensions)
|
1256
|
+
result.uniq.compact
|
1257
|
+
end
|
1049
1258
|
|
1050
1259
|
end
|
1051
1260
|
|