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,32 +0,0 @@
1
- require 'facets/functor'
2
-
3
- module Kernel
4
-
5
- # Fluent notation for accessing private methods.
6
- # This is a meta-progrmmers tool, and not meant
7
- # for general use.
8
- #
9
- # class X
10
- # attr :a
11
- # private :a
12
- # def initialize
13
- # @a = 1
14
- # end
15
- # end
16
- #
17
- # x = X.new
18
- # p x.pry.a #=> 1
19
- # p x.a #=> Error
20
- #
21
- # TODO: Add support for blocks in Ruby 1.9
22
- #
23
- # CREDIT: trans
24
-
25
- def pry
26
- @__pry__ ||= Functor.new do |s, *a|
27
- instance_eval{ send(s, *a) }
28
- end
29
- end
30
-
31
- end
32
-
@@ -1,145 +0,0 @@
1
- # = Reflection
2
- #
3
- # Provides externailzed, safe access to an object's meta-information.
4
- #
5
- # == Authors
6
- #
7
- # * Thomas Sawyer
8
- #
9
- # == Copying
10
- #
11
- # Copyright (c) 2006 Thomas Sawyer
12
- #
13
- # Ruby License
14
- #
15
- # This module is free software. You may use, modify, and/or redistribute this
16
- # software under the same terms as Ruby.
17
- #
18
- # This program is distributed in the hope that it will be useful, but WITHOUT
19
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
20
- # FOR A PARTICULAR PURPOSE.
21
- #
22
- # == NOTES
23
- #
24
- # This is expirmental. Maybe it should be moved to the Trinkets project.
25
- # The idea is to be able to access a object as a pure object, by binding
26
- # methods called to Object/Kernel first. Thus bypassing any overriden
27
- # methods.
28
- #
29
- # But you can use #at to do this already.
30
- #
31
- # obj.at(Object).object_id
32
- #
33
- # For metaprogramming this can be important.
34
-
35
- #
36
- class << ObjectSpace
37
- alias_method :[], :_id2ref
38
- end
39
-
40
- # = ObjectReflection
41
- #
42
- # obj.__object__.id
43
- # obj.__object__.class
44
- #
45
- # NOTE: This is still an expirmental library.
46
-
47
- class ObjectReflection
48
-
49
- instance_methods.each{|m| private(m) unless m.to_s =~ /^__/ }
50
-
51
- #
52
- def initialize(object)
53
- @self = object
54
- @meth = {}
55
- end
56
-
57
- #
58
- def id
59
- _bind_method(:object_id).call
60
- end
61
-
62
- #Kernel.instance_methods.select{ |m| m =~ /^instance_/ }.each do |m|
63
- # meth = m.to_s.sub(/^instance_/, '')
64
- # module_eval %{
65
- # def #{meth}(*a, &b)
66
- # _bind_method(:#{m}).call(*a,&b)
67
- # end
68
- # }
69
- #end
70
-
71
- def method_missing(s, *a, &b)
72
- _bind_method(s).call(*a, &b)
73
- end
74
-
75
- private
76
-
77
- def _bind_method(meth)
78
- @meth[meth.to_sym] ||= Kernel.instance_method(meth).bind(@self)
79
- end
80
-
81
- end
82
-
83
- module Kernel
84
-
85
- # Binds a method to Object/Kernel before calling it.
86
- #
87
- # obj.__object__.id
88
- # obj.__object__.class
89
- #
90
- # For metaprogramming this can be important.
91
-
92
- def __object__
93
- @_object_reflection ||= ObjectReflection.new(self)
94
- end
95
-
96
- #def __instance__
97
- # @_instance_reflection ||= InstanceReflection.new(self)
98
- #end
99
-
100
- end
101
-
102
-
103
-
104
- =begin
105
- # = InstanceReflection
106
- #
107
- # obj.__instance__.id
108
- # obj.__instance__.class
109
- #
110
- #
111
- class InstanceReflection < ObjectReflection
112
-
113
- REFLECTION_METHODS = (
114
- meths = Kernel.instance_methods.select{ |m| m =~ /^instance_/ }
115
- meths += [:send]
116
- meths.collect!{|m| m.to_sym}
117
- meths.uniq!
118
- p meths
119
- meths
120
- )
121
-
122
- def initialize(object)
123
- @self = object
124
- @proc = {}
125
- #@meta = REFLECTION_METHODS.inject({}) do |rproc, meth|
126
- # name = meth.to_s.sub(/^instance_/, '').to_sym
127
- # rproc[name] = Kernel.instance_method(meth).bind(@self)
128
- # rproc
129
- #end
130
- end
131
-
132
- REFLECTION_METHODS.each do |meth|
133
- name = meth.to_s.sub(/^instance_/, '')
134
-
135
- module_eval %{
136
- def #{name}(*a,&b)
137
- @proc[:#{meth}] ||= Kernel.instance_method(:#{meth}).bind(@self)
138
- @proc[:#{meth}].call(*a,&b)
139
- end
140
- }, __FILE__, __LINE__
141
- end
142
-
143
- end
144
- =end
145
-
@@ -1,92 +0,0 @@
1
- # = Semaphore
2
- #
3
- # Technically a semaphore is simply an integer variable which
4
- # has an execution queue associated with it.
5
- #
6
- # == Authors
7
- #
8
- # * Fukumoto
9
- #
10
- # = Copying
11
- #
12
- # Copyright (c) 2005 Fukumoto
13
- #
14
- # Ruby License
15
- #
16
- # This module is free software. You may use, modify, and/or redistribute this
17
- # software under the same terms as Ruby.
18
- #
19
- # This program is distributed in the hope that it will be useful, but WITHOUT
20
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
21
- # FOR A PARTICULAR PURPOSE.
22
-
23
-
24
- # = Semaphore
25
- #
26
- # Technically a semaphore is simply an integer variable which
27
- # has an execution queue associated with it.
28
- #
29
- class Semaphore
30
-
31
- def initialize(initvalue = 0)
32
- @counter = initvalue
33
- @waiting_list = []
34
- end
35
-
36
- def wait
37
- Thread.critical = true
38
- if (@counter -= 1) < 0
39
- @waiting_list.push(Thread.current)
40
- Thread.stop
41
- end
42
- self
43
- ensure
44
- Thread.critical = false
45
- end
46
-
47
- def signal
48
- Thread.critical = true
49
- begin
50
- if (@counter += 1) <= 0
51
- t = @waiting_list.shift
52
- t.wakeup if t
53
- end
54
- rescue ThreadError
55
- retry
56
- end
57
- self
58
- ensure
59
- Thread.critical = false
60
- end
61
-
62
- alias_method( :down, :wait )
63
- alias_method( :up, :signal )
64
- alias_method( :p, :wait )
65
- alias_method( :v, :signal )
66
-
67
- def exclusive
68
- wait
69
- yield
70
- ensure
71
- signal
72
- end
73
-
74
- alias_method( :synchronize, :exclusive )
75
-
76
- end
77
-
78
-
79
- # _____ _
80
- # |_ _|__ ___| |_
81
- # | |/ _ \/ __| __|
82
- # | | __/\__ \ |_
83
- # |_|\___||___/\__|
84
- #
85
-
86
- # TODO
87
-
88
- =begin #test
89
-
90
- require 'test/unit'
91
-
92
- =end
@@ -1,248 +0,0 @@
1
- # = Settings
2
- #
3
- # Settings holds configuration information organized by
4
- # Owners. An owner is a class that represents the system to be
5
- # configured. An alias for this class is Settings.
6
- #
7
- # You can pass strings, constants or symbols as keys for the
8
- # classes to be configured. Passing symbols you can configure
9
- # classes even before they are defined.
10
- #
11
- # == Authors
12
- #
13
- # * George Moschovitis
14
- #
15
- # == Todo
16
- #
17
- # * Implement with annotations.
18
- #
19
- # == Copying
20
- #
21
- # Copyright (c) 2005 George Moschovitis
22
- #
23
- # Ruby License
24
- #
25
- # This module is free software. You may use, modify, and/or redistribute this
26
- # software under the same terms as Ruby.
27
- #
28
- # This program is distributed in the hope that it will be useful, but WITHOUT
29
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
30
- # FOR A PARTICULAR PURPOSE.
31
-
32
- require 'yaml'
33
- require 'facets/kernel/constant'
34
- require 'facets/string/capitalized'
35
- require 'facets/synchash'
36
- require 'facets/dictionary'
37
-
38
- # = Settings
39
- #
40
- # Settings holds configuration information organized by
41
- # Owners. An owner is a class that represents the system to be
42
- # configured. An alias for this class is Settings.
43
- #
44
- # You can pass strings, constants or symbols as keys for the
45
- # classes to be configured. Passing symbols you can configure
46
- # classes even before they are defined.
47
- #
48
- class Settings
49
-
50
- # A hash of setting owners. Use double @'s to allow for
51
- # the Settings alias.
52
- #--
53
- # TODO: find a better name.
54
- #++
55
-
56
- @@owners = SyncHash.new
57
-
58
- # A datastructure to store Settings metadata.
59
- #
60
- # Please note the difference between :default and :value,
61
- # :default does NOT override :value.
62
-
63
- class Setting
64
- attr_accessor :owner, :name, :type, :value, :options
65
-
66
- def initialize(owner, name, options)
67
- if options.key? :value
68
- @value = options[:value]
69
- elsif options.key? :default
70
- @value = options[:default]
71
- else
72
- raise ArgumentError.new('A value is required')
73
- end
74
-
75
- @owner, @name = owner, name
76
- @options = options
77
- @type = options[:type] = options[:type] || @value.class
78
- end
79
-
80
- # Update the setting from an options hash. The update does
81
- # NOT take default values into account!
82
-
83
- def update(hash)
84
- if hash.key? :value
85
- @value = hash[:value]
86
- @type = @value.class
87
- end
88
-
89
- if hash.key? :type
90
- @type = hash[:type]
91
- end
92
-
93
- @options.update(hash)
94
- end
95
-
96
- # Text representation of this setting.
97
-
98
- def to_s
99
- @value.to_s
100
- end
101
-
102
- end
103
-
104
- # A collection of Settings. This helper enables intuitive
105
- # settings initialization like this:
106
- #
107
- # Settings.Compiler.template_root = 'public'
108
- # instead of
109
- # Settings.setting :compiler, :template_root, :value => 'public'
110
-
111
- class SettingCollection < Hash
112
- attr_accessor :owner
113
-
114
- # Handles setting readers and writers.
115
-
116
- def method_missing(sym, *args)
117
- if sym.to_s =~ /=$/
118
- # Remove trailing
119
- sym = sym.to_s.gsub(/=/, '').to_sym
120
- Settings.setting @owner, sym, :value => args.first
121
- else
122
- self[sym]
123
- end
124
- end
125
- end
126
-
127
- class << self
128
-
129
- # Inject the Settings parameters provided as a hash
130
- # (dictionary, ordered) to classes to be configured.
131
- #
132
- # === Warning: Pass an ordered hash (dictionary)
133
-
134
- def setup(options)
135
- options.each do |owner, ss|
136
- next unless ss
137
- ss.each do |name, s|
138
- add_setting(owner, name.to_sym, :value => s)
139
- end
140
- end
141
- end
142
-
143
- # Parse Settings parameters in yaml format.
144
-
145
- def parse(options)
146
- temp = YAML::load(options)
147
- options = Dictionary.new
148
- temp.each do |k, v|
149
- begin
150
- options[k.gsub(/\./, '::').to_sym] = v
151
- rescue Object
152
- options[k] = v
153
- end
154
- end
155
-
156
- setup(options)
157
- end
158
-
159
- # Load and parse an external yaml Settings file.
160
-
161
- def load(filename)
162
- parse(File.read(filename))
163
- end
164
-
165
- # Manually add a Settings setting. The class key can
166
- # be the actual class name constant or a symbol. If the
167
- # setting is already defined it updates it.
168
- #
169
- # === Examples
170
- #
171
- # Settings.add_setting Compiler, :verification, :value => 12, :doc => '...'
172
- # Settings.setting :IdPart, :verify_registration_email, :value => false
173
- # s = Settings.Compiler.verification.value
174
-
175
- def add_setting(owner, name, options)
176
- owner = owner.to_s.to_sym
177
- @@owners[owner] ||= {}
178
- if s = @@owners[owner][name]
179
- # The setting already exists, update it.
180
- s.update(options)
181
- else
182
- # The setting does not exist, create it.
183
- @@owners[owner][name] = Setting.new(owner, name, options)
184
- end
185
- end
186
- alias_method :setting, :add_setting
187
-
188
- # Return the settings for the given owner. The owner is
189
- # typically the Class that represents the system to be
190
- # configured. If no class is provided, it returns all the
191
- # registered settings.
192
-
193
- def settings(owner = nil)
194
- if owner
195
- owner = owner.to_s.to_sym
196
- @@owners[owner]
197
- else
198
- @@owners.values.inject([]) { |memo, obj| memo.concat(obj.values) }
199
- end
200
- end
201
- alias_method :all, :settings
202
- alias_method :[], :settings
203
-
204
- #--
205
- # FIXME: this does not work as expected.
206
- #++
207
-
208
- def method_missing(sym)
209
- if sym.to_s.capitalized?
210
- bdl = SettingCollection.new
211
- bdl.owner = sym
212
- if hash = self[sym]
213
- bdl.update(hash)
214
- end
215
- return bdl
216
- end
217
- end
218
- end
219
-
220
- end
221
-
222
-
223
- class Module
224
-
225
- # Defines a configuration setting for the enclosing class.
226
- #
227
- # === Example
228
- #
229
- # class Compiler
230
- # setting :template_root, :default => 'src/template', :doc => 'The template root dir'
231
- # end
232
-
233
- def setting(sym, options = {})
234
- Settings.add_setting(self, sym, options)
235
-
236
- module_eval %{
237
- def self.#{sym}
238
- Settings[#{self}][:#{sym}].value
239
- end
240
-
241
- def self.#{sym}=(obj)
242
- Settings.setting #{self}, :#{sym}, :value => obj
243
- end
244
- }
245
- end
246
-
247
- end
248
-