facets 2.1.3 → 2.2.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 (303) hide show
  1. data/AUTHORS +14 -12
  2. data/CHANGES +45 -2
  3. data/NOTES +9 -7
  4. data/lib/core/facets/1stclassmethod.rb +15 -11
  5. data/lib/core/facets/array.rb +0 -1
  6. data/lib/core/facets/array/conjoin.rb +40 -8
  7. data/lib/core/facets/array/delete.rb +8 -2
  8. data/lib/core/facets/array/indexable.rb +30 -3
  9. data/lib/core/facets/array/merge.rb +11 -0
  10. data/lib/core/facets/array/only.rb +3 -3
  11. data/lib/core/facets/array/pad.rb +4 -46
  12. data/lib/core/facets/array/rotate.rb +4 -4
  13. data/lib/core/facets/array/select.rb +2 -0
  14. data/lib/core/facets/array/splice.rb +16 -2
  15. data/lib/core/facets/array/stackable.rb +6 -40
  16. data/lib/core/facets/binding.rb +3 -0
  17. data/lib/core/facets/binding/cflow.rb +10 -64
  18. data/lib/core/facets/binding/defined.rb +10 -0
  19. data/lib/core/facets/binding/eval.rb +10 -76
  20. data/lib/core/facets/binding/here.rb +9 -0
  21. data/lib/core/facets/binding/self.rb +10 -0
  22. data/lib/core/facets/binding/vars.rb +0 -45
  23. data/lib/core/facets/boolean.rb +31 -103
  24. data/lib/core/facets/class/descendents.rb +17 -44
  25. data/lib/core/facets/comparable/bound.rb +8 -70
  26. data/lib/core/facets/comparable/cmp.rb +12 -92
  27. data/lib/core/facets/conversion.rb +122 -321
  28. data/lib/core/facets/dir/multiglob.rb +0 -13
  29. data/lib/core/facets/dir/traverse.rb +61 -111
  30. data/lib/core/facets/enumerable.rb +4 -2
  31. data/lib/core/facets/enumerable/cartesian.rb +36 -85
  32. data/lib/core/facets/enumerable/collect.rb +64 -152
  33. data/lib/core/facets/enumerable/combination.rb +40 -42
  34. data/lib/core/facets/enumerable/count.rb +99 -174
  35. data/lib/core/facets/enumerable/each.rb +86 -0
  36. data/lib/core/facets/enumerable/mash.rb +58 -0
  37. data/lib/core/facets/enumerable/permutation.rb +39 -44
  38. data/lib/core/facets/enumerable/probability.rb +16 -90
  39. data/lib/core/facets/enumerable/split.rb +113 -0
  40. data/lib/core/facets/exception/detail.rb +1 -2
  41. data/lib/core/facets/facets.rb +3 -2
  42. data/lib/core/facets/file/read.rb +4 -59
  43. data/lib/core/facets/file/topath.rb +8 -96
  44. data/lib/core/facets/file/write.rb +21 -49
  45. data/lib/core/facets/filetest/root.rb +4 -3
  46. data/lib/core/facets/functor.rb +5 -43
  47. data/lib/core/facets/hash/at.rb +7 -37
  48. data/lib/core/facets/hash/delete.rb +9 -58
  49. data/lib/core/facets/hash/has_keys.rb +4 -43
  50. data/lib/core/facets/hash/insert.rb +5 -38
  51. data/lib/core/facets/hash/inverse.rb +2 -41
  52. data/lib/core/facets/hash/iterate.rb +4 -45
  53. data/lib/core/facets/hash/keyize.rb +24 -92
  54. data/lib/core/facets/hash/merge.rb +4 -38
  55. data/lib/core/facets/hash/new.rb +5 -38
  56. data/lib/core/facets/hash/op.rb +20 -66
  57. data/lib/core/facets/hash/rekey.rb +9 -87
  58. data/lib/core/facets/hash/select.rb +1 -1
  59. data/lib/core/facets/hash/slice.rb +42 -0
  60. data/lib/core/facets/hash/traverse.rb +6 -46
  61. data/lib/core/facets/hash/update.rb +27 -67
  62. data/lib/core/facets/hash/weave.rb +22 -42
  63. data/lib/core/facets/indexable.rb +42 -14
  64. data/lib/core/facets/integer/bitmask.rb +69 -106
  65. data/lib/core/facets/integer/factorial.rb +1 -44
  66. data/lib/core/facets/integer/multiples.rb +27 -22
  67. data/lib/core/facets/integer/of.rb +1 -33
  68. data/lib/core/facets/kernel.rb +4 -2
  69. data/lib/core/facets/kernel/ask.rb +15 -3
  70. data/lib/core/facets/kernel/callstack.rb +38 -69
  71. data/lib/core/facets/kernel/constant.rb +2 -38
  72. data/lib/core/facets/kernel/deepcopy.rb +3 -55
  73. data/lib/core/facets/kernel/dir.rb +2 -0
  74. data/lib/core/facets/kernel/ergo.rb +2 -2
  75. data/lib/core/facets/kernel/instance.rb +51 -120
  76. data/lib/core/facets/kernel/metaid.rb +35 -73
  77. data/lib/core/facets/kernel/object.rb +14 -39
  78. data/lib/core/facets/kernel/op_esc.rb +24 -2
  79. data/lib/core/facets/kernel/populate.rb +6 -69
  80. data/lib/core/facets/kernel/report.rb +28 -33
  81. data/lib/core/facets/kernel/require.rb +7 -21
  82. data/lib/core/facets/kernel/respond.rb +11 -1
  83. data/lib/core/facets/kernel/returning.rb +50 -0
  84. data/lib/core/facets/kernel/silence.rb +12 -24
  85. data/lib/core/facets/kernel/super.rb +12 -76
  86. data/lib/core/facets/kernel/tap.rb +25 -107
  87. data/lib/core/facets/kernel/val.rb +7 -46
  88. data/lib/core/facets/kernel/withattr.rb +6 -64
  89. data/lib/core/facets/matchdata/matchset.rb +8 -50
  90. data/lib/core/facets/module.rb +3 -1
  91. data/lib/core/facets/module/abstract.rb +9 -47
  92. data/lib/core/facets/module/alias.rb +11 -68
  93. data/lib/core/facets/module/attr.rb +36 -15
  94. data/lib/core/facets/module/cattr.rb +8 -76
  95. data/lib/core/facets/module/clone.rb +15 -66
  96. data/lib/core/facets/module/include.rb +54 -114
  97. data/lib/core/facets/module/methods.rb +15 -13
  98. data/lib/core/facets/module/modify.rb +20 -206
  99. data/lib/core/facets/module/name.rb +19 -83
  100. data/lib/core/facets/module/require.rb +48 -53
  101. data/lib/core/facets/module/traits.rb +74 -33
  102. data/lib/core/facets/nilclass/status.rb +25 -2
  103. data/lib/core/facets/numeric/round.rb +24 -89
  104. data/lib/core/facets/proc/bind.rb +16 -59
  105. data/lib/core/facets/proc/compose.rb +6 -40
  106. data/lib/core/facets/proc/fn.rb +2 -0
  107. data/lib/core/facets/range/combine.rb +15 -51
  108. data/lib/core/facets/range/overlap.rb +8 -64
  109. data/lib/core/facets/regexp/arity.rb +6 -41
  110. data/lib/core/facets/stackable.rb +43 -4
  111. data/lib/core/facets/string.rb +2 -0
  112. data/lib/core/facets/string/align.rb +45 -55
  113. data/lib/core/facets/string/blank.rb +2 -46
  114. data/lib/core/facets/string/bracket.rb +14 -87
  115. data/lib/core/facets/string/case.rb +45 -32
  116. data/lib/core/facets/string/crypt.rb +3 -40
  117. data/lib/core/facets/string/filter.rb +7 -49
  118. data/lib/core/facets/string/format.rb +24 -126
  119. data/lib/core/facets/string/indexable.rb +50 -133
  120. data/lib/core/facets/string/interpolate.rb +24 -59
  121. data/lib/core/facets/string/natcmp.rb +5 -39
  122. data/lib/core/facets/string/nchar.rb +37 -45
  123. data/lib/core/facets/string/op.rb +13 -0
  124. data/lib/core/facets/string/partitions.rb +38 -99
  125. data/lib/core/facets/string/range.rb +8 -49
  126. data/lib/core/facets/string/regesc.rb +9 -42
  127. data/lib/core/facets/string/scan.rb +6 -52
  128. data/lib/core/facets/string/splice.rb +8 -13
  129. data/lib/core/facets/string/tabs.rb +16 -153
  130. data/lib/core/facets/symbol.rb +3 -1
  131. data/lib/core/facets/symbol/chomp.rb +11 -29
  132. data/lib/core/facets/symbol/generate.rb +4 -43
  133. data/lib/core/facets/symbol/not.rb +13 -25
  134. data/lib/core/facets/symbol/shadow.rb +2 -40
  135. data/lib/core/facets/symbol/succ.rb +14 -13
  136. data/lib/core/facets/symbol/to_proc.rb +33 -28
  137. data/lib/core/facets/time.rb +1 -0
  138. data/lib/core/facets/time/change.rb +5 -38
  139. data/lib/core/facets/time/elapse.rb +2 -41
  140. data/lib/core/facets/time/stamp.rb +47 -0
  141. data/lib/core/facets/unboundmethod.rb +3 -0
  142. data/lib/core/facets/unboundmethod/arguments.rb +27 -4
  143. data/lib/core/facets/unboundmethod/name.rb +21 -7
  144. data/lib/methods/facets/enumerable/cluster_by.rb +1 -1
  145. data/lib/methods/facets/enumerable/collate.rb +1 -0
  146. data/lib/methods/facets/enumerable/divide.rb +1 -1
  147. data/lib/methods/facets/enumerable/each_by.rb +1 -1
  148. data/lib/methods/facets/enumerable/each_pair.rb +1 -1
  149. data/lib/methods/facets/enumerable/eachn.rb +1 -1
  150. data/lib/methods/facets/enumerable/graph.rb +1 -1
  151. data/lib/methods/facets/enumerable/group_by.rb +1 -1
  152. data/lib/methods/facets/enumerable/inject.rb +1 -0
  153. data/lib/methods/facets/enumerable/map_send.rb +1 -0
  154. data/lib/methods/facets/enumerable/modulate.rb +1 -0
  155. data/lib/methods/facets/enumerable/partition_by.rb +1 -1
  156. data/lib/methods/facets/hash/collate.rb +1 -1
  157. data/lib/methods/facets/hash/except.rb +1 -0
  158. data/lib/methods/facets/hash/graph.rb +1 -1
  159. data/lib/methods/facets/hash/mash.rb +1 -0
  160. data/lib/methods/facets/kernel/Bit.rb +1 -0
  161. data/lib/methods/facets/kernel/complete.rb +1 -1
  162. data/lib/methods/facets/kernel/here.rb +1 -1
  163. data/lib/methods/facets/kernel/non_nil.rb +1 -0
  164. data/lib/methods/facets/kernel/respond_with_value.rb +1 -0
  165. data/lib/methods/facets/kernel/with.rb +1 -1
  166. data/lib/methods/facets/module/class_def.rb +1 -0
  167. data/lib/methods/facets/string/camelcase.rb +1 -0
  168. data/lib/methods/facets/string/op_minus.rb +1 -0
  169. data/lib/methods/facets/string/snakecase.rb +1 -0
  170. data/lib/more/facets/attributes.rb +5 -5
  171. data/lib/more/facets/basicobject.rb +0 -62
  172. data/lib/{core/facets/continuation/create.rb → more/facets/continuation.rb} +4 -21
  173. data/lib/more/facets/duration.rb +534 -0
  174. data/lib/more/facets/lazy.rb +3 -3
  175. data/lib/more/facets/namespace.rb +23 -71
  176. data/lib/more/facets/rbsystem.rb +42 -8
  177. data/lib/more/facets/stylize.rb +6 -3
  178. data/lib/more/facets/thread.rb +55 -0
  179. data/meta/MANIFEST +49 -18
  180. data/meta/ROLLRC +1 -1
  181. data/meta/project.yaml +2 -2
  182. data/task/install +1 -1
  183. data/task/test/general +8 -2
  184. data/test/unit/array/test_pad.rb +30 -45
  185. data/test/unit/array/test_stackable.rb +14 -28
  186. data/test/unit/binding/test_cflow.rb +34 -49
  187. data/test/unit/binding/test_defined.rb +17 -0
  188. data/test/unit/binding/test_eval.rb +11 -39
  189. data/test/unit/binding/test_here.rb +17 -0
  190. data/test/unit/binding/test_self.rb +17 -0
  191. data/test/unit/binding/test_vars.rb +22 -37
  192. data/test/unit/class/test_descendents.rb +15 -30
  193. data/test/unit/class/test_initializer.rb +1 -8
  194. data/test/unit/comparable/test_bound.rb +38 -53
  195. data/test/unit/comparable/test_cmp.rb +45 -60
  196. data/test/unit/dir/test_traverse.rb +56 -0
  197. data/test/unit/enumerable/test_cartesian.rb +34 -47
  198. data/test/unit/enumerable/test_collect.rb +16 -125
  199. data/test/unit/enumerable/test_combination.rb +1 -8
  200. data/test/unit/enumerable/test_count.rb +51 -66
  201. data/test/unit/enumerable/test_each.rb +77 -0
  202. data/test/unit/enumerable/test_mash.rb +51 -0
  203. data/test/unit/enumerable/test_permutation.rb +1 -7
  204. data/test/unit/enumerable/test_probability.rb +42 -55
  205. data/test/unit/enumerable/test_split.rb +52 -0
  206. data/test/unit/exception/test_detail.rb +19 -0
  207. data/test/unit/file/test_read.rb +34 -0
  208. data/test/unit/file/test_topath.rb +17 -25
  209. data/test/unit/file/test_write.rb +6 -12
  210. data/test/unit/filetest/test_root.rb +14 -0
  211. data/test/unit/hash/test_at.rb +9 -21
  212. data/test/unit/hash/test_delete.rb +22 -37
  213. data/test/unit/hash/test_has_keys.rb +13 -28
  214. data/test/unit/hash/test_insert.rb +9 -23
  215. data/test/unit/hash/test_inverse.rb +11 -26
  216. data/test/unit/hash/test_iterate.rb +16 -31
  217. data/test/unit/hash/test_keyize.rb +40 -55
  218. data/test/unit/hash/test_merge.rb +10 -25
  219. data/test/unit/hash/test_new.rb +9 -24
  220. data/test/unit/hash/test_op.rb +1 -7
  221. data/test/unit/hash/test_rekey.rb +47 -62
  222. data/test/unit/hash/test_traverse.rb +17 -32
  223. data/test/unit/hash/test_update.rb +30 -45
  224. data/test/unit/hash/test_weave.rb +10 -23
  225. data/test/unit/integer/test_bitmask.rb +48 -44
  226. data/test/unit/integer/test_factorial.rb +11 -26
  227. data/test/unit/integer/test_multiples.rb +1 -5
  228. data/test/unit/integer/test_of.rb +14 -29
  229. data/test/unit/kernel/test_callstack.rb +13 -28
  230. data/test/unit/kernel/test_constant.rb +14 -28
  231. data/test/unit/kernel/test_deepcopy.rb +20 -35
  232. data/test/unit/kernel/test_instance.rb +46 -61
  233. data/test/unit/kernel/test_metaid.rb +42 -57
  234. data/test/unit/kernel/test_object.rb +14 -29
  235. data/test/unit/kernel/test_populate.rb +38 -53
  236. data/test/unit/kernel/test_report.rb +1 -7
  237. data/test/unit/kernel/test_returning.rb +16 -0
  238. data/test/unit/kernel/test_silence.rb +8 -23
  239. data/test/unit/kernel/test_super.rb +41 -56
  240. data/test/unit/kernel/test_tap.rb +15 -39
  241. data/test/unit/kernel/test_val.rb +7 -20
  242. data/test/unit/kernel/test_withattr.rb +29 -44
  243. data/test/unit/matchdata/test_matchset.rb +20 -35
  244. data/test/unit/module/test_abstract.rb +15 -30
  245. data/test/unit/module/test_alias.rb +32 -45
  246. data/test/unit/module/test_cattr.rb +39 -54
  247. data/test/unit/module/test_clone.rb +31 -43
  248. data/test/unit/module/test_include.rb +1 -35
  249. data/test/unit/module/test_modify.rb +102 -114
  250. data/test/unit/module/test_name.rb +1 -7
  251. data/test/unit/numeric/test_round.rb +46 -61
  252. data/test/unit/proc/test_bind.rb +29 -44
  253. data/test/unit/proc/test_compose.rb +20 -35
  254. data/test/unit/range/test_combine.rb +14 -29
  255. data/test/unit/range/test_overlap.rb +34 -51
  256. data/test/unit/regexp/test_arity.rb +14 -29
  257. data/test/unit/string/test_align.rb +13 -27
  258. data/test/unit/string/test_blank.rb +12 -27
  259. data/test/unit/string/test_bracket.rb +52 -67
  260. data/test/unit/string/test_case.rb +19 -38
  261. data/test/unit/string/test_crypt.rb +10 -25
  262. data/test/unit/string/test_filter.rb +1 -7
  263. data/test/unit/string/test_format.rb +2 -7
  264. data/test/unit/string/test_indexable.rb +54 -69
  265. data/test/unit/string/test_interpolate.rb +8 -21
  266. data/test/unit/string/test_natcmp.rb +11 -26
  267. data/test/unit/string/test_nchar.rb +1 -14
  268. data/test/unit/string/test_op.rb +14 -0
  269. data/test/unit/string/test_partitions.rb +39 -54
  270. data/test/unit/string/test_range.rb +17 -32
  271. data/test/unit/string/test_regesc.rb +1 -7
  272. data/test/unit/string/test_scan.rb +23 -38
  273. data/test/unit/string/test_stackable.rb +79 -98
  274. data/test/unit/string/test_tabs.rb +1 -7
  275. data/test/unit/symbol/test_chomp.rb +10 -21
  276. data/test/unit/symbol/test_generate.rb +7 -22
  277. data/test/unit/symbol/test_not.rb +10 -25
  278. data/test/unit/symbol/test_shadow.rb +8 -23
  279. data/test/unit/symbol/test_succ.rb +1 -7
  280. data/test/unit/symbol/test_to_proc.rb +1 -7
  281. data/test/unit/test_attributes.rb +1 -1
  282. data/test/unit/test_continuation.rb +13 -0
  283. data/test/unit/test_conversion.rb +1 -14
  284. data/test/unit/test_namespace.rb +30 -3
  285. data/test/unit/test_thread.rb +23 -0
  286. data/test/unit/time/test_change.rb +11 -26
  287. data/test/unit/time/test_elapse.rb +10 -25
  288. data/test/unit/time/test_stamp.rb +28 -0
  289. metadata +65 -25
  290. data/lib/core/facets/array/unzip.rb +0 -14
  291. data/lib/core/facets/continuation.rb +0 -1
  292. data/lib/core/facets/enumerable/collate.rb +0 -104
  293. data/lib/core/facets/kernel/require_esc.rb +0 -44
  294. data/lib/more/facets/mapsend.rb +0 -98
  295. data/lib/more/facets/pp_s.rb +0 -30
  296. data/log/history.rd +0 -38
  297. data/log/todo.rd +0 -4
  298. data/task/special/quickopts +0 -15
  299. data/test/unit/continuation/test_create.rb +0 -28
  300. data/test/unit/enumerable/test_collate.rb +0 -51
  301. data/test/unit/kernel/test_require_esc.rb +0 -29
  302. data/test/unit/test_mapsend.rb +0 -18
  303. data/test/unit/test_pp_s.rb +0 -17
@@ -1,22 +1,3 @@
1
- # TITLE:
2
- #
3
- # Name
4
- #
5
- # DESCRIPTION:
6
- #
7
- # Extensions related to module names and namespace.
8
- #
9
- # COPYRIGHT:
10
- #
11
- # Copyright (c) 2007 Gavin Sinclair, Thomas Sawyer
12
- # Distributed under the terms of the Ruby License
13
- #
14
- # AUTHORS:
15
- #
16
- # - Gavin Sinclair
17
- # - Thomas Sawyer
18
-
19
- #
20
1
  class Module
21
2
 
22
3
  # <em>Note: the following documentation uses "class" because it's more common, but it
@@ -47,15 +28,14 @@ class Module
47
28
  # Class.by_name("Enumerable") # -> Enumerable
48
29
  # Module.by_name("Enumerable") # -> Enumerable
49
30
  #
50
- #--
51
- # Credit for this goes to Gavin Sinclair.
52
- #++
31
+ # CREDIT: Gavin Sinclair
32
+
53
33
  def by_name(name)
54
34
  #result = Object.constant(name)
55
- # ??? Does self need to be Object in the following lines?
35
+ # TODO: Does self need to be Object in the following lines?
56
36
  const = name.to_s.dup
57
37
  base = const.sub!(/^::/, '') ? Object : ( self.kind_of?(Module) ? self : self.class )
58
- result = const.split(/::/).inject(base){ |mod, name| mod.const_get(name) }
38
+ result = const.split(/::/).inject(base){ |mod, subconst| mod.const_get(subconst) }
59
39
 
60
40
  return result if result.kind_of?( Module )
61
41
  raise ArgumentError, "#{name} is not a module or class"
@@ -78,6 +58,8 @@ class Module
78
58
  # m.inspect #=> "#<Module:0xb7bb0434>"
79
59
  # m.basename #=> "Module_0xb7bb0434"
80
60
  #
61
+ # CREDIT: Trans
62
+
81
63
  def basename
82
64
  if name and not name.empty?
83
65
  name.gsub(/^.*::/, '')
@@ -98,6 +80,8 @@ class Module
98
80
  #
99
81
  # See also Module#basename.
100
82
  #
83
+ # CREDIT: Trans
84
+
101
85
  def dirname
102
86
  name[0...(name.rindex('::') || 0)]
103
87
  #name.gsub(/::[^:]*$/, '')
@@ -114,73 +98,25 @@ class Module
114
98
  #
115
99
  # See also Module#basename.
116
100
  #
101
+ # CREDIT: Trans
102
+
117
103
  def modspace
118
104
  space = name[ 0...(name.rindex( '::' ) || 0)]
119
105
  space.empty? ? Object : eval(space)
120
106
  end
121
107
 
122
- #--
123
- # Special thanks to Mauricio Fernandez
124
- # parent = Object.const_get(mod.to_s.sub(/::[^:]+\z/, ""))
125
- #++
108
+ # Show a modules nesting in module namespaces.
109
+ #
110
+ # A::B::C.nesting #=> [ A, A::B ]
111
+ #
112
+ # CREDIT: Trans
113
+
126
114
  def nesting
127
115
  n = []
128
- name.split(/::/).inject(self){ |mod, name| c = mod.const_get(name) ; n << c ; c }
116
+ name.split(/::/).inject(self) do |mod, name|
117
+ c = mod.const_get(name) ; n << c ; c
118
+ end
129
119
  return n
130
120
  end
131
121
 
132
122
  end
133
-
134
-
135
-
136
- =begin test
137
-
138
- require 'test/unit'
139
-
140
- class TestModuleName < Test::Unit::TestCase
141
-
142
- def test_ancestor
143
- assert( self.class.ancestor?(::Test::Unit::TestCase) )
144
- end
145
-
146
- def test_by_name
147
- c = ::Test::Unit::TestCase.name
148
- assert_equal( ::Test::Unit::TestCase, Module.by_name(c) )
149
- c = "Test::Unit::TestCase"
150
- assert_equal( ::Test::Unit::TestCase, Class.by_name(c) )
151
- end
152
-
153
- def test_basename
154
- assert_equal( "TestCase", ::Test::Unit::TestCase.basename )
155
- end
156
-
157
- def test_dirname
158
- assert_equal( 'Test::Unit', Test::Unit::TestCase.dirname )
159
- assert_equal( 'Test::Unit', ::Test::Unit::TestCase.dirname )
160
- assert_equal( '', Test.dirname )
161
- assert_equal( '', ::Test.dirname )
162
- end
163
-
164
- def test_modspace
165
- assert_equal( Test::Unit, Test::Unit::TestCase.modspace )
166
- assert_equal( ::Test::Unit, ::Test::Unit::TestCase.modspace )
167
- assert_equal( Object, ::Test.modspace )
168
- end
169
-
170
- module M
171
- module N
172
- class C
173
- def n
174
- self.class.nesting
175
- end
176
- end
177
- end
178
- end
179
-
180
- def test_nesting
181
- assert_equal( [TestModuleName, M, M::N, M::N::C], M::N::C.new.n )
182
- end
183
-
184
- end
185
-
186
- =end
@@ -1,62 +1,57 @@
1
- # TITLE:
2
- #
3
- # Require / Load Module Extensions
4
- #
5
- # SUMMARY:
6
- #
7
- # In module require and load.
8
- #
9
- # AUTHORS:
10
- #
11
- # - Thomas Sawyer
12
-
13
- class Module
14
-
15
- # Load file into module/class namespace.
16
-
17
- def module_load( path )
18
- if path =~ /^[\/~.]/
19
- file = File.expand_path(path)
20
- else
21
- $LOAD_PATH.each do |lp|
22
- file = File.join(lp,path)
23
- break if File.exist?(file)
24
- file = nil
1
+ unless (RUBY_VERSION[0,3] == '1.9')
2
+
3
+ class Module
4
+
5
+ # Load file into module/class namespace.
6
+ #
7
+ # CREDIT: Trans
8
+
9
+ def module_load( path )
10
+ if path =~ /^[\/~.]/
11
+ file = File.expand_path(path)
12
+ else
13
+ $LOAD_PATH.each do |lp|
14
+ file = File.join(lp,path)
15
+ break if File.exist?(file)
16
+ file = nil
17
+ end
25
18
  end
26
- end
27
19
 
28
- module_eval(File.read(file))
29
- end
20
+ module_eval(File.read(file))
21
+ end
30
22
 
31
- # Require file into module/class namespace.
32
-
33
- def module_require( path )
34
- if path =~ /^[\/~.]/
35
- file = File.expand_path(path)
36
- else
37
- $LOAD_PATH.each do |lp|
38
- file = File.join(lp,path)
39
- break if File.exist?(file)
40
- file += '.rb'
41
- break if File.exist?(file)
42
- file = nil
23
+ # Require file into module/class namespace.
24
+ #
25
+ # CREDIT: Trans
26
+
27
+ def module_require( path )
28
+ if path =~ /^[\/~.]/
29
+ file = File.expand_path(path)
30
+ else
31
+ $LOAD_PATH.each do |lp|
32
+ file = File.join(lp,path)
33
+ break if File.exist?(file)
34
+ file += '.rb'
35
+ break if File.exist?(file)
36
+ file = nil
37
+ end
38
+ end
39
+ @loaded ||= {}
40
+ if @loaded.key?(file)
41
+ false
42
+ else
43
+ @loaded[file] = true
44
+ script = File.read(file)
45
+ module_eval(script)
46
+ true
43
47
  end
44
- end
45
- @loaded ||= {}
46
- if @loaded.key?(file)
47
- false
48
- else
49
- @loaded[file] = true
50
- script = File.read(file)
51
- module_eval(script)
52
- true
53
48
  end
54
49
  end
55
- end
56
50
 
57
51
 
58
- class Class
59
- alias_method :class_load, :module_load
60
- alias_method :class_require, :module_require
61
- end
52
+ class Class
53
+ alias_method :class_load, :module_load
54
+ alias_method :class_require, :module_require
55
+ end
62
56
 
57
+ end
@@ -1,33 +1,37 @@
1
- # TITLE:
2
- #
3
- # Module Traits
4
- #
5
- # SUMMARY:
6
- #
7
- # Module extensions for modifying a module a al traits.
8
- #
9
- # CREDITS:
10
- #
11
- # - Thomas Sawyer
12
- # - Robert Dober
13
- #
14
- # NOTES:
15
- # - In the old version of traits.rb we cloned modules and
16
- # altered their copies. Eg.
17
- # def +(other)
18
- # mod1 = other.clone
19
- # mod2 = clone
20
- # mod1.module_eval{ include mod2 }
21
- # end
22
- # Later it was realized that this thwarted the main
23
- # benefit that Ruby's concept of modules has over
24
- # traditional traits, inheritance.
25
- #
26
-
27
- #
28
1
  class Module
29
2
 
30
3
  # Combine modules.
4
+ #
5
+ # module A
6
+ # def a; "a"; end
7
+ # end
8
+ #
9
+ # module B
10
+ # def b; "b"; end
11
+ # end
12
+ #
13
+ # C = A + B
14
+ #
15
+ # class X; include C; end
16
+ #
17
+ # X.new.a #=> "a"
18
+ # X.new.b #=> "b"
19
+ #
20
+ # Note that in the old version of traits.rb we cloned
21
+ # modules and altered their copies. Eg.
22
+ #
23
+ # def +(other)
24
+ # mod1 = other.clone
25
+ # mod2 = clone
26
+ # mod1.module_eval{ include mod2 }
27
+ # end
28
+ #
29
+ # Later it was realized that this thwarted the main
30
+ # benefit that Ruby's concept of modules has over
31
+ # traditional traits, inheritance.
32
+ #
33
+ # CREDIT: Thomas Sawyer
34
+ # CREDIT: Robert Dober
31
35
 
32
36
  def +(other)
33
37
  base = self
@@ -38,9 +42,12 @@ class Module
38
42
  end
39
43
 
40
44
  # Subtract modules.
41
- #--
42
- # TODO Should this use all instance_methods, not just public?
43
- #++
45
+ #
46
+ # TODO: Should this use all instance_methods, not just public?
47
+ #
48
+ # CREDIT: Thomas Sawyer
49
+ # CREDIT: Robert Dober
50
+
44
51
  def -(other)
45
52
  case other
46
53
  when Array
@@ -58,6 +65,20 @@ class Module
58
65
  end
59
66
 
60
67
  # Rename methods.
68
+ #
69
+ # module A
70
+ # def a; "a"; end
71
+ # end
72
+ #
73
+ # B = A * { :a => :b }
74
+ #
75
+ # class X; include B; end
76
+ #
77
+ # X.new.b #=> "a"
78
+ #
79
+ #
80
+ # CREDIT: Thomas Sawyer
81
+ # CREDIT: Robert Dober
61
82
 
62
83
  def *(rename_map)
63
84
  base = self
@@ -71,9 +92,23 @@ class Module
71
92
  end
72
93
 
73
94
  # Detect conflicts.
74
- #--
75
- # TODO All instance methods, or just public?
76
- #++
95
+ #
96
+ # module A
97
+ # def c; end
98
+ # end
99
+ #
100
+ # module B
101
+ # def c; end
102
+ # end
103
+ #
104
+ # A.conflict?(B) #=> ["c"]
105
+ #
106
+ #
107
+ # TODO: All instance methods, or just public?
108
+ #
109
+ # CREDIT: Thomas Sawyer
110
+ # CREDIT: Robert Dober
111
+
77
112
  def conflict?(other)
78
113
  c = []
79
114
  c += (public_instance_methods(true) & other.public_instance_methods(true))
@@ -87,16 +122,22 @@ class Module
87
122
  # c.empty ? false : c
88
123
  #end
89
124
 
125
+ # Like #conflict?, but checks only public methods.
126
+
90
127
  def public_conflict?(other)
91
128
  c = public_instance_methods(true) & other.public_instance_methods(true)
92
129
  c.empty ? false : c
93
130
  end
94
131
 
132
+ # Like #conflict?, but checks only private methods.
133
+
95
134
  def private_conflict?(other)
96
135
  c = private_instance_methods(true) & other.private_instance_methods(true)
97
136
  c.empty ? false : c
98
137
  end
99
138
 
139
+ # Like #conflict?, but checks only protected methods.
140
+
100
141
  def protected_conflict?(other)
101
142
  c = protected_instance_methods(true) & other.protected_instance_methods(true)
102
143
  c.empty ? false : c
@@ -1,10 +1,21 @@
1
-
2
1
  class NilClass
3
2
 
4
3
  # Nil#status makes it possible to pass messages
5
4
  # through a "failure" chain.
5
+ #
6
+ # def foo
7
+ # return nil.status("failed foo!")
8
+ # end
9
+ #
10
+ # result = foo
11
+ # if result.nil?
12
+ # result.status? #=> true
13
+ # result.status #=> "failed foo!"
14
+ # end
15
+ #
16
+ # CREDIT: Trans
6
17
 
7
- def status( status=nil )
18
+ def status(status=nil)
8
19
  if status
9
20
  @status = status
10
21
  self
@@ -14,6 +25,18 @@ class NilClass
14
25
  end
15
26
 
16
27
  # Check status.
28
+ #
29
+ # def foo
30
+ # return nil.status("failed foo!")
31
+ # end
32
+ #
33
+ # result = foo
34
+ # if result.nil?
35
+ # result.status? #=> true
36
+ # result.status #=> "failed foo!"
37
+ # end
38
+ #
39
+ # CREDIT: Trans
17
40
 
18
41
  def status?
19
42
  return unless @status
@@ -1,22 +1,13 @@
1
- # = Round
2
- #
3
- # To properly support Float's rounding methods,
4
- # Numeric and Integer must also be augmented.
5
- #
6
- # == AUTHORS
7
- #
8
- # CREDIT Thomas Sawyer
9
-
10
- #
11
1
  class Numeric
12
- # To properly support Float's rounding methods,
13
- # Numeric must also be augmented.
2
+
3
+ # See Float#round_at.
4
+
14
5
  def round_at(*args)
15
6
  to_f.round_at(*args)
16
7
  end
17
8
 
18
- # To properly support Float's rounding methods,
19
- # Numeric must also be augmented.
9
+ # See Float#round_to.
10
+
20
11
  def round_to(*args)
21
12
  to_f.round_to(*args)
22
13
  end
@@ -24,31 +15,37 @@ class Numeric
24
15
  # Determines if another number is approximately equal
25
16
  # within a given _n_th degree. Defaults to 100ths
26
17
  # if the degree is not specified.
27
- def approx?( x, n=0.01 )
18
+ #
19
+ # CREDIT: Trans
20
+
21
+ def approx?(x, n=0.01)
28
22
  return(self == x) if n == 0
29
23
  (self - x).abs <= n
30
24
  end
31
25
 
32
26
  end
33
27
 
34
- #
28
+
35
29
  class Integer
36
- #
30
+
31
+ # See Float#round_at.
32
+
37
33
  def round_at(*args)
38
34
  to_f.round_at(*args)
39
35
  end
40
36
 
41
- # To properly support Float's rounding methods,
42
- # Integer must also be augmented.
37
+ # See Float#round_to.
38
+
43
39
  def round_to(*args)
44
40
  to_f.round_to(*args)
45
41
  end
42
+
46
43
  end
47
44
 
48
- #
45
+
49
46
  class Float
50
- # Float#round_off is simple an alias for Float#round.
51
- #
47
+
48
+ # Float#round_off is simply an alias for Float#round.
52
49
  alias_method :round_off, :round
53
50
 
54
51
  # Rounds to the given decimal position.
@@ -58,6 +55,8 @@ class Float
58
55
  # 4.555.round_at(2) #=> 4.56
59
56
  # 4.555.round_at(3) #=> 4.555
60
57
  #
58
+ # CREDIT: Trans
59
+
61
60
  def round_at( d ) #d=0
62
61
  (self * (10.0 ** d)).round_off.to_f / (10.0 ** d)
63
62
  end
@@ -69,75 +68,11 @@ class Float
69
68
  # 4.555.round_to(0.01) #=> 4.56
70
69
  # 4.555.round_to(0) #=> 4.555
71
70
  #
71
+ # CREDIT: Trans
72
+
72
73
  def round_to( n ) #n=1
73
74
  return self if n == 0
74
75
  (self * (1.0 / n)).round_off.to_f / (1.0 / n)
75
76
  end
76
- end
77
77
 
78
-
79
- # _____ _
80
- # |_ _|__ ___| |_
81
- # | |/ _ \/ __| __|
82
- # | | __/\__ \ |_
83
- # |_|\___||___/\__|
84
- #
85
- =begin test
86
-
87
- require 'test/unit'
88
-
89
- class TestRound < Test::Unit::TestCase
90
-
91
- def setup
92
- @f0 = [ 0, 10, 15, 105 ]
93
- @f1 = [ 10.1, 10.01, 10.9, 10.09, 10.5, 10.05, 10.49 ]
94
- end
95
-
96
- def test_round_at_arg1
97
- fr = @f0.collect{ |f| f.round_at(1) }
98
- assert_equal( [0,10,15,105], fr )
99
- fr = @f1.collect { |f| f.round_at(1) }
100
- assert_equal( [10.1,10.0,10.9,10.1,10.5,10.1,10.5], fr )
101
- end
102
-
103
- def test_round_at_arg2
104
- fr = @f0.collect { |f| f.round_at(2) }
105
- assert_equal( [0,10,15,105], fr )
106
- fr = @f1.collect { |f| f.round_at(2) }
107
- assert_equal( [10.1,10.01,10.9,10.09,10.5,10.05,10.49], fr )
108
- end
109
-
110
- def test_round_off
111
- assert_equal( 1.0, 1.2.round_off )
112
- assert_equal( 2.0, 1.8.round_off )
113
- end
114
-
115
- def test_round_to_arg1
116
- fr = @f0.collect { |f| f.round_to(0.1) }
117
- assert_equal( [0,10,15,105], fr )
118
- fr = @f1.collect { |f| f.round_to(0.1) }
119
- assert_equal( [10.1,10.0,10.9,10.1,10.5,10.1,10.5], fr )
120
- end
121
-
122
- def test_round_to_arg10
123
- fr = @f0.collect { |f| f.round_to(10) }
124
- assert_equal( [0,10,20,110], fr )
125
- fr = @f1.collect { |f| f.round_to(10) }
126
- assert_equal( [10,10,10,10,10,10,10], fr )
127
- end
128
-
129
- def test_round_off
130
- assert_equal( 1.0, 1.2.round_off )
131
- assert_equal( 2.0, 1.8.round_off )
132
- end
133
-
134
- def test_approx?
135
- f = 10.006
136
- assert( f.approx?(10.01) )
137
- assert( f.approx?(10, 0.1) )
138
- assert( 100.4.approx?(100.6, 1) )
139
- end
140
-
141
- end
142
-
143
- =end
78
+ end