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.
@@ -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
@@ -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
@@ -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 = '0.5.8'
12
+ VERSION = "0.8.0"
13
13
 
14
- def self.in_threads(options={:count => 2})
15
- count, options = extract_count_from_options(options)
14
+ class DeadWorker < Exception
15
+ end
16
16
 
17
- out = []
18
- threads = []
17
+ class Break < Exception
18
+ end
19
19
 
20
- count.times do |i|
21
- threads[i] = Thread.new do
22
- out[i] = yield(i)
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
- wait_for_threads(threads)
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
- out
29
- end
38
+ def close_pipes
39
+ read.close
40
+ write.close
41
+ end
30
42
 
31
- def self.in_processes(options = {}, &block)
32
- count, options = extract_count_from_options(options)
33
- count ||= processor_count
34
- map(0...count, options.merge(:in_processes => count), &block)
35
- end
43
+ def wait
44
+ Process.wait(pid)
45
+ rescue Interrupt
46
+ # process died
47
+ end
36
48
 
37
- def self.each(array, options={}, &block)
38
- map(array, options.merge(:preserve_results => false), &block)
39
- array
40
- end
49
+ def work(index)
50
+ begin
51
+ Marshal.dump(index, write)
52
+ rescue Errno::EPIPE
53
+ raise DeadWorker
54
+ end
41
55
 
42
- def self.each_with_index(array, options={}, &block)
43
- each(array, options.merge(:with_index => true), &block)
56
+ begin
57
+ Marshal.load(read)
58
+ rescue EOFError
59
+ raise Parallel::DeadWorker
60
+ end
61
+ end
44
62
  end
45
63
 
46
- def self.map(array, options = {}, &block)
47
- array = array.to_a # turn Range and other Enumerable-s into an Array
64
+ class << self
65
+ def in_threads(options={:count => 2})
66
+ count, options = extract_count_from_options(options)
48
67
 
49
- if options[:in_threads]
50
- method = :in_threads
51
- size = options[method]
52
- else
53
- method = :in_processes
54
- size = options[method] || processor_count
55
- end
56
- size = [array.size, size].min
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
- return work_direct(array, options, &block) if size == 0
77
+ kill_on_ctrl_c(threads) { wait_for_threads(threads) }
59
78
 
60
- if method == :in_threads
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
- def self.processor_count
72
- case RbConfig::CONFIG['host_os']
73
- when /darwin9/
74
- `hwprefs cpu_count`.to_i
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
- private
88
+ def each(array, options={}, &block)
89
+ map(array, options.merge(:preserve_results => false), &block)
90
+ array
91
+ end
90
92
 
91
- def self.work_direct(array, options)
92
- results = []
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
- def self.hwprefs_available?
100
- `which hwprefs` != ''
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
- def self.work_in_threads(items, options, &block)
104
- results = []
105
- current = -1
106
- exception = nil
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
- in_threads(options[:count]) do
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
- index = Thread.exclusive{ current+=1 }
114
- break if index >= items.size
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
- begin
117
- results[index] = call_with_index(items, index, options, &block)
118
- rescue Exception => e
119
- exception = e
120
- break
121
- end
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
- raise exception if exception
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
- results
128
- end
167
+ private
129
168
 
130
- def self.work_in_processes(items, options, &blk)
131
- current_index = -1
132
- results = []
133
- pids = []
134
- exception = nil
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
- kill_on_ctrl_c(pids)
177
+ def hwprefs_available?
178
+ `which hwprefs` != ''
179
+ end
137
180
 
138
- in_threads(options[:count]) do |i|
139
- x = i
140
- worker = worker(items, options, &blk)
141
- pids[i] = worker[:pid]
181
+ def work_in_threads(items, options, &block)
182
+ results = []
183
+ current = -1
184
+ exception = nil
142
185
 
143
- begin
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
- write_to_pipe(worker[:write], index)
150
- output = decode(worker[:read].gets.chomp)
191
+ index = Thread.exclusive{ current+=1 }
192
+ break if index >= items.size
151
193
 
152
- if ExceptionWrapper === output
153
- exception = output.exception
154
- else
155
- results[index] = output
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
- ensure
159
- worker[:read].close
160
- worker[:write].close
203
+ end
204
+
205
+ handle_exception(exception, results)
206
+ end
161
207
 
162
- # if it goes zombie, rather wait here to be able to debug
163
- wait_for_process worker[:pid]
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
- raise exception if exception
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
- results
170
- end
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
- def self.worker(items, options, &block)
173
- # use less memory on REE
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
- child_read, parent_write = IO.pipe
177
- parent_read, child_write = IO.pipe
258
+ pid = Process.fork do
259
+ begin
260
+ options.delete(:started_workers).each(&:close_pipes)
178
261
 
179
- pid = Process.fork do
180
- begin
181
- parent_write.close
182
- parent_read.close
262
+ parent_write.close
263
+ parent_read.close
183
264
 
184
- process_incoming_jobs(child_read, child_write, items, options, &block)
185
- ensure
186
- child_read.close
187
- child_write.close
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
- child_read.close
192
- child_write.close
272
+ child_read.close
273
+ child_write.close
193
274
 
194
- {:read => parent_read, :write => parent_write, :pid => pid}
195
- end
275
+ Worker.new(parent_read, parent_write, pid)
276
+ end
196
277
 
197
- def self.process_incoming_jobs(read, write, items, options, &block)
198
- while input = read.gets and input != "\n"
199
- index = decode(input.chomp)
200
- begin
201
- result = call_with_index(items, index, options, &block)
202
- result = nil if options[:preserve_results] == false
203
- rescue Exception => e
204
- result = ExceptionWrapper.new(e)
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
- def self.wait_for_threads(threads)
215
- threads.compact.each do |t|
216
- begin
217
- t.join
218
- rescue Interrupt
219
- # thread died, do not stop other threads
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
- def self.wait_for_process(pid)
225
- begin
226
- Process.wait(pid)
227
- rescue Interrupt
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
- def self.encode(obj)
233
- Base64.encode64(Marshal.dump(obj)).split("\n").join + "\n"
234
- end
235
-
236
- def self.decode(str)
237
- Marshal.load(Base64.decode64(str))
238
- end
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
- # options is either a Integer or a Hash with :count
241
- def self.extract_count_from_options(options)
242
- if options.is_a?(Hash)
243
- count = options[:count]
244
- else
245
- count = options
246
- options = {}
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
- # kill all these processes (children) if user presses Ctrl+c
252
- def self.kill_on_ctrl_c(pids)
253
- Signal.trap :SIGINT do
254
- $stderr.puts 'Parallel execution interrupted, exiting ...'
255
- pids.each { |pid| Process.kill(:KILL, pid) if pid }
256
- exit 1 # Quit with 'failed' signal
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
- def self.call_with_index(array, index, options, &block)
261
- args = [array[index]]
262
- args << index if options[:with_index]
263
- block.call(*args)
264
- end
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
- class ExceptionWrapper
267
- attr_reader :exception
268
- def initialize(exception)
269
- @exception = exception
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
@@ -1,5 +1,5 @@
1
1
  module Gem
2
2
  class Dependent
3
- VERSION = Version = '0.2.4'
3
+ VERSION = Version = '0.2.5'
4
4
  end
5
5
  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.4
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
- - !binary |-
13
- LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURNakNDQWhxZ0F3SUJB
14
- Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREEvTVJBd0RnWURWUVFEREFkdGFX
15
- Tm8KWVdWc01SY3dGUVlLQ1pJbWlaUHlMR1FCR1JZSFozSnZjM05sY2pFU01C
16
- QUdDZ21TSm9tVDhpeGtBUmtXQW1sMApNQjRYRFRFek1ESXdNekU0TVRNeE1W
17
- b1hEVEUwTURJd016RTRNVE14TVZvd1B6RVFNQTRHQTFVRUF3d0hiV2xqCmFH
18
- RmxiREVYTUJVR0NnbVNKb21UOGl4a0FSa1dCMmR5YjNOelpYSXhFakFRQmdv
19
- SmtpYUprL0lzWkFFWkZnSnAKZERDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFB
20
- RGdnRVBBRENDQVFvQ2dnRUJBTW9yWG8vaGdiVXE5NytrSUk5SApNc1FjTGRD
21
- Lzd3UTFaUDJPc2hWSFBrZVAwcUg4TUJIR2c2ZVlpc09YMnViTmFnRjlZVENa
22
- V25ocmRLcndwTE9PCmNQTGFaYmpVamxqSjNjUVIzQjhZbjF2ZVY1SWhHODZR
23
- c2VUQmp5bXpKV3NMcHFKMVVaR3BmQjl0WGNzRnR1eE8KNnZIdmNJSGR6dmMv
24
- T1VrSUN0dExiSCsxcWI2cnNIVWNlcWgrSnJINEdyc0o1SDRoQWZJZHlTMlhN
25
- SzdZUktiaApoK0lCdTZkRldKSkJ5ekZzWW1WMVBEWGxuM1VCbWdBdDY1Y21D
26
- dTRxUGZUaGlvQ0dEemJTSnJHREdMbXcvcEZYCkZQcFZDbTF6Z1lTYjF2NlFu
27
- ZjNjZ1hhMmYyd1lHbTE3K3pBVnlJRHB3cnlGcnU5eUYvakp4RTM4ei9EUnNk
28
- OVIKLzg4Q0F3RUFBYU01TURjd0NRWURWUjBUQkFJd0FEQWRCZ05WSFE0RUZn
29
- UVVzaU5uWEh0S2VNWVljcjR5SlZtUQpXT05MK0l3d0N3WURWUjBQQkFRREFn
30
- U3dNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUFseU43a0tvL05RQ1EwCkFP
31
- elpMWjNXQWVQdlN0a0NGSUo1M3RzdjVLeW80cE1BbGx2K0JnUHp6QnQ3cWk2
32
- MDVtRlNMNnpCZDl1TG91K1cKQ28zczQ4cDFkeTdDampBZlZRZG1WTkhGM013
33
- WHRmQzJPRXl2U1FQaTR4S1I4aWJhOHdhM3hwOUxWbzFQdUxwdwovNkRzckNo
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: 1.8.25
65
+ rubygems_version: 2.0.6
80
66
  signing_key:
81
- specification_version: 3
67
+ specification_version: 4
82
68
  summary: See which gems depend on your gems
83
69
  test_files: []
metadata.gz.sig CHANGED
@@ -1,4 +1 @@
1
- :ػ�f<
2
- �p��%@.�N�&HW�`���ӭ���l�&z���1#�v�ۈ�
3
- !_��'����޳�����U�E����gѾd=�o�$��� aȚ��� h�k�B�_�A:� W��I{w�u/ W���g���ǣ8�x9ީ��^.؎�/�1�����B0��8a�' � �sC7
4
- j�?O_p.�F��Jf
1
+ �r�_h��S��@�%f@�mUK�M�&����|q��t�����