backports 3.6.0 → 3.6.1
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 +7 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +3 -1
- data/README.rdoc +6 -2
- data/backports.gemspec +1 -1
- data/lib/backports/1.8.7.rb +1 -0
- data/lib/backports/1.8.7/argf.rb +1 -1
- data/lib/backports/1.8.7/argf/each.rb +1 -1
- data/lib/backports/1.8.7/argf/each_byte.rb +1 -1
- data/lib/backports/1.8.7/argf/each_char.rb +1 -1
- data/lib/backports/1.8.7/argf/each_line.rb +1 -1
- data/lib/backports/1.8.7/argf/getbyte.rb +1 -1
- data/lib/backports/1.8.7/argf/readbyte.rb +1 -1
- data/lib/backports/1.8.7/array.rb +1 -1
- data/lib/backports/1.8.7/array/collect.rb +1 -1
- data/lib/backports/1.8.7/array/combination.rb +1 -1
- data/lib/backports/1.8.7/array/cycle.rb +1 -1
- data/lib/backports/1.8.7/array/delete_if.rb +1 -1
- data/lib/backports/1.8.7/array/each.rb +1 -1
- data/lib/backports/1.8.7/array/each_index.rb +1 -1
- data/lib/backports/1.8.7/array/flatten.rb +2 -1
- data/lib/backports/1.8.7/array/index.rb +1 -1
- data/lib/backports/1.8.7/array/map.rb +1 -1
- data/lib/backports/1.8.7/array/permutation.rb +1 -1
- data/lib/backports/1.8.7/array/pop.rb +2 -1
- data/lib/backports/1.8.7/array/product.rb +1 -1
- data/lib/backports/1.8.7/array/reject.rb +1 -1
- data/lib/backports/1.8.7/array/reverse_each.rb +1 -1
- data/lib/backports/1.8.7/array/rindex.rb +1 -1
- data/lib/backports/1.8.7/array/select.rb +1 -1
- data/lib/backports/1.8.7/array/shift.rb +2 -1
- data/lib/backports/1.8.7/binding.rb +1 -1
- data/lib/backports/1.8.7/dir.rb +1 -1
- data/lib/backports/1.8.7/dir/each.rb +1 -1
- data/lib/backports/1.8.7/enumerable.rb +1 -1
- data/lib/backports/1.8.7/enumerable/count.rb +1 -1
- data/lib/backports/1.8.7/enumerable/cycle.rb +1 -1
- data/lib/backports/1.8.7/enumerable/detect.rb +1 -1
- data/lib/backports/1.8.7/enumerable/drop.rb +1 -1
- data/lib/backports/1.8.7/enumerable/each_cons.rb +1 -1
- data/lib/backports/1.8.7/enumerable/each_slice.rb +1 -1
- data/lib/backports/1.8.7/enumerable/each_with_index.rb +1 -1
- data/lib/backports/1.8.7/enumerable/entries.rb +1 -1
- data/lib/backports/1.8.7/enumerable/find.rb +1 -1
- data/lib/backports/1.8.7/enumerable/find_all.rb +1 -1
- data/lib/backports/1.8.7/enumerable/find_index.rb +1 -1
- data/lib/backports/1.8.7/enumerable/first.rb +1 -1
- data/lib/backports/1.8.7/enumerable/inject.rb +2 -1
- data/lib/backports/1.8.7/enumerable/max_by.rb +1 -1
- data/lib/backports/1.8.7/enumerable/min_by.rb +1 -1
- data/lib/backports/1.8.7/enumerable/minmax.rb +1 -1
- data/lib/backports/1.8.7/enumerable/minmax_by.rb +1 -1
- data/lib/backports/1.8.7/enumerable/partition.rb +1 -1
- data/lib/backports/1.8.7/enumerable/reject.rb +1 -1
- data/lib/backports/1.8.7/enumerable/select.rb +1 -1
- data/lib/backports/1.8.7/enumerable/sort_by.rb +1 -1
- data/lib/backports/1.8.7/enumerable/to_a.rb +1 -1
- data/lib/backports/1.8.7/enumerator.rb +1 -1
- data/lib/backports/1.8.7/enumerator/each.rb +1 -1
- data/lib/backports/1.8.7/env.rb +1 -1
- data/lib/backports/1.8.7/env/delete_if.rb +1 -1
- data/lib/backports/1.8.7/env/each.rb +1 -1
- data/lib/backports/1.8.7/env/each_key.rb +1 -1
- data/lib/backports/1.8.7/env/each_pair.rb +1 -1
- data/lib/backports/1.8.7/env/each_value.rb +1 -1
- data/lib/backports/1.8.7/env/reject.rb +1 -1
- data/lib/backports/1.8.7/env/select.rb +1 -1
- data/lib/backports/1.8.7/fixnum.rb +1 -1
- data/lib/backports/1.8.7/float.rb +1 -1
- data/lib/backports/1.8.7/gc.rb +1 -1
- data/lib/backports/1.8.7/hash.rb +1 -1
- data/lib/backports/1.8.7/hash/constructor.rb +1 -1
- data/lib/backports/1.8.7/hash/delete_if.rb +1 -1
- data/lib/backports/1.8.7/hash/each.rb +1 -1
- data/lib/backports/1.8.7/hash/each_key.rb +1 -1
- data/lib/backports/1.8.7/hash/each_pair.rb +1 -1
- data/lib/backports/1.8.7/hash/each_value.rb +1 -1
- data/lib/backports/1.8.7/hash/reject.rb +1 -1
- data/lib/backports/1.8.7/hash/select.rb +1 -1
- data/lib/backports/1.8.7/integer.rb +1 -1
- data/lib/backports/1.8.7/integer/downto.rb +1 -1
- data/lib/backports/1.8.7/integer/times.rb +1 -1
- data/lib/backports/1.8.7/integer/upto.rb +1 -1
- data/lib/backports/1.8.7/io.rb +1 -1
- data/lib/backports/1.8.7/io/each.rb +1 -1
- data/lib/backports/1.8.7/io/each_byte.rb +1 -1
- data/lib/backports/1.8.7/io/each_line.rb +1 -1
- data/lib/backports/1.8.7/io/foreach.rb +1 -1
- data/lib/backports/1.8.7/io/getbyte.rb +1 -1
- data/lib/backports/1.8.7/io/readbyte.rb +1 -1
- data/lib/backports/1.8.7/kernel.rb +1 -1
- data/lib/backports/1.8.7/method.rb +1 -1
- data/lib/backports/1.8.7/method/name.rb +1 -1
- data/lib/backports/1.8.7/module.rb +1 -1
- data/lib/backports/1.8.7/module/module_exec.rb +1 -1
- data/lib/backports/1.8.7/numeric.rb +1 -1
- data/lib/backports/1.8.7/numeric/step.rb +1 -1
- data/lib/backports/1.8.7/object_space.rb +1 -1
- data/lib/backports/1.8.7/object_space/each_object.rb +1 -1
- data/lib/backports/1.8.7/process.rb +1 -1
- data/lib/backports/1.8.7/range.rb +1 -1
- data/lib/backports/1.8.7/range/each.rb +1 -1
- data/lib/backports/1.8.7/range/step.rb +1 -1
- data/lib/backports/1.8.7/regexp.rb +1 -1
- data/lib/backports/1.8.7/regexp/union.rb +1 -1
- data/lib/backports/1.8.7/stop_iteration.rb +2 -2
- data/lib/backports/1.8.7/string.rb +1 -1
- data/lib/backports/1.8.7/string/bytesize.rb +1 -1
- data/lib/backports/1.8.7/string/each.rb +1 -1
- data/lib/backports/1.8.7/string/each_byte.rb +1 -1
- data/lib/backports/1.8.7/string/each_char.rb +1 -1
- data/lib/backports/1.8.7/string/each_line.rb +1 -1
- data/lib/backports/1.8.7/string/partition.rb +2 -1
- data/lib/backports/1.8.7/string/rpartition.rb +1 -1
- data/lib/backports/1.8.7/string/upto.rb +1 -1
- data/lib/backports/1.8.7/struct.rb +1 -1
- data/lib/backports/1.8.7/struct/each.rb +1 -1
- data/lib/backports/1.8.7/struct/each_pair.rb +1 -1
- data/lib/backports/1.8.7/symbol.rb +1 -1
- data/lib/backports/1.9.1/array.rb +1 -1
- data/lib/backports/1.9.1/array/sample.rb +1 -1
- data/lib/backports/1.9.1/array/try_convert.rb +1 -1
- data/lib/backports/1.9.1/dir.rb +1 -1
- data/lib/backports/1.9.1/dir/to_path.rb +1 -1
- data/lib/backports/1.9.1/enumerable.rb +1 -1
- data/lib/backports/1.9.1/enumerable/each_with_index.rb +1 -1
- data/lib/backports/1.9.1/enumerator.rb +1 -1
- data/lib/backports/1.9.1/enumerator/new.rb +1 -1
- data/lib/backports/1.9.1/enumerator/with_object.rb +1 -1
- data/lib/backports/1.9.1/env.rb +1 -1
- data/lib/backports/1.9.1/env/key.rb +1 -1
- data/lib/backports/1.9.1/file.rb +1 -1
- data/lib/backports/1.9.1/file/atime.rb +1 -1
- data/lib/backports/1.9.1/file/basename.rb +1 -1
- data/lib/backports/1.9.1/file/blockdev.rb +1 -1
- data/lib/backports/1.9.1/file/chardev.rb +1 -1
- data/lib/backports/1.9.1/file/chmod.rb +1 -1
- data/lib/backports/1.9.1/file/chown.rb +1 -1
- data/lib/backports/1.9.1/file/ctime.rb +1 -1
- data/lib/backports/1.9.1/file/delete.rb +1 -1
- data/lib/backports/1.9.1/file/directory.rb +1 -1
- data/lib/backports/1.9.1/file/dirname.rb +1 -1
- data/lib/backports/1.9.1/file/executable.rb +1 -1
- data/lib/backports/1.9.1/file/executable_real.rb +1 -1
- data/lib/backports/1.9.1/file/exist.rb +1 -1
- data/lib/backports/1.9.1/file/exists.rb +1 -1
- data/lib/backports/1.9.1/file/expand_path.rb +1 -1
- data/lib/backports/1.9.1/file/extname.rb +1 -1
- data/lib/backports/1.9.1/file/file.rb +1 -1
- data/lib/backports/1.9.1/file/ftype.rb +1 -1
- data/lib/backports/1.9.1/file/grpowned.rb +1 -1
- data/lib/backports/1.9.1/file/join.rb +1 -1
- data/lib/backports/1.9.1/file/lchmod.rb +1 -1
- data/lib/backports/1.9.1/file/lchown.rb +1 -1
- data/lib/backports/1.9.1/file/link.rb +1 -1
- data/lib/backports/1.9.1/file/lstat.rb +1 -1
- data/lib/backports/1.9.1/file/mtime.rb +1 -1
- data/lib/backports/1.9.1/file/new.rb +1 -1
- data/lib/backports/1.9.1/file/open.rb +3 -2
- data/lib/backports/1.9.1/file/owned.rb +1 -1
- data/lib/backports/1.9.1/file/pipe.rb +1 -1
- data/lib/backports/1.9.1/file/readable.rb +1 -1
- data/lib/backports/1.9.1/file/readable_real.rb +1 -1
- data/lib/backports/1.9.1/file/readlink.rb +1 -1
- data/lib/backports/1.9.1/file/rename.rb +1 -1
- data/lib/backports/1.9.1/file/setgid.rb +1 -1
- data/lib/backports/1.9.1/file/setuid.rb +1 -1
- data/lib/backports/1.9.1/file/size.rb +1 -1
- data/lib/backports/1.9.1/file/socket.rb +1 -1
- data/lib/backports/1.9.1/file/split.rb +1 -1
- data/lib/backports/1.9.1/file/stat.rb +1 -1
- data/lib/backports/1.9.1/file/sticky.rb +1 -1
- data/lib/backports/1.9.1/file/symlink.rb +1 -1
- data/lib/backports/1.9.1/file/to_path.rb +1 -1
- data/lib/backports/1.9.1/file/truncate.rb +1 -1
- data/lib/backports/1.9.1/file/unlink.rb +1 -1
- data/lib/backports/1.9.1/file/writable.rb +1 -1
- data/lib/backports/1.9.1/file/writable_real.rb +1 -1
- data/lib/backports/1.9.1/file/zero.rb +1 -1
- data/lib/backports/1.9.1/float.rb +1 -1
- data/lib/backports/1.9.1/float/round.rb +2 -1
- data/lib/backports/1.9.1/hash.rb +1 -1
- data/lib/backports/1.9.1/hash/default_proc.rb +1 -1
- data/lib/backports/1.9.1/hash/key.rb +1 -1
- data/lib/backports/1.9.1/hash/try_convert.rb +1 -1
- data/lib/backports/1.9.1/integer.rb +1 -1
- data/lib/backports/1.9.1/integer/magnitude.rb +1 -1
- data/lib/backports/1.9.1/integer/round.rb +2 -1
- data/lib/backports/1.9.1/io.rb +1 -1
- data/lib/backports/1.9.1/io/binread.rb +1 -1
- data/lib/backports/1.9.1/io/open.rb +4 -2
- data/lib/backports/1.9.1/io/try_convert.rb +1 -1
- data/lib/backports/1.9.1/io/ungetbyte.rb +1 -1
- data/lib/backports/1.9.1/kernel.rb +1 -1
- data/lib/backports/1.9.1/kernel/require_relative.rb +1 -1
- data/lib/backports/1.9.1/math.rb +1 -1
- data/lib/backports/1.9.1/math/log.rb +2 -1
- data/lib/backports/1.9.1/numeric.rb +1 -1
- data/lib/backports/1.9.1/numeric/round.rb +2 -1
- data/lib/backports/1.9.1/proc.rb +1 -1
- data/lib/backports/1.9.1/proc/lambda.rb +1 -1
- data/lib/backports/1.9.1/proc/yield.rb +1 -1
- data/lib/backports/1.9.1/range.rb +1 -1
- data/lib/backports/1.9.1/range/cover.rb +1 -1
- data/lib/backports/1.9.1/regexp.rb +1 -1
- data/lib/backports/1.9.1/regexp/try_convert.rb +1 -1
- data/lib/backports/1.9.1/string.rb +1 -1
- data/lib/backports/1.9.1/string/each_codepoint.rb +1 -1
- data/lib/backports/1.9.1/string/getbyte.rb +1 -1
- data/lib/backports/1.9.1/string/setbyte.rb +1 -1
- data/lib/backports/1.9.1/string/try_convert.rb +1 -1
- data/lib/backports/1.9.1/symbol.rb +1 -1
- data/lib/backports/1.9.2/array.rb +1 -1
- data/lib/backports/1.9.2/array/product.rb +2 -1
- data/lib/backports/1.9.2/array/repeated_combination.rb +1 -1
- data/lib/backports/1.9.2/array/repeated_permutation.rb +1 -1
- data/lib/backports/1.9.2/array/rotate.rb +1 -1
- data/lib/backports/1.9.2/array/uniq.rb +2 -2
- data/lib/backports/1.9.2/complex.rb +1 -1
- data/lib/backports/1.9.2/dir.rb +1 -1
- data/lib/backports/1.9.2/enumerable.rb +1 -1
- data/lib/backports/1.9.2/enumerable/slice_before.rb +1 -1
- data/lib/backports/1.9.2/float.rb +1 -1
- data/lib/backports/1.9.2/hash.rb +1 -1
- data/lib/backports/1.9.2/kernel.rb +1 -1
- data/lib/backports/1.9.2/random.rb +1 -1
- data/lib/backports/1.9.3/file.rb +1 -1
- data/lib/backports/1.9.3/io.rb +1 -1
- data/lib/backports/1.9.3/io/advise.rb +1 -1
- data/lib/backports/1.9.3/io/binwrite.rb +1 -1
- data/lib/backports/1.9.3/io/write.rb +1 -1
- data/lib/backports/1.9.3/string.rb +1 -1
- data/lib/backports/1.9.3/string/byteslice.rb +1 -1
- data/lib/backports/1.9.3/string/prepend.rb +1 -1
- data/lib/backports/2.0.0/array.rb +1 -1
- data/lib/backports/2.0.0/enumerable.rb +1 -1
- data/lib/backports/2.0.0/enumerable/lazy.rb +1 -1
- data/lib/backports/2.0.0/enumerator.rb +1 -1
- data/lib/backports/2.0.0/env.rb +1 -1
- data/lib/backports/2.0.0/hash.rb +1 -1
- data/lib/backports/2.0.0/hash/default_proc.rb +1 -1
- data/lib/backports/2.0.0/nil.rb +1 -1
- data/lib/backports/2.0.0/range.rb +1 -1
- data/lib/backports/2.0.0/struct.rb +1 -1
- data/lib/backports/2.1.0/array.rb +1 -1
- data/lib/backports/2.1.0/bignum.rb +1 -1
- data/lib/backports/2.1.0/enumerable.rb +1 -1
- data/lib/backports/2.1.0/enumerable/to_h.rb +1 -1
- data/lib/backports/2.1.0/fixnum.rb +1 -1
- data/lib/backports/2.1.0/module.rb +1 -1
- data/lib/backports/force/enumerable_map.rb +1 -0
- data/lib/backports/force/hash_select.rb +1 -0
- data/lib/backports/random/MT19937.rb +78 -0
- data/lib/backports/random/bits_and_bytes.rb +93 -0
- data/lib/backports/random/implementation.rb +94 -0
- data/lib/backports/random/load.rb +17 -0
- data/lib/backports/std_lib.rb +24 -0
- data/lib/backports/tools.rb +2 -357
- data/lib/backports/tools/alias_method.rb +8 -0
- data/lib/backports/tools/alias_method_chain.rb +26 -0
- data/lib/backports/tools/arguments.rb +69 -0
- data/lib/backports/tools/extreme_object.rb +12 -0
- data/lib/backports/tools/io.rb +57 -0
- data/lib/backports/tools/make_block_optional.rb +43 -0
- data/lib/backports/tools/path.rb +55 -0
- data/lib/backports/tools/require_relative_dir.rb +13 -0
- data/lib/backports/tools/std_lib.rb +59 -0
- data/lib/backports/tools/suppress_verbose_warnings.rb +9 -0
- data/lib/backports/version.rb +1 -1
- data/spec/tags/1.8.7/core/module/include_spec.rb +3 -0
- metadata +45 -52
- data/lib/backports/extra/random/MT19937.rb +0 -76
- data/lib/backports/extra/random/bits_and_bytes.rb +0 -91
- data/lib/backports/extra/random/implementation.rb +0 -93
- data/lib/backports/extra/random/load.rb +0 -17
@@ -0,0 +1,78 @@
|
|
1
|
+
module Backports
|
2
|
+
class Random
|
3
|
+
# An implementation of Mersenne Twister MT19937 in Ruby
|
4
|
+
class MT19937
|
5
|
+
STATE_SIZE = 624
|
6
|
+
LAST_STATE = STATE_SIZE - 1
|
7
|
+
PAD_32_BITS = 0xffffffff
|
8
|
+
|
9
|
+
# See seed=
|
10
|
+
def initialize(seed)
|
11
|
+
self.seed = seed
|
12
|
+
end
|
13
|
+
|
14
|
+
LAST_31_BITS = 0x7fffffff
|
15
|
+
OFFSET = 397
|
16
|
+
|
17
|
+
# Generates a completely new state out of the previous one.
|
18
|
+
def next_state
|
19
|
+
STATE_SIZE.times do |i|
|
20
|
+
mix = @state[i] & 0x80000000 | @state[i+1 - STATE_SIZE] & 0x7fffffff
|
21
|
+
@state[i] = @state[i+OFFSET - STATE_SIZE] ^ (mix >> 1)
|
22
|
+
@state[i] ^= 0x9908b0df if mix.odd?
|
23
|
+
end
|
24
|
+
@last_read = -1
|
25
|
+
end
|
26
|
+
|
27
|
+
# Seed must be either an Integer (only the first 32 bits will be used)
|
28
|
+
# or an Array of Integers (of which only the first 32 bits will be used)
|
29
|
+
#
|
30
|
+
# No conversion or type checking is done at this level
|
31
|
+
def seed=(seed)
|
32
|
+
case seed
|
33
|
+
when Integer
|
34
|
+
@state = Array.new(STATE_SIZE)
|
35
|
+
@state[0] = seed & PAD_32_BITS
|
36
|
+
(1..LAST_STATE).each do |i|
|
37
|
+
@state[i] = (1812433253 * (@state[i-1] ^ @state[i-1]>>30) + i)& PAD_32_BITS
|
38
|
+
end
|
39
|
+
@last_read = LAST_STATE
|
40
|
+
when Array
|
41
|
+
self.seed = 19650218
|
42
|
+
i=1
|
43
|
+
j=0
|
44
|
+
[STATE_SIZE, seed.size].max.times do
|
45
|
+
@state[i] = (@state[i] ^ (@state[i-1] ^ @state[i-1]>>30) * 1664525) + j + seed[j] & PAD_32_BITS
|
46
|
+
if (i+=1) >= STATE_SIZE
|
47
|
+
@state[0] = @state[-1]
|
48
|
+
i = 1
|
49
|
+
end
|
50
|
+
j = 0 if (j+=1) >= seed.size
|
51
|
+
end
|
52
|
+
(STATE_SIZE-1).times do
|
53
|
+
@state[i] = (@state[i] ^ (@state[i-1] ^ @state[i-1]>>30) * 1566083941) - i & PAD_32_BITS
|
54
|
+
if (i+=1) >= STATE_SIZE
|
55
|
+
@state[0] = @state[-1]
|
56
|
+
i = 1
|
57
|
+
end
|
58
|
+
end
|
59
|
+
@state[0] = 0x80000000
|
60
|
+
else
|
61
|
+
raise ArgumentError, "Seed must be an Integer or an Array"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Returns a random Integer from the range 0 ... (1 << 32)
|
66
|
+
def random_32_bits
|
67
|
+
next_state if @last_read >= LAST_STATE
|
68
|
+
@last_read += 1
|
69
|
+
y = @state[@last_read]
|
70
|
+
# Tempering
|
71
|
+
y ^= (y >> 11)
|
72
|
+
y ^= (y << 7) & 0x9d2c5680
|
73
|
+
y ^= (y << 15) & 0xefc60000
|
74
|
+
y ^= (y >> 18)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module Backports
|
2
|
+
class Random
|
3
|
+
# Supplement the MT19937 class with methods to do
|
4
|
+
# conversions the same way as MRI.
|
5
|
+
# No argument checking is done here either.
|
6
|
+
|
7
|
+
class MT19937
|
8
|
+
FLOAT_FACTOR = 1.0/9007199254740992.0
|
9
|
+
# generates a random number on [0,1) with 53-bit resolution
|
10
|
+
def random_float
|
11
|
+
((random_32_bits >> 5) * 67108864.0 + (random_32_bits >> 6)) * FLOAT_FACTOR;
|
12
|
+
end
|
13
|
+
|
14
|
+
# Returns an integer within 0...upto
|
15
|
+
def random_integer(upto)
|
16
|
+
n = upto - 1
|
17
|
+
nb_full_32 = 0
|
18
|
+
while n > PAD_32_BITS
|
19
|
+
n >>= 32
|
20
|
+
nb_full_32 += 1
|
21
|
+
end
|
22
|
+
mask = mask_32_bits(n)
|
23
|
+
begin
|
24
|
+
rand = random_32_bits & mask
|
25
|
+
nb_full_32.times do
|
26
|
+
rand <<= 32
|
27
|
+
rand |= random_32_bits
|
28
|
+
end
|
29
|
+
end until rand < upto
|
30
|
+
rand
|
31
|
+
end
|
32
|
+
|
33
|
+
def random_bytes(nb)
|
34
|
+
nb_32_bits = (nb + 3) / 4
|
35
|
+
random = nb_32_bits.times.map { random_32_bits }
|
36
|
+
random.pack("L" * nb_32_bits)[0, nb]
|
37
|
+
end
|
38
|
+
|
39
|
+
def state_as_bignum
|
40
|
+
b = 0
|
41
|
+
@state.each_with_index do |val, i|
|
42
|
+
b |= val << (32 * i)
|
43
|
+
end
|
44
|
+
b
|
45
|
+
end
|
46
|
+
|
47
|
+
def left # It's actually the number of words left + 1, as per MRI...
|
48
|
+
MT19937::STATE_SIZE - @last_read
|
49
|
+
end
|
50
|
+
|
51
|
+
def marshal_dump
|
52
|
+
[state_as_bignum, left]
|
53
|
+
end
|
54
|
+
|
55
|
+
def marshal_load(ary)
|
56
|
+
b, left = ary
|
57
|
+
@last_read = MT19937::STATE_SIZE - left
|
58
|
+
@state = Array.new(STATE_SIZE)
|
59
|
+
STATE_SIZE.times do |i|
|
60
|
+
@state[i] = b & PAD_32_BITS
|
61
|
+
b >>= 32
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Convert an Integer seed of arbitrary size to either a single 32 bit integer, or an Array of 32 bit integers
|
66
|
+
def self.convert_seed(seed)
|
67
|
+
seed = seed.abs
|
68
|
+
long_values = []
|
69
|
+
begin
|
70
|
+
long_values << (seed & PAD_32_BITS)
|
71
|
+
seed >>= 32
|
72
|
+
end until seed == 0
|
73
|
+
|
74
|
+
long_values.pop if long_values[-1] == 1 && long_values.size > 1 # Done to allow any kind of sequence of integers
|
75
|
+
|
76
|
+
long_values.size > 1 ? long_values : long_values.first
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.[](seed)
|
80
|
+
new(convert_seed(seed))
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
MASK_BY = [1,2,4,8,16]
|
85
|
+
def mask_32_bits(n)
|
86
|
+
MASK_BY.each do |shift|
|
87
|
+
n |= n >> shift
|
88
|
+
end
|
89
|
+
n
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require "backports/tools/arguments"
|
2
|
+
require "backports/random/MT19937"
|
3
|
+
require "backports/random/bits_and_bytes"
|
4
|
+
|
5
|
+
module Backports
|
6
|
+
class Random
|
7
|
+
# Implementation corresponding to the actual Random class of Ruby
|
8
|
+
# The actual random generator (mersenne twister) is in MT19937.
|
9
|
+
# Ruby specific conversions are handled in bits_and_bytes.
|
10
|
+
# The high level stuff (argument checking) is done here.
|
11
|
+
#
|
12
|
+
module Implementation
|
13
|
+
attr_reader :seed
|
14
|
+
|
15
|
+
def initialize(seed = 0)
|
16
|
+
super()
|
17
|
+
srand(seed)
|
18
|
+
end
|
19
|
+
|
20
|
+
def srand(new_seed = 0)
|
21
|
+
new_seed = Backports.coerce_to_int(new_seed)
|
22
|
+
old, @seed = @seed, new_seed.nonzero? || Random.new_seed
|
23
|
+
@mt = MT19937[ @seed ]
|
24
|
+
old
|
25
|
+
end
|
26
|
+
|
27
|
+
def rand(limit = Backports::Undefined)
|
28
|
+
case limit
|
29
|
+
when Backports::Undefined
|
30
|
+
@mt.random_float
|
31
|
+
when Float
|
32
|
+
limit * @mt.random_float unless limit <= 0
|
33
|
+
when Range
|
34
|
+
_rand_range(limit)
|
35
|
+
else
|
36
|
+
limit = Backports.coerce_to_int(limit)
|
37
|
+
@mt.random_integer(limit) unless limit <= 0
|
38
|
+
end || raise(ArgumentError, "invalid argument #{limit}")
|
39
|
+
end
|
40
|
+
|
41
|
+
def bytes(nb)
|
42
|
+
nb = Backports.coerce_to_int(nb)
|
43
|
+
raise ArgumentError, "negative size" if nb < 0
|
44
|
+
@mt.random_bytes(nb)
|
45
|
+
end
|
46
|
+
|
47
|
+
def ==(other)
|
48
|
+
other.is_a?(Random) &&
|
49
|
+
seed == other.seed &&
|
50
|
+
left == other.send(:left) &&
|
51
|
+
state == other.send(:state)
|
52
|
+
end
|
53
|
+
|
54
|
+
def marshal_dump
|
55
|
+
@mt.marshal_dump << @seed
|
56
|
+
end
|
57
|
+
|
58
|
+
def marshal_load(ary)
|
59
|
+
@seed = ary.pop
|
60
|
+
@mt = MT19937.allocate
|
61
|
+
@mt.marshal_load(ary)
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
def state
|
66
|
+
@mt.state_as_bignum
|
67
|
+
end
|
68
|
+
|
69
|
+
def left
|
70
|
+
@mt.left
|
71
|
+
end
|
72
|
+
|
73
|
+
def _rand_range(limit)
|
74
|
+
range = limit.end - limit.begin
|
75
|
+
if (!range.is_a?(Float)) && range.respond_to?(:to_int) && range = Backports.coerce_to_int(range)
|
76
|
+
range += 1 unless limit.exclude_end?
|
77
|
+
limit.begin + @mt.random_integer(range) unless range <= 0
|
78
|
+
elsif range = Backports.coerce_to(range, Float, :to_f)
|
79
|
+
if range < 0
|
80
|
+
nil
|
81
|
+
elsif limit.exclude_end?
|
82
|
+
limit.begin + @mt.random_float * range unless range <= 0
|
83
|
+
else
|
84
|
+
# cheat a bit... this will reduce the nb of random bits
|
85
|
+
loop do
|
86
|
+
r = @mt.random_float * range * 1.0001
|
87
|
+
break limit.begin + r unless r > range
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "backports/random/implementation"
|
2
|
+
|
3
|
+
class Random
|
4
|
+
include Backports::Random::Implementation
|
5
|
+
extend Backports::Random::Implementation
|
6
|
+
|
7
|
+
def self.new_seed
|
8
|
+
Kernel::srand # use the built-in seed generator
|
9
|
+
Kernel::srand # return the generated seed
|
10
|
+
end
|
11
|
+
|
12
|
+
def inspect
|
13
|
+
"#<#{self.class.name}:#{object_id}>"
|
14
|
+
end
|
15
|
+
|
16
|
+
srand
|
17
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Will intercept future and past 'require' calls of std_lib
|
2
|
+
# and load additionally the updated libraries.
|
3
|
+
require 'backports/tools/std_lib'
|
4
|
+
require 'backports/tools/alias_method_chain'
|
5
|
+
|
6
|
+
module Kernel
|
7
|
+
def require_with_backports(lib)
|
8
|
+
begin
|
9
|
+
return false unless require_without_backports(lib)
|
10
|
+
paths = Backports::StdLib.extended_lib.fetch(lib, nil)
|
11
|
+
rescue LoadError
|
12
|
+
return false if Backports::StdLib::LoadedFeatures.new.include?(lib)
|
13
|
+
raise unless paths = Backports::StdLib.extended_lib.fetch(lib, nil)
|
14
|
+
Backports::StdLib::LoadedFeatures.mark_as_loaded(lib)
|
15
|
+
end
|
16
|
+
if paths
|
17
|
+
paths.each do |path|
|
18
|
+
require_without_backports(path)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
true
|
22
|
+
end
|
23
|
+
Backports.alias_method_chain self, :require, :backports
|
24
|
+
end
|
data/lib/backports/tools.rb
CHANGED
@@ -1,358 +1,3 @@
|
|
1
1
|
# Methods used internally by the backports.
|
2
|
-
|
3
|
-
|
4
|
-
class << MOST_EXTREME_OBJECT_EVER
|
5
|
-
def < (whatever)
|
6
|
-
true
|
7
|
-
end
|
8
|
-
|
9
|
-
def > (whatever)
|
10
|
-
true
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.require_relative_dir
|
15
|
-
dir = caller.first.split(/\.rb:\d/,2).first
|
16
|
-
short_path = dir[/.*(backports\/.*)/, 1] << '/'
|
17
|
-
Dir.entries(dir).
|
18
|
-
map{|f| Regexp.last_match(1) if /^(.*)\.rb$/ =~ f}.
|
19
|
-
compact.
|
20
|
-
sort.
|
21
|
-
each do |f|
|
22
|
-
require short_path + f
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
module StdLib
|
27
|
-
class LoadedFeatures
|
28
|
-
if RUBY_VERSION >= "1.9"
|
29
|
-
# Full paths are recorded in $LOADED_FEATURES.
|
30
|
-
@@our_loads = {}
|
31
|
-
# Check loaded features for one that matches "#{any of the load path}/#{feature}"
|
32
|
-
def include?(feature)
|
33
|
-
return true if @@our_loads[feature]
|
34
|
-
# Assume backported features are Ruby libraries (i.e. not C)
|
35
|
-
@loaded ||= $LOADED_FEATURES.group_by{|p| File.basename(p, ".rb")}
|
36
|
-
if fullpaths = @loaded[File.basename(feature, ".rb")]
|
37
|
-
fullpaths.any?{|fullpath|
|
38
|
-
base_dir, = fullpath.partition("/#{feature}")
|
39
|
-
$LOAD_PATH.include?(base_dir)
|
40
|
-
}
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def self.mark_as_loaded(feature)
|
45
|
-
@@our_loads[feature] = true
|
46
|
-
# Nothing to do, the full path will be OK
|
47
|
-
end
|
48
|
-
|
49
|
-
else
|
50
|
-
# Requested features are recorded in $LOADED_FEATURES
|
51
|
-
def include?(feature)
|
52
|
-
# Assume backported features are Ruby libraries (i.e. not C)
|
53
|
-
$LOADED_FEATURES.include?("#{File.basename(feature, '.rb')}.rb")
|
54
|
-
end
|
55
|
-
|
56
|
-
def self.mark_as_loaded(feature)
|
57
|
-
$LOADED_FEATURES << "#{File.basename(feature, '.rb')}.rb"
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
class << self
|
63
|
-
attr_accessor :extended_lib
|
64
|
-
|
65
|
-
def extend_relative relative_dir="stdlib"
|
66
|
-
loaded = Backports::StdLib::LoadedFeatures.new
|
67
|
-
dir = File.expand_path(relative_dir, File.dirname(caller.first.split(/:\d/,2).first))
|
68
|
-
Dir.entries(dir).
|
69
|
-
map{|f| Regexp.last_match(1) if /^(.*)\.rb$/ =~ f}.
|
70
|
-
compact.
|
71
|
-
each do |f|
|
72
|
-
path = File.expand_path(f, dir)
|
73
|
-
if loaded.include?(f)
|
74
|
-
require path
|
75
|
-
else
|
76
|
-
@extended_lib[f] << path
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
self.extended_lib ||= Hash.new{|h, k| h[k] = []}
|
82
|
-
end
|
83
|
-
|
84
|
-
# Metaprogramming utility to make block optional.
|
85
|
-
# Tests first if block is already optional when given options
|
86
|
-
def self.make_block_optional(mod, *methods)
|
87
|
-
mod = class << mod; self; end unless mod.is_a? Module
|
88
|
-
options = methods.last.is_a?(Hash) ? methods.pop : {}
|
89
|
-
methods.each do |selector|
|
90
|
-
unless mod.method_defined? selector
|
91
|
-
warn "#{mod}##{selector} is not defined, so block can't be made optional"
|
92
|
-
next
|
93
|
-
end
|
94
|
-
unless options[:force]
|
95
|
-
# Check if needed
|
96
|
-
test_on = options.fetch(:test_on)
|
97
|
-
result = begin
|
98
|
-
test_on.send(selector, *options.fetch(:arg, []))
|
99
|
-
rescue LocalJumpError
|
100
|
-
false
|
101
|
-
end
|
102
|
-
next if result.class.name =~ /Enumerator$/
|
103
|
-
end
|
104
|
-
require 'enumerator'
|
105
|
-
arity = mod.instance_method(selector).arity
|
106
|
-
last_arg = []
|
107
|
-
if arity < 0
|
108
|
-
last_arg = ["*rest"]
|
109
|
-
arity = -1-arity
|
110
|
-
end
|
111
|
-
arg_sequence = ((0...arity).map{|i| "arg_#{i}"} + last_arg + ["&block"]).join(", ")
|
112
|
-
|
113
|
-
alias_method_chain(mod, selector, :optional_block) do |aliased_target, punctuation|
|
114
|
-
mod.module_eval <<-end_eval, __FILE__, __LINE__ + 1
|
115
|
-
def #{aliased_target}_with_optional_block#{punctuation}(#{arg_sequence})
|
116
|
-
return to_enum(:#{aliased_target}_without_optional_block#{punctuation}, #{arg_sequence}) unless block_given?
|
117
|
-
#{aliased_target}_without_optional_block#{punctuation}(#{arg_sequence})
|
118
|
-
end
|
119
|
-
end_eval
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
# Metaprogramming utility to convert the first file argument to path
|
125
|
-
def self.convert_first_argument_to_path(klass, selector)
|
126
|
-
mod = class << klass; self; end
|
127
|
-
unless mod.method_defined? selector
|
128
|
-
warn "#{mod}##{selector} is not defined, so argument can't converted to path"
|
129
|
-
return
|
130
|
-
end
|
131
|
-
arity = mod.instance_method(selector).arity
|
132
|
-
last_arg = []
|
133
|
-
if arity < 0
|
134
|
-
last_arg = ["*rest"]
|
135
|
-
arity = -1-arity
|
136
|
-
end
|
137
|
-
arg_sequence = (["file"] + (1...arity).map{|i| "arg_#{i}"} + last_arg + ["&block"]).join(", ")
|
138
|
-
|
139
|
-
alias_method_chain(mod, selector, :potential_path_argument) do |aliased_target, punctuation|
|
140
|
-
mod.module_eval <<-end_eval, __FILE__, __LINE__ + 1
|
141
|
-
def #{aliased_target}_with_potential_path_argument#{punctuation}(#{arg_sequence})
|
142
|
-
file = Backports.convert_path(file)
|
143
|
-
#{aliased_target}_without_potential_path_argument#{punctuation}(#{arg_sequence})
|
144
|
-
end
|
145
|
-
end_eval
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
# Metaprogramming utility to convert all file arguments to paths
|
150
|
-
def self.convert_all_arguments_to_path(klass, selector, skip)
|
151
|
-
mod = class << klass; self; end
|
152
|
-
unless mod.method_defined? selector
|
153
|
-
warn "#{mod}##{selector} is not defined, so arguments can't converted to path"
|
154
|
-
return
|
155
|
-
end
|
156
|
-
first_args = (1..skip).map{|i| "arg_#{i}"}.join(",") + (skip > 0 ? "," : "")
|
157
|
-
alias_method_chain(mod, selector, :potential_path_arguments) do |aliased_target, punctuation|
|
158
|
-
mod.module_eval <<-end_eval, __FILE__, __LINE__ + 1
|
159
|
-
def #{aliased_target}_with_potential_path_arguments#{punctuation}(#{first_args}*files, &block)
|
160
|
-
files = files.map{|f| Backports.convert_path(f) }
|
161
|
-
#{aliased_target}_without_potential_path_arguments#{punctuation}(#{first_args}*files, &block)
|
162
|
-
end
|
163
|
-
end_eval
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
def self.convert_path(path)
|
168
|
-
try_convert(path, IO, :to_io) ||
|
169
|
-
begin
|
170
|
-
path = path.to_path if path.respond_to?(:to_path)
|
171
|
-
try_convert(path, String, :to_str) || path
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
# Modified to avoid polluting Module if so desired
|
176
|
-
# (from Rails)
|
177
|
-
def self.alias_method_chain(mod, target, feature)
|
178
|
-
mod.class_eval do
|
179
|
-
# Strip out punctuation on predicates or bang methods since
|
180
|
-
# e.g. target?_without_feature is not a valid method name.
|
181
|
-
aliased_target, punctuation = target.to_s.sub(/([?!=])$/, ''), $1
|
182
|
-
yield(aliased_target, punctuation) if block_given?
|
183
|
-
|
184
|
-
with_method, without_method = "#{aliased_target}_with_#{feature}#{punctuation}", "#{aliased_target}_without_#{feature}#{punctuation}"
|
185
|
-
|
186
|
-
alias_method without_method, target
|
187
|
-
alias_method target, with_method
|
188
|
-
|
189
|
-
case
|
190
|
-
when public_method_defined?(without_method)
|
191
|
-
public target
|
192
|
-
when protected_method_defined?(without_method)
|
193
|
-
protected target
|
194
|
-
when private_method_defined?(without_method)
|
195
|
-
private target
|
196
|
-
end
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
# Helper method to coerce a value into a specific class.
|
201
|
-
# Raises a TypeError if the coercion fails or the returned value
|
202
|
-
# is not of the right class.
|
203
|
-
# (from Rubinius)
|
204
|
-
def self.coerce_to(obj, cls, meth)
|
205
|
-
return obj if obj.kind_of?(cls)
|
206
|
-
|
207
|
-
begin
|
208
|
-
ret = obj.__send__(meth)
|
209
|
-
rescue Exception => e
|
210
|
-
raise TypeError, "Coercion error: #{obj.inspect}.#{meth} => #{cls} failed:\n" \
|
211
|
-
"(#{e.message})"
|
212
|
-
end
|
213
|
-
raise TypeError, "Coercion error: obj.#{meth} did NOT return a #{cls} (was #{ret.class})" unless ret.kind_of? cls
|
214
|
-
ret
|
215
|
-
end
|
216
|
-
|
217
|
-
def self.coerce_to_int(obj)
|
218
|
-
coerce_to(obj, Integer, :to_int)
|
219
|
-
end
|
220
|
-
|
221
|
-
def self.coerce_to_ary(obj)
|
222
|
-
coerce_to(obj, Array, :to_ary)
|
223
|
-
end
|
224
|
-
|
225
|
-
def self.coerce_to_str(obj)
|
226
|
-
coerce_to(obj, String, :to_str)
|
227
|
-
end
|
228
|
-
|
229
|
-
def self.coerce_to_hash(obj)
|
230
|
-
coerce_to(obj, Hash, :to_hash)
|
231
|
-
end
|
232
|
-
|
233
|
-
def self.coerce_to_options(obj, *options)
|
234
|
-
hash = coerce_to_hash(obj)
|
235
|
-
hash.values_at(*options)
|
236
|
-
end
|
237
|
-
|
238
|
-
def self.coerce_to_option(obj, option)
|
239
|
-
coerce_to_options(obj, option)[0]
|
240
|
-
end
|
241
|
-
|
242
|
-
def self.is_array?(obj)
|
243
|
-
coerce_to(obj, Array, :to_ary) if obj.respond_to? :to_ary
|
244
|
-
end
|
245
|
-
|
246
|
-
def self.try_convert(obj, cls, meth)
|
247
|
-
return obj if obj.kind_of?(cls)
|
248
|
-
return nil unless obj.respond_to?(meth)
|
249
|
-
ret = obj.__send__(meth)
|
250
|
-
raise TypeError, "Coercion error: obj.#{meth} did NOT return a #{cls} (was #{ret.class})" unless ret.nil? || ret.kind_of?(cls)
|
251
|
-
ret
|
252
|
-
end
|
253
|
-
|
254
|
-
# Checks for a failed comparison (in which case it throws an ArgumentError)
|
255
|
-
# Additionally, it maps any negative value to -1 and any positive value to +1
|
256
|
-
# (from Rubinius)
|
257
|
-
def self.coerce_to_comparison(a, b, cmp = (a <=> b))
|
258
|
-
raise ArgumentError, "comparison of #{a} with #{b} failed" if cmp.nil?
|
259
|
-
return 1 if cmp > 0
|
260
|
-
return -1 if cmp < 0
|
261
|
-
0
|
262
|
-
end
|
263
|
-
|
264
|
-
# Used internally to make it easy to deal with optional arguments
|
265
|
-
# (from Rubinius)
|
266
|
-
Undefined = Object.new
|
267
|
-
|
268
|
-
# Used internally.
|
269
|
-
# Safe alias_method that will only alias if the source exists and destination doesn't
|
270
|
-
def self.alias_method(mod, new_name, old_name)
|
271
|
-
mod.instance_eval do
|
272
|
-
alias_method new_name, old_name
|
273
|
-
end if mod.method_defined?(old_name) && !mod.method_defined?(new_name)
|
274
|
-
end
|
275
|
-
|
276
|
-
# Used internally to combine {IO|File} options hash into mode (String or Integer)
|
277
|
-
def self.combine_mode_and_option(mode = nil, options = Backports::Undefined)
|
278
|
-
# Can't backport autoclose, {internal|external|}encoding
|
279
|
-
mode, options = nil, mode if mode.respond_to?(:to_hash) && options == Backports::Undefined
|
280
|
-
options = {} if options == nil || options == Backports::Undefined
|
281
|
-
options = coerce_to_hash(options)
|
282
|
-
if mode && options[:mode]
|
283
|
-
raise ArgumentError, "mode specified twice"
|
284
|
-
end
|
285
|
-
mode ||= options[:mode] || "r"
|
286
|
-
mode = try_convert(mode, String, :to_str) || try_convert(mode, Integer, :to_int) || mode
|
287
|
-
if options[:textmode] || options[:binmode]
|
288
|
-
text = options[:textmode] || (mode.is_a?(String) && mode =~ /t/)
|
289
|
-
bin = options[:binmode] || (mode.is_a?(String) ? mode =~ /b/ : mode & File::Constants::BINARY != 0)
|
290
|
-
if text && bin
|
291
|
-
raise ArgumentError, "both textmode and binmode specified"
|
292
|
-
end
|
293
|
-
case
|
294
|
-
when !options[:binmode]
|
295
|
-
when mode.is_a?(String)
|
296
|
-
mode.insert(1, "b")
|
297
|
-
else
|
298
|
-
mode |= File::Constants::BINARY
|
299
|
-
end
|
300
|
-
end
|
301
|
-
mode
|
302
|
-
end
|
303
|
-
|
304
|
-
# Used internally to combine {IO|File} options hash into mode (String or Integer) and perm
|
305
|
-
def self.combine_mode_perm_and_option(mode = nil, perm = Backports::Undefined, options = Backports::Undefined)
|
306
|
-
mode, options = nil, mode if mode.respond_to?(:to_hash) && perm == Backports::Undefined
|
307
|
-
perm, options = nil, perm if perm.respond_to?(:to_hash) && options == Backports::Undefined
|
308
|
-
perm = nil if perm == Backports::Undefined
|
309
|
-
options = {} if options == Backports::Undefined
|
310
|
-
options = coerce_to_hash(options)
|
311
|
-
if perm && options[:perm]
|
312
|
-
raise ArgumentError, "perm specified twice"
|
313
|
-
end
|
314
|
-
[combine_mode_and_option(mode, options), perm || options[:perm]]
|
315
|
-
end
|
316
|
-
|
317
|
-
def self.write(binary, filename, string, offset, options)
|
318
|
-
offset, options = nil, offset if offset.respond_to?(:to_hash) && options == Backports::Undefined
|
319
|
-
options = {} if options == Backports::Undefined
|
320
|
-
options = coerce_to_hash(options)
|
321
|
-
File.open(filename, 'a+'){} if offset # insure existence
|
322
|
-
options = {:mode => offset.nil? ? "w" : "r+"}.merge(options)
|
323
|
-
args = options[:open_args] || [options]
|
324
|
-
File.open(filename, *Backports.combine_mode_perm_and_option(*args)) do |f|
|
325
|
-
f.binmode if binary && f.respond_to?(:binmode)
|
326
|
-
f.seek(offset) unless offset.nil?
|
327
|
-
f.write(string)
|
328
|
-
end
|
329
|
-
end
|
330
|
-
|
331
|
-
def self.suppress_verbose_warnings
|
332
|
-
before = $VERBOSE
|
333
|
-
$VERBOSE = false if $VERBOSE # Set to false (default warning) but not nil (no warnings)
|
334
|
-
yield
|
335
|
-
ensure
|
336
|
-
$VERBOSE = before
|
337
|
-
end
|
338
|
-
end
|
339
|
-
|
340
|
-
module Kernel
|
341
|
-
def require_with_backports(lib)
|
342
|
-
begin
|
343
|
-
return false unless require_without_backports(lib)
|
344
|
-
paths = Backports::StdLib.extended_lib.fetch(lib, nil)
|
345
|
-
rescue LoadError
|
346
|
-
return false if Backports::StdLib::LoadedFeatures.new.include?(lib)
|
347
|
-
raise unless paths = Backports::StdLib.extended_lib.fetch(lib, nil)
|
348
|
-
Backports::StdLib::LoadedFeatures.mark_as_loaded(lib)
|
349
|
-
end
|
350
|
-
if paths
|
351
|
-
paths.each do |path|
|
352
|
-
require_without_backports(path)
|
353
|
-
end
|
354
|
-
end
|
355
|
-
true
|
356
|
-
end
|
357
|
-
Backports.alias_method_chain self, :require, :backports
|
358
|
-
end
|
2
|
+
require 'backports/tools/require_relative_dir'
|
3
|
+
Backports.require_relative_dir
|