backports 3.0.3 → 3.1.0

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 (487) hide show
  1. data/.gitignore +1 -1
  2. data/.gitmodules +3 -0
  3. data/.travis.yml +11 -2
  4. data/CHANGELOG.rdoc +6 -0
  5. data/Gemfile +20 -0
  6. data/Gemfile.lock +24 -0
  7. data/README.rdoc +39 -11
  8. data/Rakefile +98 -1
  9. data/default.mspec +9 -0
  10. data/lib/backports.rb +4 -4
  11. data/lib/backports/1.8.7.rb +2 -3
  12. data/lib/backports/1.8.7/argf.rb +2 -43
  13. data/lib/backports/1.8.7/argf/bytes.rb +1 -0
  14. data/lib/backports/1.8.7/argf/chars.rb +1 -0
  15. data/lib/backports/1.8.7/argf/each.rb +3 -0
  16. data/lib/backports/1.8.7/argf/each_byte.rb +9 -0
  17. data/lib/backports/1.8.7/argf/each_char.rb +35 -0
  18. data/lib/backports/1.8.7/argf/each_line.rb +3 -0
  19. data/lib/backports/1.8.7/argf/getbyte.rb +5 -0
  20. data/lib/backports/1.8.7/argf/lines.rb +5 -0
  21. data/lib/backports/1.8.7/argf/readbyte.rb +5 -0
  22. data/lib/backports/1.8.7/array.rb +2 -207
  23. data/lib/backports/1.8.7/array/collect.rb +3 -0
  24. data/lib/backports/1.8.7/array/combination.rb +24 -0
  25. data/lib/backports/1.8.7/array/cycle.rb +16 -0
  26. data/lib/backports/1.8.7/array/delete_if.rb +3 -0
  27. data/lib/backports/1.8.7/array/each.rb +3 -0
  28. data/lib/backports/1.8.7/array/each_index.rb +3 -0
  29. data/lib/backports/1.8.7/array/find_index.rb +1 -0
  30. data/lib/backports/1.8.7/array/flatten.rb +47 -0
  31. data/lib/backports/1.8.7/array/index.rb +15 -0
  32. data/lib/backports/1.8.7/array/map.rb +3 -0
  33. data/lib/backports/1.8.7/array/permutation.rb +30 -0
  34. data/lib/backports/1.8.7/array/pop.rb +15 -0
  35. data/lib/backports/1.8.7/array/product.rb +32 -0
  36. data/lib/backports/1.8.7/array/reject.rb +3 -0
  37. data/lib/backports/1.8.7/array/reverse_each.rb +3 -0
  38. data/lib/backports/1.8.7/array/rindex.rb +15 -0
  39. data/lib/backports/1.8.7/array/select.rb +3 -0
  40. data/lib/backports/1.8.7/array/shift.rb +13 -0
  41. data/lib/backports/1.8.7/array/shuffle.rb +17 -0
  42. data/lib/backports/1.8.7/binding.rb +3 -6
  43. data/lib/backports/1.8.7/binding/eval.rb +7 -0
  44. data/lib/backports/1.8.7/dir.rb +2 -57
  45. data/lib/backports/1.8.7/dir/each.rb +7 -0
  46. data/lib/backports/1.8.7/dir/foreach.rb +9 -0
  47. data/lib/backports/1.8.7/dir/mktmpdir.rb +44 -0
  48. data/lib/backports/1.8.7/enumerable.rb +2 -240
  49. data/lib/backports/1.8.7/enumerable/count.rb +17 -0
  50. data/lib/backports/1.8.7/enumerable/cycle.rb +24 -0
  51. data/lib/backports/1.8.7/enumerable/detect.rb +3 -0
  52. data/lib/backports/1.8.7/enumerable/drop.rb +13 -0
  53. data/lib/backports/1.8.7/enumerable/drop_while.rb +16 -0
  54. data/lib/backports/1.8.7/enumerable/each_cons.rb +4 -0
  55. data/lib/backports/1.8.7/enumerable/each_slice.rb +4 -0
  56. data/lib/backports/1.8.7/enumerable/each_with_index.rb +3 -0
  57. data/lib/backports/1.8.7/enumerable/entries.rb +11 -0
  58. data/lib/backports/1.8.7/enumerable/find.rb +3 -0
  59. data/lib/backports/1.8.7/enumerable/find_all.rb +3 -0
  60. data/lib/backports/1.8.7/enumerable/find_index.rb +21 -0
  61. data/lib/backports/1.8.7/enumerable/first.rb +21 -0
  62. data/lib/backports/1.8.7/enumerable/group_by.rb +14 -0
  63. data/lib/backports/1.8.7/enumerable/inject.rb +14 -0
  64. data/lib/backports/1.8.7/enumerable/max_by.rb +16 -0
  65. data/lib/backports/1.8.7/enumerable/min_by.rb +16 -0
  66. data/lib/backports/1.8.7/enumerable/minmax.rb +21 -0
  67. data/lib/backports/1.8.7/enumerable/minmax_by.rb +19 -0
  68. data/lib/backports/1.8.7/enumerable/none.rb +7 -0
  69. data/lib/backports/1.8.7/enumerable/one.rb +23 -0
  70. data/lib/backports/1.8.7/enumerable/partition.rb +3 -0
  71. data/lib/backports/1.8.7/enumerable/reduce.rb +1 -0
  72. data/lib/backports/1.8.7/enumerable/reject.rb +3 -0
  73. data/lib/backports/1.8.7/enumerable/reverse_each.rb +12 -0
  74. data/lib/backports/1.8.7/enumerable/select.rb +3 -0
  75. data/lib/backports/1.8.7/enumerable/sort_by.rb +3 -0
  76. data/lib/backports/1.8.7/enumerable/take.rb +9 -0
  77. data/lib/backports/1.8.7/enumerable/take_while.rb +14 -0
  78. data/lib/backports/1.8.7/enumerable/to_a.rb +12 -0
  79. data/lib/backports/1.8.7/enumerator.rb +2 -31
  80. data/lib/backports/1.8.7/enumerator/each.rb +6 -0
  81. data/lib/backports/1.8.7/enumerator/next.rb +15 -0
  82. data/lib/backports/1.8.7/enumerator/rewind.rb +13 -0
  83. data/lib/backports/1.8.7/enumerator/with_index.rb +14 -0
  84. data/lib/backports/1.8.7/env.rb +3 -3
  85. data/lib/backports/1.8.7/env/delete_if.rb +3 -0
  86. data/lib/backports/1.8.7/env/each.rb +3 -0
  87. data/lib/backports/1.8.7/env/each_key.rb +3 -0
  88. data/lib/backports/1.8.7/env/each_pair.rb +3 -0
  89. data/lib/backports/1.8.7/env/each_value.rb +3 -0
  90. data/lib/backports/1.8.7/env/reject.rb +4 -0
  91. data/lib/backports/1.8.7/env/select.rb +3 -0
  92. data/lib/backports/1.8.7/fixnum.rb +2 -10
  93. data/lib/backports/1.8.7/fixnum/div.rb +7 -0
  94. data/lib/backports/1.8.7/fixnum/fdiv.rb +7 -0
  95. data/lib/backports/1.8.7/float.rb +3 -4
  96. data/lib/backports/1.8.7/float/fdiv.rb +3 -0
  97. data/lib/backports/1.8.7/gc.rb +2 -10
  98. data/lib/backports/1.8.7/gc/stress.rb +9 -0
  99. data/lib/backports/1.8.7/hash.rb +2 -41
  100. data/lib/backports/1.8.7/hash/constructor.rb +25 -0
  101. data/lib/backports/1.8.7/hash/delete_if.rb +3 -0
  102. data/lib/backports/1.8.7/hash/each.rb +3 -0
  103. data/lib/backports/1.8.7/hash/each_key.rb +3 -0
  104. data/lib/backports/1.8.7/hash/each_pair.rb +3 -0
  105. data/lib/backports/1.8.7/hash/each_value.rb +3 -0
  106. data/lib/backports/1.8.7/hash/eql.rb +1 -0
  107. data/lib/backports/1.8.7/hash/hash.rb +17 -0
  108. data/lib/backports/1.8.7/hash/key.rb +3 -0
  109. data/lib/backports/1.8.7/hash/reject.rb +3 -0
  110. data/lib/backports/1.8.7/hash/select.rb +3 -0
  111. data/lib/backports/1.8.7/integer.rb +2 -23
  112. data/lib/backports/1.8.7/integer/downto.rb +3 -0
  113. data/lib/backports/1.8.7/integer/even.rb +7 -0
  114. data/lib/backports/1.8.7/integer/odd.rb +7 -0
  115. data/lib/backports/1.8.7/integer/ord.rb +7 -0
  116. data/lib/backports/1.8.7/integer/pred.rb +7 -0
  117. data/lib/backports/1.8.7/integer/times.rb +3 -0
  118. data/lib/backports/1.8.7/integer/upto.rb +3 -0
  119. data/lib/backports/1.8.7/io.rb +2 -42
  120. data/lib/backports/1.8.7/io/bytes.rb +1 -0
  121. data/lib/backports/1.8.7/io/chars.rb +1 -0
  122. data/lib/backports/1.8.7/io/each.rb +3 -0
  123. data/lib/backports/1.8.7/io/each_byte.rb +6 -0
  124. data/lib/backports/1.8.7/io/each_char.rb +34 -0
  125. data/lib/backports/1.8.7/io/each_line.rb +6 -0
  126. data/lib/backports/1.8.7/io/foreach.rb +7 -0
  127. data/lib/backports/1.8.7/io/getbyte.rb +3 -0
  128. data/lib/backports/1.8.7/io/lines.rb +1 -0
  129. data/lib/backports/1.8.7/io/readbyte.rb +3 -0
  130. data/lib/backports/1.8.7/kernel.rb +2 -35
  131. data/lib/backports/1.8.7/kernel/__method__.rb +8 -0
  132. data/lib/backports/1.8.7/kernel/instance_exec.rb +10 -0
  133. data/lib/backports/1.8.7/kernel/tap.rb +8 -0
  134. data/lib/backports/1.8.7/method.rb +2 -46
  135. data/lib/backports/1.8.7/method/name.rb +49 -0
  136. data/lib/backports/1.8.7/module.rb +3 -7
  137. data/lib/backports/1.8.7/module/class_exec.rb +1 -0
  138. data/lib/backports/1.8.7/module/module_exec.rb +11 -0
  139. data/lib/backports/1.8.7/numeric.rb +3 -3
  140. data/lib/backports/1.8.7/numeric/step.rb +3 -0
  141. data/lib/backports/1.8.7/object_space.rb +3 -5
  142. data/lib/backports/1.8.7/object_space/each_object.rb +5 -0
  143. data/lib/backports/1.8.7/proc.rb +3 -4
  144. data/lib/backports/1.8.7/proc/yield.rb +3 -0
  145. data/lib/backports/1.8.7/process.rb +3 -5
  146. data/lib/backports/1.8.7/process/exec.rb +3 -0
  147. data/lib/backports/1.8.7/range.rb +3 -4
  148. data/lib/backports/1.8.7/range/each.rb +3 -0
  149. data/lib/backports/1.8.7/range/step.rb +3 -0
  150. data/lib/backports/1.8.7/regexp.rb +3 -12
  151. data/lib/backports/1.8.7/regexp/union.rb +11 -0
  152. data/lib/backports/1.8.7/stop_iteration.rb +14 -0
  153. data/lib/backports/1.8.7/string.rb +2 -91
  154. data/lib/backports/1.8.7/string/bytes.rb +1 -0
  155. data/lib/backports/1.8.7/string/bytesize.rb +3 -0
  156. data/lib/backports/1.8.7/string/each.rb +3 -0
  157. data/lib/backports/1.8.7/string/each_byte.rb +5 -0
  158. data/lib/backports/1.8.7/string/each_char.rb +13 -0
  159. data/lib/backports/1.8.7/string/each_line.rb +5 -0
  160. data/lib/backports/1.8.7/string/end_with.rb +12 -0
  161. data/lib/backports/1.8.7/string/lines.rb +1 -0
  162. data/lib/backports/1.8.7/string/partition.rb +20 -0
  163. data/lib/backports/1.8.7/string/rpartition.rb +19 -0
  164. data/lib/backports/1.8.7/string/start_with.rb +12 -0
  165. data/lib/backports/1.8.7/string/upto.rb +15 -0
  166. data/lib/backports/1.8.7/struct.rb +3 -3
  167. data/lib/backports/1.8.7/struct/each.rb +3 -0
  168. data/lib/backports/1.8.7/struct/each_pair.rb +3 -0
  169. data/lib/backports/1.8.7/symbol.rb +3 -6
  170. data/lib/backports/1.8.7/symbol/to_proc.rb +8 -0
  171. data/lib/backports/1.8.8.rb +1 -3
  172. data/lib/backports/1.8.rb +1 -3
  173. data/lib/backports/1.9.1.rb +2 -4
  174. data/lib/backports/1.9.1/array.rb +3 -8
  175. data/lib/backports/1.9.1/array/sample.rb +19 -0
  176. data/lib/backports/1.9.1/array/try_convert.rb +7 -0
  177. data/lib/backports/1.9.1/dir.rb +3 -3
  178. data/lib/backports/1.9.1/dir/to_path.rb +3 -0
  179. data/lib/backports/1.9.1/enumerable.rb +2 -18
  180. data/lib/backports/1.9.1/enumerable/each_with_index.rb +14 -0
  181. data/lib/backports/1.9.1/enumerable/each_with_object.rb +9 -0
  182. data/lib/backports/1.9.1/enumerator.rb +2 -40
  183. data/lib/backports/1.9.1/enumerator/new.rb +40 -0
  184. data/lib/backports/1.9.1/enumerator/with_object.rb +6 -0
  185. data/lib/backports/1.9.1/env.rb +3 -3
  186. data/lib/backports/1.9.1/env/key.rb +5 -0
  187. data/lib/backports/1.9.1/file.rb +2 -43
  188. data/lib/backports/1.9.1/file/atime.rb +5 -0
  189. data/lib/backports/1.9.1/file/basename.rb +5 -0
  190. data/lib/backports/1.9.1/file/binary.rb +6 -0
  191. data/lib/backports/1.9.1/file/blockdev.rb +5 -0
  192. data/lib/backports/1.9.1/file/chardev.rb +5 -0
  193. data/lib/backports/1.9.1/file/chmod.rb +5 -0
  194. data/lib/backports/1.9.1/file/chown.rb +5 -0
  195. data/lib/backports/1.9.1/file/ctime.rb +5 -0
  196. data/lib/backports/1.9.1/file/delete.rb +5 -0
  197. data/lib/backports/1.9.1/file/directory.rb +5 -0
  198. data/lib/backports/1.9.1/file/dirname.rb +5 -0
  199. data/lib/backports/1.9.1/file/executable.rb +5 -0
  200. data/lib/backports/1.9.1/file/executable_real.rb +5 -0
  201. data/lib/backports/1.9.1/file/exist.rb +5 -0
  202. data/lib/backports/1.9.1/file/exists.rb +5 -0
  203. data/lib/backports/1.9.1/file/expand_path.rb +14 -0
  204. data/lib/backports/1.9.1/file/extname.rb +5 -0
  205. data/lib/backports/1.9.1/file/file.rb +5 -0
  206. data/lib/backports/1.9.1/file/ftype.rb +5 -0
  207. data/lib/backports/1.9.1/file/grpowned.rb +5 -0
  208. data/lib/backports/1.9.1/file/join.rb +5 -0
  209. data/lib/backports/1.9.1/file/lchmod.rb +5 -0
  210. data/lib/backports/1.9.1/file/lchown.rb +5 -0
  211. data/lib/backports/1.9.1/file/link.rb +5 -0
  212. data/lib/backports/1.9.1/file/lstat.rb +5 -0
  213. data/lib/backports/1.9.1/file/mtime.rb +5 -0
  214. data/lib/backports/1.9.1/file/new.rb +5 -0
  215. data/lib/backports/1.9.1/file/open.rb +23 -0
  216. data/lib/backports/1.9.1/file/owned.rb +5 -0
  217. data/lib/backports/1.9.1/file/pipe.rb +5 -0
  218. data/lib/backports/1.9.1/file/readable.rb +5 -0
  219. data/lib/backports/1.9.1/file/readable_real.rb +5 -0
  220. data/lib/backports/1.9.1/file/readlink.rb +5 -0
  221. data/lib/backports/1.9.1/file/rename.rb +5 -0
  222. data/lib/backports/1.9.1/file/setgid.rb +5 -0
  223. data/lib/backports/1.9.1/file/setuid.rb +5 -0
  224. data/lib/backports/1.9.1/file/size.rb +14 -0
  225. data/lib/backports/1.9.1/file/socket.rb +5 -0
  226. data/lib/backports/1.9.1/file/split.rb +5 -0
  227. data/lib/backports/1.9.1/file/stat.rb +5 -0
  228. data/lib/backports/1.9.1/file/sticky.rb +5 -0
  229. data/lib/backports/1.9.1/file/symlink.rb +6 -0
  230. data/lib/backports/1.9.1/file/to_path.rb +3 -0
  231. data/lib/backports/1.9.1/file/truncate.rb +5 -0
  232. data/lib/backports/1.9.1/file/unlink.rb +5 -0
  233. data/lib/backports/1.9.1/file/writable.rb +5 -0
  234. data/lib/backports/1.9.1/file/writable_real.rb +5 -0
  235. data/lib/backports/1.9.1/file/zero.rb +5 -0
  236. data/lib/backports/1.9.1/float.rb +3 -19
  237. data/lib/backports/1.9.1/float/round.rb +21 -0
  238. data/lib/backports/1.9.1/hash.rb +2 -35
  239. data/lib/backports/1.9.1/hash/assoc.rb +12 -0
  240. data/lib/backports/1.9.1/hash/default_proc.rb +14 -0
  241. data/lib/backports/1.9.1/hash/rassoc.rb +9 -0
  242. data/lib/backports/1.9.1/hash/try_convert.rb +7 -0
  243. data/lib/backports/1.9.1/integer.rb +2 -21
  244. data/lib/backports/1.9.1/integer/magnitude.rb +3 -0
  245. data/lib/backports/1.9.1/integer/round.rb +24 -0
  246. data/lib/backports/1.9.1/io.rb +2 -33
  247. data/lib/backports/1.9.1/io/binread.rb +10 -0
  248. data/lib/backports/1.9.1/io/open.rb +21 -0
  249. data/lib/backports/1.9.1/io/try_convert.rb +7 -0
  250. data/lib/backports/1.9.1/io/ungetbyte.rb +3 -0
  251. data/lib/backports/1.9.1/kernel.rb +2 -39
  252. data/lib/backports/1.9.1/kernel/__callee__.rb +7 -0
  253. data/lib/backports/1.9.1/kernel/define_singleton_method.rb +9 -0
  254. data/lib/backports/1.9.1/kernel/public_method.rb +11 -0
  255. data/lib/backports/1.9.1/kernel/public_send.rb +13 -0
  256. data/lib/backports/1.9.1/kernel/require_relative.rb +14 -0
  257. data/lib/backports/1.9.1/math.rb +2 -24
  258. data/lib/backports/1.9.1/math/log.rb +22 -0
  259. data/lib/backports/1.9.1/math/log2.rb +5 -0
  260. data/lib/backports/1.9.1/numeric.rb +3 -9
  261. data/lib/backports/1.9.1/numeric/round.rb +11 -0
  262. data/lib/backports/1.9.1/proc.rb +2 -53
  263. data/lib/backports/1.9.1/proc/case_compare.rb +6 -0
  264. data/lib/backports/1.9.1/proc/curry.rb +24 -0
  265. data/lib/backports/1.9.1/proc/lambda.rb +40 -0
  266. data/lib/backports/1.9.1/range.rb +3 -3
  267. data/lib/backports/1.9.1/range/cover.rb +3 -0
  268. data/lib/backports/1.9.1/regexp.rb +3 -8
  269. data/lib/backports/1.9.1/regexp/try_convert.rb +7 -0
  270. data/lib/backports/1.9.1/stdlib.rb +1 -1
  271. data/lib/backports/1.9.1/string.rb +2 -44
  272. data/lib/backports/1.9.1/string/ascii_only.rb +7 -0
  273. data/lib/backports/1.9.1/string/chr.rb +7 -0
  274. data/lib/backports/1.9.1/string/clear.rb +8 -0
  275. data/lib/backports/1.9.1/string/codepoints.rb +8 -0
  276. data/lib/backports/1.9.1/string/each_codepoint.rb +3 -0
  277. data/lib/backports/1.9.1/string/getbyte.rb +3 -0
  278. data/lib/backports/1.9.1/string/ord.rb +7 -0
  279. data/lib/backports/1.9.1/string/setbyte.rb +3 -0
  280. data/lib/backports/1.9.1/string/try_convert.rb +7 -0
  281. data/lib/backports/1.9.1/symbol.rb +2 -31
  282. data/lib/backports/1.9.1/symbol/capitalize.rb +7 -0
  283. data/lib/backports/1.9.1/symbol/casecmp.rb +8 -0
  284. data/lib/backports/1.9.1/symbol/comparable.rb +7 -0
  285. data/lib/backports/1.9.1/symbol/comparison.rb +8 -0
  286. data/lib/backports/1.9.1/symbol/downcase.rb +7 -0
  287. data/lib/backports/1.9.1/symbol/element_reference.rb +7 -0
  288. data/lib/backports/1.9.1/symbol/empty.rb +7 -0
  289. data/lib/backports/1.9.1/symbol/length.rb +7 -0
  290. data/lib/backports/1.9.1/symbol/match.rb +9 -0
  291. data/lib/backports/1.9.1/symbol/next.rb +1 -0
  292. data/lib/backports/1.9.1/symbol/size.rb +7 -0
  293. data/lib/backports/1.9.1/symbol/succ.rb +8 -0
  294. data/lib/backports/1.9.1/symbol/swapcase.rb +7 -0
  295. data/lib/backports/1.9.1/symbol/upcase.rb +7 -0
  296. data/lib/backports/1.9.2.rb +2 -4
  297. data/lib/backports/1.9.2/array.rb +2 -109
  298. data/lib/backports/1.9.2/array/keep_if.rb +8 -0
  299. data/lib/backports/1.9.2/array/product.rb +26 -0
  300. data/lib/backports/1.9.2/array/repeated_combination.rb +25 -0
  301. data/lib/backports/1.9.2/array/repeated_permutation.rb +26 -0
  302. data/lib/backports/1.9.2/array/rotate.rb +17 -0
  303. data/lib/backports/1.9.2/array/select.rb +8 -0
  304. data/lib/backports/1.9.2/array/sort_by.rb +9 -0
  305. data/lib/backports/1.9.2/array/uniq.rb +29 -0
  306. data/lib/backports/1.9.2/complex.rb +3 -6
  307. data/lib/backports/1.9.2/complex/to_r.rb +10 -0
  308. data/lib/backports/1.9.2/dir.rb +3 -5
  309. data/lib/backports/1.9.2/dir/home.rb +5 -0
  310. data/lib/backports/1.9.2/enumerable.rb +2 -73
  311. data/lib/backports/1.9.2/enumerable/chunk.rb +39 -0
  312. data/lib/backports/1.9.2/enumerable/collect_concat.rb +1 -0
  313. data/lib/backports/1.9.2/enumerable/each_entry.rb +11 -0
  314. data/lib/backports/1.9.2/enumerable/flat_map.rb +11 -0
  315. data/lib/backports/1.9.2/enumerable/slice_before.rb +30 -0
  316. data/lib/backports/1.9.2/float.rb +3 -4
  317. data/lib/backports/1.9.2/float/infinity.rb +3 -0
  318. data/lib/backports/1.9.2/float/nan.rb +3 -0
  319. data/lib/backports/1.9.2/hash.rb +2 -10
  320. data/lib/backports/1.9.2/hash/keep_if.rb +8 -0
  321. data/lib/backports/1.9.2/hash/select.rb +9 -0
  322. data/lib/backports/1.9.2/kernel.rb +3 -5
  323. data/lib/backports/1.9.2/kernel/singleton_class.rb +7 -0
  324. data/lib/backports/1.9.2/random.rb +1 -1
  325. data/lib/backports/1.9.2/stdlib.rb +1 -1
  326. data/lib/backports/1.9.2/stdlib/matrix.rb +9 -8
  327. data/lib/backports/1.9.2/stdlib/set.rb +1 -1
  328. data/lib/backports/1.9.3.rb +2 -4
  329. data/lib/backports/1.9.3/file.rb +3 -14
  330. data/lib/backports/1.9.3/file/null.rb +16 -0
  331. data/lib/backports/1.9.3/io.rb +2 -31
  332. data/lib/backports/1.9.3/io/advise.rb +24 -0
  333. data/lib/backports/1.9.3/io/binwrite.rb +7 -0
  334. data/lib/backports/1.9.3/io/write.rb +7 -0
  335. data/lib/backports/1.9.3/string.rb +2 -38
  336. data/lib/backports/1.9.3/string/byteslice.rb +36 -0
  337. data/lib/backports/1.9.3/string/prepend.rb +10 -0
  338. data/lib/backports/1.9.rb +1 -3
  339. data/lib/backports/2.0.0.rb +2 -4
  340. data/lib/backports/2.0.0/array.rb +2 -29
  341. data/lib/backports/2.0.0/array/bsearch.rb +32 -0
  342. data/lib/backports/2.0.0/enumerable.rb +2 -11
  343. data/lib/backports/2.0.0/enumerable/lazy.rb +216 -0
  344. data/lib/backports/2.0.0/enumerator.rb +3 -0
  345. data/lib/backports/2.0.0/enumerator/lazy.rb +1 -203
  346. data/lib/backports/2.0.0/env.rb +3 -0
  347. data/lib/backports/2.0.0/env/to_h.rb +5 -0
  348. data/lib/backports/2.0.0/hash.rb +2 -18
  349. data/lib/backports/2.0.0/hash/default_proc.rb +16 -0
  350. data/lib/backports/2.0.0/hash/to_h.rb +7 -0
  351. data/lib/backports/2.0.0/nil.rb +3 -0
  352. data/lib/backports/2.0.0/nil/to_h.rb +7 -0
  353. data/lib/backports/2.0.0/range.rb +2 -48
  354. data/lib/backports/2.0.0/range/bsearch.rb +49 -0
  355. data/lib/backports/2.0.0/stdlib/abbrev.rb +1 -0
  356. data/lib/backports/2.0.0/stdlib/fake_stdlib_lib.rb +1 -0
  357. data/lib/backports/2.0.0/stdlib/ostruct.rb +1 -1
  358. data/lib/backports/2.0.0/struct.rb +3 -7
  359. data/lib/backports/2.0.0/struct/to_h.rb +9 -0
  360. data/lib/backports/2.0.rb +1 -3
  361. data/lib/backports/basic_object.rb +29 -29
  362. data/lib/backports/{1.9.2 → extra}/random/MT19937.rb +2 -2
  363. data/lib/backports/{1.9.2 → extra}/random/bits_and_bytes.rb +1 -1
  364. data/lib/backports/{1.9.2 → extra}/random/implementation.rb +1 -1
  365. data/lib/backports/extra/random/load.rb +17 -0
  366. data/lib/backports/force/array_map.rb +1 -1
  367. data/lib/backports/force/enumerable_map.rb +1 -1
  368. data/lib/backports/force/hash_select.rb +1 -1
  369. data/lib/backports/force/string_size.rb +1 -1
  370. data/lib/backports/rails.rb +2 -2
  371. data/lib/backports/rails/enumerable.rb +1 -1
  372. data/lib/backports/rails/hash.rb +1 -1
  373. data/lib/backports/rails/kernel.rb +1 -1
  374. data/lib/backports/rails/module.rb +1 -1
  375. data/lib/backports/rails/string.rb +6 -6
  376. data/lib/backports/tools.rb +74 -64
  377. data/lib/backports/version.rb +1 -1
  378. data/set_version/1.8.7.rb +1 -0
  379. data/set_version/1.9.1.rb +1 -0
  380. data/set_version/1.9.2.rb +1 -0
  381. data/set_version/1.9.3.rb +1 -0
  382. data/set_version/2.0.0.rb +1 -0
  383. data/set_version/setter.rb +14 -0
  384. data/tags/1.8.6/core/array/rotate_spec.rb +2 -0
  385. data/tags/1.8.6/core/array/uniq_spec.rb +3 -0
  386. data/tags/1.8.6/core/complex/to_r_spec.rb +3 -0
  387. data/tags/1.8.6/core/enumerable/each_entry_spec.rb +1 -0
  388. data/tags/1.8.6/core/enumerator/next_spec.rb +1 -0
  389. data/tags/1.8.6/core/env/to_h_spec.rb +2 -0
  390. data/tags/1.8.6/core/file/join_spec.rb +3 -0
  391. data/tags/1.8.6/core/file/lchmod_spec.rb +2 -0
  392. data/tags/1.8.6/core/file/new_spec.rb +2 -0
  393. data/tags/1.8.6/core/file/open_spec.rb +10 -0
  394. data/tags/1.8.6/core/file/to_path_spec.rb +1 -0
  395. data/tags/1.8.6/core/fixnum/fdiv_spec.rb +1 -0
  396. data/tags/1.8.6/core/gc/stress_spec.rb +2 -0
  397. data/tags/1.8.6/core/hash/assoc_spec.rb +1 -0
  398. data/tags/1.8.6/core/hash/default_proc_spec.rb +2 -0
  399. data/tags/1.8.6/core/hash/eql_spec.rb +3 -0
  400. data/tags/1.8.6/core/hash/hash_spec.rb +3 -0
  401. data/tags/1.8.6/core/hash/keep_if_spec.rb +1 -0
  402. data/tags/1.8.6/core/hash/select_spec.rb +1 -0
  403. data/tags/1.8.6/core/integer/round_spec.rb +1 -0
  404. data/tags/1.8.6/core/io/binread_spec.rb +7 -0
  405. data/tags/1.8.6/core/io/chars_spec.rb +1 -0
  406. data/tags/1.8.6/core/io/each_char_spec.rb +1 -0
  407. data/tags/1.8.6/core/io/lines_spec.rb +1 -0
  408. data/tags/1.8.6/core/io/open_spec.rb +24 -0
  409. data/tags/1.8.6/core/io/ungetbyte_spec.rb +4 -0
  410. data/tags/1.8.6/core/io/write_spec.rb +3 -0
  411. data/tags/1.8.6/core/kernel/__callee___spec.rb +5 -0
  412. data/tags/1.8.6/core/kernel/__method___spec.rb +1 -0
  413. data/tags/1.8.6/core/kernel/define_singleton_method_spec.rb +2 -0
  414. data/tags/1.8.6/core/kernel/public_method_spec.rb +2 -0
  415. data/tags/1.8.6/core/math/log2_spec.rb +4 -0
  416. data/tags/1.8.6/core/math/log_spec.rb +3 -0
  417. data/tags/1.8.6/core/module/class_exec_spec.rb +2 -0
  418. data/tags/1.8.6/core/module/module_exec_spec.rb +2 -0
  419. data/tags/1.8.6/core/numeric/step_spec.rb +12 -0
  420. data/tags/1.8.6/core/proc/curry_spec.rb +4 -0
  421. data/tags/1.8.6/core/range/step_spec.rb +12 -0
  422. data/tags/1.8.6/core/string/getbyte_spec.rb +6 -0
  423. data/tags/1.8.6/core/string/partition_spec.rb +1 -0
  424. data/tags/1.8.6/core/string/prepend_spec.rb +1 -0
  425. data/tags/1.8.6/core/string/rpartition_spec.rb +1 -0
  426. data/tags/1.8.6/core/string/setbyte_spec.rb +5 -0
  427. data/tags/1.8.6/core/string/upto_spec.rb +1 -0
  428. data/tags/1.8.6/core/symbol/capitalize_spec.rb +3 -0
  429. data/tags/1.8.6/core/symbol/comparison_spec.rb +1 -0
  430. data/tags/1.8.6/core/symbol/downcase_spec.rb +2 -0
  431. data/tags/1.8.6/core/symbol/element_reference_spec.rb +2 -0
  432. data/tags/1.8.6/core/symbol/empty_spec.rb +1 -0
  433. data/tags/1.8.6/core/symbol/match_spec.rb +2 -0
  434. data/tags/1.8.6/core/symbol/swapcase_spec.rb +2 -0
  435. data/tags/1.8.6/core/symbol/upcase_spec.rb +1 -0
  436. data/tags/1.8.7/core/array/rotate_spec.rb +2 -0
  437. data/tags/1.8.7/core/array/uniq_spec.rb +3 -0
  438. data/tags/1.8.7/core/complex/to_r_spec.rb +3 -0
  439. data/tags/1.8.7/core/env/to_h_spec.rb +2 -0
  440. data/tags/1.8.7/core/file/lchmod_spec.rb +2 -0
  441. data/tags/1.8.7/core/file/new_spec.rb +1 -0
  442. data/tags/1.8.7/core/file/open_spec.rb +1 -0
  443. data/tags/1.8.7/core/file/readlink_spec.rb +6 -0
  444. data/tags/1.8.7/core/file/to_path_spec.rb +1 -0
  445. data/tags/1.8.7/core/hash/assoc_spec.rb +1 -0
  446. data/tags/1.8.7/core/hash/default_proc_spec.rb +2 -0
  447. data/tags/1.8.7/core/hash/keep_if_spec.rb +1 -0
  448. data/tags/1.8.7/core/hash/rassoc_spec.rb +1 -0
  449. data/tags/1.8.7/core/hash/select_spec.rb +1 -0
  450. data/tags/1.8.7/core/integer/round_spec.rb +1 -0
  451. data/tags/1.8.7/core/io/binread_spec.rb +7 -0
  452. data/tags/1.8.7/core/io/open_spec.rb +25 -0
  453. data/tags/1.8.7/core/io/ungetbyte_spec.rb +4 -0
  454. data/tags/1.8.7/core/io/write_spec.rb +3 -0
  455. data/tags/1.8.7/core/kernel/__callee___spec.rb +5 -0
  456. data/tags/1.8.7/core/kernel/define_singleton_method_spec.rb +2 -0
  457. data/tags/1.8.7/core/kernel/public_method_spec.rb +1 -0
  458. data/tags/1.8.7/core/math/log2_spec.rb +4 -0
  459. data/tags/1.8.7/core/math/log_spec.rb +3 -0
  460. data/tags/1.8.7/core/proc/curry_spec.rb +3 -0
  461. data/tags/1.8.7/core/string/getbyte_spec.rb +5 -0
  462. data/tags/1.8.7/core/string/prepend_spec.rb +1 -0
  463. data/tags/1.8.7/core/string/setbyte_spec.rb +5 -0
  464. data/tags/1.8.7/core/symbol/capitalize_spec.rb +3 -0
  465. data/tags/1.8.7/core/symbol/comparison_spec.rb +1 -0
  466. data/tags/1.8.7/core/symbol/downcase_spec.rb +2 -0
  467. data/tags/1.8.7/core/symbol/element_reference_spec.rb +2 -0
  468. data/tags/1.8.7/core/symbol/empty_spec.rb +1 -0
  469. data/tags/1.8.7/core/symbol/match_spec.rb +2 -0
  470. data/tags/1.8.7/core/symbol/swapcase_spec.rb +2 -0
  471. data/tags/1.8.7/core/symbol/upcase_spec.rb +1 -0
  472. data/tags/1.9.1/core/array/rotate_spec.rb +1 -0
  473. data/tags/1.9.1/core/env/to_h_spec.rb +2 -0
  474. data/tags/1.9.1/core/hash/default_proc_spec.rb +1 -0
  475. data/tags/1.9.1/core/io/write_spec.rb +2 -0
  476. data/tags/1.9.2/core/io/write_spec.rb +2 -0
  477. data/test/README +1 -1
  478. data/test/_backport_guards_test.rb +140 -0
  479. data/test/{test_lazy.rb → lazy_test.rb} +25 -20
  480. data/test/{test_socket_interaction.rb → socket_interaction_test.rb} +3 -3
  481. data/test/test_helper.rb +0 -4
  482. metadata +392 -16
  483. data/lib/backports/1.9.2/match_data.rb +0 -3
  484. data/lib/backports/1.9.2/random/load.rb +0 -16
  485. data/lib/backports/2.0.0/nil_class.rb +0 -5
  486. data/test/std_lib_loading_test.rb +0 -57
  487. data/test/test__me_first.rb +0 -51
@@ -1 +1 @@
1
- autoload :Random, File.expand_path(File.dirname(__FILE__) + "/random/load")
1
+ autoload :Random, "backports/extra/random/load"
@@ -1 +1 @@
1
- Backports::StdLib.extend_relative
1
+ Backports::StdLib.extend_relative
@@ -14,7 +14,6 @@
14
14
  require "e2mmap.rb"
15
15
 
16
16
  module ExceptionForMatrix # :nodoc:
17
- extend Exception2MessageMapper
18
17
  def_e2message(TypeError, "wrong argument type %s (expected %s)")
19
18
  def_e2message(ArgumentError, "Wrong # of arguments(%d for %d)")
20
19
 
@@ -118,6 +117,7 @@ end
118
117
  # * #to_s
119
118
  # * #inspect
120
119
  #
120
+ Backports.suppress_verbose_warnings do
121
121
  class Matrix
122
122
  include Enumerable
123
123
  include ExceptionForMatrix
@@ -186,7 +186,7 @@ class Matrix
186
186
  row_size = CoercionHelper.coerce_to_int(row_size)
187
187
  column_size = CoercionHelper.coerce_to_int(column_size)
188
188
  raise ArgumentError if row_size < 0 || column_size < 0
189
- return to_enum :build, row_size, column_size unless block_given?
189
+ return to_enum(:build, row_size, column_size) unless block_given?
190
190
  rows = Array.new(row_size) do |i|
191
191
  Array.new(column_size) do |j|
192
192
  yield i, j
@@ -401,7 +401,7 @@ class Matrix
401
401
  # Matrix[ [1,2], [3,4] ].each(:strict_lower).to_a # => [3]
402
402
  #
403
403
  def each(which = :all) # :yield: e
404
- return to_enum :each, which unless block_given?
404
+ return to_enum(:each, which) unless block_given?
405
405
  last = column_size - 1
406
406
  case which
407
407
  when :all
@@ -462,7 +462,7 @@ class Matrix
462
462
  # # 4 at 1, 1
463
463
  #
464
464
  def each_with_index(which = :all) # :yield: e, row, column
465
- return to_enum :each_with_index, which unless block_given?
465
+ return to_enum(:each_with_index, which) unless block_given?
466
466
  last = column_size - 1
467
467
  case which
468
468
  when :all
@@ -527,7 +527,7 @@ class Matrix
527
527
  def index(*args)
528
528
  raise ArgumentError, "wrong number of arguments(#{args.size} for 0-2)" if args.size > 2
529
529
  which = (args.size == 2 || SELECTORS.include?(args.last)) ? args.pop : :all
530
- return to_enum :find_index, which, *args unless block_given? || args.size == 1
530
+ return to_enum(:find_index, which, *args) unless block_given? || args.size == 1
531
531
  if args.size == 1
532
532
  value = args.first
533
533
  each_with_index(which) do |e, row_index, col_index|
@@ -809,7 +809,7 @@ class Matrix
809
809
  rows = @rows.collect {|row|
810
810
  row.collect {|e| e * m }
811
811
  }
812
- return new_matrix rows, column_size
812
+ return new_matrix(rows, column_size)
813
813
  when Vector
814
814
  m = self.class.column_vector(m)
815
815
  r = self * m
@@ -824,7 +824,7 @@ class Matrix
824
824
  end
825
825
  }
826
826
  }
827
- return new_matrix rows, m.column_size
827
+ return new_matrix(rows, m.column_size)
828
828
  else
829
829
  return apply_through_coercion(m, __method__)
830
830
  end
@@ -896,7 +896,7 @@ class Matrix
896
896
  rows = @rows.collect {|row|
897
897
  row.collect {|e| e / other }
898
898
  }
899
- return new_matrix rows, column_size
899
+ return new_matrix(rows, column_size)
900
900
  when Matrix
901
901
  return self * other.inverse
902
902
  else
@@ -1868,3 +1868,4 @@ class Vector
1868
1868
  "Vector" + @elements.inspect
1869
1869
  end
1870
1870
  end
1871
+ end
@@ -10,4 +10,4 @@ class Set
10
10
  to_a.each { |o| @hash.delete(o) unless yield(o) }
11
11
  self
12
12
  end unless method_defined? :keep_if
13
- end
13
+ end
@@ -1,5 +1,3 @@
1
1
  # require this file to load all the backports up to Ruby 1.9.3
2
-
3
- require File.expand_path(File.dirname(__FILE__) + "/tools")
4
- Backports.require_relative "1.9.2"
5
- Backports.require_relative_dir "1.9.3"
2
+ require 'backports/1.9.2'
3
+ Backports.require_relative_dir
@@ -1,14 +1,3 @@
1
- module File::Constants
2
- platform = RUBY_PLATFORM
3
- platform = RbConfig::CONFIG['host_os'] if platform == 'java'
4
- NULL = case platform
5
- when /mswin|mingw/i
6
- 'NUL'
7
- when /amiga/i
8
- 'NIL:'
9
- when /openvms/i
10
- 'NL:'
11
- else
12
- '/dev/null'
13
- end unless const_defined?(:NULL)
14
- end
1
+ require 'backports/tools'
2
+
3
+ Backports.require_relative_dir
@@ -0,0 +1,16 @@
1
+ unless File.const_defined? :NULL
2
+ module File::Constants
3
+ platform = RUBY_PLATFORM
4
+ platform = RbConfig::CONFIG['host_os'] if platform == 'java'
5
+ NULL = case platform
6
+ when /mswin|mingw/i
7
+ 'NUL'
8
+ when /amiga/i
9
+ 'NIL:'
10
+ when /openvms/i
11
+ 'NL:'
12
+ else
13
+ '/dev/null'
14
+ end
15
+ end
16
+ end
@@ -1,32 +1,3 @@
1
- class IO
2
- # Standard in Ruby 1.9.3 See official documentation[http://ruby-doc.org/core-1.9.3/IO.html#method-i-advise]
3
- # We're only for a platform not implementing advise, so we return nil.
4
- def advise(advice, offset=0, len=0)
5
- case advice
6
- when :normal,
7
- :sequential,
8
- :random,
9
- :willneed,
10
- :dontneed,
11
- :noreuse
12
- return nil
13
- when Symbol
14
- raise NotImplementedError, "Unsupported advice #{advice}"
15
- else
16
- raise TypeError, "advice must be a Symbol"
17
- end
18
- end unless method_defined? :advise
19
- end
20
-
21
- class << IO
22
- # Standard in Ruby 1.9.3 See official documentation[http://ruby-doc.org/core-1.9.3/IO.html#method-c-write]
23
- def write(name, string, offset = nil, options = Backports::Undefined)
24
- Backports.write(false, name, string, offset, options)
25
- end unless method_defined? :write
1
+ require 'backports/tools'
26
2
 
27
- # Standard in Ruby 1.9.3 See official documentation[http://ruby-doc.org/core-1.9.3/IO.html#method-c-binwrite]
28
- # This method does support an options hash, see http://bugs.ruby-lang.org/issues/5782
29
- def binwrite(name, string, offset = nil, options = Backports::Undefined)
30
- Backports.write(true, name, string, offset, options)
31
- end unless method_defined? :binwrite
32
- end
3
+ Backports.require_relative_dir
@@ -0,0 +1,24 @@
1
+ unless IO.method_defined? :advise
2
+ require 'backports/tools'
3
+
4
+ class IO
5
+ def advise(advice, offset=0, len=0)
6
+ raise RangeError if Backports.coerce_to_int(offset) >= 1<<31
7
+ raise RangeError if Backports.coerce_to_int(len) >= 1<<31
8
+ raise IOError if closed?
9
+ case advice
10
+ when :normal,
11
+ :sequential,
12
+ :random,
13
+ :willneed,
14
+ :dontneed,
15
+ :noreuse
16
+ return nil
17
+ when Symbol
18
+ raise NotImplementedError, "Unsupported advice #{advice}"
19
+ else
20
+ raise TypeError, "advice must be a Symbol"
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,7 @@
1
+ unless IO.respond_to? :binwrite
2
+ require 'backports/tools'
3
+
4
+ def IO.binwrite(name, string, offset = nil, options = Backports::Undefined)
5
+ Backports.write(true, name, string, offset, options)
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ unless IO.respond_to? :write
2
+ require 'backports/tools'
3
+
4
+ def IO.write(name, string, offset = nil, options = Backports::Undefined)
5
+ Backports.write(false, name, string, offset, options)
6
+ end
7
+ end
@@ -1,39 +1,3 @@
1
- class String
2
- # Standard in Ruby 1.9.3 See official documentation[http://ruby-doc.org/core-1.9.3/String.html#byteslice]
3
- def byteslice(start, len = Backports::Undefined)
4
- # Argument parsing & checking
5
- if Backports::Undefined == len
6
- if start.is_a?(Range)
7
- range = start
8
- start = Backports.coerce_to_int(range.begin)
9
- start += bytesize if start < 0
10
- last = Backports.coerce_to_int(range.end)
11
- last += bytesize if last < 0
12
- last += 1 unless range.exclude_end?
13
- len = last - start
14
- else
15
- start = Backports.coerce_to_int(start)
16
- start += bytesize if start < 0
17
- len = 1
18
- return if start >= bytesize
19
- end
20
- else
21
- start = Backports.coerce_to_int(start)
22
- start += bytesize if start < 0
23
- len = Backports.coerce_to_int(len)
24
- return if len < 0
25
- end
26
- return if start < 0 || start > bytesize
27
- len = 0 if len < 0
28
- # Actual implementation:
29
- str = unpack("@#{start}a#{len}").first
30
- str = dup.replace(str) unless self.instance_of?(String) # Must return subclass
31
- str.force_encoding(encoding)
32
- end unless method_defined? :byteslice
1
+ require 'backports/tools'
33
2
 
34
- # Standard in Ruby 1.9.3 See official documentation[http://ruby-doc.org/core-1.9.3/String.html#method-i-prepend]
35
- def prepend(other_str)
36
- replace Backports.coerce_to_str(other_str) + self
37
- self
38
- end unless method_defined? :prepend
39
- end
3
+ Backports.require_relative_dir
@@ -0,0 +1,36 @@
1
+ unless String.method_defined? :byteslice
2
+ require 'backports/tools'
3
+
4
+ class String
5
+ def byteslice(start, len = Backports::Undefined)
6
+ # Argument parsing & checking
7
+ if Backports::Undefined == len
8
+ if start.is_a?(Range)
9
+ range = start
10
+ start = Backports.coerce_to_int(range.begin)
11
+ start += bytesize if start < 0
12
+ last = Backports.coerce_to_int(range.end)
13
+ last += bytesize if last < 0
14
+ last += 1 unless range.exclude_end?
15
+ len = last - start
16
+ else
17
+ start = Backports.coerce_to_int(start)
18
+ start += bytesize if start < 0
19
+ len = 1
20
+ return if start >= bytesize
21
+ end
22
+ else
23
+ start = Backports.coerce_to_int(start)
24
+ start += bytesize if start < 0
25
+ len = Backports.coerce_to_int(len)
26
+ return if len < 0
27
+ end
28
+ return if start < 0 || start > bytesize
29
+ len = 0 if len < 0
30
+ # Actual implementation:
31
+ str = unpack("@#{start}a#{len}").first
32
+ str = dup.replace(str) unless self.instance_of?(String) # Must return subclass
33
+ str.force_encoding(encoding)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,10 @@
1
+ unless String.method_defined? :prepend
2
+ require 'backports/tools'
3
+
4
+ class String
5
+ def prepend(other_str)
6
+ replace Backports.coerce_to_str(other_str) + self
7
+ self
8
+ end
9
+ end
10
+ end
@@ -1,4 +1,2 @@
1
1
  # require this file to load all the backports of Ruby 1.9.x
2
-
3
- require File.expand_path(File.dirname(__FILE__) + "/tools")
4
- Backports.require_relative "1.9.3"
2
+ require 'backports/1.9.3'
@@ -1,5 +1,3 @@
1
1
  # require this file to load all the backports up to Ruby 2.0.0
2
-
3
- require File.expand_path(File.dirname(__FILE__) + "/tools")
4
- Backports.require_relative "1.9"
5
- Backports.require_relative_dir "2.0.0"
2
+ require 'backports/1.9'
3
+ Backports.require_relative_dir
@@ -1,30 +1,3 @@
1
- class Array
2
- def bsearch
3
- return to_enum(__method__) unless block_given?
4
- from = 0
5
- to = size - 1
6
- satisfied = nil
7
- while from <= to do
8
- midpoint = (from + to).div(2)
9
- result = yield(cur = self[midpoint])
10
- case result
11
- when Numeric
12
- return cur if result == 0
13
- result = result < 0
14
- when true
15
- satisfied = cur
16
- when nil, false
17
- # nothing to do
18
- else
19
- raise TypeError, "wrong argument type #{result.class} (must be numeric, true, false or nil)"
20
- end
1
+ require 'backports/tools'
21
2
 
22
- if result
23
- to = midpoint - 1
24
- else
25
- from = midpoint + 1
26
- end
27
- end
28
- satisfied
29
- end unless method_defined? :bsearch
30
- end
3
+ Backports.require_relative_dir
@@ -0,0 +1,32 @@
1
+ unless Array.method_defined? :bsearch
2
+ class Array
3
+ def bsearch
4
+ return to_enum(__method__) unless block_given?
5
+ from = 0
6
+ to = size - 1
7
+ satisfied = nil
8
+ while from <= to do
9
+ midpoint = (from + to).div(2)
10
+ result = yield(cur = self[midpoint])
11
+ case result
12
+ when Numeric
13
+ return cur if result == 0
14
+ result = result < 0
15
+ when true
16
+ satisfied = cur
17
+ when nil, false
18
+ # nothing to do
19
+ else
20
+ raise TypeError, "wrong argument type #{result.class} (must be numeric, true, false or nil)"
21
+ end
22
+
23
+ if result
24
+ to = midpoint - 1
25
+ else
26
+ from = midpoint + 1
27
+ end
28
+ end
29
+ satisfied
30
+ end
31
+ end
32
+ end
@@ -1,12 +1,3 @@
1
- unless Enumerable.method_defined? :lazy
2
- module Enumerable
3
- def lazy
4
- klass = Enumerator::Lazy.send :class_variable_get, :@@lazy_with_no_block # Note: class_variable_get is private in 1.8
5
- Enumerator::Lazy.new(klass.new(self, :each, []))
6
- end
7
- end
1
+ require 'backports/tools'
8
2
 
9
- class Enumerator
10
- require_relative 'enumerator/lazy'
11
- end
12
- end
3
+ Backports.require_relative_dir
@@ -0,0 +1,216 @@
1
+ unless Enumerable.method_defined? :lazy
2
+ require 'backports/tools'
3
+ require 'backports/1.9.1/enumerator/new'
4
+
5
+ module Enumerable
6
+ def lazy
7
+ klass = Enumerator::Lazy.send :class_variable_get, :@@lazy_with_no_block # Note: class_variable_get is private in 1.8
8
+ Enumerator::Lazy.new(klass.new(self, :each, []))
9
+ end
10
+ end
11
+
12
+ class Enumerator
13
+ class Yielder
14
+ # Current API for Lazy Enumerator does not provide an easy way
15
+ # to handle internal state. We "cheat" and use yielder to hold it for us.
16
+ # A new yielder is created when generating or after a `rewind`.
17
+ # This way we avoid issues like http://bugs.ruby-lang.org/issues/7691
18
+ # or http://bugs.ruby-lang.org/issues/7696
19
+ attr_accessor :backports_memo
20
+ end
21
+
22
+ class Lazy < Enumerator
23
+ @@done = :__backports_lazy_enumeration_done__ # used internally to bail out of an iteration
24
+ @@lazy_with_no_block = Struct.new(:object, :method, :args) # used internally to create lazy without block
25
+
26
+ def initialize(obj)
27
+ if obj.is_a?(@@lazy_with_no_block)
28
+ @inspect_info = obj
29
+ return super(@receiver = obj.object, @method = obj.method || :each, * @args = obj.args)
30
+ end
31
+ raise ArgumentError, "must supply a block" unless block_given?
32
+ @receiver = obj
33
+ super() do |yielder, *args|
34
+ catch @@done do
35
+ obj.each(*args) do |*x|
36
+ yield yielder, *x
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ alias_method :force, :to_a
43
+
44
+ def lazy
45
+ self
46
+ end
47
+
48
+ def to_enum(method = :each, *args)
49
+ Lazy.new(@@lazy_with_no_block.new(self, method, args))
50
+ end
51
+ alias_method :enum_for, :to_enum
52
+
53
+ def inspect
54
+ suff = ''
55
+ suff << ":#{@method}" unless @method.nil? || @method == :each
56
+ suff << "(#{@args.inspect[1...-1]})" if @args && !@args.empty?
57
+ "#<#{self.class}: #{@receiver.inspect}#{suff}>"
58
+ end
59
+
60
+ {
61
+ :slice_before => //,
62
+ :with_index => [],
63
+ :cycle => [],
64
+ :each_with_object => 42,
65
+ :each_slice => 42,
66
+ :each_entry => [],
67
+ :each_cons => 42,
68
+ }.each do |method, args|
69
+ next unless Enumerator.method_defined? method
70
+ unless [].lazy.send(method, *args).is_a?(Lazy) # Nothing to do if already backported, since it would use to_enum...
71
+ module_eval <<-EOT, __FILE__, __LINE__ + 1
72
+ def #{method}(*args) # def cycle(*args)
73
+ return to_enum(:#{method}, *args) unless block_given? # return to_enum(:cycle, *args) unless block_given?
74
+ super # super
75
+ end # end
76
+ EOT
77
+ end
78
+ end
79
+
80
+ def chunk(*)
81
+ super.lazy
82
+ end if Enumerable.method_defined?(:chunk) && ![].lazy.chunk{}.is_a?(Lazy)
83
+
84
+ def map
85
+ raise ArgumentError, "tried to call lazy map without a block" unless block_given?
86
+ Lazy.new(self) do |yielder, *values|
87
+ yielder << yield(*values)
88
+ end.__set_inspect :map
89
+ end
90
+ alias_method :collect, :map
91
+
92
+ def select
93
+ raise ArgumentError, "tried to call lazy select without a block" unless block_given?
94
+ Lazy.new(self) do |yielder, *values|
95
+ values = values.first unless values.size > 1
96
+ yielder.yield values if yield values
97
+ end.__set_inspect :select
98
+ end
99
+ alias_method :find_all, :select
100
+
101
+ def reject
102
+ raise ArgumentError, "tried to call lazy reject without a block" unless block_given?
103
+ Lazy.new(self) do |yielder, *values|
104
+ values = values.first unless values.size > 1
105
+ yielder.yield(values) unless yield values
106
+ end.__set_inspect :reject
107
+ end
108
+
109
+ def grep(pattern)
110
+ if block_given?
111
+ # Split for performance
112
+ Lazy.new(self) do |yielder, *values|
113
+ values = values.first unless values.size > 1
114
+ yielder.yield(yield(values)) if pattern === values
115
+ end
116
+ else
117
+ Lazy.new(self) do |yielder, *values|
118
+ values = values.first unless values.size > 1
119
+ yielder.yield(values) if pattern === values
120
+ end
121
+ end.__set_inspect :grep, [pattern]
122
+ end
123
+
124
+ def drop(n)
125
+ n = Backports::coerce_to_int(n)
126
+ Lazy.new(self) do |yielder, *values|
127
+ data = yielder.backports_memo ||= {:remain => n}
128
+ if data[:remain] > 0
129
+ data[:remain] -= 1
130
+ else
131
+ yielder.yield(*values)
132
+ end
133
+ end.__set_inspect :drop, [n]
134
+ end
135
+
136
+ def drop_while
137
+ raise ArgumentError, "tried to call lazy drop_while without a block" unless block_given?
138
+ Lazy.new(self) do |yielder, *values|
139
+ data = yielder.backports_memo ||= {:dropping => true}
140
+ yielder.yield(*values) unless data[:dropping] &&= yield(*values)
141
+ end.__set_inspect :drop_while
142
+ end
143
+
144
+ def take(n)
145
+ n = Backports::coerce_to_int(n)
146
+ raise ArgumentError, 'attempt to take negative size' if n < 0
147
+ Lazy.new(n == 0 ? [] : self) do |yielder, *values|
148
+ data = yielder.backports_memo ||= {:remain => n}
149
+ yielder.yield(*values)
150
+ throw @@done if (data[:remain] -= 1) == 0
151
+ end.__set_inspect :take, [n], self
152
+ end
153
+
154
+ def take_while
155
+ raise ArgumentError, "tried to call lazy take_while without a block" unless block_given?
156
+ Lazy.new(self) do |yielder, *values|
157
+ throw @@done unless yield(*values)
158
+ yielder.yield(*values)
159
+ end.__set_inspect :take_while
160
+ end
161
+
162
+ def flat_map
163
+ raise ArgumentError, "tried to call lazy flat_map without a block" unless block_given?
164
+ Lazy.new(self) do |yielder, *values|
165
+ result = yield(*values)
166
+ ary = Backports.is_array?(result)
167
+ if ary || (result.respond_to?(:each) && result.respond_to?(:force))
168
+ (ary || result).each{|x| yielder << x }
169
+ else
170
+ yielder << result
171
+ end
172
+ end.__set_inspect :flat_map
173
+ end
174
+ alias_method :collect_concat, :flat_map
175
+
176
+ def zip(*args)
177
+ return super if block_given?
178
+ arys = args.map{ |arg| Backports.is_array?(arg) }
179
+ if arys.all?
180
+ # Handle trivial case of multiple array arguments separately
181
+ # by avoiding Enumerator#next for efficiency & compatibility
182
+ Lazy.new(self) do |yielder, *values|
183
+ data = yielder.backports_memo ||= {:iter => 0}
184
+ values = values.first unless values.size > 1
185
+ yielder << arys.map{|ary| ary[data[:iter]]}.unshift(values)
186
+ data[:iter] += 1
187
+ end
188
+ else
189
+ args.each do |a|
190
+ raise TypeError, "wrong argument type #{a.class} (must respond to :each)" unless a.respond_to? :each
191
+ end
192
+ Lazy.new(self) do |yielder, *values|
193
+ enums = yielder.backports_memo ||= args.map(&:to_enum)
194
+ values = values.first unless values.size > 1
195
+ others = enums.map do |arg|
196
+ begin
197
+ arg.next
198
+ rescue StopIteration
199
+ nil
200
+ end
201
+ end
202
+ yielder << others.unshift(values)
203
+ end
204
+ end.__set_inspect :zip, args
205
+ end
206
+
207
+ protected
208
+ def __set_inspect(method, args = nil, receiver = nil)
209
+ @method = method
210
+ @args = args
211
+ @receiver = receiver if receiver
212
+ self
213
+ end
214
+ end
215
+ end
216
+ end