gauntlet 1.1.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/.gemtest +0 -0
- data/History.txt +21 -0
- data/Rakefile +8 -0
- data/bin/gauntlet +6 -5
- data/lib/gauntlet.rb +125 -160
- data/lib/gauntlet_grep.rb +5 -6
- metadata +61 -10
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/.gemtest
ADDED
File without changes
|
data/History.txt
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
=== 2.0.0 / 2011-02-18
|
2
|
+
|
3
|
+
* 1 major enhancement:
|
4
|
+
|
5
|
+
* Dropped dependencies_of, dependent_upon, gems_by_name, find_stupid_gems.
|
6
|
+
|
7
|
+
* 4 minor enhancements:
|
8
|
+
|
9
|
+
* Added support for new rubygem server changes
|
10
|
+
* Separate downloads from conversion to .tar.gz
|
11
|
+
* Stripped down gauntlet_grep to pass all args through to grep
|
12
|
+
* Switched to net-http-persistent to clean up and speed up downloads.
|
13
|
+
|
14
|
+
* 5 bug fixes:
|
15
|
+
|
16
|
+
* 1.9 fix for shadowed variables
|
17
|
+
* Add TERM and KILL handlers that shutdown nicely
|
18
|
+
* Fixes for stupidly named gems (--1)
|
19
|
+
* Handle SocketError and 404s more elegantly
|
20
|
+
* Switch to SpecFetcher for latest RubyGems
|
21
|
+
|
1
22
|
=== 1.1.0 / 2009-06-23
|
2
23
|
|
3
24
|
* 6 minor enhancements:
|
data/Rakefile
CHANGED
@@ -4,11 +4,19 @@ require 'rubygems'
|
|
4
4
|
require 'hoe'
|
5
5
|
|
6
6
|
Hoe.plugin :seattlerb
|
7
|
+
Hoe.plugin :isolate
|
7
8
|
|
8
9
|
Hoe.spec 'gauntlet' do
|
9
10
|
developer 'Ryan Davis', 'ryand-ruby@zenspider.com'
|
10
11
|
|
11
12
|
self.rubyforge_name = 'seattlerb'
|
13
|
+
|
14
|
+
extra_deps << ["net-http-persistent", "~> 1.4.1"]
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "update your gauntlet gems"
|
18
|
+
task :update do
|
19
|
+
sh "ruby -I lib ./bin/gauntlet update"
|
12
20
|
end
|
13
21
|
|
14
22
|
# vim: syntax=ruby
|
data/bin/gauntlet
CHANGED
@@ -18,6 +18,7 @@ when "help" then
|
|
18
18
|
puts " cmds:"
|
19
19
|
puts " help - show help"
|
20
20
|
puts " list - list known gauntlet data for reports"
|
21
|
+
puts " update - update the gems, but don't run anything"
|
21
22
|
puts " report <name> - show a report on <name>, requires specific data format"
|
22
23
|
puts " <name> - run the gauntlet for named plugin"
|
23
24
|
Gem.find_files('gauntlet_*.rb').each do |path|
|
@@ -51,7 +52,7 @@ when "report" then
|
|
51
52
|
good += 1
|
52
53
|
next
|
53
54
|
end
|
54
|
-
files.each do |
|
55
|
+
files.each do |dir, result|
|
55
56
|
case result
|
56
57
|
when true then
|
57
58
|
good += 1
|
@@ -62,12 +63,12 @@ when "report" then
|
|
62
63
|
when String then
|
63
64
|
bad += 1
|
64
65
|
|
65
|
-
names[File.basename(
|
66
|
+
names[File.basename(dir)] += 1
|
66
67
|
|
67
68
|
loop do
|
68
|
-
|
69
|
-
break if
|
70
|
-
|
69
|
+
dir = File.dirname dir
|
70
|
+
break if dir.empty? or dir == "."
|
71
|
+
dirs[dir] += 1
|
71
72
|
end
|
72
73
|
end
|
73
74
|
end
|
data/lib/gauntlet.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
require 'rubygems
|
1
|
+
require 'rubygems'
|
2
2
|
require 'thread'
|
3
3
|
require 'yaml'
|
4
|
+
require 'net/http/persistent'
|
4
5
|
|
5
6
|
$u ||= false
|
6
7
|
$f ||= false
|
@@ -9,36 +10,18 @@ $F ||= false
|
|
9
10
|
Thread.abort_on_exception = true
|
10
11
|
|
11
12
|
class Gauntlet
|
12
|
-
VERSION = '
|
13
|
-
|
14
|
-
|
15
|
-
GEMDIR = File.expand_path "~/.gauntlet"
|
13
|
+
VERSION = '2.0.0'
|
14
|
+
GEMURL = URI.parse 'http://gems.rubyforge.org'
|
15
|
+
GEMDIR = File.expand_path "~/.gauntlet"
|
16
16
|
DATADIR = File.expand_path "~/.gauntlet/data"
|
17
17
|
|
18
|
-
# stupid dups usually because of "dash" renames
|
19
|
-
STUPID_GEMS = %w(ajax-scaffold-generator
|
20
|
-
extract_curves
|
21
|
-
flickr-fu
|
22
|
-
hpricot-scrub
|
23
|
-
html_me
|
24
|
-
merb-builder
|
25
|
-
merb-jquery
|
26
|
-
merb-parts
|
27
|
-
merb_exceptions
|
28
|
-
merb_helpers
|
29
|
-
merb_param_protection
|
30
|
-
model_graph
|
31
|
-
not_naughty
|
32
|
-
rfeedparser-ictv
|
33
|
-
spec-converter
|
34
|
-
spec_unit)
|
35
|
-
|
36
18
|
attr_accessor :dirty, :data_file, :data
|
37
19
|
|
38
20
|
def initialize
|
39
21
|
name = self.class.name.downcase.sub(/gauntlet/, '')
|
40
22
|
self.data_file = "#{DATADIR}/#{name}-data.yml"
|
41
23
|
self.dirty = false
|
24
|
+
@cache = nil
|
42
25
|
end
|
43
26
|
|
44
27
|
def initialize_dir
|
@@ -69,48 +52,19 @@ class Gauntlet
|
|
69
52
|
end
|
70
53
|
|
71
54
|
def latest_gems
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
def dependent_upon name
|
87
|
-
latest_gems.find_all { |gem|
|
88
|
-
gem.dependencies.any? { |dep| dep.name == name }
|
89
|
-
}
|
90
|
-
end
|
91
|
-
|
92
|
-
def find_stupid_gems
|
93
|
-
gems = Hash.new { |h,k| h[k] = [] }
|
94
|
-
stupid = []
|
95
|
-
latest = {}
|
96
|
-
|
97
|
-
latest_gems.each do |spec|
|
98
|
-
name = spec.name.gsub(/-/, '_')
|
99
|
-
next unless name =~ /_/
|
100
|
-
gems[name] << spec
|
101
|
-
end
|
102
|
-
|
103
|
-
gems.reject! { |k,v| v.size == 1 || v.map { |s| s.name }.uniq.size == 1 }
|
104
|
-
|
105
|
-
gems.each do |k,v|
|
106
|
-
sorted = v.sort_by { |spec| spec.version }
|
107
|
-
latest[sorted.last.name] = true
|
108
|
-
sorted.each do |spec|
|
109
|
-
stupid << spec.name unless latest[spec.name]
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
stupid.uniq
|
55
|
+
Gem::SpecFetcher.new.list.map { |source_uri, gems|
|
56
|
+
base_url = source_uri.to_s
|
57
|
+
gems.map { |(name, version, platform)|
|
58
|
+
gem_name = case platform
|
59
|
+
when Gem::Platform::RUBY then
|
60
|
+
[name, version].join '-'
|
61
|
+
else
|
62
|
+
[name, version, platform].join '-'
|
63
|
+
end
|
64
|
+
|
65
|
+
[gem_name, File.join(base_url, "/gems/#{gem_name}.gem")]
|
66
|
+
}
|
67
|
+
}.flatten(1)
|
114
68
|
end
|
115
69
|
|
116
70
|
def update_gem_tarballs
|
@@ -124,7 +78,7 @@ class Gauntlet
|
|
124
78
|
gems = Dir["*.gem"]
|
125
79
|
tgzs = Dir["*.tgz"]
|
126
80
|
|
127
|
-
old = tgzs - latest.map { |
|
81
|
+
old = tgzs - latest.map { |(full_name, url)| "#{full_name}.tgz" }
|
128
82
|
unless old.empty? then
|
129
83
|
warn "deleting #{old.size} tgzs"
|
130
84
|
old.each do |tgz|
|
@@ -132,54 +86,106 @@ class Gauntlet
|
|
132
86
|
end
|
133
87
|
end
|
134
88
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
warn "fetching #{tasks.size} gems"
|
141
|
-
|
142
|
-
threads = []
|
143
|
-
10.times do
|
144
|
-
threads << Thread.new do
|
145
|
-
fetcher = Gem::RemoteFetcher.new nil # fuck proxies
|
146
|
-
until tasks.empty? do
|
147
|
-
spec = tasks.shift
|
148
|
-
full_name = spec.full_name
|
149
|
-
tgz_name = "#{full_name}.tgz"
|
150
|
-
gem_name = "#{full_name}.gem"
|
151
|
-
|
152
|
-
unless gems.include? gem_name then
|
153
|
-
begin
|
154
|
-
warn "downloading #{full_name}"
|
155
|
-
fetcher.download(spec, GEMURL, Dir.pwd)
|
156
|
-
rescue Gem::RemoteFetcher::FetchError => e
|
157
|
-
warn " failed #{full_name}: #{e.message}"
|
158
|
-
next
|
159
|
-
end
|
160
|
-
end
|
89
|
+
conversions = Queue.new
|
90
|
+
gem_names = gems.map { |gem| File.basename gem, '.gem' }
|
91
|
+
tgz_names = tgzs.map { |tgz| File.basename tgz, '.tgz' }
|
92
|
+
to_convert = gem_names - tgz_names
|
161
93
|
|
162
|
-
|
94
|
+
seen_tgzs = Hash[*tgzs.map { |name| [name, true] }.flatten]
|
163
95
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
96
|
+
warn "adding #{to_convert.size} unconverted gems" unless to_convert.empty?
|
97
|
+
|
98
|
+
conversions.push to_convert.shift until to_convert.empty? # LAME
|
99
|
+
|
100
|
+
downloads = Queue.new
|
101
|
+
latest = latest.sort_by { |(full_name, url)| full_name.downcase }
|
102
|
+
latest.reject! { |(full_name, url)| seen_tgzs["#{full_name}.tgz"] }
|
103
|
+
|
104
|
+
downloads.push(latest.shift) until latest.empty? # LAME
|
105
|
+
|
106
|
+
converter = Thread.start do
|
107
|
+
while payload = conversions.shift do
|
108
|
+
full_name, _ = payload
|
109
|
+
tgz_name = "#{full_name}.tgz"
|
110
|
+
gem_name = "#{full_name}.gem"
|
111
|
+
|
112
|
+
warn " converting #{gem_name} to tarball"
|
168
113
|
|
169
|
-
|
114
|
+
unless File.directory? full_name then
|
115
|
+
system "gem unpack cache/#{gem_name} &> /dev/null"
|
116
|
+
system "gem spec -l cache/#{gem_name} > #{full_name}/gemspec"
|
170
117
|
end
|
118
|
+
|
119
|
+
system ["chmod -R u+rwX #{full_name}",
|
120
|
+
"tar zmcf #{tgz_name} -- #{full_name}",
|
121
|
+
"rm -rf -- #{full_name} #{gem_name}"].join(" && ")
|
171
122
|
end
|
172
123
|
end
|
173
124
|
|
174
|
-
|
175
|
-
|
125
|
+
warn "fetching #{downloads.size} gems"
|
126
|
+
|
127
|
+
http = Net::HTTP::Persistent.new
|
128
|
+
|
129
|
+
workers downloads do |full_name, url|
|
130
|
+
gem_name = "#{full_name}.gem"
|
131
|
+
|
132
|
+
unless gems.include? gem_name then
|
133
|
+
limit = 3
|
134
|
+
begin
|
135
|
+
warn "downloading #{full_name}"
|
136
|
+
while limit > 0 do
|
137
|
+
http.request URI.parse(url) do |response|
|
138
|
+
case response
|
139
|
+
when Net::HTTPSuccess
|
140
|
+
File.open gem_name, "wb" do |f|
|
141
|
+
response.read_body do |chunk|
|
142
|
+
f.write chunk
|
143
|
+
end
|
144
|
+
end
|
145
|
+
limit = 0 # kinda lame.
|
146
|
+
when Net::HTTPRedirection
|
147
|
+
url = response['location']
|
148
|
+
limit -= 1
|
149
|
+
else
|
150
|
+
warn " #{full_name} got #{response.code}. skipping."
|
151
|
+
limit = 0
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
rescue SocketError, Net::HTTP::Persistent::Error => e
|
156
|
+
warn " #{full_name} raised #{e.message}. skipping."
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
conversions.push full_name
|
176
161
|
end
|
162
|
+
|
163
|
+
conversions.push nil
|
164
|
+
|
165
|
+
converter.join
|
177
166
|
end
|
167
|
+
|
178
168
|
rescue Interrupt
|
179
169
|
warn "user cancelled... quitting"
|
180
170
|
exit 1
|
181
171
|
end
|
182
172
|
|
173
|
+
def workers tasks, count = 10
|
174
|
+
threads = []
|
175
|
+
count.times do
|
176
|
+
threads << Thread.new do
|
177
|
+
until tasks.empty? do
|
178
|
+
task = tasks.shift
|
179
|
+
yield task
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
threads.each do |thread|
|
185
|
+
thread.join
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
183
189
|
def each_gem filter = nil
|
184
190
|
filter ||= /^[\w-]+-\d+(\.\d+)*\.tgz$/
|
185
191
|
in_gem_dir do
|
@@ -203,7 +209,7 @@ class Gauntlet
|
|
203
209
|
end
|
204
210
|
end
|
205
211
|
ensure
|
206
|
-
system "rm -rf #{process_dir}"
|
212
|
+
system "rm -rf -- #{process_dir}"
|
207
213
|
end
|
208
214
|
end
|
209
215
|
end
|
@@ -262,6 +268,13 @@ class Gauntlet
|
|
262
268
|
self.data.delete outdated
|
263
269
|
end
|
264
270
|
|
271
|
+
%w[TERM KILL].each do |signal|
|
272
|
+
trap signal do
|
273
|
+
shutdown
|
274
|
+
exit
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
265
278
|
each_gem filter do |name|
|
266
279
|
next if should_skip? name
|
267
280
|
with_gem name do
|
@@ -275,6 +288,10 @@ class Gauntlet
|
|
275
288
|
rescue Interrupt
|
276
289
|
warn "user cancelled. quitting"
|
277
290
|
ensure
|
291
|
+
shutdown
|
292
|
+
end
|
293
|
+
|
294
|
+
def shutdown
|
278
295
|
save_yaml data_file, data if dirty
|
279
296
|
end
|
280
297
|
end
|
@@ -282,68 +299,15 @@ end
|
|
282
299
|
############################################################
|
283
300
|
# Extensions and Overrides
|
284
301
|
|
285
|
-
|
286
|
-
|
287
|
-
alias :old_download :download
|
288
|
-
def download(spec, source_uri, install_dir = Gem.dir)
|
289
|
-
if File.writable?(install_dir)
|
290
|
-
cache_dir = File.join install_dir, 'cache'
|
291
|
-
else
|
292
|
-
cache_dir = File.join(Gem.user_dir, 'cache')
|
293
|
-
end
|
294
|
-
|
295
|
-
gem_file_name = "#{spec.full_name}.gem"
|
296
|
-
local_gem_path = File.join cache_dir, gem_file_name
|
297
|
-
|
298
|
-
FileUtils.mkdir_p cache_dir rescue nil unless File.exist? cache_dir
|
302
|
+
class Gem::SpecFetcher
|
303
|
+
attr_writer :fetcher
|
299
304
|
|
300
|
-
|
301
|
-
scheme = source_uri.scheme
|
305
|
+
alias :old_initialize :initialize
|
302
306
|
|
303
|
-
|
304
|
-
|
307
|
+
def initialize fetcher = Gem::RemoteFetcher.fetcher
|
308
|
+
old_initialize
|
305
309
|
|
306
|
-
|
307
|
-
when 'http', 'https' then
|
308
|
-
unless File.exist? local_gem_path then
|
309
|
-
begin
|
310
|
-
say "Downloading gem #{gem_file_name}" if
|
311
|
-
Gem.configuration.really_verbose
|
312
|
-
|
313
|
-
remote_gem_path = source_uri + "gems/#{gem_file_name}"
|
314
|
-
|
315
|
-
gem = self.fetch_path remote_gem_path
|
316
|
-
rescue Gem::RemoteFetcher::FetchError
|
317
|
-
raise if spec.original_platform == spec.platform
|
318
|
-
|
319
|
-
alternate_name = "#{spec.original_name}.gem"
|
320
|
-
|
321
|
-
say "Failed, downloading gem #{alternate_name}" if
|
322
|
-
Gem.configuration.really_verbose
|
323
|
-
|
324
|
-
remote_gem_path = source_uri + "gems/#{alternate_name}"
|
325
|
-
|
326
|
-
gem = self.fetch_path remote_gem_path
|
327
|
-
end
|
328
|
-
|
329
|
-
File.open local_gem_path, 'wb' do |fp|
|
330
|
-
fp.write gem
|
331
|
-
end
|
332
|
-
end
|
333
|
-
when nil, 'file' then # TODO test for local overriding cache
|
334
|
-
begin
|
335
|
-
FileUtils.cp source_uri.to_s, local_gem_path
|
336
|
-
rescue Errno::EACCES
|
337
|
-
local_gem_path = source_uri.to_s
|
338
|
-
end
|
339
|
-
|
340
|
-
say "Using local gem #{local_gem_path}" if
|
341
|
-
Gem.configuration.really_verbose
|
342
|
-
else
|
343
|
-
raise Gem::InstallError, "unsupported URI scheme #{source_uri.scheme}"
|
344
|
-
end
|
345
|
-
|
346
|
-
local_gem_path
|
310
|
+
self.fetcher = fetcher
|
347
311
|
end
|
348
312
|
end
|
349
313
|
|
@@ -369,3 +333,4 @@ class Array
|
|
369
333
|
return Math.sqrt(self.sample_variance)
|
370
334
|
end
|
371
335
|
end
|
336
|
+
|
data/lib/gauntlet_grep.rb
CHANGED
@@ -6,18 +6,17 @@ require 'rubygems'
|
|
6
6
|
require 'gauntlet'
|
7
7
|
|
8
8
|
class GrepGauntlet < Gauntlet
|
9
|
-
attr_accessor :
|
9
|
+
attr_accessor :args
|
10
10
|
|
11
|
-
def initialize
|
12
|
-
self.
|
11
|
+
def initialize args
|
12
|
+
self.args = args
|
13
13
|
end
|
14
14
|
|
15
15
|
def run name
|
16
|
-
system "
|
16
|
+
system "grep", *args
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
flogger = GrepGauntlet.new pattern
|
20
|
+
flogger = GrepGauntlet.new ARGV
|
22
21
|
flogger.run_the_gauntlet
|
23
22
|
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gauntlet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 15
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 2.0.0
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Ryan Davis
|
@@ -30,19 +36,57 @@ cert_chain:
|
|
30
36
|
FBHgymkyj/AOSqKRIpXPhjC6
|
31
37
|
-----END CERTIFICATE-----
|
32
38
|
|
33
|
-
date:
|
39
|
+
date: 2011-02-18 00:00:00 -08:00
|
34
40
|
default_executable:
|
35
41
|
dependencies:
|
36
42
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
43
|
+
name: net-http-persistent
|
44
|
+
prerelease: false
|
45
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
46
|
+
none: false
|
47
|
+
requirements:
|
48
|
+
- - ~>
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
hash: 5
|
51
|
+
segments:
|
52
|
+
- 1
|
53
|
+
- 4
|
54
|
+
- 1
|
55
|
+
version: 1.4.1
|
56
|
+
type: :runtime
|
57
|
+
version_requirements: *id001
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: minitest
|
60
|
+
prerelease: false
|
61
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
hash: 11
|
67
|
+
segments:
|
68
|
+
- 2
|
69
|
+
- 0
|
70
|
+
- 2
|
71
|
+
version: 2.0.2
|
38
72
|
type: :development
|
39
|
-
|
40
|
-
|
73
|
+
version_requirements: *id002
|
74
|
+
- !ruby/object:Gem::Dependency
|
75
|
+
name: hoe
|
76
|
+
prerelease: false
|
77
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
41
79
|
requirements:
|
42
80
|
- - ">="
|
43
81
|
- !ruby/object:Gem::Version
|
44
|
-
|
45
|
-
|
82
|
+
hash: 41
|
83
|
+
segments:
|
84
|
+
- 2
|
85
|
+
- 9
|
86
|
+
- 1
|
87
|
+
version: 2.9.1
|
88
|
+
type: :development
|
89
|
+
version_requirements: *id003
|
46
90
|
description: |-
|
47
91
|
Gauntlet is a pluggable means of running code against all the latest
|
48
92
|
gems and storing off the data.
|
@@ -65,6 +109,7 @@ files:
|
|
65
109
|
- lib/gauntlet.rb
|
66
110
|
- lib/gauntlet_grep.rb
|
67
111
|
- test/test_gauntlet.rb
|
112
|
+
- .gemtest
|
68
113
|
has_rdoc: true
|
69
114
|
homepage: http://rubyforge.org/projects/seattlerb
|
70
115
|
licenses: []
|
@@ -76,21 +121,27 @@ rdoc_options:
|
|
76
121
|
require_paths:
|
77
122
|
- lib
|
78
123
|
required_ruby_version: !ruby/object:Gem::Requirement
|
124
|
+
none: false
|
79
125
|
requirements:
|
80
126
|
- - ">="
|
81
127
|
- !ruby/object:Gem::Version
|
128
|
+
hash: 3
|
129
|
+
segments:
|
130
|
+
- 0
|
82
131
|
version: "0"
|
83
|
-
version:
|
84
132
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
|
+
none: false
|
85
134
|
requirements:
|
86
135
|
- - ">="
|
87
136
|
- !ruby/object:Gem::Version
|
137
|
+
hash: 3
|
138
|
+
segments:
|
139
|
+
- 0
|
88
140
|
version: "0"
|
89
|
-
version:
|
90
141
|
requirements: []
|
91
142
|
|
92
143
|
rubyforge_project: seattlerb
|
93
|
-
rubygems_version: 1.
|
144
|
+
rubygems_version: 1.4.2
|
94
145
|
signing_key:
|
95
146
|
specification_version: 3
|
96
147
|
summary: Gauntlet is a pluggable means of running code against all the latest gems and storing off the data.
|
metadata.gz.sig
CHANGED
Binary file
|