gem-dependent 0.2.4 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +1 -0
- data.tar.gz.sig +0 -0
- data/lib/rubygems/commands/dependent_command.rb +5 -1
- data/lib/rubygems/dependent.rb +4 -3
- data/lib/rubygems/dependent/parallel.rb +284 -191
- data/lib/rubygems/dependent/version.rb +1 -1
- metadata +28 -42
- metadata.gz.sig +1 -4
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: afc8028826702e46dc846ddaa1b6b5161449caf9
|
4
|
+
data.tar.gz: fee1b6005723a95e52eefcec2955179bf168273d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2d4363c02e41b93aa50e4e98a8762ca4b9818320666daae587c3a9833e6483343dc0e0efc836dea71c0f5896ba3944f824e828dbe005200ef364ea119d1e00f2
|
7
|
+
data.tar.gz: 4df19254cc6abd8db0f0000d5e6600966d07c0fb543ac3f2db7f72d85731870d2710699eabbf1503ff8e58cb3d26033db7920e516791382b17feff3dc3d74cd6
|
checksums.yaml.gz.sig
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
�|���?���#�3�뛶���ދ��W�
|
data.tar.gz.sig
CHANGED
Binary file
|
@@ -16,13 +16,17 @@ class Gem::Commands::DependentCommand < Gem::Command
|
|
16
16
|
options[:fetch_limit] = n
|
17
17
|
end
|
18
18
|
|
19
|
-
add_option('--parallel N', Integer, 'Make N requests in parallel') do |n, _|
|
19
|
+
add_option('--parallel N', Integer, 'Make N requests in parallel (default 15)') do |n, _|
|
20
20
|
options[:parallel] = n
|
21
21
|
end
|
22
22
|
|
23
23
|
add_option('--all-versions', 'Check against all versions of gems') do
|
24
24
|
options[:all_versions] = true
|
25
25
|
end
|
26
|
+
|
27
|
+
add_option('--type dependent_type', 'Only look for dependents matching the listed type(s) (default is runtime and development)') do |n, _|
|
28
|
+
options[:type] = n.to_s.split(',').map(&:to_sym)
|
29
|
+
end
|
26
30
|
end
|
27
31
|
|
28
32
|
def arguments
|
data/lib/rubygems/dependent.rb
CHANGED
@@ -23,7 +23,7 @@ module Gem
|
|
23
23
|
end
|
24
24
|
$stderr.print "\n" if options[:progress]
|
25
25
|
|
26
|
-
select_dependent(gems_and_dependencies, gem)
|
26
|
+
select_dependent(gems_and_dependencies, gem, options)
|
27
27
|
end
|
28
28
|
|
29
29
|
private
|
@@ -56,9 +56,10 @@ module Gem
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
def self.select_dependent(gems_and_dependencies, gem)
|
59
|
+
def self.select_dependent(gems_and_dependencies, gem, options={})
|
60
|
+
accepted_types = (options[:type] || [:development, :runtime])
|
60
61
|
gems_and_dependencies.map do |name, version, dependencies|
|
61
|
-
matching_dependencies = dependencies.select{|d| d.name == gem } rescue []
|
62
|
+
matching_dependencies = dependencies.select{|d| d.name == gem && accepted_types.include?(d.type) } rescue []
|
62
63
|
next if matching_dependencies.empty?
|
63
64
|
[name, version, matching_dependencies]
|
64
65
|
end.compact
|
@@ -9,264 +9,357 @@ require 'rbconfig'
|
|
9
9
|
module Gem;end
|
10
10
|
class Gem::Dependent;end
|
11
11
|
class Gem::Dependent::Parallel
|
12
|
-
VERSION =
|
12
|
+
VERSION = "0.8.0"
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
class DeadWorker < Exception
|
15
|
+
end
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
class Break < Exception
|
18
|
+
end
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
class ExceptionWrapper
|
21
|
+
attr_reader :exception
|
22
|
+
def initialize(exception)
|
23
|
+
dumpable = Marshal.dump(exception) rescue nil
|
24
|
+
unless dumpable
|
25
|
+
exception = RuntimeError.new("Undumpable Exception -- #{exception.inspect}")
|
23
26
|
end
|
27
|
+
|
28
|
+
@exception = exception
|
24
29
|
end
|
30
|
+
end
|
25
31
|
|
26
|
-
|
32
|
+
class Worker
|
33
|
+
attr_reader :pid, :read, :write
|
34
|
+
def initialize(read, write, pid)
|
35
|
+
@read, @write, @pid = read, write, pid
|
36
|
+
end
|
27
37
|
|
28
|
-
|
29
|
-
|
38
|
+
def close_pipes
|
39
|
+
read.close
|
40
|
+
write.close
|
41
|
+
end
|
30
42
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
43
|
+
def wait
|
44
|
+
Process.wait(pid)
|
45
|
+
rescue Interrupt
|
46
|
+
# process died
|
47
|
+
end
|
36
48
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
49
|
+
def work(index)
|
50
|
+
begin
|
51
|
+
Marshal.dump(index, write)
|
52
|
+
rescue Errno::EPIPE
|
53
|
+
raise DeadWorker
|
54
|
+
end
|
41
55
|
|
42
|
-
|
43
|
-
|
56
|
+
begin
|
57
|
+
Marshal.load(read)
|
58
|
+
rescue EOFError
|
59
|
+
raise Parallel::DeadWorker
|
60
|
+
end
|
61
|
+
end
|
44
62
|
end
|
45
63
|
|
46
|
-
|
47
|
-
|
64
|
+
class << self
|
65
|
+
def in_threads(options={:count => 2})
|
66
|
+
count, options = extract_count_from_options(options)
|
48
67
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
68
|
+
out = []
|
69
|
+
threads = []
|
70
|
+
|
71
|
+
count.times do |i|
|
72
|
+
threads[i] = Thread.new do
|
73
|
+
out[i] = yield(i)
|
74
|
+
end
|
75
|
+
end
|
57
76
|
|
58
|
-
|
77
|
+
kill_on_ctrl_c(threads) { wait_for_threads(threads) }
|
59
78
|
|
60
|
-
|
61
|
-
work_in_threads(array, options.merge(:count => size), &block)
|
62
|
-
else
|
63
|
-
work_in_processes(array, options.merge(:count => size), &block)
|
79
|
+
out
|
64
80
|
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def self.map_with_index(array, options={}, &block)
|
68
|
-
map(array, options.merge(:with_index => true), &block)
|
69
|
-
end
|
70
81
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
when /darwin/
|
76
|
-
(hwprefs_available? ? `hwprefs thread_count` : `sysctl -n hw.ncpu`).to_i
|
77
|
-
when /linux/
|
78
|
-
`grep -c processor /proc/cpuinfo`.to_i
|
79
|
-
when /freebsd/
|
80
|
-
`sysctl -n hw.ncpu`.to_i
|
81
|
-
when /mswin|mingw/
|
82
|
-
require 'win32ole'
|
83
|
-
wmi = WIN32OLE.connect("winmgmts://")
|
84
|
-
cpu = wmi.ExecQuery("select NumberOfLogicalProcessors from Win32_Processor")
|
85
|
-
cpu.to_enum.first.NumberOfLogicalProcessors
|
82
|
+
def in_processes(options = {}, &block)
|
83
|
+
count, options = extract_count_from_options(options)
|
84
|
+
count ||= processor_count
|
85
|
+
map(0...count, options.merge(:in_processes => count), &block)
|
86
86
|
end
|
87
|
-
end
|
88
87
|
|
89
|
-
|
88
|
+
def each(array, options={}, &block)
|
89
|
+
map(array, options.merge(:preserve_results => false), &block)
|
90
|
+
array
|
91
|
+
end
|
90
92
|
|
91
|
-
|
92
|
-
|
93
|
-
array.each_with_index do |e,i|
|
94
|
-
results << (options[:with_index] ? yield(e,i) : yield(e))
|
93
|
+
def each_with_index(array, options={}, &block)
|
94
|
+
each(array, options.merge(:with_index => true), &block)
|
95
95
|
end
|
96
|
-
results
|
97
|
-
end
|
98
96
|
|
99
|
-
|
100
|
-
|
101
|
-
end
|
97
|
+
def map(array, options = {}, &block)
|
98
|
+
array = array.to_a # turn Range and other Enumerable-s into an Array
|
102
99
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
100
|
+
if options[:in_threads]
|
101
|
+
method = :in_threads
|
102
|
+
size = options[method]
|
103
|
+
else
|
104
|
+
method = :in_processes
|
105
|
+
size = options[method] || processor_count
|
106
|
+
end
|
107
|
+
size = [array.size, size].min
|
107
108
|
|
108
|
-
|
109
|
-
# as long as there are more items, work on one of them
|
110
|
-
loop do
|
111
|
-
break if exception
|
109
|
+
return work_direct(array, options, &block) if size == 0
|
112
110
|
|
113
|
-
|
114
|
-
|
111
|
+
if method == :in_threads
|
112
|
+
work_in_threads(array, options.merge(:count => size), &block)
|
113
|
+
else
|
114
|
+
work_in_processes(array, options.merge(:count => size), &block)
|
115
|
+
end
|
116
|
+
end
|
115
117
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
118
|
+
def map_with_index(array, options={}, &block)
|
119
|
+
map(array, options.merge(:with_index => true), &block)
|
120
|
+
end
|
121
|
+
|
122
|
+
def processor_count
|
123
|
+
@processor_count ||= case RbConfig::CONFIG['host_os']
|
124
|
+
when /darwin9/
|
125
|
+
`hwprefs cpu_count`.to_i
|
126
|
+
when /darwin/
|
127
|
+
(hwprefs_available? ? `hwprefs thread_count` : `sysctl -n hw.ncpu`).to_i
|
128
|
+
when /linux|cygwin/
|
129
|
+
`grep -c ^processor /proc/cpuinfo`.to_i
|
130
|
+
when /(net|open|free)bsd/
|
131
|
+
`sysctl -n hw.ncpu`.to_i
|
132
|
+
when /mswin|mingw/
|
133
|
+
require 'win32ole'
|
134
|
+
wmi = WIN32OLE.connect("winmgmts://")
|
135
|
+
cpu = wmi.ExecQuery("select NumberOfLogicalProcessors from Win32_Processor")
|
136
|
+
cpu.to_enum.first.NumberOfLogicalProcessors
|
137
|
+
when /solaris2/
|
138
|
+
`psrinfo -p`.to_i # this is physical cpus afaik
|
139
|
+
else
|
140
|
+
$stderr.puts "Unknown architecture ( #{RbConfig::CONFIG["host_os"]} ) assuming one processor."
|
141
|
+
1
|
122
142
|
end
|
123
143
|
end
|
124
144
|
|
125
|
-
|
145
|
+
def physical_processor_count
|
146
|
+
@physical_processor_count ||= begin
|
147
|
+
ppc = case RbConfig::CONFIG['host_os']
|
148
|
+
when /darwin1/, /freebsd/
|
149
|
+
`sysctl -n hw.physicalcpu`.to_i
|
150
|
+
when /linux/
|
151
|
+
cores_per_physical = `grep cores /proc/cpuinfo`[/\d+/].to_i
|
152
|
+
physicals = `grep 'physical id' /proc/cpuinfo |sort|uniq|wc -l`.to_i
|
153
|
+
physicals * cores_per_physical
|
154
|
+
when /mswin|mingw/
|
155
|
+
require 'win32ole'
|
156
|
+
wmi = WIN32OLE.connect("winmgmts://")
|
157
|
+
cpu = wmi.ExecQuery("select NumberOfProcessors from Win32_Processor")
|
158
|
+
cpu.to_enum.first.NumberOfLogicalProcessors
|
159
|
+
else
|
160
|
+
processor_count
|
161
|
+
end
|
162
|
+
# fall back to logical count if physical info is invalid
|
163
|
+
ppc > 0 ? ppc : processor_count
|
164
|
+
end
|
165
|
+
end
|
126
166
|
|
127
|
-
|
128
|
-
end
|
167
|
+
private
|
129
168
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
169
|
+
def work_direct(array, options)
|
170
|
+
results = []
|
171
|
+
array.each_with_index do |e,i|
|
172
|
+
results << (options[:with_index] ? yield(e,i) : yield(e))
|
173
|
+
end
|
174
|
+
results
|
175
|
+
end
|
135
176
|
|
136
|
-
|
177
|
+
def hwprefs_available?
|
178
|
+
`which hwprefs` != ''
|
179
|
+
end
|
137
180
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
181
|
+
def work_in_threads(items, options, &block)
|
182
|
+
results = []
|
183
|
+
current = -1
|
184
|
+
exception = nil
|
142
185
|
|
143
|
-
|
186
|
+
in_threads(options[:count]) do
|
187
|
+
# as long as there are more items, work on one of them
|
144
188
|
loop do
|
145
189
|
break if exception
|
146
|
-
index = Thread.exclusive{ current_index += 1 }
|
147
|
-
break if index >= items.size
|
148
190
|
|
149
|
-
|
150
|
-
|
191
|
+
index = Thread.exclusive{ current+=1 }
|
192
|
+
break if index >= items.size
|
151
193
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
194
|
+
with_instrumentation items[index], index, options do
|
195
|
+
begin
|
196
|
+
results[index] = call_with_index(items, index, options, &block)
|
197
|
+
rescue Exception => e
|
198
|
+
exception = e
|
199
|
+
break
|
200
|
+
end
|
156
201
|
end
|
157
202
|
end
|
158
|
-
|
159
|
-
|
160
|
-
|
203
|
+
end
|
204
|
+
|
205
|
+
handle_exception(exception, results)
|
206
|
+
end
|
161
207
|
|
162
|
-
|
163
|
-
|
208
|
+
def work_in_processes(items, options, &blk)
|
209
|
+
workers = create_workers(items, options, &blk)
|
210
|
+
current_index = -1
|
211
|
+
results = []
|
212
|
+
exception = nil
|
213
|
+
kill_on_ctrl_c(workers.map(&:pid)) do
|
214
|
+
in_threads(options[:count]) do |i|
|
215
|
+
worker = workers[i]
|
216
|
+
|
217
|
+
begin
|
218
|
+
loop do
|
219
|
+
break if exception
|
220
|
+
index = Thread.exclusive{ current_index += 1 }
|
221
|
+
break if index >= items.size
|
222
|
+
|
223
|
+
output = with_instrumentation items[index], index, options do
|
224
|
+
worker.work(index)
|
225
|
+
end
|
226
|
+
|
227
|
+
if ExceptionWrapper === output
|
228
|
+
exception = output.exception
|
229
|
+
else
|
230
|
+
results[index] = output
|
231
|
+
end
|
232
|
+
end
|
233
|
+
ensure
|
234
|
+
worker.close_pipes
|
235
|
+
worker.wait # if it goes zombie, rather wait here to be able to debug
|
236
|
+
end
|
237
|
+
end
|
164
238
|
end
|
239
|
+
|
240
|
+
handle_exception(exception, results)
|
165
241
|
end
|
166
242
|
|
167
|
-
|
243
|
+
def create_workers(items, options, &block)
|
244
|
+
workers = []
|
245
|
+
Array.new(options[:count]).each do
|
246
|
+
workers << worker(items, options.merge(:started_workers => workers), &block)
|
247
|
+
end
|
248
|
+
workers
|
249
|
+
end
|
168
250
|
|
169
|
-
|
170
|
-
|
251
|
+
def worker(items, options, &block)
|
252
|
+
# use less memory on REE
|
253
|
+
GC.copy_on_write_friendly = true if GC.respond_to?(:copy_on_write_friendly=)
|
171
254
|
|
172
|
-
|
173
|
-
|
174
|
-
GC.copy_on_write_friendly = true if GC.respond_to?(:copy_on_write_friendly=)
|
255
|
+
child_read, parent_write = IO.pipe
|
256
|
+
parent_read, child_write = IO.pipe
|
175
257
|
|
176
|
-
|
177
|
-
|
258
|
+
pid = Process.fork do
|
259
|
+
begin
|
260
|
+
options.delete(:started_workers).each(&:close_pipes)
|
178
261
|
|
179
|
-
|
180
|
-
|
181
|
-
parent_write.close
|
182
|
-
parent_read.close
|
262
|
+
parent_write.close
|
263
|
+
parent_read.close
|
183
264
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
265
|
+
process_incoming_jobs(child_read, child_write, items, options, &block)
|
266
|
+
ensure
|
267
|
+
child_read.close
|
268
|
+
child_write.close
|
269
|
+
end
|
188
270
|
end
|
189
|
-
end
|
190
271
|
|
191
|
-
|
192
|
-
|
272
|
+
child_read.close
|
273
|
+
child_write.close
|
193
274
|
|
194
|
-
|
195
|
-
|
275
|
+
Worker.new(parent_read, parent_write, pid)
|
276
|
+
end
|
196
277
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
278
|
+
def process_incoming_jobs(read, write, items, options, &block)
|
279
|
+
while !read.eof?
|
280
|
+
index = Marshal.load(read)
|
281
|
+
begin
|
282
|
+
result = call_with_index(items, index, options, &block)
|
283
|
+
result = nil if options[:preserve_results] == false
|
284
|
+
rescue Exception => e
|
285
|
+
result = ExceptionWrapper.new(e)
|
286
|
+
end
|
287
|
+
Marshal.dump(result, write)
|
205
288
|
end
|
206
|
-
write_to_pipe(write, result)
|
207
289
|
end
|
208
|
-
end
|
209
|
-
|
210
|
-
def self.write_to_pipe(pipe, item)
|
211
|
-
pipe.write(encode(item))
|
212
|
-
end
|
213
290
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
291
|
+
def wait_for_threads(threads)
|
292
|
+
threads.compact.each do |t|
|
293
|
+
begin
|
294
|
+
t.join
|
295
|
+
rescue Interrupt
|
296
|
+
# thread died, do not stop other threads
|
297
|
+
end
|
220
298
|
end
|
221
299
|
end
|
222
|
-
end
|
223
300
|
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
# process died
|
301
|
+
def handle_exception(exception, results)
|
302
|
+
return nil if exception.class == Break
|
303
|
+
raise exception if exception
|
304
|
+
results
|
229
305
|
end
|
230
|
-
end
|
231
306
|
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
307
|
+
# options is either a Integer or a Hash with :count
|
308
|
+
def extract_count_from_options(options)
|
309
|
+
if options.is_a?(Hash)
|
310
|
+
count = options[:count]
|
311
|
+
else
|
312
|
+
count = options
|
313
|
+
options = {}
|
314
|
+
end
|
315
|
+
[count, options]
|
316
|
+
end
|
239
317
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
318
|
+
# kill all these pids or threads if user presses Ctrl+c
|
319
|
+
def kill_on_ctrl_c(things)
|
320
|
+
if @to_be_killed
|
321
|
+
@to_be_killed << things
|
322
|
+
else
|
323
|
+
@to_be_killed = [things]
|
324
|
+
Signal.trap :SIGINT do
|
325
|
+
if @to_be_killed.any?
|
326
|
+
$stderr.puts 'Parallel execution interrupted, exiting ...'
|
327
|
+
@to_be_killed.flatten.compact.each { |thing| kill_that_thing!(thing) }
|
328
|
+
end
|
329
|
+
exit 1 # Quit with 'failed' signal
|
330
|
+
end
|
331
|
+
end
|
332
|
+
yield
|
333
|
+
ensure
|
334
|
+
@to_be_killed.pop # free threads for GC and do not kill pids that could be used for new processes
|
247
335
|
end
|
248
|
-
[count, options]
|
249
|
-
end
|
250
336
|
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
337
|
+
def kill_that_thing!(thing)
|
338
|
+
if thing.is_a?(Thread)
|
339
|
+
thing.kill
|
340
|
+
else
|
341
|
+
begin
|
342
|
+
Process.kill(:KILL, thing)
|
343
|
+
rescue Errno::ESRCH
|
344
|
+
# some linux systems already automatically killed the children at this point
|
345
|
+
# so we just ignore them not being there
|
346
|
+
end
|
347
|
+
end
|
257
348
|
end
|
258
|
-
end
|
259
349
|
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
350
|
+
def call_with_index(array, index, options, &block)
|
351
|
+
args = [array[index]]
|
352
|
+
args << index if options[:with_index]
|
353
|
+
block.call(*args)
|
354
|
+
end
|
265
355
|
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
356
|
+
def with_instrumentation(item, index, options)
|
357
|
+
on_start = options[:start]
|
358
|
+
on_finish = options[:finish]
|
359
|
+
on_start.call(item, index) if on_start
|
360
|
+
yield
|
361
|
+
ensure
|
362
|
+
on_finish.call(item, index) if on_finish
|
270
363
|
end
|
271
364
|
end
|
272
365
|
end
|
metadata
CHANGED
@@ -1,42 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gem-dependent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.5
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Michael Grosser
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain:
|
12
|
-
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
V3c3NEhmc0pONnFKT0s2ODRoSmVUOGxCWUFVZmlDM3dEMG93b1BTZytYdHlB
|
35
|
-
QWRkaXNSK0tWNVkxCk5tVkh1THRRY05UWnkrZ1JodDNhaEpSTXVDNlF5TG1r
|
36
|
-
VHNmKzZNYWVud0FNa0FnSGRzd0dzSnp0T25ObkJhM0YKeTBrQ1NXbUs2RCt4
|
37
|
-
L1NiZlM2cjdLZTA3TVJxemlKZEI5R3VFMSswY0lSdUZoOEVRK0xONkhYQ0tN
|
38
|
-
NXBvbi9HVQp5Y3dNWGZsMAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
|
39
|
-
date: 2013-09-07 00:00:00.000000000 Z
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDMjCCAhqgAwIBAgIBADANBgkqhkiG9w0BAQUFADA/MRAwDgYDVQQDDAdtaWNo
|
14
|
+
YWVsMRcwFQYKCZImiZPyLGQBGRYHZ3Jvc3NlcjESMBAGCgmSJomT8ixkARkWAml0
|
15
|
+
MB4XDTEzMDIwMzE4MTMxMVoXDTE0MDIwMzE4MTMxMVowPzEQMA4GA1UEAwwHbWlj
|
16
|
+
aGFlbDEXMBUGCgmSJomT8ixkARkWB2dyb3NzZXIxEjAQBgoJkiaJk/IsZAEZFgJp
|
17
|
+
dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMorXo/hgbUq97+kII9H
|
18
|
+
MsQcLdC/7wQ1ZP2OshVHPkeP0qH8MBHGg6eYisOX2ubNagF9YTCZWnhrdKrwpLOO
|
19
|
+
cPLaZbjUjljJ3cQR3B8Yn1veV5IhG86QseTBjymzJWsLpqJ1UZGpfB9tXcsFtuxO
|
20
|
+
6vHvcIHdzvc/OUkICttLbH+1qb6rsHUceqh+JrH4GrsJ5H4hAfIdyS2XMK7YRKbh
|
21
|
+
h+IBu6dFWJJByzFsYmV1PDXln3UBmgAt65cmCu4qPfThioCGDzbSJrGDGLmw/pFX
|
22
|
+
FPpVCm1zgYSb1v6Qnf3cgXa2f2wYGm17+zAVyIDpwryFru9yF/jJxE38z/DRsd9R
|
23
|
+
/88CAwEAAaM5MDcwCQYDVR0TBAIwADAdBgNVHQ4EFgQUsiNnXHtKeMYYcr4yJVmQ
|
24
|
+
WONL+IwwCwYDVR0PBAQDAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQAlyN7kKo/NQCQ0
|
25
|
+
AOzZLZ3WAePvStkCFIJ53tsv5Kyo4pMAllv+BgPzzBt7qi605mFSL6zBd9uLou+W
|
26
|
+
Co3s48p1dy7CjjAfVQdmVNHF3MwXtfC2OEyvSQPi4xKR8iba8wa3xp9LVo1PuLpw
|
27
|
+
/6DsrChWw74HfsJN6qJOK684hJeT8lBYAUfiC3wD0owoPSg+XtyAAddisR+KV5Y1
|
28
|
+
NmVHuLtQcNTZy+gRht3ahJRMuC6QyLmkTsf+6MaenwAMkAgHdswGsJztOnNnBa3F
|
29
|
+
y0kCSWmK6D+x/SbfS6r7Ke07MRqziJdB9GuE1+0cIRuFh8EQ+LN6HXCKM5pon/GU
|
30
|
+
ycwMXfl0
|
31
|
+
-----END CERTIFICATE-----
|
32
|
+
date: 2013-10-21 00:00:00.000000000 Z
|
40
33
|
dependencies: []
|
41
34
|
description:
|
42
35
|
email: michael@grosser.it
|
@@ -52,32 +45,25 @@ files:
|
|
52
45
|
homepage: https://github.com/grosser/gem-dependent
|
53
46
|
licenses:
|
54
47
|
- MIT
|
48
|
+
metadata: {}
|
55
49
|
post_install_message:
|
56
50
|
rdoc_options: []
|
57
51
|
require_paths:
|
58
52
|
- lib
|
59
53
|
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
-
none: false
|
61
54
|
requirements:
|
62
|
-
- -
|
55
|
+
- - '>='
|
63
56
|
- !ruby/object:Gem::Version
|
64
57
|
version: '0'
|
65
|
-
segments:
|
66
|
-
- 0
|
67
|
-
hash: -2903456129271945094
|
68
58
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
-
none: false
|
70
59
|
requirements:
|
71
|
-
- -
|
60
|
+
- - '>='
|
72
61
|
- !ruby/object:Gem::Version
|
73
62
|
version: '0'
|
74
|
-
segments:
|
75
|
-
- 0
|
76
|
-
hash: -2903456129271945094
|
77
63
|
requirements: []
|
78
64
|
rubyforge_project:
|
79
|
-
rubygems_version:
|
65
|
+
rubygems_version: 2.0.6
|
80
66
|
signing_key:
|
81
|
-
specification_version:
|
67
|
+
specification_version: 4
|
82
68
|
summary: See which gems depend on your gems
|
83
69
|
test_files: []
|
metadata.gz.sig
CHANGED