backports 3.6.7 → 3.6.8

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b4d7b3bbc87415b5338da4e9769d0d039286aa5a
4
- data.tar.gz: dd193ae2f5e07769687cc679325e78512f8a505d
3
+ metadata.gz: 4e7cf14929385f92c1246d5da12ac424b422338e
4
+ data.tar.gz: ddccf768a48e4cf4327cb2dd4244d14932b9d0bb
5
5
  SHA512:
6
- metadata.gz: 51f3ece30f31a2927895bb7fe04350f8076f430b29471ddcaceab6bf74a17e3028c3f3a929dcc696df0953186fe752bb7112455df0589b2a198f057046d6edec
7
- data.tar.gz: 1d4f8cc2c823dbb006bb56f7a420008d752a083525fbc84ff7dfc56e866c09cc7c34124625cdeb1e32fd2a3b48eec00f97480bb002062d6de526dc4eb4248297
6
+ metadata.gz: 62b66d725bbd40b4462ef16500c78d8d19a8382e09fbeb834ddbd2eab4a7df9bca45d22382604f91d557481b35873977fc304f266fe29be58c9602803f4db6ce
7
+ data.tar.gz: 551bddeb601f9eccbbb92469914ef3c7a7a1bd0777f30ec5be5f0763aa3a5b543dbf70fa4159a9ecdd4f7514a632379106af88b685caa03ead26038d88e7cf70
@@ -7,7 +7,7 @@ GIT
7
7
  PATH
8
8
  remote: .
9
9
  specs:
10
- backports (3.6.7)
10
+ backports (3.6.8)
11
11
 
12
12
  GEM
13
13
  remote: http://rubygems.org/
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: false
1
2
  #
2
3
  # = prime.rb
3
4
  #
@@ -29,9 +30,16 @@ class Integer
29
30
  Prime.prime_division(self, generator)
30
31
  end
31
32
 
32
- # Returns true if +self+ is a prime number, false for a composite.
33
+ # Returns true if +self+ is a prime number, else returns false.
33
34
  def prime?
34
- Prime.prime?(self)
35
+ return self >= 2 if self <= 3
36
+ return false if self % 2 == 0 or self % 3 == 0
37
+ (5..(self**0.5).floor).step(6).each do |i|
38
+ if self % i == 0 || self % (i + 2) == 0
39
+ return false
40
+ end
41
+ end
42
+ true
35
43
  end
36
44
 
37
45
  # Iterates the given block over all prime numbers.
@@ -46,57 +54,52 @@ end
46
54
  # The set of all prime numbers.
47
55
  #
48
56
  # == Example
49
- # Prime.each(100) do |prime|
50
- # p prime #=> 2, 3, 5, 7, 11, ...., 97
51
- # end
57
+ #
58
+ # Prime.each(100) do |prime|
59
+ # p prime #=> 2, 3, 5, 7, 11, ...., 97
60
+ # end
61
+ #
62
+ # Prime is Enumerable:
63
+ #
64
+ # Prime.first 5 # => [2, 3, 5, 7, 11]
52
65
  #
53
66
  # == Retrieving the instance
54
- # +Prime+.new is obsolete. Now +Prime+ has the default instance and you can
55
- # access it as +Prime+.instance.
56
67
  #
57
68
  # For convenience, each instance method of +Prime+.instance can be accessed
58
69
  # as a class method of +Prime+.
59
70
  #
60
71
  # e.g.
61
- # Prime.instance.prime?(2) #=> true
62
- # Prime.prime?(2) #=> true
72
+ # Prime.instance.prime?(2) #=> true
73
+ # Prime.prime?(2) #=> true
63
74
  #
64
75
  # == Generators
76
+ #
65
77
  # A "generator" provides an implementation of enumerating pseudo-prime
66
78
  # numbers and it remembers the position of enumeration and upper bound.
67
- # Futhermore, it is a external iterator of prime enumeration which is
68
- # compatible to an Enumerator.
79
+ # Furthermore, it is an external iterator of prime enumeration which is
80
+ # compatible with an Enumerator.
69
81
  #
70
82
  # +Prime+::+PseudoPrimeGenerator+ is the base class for generators.
71
83
  # There are few implementations of generator.
72
84
  #
73
85
  # [+Prime+::+EratosthenesGenerator+]
74
- # Uses eratosthenes's sieve.
86
+ # Uses eratosthenes' sieve.
75
87
  # [+Prime+::+TrialDivisionGenerator+]
76
88
  # Uses the trial division method.
77
89
  # [+Prime+::+Generator23+]
78
- # Generates all positive integers which is not divided by 2 nor 3.
90
+ # Generates all positive integers which are not divisible by either 2 or 3.
79
91
  # This sequence is very bad as a pseudo-prime sequence. But this
80
- # is faster and uses much less memory than other generators. So,
92
+ # is faster and uses much less memory than the other generators. So,
81
93
  # it is suitable for factorizing an integer which is not large but
82
94
  # has many prime factors. e.g. for Prime#prime? .
95
+
83
96
  class Prime
84
- unless Prime.const_defined? :OldCompatibility
85
97
  include Enumerable
86
- @the_instance = Prime.new
87
-
88
- # obsolete. Use +Prime+::+instance+ or class methods of +Prime+.
89
- def initialize
90
- @generator = EratosthenesGenerator.new
91
- extend OldCompatibility
92
- warn "Prime::new is obsolete. use Prime::instance or class methods of Prime."
93
- end
98
+ include Singleton
94
99
 
95
100
  class << self
96
101
  extend Forwardable
97
102
  include Enumerable
98
- # Returns the default instance of Prime.
99
- def instance; @the_instance end
100
103
 
101
104
  def method_added(method) # :nodoc:
102
105
  (class<< self;self;end).def_delegator :instance, method
@@ -106,6 +109,7 @@ unless Prime.const_defined? :OldCompatibility
106
109
  # Iterates the given block over all prime numbers.
107
110
  #
108
111
  # == Parameters
112
+ #
109
113
  # +ubound+::
110
114
  # Optional. An arbitrary positive number.
111
115
  # The upper bound of enumeration. The method enumerates
@@ -114,40 +118,37 @@ unless Prime.const_defined? :OldCompatibility
114
118
  # Optional. An implementation of pseudo-prime generator.
115
119
  #
116
120
  # == Return value
121
+ #
117
122
  # An evaluated value of the given block at the last time.
118
123
  # Or an enumerator which is compatible to an +Enumerator+
119
124
  # if no block given.
120
125
  #
121
126
  # == Description
127
+ #
122
128
  # Calls +block+ once for each prime number, passing the prime as
123
129
  # a parameter.
124
130
  #
125
131
  # +ubound+::
126
- # Upper bound of prime numbers. The iterator stops after
132
+ # Upper bound of prime numbers. The iterator stops after it
127
133
  # yields all prime numbers p <= +ubound+.
128
134
  #
129
- # == Note
130
- # +Prime+.+new+ returns a object extended by +Prime+::+OldCompatibility+
131
- # in order to compatibility to Ruby 1.8, and +Prime+#each is overwritten
132
- # by +Prime+::+OldCompatibility+#+each+.
133
- #
134
- # +Prime+.+new+ is now obsolete. Use +Prime+.+instance+.+each+ or simply
135
- # +Prime+.+each+.
136
135
  def each(ubound = nil, generator = EratosthenesGenerator.new, &block)
137
136
  generator.upper_bound = ubound
138
137
  generator.each(&block)
139
138
  end
140
139
 
141
140
 
142
- # Returns true if +value+ is prime, false for a composite.
141
+ # Returns true if +value+ is a prime number, else returns false.
143
142
  #
144
143
  # == Parameters
144
+ #
145
145
  # +value+:: an arbitrary integer to be checked.
146
146
  # +generator+:: optional. A pseudo-prime generator.
147
147
  def prime?(value, generator = Prime::Generator23.new)
148
- value = -value if value < 0
148
+ raise ArgumentError, "Expected a prime generator, got #{generator}" unless generator.respond_to? :each
149
+ raise ArgumentError, "Expected an integer, got #{value}" unless value.respond_to?(:integer?) && value.integer?
149
150
  return false if value < 2
150
- for num in generator
151
+ generator.each do |num|
151
152
  q,r = value.divmod num
152
153
  return true if q < num
153
154
  return false if r == 0
@@ -162,13 +163,14 @@ unless Prime.const_defined? :OldCompatibility
162
163
  # and a natural number -- an exponent.
163
164
  #
164
165
  # == Example
165
- # For [[p_1, e_1], [p_2, e_2], ...., [p_n, e_n]], it returns
166
- # p_1**e_1 * p_2**e_2 * .... * p_n**e_n.
166
+ # For <tt>[[p_1, e_1], [p_2, e_2], ...., [p_n, e_n]]</tt>, it returns:
167
167
  #
168
- # Prime.int_from_prime_division([[2,2], [3,1]]) #=> 12
168
+ # p_1**e_1 * p_2**e_2 * .... * p_n**e_n.
169
+ #
170
+ # Prime.int_from_prime_division([[2,2], [3,1]]) #=> 12
169
171
  def int_from_prime_division(pd)
170
172
  pd.inject(1){|value, (prime, index)|
171
- value *= prime**index
173
+ value * prime**index
172
174
  }
173
175
  end
174
176
 
@@ -178,22 +180,25 @@ unless Prime.const_defined? :OldCompatibility
178
180
  # +value+:: An arbitrary integer.
179
181
  # +generator+:: Optional. A pseudo-prime generator.
180
182
  # +generator+.succ must return the next
181
- # pseudo-prime number in the ascendent
183
+ # pseudo-prime number in the ascending
182
184
  # order. It must generate all prime numbers,
183
- # but may generate non prime numbers.
185
+ # but may also generate non prime numbers too.
184
186
  #
185
187
  # === Exceptions
186
188
  # +ZeroDivisionError+:: when +value+ is zero.
187
189
  #
188
190
  # == Example
189
- # For an arbitrary integer
190
- # n = p_1**e_1 * p_2**e_2 * .... * p_n**e_n,
191
- # prime_division(n) returns
192
- # [[p_1, e_1], [p_2, e_2], ...., [p_n, e_n]].
191
+ # For an arbitrary integer:
192
+ #
193
+ # n = p_1**e_1 * p_2**e_2 * .... * p_n**e_n,
194
+ #
195
+ # prime_division(n) returns:
193
196
  #
194
- # Prime.prime_division(12) #=> [[2,2], [3,1]]
197
+ # [[p_1, e_1], [p_2, e_2], ...., [p_n, e_n]].
195
198
  #
196
- def prime_division(value, generator= Prime::Generator23.new)
199
+ # Prime.prime_division(12) #=> [[2,2], [3,1]]
200
+ #
201
+ def prime_division(value, generator = Prime::Generator23.new)
197
202
  raise ZeroDivisionError if value == 0
198
203
  if value < 0
199
204
  value = -value
@@ -201,22 +206,22 @@ unless Prime.const_defined? :OldCompatibility
201
206
  else
202
207
  pv = []
203
208
  end
204
- for prime in generator
209
+ generator.each do |prime|
205
210
  count = 0
206
211
  while (value1, mod = value.divmod(prime)
207
- mod) == 0
208
- value = value1
209
- count += 1
212
+ mod) == 0
213
+ value = value1
214
+ count += 1
210
215
  end
211
216
  if count != 0
212
- pv.push [prime, count]
217
+ pv.push [prime, count]
213
218
  end
214
219
  break if value1 <= prime
215
220
  end
216
221
  if value > 1
217
222
  pv.push [value, 1]
218
223
  end
219
- return pv
224
+ pv
220
225
  end
221
226
 
222
227
  # An abstract class for enumerating pseudo-prime numbers.
@@ -256,33 +261,45 @@ unless Prime.const_defined? :OldCompatibility
256
261
  raise NotImplementedError, "need to define `rewind'"
257
262
  end
258
263
 
259
- # Iterates the given block for each prime numbers.
260
- def each(&block)
261
- return self.dup unless block
264
+ # Iterates the given block for each prime number.
265
+ def each
266
+ return self.dup unless block_given?
262
267
  if @ubound
263
- last_value = nil
264
- loop do
265
- prime = succ
266
- break last_value if prime > @ubound
267
- last_value = block.call(prime)
268
- end
268
+ last_value = nil
269
+ loop do
270
+ prime = succ
271
+ break last_value if prime > @ubound
272
+ last_value = yield prime
273
+ end
269
274
  else
270
- loop do
271
- block.call(succ)
272
- end
275
+ loop do
276
+ yield succ
277
+ end
273
278
  end
274
279
  end
275
280
 
276
281
  # see +Enumerator+#with_index.
277
- alias with_index each_with_index
282
+ def with_index(offset = 0)
283
+ return enum_for(:with_index, offset) { Float::INFINITY } unless block_given?
284
+ return each_with_index(&proc) if offset == 0
285
+
286
+ each do |prime|
287
+ yield prime, offset
288
+ offset += 1
289
+ end
290
+ end
278
291
 
279
292
  # see +Enumerator+#with_object.
280
293
  def with_object(obj)
281
- return enum_for(:with_object) unless block_given?
294
+ return enum_for(:with_object, obj) { Float::INFINITY } unless block_given?
282
295
  each do |prime|
283
- yield prime, obj
296
+ yield prime, obj
284
297
  end
285
298
  end
299
+
300
+ def size
301
+ Float::INFINITY
302
+ end
286
303
  end
287
304
 
288
305
  # An implementation of +PseudoPrimeGenerator+.
@@ -290,12 +307,13 @@ unless Prime.const_defined? :OldCompatibility
290
307
  # Uses +EratosthenesSieve+.
291
308
  class EratosthenesGenerator < PseudoPrimeGenerator
292
309
  def initialize
293
- @last_prime = nil
310
+ @last_prime_index = -1
294
311
  super
295
312
  end
296
313
 
297
314
  def succ
298
- @last_prime = @last_prime ? EratosthenesSieve.instance.next_to(@last_prime) : 2
315
+ @last_prime_index += 1
316
+ EratosthenesSieve.instance.get_nth_prime(@last_prime_index)
299
317
  end
300
318
  def rewind
301
319
  initialize
@@ -320,11 +338,11 @@ unless Prime.const_defined? :OldCompatibility
320
338
  alias next succ
321
339
  end
322
340
 
323
- # Generates all integer which are greater than 2 and
324
- # are not divided by 2 nor 3.
341
+ # Generates all integers which are greater than 2 and
342
+ # are not divisible by either 2 or 3.
325
343
  #
326
344
  # This is a pseudo-prime generator, suitable on
327
- # checking primality of a integer by brute force
345
+ # checking primality of an integer by brute force
328
346
  # method.
329
347
  class Generator23<PseudoPrimeGenerator
330
348
  def initialize
@@ -334,19 +352,17 @@ unless Prime.const_defined? :OldCompatibility
334
352
  end
335
353
 
336
354
  def succ
337
- loop do
338
- if (@step)
339
- @prime += @step
340
- @step = 6 - @step
341
- else
342
- case @prime
343
- when 1; @prime = 2
344
- when 2; @prime = 3
345
- when 3; @prime = 5; @step = 2
346
- end
347
- end
348
- return @prime
355
+ if (@step)
356
+ @prime += @step
357
+ @step = 6 - @step
358
+ else
359
+ case @prime
360
+ when 1; @prime = 2
361
+ when 2; @prime = 3
362
+ when 3; @prime = 5; @step = 2
363
+ end
349
364
  end
365
+ @prime
350
366
  end
351
367
  alias next succ
352
368
  def rewind
@@ -354,9 +370,6 @@ unless Prime.const_defined? :OldCompatibility
354
370
  end
355
371
  end
356
372
 
357
-
358
-
359
-
360
373
  # Internal use. An implementation of prime table by trial division method.
361
374
  class TrialDivision
362
375
  include Singleton
@@ -376,7 +389,7 @@ unless Prime.const_defined? :OldCompatibility
376
389
 
377
390
  # Returns the cached prime numbers.
378
391
  def cache
379
- return @primes
392
+ @primes
380
393
  end
381
394
  alias primes cache
382
395
  alias primes_so_far cache
@@ -386,112 +399,68 @@ unless Prime.const_defined? :OldCompatibility
386
399
  # +index+ is a 0-based index.
387
400
  def [](index)
388
401
  while index >= @primes.length
389
- # Only check for prime factors up to the square root of the potential primes,
390
- # but without the performance hit of an actual square root calculation.
391
- if @next_to_check + 4 > @ulticheck_next_squared
392
- @ulticheck_index += 1
393
- @ulticheck_next_squared = @primes.at(@ulticheck_index + 1) ** 2
394
- end
395
- # Only check numbers congruent to one and five, modulo six. All others
396
-
397
- # are divisible by two or three. This also allows us to skip checking against
398
- # two and three.
399
- @primes.push @next_to_check if @primes[2..@ulticheck_index].find {|prime| @next_to_check % prime == 0 }.nil?
400
- @next_to_check += 4
401
- @primes.push @next_to_check if @primes[2..@ulticheck_index].find {|prime| @next_to_check % prime == 0 }.nil?
402
- @next_to_check += 2
402
+ # Only check for prime factors up to the square root of the potential primes,
403
+ # but without the performance hit of an actual square root calculation.
404
+ if @next_to_check + 4 > @ulticheck_next_squared
405
+ @ulticheck_index += 1
406
+ @ulticheck_next_squared = @primes.at(@ulticheck_index + 1) ** 2
407
+ end
408
+ # Only check numbers congruent to one and five, modulo six. All others
409
+
410
+ # are divisible by two or three. This also allows us to skip checking against
411
+ # two and three.
412
+ @primes.push @next_to_check if @primes[2..@ulticheck_index].find {|prime| @next_to_check % prime == 0 }.nil?
413
+ @next_to_check += 4
414
+ @primes.push @next_to_check if @primes[2..@ulticheck_index].find {|prime| @next_to_check % prime == 0 }.nil?
415
+ @next_to_check += 2
403
416
  end
404
- return @primes[index]
417
+ @primes[index]
405
418
  end
406
419
  end
407
420
 
408
- # Internal use. An implementation of eratosthenes's sieve
421
+ # Internal use. An implementation of eratosthenes' sieve
409
422
  class EratosthenesSieve
410
423
  include Singleton
411
424
 
412
- BITS_PER_ENTRY = 16 # each entry is a set of 16-bits in a Fixnum
413
- NUMS_PER_ENTRY = BITS_PER_ENTRY * 2 # twiced because even numbers are omitted
414
- ENTRIES_PER_TABLE = 8
415
- NUMS_PER_TABLE = NUMS_PER_ENTRY * ENTRIES_PER_TABLE
416
- FILLED_ENTRY = (1 << NUMS_PER_ENTRY) - 1
417
-
418
- def initialize # :nodoc:
419
- # bitmap for odd prime numbers less than 256.
420
- # For an arbitrary odd number n, @tables[i][j][k] is
421
- # * 1 if n is prime,
422
- # * 0 if n is composite,
423
- # where i,j,k = indices(n)
424
- @tables = [[0xcb6e, 0x64b4, 0x129a, 0x816d, 0x4c32, 0x864a, 0x820d, 0x2196].freeze]
425
+ def initialize
426
+ @primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101]
427
+ # @max_checked must be an even number
428
+ @max_checked = @primes.last + 1
425
429
  end
426
430
 
427
- # returns the least odd prime number which is greater than +n+.
428
- def next_to(n)
429
- n = (n-1).div(2)*2+3 # the next odd number to given n
430
- table_index, integer_index, bit_index = indices(n)
431
- loop do
432
- extend_table until @tables.length > table_index
433
- for j in integer_index...ENTRIES_PER_TABLE
434
- if !@tables[table_index][j].zero?
435
- for k in bit_index...BITS_PER_ENTRY
436
- return NUMS_PER_TABLE*table_index + NUMS_PER_ENTRY*j + 2*k+1 if !@tables[table_index][j][k].zero?
437
- end
438
- end
439
- bit_index = 0
440
- end
441
- table_index += 1; integer_index = 0
442
- end
431
+ def get_nth_prime(n)
432
+ compute_primes while @primes.size <= n
433
+ @primes[n]
443
434
  end
444
435
 
445
436
  private
446
- # for an odd number +n+, returns (i, j, k) such that @tables[i][j][k] represents primarity of the number
447
- def indices(n)
448
- # binary digits of n: |0|1|2|3|4|5|6|7|8|9|10|11|....
449
- # indices: |-| k | j | i
450
- # because of NUMS_PER_ENTRY, NUMS_PER_TABLE
451
-
452
- k = (n & 0b00011111) >> 1
453
- j = (n & 0b11100000) >> 5
454
- i = n >> 8
455
- return i, j, k
456
- end
457
-
458
- def extend_table
459
- lbound = NUMS_PER_TABLE * @tables.length
460
- ubound = lbound + NUMS_PER_TABLE
461
- new_table = [FILLED_ENTRY] * ENTRIES_PER_TABLE # which represents primarity in lbound...ubound
462
- (3..Integer(Math.sqrt(ubound))).step(2) do |p|
463
- i, j, k = indices(p)
464
- next if @tables[i][j][k].zero?
465
-
466
- start = (lbound.div(p)+1)*p # least multiple of p which is >= lbound
467
- start += p if start.even?
468
- (start...ubound).step(2*p) do |n|
469
- _, j, k = indices(n)
470
- new_table[j] &= FILLED_ENTRY^(1<<k)
471
- end
437
+ def compute_primes
438
+ # max_segment_size must be an even number
439
+ max_segment_size = 1e6.to_i
440
+ max_cached_prime = @primes.last
441
+ # do not double count primes if #compute_primes is interrupted
442
+ # by Timeout.timeout
443
+ @max_checked = max_cached_prime + 1 if max_cached_prime > @max_checked
444
+
445
+ segment_min = @max_checked
446
+ segment_max = [segment_min + max_segment_size, max_cached_prime * 2].min
447
+ root = Integer(Math.sqrt(segment_max).floor)
448
+
449
+ segment = ((segment_min + 1) .. segment_max).step(2).to_a
450
+
451
+ (1..Float::INFINITY).each do |sieving|
452
+ prime = @primes[sieving]
453
+ break if prime > root
454
+ composite_index = (-(segment_min + 1 + prime) / 2) % prime
455
+ while composite_index < segment.size do
456
+ segment[composite_index] = nil
457
+ composite_index += prime
458
+ end
472
459
  end
473
- @tables << new_table.freeze
474
- end
475
- end
476
460
 
477
- # Provides a +Prime+ object with compatibility to Ruby 1.8 when instantiated via +Prime+.+new+.
478
- module OldCompatibility
479
- # Returns the next prime number and forwards internal pointer.
480
- def succ
481
- @generator.succ
482
- end
483
- alias next succ
461
+ @primes.concat(segment.compact!)
484
462
 
485
- # Overwrites Prime#each.
486
- #
487
- # Iterates the given block over all prime numbers. Note that enumeration starts from
488
- # the current position of internal pointer, not rewound.
489
- def each(&block)
490
- return @generator.dup unless block_given?
491
- loop do
492
- yield succ
493
- end
463
+ @max_checked = segment_max
494
464
  end
495
465
  end
496
466
  end
497
- end
@@ -1,3 +1,3 @@
1
1
  module Backports
2
- VERSION = "3.6.7" unless const_defined? :VERSION # the guard is against a redefinition warning that happens on Travis
2
+ VERSION = "3.6.8" unless const_defined? :VERSION # the guard is against a redefinition warning that happens on Travis
3
3
  end
@@ -35,14 +35,14 @@ class AAA_TestBackportGuards < Test::Unit::TestCase
35
35
  EXCLUDE.map!(&:to_sym) if instance_methods.first.is_a?(Symbol)
36
36
 
37
37
  # For some very strange reason, Hash[kvp.flatten] doesn't always work in 1.8.6??
38
- def hash(key_value_pairs)
38
+ def to_hash(key_value_pairs)
39
39
  h = {}
40
40
  key_value_pairs.each{|k,v| h[k] = v}
41
41
  h
42
42
  end
43
43
 
44
44
  def class_signature(klass)
45
- hash(
45
+ to_hash(
46
46
  (klass.instance_methods - EXCLUDE).map{|m| [m, klass.instance_method(m)] } +
47
47
  (klass.methods - EXCLUDE).map{|m| [".#{m}", klass.method(m) ]}
48
48
  )
@@ -62,7 +62,7 @@ class AAA_TestBackportGuards < Test::Unit::TestCase
62
62
  end
63
63
 
64
64
  def digest
65
- hash(
65
+ to_hash(
66
66
  CLASSES.map { |klass| [klass, class_signature(klass)] }
67
67
  )
68
68
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: backports
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.6.7
4
+ version: 3.6.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marc-André Lafortune
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-02 00:00:00.000000000 Z
11
+ date: 2016-02-09 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Essential backports that enable many of the nice features of Ruby 1.8.7
14
14
  up to 2.1.0 for earlier versions.