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.
Files changed (275) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +1 -0
  3. data/Gemfile.lock +3 -1
  4. data/README.rdoc +6 -2
  5. data/backports.gemspec +1 -1
  6. data/lib/backports/1.8.7.rb +1 -0
  7. data/lib/backports/1.8.7/argf.rb +1 -1
  8. data/lib/backports/1.8.7/argf/each.rb +1 -1
  9. data/lib/backports/1.8.7/argf/each_byte.rb +1 -1
  10. data/lib/backports/1.8.7/argf/each_char.rb +1 -1
  11. data/lib/backports/1.8.7/argf/each_line.rb +1 -1
  12. data/lib/backports/1.8.7/argf/getbyte.rb +1 -1
  13. data/lib/backports/1.8.7/argf/readbyte.rb +1 -1
  14. data/lib/backports/1.8.7/array.rb +1 -1
  15. data/lib/backports/1.8.7/array/collect.rb +1 -1
  16. data/lib/backports/1.8.7/array/combination.rb +1 -1
  17. data/lib/backports/1.8.7/array/cycle.rb +1 -1
  18. data/lib/backports/1.8.7/array/delete_if.rb +1 -1
  19. data/lib/backports/1.8.7/array/each.rb +1 -1
  20. data/lib/backports/1.8.7/array/each_index.rb +1 -1
  21. data/lib/backports/1.8.7/array/flatten.rb +2 -1
  22. data/lib/backports/1.8.7/array/index.rb +1 -1
  23. data/lib/backports/1.8.7/array/map.rb +1 -1
  24. data/lib/backports/1.8.7/array/permutation.rb +1 -1
  25. data/lib/backports/1.8.7/array/pop.rb +2 -1
  26. data/lib/backports/1.8.7/array/product.rb +1 -1
  27. data/lib/backports/1.8.7/array/reject.rb +1 -1
  28. data/lib/backports/1.8.7/array/reverse_each.rb +1 -1
  29. data/lib/backports/1.8.7/array/rindex.rb +1 -1
  30. data/lib/backports/1.8.7/array/select.rb +1 -1
  31. data/lib/backports/1.8.7/array/shift.rb +2 -1
  32. data/lib/backports/1.8.7/binding.rb +1 -1
  33. data/lib/backports/1.8.7/dir.rb +1 -1
  34. data/lib/backports/1.8.7/dir/each.rb +1 -1
  35. data/lib/backports/1.8.7/enumerable.rb +1 -1
  36. data/lib/backports/1.8.7/enumerable/count.rb +1 -1
  37. data/lib/backports/1.8.7/enumerable/cycle.rb +1 -1
  38. data/lib/backports/1.8.7/enumerable/detect.rb +1 -1
  39. data/lib/backports/1.8.7/enumerable/drop.rb +1 -1
  40. data/lib/backports/1.8.7/enumerable/each_cons.rb +1 -1
  41. data/lib/backports/1.8.7/enumerable/each_slice.rb +1 -1
  42. data/lib/backports/1.8.7/enumerable/each_with_index.rb +1 -1
  43. data/lib/backports/1.8.7/enumerable/entries.rb +1 -1
  44. data/lib/backports/1.8.7/enumerable/find.rb +1 -1
  45. data/lib/backports/1.8.7/enumerable/find_all.rb +1 -1
  46. data/lib/backports/1.8.7/enumerable/find_index.rb +1 -1
  47. data/lib/backports/1.8.7/enumerable/first.rb +1 -1
  48. data/lib/backports/1.8.7/enumerable/inject.rb +2 -1
  49. data/lib/backports/1.8.7/enumerable/max_by.rb +1 -1
  50. data/lib/backports/1.8.7/enumerable/min_by.rb +1 -1
  51. data/lib/backports/1.8.7/enumerable/minmax.rb +1 -1
  52. data/lib/backports/1.8.7/enumerable/minmax_by.rb +1 -1
  53. data/lib/backports/1.8.7/enumerable/partition.rb +1 -1
  54. data/lib/backports/1.8.7/enumerable/reject.rb +1 -1
  55. data/lib/backports/1.8.7/enumerable/select.rb +1 -1
  56. data/lib/backports/1.8.7/enumerable/sort_by.rb +1 -1
  57. data/lib/backports/1.8.7/enumerable/to_a.rb +1 -1
  58. data/lib/backports/1.8.7/enumerator.rb +1 -1
  59. data/lib/backports/1.8.7/enumerator/each.rb +1 -1
  60. data/lib/backports/1.8.7/env.rb +1 -1
  61. data/lib/backports/1.8.7/env/delete_if.rb +1 -1
  62. data/lib/backports/1.8.7/env/each.rb +1 -1
  63. data/lib/backports/1.8.7/env/each_key.rb +1 -1
  64. data/lib/backports/1.8.7/env/each_pair.rb +1 -1
  65. data/lib/backports/1.8.7/env/each_value.rb +1 -1
  66. data/lib/backports/1.8.7/env/reject.rb +1 -1
  67. data/lib/backports/1.8.7/env/select.rb +1 -1
  68. data/lib/backports/1.8.7/fixnum.rb +1 -1
  69. data/lib/backports/1.8.7/float.rb +1 -1
  70. data/lib/backports/1.8.7/gc.rb +1 -1
  71. data/lib/backports/1.8.7/hash.rb +1 -1
  72. data/lib/backports/1.8.7/hash/constructor.rb +1 -1
  73. data/lib/backports/1.8.7/hash/delete_if.rb +1 -1
  74. data/lib/backports/1.8.7/hash/each.rb +1 -1
  75. data/lib/backports/1.8.7/hash/each_key.rb +1 -1
  76. data/lib/backports/1.8.7/hash/each_pair.rb +1 -1
  77. data/lib/backports/1.8.7/hash/each_value.rb +1 -1
  78. data/lib/backports/1.8.7/hash/reject.rb +1 -1
  79. data/lib/backports/1.8.7/hash/select.rb +1 -1
  80. data/lib/backports/1.8.7/integer.rb +1 -1
  81. data/lib/backports/1.8.7/integer/downto.rb +1 -1
  82. data/lib/backports/1.8.7/integer/times.rb +1 -1
  83. data/lib/backports/1.8.7/integer/upto.rb +1 -1
  84. data/lib/backports/1.8.7/io.rb +1 -1
  85. data/lib/backports/1.8.7/io/each.rb +1 -1
  86. data/lib/backports/1.8.7/io/each_byte.rb +1 -1
  87. data/lib/backports/1.8.7/io/each_line.rb +1 -1
  88. data/lib/backports/1.8.7/io/foreach.rb +1 -1
  89. data/lib/backports/1.8.7/io/getbyte.rb +1 -1
  90. data/lib/backports/1.8.7/io/readbyte.rb +1 -1
  91. data/lib/backports/1.8.7/kernel.rb +1 -1
  92. data/lib/backports/1.8.7/method.rb +1 -1
  93. data/lib/backports/1.8.7/method/name.rb +1 -1
  94. data/lib/backports/1.8.7/module.rb +1 -1
  95. data/lib/backports/1.8.7/module/module_exec.rb +1 -1
  96. data/lib/backports/1.8.7/numeric.rb +1 -1
  97. data/lib/backports/1.8.7/numeric/step.rb +1 -1
  98. data/lib/backports/1.8.7/object_space.rb +1 -1
  99. data/lib/backports/1.8.7/object_space/each_object.rb +1 -1
  100. data/lib/backports/1.8.7/process.rb +1 -1
  101. data/lib/backports/1.8.7/range.rb +1 -1
  102. data/lib/backports/1.8.7/range/each.rb +1 -1
  103. data/lib/backports/1.8.7/range/step.rb +1 -1
  104. data/lib/backports/1.8.7/regexp.rb +1 -1
  105. data/lib/backports/1.8.7/regexp/union.rb +1 -1
  106. data/lib/backports/1.8.7/stop_iteration.rb +2 -2
  107. data/lib/backports/1.8.7/string.rb +1 -1
  108. data/lib/backports/1.8.7/string/bytesize.rb +1 -1
  109. data/lib/backports/1.8.7/string/each.rb +1 -1
  110. data/lib/backports/1.8.7/string/each_byte.rb +1 -1
  111. data/lib/backports/1.8.7/string/each_char.rb +1 -1
  112. data/lib/backports/1.8.7/string/each_line.rb +1 -1
  113. data/lib/backports/1.8.7/string/partition.rb +2 -1
  114. data/lib/backports/1.8.7/string/rpartition.rb +1 -1
  115. data/lib/backports/1.8.7/string/upto.rb +1 -1
  116. data/lib/backports/1.8.7/struct.rb +1 -1
  117. data/lib/backports/1.8.7/struct/each.rb +1 -1
  118. data/lib/backports/1.8.7/struct/each_pair.rb +1 -1
  119. data/lib/backports/1.8.7/symbol.rb +1 -1
  120. data/lib/backports/1.9.1/array.rb +1 -1
  121. data/lib/backports/1.9.1/array/sample.rb +1 -1
  122. data/lib/backports/1.9.1/array/try_convert.rb +1 -1
  123. data/lib/backports/1.9.1/dir.rb +1 -1
  124. data/lib/backports/1.9.1/dir/to_path.rb +1 -1
  125. data/lib/backports/1.9.1/enumerable.rb +1 -1
  126. data/lib/backports/1.9.1/enumerable/each_with_index.rb +1 -1
  127. data/lib/backports/1.9.1/enumerator.rb +1 -1
  128. data/lib/backports/1.9.1/enumerator/new.rb +1 -1
  129. data/lib/backports/1.9.1/enumerator/with_object.rb +1 -1
  130. data/lib/backports/1.9.1/env.rb +1 -1
  131. data/lib/backports/1.9.1/env/key.rb +1 -1
  132. data/lib/backports/1.9.1/file.rb +1 -1
  133. data/lib/backports/1.9.1/file/atime.rb +1 -1
  134. data/lib/backports/1.9.1/file/basename.rb +1 -1
  135. data/lib/backports/1.9.1/file/blockdev.rb +1 -1
  136. data/lib/backports/1.9.1/file/chardev.rb +1 -1
  137. data/lib/backports/1.9.1/file/chmod.rb +1 -1
  138. data/lib/backports/1.9.1/file/chown.rb +1 -1
  139. data/lib/backports/1.9.1/file/ctime.rb +1 -1
  140. data/lib/backports/1.9.1/file/delete.rb +1 -1
  141. data/lib/backports/1.9.1/file/directory.rb +1 -1
  142. data/lib/backports/1.9.1/file/dirname.rb +1 -1
  143. data/lib/backports/1.9.1/file/executable.rb +1 -1
  144. data/lib/backports/1.9.1/file/executable_real.rb +1 -1
  145. data/lib/backports/1.9.1/file/exist.rb +1 -1
  146. data/lib/backports/1.9.1/file/exists.rb +1 -1
  147. data/lib/backports/1.9.1/file/expand_path.rb +1 -1
  148. data/lib/backports/1.9.1/file/extname.rb +1 -1
  149. data/lib/backports/1.9.1/file/file.rb +1 -1
  150. data/lib/backports/1.9.1/file/ftype.rb +1 -1
  151. data/lib/backports/1.9.1/file/grpowned.rb +1 -1
  152. data/lib/backports/1.9.1/file/join.rb +1 -1
  153. data/lib/backports/1.9.1/file/lchmod.rb +1 -1
  154. data/lib/backports/1.9.1/file/lchown.rb +1 -1
  155. data/lib/backports/1.9.1/file/link.rb +1 -1
  156. data/lib/backports/1.9.1/file/lstat.rb +1 -1
  157. data/lib/backports/1.9.1/file/mtime.rb +1 -1
  158. data/lib/backports/1.9.1/file/new.rb +1 -1
  159. data/lib/backports/1.9.1/file/open.rb +3 -2
  160. data/lib/backports/1.9.1/file/owned.rb +1 -1
  161. data/lib/backports/1.9.1/file/pipe.rb +1 -1
  162. data/lib/backports/1.9.1/file/readable.rb +1 -1
  163. data/lib/backports/1.9.1/file/readable_real.rb +1 -1
  164. data/lib/backports/1.9.1/file/readlink.rb +1 -1
  165. data/lib/backports/1.9.1/file/rename.rb +1 -1
  166. data/lib/backports/1.9.1/file/setgid.rb +1 -1
  167. data/lib/backports/1.9.1/file/setuid.rb +1 -1
  168. data/lib/backports/1.9.1/file/size.rb +1 -1
  169. data/lib/backports/1.9.1/file/socket.rb +1 -1
  170. data/lib/backports/1.9.1/file/split.rb +1 -1
  171. data/lib/backports/1.9.1/file/stat.rb +1 -1
  172. data/lib/backports/1.9.1/file/sticky.rb +1 -1
  173. data/lib/backports/1.9.1/file/symlink.rb +1 -1
  174. data/lib/backports/1.9.1/file/to_path.rb +1 -1
  175. data/lib/backports/1.9.1/file/truncate.rb +1 -1
  176. data/lib/backports/1.9.1/file/unlink.rb +1 -1
  177. data/lib/backports/1.9.1/file/writable.rb +1 -1
  178. data/lib/backports/1.9.1/file/writable_real.rb +1 -1
  179. data/lib/backports/1.9.1/file/zero.rb +1 -1
  180. data/lib/backports/1.9.1/float.rb +1 -1
  181. data/lib/backports/1.9.1/float/round.rb +2 -1
  182. data/lib/backports/1.9.1/hash.rb +1 -1
  183. data/lib/backports/1.9.1/hash/default_proc.rb +1 -1
  184. data/lib/backports/1.9.1/hash/key.rb +1 -1
  185. data/lib/backports/1.9.1/hash/try_convert.rb +1 -1
  186. data/lib/backports/1.9.1/integer.rb +1 -1
  187. data/lib/backports/1.9.1/integer/magnitude.rb +1 -1
  188. data/lib/backports/1.9.1/integer/round.rb +2 -1
  189. data/lib/backports/1.9.1/io.rb +1 -1
  190. data/lib/backports/1.9.1/io/binread.rb +1 -1
  191. data/lib/backports/1.9.1/io/open.rb +4 -2
  192. data/lib/backports/1.9.1/io/try_convert.rb +1 -1
  193. data/lib/backports/1.9.1/io/ungetbyte.rb +1 -1
  194. data/lib/backports/1.9.1/kernel.rb +1 -1
  195. data/lib/backports/1.9.1/kernel/require_relative.rb +1 -1
  196. data/lib/backports/1.9.1/math.rb +1 -1
  197. data/lib/backports/1.9.1/math/log.rb +2 -1
  198. data/lib/backports/1.9.1/numeric.rb +1 -1
  199. data/lib/backports/1.9.1/numeric/round.rb +2 -1
  200. data/lib/backports/1.9.1/proc.rb +1 -1
  201. data/lib/backports/1.9.1/proc/lambda.rb +1 -1
  202. data/lib/backports/1.9.1/proc/yield.rb +1 -1
  203. data/lib/backports/1.9.1/range.rb +1 -1
  204. data/lib/backports/1.9.1/range/cover.rb +1 -1
  205. data/lib/backports/1.9.1/regexp.rb +1 -1
  206. data/lib/backports/1.9.1/regexp/try_convert.rb +1 -1
  207. data/lib/backports/1.9.1/string.rb +1 -1
  208. data/lib/backports/1.9.1/string/each_codepoint.rb +1 -1
  209. data/lib/backports/1.9.1/string/getbyte.rb +1 -1
  210. data/lib/backports/1.9.1/string/setbyte.rb +1 -1
  211. data/lib/backports/1.9.1/string/try_convert.rb +1 -1
  212. data/lib/backports/1.9.1/symbol.rb +1 -1
  213. data/lib/backports/1.9.2/array.rb +1 -1
  214. data/lib/backports/1.9.2/array/product.rb +2 -1
  215. data/lib/backports/1.9.2/array/repeated_combination.rb +1 -1
  216. data/lib/backports/1.9.2/array/repeated_permutation.rb +1 -1
  217. data/lib/backports/1.9.2/array/rotate.rb +1 -1
  218. data/lib/backports/1.9.2/array/uniq.rb +2 -2
  219. data/lib/backports/1.9.2/complex.rb +1 -1
  220. data/lib/backports/1.9.2/dir.rb +1 -1
  221. data/lib/backports/1.9.2/enumerable.rb +1 -1
  222. data/lib/backports/1.9.2/enumerable/slice_before.rb +1 -1
  223. data/lib/backports/1.9.2/float.rb +1 -1
  224. data/lib/backports/1.9.2/hash.rb +1 -1
  225. data/lib/backports/1.9.2/kernel.rb +1 -1
  226. data/lib/backports/1.9.2/random.rb +1 -1
  227. data/lib/backports/1.9.3/file.rb +1 -1
  228. data/lib/backports/1.9.3/io.rb +1 -1
  229. data/lib/backports/1.9.3/io/advise.rb +1 -1
  230. data/lib/backports/1.9.3/io/binwrite.rb +1 -1
  231. data/lib/backports/1.9.3/io/write.rb +1 -1
  232. data/lib/backports/1.9.3/string.rb +1 -1
  233. data/lib/backports/1.9.3/string/byteslice.rb +1 -1
  234. data/lib/backports/1.9.3/string/prepend.rb +1 -1
  235. data/lib/backports/2.0.0/array.rb +1 -1
  236. data/lib/backports/2.0.0/enumerable.rb +1 -1
  237. data/lib/backports/2.0.0/enumerable/lazy.rb +1 -1
  238. data/lib/backports/2.0.0/enumerator.rb +1 -1
  239. data/lib/backports/2.0.0/env.rb +1 -1
  240. data/lib/backports/2.0.0/hash.rb +1 -1
  241. data/lib/backports/2.0.0/hash/default_proc.rb +1 -1
  242. data/lib/backports/2.0.0/nil.rb +1 -1
  243. data/lib/backports/2.0.0/range.rb +1 -1
  244. data/lib/backports/2.0.0/struct.rb +1 -1
  245. data/lib/backports/2.1.0/array.rb +1 -1
  246. data/lib/backports/2.1.0/bignum.rb +1 -1
  247. data/lib/backports/2.1.0/enumerable.rb +1 -1
  248. data/lib/backports/2.1.0/enumerable/to_h.rb +1 -1
  249. data/lib/backports/2.1.0/fixnum.rb +1 -1
  250. data/lib/backports/2.1.0/module.rb +1 -1
  251. data/lib/backports/force/enumerable_map.rb +1 -0
  252. data/lib/backports/force/hash_select.rb +1 -0
  253. data/lib/backports/random/MT19937.rb +78 -0
  254. data/lib/backports/random/bits_and_bytes.rb +93 -0
  255. data/lib/backports/random/implementation.rb +94 -0
  256. data/lib/backports/random/load.rb +17 -0
  257. data/lib/backports/std_lib.rb +24 -0
  258. data/lib/backports/tools.rb +2 -357
  259. data/lib/backports/tools/alias_method.rb +8 -0
  260. data/lib/backports/tools/alias_method_chain.rb +26 -0
  261. data/lib/backports/tools/arguments.rb +69 -0
  262. data/lib/backports/tools/extreme_object.rb +12 -0
  263. data/lib/backports/tools/io.rb +57 -0
  264. data/lib/backports/tools/make_block_optional.rb +43 -0
  265. data/lib/backports/tools/path.rb +55 -0
  266. data/lib/backports/tools/require_relative_dir.rb +13 -0
  267. data/lib/backports/tools/std_lib.rb +59 -0
  268. data/lib/backports/tools/suppress_verbose_warnings.rb +9 -0
  269. data/lib/backports/version.rb +1 -1
  270. data/spec/tags/1.8.7/core/module/include_spec.rb +3 -0
  271. metadata +45 -52
  272. data/lib/backports/extra/random/MT19937.rb +0 -76
  273. data/lib/backports/extra/random/bits_and_bytes.rb +0 -91
  274. data/lib/backports/extra/random/implementation.rb +0 -93
  275. data/lib/backports/extra/random/load.rb +0 -17
@@ -1,3 +1,3 @@
1
- require 'backports/tools'
1
+ require 'backports/tools/require_relative_dir'
2
2
 
3
3
  Backports.require_relative_dir
@@ -1,5 +1,5 @@
1
1
  unless Enumerable.method_defined?(:to_h)
2
- require 'backports/tools'
2
+ require 'backports/tools/arguments'
3
3
  module Enumerable
4
4
  def to_h(*args)
5
5
  h = {}
@@ -1,3 +1,3 @@
1
- require 'backports/tools'
1
+ require 'backports/tools/require_relative_dir'
2
2
 
3
3
  Backports.require_relative_dir
@@ -1,3 +1,3 @@
1
- require 'backports/tools'
1
+ require 'backports/tools/require_relative_dir'
2
2
 
3
3
  Backports.require_relative_dir
@@ -1,3 +1,4 @@
1
+ require 'backports/tools/make_block_optional'
1
2
  Backports.make_block_optional Enumerable, :map, :test_on => 1..2
2
3
  Backports.make_block_optional Array, :map, :test_on => [1, 2]
3
4
 
@@ -1,3 +1,4 @@
1
+ require 'backports/tools/alias_method_chain'
1
2
  class Hash
2
3
  if {}.select{} == []
3
4
  def select_with_hash_return
@@ -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
@@ -1,358 +1,3 @@
1
1
  # Methods used internally by the backports.
2
- module Backports
3
- MOST_EXTREME_OBJECT_EVER = Object.new # :nodoc:
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