facets 2.1.3 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,47 @@
1
+ class Time
2
+
3
+ #
4
+
5
+ unless const_defined?('FORMAT')
6
+ FORMAT = {
7
+ :db => "%Y-%m-%d %H:%M:%S",
8
+ :dbase => "%Y-%m-%d %H:%M:%S",
9
+ :datbase => "%Y-%m-%d %H:%M:%S",
10
+ :utc => "%Y-%m-%d %H:%M:%S",
11
+ :short => "%d %b %H:%M",
12
+ :long => "%B %d, %Y %H:%M",
13
+ :day1st => "%d-%m-%Y %H:%M",
14
+ :dmYHM => "%d-%m-%Y %H:%M",
15
+ :rfc822 => "%a, %d %b %Y %H:%M:%S %z",
16
+ nil => "%a %b %d %H:%M:%S %Z %Y"
17
+ }
18
+ end
19
+
20
+ # Produce time stamp for Time.now. See #stamp.
21
+ #
22
+ # CREDIT: Trans
23
+
24
+ def self.stamp(*args)
25
+ now.stamp(*args)
26
+ end
27
+
28
+ # Create a time stamp.
29
+ #
30
+ # Time.now.stamp(:short) #=> "01 Dec 15:15"
31
+ #
32
+ # Supported formats come from the Time::FORMAT constant.
33
+ #
34
+ # CREDIT: Trans
35
+
36
+ def stamp(fmt = nil)
37
+ unless String === fmt
38
+ fmt = FORMAT[fmt]
39
+ end
40
+ strftime(fmt).strip
41
+ end
42
+
43
+ # DEPRECATED.
44
+ # Enhance #to_s by aliasing to #stamp.
45
+ #alias_method :to_s, :stamp
46
+
47
+ end
@@ -1,2 +1,5 @@
1
1
  require 'facets/unboundmethod/arguments.rb'
2
+
3
+ # remove for 1.9
2
4
  require 'facets/unboundmethod/name.rb'
5
+
@@ -1,19 +1,42 @@
1
1
  class UnboundMethod
2
2
 
3
3
  # Resolves the arguments of the method to have an
4
- # identialc signiture (useful to preserve arity).
4
+ # identical signiture --useful for preserving arity.
5
+ #
6
+ # class X
7
+ # def foo(a, b); end
8
+ # def bar(a, b=1); end
9
+ # end
10
+ #
11
+ # foo_method = X.instance_method(:foo)
12
+ # foo_method.arguments #=> "a0, a1"
13
+ #
14
+ # bar_method = X.instance_method(:bar)
15
+ # bar_method.arguments #=> "a0, *args"
16
+ #
17
+ # When defaults are used the arguments must end in "*args".
18
+ #
19
+ # CREDIT: Trans
5
20
 
6
21
  def arguments
7
- if (ar = arity) > 0
22
+ ar = arity
23
+ case ar <=> 0
24
+ when 1
8
25
  args = []
9
26
  ar.times do |i|
10
27
  args << "a#{i}"
11
28
  end
12
29
  args = args.join(", ")
13
- elsif ar == 0
30
+ when 0
14
31
  args = ""
15
32
  else
16
- args = "*args"
33
+ ar = -ar - 1
34
+ args = []
35
+ ar.times do |i|
36
+ args << "a#{i}"
37
+ end
38
+ args << "*args"
39
+ args = args.join(", ")
17
40
  end
18
41
  return args
19
42
  end
@@ -1,12 +1,26 @@
1
+ # DEPRECATE for 1.9
2
+ unless (RUBY_VERSION[0,3] == '1.9')
1
3
 
2
- class UnboundMethod
4
+ class UnboundMethod
5
+
6
+ # Return the name of the method.
7
+ # Is this already in 1.9+ ?
8
+ #
9
+ # class X
10
+ # def foo; end
11
+ # end
12
+ #
13
+ # meth = X.instance_method(:foo)
14
+ #
15
+ # meth.name #=> "foo"
16
+ #
17
+ # CREDIT: Trans
18
+
19
+ def name
20
+ i = to_s.rindex('#')
21
+ to_s.slice(i+1...-1)
22
+ end
3
23
 
4
- # Return the name of the method.
5
- # Is this already in 1.9+ ?
6
- #
7
- def name
8
- i = to_s.rindex('#')
9
- to_s.slice(i+1...-1)
10
24
  end
11
25
 
12
26
  end
@@ -1 +1 @@
1
- require 'facets/enumerable/collect.rb'
1
+ require 'facets/enumerable/split.rb'
@@ -0,0 +1 @@
1
+ require 'facets/enumerable/mash.rb'
@@ -1 +1 @@
1
- require 'facets/enumerable/collect.rb'
1
+ require 'facets/enumerable/split.rb'
@@ -1 +1 @@
1
- require 'facets/enumerable/collect.rb'
1
+ require 'facets/enumerable/each.rb'
@@ -1 +1 @@
1
- require 'facets/enumerable/collect.rb'
1
+ require 'facets/enumerable/each.rb'
@@ -1 +1 @@
1
- require 'facets/enumerable/collect.rb'
1
+ require 'facets/enumerable/each.rb'
@@ -1 +1 @@
1
- require 'facets/enumerable/collate.rb'
1
+ require 'facets/enumerable/mash.rb'
@@ -1 +1 @@
1
- require 'facets/enumerable/collect.rb'
1
+ require 'facets/enumerable/split.rb'
@@ -0,0 +1 @@
1
+ require 'facets/enumerable/collect.rb'
@@ -0,0 +1 @@
1
+ require 'facets/enumerable/collect.rb'
@@ -0,0 +1 @@
1
+ require 'facets/enumerable/split.rb'
@@ -1 +1 @@
1
- require 'facets/enumerable/collect.rb'
1
+ require 'facets/enumerable/split.rb'
@@ -1 +1 @@
1
- require 'facets/enumerable/collate.rb'
1
+ require 'facets/enumerable/mash.rb'
@@ -0,0 +1 @@
1
+ require 'facets/hash/slice.rb'
@@ -1 +1 @@
1
- require 'facets/enumerable/collate.rb'
1
+ require 'facets/enumerable/mash.rb'
@@ -0,0 +1 @@
1
+ require 'facets/enumerable/mash.rb'
@@ -0,0 +1 @@
1
+ require 'facets/integer/bitmask.rb'
@@ -1 +1 @@
1
- require 'facets/kernel/tap.rb'
1
+ require 'facets/kernel/returning.rb'
@@ -1 +1 @@
1
- require 'facets/binding/eval.rb'
1
+ require 'facets/binding/here.rb'
@@ -0,0 +1 @@
1
+ require 'facets/kernel/val.rb'
@@ -0,0 +1 @@
1
+ require 'facets/kernel/respond.rb'
@@ -1 +1 @@
1
- require 'facets/kernel/tap.rb'
1
+ require 'facets/kernel/returning.rb'
@@ -0,0 +1 @@
1
+ require 'facets/kernel/metaid.rb'
@@ -0,0 +1 @@
1
+ require 'facets/string/case.rb'
@@ -0,0 +1 @@
1
+ require 'facets/string/op.rb'
@@ -0,0 +1 @@
1
+ require 'facets/string/case.rb'
@@ -48,7 +48,7 @@ require 'facets/inheritor.rb'
48
48
 
49
49
  class ::Module
50
50
 
51
- inheritor :attributes, [], :|
51
+ inheritor :instance_attributes, [], :|
52
52
 
53
53
  def attr( *args )
54
54
  args.flatten!
@@ -92,7 +92,7 @@ class ::Module
92
92
  a = a.to_sym
93
93
  ann(a,harg)
94
94
  }
95
- attributes!.concat( args ) #merge!
95
+ instance_attributes!.concat( args ) #merge!
96
96
 
97
97
  # Use this callback to customize for your needs.
98
98
  if respond_to?(:attr_callback)
@@ -120,11 +120,11 @@ class ::Module
120
120
  # attr_accessor :age, Fixnum
121
121
  # end
122
122
  #
123
- # MyClass.attributes # => [:test, :name, :age, :body]
123
+ # MyClass.instance_attributes # => [:test, :name, :age, :body]
124
124
  # MyClass.classified_attributes # => [:name, :age]
125
125
 
126
126
  def classified_attributes
127
- attributes.find_all do |a|
127
+ instance_attributes.find_all do |a|
128
128
  self.ann(a, :class)
129
129
  end
130
130
  end
@@ -151,7 +151,7 @@ end
151
151
 
152
152
  def test_09_001
153
153
  a = A.new
154
- assert_equal( [:x], A.attributes )
154
+ assert_equal( [:x], A.instance_attributes )
155
155
  end
156
156
  end
157
157
 
@@ -232,65 +232,3 @@ class Module
232
232
  end
233
233
  =end
234
234
 
235
-
236
- # _____ _
237
- # |_ _|__ ___| |_
238
- # | |/ _ \/ __| __|
239
- # | | __/\__ \ |_
240
- # |_|\___||___/\__|
241
- #
242
-
243
- =begin test
244
-
245
- require 'test/unit'
246
-
247
- class TCBasicObject < Test::Unit::TestCase
248
-
249
- class A < BasicObject
250
- end
251
-
252
- def setup
253
- @a = A.new
254
- end
255
-
256
- def test_001
257
- assert( ! @a.object_class.method_defined?( :id ) )
258
- assert( ! @a.object_class.method_defined?( :class ) )
259
- end
260
-
261
- def test_002
262
- assert( @a.object_class.method_defined?( :__id__ ) )
263
- assert( @a.object_class.method_defined?( :__send__ ) )
264
- assert( @a.object_class.method_defined?( :object_self ) )
265
- assert( @a.object_class.method_defined?( :dup ) )
266
- assert( @a.object_class.method_defined?( :as ) )
267
- end
268
-
269
- def test_003
270
- assert_equal( A, @a.object_self.class )
271
- end
272
-
273
- def test_004
274
- Kernel.module_eval { def xxx ; end }
275
- assert( ! @a.object_class.method_defined?( :xxx ) )
276
- end
277
-
278
- def test_005
279
- Object.class_eval { def yyy ; end }
280
- assert( ! @a.object_class.method_defined?( :yyy ) )
281
- end
282
-
283
- def test_006
284
- Object.class_eval { def yyy ; end }
285
- assert( ! @a.object_self.methods.include?( 'yyy' ) )
286
- end
287
-
288
- def test_007
289
- Object.class_eval { def yyy ; end }
290
- assert( ! @a.object_class.method_defined?( :methods ) )
291
- assert( ! @a.object_self.methods.include?( :methods ) )
292
- end
293
-
294
- end
295
-
296
- =end
@@ -1,3 +1,6 @@
1
+ # There is no continuation in Ruby 1.9.
2
+
3
+ raise "Ruby 1.9+ does not support continuations." unless Continuation
1
4
 
2
5
  # Creates a continuation in a way that is easier to use than callcc.
3
6
  # On the initial call this will return the created Continuation and
@@ -42,30 +45,10 @@
42
45
  # end
43
46
  # [1,2,3,4,5].cc_inject { |acc, n| acc + n } # => 15
44
47
  #
48
+
45
49
  def Continuation.create(*args, &block)
46
50
  args = [args] if not args.nil? and not args.is_a? Array # 1.6.8 compatibility
47
51
  cc = nil; result = callcc {|c| cc = c; block.call(cc) if block and args.empty?}
48
52
  result ||= args
49
53
  return *[cc, *result]
50
54
  end
51
-
52
-
53
- # _____ _
54
- # |_ _|__ ___| |_
55
- # | |/ _ \/ __| __|
56
- # | | __/\__ \ |_
57
- # |_|\___||___/\__|
58
- #
59
- =begin test
60
-
61
- require 'test/unit'
62
-
63
- class TCContinuation < Test::Unit::TestCase
64
-
65
- def test_Continuation_create
66
- assert_nothing_raised { c, r = Continuation.create }
67
- end
68
-
69
- end
70
-
71
- =end
@@ -0,0 +1,534 @@
1
+ # = Title:
2
+ #
3
+ # Duration
4
+ #
5
+ # = Synopsis:
6
+ #
7
+ # Duration is a simple class that provides ways of easily manipulating durations
8
+ # (timespans) and formatting them as well.
9
+ #
10
+ # = Copying:
11
+ #
12
+ # Copyright (c) 2006 Matthew Harris <shugotenshi at gmail.com>
13
+ #
14
+ # = Author:
15
+ #
16
+ # Matthew Harris (mailto:shugotenshi@gmail.com)
17
+ #
18
+ # = Notes:
19
+ #
20
+ # - This library comes from the orginal Duration project.
21
+ # See: http://www.rubyforge.org/projects/duration
22
+ #
23
+
24
+ # = Duration
25
+ #
26
+ # Duration is a simple class that provides ways of easily manipulating durations
27
+ # (timespans) and formatting them as well.
28
+ #
29
+ # == Usage:
30
+ #
31
+ # require 'duration'
32
+ # => true
33
+ # d = Duration.new(60 * 60 * 24 * 10 + 120 + 30)
34
+ # => #<Duration: 1 week, 3 days, 2 minutes and 30 seconds>
35
+ # d.to_s
36
+ # => "1 week, 3 days, 2 minutes and 30 seconds"
37
+ # [d.weeks, d.days]
38
+ # => [1, 3]
39
+ # d.days = 7; d
40
+ # => #<Duration: 2 weeks, 2 minutes and 30 seconds>
41
+ # d.strftime('%w w, %d d, %h h, %m m, %s s')
42
+ # => "2 w, 0 d, 0 h, 2 m, 30 s"
43
+
44
+ class Duration
45
+ include Comparable
46
+ include Enumerable
47
+
48
+ attr_reader :total, :weeks, :days, :hours, :minutes
49
+
50
+ WEEK = 60 * 60 * 24 * 7
51
+ DAY = 60 * 60 * 24
52
+ HOUR = 60 * 60
53
+ MINUTE = 60
54
+ SECOND = 1
55
+
56
+ # Initialize Duration class.
57
+ #
58
+ # *Example*
59
+ #
60
+ # d = Duration.new(60 * 60 * 24 * 10 + 120 + 30)
61
+ # => #<Duration: 1 week, 3 days, 2 minutes and 30 seconds>
62
+ # d = Duration.new(:weeks => 1, :days => 3, :minutes => 2, :seconds => 30)
63
+ # => #<Duration: 1 week, 3 days, 2 minutes and 30 seconds>
64
+ #
65
+ def initialize(seconds_or_attr = 0)
66
+ if seconds_or_attr.kind_of? Hash
67
+ # Part->time map table.
68
+ h = {:weeks => WEEK, :days => DAY, :hours => HOUR, :minutes => MINUTE, :seconds => SECOND}
69
+
70
+ # Loop through each valid part, ignore all others.
71
+ seconds = seconds_or_attr.inject(0) do |sec, args|
72
+ # Grab the part of the duration (week, day, whatever) and the number of seconds for it.
73
+ part, time = args
74
+
75
+ # Map each part to their number of seconds and the given value.
76
+ # {:weeks => 2} maps to h[:weeks] -- so... weeks = WEEK * 2
77
+ if h.key?(prt = part.to_s.to_sym) then sec + time * h[prt] else 0 end
78
+ end
79
+ else
80
+ seconds = seconds_or_attr
81
+ end
82
+
83
+ @total, array = seconds.to_f.round, []
84
+ @seconds = [WEEK, DAY, HOUR, MINUTE].inject(@total) do |left, part|
85
+ array << left / part; left % part
86
+ end
87
+
88
+ @weeks, @days, @hours, @minutes = array
89
+ end
90
+
91
+ # Format duration.
92
+ #
93
+ # *Identifiers*
94
+ #
95
+ # %w -- Number of weeks
96
+ # %d -- Number of days
97
+ # %h -- Number of hours
98
+ # %m -- Number of minutes
99
+ # %s -- Number of seconds
100
+ # %t -- Total number of seconds
101
+ # %x -- Duration#to_s
102
+ # %% -- Literal `%' character
103
+ #
104
+ # *Example*
105
+ #
106
+ # d = Duration.new(:weeks => 10, :days => 7)
107
+ # => #<Duration: 11 weeks>
108
+ # d.strftime("It's been %w weeks!")
109
+ # => "It's been 11 weeks!"
110
+ #
111
+ def strftime(fmt)
112
+ h =\
113
+ {'w' => @weeks ,
114
+ 'd' => @days ,
115
+ 'h' => @hours ,
116
+ 'm' => @minutes,
117
+ 's' => @seconds,
118
+ 't' => @total ,
119
+ 'x' => to_s}
120
+
121
+ fmt.gsub(/%?%(w|d|h|m|s|t|x)/) do |match|
122
+ match.size == 3 ? match : h[match[1..1]]
123
+ end.gsub('%%', '%')
124
+ end
125
+
126
+ # Get the number of seconds of a given part, or simply just get the number of
127
+ # seconds.
128
+ #
129
+ # *Example*
130
+ #
131
+ # d = Duration.new(:weeks => 1, :days => 1, :hours => 1, :seconds => 30)
132
+ # => #<Duration: 1 week, 1 day, 1 hour and 30 seconds>
133
+ # d.seconds(:weeks)
134
+ # => 604800
135
+ # d.seconds(:days)
136
+ # => 86400
137
+ # d.seconds(:hours)
138
+ # => 3600
139
+ # d.seconds
140
+ # => 30
141
+ #
142
+ def seconds(part = nil)
143
+ # Table mapping
144
+ h = {:weeks => WEEK, :days => DAY, :hours => HOUR, :minutes => MINUTE}
145
+
146
+ if [:weeks, :days, :hours, :minutes].include? part
147
+ __send__(part) * h[part]
148
+ else
149
+ @seconds
150
+ end
151
+ end
152
+
153
+ # For iterating through the duration set of weeks, days, hours, minutes, and
154
+ # seconds.
155
+ #
156
+ # *Example*
157
+ #
158
+ # Duration.new(:weeks => 1, :seconds => 30).each do |part, time|
159
+ # puts "part: #{part}, time: #{time}"
160
+ # end
161
+ #
162
+ # _Output_
163
+ #
164
+ # part: weeks, time: 1
165
+ # part: days, time: 0
166
+ # part: hours, time: 0
167
+ # part: minutes, time: 0
168
+ # part: seconds, time: 30
169
+ #
170
+ def each
171
+ [['weeks' , @weeks ],
172
+ ['days' , @days ],
173
+ ['hours' , @hours ],
174
+ ['minutes' , @minutes],
175
+ ['seconds' , @seconds]].each do |part, time|
176
+ # Yield to block
177
+ yield part, time
178
+ end
179
+ end
180
+
181
+ # Calls `<=>' on Duration#total.
182
+ #
183
+ # *Example*
184
+ #
185
+ # 5.days == 24.hours * 5
186
+ # => true
187
+ #
188
+ def <=>(other)
189
+ @total <=> other.to_i
190
+ end
191
+
192
+ # Set the number of weeks.
193
+ #
194
+ # *Example*
195
+ #
196
+ # d = Duration.new(0)
197
+ # => #<Duration: ...>
198
+ # d.weeks = 2; d
199
+ # => #<Duration: 2 weeks>
200
+ #
201
+ def weeks=(n)
202
+ initialize(:weeks => n, :seconds => @total - seconds(:weeks))
203
+ end
204
+
205
+ # Set the number of days.
206
+ #
207
+ # *Example*
208
+ #
209
+ # d = Duration.new(0)
210
+ # => #<Duration: ...>
211
+ # d.days = 5; d
212
+ # => #<Duration: 5 days>
213
+ #
214
+ def days=(n)
215
+ initialize(:days => n, :seconds => @total - seconds(:days))
216
+ end
217
+
218
+ # Set the number of hours.
219
+ #
220
+ # *Example*
221
+ #
222
+ # d = Duration.new(0)
223
+ # => #<Duration: ...>
224
+ # d.hours = 5; d
225
+ # => #<Duration: 5 hours>
226
+ #
227
+ def hours=(n)
228
+ initialize(:hours => n, :seconds => @total - seconds(:hours))
229
+ end
230
+
231
+ # Set the number of minutes.
232
+ #
233
+ # *Example*
234
+ #
235
+ # d = Duration.new(0)
236
+ # => #<Duration: ...>
237
+ # d.minutes = 30; d
238
+ # => #<Duration: 30 minutes>
239
+ #
240
+ def minutes=(n)
241
+ initialize(:minutes => n, :seconds => @total - seconds(:minutes))
242
+ end
243
+
244
+ # Set the number of minutes.
245
+ #
246
+ # *Example*
247
+ #
248
+ # d = Duration.new(0)
249
+ # => #<Duration: ...>
250
+ # d.seconds = 30; d
251
+ # => #<Duration: 30 seconds>
252
+ #
253
+ def seconds=(n)
254
+ initialize(:seconds => (@total + n) - @seconds)
255
+ end
256
+
257
+ # Friendly, human-readable string representation of the duration.
258
+ #
259
+ # *Example*
260
+ #
261
+ # d = Duration.new(:seconds => 140)
262
+ # => #<Duration: 2 minutes and 20 seconds>
263
+ # d.to_s
264
+ # => "2 minutes and 20 seconds"
265
+ #
266
+ def to_s
267
+ str = ''
268
+
269
+ each do |part, time|
270
+ # Skip any zero times.
271
+ next if time.zero?
272
+
273
+ # Concatenate the part of the time and the time itself.
274
+ str << "#{time} #{time == 1 ? part[0..-2] : part}, "
275
+ end
276
+
277
+ str.chomp(', ').sub(/(.+), (.+)/, '\1 and \2')
278
+ end
279
+
280
+ # Inspection string--Similar to #to_s except that it has the class name.
281
+ #
282
+ # *Example*
283
+ #
284
+ # Duration.new(:seconds => 140)
285
+ # => #<Duration: 2 minutes and 20 seconds>
286
+ #
287
+ def inspect
288
+ "#<#{self.class}: #{(s = to_s).empty? ? '...' : s}>"
289
+ end
290
+
291
+ # Add to Duration.
292
+ #
293
+ # *Example*
294
+ #
295
+ # d = Duration.new(30)
296
+ # => #<Duration: 30 seconds>
297
+ # d + 30
298
+ # => #<Duration: 1 minute>
299
+ #
300
+ def +(other)
301
+ self.class.new(@total + other.to_i)
302
+ end
303
+
304
+ # Subtract from Duration.
305
+ #
306
+ # *Example*
307
+ #
308
+ # d = Duration.new(30)
309
+ # => #<Duration: 30 seconds>
310
+ # d - 15
311
+ # => #<Duration: 15 seconds>
312
+ #
313
+ def -(other)
314
+ self.class.new(@total - other.to_i)
315
+ end
316
+
317
+ # Multiply two Durations.
318
+ #
319
+ # *Example*
320
+ #
321
+ # d = Duration.new(30)
322
+ # => #<Duration: 30 seconds>
323
+ # d * 2
324
+ # => #<Duration: 1 minute>
325
+ #
326
+ def *(other)
327
+ self.class.new(@total * other.to_i)
328
+ end
329
+
330
+ # Divide two Durations.
331
+ #
332
+ # *Example*
333
+ #
334
+ # d = Duration.new(30)
335
+ # => #<Duration: 30 seconds>
336
+ # d / 2
337
+ # => #<Duration: 15 seconds>
338
+ #
339
+ def /(other)
340
+ self.class.new(@total / other.to_i)
341
+ end
342
+
343
+ alias to_i total
344
+ end
345
+
346
+ # BigDuration is a variant of Duration that supports years and months. Support
347
+ # for months is not accurate, as a month is assumed to be 30 days so use at your
348
+ # own risk.
349
+ #
350
+ class BigDuration < Duration
351
+ attr_reader :years, :months
352
+
353
+ YEAR = 60 * 60 * 24 * 30 * 12
354
+ MONTH = 60 * 60 * 24 * 30
355
+
356
+ # Similar to Duration.new except that BigDuration.new supports `:years' and
357
+ # `:months' and will also handle years and months correctly when breaking down
358
+ # the seconds.
359
+ #
360
+ def initialize(seconds_or_attr = 0)
361
+ if seconds_or_attr.kind_of? Hash
362
+ # Part->time map table.
363
+ h =\
364
+ {:years => YEAR ,
365
+ :months => MONTH ,
366
+ :weeks => WEEK ,
367
+ :days => DAY ,
368
+ :hours => HOUR ,
369
+ :minutes => MINUTE,
370
+ :seconds => SECOND}
371
+
372
+ # Loop through each valid part, ignore all others.
373
+ seconds = seconds_or_attr.inject(0) do |sec, args|
374
+ # Grab the part of the duration (week, day, whatever) and the number of seconds for it.
375
+ part, time = args
376
+
377
+ # Map each part to their number of seconds and the given value.
378
+ # {:weeks => 2} maps to h[:weeks] -- so... weeks = WEEK * 2
379
+ if h.key?(prt = part.to_s.to_sym) then sec + time * h[prt] else 0 end
380
+ end
381
+ else
382
+ seconds = seconds_or_attr
383
+ end
384
+
385
+ @total, array = seconds.to_f.round, []
386
+ @seconds = [YEAR, MONTH, WEEK, DAY, HOUR, MINUTE].inject(@total) do |left, part|
387
+ array << left / part; left % part
388
+ end
389
+
390
+ @years, @months, @weeks, @days, @hours, @minutes = array
391
+ end
392
+
393
+ # BigDuration variant of Duration#strftime.
394
+ #
395
+ # *Identifiers: BigDuration*
396
+ #
397
+ # %y -- Number of years
398
+ # %m -- Number of months
399
+ #
400
+ def strftime(fmt)
401
+ h = {'y' => @years, 'M' => @months}
402
+ super(fmt.gsub(/%?%(y|M)/) { |match| match.size == 3 ? match : h[match[1..1]] })
403
+ end
404
+
405
+ # Similar to Duration#each except includes years and months in the interation.
406
+ #
407
+ def each
408
+ [['years' , @years ],
409
+ ['months' , @months ],
410
+ ['weeks' , @weeks ],
411
+ ['days' , @days ],
412
+ ['hours' , @hours ],
413
+ ['minutes' , @minutes],
414
+ ['seconds' , @seconds]].each do |part, time|
415
+ # Yield to block
416
+ yield part, time
417
+ end
418
+ end
419
+
420
+ # Derived from Duration#seconds, but supports `:years' and `:months' as well.
421
+ #
422
+ def seconds(part = nil)
423
+ h = {:years => YEAR, :months => MONTH}
424
+ if [:years, :months].include? part
425
+ __send__(part) * h[part]
426
+ else
427
+ super(part)
428
+ end
429
+ end
430
+
431
+ # Set the number of years in the BigDuration.
432
+ #
433
+ def years=(n)
434
+ initialize(:years => n, :seconds => @total - seconds(:years))
435
+ end
436
+
437
+ # Set the number of months in the BigDuration.
438
+ #
439
+ def months=(n)
440
+ initialize(:months => n, :seconds => @total - seconds(:months))
441
+ end
442
+ end
443
+
444
+ # The following important additions are made to Numeric:
445
+ #
446
+ # Numeric#weeks -- Create a Duration object with given weeks
447
+ # Numeric#days -- Create a Duration object with given days
448
+ # Numeric#hours -- Create a Duration object with given hours
449
+ # Numeric#minutes -- Create a Duration object with given minutes
450
+ # Numeric#seconds -- Create a Duration object with given seconds
451
+ #
452
+ # BigDuration support:
453
+ #
454
+ # Numeric#years -- Create a BigDuration object with given years
455
+ # Numeric#months -- Create a BigDuration object with given months
456
+ #
457
+ # BigDuration objects can be created from regular weeks, days, hours, etc by
458
+ # providing `:big' as an argument to the above Numeric methods.
459
+
460
+ #
461
+ class Numeric
462
+ # Create a Duration object using self where self could represent weeks, days,
463
+ # hours, minutes, and seconds.
464
+ #
465
+ # *Example*
466
+ #
467
+ # 10.duration(:weeks)
468
+ # => #<Duration: 10 weeks>
469
+ # 10.duration
470
+ # => #<Duration: 10 seconds>
471
+ #
472
+ def duration(part = nil, klass = Duration)
473
+ if [:years, :months, :weeks, :days, :hours, :minutes, :seconds].include? part
474
+ klass.new(part => self)
475
+ else
476
+ klass.new(self)
477
+ end
478
+ end
479
+
480
+ # TODO: IF WE WANT TO DO THIS IT NEEDS TO BE ADDED TO times.rb ???
481
+ #
482
+ # alias __numeric_old_method_missing method_missing
483
+ #
484
+ # # Intercept calls to .weeks, .days, .hours, .minutes and .seconds because
485
+ # # Rails defines its own methods, so I'd like to prevent any redefining of
486
+ # # Rails' methods. If these methods don't get captured, then alternatively
487
+ # # Numeric#duration can be used.
488
+ # #
489
+ # # BigDuration methods include .years and .months, also BigDuration objects
490
+ # # can be created from any time such as weeks or minutes and even seconds.
491
+ # #
492
+ # # *Example: BigDuration*
493
+ # #
494
+ # # 5.years
495
+ # # => #<BigDuration: 5 years>
496
+ # # 10.minutes(:big)
497
+ # # => #<BigDuration: 10 minutes>
498
+ # #
499
+ # # *Example*
500
+ # #
501
+ # # 140.seconds
502
+ # # => #<Duration: 2 minutes and 20 seconds>
503
+ # #
504
+ # def method_missing(method, *args)
505
+ # if [:weeks, :days, :hours, :minutes, :seconds].include? method
506
+ # if args.size > 0 && args[0] == :big
507
+ # duration(method, BigDuration)
508
+ # else
509
+ # duration(method)
510
+ # end
511
+ # elsif [:years, :months].include? method
512
+ # duration(method, BigDuration)
513
+ # else
514
+ # __numeric_old_method_missing(method, *args)
515
+ # end
516
+ # end
517
+
518
+ end
519
+
520
+ # Time#duration has been added to convert the UNIX timestamp into a Duration.
521
+ # See Time#duration for an example.
522
+ #
523
+ class Time
524
+ # Create a Duration object from the UNIX timestamp.
525
+ #
526
+ # *Example*
527
+ #
528
+ # Time.now.duration
529
+ # => #<Duration: 1898 weeks, 6 days, 1 hour, 12 minutes and 1 second>
530
+ #
531
+ def duration(type = nil)
532
+ if type == :big then BigDuration.new(to_i) else Duration.new(to_i) end
533
+ end
534
+ end