facets 2.6.0 → 2.7.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 (321) hide show
  1. data/HISTORY.rdoc +331 -35
  2. data/MANIFEST +685 -826
  3. data/{doc/guide/notes.rd → NOTES} +0 -0
  4. data/README.rdoc +73 -25
  5. data/Rakefile +245 -2
  6. data/TODO +5 -0
  7. data/demo/hook.rd +47 -0
  8. data/demo/scenario_require.rd +9 -0
  9. data/doc/README.more +24 -6
  10. data/doc/manual/about.rb +47 -0
  11. data/doc/manual/annotations.rdoc +60 -0
  12. data/doc/manual/associations.rdoc +55 -0
  13. data/doc/manual/blockups.rdoc +101 -0
  14. data/doc/manual/capsule.rdoc +34 -0
  15. data/doc/manual/command.rdoc +177 -0
  16. data/doc/manual/core.rdoc +37 -0
  17. data/doc/manual/faq.rdoc +32 -0
  18. data/doc/manual/typecast.html +112 -0
  19. data/lib/core/facets.rb +359 -11
  20. data/lib/core/facets/array/combination.rb +3 -3
  21. data/lib/core/facets/array/index.rb +4 -1
  22. data/lib/core/facets/array/permutation.rb +2 -2
  23. data/lib/core/facets/array/product.rb +1 -1
  24. data/lib/core/facets/binding/eval.rb +1 -1
  25. data/lib/core/facets/denumerable.rb +76 -0
  26. data/lib/core/facets/duplicable.rb +34 -0
  27. data/lib/core/facets/enumerable/count.rb +10 -4
  28. data/lib/core/facets/enumerable/defer.rb +77 -0
  29. data/lib/core/facets/enumerable/each_by.rb +1 -1
  30. data/lib/core/facets/enumerable/every.rb +35 -0
  31. data/lib/{more/facets/elementwise.rb → core/facets/enumerable/ewise.rb} +0 -0
  32. data/lib/core/facets/enumerable/filter.rb +25 -0
  33. data/lib/core/facets/enumerable/group_by.rb +1 -1
  34. data/lib/core/facets/enumerable/none.rb +3 -2
  35. data/lib/core/facets/enumerable/one.rb +3 -2
  36. data/lib/core/facets/enumerable/per.rb +61 -0
  37. data/lib/core/facets/exception/raised.rb +14 -0
  38. data/lib/core/facets/integer/odd.rb +5 -1
  39. data/lib/core/facets/kernel/__dir__.rb +13 -3
  40. data/lib/core/facets/kernel/__here__.rb +14 -0
  41. data/lib/core/facets/kernel/__method__.rb +9 -3
  42. data/lib/core/facets/kernel/ask.rb +1 -0
  43. data/lib/core/facets/kernel/equate.rb +13 -0
  44. data/lib/core/facets/kernel/extension.rb +9 -0
  45. data/lib/core/facets/kernel/identical.rb +4 -0
  46. data/lib/core/facets/kernel/instance_exec.rb +2 -1
  47. data/lib/core/facets/kernel/method.rb +49 -0
  48. data/lib/core/facets/kernel/object_send.rb +2 -2
  49. data/lib/core/facets/kernel/{state.rb → object_state.rb} +23 -12
  50. data/lib/core/facets/kernel/require_all.rb +6 -1
  51. data/lib/core/facets/kernel/require_local.rb +8 -1
  52. data/lib/core/facets/kernel/require_relative.rb +52 -0
  53. data/lib/core/facets/kernel/source_location.rb +13 -0
  54. data/lib/core/facets/kernel/tap.rb +13 -6
  55. data/lib/core/facets/module/attr_setter.rb +57 -0
  56. data/lib/core/facets/module/instance_method.rb +24 -0
  57. data/lib/core/facets/module/module_load.rb +60 -44
  58. data/lib/core/facets/module/module_require.rb +1 -0
  59. data/lib/core/facets/nilclass/to_f.rb +1 -1
  60. data/lib/core/facets/objectspace/op_fetch.rb +3 -0
  61. data/lib/core/facets/proc/curry.rb +4 -3
  62. data/lib/core/facets/string/bytes.rb +10 -4
  63. data/lib/core/facets/string/camelcase.rb +6 -5
  64. data/lib/core/facets/string/chars.rb +5 -1
  65. data/lib/core/facets/string/each_char.rb +1 -1
  66. data/lib/core/facets/string/each_word.rb +1 -1
  67. data/lib/core/facets/string/lines.rb +11 -4
  68. data/lib/core/facets/string/start_with.rb +9 -2
  69. data/lib/core/facets/string/unfold.rb +27 -0
  70. data/lib/core/facets/symbol/succ.rb +3 -3
  71. data/lib/core/facets/symbol/thrown.rb +20 -0
  72. data/lib/core/facets/symbol/to_proc.rb +3 -2
  73. data/lib/core/facets/time/to_time.rb +1 -1
  74. data/lib/core/facets/to_hash.rb +41 -100
  75. data/lib/core/facets/unboundmethod/name.rb +20 -23
  76. data/lib/more/facets/ansicode.rb +1 -10
  77. data/lib/more/facets/autoarray.rb +3 -31
  78. data/lib/more/facets/basicobject.rb +73 -0
  79. data/lib/more/facets/blankslate.rb +2 -66
  80. data/lib/{lore → more}/facets/cgi.rb +0 -0
  81. data/lib/more/facets/class_extend.rb +1 -0
  82. data/lib/{lore → more}/facets/continuation.rb +0 -0
  83. data/lib/{lore → more}/facets/date.rb +3 -3
  84. data/lib/more/facets/enumargs.rb +192 -0
  85. data/lib/more/facets/enumerablepass.rb +2 -216
  86. data/lib/more/facets/enumerator.rb +62 -0
  87. data/lib/more/facets/{equatable.rb → equitable.rb} +11 -11
  88. data/lib/more/facets/expirable.rb +13 -41
  89. data/lib/{lore → more}/facets/fileutils.rb +0 -0
  90. data/lib/{lore → more}/facets/fileutils/head.rb +0 -0
  91. data/lib/{lore → more}/facets/fileutils/safe_ln.rb +0 -0
  92. data/lib/{lore → more}/facets/fileutils/slice.rb +0 -0
  93. data/lib/{lore → more}/facets/fileutils/tail.rb +0 -0
  94. data/lib/{lore → more}/facets/fileutils/wc.rb +0 -0
  95. data/lib/{lore → more}/facets/fileutils/whereis.rb +0 -0
  96. data/lib/{lore → more}/facets/fileutils/which.rb +0 -0
  97. data/lib/{lore → more}/facets/getoptlong.rb +0 -0
  98. data/lib/more/facets/hook.rb +2 -29
  99. data/lib/more/facets/inheritor.rb +2 -2
  100. data/lib/more/facets/instance_eval.rb +50 -0
  101. data/lib/more/facets/instance_function.rb +78 -0
  102. data/lib/more/facets/main.rb +20 -15
  103. data/lib/more/facets/memoize.rb +1 -113
  104. data/lib/more/facets/module/attr.rb +83 -0
  105. data/lib/more/facets/module/attr_tester.rb +44 -0
  106. data/lib/more/facets/module/attr_toggler.rb +59 -0
  107. data/lib/more/facets/module/attr_validator.rb +34 -0
  108. data/lib/more/facets/{class_extension.rb → module/class_extend.rb} +21 -13
  109. data/lib/more/facets/once.rb +59 -0
  110. data/lib/more/facets/openmodule.rb +1 -0
  111. data/lib/more/facets/orderedhash.rb +1 -33
  112. data/lib/{lore → more}/facets/ostruct.rb +0 -0
  113. data/lib/more/facets/ostructable.rb +1 -4
  114. data/lib/more/facets/partial.rb +18 -16
  115. data/lib/{lore → more}/facets/pathname.rb +0 -0
  116. data/lib/more/facets/preinitialize.rb +157 -0
  117. data/lib/{lore → more}/facets/rbconfig.rb +0 -0
  118. data/lib/more/facets/recorder.rb +1 -2
  119. data/lib/{lore → more}/facets/set.rb +0 -0
  120. data/lib/{lore → more}/facets/shellwords.rb +0 -0
  121. data/lib/{lore → more}/facets/uri.rb +0 -0
  122. data/lib/{lore → more}/facets/yaml.rb +0 -0
  123. data/lib/{lore → more}/facets/zlib.rb +0 -0
  124. data/meta/loadpath +0 -1
  125. data/meta/sitemap +4 -0
  126. data/meta/version +1 -1
  127. data/test/core/enumerable/test_count.rb +1 -1
  128. data/test/{more/test_filter.rb → core/enumerable/test_defer.rb} +24 -22
  129. data/test/{more/test_elementor.rb → core/enumerable/test_every.rb} +2 -15
  130. data/test/core/enumerable/test_ewise.rb +23 -0
  131. data/test/core/enumerable/test_per.rb +18 -0
  132. data/test/core/enumerable/test_take.rb +13 -0
  133. data/test/core/kernel/test_deepcopy.rb +1 -1
  134. data/test/{more/test_1stclassmethod.rb → core/kernel/test_method.rb} +2 -7
  135. data/test/core/kernel/test_tap.rb +1 -1
  136. data/test/core/proc/test_curry.rb +11 -0
  137. data/test/core/string/test_bytes.rb +1 -1
  138. data/test/core/string/test_camelcase.rb +23 -6
  139. data/test/core/string/test_lines.rb +1 -1
  140. data/test/core/string/test_unfold.rb +14 -0
  141. data/test/{more → core}/test_blank.rb +0 -0
  142. data/test/{more → core}/test_boolean.rb +0 -0
  143. data/test/{more → core}/test_functor.rb +0 -0
  144. data/test/{lore → more}/test_basicobject.rb +0 -0
  145. data/test/more/{test_class_extension.rb → test_class_extend.rb} +6 -6
  146. data/test/{lore → more}/test_continuation.rb +0 -0
  147. data/test/{lore → more}/test_date.rb +0 -0
  148. data/test/more/{test_enumerablepass.rb → test_enumargs.rb} +2 -4
  149. data/test/more/{test_equatable.rb → test_equitable.rb} +2 -2
  150. data/test/more/{test_instantise.rb → test_instance_function.rb} +3 -2
  151. data/test/more/test_memoize.rb +1 -1
  152. data/test/{lore → more}/test_ostruct.rb +0 -0
  153. metadata +865 -1016
  154. data/RELEASE +0 -38
  155. data/doc/README.lore +0 -51
  156. data/doc/log/basic_stats/index.html +0 -39
  157. data/doc/log/changelog.html +0 -648
  158. data/doc/log/changelog.txt +0 -217
  159. data/doc/log/stats/index.html +0 -39
  160. data/doc/log/testlog.txt +0 -278
  161. data/doc/notes/CHANGES +0 -2529
  162. data/doc/rdoc/lore/classes/Array.html +0 -176
  163. data/doc/rdoc/lore/classes/CGI.html +0 -191
  164. data/doc/rdoc/lore/classes/Config.html +0 -135
  165. data/doc/rdoc/lore/classes/Continuation.html +0 -113
  166. data/doc/rdoc/lore/classes/Date.html +0 -631
  167. data/doc/rdoc/lore/classes/DateTime.html +0 -583
  168. data/doc/rdoc/lore/classes/Enumerable.html +0 -89
  169. data/doc/rdoc/lore/classes/Enumerable/Enumerator.html +0 -147
  170. data/doc/rdoc/lore/classes/File.html +0 -128
  171. data/doc/rdoc/lore/classes/FileUtils.html +0 -434
  172. data/doc/rdoc/lore/classes/GetoptLong.html +0 -118
  173. data/doc/rdoc/lore/classes/GetoptLong/DSL.html +0 -208
  174. data/doc/rdoc/lore/classes/Kernel.html +0 -135
  175. data/doc/rdoc/lore/classes/Logger.html +0 -229
  176. data/doc/rdoc/lore/classes/Logger/Ansicolor.html +0 -277
  177. data/doc/rdoc/lore/classes/Logger/LogDevice.html +0 -121
  178. data/doc/rdoc/lore/classes/NilClass.html +0 -119
  179. data/doc/rdoc/lore/classes/OpenStruct.html +0 -432
  180. data/doc/rdoc/lore/classes/Pathname.html +0 -353
  181. data/doc/rdoc/lore/classes/Set.html +0 -117
  182. data/doc/rdoc/lore/classes/Shellwords.html +0 -111
  183. data/doc/rdoc/lore/classes/String.html +0 -140
  184. data/doc/rdoc/lore/classes/Time.html +0 -154
  185. data/doc/rdoc/lore/classes/URI.html +0 -454
  186. data/doc/rdoc/lore/classes/URI/Hash.html +0 -105
  187. data/doc/rdoc/lore/classes/URI/Kernel.html +0 -122
  188. data/doc/rdoc/lore/classes/Zlib.html +0 -188
  189. data/doc/rdoc/lore/created.rid +0 -1
  190. data/doc/rdoc/lore/files/README.html +0 -286
  191. data/doc/rdoc/lore/files/doc/README_lore.html +0 -155
  192. data/doc/rdoc/lore/files/lib/lore/facets/basicobject_rb.html +0 -118
  193. data/doc/rdoc/lore/files/lib/lore/facets/cgi_rb.html +0 -111
  194. data/doc/rdoc/lore/files/lib/lore/facets/continuation_rb.html +0 -147
  195. data/doc/rdoc/lore/files/lib/lore/facets/date_rb.html +0 -97
  196. data/doc/rdoc/lore/files/lib/lore/facets/enumerator_rb.html +0 -111
  197. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/head_rb.html +0 -96
  198. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/safe_ln_rb.html +0 -96
  199. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/slice_rb.html +0 -96
  200. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/tail_rb.html +0 -96
  201. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/wc_rb.html +0 -96
  202. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/whereis_rb.html +0 -96
  203. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/which_rb.html +0 -96
  204. data/doc/rdoc/lore/files/lib/lore/facets/fileutils_rb.html +0 -131
  205. data/doc/rdoc/lore/files/lib/lore/facets/getoptlong_rb.html +0 -135
  206. data/doc/rdoc/lore/files/lib/lore/facets/logger_rb.html +0 -142
  207. data/doc/rdoc/lore/files/lib/lore/facets/ostruct_rb.html +0 -135
  208. data/doc/rdoc/lore/files/lib/lore/facets/pathname_rb.html +0 -145
  209. data/doc/rdoc/lore/files/lib/lore/facets/rbconfig_rb.html +0 -124
  210. data/doc/rdoc/lore/files/lib/lore/facets/set_rb.html +0 -96
  211. data/doc/rdoc/lore/files/lib/lore/facets/shellwords_rb.html +0 -124
  212. data/doc/rdoc/lore/files/lib/lore/facets/uri_rb.html +0 -125
  213. data/doc/rdoc/lore/files/lib/lore/facets/yaml_rb.html +0 -146
  214. data/doc/rdoc/lore/files/lib/lore/facets/zlib_rb.html +0 -97
  215. data/doc/rdoc/lore/fr_class_index.html +0 -73
  216. data/doc/rdoc/lore/fr_file_index.html +0 -71
  217. data/doc/rdoc/lore/fr_method_index.html +0 -177
  218. data/doc/rdoc/lore/index.html +0 -26
  219. data/doc/rdoc/lore/rdoc-style.css +0 -177
  220. data/doc/release-notes/RELEASE-2.0.5 +0 -8
  221. data/doc/release-notes/RELEASE-2.1.0 +0 -9
  222. data/doc/release-notes/RELEASE-2.1.1 +0 -5
  223. data/doc/release-notes/RELEASE-2.1.2 +0 -6
  224. data/doc/release-notes/RELEASE-2.1.3 +0 -5
  225. data/doc/release-notes/RELEASE-2.2.0 +0 -14
  226. data/doc/release-notes/RELEASE-2.2.1 +0 -4
  227. data/doc/release-notes/RELEASE-2.3.0 +0 -6
  228. data/doc/release-notes/RELEASE-2.4.0 +0 -70
  229. data/doc/release-notes/RELEASE-2.4.1 +0 -8
  230. data/doc/release-notes/RELEASE-2.4.2 +0 -4
  231. data/doc/release-notes/RELEASE-2.4.3 +0 -78
  232. data/doc/release-notes/RELEASE-2.4.4 +0 -38
  233. data/doc/release-notes/RELEASE-2.4.5 +0 -37
  234. data/doc/release-notes/RELEASE-2.5.0 +0 -83
  235. data/lib/core/facets/kernel/instance.rb +0 -19
  236. data/lib/lore/facets/basicobject.rb +0 -14
  237. data/lib/lore/facets/enumerator.rb +0 -67
  238. data/lib/lore/facets/logger.rb +0 -291
  239. data/lib/more/facets/1stclassmethod.rb +0 -140
  240. data/lib/more/facets/advisable.rb +0 -162
  241. data/lib/more/facets/association.rb +0 -210
  242. data/lib/more/facets/attr.rb +0 -209
  243. data/lib/more/facets/basex.rb +0 -37
  244. data/lib/more/facets/bbcode.rb +0 -397
  245. data/lib/more/facets/bicrypt.rb +0 -265
  246. data/lib/more/facets/binreadable.rb +0 -221
  247. data/lib/more/facets/censor.rb +0 -97
  248. data/lib/more/facets/classmethods.rb +0 -199
  249. data/lib/more/facets/consoleutils.rb +0 -99
  250. data/lib/more/facets/crypt.rb +0 -166
  251. data/lib/more/facets/dependency.rb +0 -151
  252. data/lib/more/facets/downloader.rb +0 -281
  253. data/lib/more/facets/duplicable.rb +0 -43
  254. data/lib/more/facets/elementor.rb +0 -133
  255. data/lib/more/facets/filter.rb +0 -121
  256. data/lib/more/facets/heap.rb +0 -22
  257. data/lib/more/facets/infinity.rb +0 -193
  258. data/lib/more/facets/ini.rb +0 -264
  259. data/lib/more/facets/instantise.rb +0 -1
  260. data/lib/more/facets/instantize.rb +0 -95
  261. data/lib/more/facets/interval.rb +0 -282
  262. data/lib/more/facets/iteration.rb +0 -65
  263. data/lib/more/facets/linkedlist.rb +0 -222
  264. data/lib/more/facets/lrucache.rb +0 -157
  265. data/lib/more/facets/matcher.rb +0 -140
  266. data/lib/more/facets/memoizer.rb +0 -74
  267. data/lib/more/facets/minitar.rb +0 -1063
  268. data/lib/more/facets/nackclass.rb +0 -41
  269. data/lib/more/facets/net/smtp_tls.rb +0 -131
  270. data/lib/more/facets/nilstatus.rb +0 -48
  271. data/lib/more/facets/overload.rb +0 -94
  272. data/lib/more/facets/paramix.rb +0 -202
  273. data/lib/more/facets/pool.rb +0 -91
  274. data/lib/more/facets/pqueue.rb +0 -449
  275. data/lib/more/facets/pry.rb +0 -32
  276. data/lib/more/facets/reflection.rb +0 -145
  277. data/lib/more/facets/semaphore.rb +0 -92
  278. data/lib/more/facets/settings.rb +0 -248
  279. data/lib/more/facets/snapshot.rb +0 -209
  280. data/lib/more/facets/sparse_array.rb +0 -809
  281. data/lib/more/facets/string/mask.rb +0 -278
  282. data/lib/more/facets/string/obfuscate.rb +0 -65
  283. data/lib/more/facets/string/stylize.rb +0 -169
  284. data/lib/more/facets/string/words.rb +0 -167
  285. data/lib/more/facets/syncarray.rb +0 -114
  286. data/lib/more/facets/synchash.rb +0 -157
  287. data/lib/more/facets/typecast.rb +0 -261
  288. data/lib/more/facets/uninheritable.rb +0 -50
  289. data/lib/more/facets/xmlhash.rb +0 -112
  290. data/lib/more/facets/xoxo.rb +0 -259
  291. data/lib/more/facets/ziputils.rb +0 -490
  292. data/task/conflicts +0 -63
  293. data/task/coverage.rake +0 -37
  294. data/task/methods +0 -49
  295. data/task/rdoc.rake +0 -17
  296. data/task/setup.rake +0 -38
  297. data/task/test.rake +0 -145
  298. data/test/more/test_advisable.rb +0 -71
  299. data/test/more/test_association.rb +0 -38
  300. data/test/more/test_bbcode.rb +0 -21
  301. data/test/more/test_binreadable.rb +0 -50
  302. data/test/more/test_buildable.rb +0 -73
  303. data/test/more/test_classmethods.rb +0 -56
  304. data/test/more/test_crypt.rb +0 -32
  305. data/test/more/test_dependency.rb +0 -69
  306. data/test/more/test_elementwise.rb +0 -25
  307. data/test/more/test_infinity.rb +0 -40
  308. data/test/more/test_interval.rb +0 -151
  309. data/test/more/test_linkedlist.rb +0 -41
  310. data/test/more/test_lrucache.rb +0 -14
  311. data/test/more/test_overload.rb +0 -160
  312. data/test/more/test_paramix.rb +0 -170
  313. data/test/more/test_prototype.rb +0 -35
  314. data/test/more/test_snapshot.rb +0 -21
  315. data/test/more/test_sparsearray.rb +0 -279
  316. data/test/more/test_syncarray.rb +0 -15
  317. data/test/more/test_synchash.rb +0 -16
  318. data/test/more/test_typecast.rb +0 -54
  319. data/test/more/test_uninheritable.rb +0 -31
  320. data/test/more/test_xoxo.rb +0 -274
  321. data/test/test_facets.rb +0 -9
@@ -1,6 +1,6 @@
1
1
  class Integer
2
2
 
3
- if RUBY_VERSION < '1.9'
3
+ unless method_defined?(:odd?) # 1.8.7+
4
4
 
5
5
  # Returns true if this integer is odd, false otherwise.
6
6
  #
@@ -17,6 +17,10 @@ class Integer
17
17
  self & 1 == 1
18
18
  end
19
19
 
20
+ end
21
+
22
+ unless method_defined?(:even?) # 1.8.7+
23
+
20
24
  # Returns true if this integer is even, false otherwise.
21
25
  #
22
26
  # 2.even? #=> true
@@ -1,12 +1,22 @@
1
1
  module Kernel
2
2
 
3
- # Similar to __FILE__ and __LINE__, __DIR__ provides
4
- # the directory path to the current executing script.
3
+ # Similar to __FILE__, __DIR__ provides the directory
4
+ # path to the current executing script.
5
5
  #
6
6
  # CREDIT: Trans
7
7
 
8
8
  def __DIR__
9
- (/^(.+)?:\d+/ =~ caller[0]) ? File.dirname($1) : nil
9
+ c = caller.first
10
+ return nil unless c.rindex(/:\d+(:in `.*')?$/)
11
+ file = $` # File.dirname(c)
12
+ return nil if /\A\((.*)\)/ =~ file # eval, etc.
13
+ #File.expand_path(File.dirname(file))
14
+ File.dirname(file)
10
15
  end
11
16
 
17
+ #def __DIR__
18
+ # (/^(.+)?:\d+/ =~ caller[0]) ? File.dirname($1) : nil
19
+ #end
20
+
12
21
  end
22
+
@@ -0,0 +1,14 @@
1
+ module Kernel
2
+
3
+ # Outputs the file, line and current method.
4
+ #
5
+ # caller(1).first
6
+ # "/usr/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'"
7
+ #
8
+ # CREDIT: William Mason
9
+ def __HERE__
10
+ caller(1).first
11
+ end
12
+
13
+ end
14
+
@@ -1,6 +1,6 @@
1
- unless (RUBY_VERSION[0,3] == '1.9')
1
+ module Kernel
2
2
 
3
- module Kernel
3
+ unless method_defined?(:__method__) # 1.8.7+
4
4
 
5
5
  # Retreive the current running method name.
6
6
  #
@@ -15,6 +15,12 @@ unless (RUBY_VERSION[0,3] == '1.9')
15
15
  /\`([^\']+)\'/.match(caller(1).first)[1].to_sym
16
16
  end
17
17
 
18
+ private :__method__
19
+
20
+ end
21
+
22
+ unless method_defined?(:__callee__) # 1.9+ # TODO: Is this so?
23
+
18
24
  # Retreive the current running method name.
19
25
  #
20
26
  # def tester; __callee__; end
@@ -28,7 +34,7 @@ unless (RUBY_VERSION[0,3] == '1.9')
28
34
  /\`([^\']+)\'/.match(caller(1).first)[1].to_sym
29
35
  end
30
36
 
31
- private :__callee__, :__method__
37
+ private :__callee__
32
38
 
33
39
  end
34
40
 
@@ -19,6 +19,7 @@ module Kernel
19
19
  def ask(question, answers=nil)
20
20
  $stdout << "#{question}"
21
21
  $stdout << " [#{answers}] " if answers
22
+ $stdout.flush
22
23
  until inp = $stdin.gets ; sleep 1 ; end
23
24
  inp.strip
24
25
  end
@@ -0,0 +1,13 @@
1
+ module Kernel
2
+
3
+ # Broad equality.
4
+ #
5
+ # Checks to see if the object +x+ is in any
6
+ # way equal to the reciever, starting with the
7
+ # identity #equals? and ending with #===.
8
+ #
9
+ def equate?(x)
10
+ equal?(x) || eql?(x) || self == x || self === x
11
+ end
12
+
13
+ end
@@ -0,0 +1,9 @@
1
+ module Kernel
2
+
3
+ # Don't say it!
4
+ def extension
5
+ class << self; self; end
6
+ end
7
+
8
+ end
9
+
@@ -0,0 +1,4 @@
1
+ module Kernel
2
+ alias_method :identical?, :equal?
3
+ end
4
+
@@ -1,9 +1,10 @@
1
1
  class Object #module Kernel
2
2
 
3
- unless defined? instance_exec # 1.9
3
+ unless method_defined?(:instance_exec) # 1.9
4
4
 
5
5
  module InstanceExecMethods #:nodoc:
6
6
  end
7
+
7
8
  include InstanceExecMethods
8
9
 
9
10
  # Evaluate the block with the given arguments within the context of
@@ -0,0 +1,49 @@
1
+ $FIRST_CLASS_METHODS = Hash.new{ |h,k| h[k] = {} }
2
+
3
+ module Kernel
4
+
5
+ # Easy access to method as object, and they retain state.
6
+ #
7
+ # def hello
8
+ # puts "Hello World!"
9
+ # end
10
+ #
11
+ # m1 = method!(:hello) #=> <Method: #hello>
12
+ #
13
+ # def m1.annotate
14
+ # "simple example"
15
+ # end
16
+ #
17
+ # m2 = method!(:hello)
18
+ # m2.annotate #=> "simple example"
19
+
20
+ def method!(s)
21
+ #( @__methods__ ||= {} )[s.to_sym] ||= method(s)
22
+ $FIRST_CLASS_METHODS[self][s.to_sym] ||= method(s)
23
+ end
24
+
25
+ end
26
+
27
+ # Should 1st Class Methods be part of Ruby proper?
28
+ #
29
+ # Perhaps the best solution would be using the notation
30
+ # <tt>::ameth</tt>. This would require some minor changes
31
+ # to Ruby, but with few backward incompatabilites if
32
+ # parantheticals revert back to the actual method invocation.
33
+ # Although this later stipulation means capitalized methods
34
+ # would not be accessible in this way b/c they would intefere with
35
+ # constant lookup. It's a trade off.
36
+ #
37
+ # Current Proposed Alternate
38
+ # ----------------- ------------------ -------------------
39
+ # Foo.Bar() method call method call method call
40
+ # Foo.Bar method call method call method call
41
+ # Foo.bar() method call method call method call
42
+ # Foo.bar method call method call method call
43
+ # Foo::Bar() method call method call 1st class method
44
+ # Foo::Bar constant lookup constant lookup constant lookup
45
+ # Foo::bar() method call method call 1st class method
46
+ # Foo::bar method call 1st class method 1st class method
47
+ #
48
+ # Then again this dosen't address bound versus unbound.
49
+
@@ -20,9 +20,9 @@ module Kernel
20
20
  def object_send(name,*args,&blk)
21
21
  #instance_eval "self.#{name}(*args)"
22
22
  if respond_to?(name)
23
- send(name,*args,&blk)
23
+ __send__(name,*args,&blk)
24
24
  else #if respond_to?(:method_missing)
25
- method_missing(name,*args,&blk)
25
+ __send__(:method_missing,name,*args,&blk)
26
26
  #else
27
27
  # raise NoMethodError
28
28
  end
@@ -1,50 +1,61 @@
1
- module Kernel
2
-
3
- def state(data=nil)
4
- if state
1
+ class Object
2
+ # Get state of object.
3
+ def object_state(data=nil)
4
+ if data
5
5
  instance_variables.each do |iv|
6
6
  name = iv.to_s.sub(/^[@]/, '').to_sym
7
- instance_variable_set(iv, data[name])
7
+ instance_variable_set(iv, snap[name])
8
8
  end
9
9
  else
10
- data = Hash.new
10
+ data = {}
11
11
  instance_variables.each do |iv|
12
12
  name = iv.to_s.sub(/^[@]/, '').to_sym
13
13
  data[name] = instance_variable_get(iv)
14
14
  end
15
- data
15
+ snap
16
16
  end
17
17
  end
18
18
 
19
+ # Replace state of object.
20
+ def replace(data)
21
+ instance_variables.each do |iv|
22
+ name = iv.to_s.sub(/^[@]/, '').to_sym
23
+ instance_variable_set(iv, data[name])
24
+ end
25
+ end
19
26
  end
20
27
 
21
28
  class Array
22
- def state(data=nil)
29
+ def object_state(data=nil)
23
30
  data ? replace(data) : dup
24
31
  end
25
32
  end
26
33
 
27
34
  class String
28
- def state(data=nil)
35
+ def object_state(data=nil)
29
36
  data ? replace(data) : dup
30
37
  end
31
38
  end
32
39
 
33
40
  class Hash
34
- def state(data=nil)
41
+ def object_state(data=nil)
35
42
  data ? replace(data) : dup
36
43
  end
37
44
  end
38
45
 
39
46
  class Struct
40
- def state(data=nil)
47
+ def object_state(data=nil)
41
48
  if data
42
49
  data.each_pair {|k,v| send(k.to_s + "=", v)}
43
50
  else
44
- data = Hash.new
51
+ data = {}
45
52
  each_pair{|k,v| data[k] = v}
46
53
  data
47
54
  end
48
55
  end
56
+
57
+ def replace(snap)
58
+ snap.each_pair {|k,v| send(k.to_s + "=", v)}
59
+ end
49
60
  end
50
61
 
@@ -5,12 +5,17 @@ module Kernel
5
5
  #
6
6
  # require_all 'facets/time/*'
7
7
  #
8
+ # You can also you #require_all relative to the
9
+ # current script simply by using __DIR__.
10
+ #
11
+ # require_all(__DIR__ + '/foo/*')
12
+ #
8
13
  def require_all(pat)
9
14
  $LOAD_PATH.each do |path|
10
15
  fs = Dir[File.join(path,pat)]
11
16
  unless fs.empty?
12
17
  fs.each { |f|
13
- Kernel.require( f ) unless File.directory?( f )
18
+ Kernel.require(f) unless File.directory?(f)
14
19
  }
15
20
  break;
16
21
  end
@@ -1,9 +1,14 @@
1
+ require 'facets/kernel/require_relative'
2
+
3
+ =begin
1
4
  module Kernel
2
5
 
3
6
  # Require file from same dir as calling script.
4
7
  #
5
8
  # require_local 'templib'
6
9
  #
10
+ # CREDIT: Paul Brannan
11
+ #
7
12
  def require_local(fname)
8
13
  #fdir = File.expand_path( File.dirname( caller[0] ) )
9
14
  fdir = File.dirname( caller[0] )
@@ -14,6 +19,8 @@ module Kernel
14
19
  #
15
20
  # load_local 'templib'
16
21
  #
22
+ # CREDIT: Paul Brannan
23
+ #
17
24
  def load_local(fname, safe=nil)
18
25
  #fdir = File.expand_path( File.dirname( caller[0] ) )
19
26
  fdir = File.dirname( caller[0] )
@@ -21,4 +28,4 @@ module Kernel
21
28
  end
22
29
 
23
30
  end
24
-
31
+ =end
@@ -0,0 +1,52 @@
1
+ module Kernel
2
+
3
+ unless method_defined?(:require_relative) # 1.9
4
+
5
+ # Require file from same dir as calling script.
6
+ #
7
+ # require_local 'templib'
8
+ #
9
+ # CREDIT: Paul Brannan, Pragmatic Programmers
10
+ #
11
+ def require_relative(relative_feature)
12
+ c = caller.first
13
+ fail "Can't parse #{c}" unless c.rindex(/:\d+(:in `.*')?$/)
14
+ file = $` # File.dirname(c)
15
+ if /\A\((.*)\)/ =~ file # eval, etc.
16
+ raise LoadError, "require_relative is called in #{$1}"
17
+ end
18
+ absolute = File.expand_path(relative_feature, File.dirname(file))
19
+ require absolute
20
+ end
21
+
22
+ end
23
+
24
+ # Backward compatability.
25
+ alias_method :require_local, :require_relative
26
+
27
+ unless method_defined?(:load_relative) # 1.9
28
+
29
+ # Load file from same dir as calling script.
30
+ #
31
+ # load_local 'templib'
32
+ #
33
+ # CREDIT: Paul Brannan, Pragmatic Programmers
34
+ #
35
+ def load_relative(relative_feature, safe=nil)
36
+ c = caller.first
37
+ fail "Can't parse #{c}" unless c.rindex(/:\d+(:in `.*')?$/)
38
+ file = $` # File.dirname(c)
39
+ if /\A\((.*)\)/ =~ file # eval, etc.
40
+ raise LoadError, "require_relative is called in #{$1}"
41
+ end
42
+ absolute = File.expand_path(relative_feature, File.dirname(file))
43
+ load absolute, safe
44
+ end
45
+
46
+ end
47
+
48
+ # Backward compatability.
49
+ alias_method :load_local, :load_relative
50
+
51
+ end
52
+
@@ -0,0 +1,13 @@
1
+ module Kernel
2
+
3
+ unless method_defined?(:source_location) # 1.9
4
+
5
+ def source_location
6
+ file, line, meth = *caller(1).first.split(':')
7
+ return file, line
8
+ end
9
+
10
+ end
11
+
12
+ end
13
+
@@ -1,9 +1,12 @@
1
- unless (RUBY_VERSION[0,3] == '1.9')
1
+ module Kernel
2
2
 
3
- module Kernel
3
+ unless method_defined?(:tap) # 1.8.7+
4
4
 
5
5
  # The tap K-Combinator. This yields self -and- returns self.
6
-
6
+ #
7
+ # Note, Ruby 1.9+ does not appear to support the zero arity
8
+ # instance_eval option.
9
+ #
7
10
  def tap(&b)
8
11
  if block_given?
9
12
  b.arity == 1 ? yield(self) : instance_eval(&b)
@@ -11,11 +14,11 @@ unless (RUBY_VERSION[0,3] == '1.9')
11
14
  self
12
15
  end
13
16
 
14
- # This is just an off-the-cuff consideration for #tap using Functor:
17
+ # == Future definition?
15
18
  #
16
- # require 'facets/functor'
19
+ # This is a consideration for a future #tap using Functor:
17
20
  #
18
- # # Yield self -and- return self.
21
+ # require 'facets/functor'
19
22
  #
20
23
  # def tap(&b)
21
24
  # if block_given?
@@ -25,6 +28,10 @@ unless (RUBY_VERSION[0,3] == '1.9')
25
28
  # Functor.new{ |op, *args| self.send(op, *args); self }
26
29
  # end
27
30
  # end
31
+ #
32
+ # It would allow a single call, before returning the original.
33
+ # However there are not very many useful things you can do with
34
+ # that.
28
35
 
29
36
  end
30
37
 
@@ -0,0 +1,57 @@
1
+ class Module
2
+
3
+ # Create an attribute method for both getting
4
+ # and setting an instance variable.
5
+ #
6
+ # attr_setter :a
7
+ #
8
+ # _is equivalent to_
9
+ #
10
+ # def a(*args)
11
+ # if args.size > 0
12
+ # @a = args[0]
13
+ # self
14
+ # else
15
+ # @a
16
+ # end
17
+ # end
18
+ #
19
+ # CREDIT: Trans
20
+
21
+ def attr_setter(*args)
22
+ code, made = '', []
23
+ args.each do |a|
24
+ code << %{
25
+ def #{a}(*args)
26
+ args.size > 0 ? ( @#{a}=args[0] ; self ) : @#{a}
27
+ end
28
+ }
29
+ made << "#{a}".to_sym
30
+ end
31
+ module_eval code
32
+ made
33
+ end
34
+
35
+ # Alias an accessor. This create an alias for
36
+ # both a reader and a writer.
37
+ #
38
+ # class X
39
+ # attr_accessor :a
40
+ # alias_accessor :b, :a
41
+ # end
42
+ #
43
+ # x = X.new
44
+ # x.b = 1
45
+ # x.a #=> 1
46
+ #
47
+ # CREDIT: Trans
48
+
49
+ def alias_setter(*args)
50
+ args = args - [orig]
51
+ args.each do |name|
52
+ alias_method(name, orig)
53
+ end
54
+ end
55
+
56
+ end
57
+