gem-dependent 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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�����