when_exe 0.2.100 → 0.3.1

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 (193) hide show
  1. data/LICENSE.ja.txt +25 -25
  2. data/LICENSE.txt +31 -31
  3. data/bin/irb.rc +5 -0
  4. data/bin/locales.rb +2 -2
  5. data/bin/when.rb +16 -0
  6. data/bin/when.rb.config +7 -0
  7. data/lib/when_exe.rb +616 -14
  8. data/lib/when_exe/basictypes.rb +615 -0
  9. data/lib/when_exe/calendartypes.rb +1700 -0
  10. data/lib/when_exe/coordinates.rb +1936 -0
  11. data/lib/when_exe/core/compatibility.rb +54 -0
  12. data/lib/when_exe/core/duration.rb +72 -72
  13. data/lib/when_exe/core/extension.rb +382 -0
  14. data/lib/when_exe/ephemeris.rb +1845 -0
  15. data/lib/when_exe/googlecalendar.rb +140 -0
  16. data/lib/when_exe/icalendar.rb +1587 -0
  17. data/lib/when_exe/inspect.rb +1237 -0
  18. data/lib/when_exe/locales/af.rb +90 -0
  19. data/lib/when_exe/locales/ar.rb +145 -0
  20. data/lib/when_exe/locales/az.rb +90 -0
  21. data/lib/when_exe/locales/bg.rb +90 -0
  22. data/lib/when_exe/locales/bn.rb +94 -0
  23. data/lib/when_exe/locales/bs.rb +121 -0
  24. data/lib/when_exe/locales/ca.rb +92 -0
  25. data/lib/when_exe/locales/cs.rb +107 -0
  26. data/lib/when_exe/locales/cy.rb +150 -0
  27. data/lib/when_exe/locales/da.rb +84 -0
  28. data/lib/when_exe/locales/de.rb +92 -0
  29. data/lib/when_exe/locales/de_AT.rb +92 -0
  30. data/lib/when_exe/locales/de_CH.rb +92 -0
  31. data/lib/when_exe/locales/el.rb +93 -0
  32. data/lib/when_exe/locales/en.rb +88 -0
  33. data/lib/when_exe/locales/en_AU.rb +88 -0
  34. data/lib/when_exe/locales/en_CA.rb +88 -0
  35. data/lib/when_exe/locales/en_GB.rb +88 -0
  36. data/lib/when_exe/locales/en_IN.rb +88 -0
  37. data/lib/when_exe/locales/en_NZ.rb +88 -0
  38. data/lib/when_exe/locales/eo.rb +89 -0
  39. data/lib/when_exe/locales/es.rb +84 -0
  40. data/lib/when_exe/locales/es_419.rb +84 -0
  41. data/lib/when_exe/locales/es_AR.rb +84 -0
  42. data/lib/when_exe/locales/es_CL.rb +84 -0
  43. data/lib/when_exe/locales/es_CO.rb +84 -0
  44. data/lib/when_exe/locales/es_MX.rb +84 -0
  45. data/lib/when_exe/locales/es_PE.rb +85 -0
  46. data/lib/when_exe/locales/es_VE.rb +84 -0
  47. data/lib/when_exe/locales/et.rb +94 -0
  48. data/lib/when_exe/locales/eu.rb +95 -0
  49. data/lib/when_exe/locales/fa.rb +80 -0
  50. data/lib/when_exe/locales/fi.rb +89 -0
  51. data/lib/when_exe/locales/fr.rb +88 -0
  52. data/lib/when_exe/locales/fr_CA.rb +88 -0
  53. data/lib/when_exe/locales/fr_CH.rb +88 -0
  54. data/lib/when_exe/locales/gl.rb +81 -0
  55. data/lib/when_exe/locales/he.rb +84 -0
  56. data/lib/when_exe/locales/hi.rb +80 -0
  57. data/lib/when_exe/locales/hi_IN.rb +84 -0
  58. data/lib/when_exe/locales/hr.rb +128 -0
  59. data/lib/when_exe/locales/hu.rb +84 -0
  60. data/lib/when_exe/locales/id.rb +89 -0
  61. data/lib/when_exe/locales/is.rb +89 -0
  62. data/lib/when_exe/locales/it.rb +87 -0
  63. data/lib/when_exe/locales/it_CH.rb +87 -0
  64. data/lib/when_exe/locales/ja.rb +78 -0
  65. data/lib/when_exe/locales/kn.rb +86 -0
  66. data/lib/when_exe/locales/ko.rb +78 -0
  67. data/lib/when_exe/locales/links.rb +2342 -0
  68. data/lib/when_exe/locales/lo.rb +123 -0
  69. data/lib/when_exe/locales/locales.rb +91 -0
  70. data/lib/when_exe/locales/lt.rb +111 -0
  71. data/lib/when_exe/locales/lv.rb +118 -0
  72. data/lib/when_exe/locales/mk.rb +93 -0
  73. data/lib/when_exe/locales/mn.rb +80 -0
  74. data/lib/when_exe/locales/nb.rb +81 -0
  75. data/lib/when_exe/locales/ne.rb +81 -0
  76. data/lib/when_exe/locales/nl.rb +92 -0
  77. data/lib/when_exe/locales/nn.rb +73 -0
  78. data/lib/when_exe/locales/or.rb +84 -0
  79. data/lib/when_exe/locales/pl.rb +128 -0
  80. data/lib/when_exe/locales/pt.rb +88 -0
  81. data/lib/when_exe/locales/pt_BR.rb +88 -0
  82. data/lib/when_exe/locales/rm.rb +143 -0
  83. data/lib/when_exe/locales/ro.rb +105 -0
  84. data/lib/when_exe/locales/ru.rb +128 -0
  85. data/lib/when_exe/locales/sk.rb +109 -0
  86. data/lib/when_exe/locales/sl.rb +122 -0
  87. data/lib/when_exe/locales/sr.rb +122 -0
  88. data/lib/when_exe/locales/sv.rb +83 -0
  89. data/lib/when_exe/locales/sw.rb +89 -0
  90. data/lib/when_exe/locales/th.rb +78 -0
  91. data/lib/when_exe/locales/tl.rb +99 -0
  92. data/lib/when_exe/locales/tr.rb +96 -0
  93. data/lib/when_exe/locales/uk.rb +128 -0
  94. data/lib/when_exe/locales/uz.rb +128 -0
  95. data/lib/when_exe/locales/vi.rb +94 -0
  96. data/lib/when_exe/locales/wo.rb +82 -0
  97. data/lib/when_exe/locales/zh_CN.rb +77 -0
  98. data/lib/when_exe/locales/zh_HK.rb +77 -0
  99. data/lib/when_exe/locales/zh_TW.rb +77 -0
  100. data/lib/when_exe/mini_application.rb +252 -0
  101. data/lib/when_exe/parts/enumerator.rb +472 -0
  102. data/lib/when_exe/parts/geometric_complex.rb +379 -0
  103. data/lib/when_exe/parts/locale.rb +513 -0
  104. data/lib/when_exe/parts/method_cash.rb +207 -0
  105. data/lib/when_exe/parts/resource.rb +806 -0
  106. data/lib/when_exe/parts/timezone.rb +182 -0
  107. data/lib/when_exe/region/bahai.rb +145 -0
  108. data/lib/when_exe/region/balinese.rb +627 -0
  109. data/lib/when_exe/region/chinese.rb +896 -0
  110. data/lib/when_exe/region/chinese_calendar.rb +919 -0
  111. data/lib/when_exe/region/chinese_epoch.rb +1245 -0
  112. data/lib/when_exe/region/christian.rb +644 -0
  113. data/lib/when_exe/region/far_east.rb +192 -0
  114. data/lib/when_exe/region/french.rb +66 -0
  115. data/lib/when_exe/region/geologicalage.rb +639 -0
  116. data/lib/when_exe/region/indian.rb +1066 -0
  117. data/lib/when_exe/region/iranian.rb +66 -0
  118. data/lib/when_exe/region/islamic.rb +105 -0
  119. data/lib/when_exe/region/japanese.rb +851 -0
  120. data/lib/when_exe/region/japanese_notes.rb +964 -0
  121. data/lib/when_exe/region/japanese_residues.rb +1149 -0
  122. data/lib/when_exe/region/javanese.rb +228 -0
  123. data/lib/when_exe/region/jewish.rb +127 -0
  124. data/lib/when_exe/region/korean.rb +267 -0
  125. data/lib/when_exe/region/m17n.rb +115 -0
  126. data/lib/when_exe/region/martian.rb +215 -0
  127. data/lib/when_exe/region/mayan.rb +122 -0
  128. data/lib/when_exe/region/moon.rb +333 -0
  129. data/lib/when_exe/region/nihon_shoki.rb +73 -0
  130. data/lib/when_exe/region/planets.rb +585 -0
  131. data/lib/when_exe/region/pope.rb +298 -0
  132. data/lib/when_exe/region/residue.rb +229 -0
  133. data/lib/when_exe/region/roman.rb +325 -0
  134. data/lib/when_exe/region/ryukyu.rb +98 -0
  135. data/lib/when_exe/region/shire.rb +254 -0
  136. data/lib/when_exe/region/sun.rb +210 -0
  137. data/lib/when_exe/region/thai.rb +227 -0
  138. data/lib/when_exe/region/tibetan.rb +233 -0
  139. data/lib/when_exe/region/v50.rb +111 -0
  140. data/lib/when_exe/region/vietnamese.rb +173 -0
  141. data/lib/when_exe/region/world.rb +197 -0
  142. data/lib/when_exe/timestandard.rb +547 -0
  143. data/lib/when_exe/tmduration.rb +330 -330
  144. data/lib/when_exe/tmobjects.rb +1295 -0
  145. data/lib/when_exe/tmposition.rb +1955 -0
  146. data/lib/when_exe/tmreference.rb +1547 -0
  147. data/lib/when_exe/version.rb +10 -3
  148. data/link_to_online_documents +4 -0
  149. data/test/examples/JapanHolidays.ics +456 -0
  150. data/test/examples/Millennium.ics +17 -0
  151. data/test/examples/NewYork.ics +61 -0
  152. data/test/examples/Residue.m17n +135 -0
  153. data/test/examples/Spatial.m17n +179 -0
  154. data/test/examples/Terms.m17n +39 -0
  155. data/test/examples/Test.ics +53 -0
  156. data/test/examples/USA-DST.ics +61 -0
  157. data/test/examples/geometric_complex.rb +41 -0
  158. data/test/examples/sample.xml +14 -0
  159. data/test/examples/today.rb +61 -0
  160. data/test/test.rb +54 -19
  161. data/test/test.rb.config +1 -0
  162. data/test/test/basictypes.rb +368 -0
  163. data/test/test/calendartypes.rb +57 -0
  164. data/test/test/coordinates.rb +380 -0
  165. data/test/test/ephemeris.rb +127 -0
  166. data/test/test/googlecalendar.rb +167 -0
  167. data/test/test/icalendar.rb +848 -0
  168. data/test/test/inspect.rb +115 -0
  169. data/test/test/parts.rb +480 -0
  170. data/test/test/region/chinese.rb +161 -0
  171. data/test/test/region/french.rb +33 -0
  172. data/test/test/region/geologicalage.rb +14 -0
  173. data/test/test/region/indian.rb +55 -0
  174. data/test/test/region/iran.rb +54 -0
  175. data/test/test/region/islamic.rb +18 -0
  176. data/test/test/region/japanese.rb +62 -0
  177. data/test/test/region/jewish.rb +61 -0
  178. data/test/test/region/m17n.rb +181 -0
  179. data/test/test/region/mayan.rb +78 -0
  180. data/test/test/region/moon.rb +14 -0
  181. data/test/test/region/planets.rb +14 -0
  182. data/test/test/region/residue.rb +123 -0
  183. data/test/test/region/sun.rb +14 -0
  184. data/test/test/region/thai.rb +94 -0
  185. data/test/test/region/tibetan.rb +30 -0
  186. data/test/test/tmobjects.rb +356 -57
  187. data/test/test/tmposition.rb +237 -0
  188. data/test/test/tmreference.rb +95 -0
  189. data/when_exe.gemspec +2 -2
  190. metadata +187 -7
  191. data/doc/COPYING +0 -31
  192. data/doc/COPYING.ja +0 -25
  193. data/doc/document_url +0 -1
@@ -1,330 +1,330 @@
1
- # -*- coding: utf-8 -*-
2
- =begin
3
- Minimum subset - A multicultural and multilingualized calendar library based on ISO 8601, ISO 19108 and RFC 5545
4
-
5
- Copyright (C) 2013 Takashi SUGA
6
-
7
- You may use and/or modify this file according to the license described in the COPYING file included in this archive.
8
-
9
- =end
10
-
11
- module When
12
-
13
- # 分解能定数
14
-
15
- YEAR = -2
16
- MONTH = -1
17
- WEEK = -0.5
18
- DAY = 0
19
- HOUR = 1
20
- MINUTE = 2
21
- SECOND = 3
22
- # CENTURY = -4
23
- # DECADE = -3
24
- # STRING = 5
25
- # SYSTEM = (Float::MANT_DIG*0.3).to_i
26
-
27
- #
28
- # (5.2) Temporal Objects Package
29
- #
30
- #
31
- module TM
32
-
33
- # 時間次元における長さ又は距離を記述するために使うデータ型
34
- #
35
- # see {gml schema}[link:http://schemas.opengis.net/gml/3.1.1/base/temporal.xsd#duration]
36
- #
37
- class Duration
38
-
39
- # 物理的な時間間隔の定数
40
- #
41
- # 時間の「秒」を Float で表現して丸め誤差が発生しない範囲で、
42
- # もっとも大きな時間間隔(86400s を 2 の因数で割りつくした値)
43
- # を単位 SYSTEM とする
44
- #
45
- SYSTEM = 1.0
46
- DAY = SYSTEM * 675
47
- YEAR = DAY * 365.2425
48
- MONTH = YEAR / 12
49
- WEEK = DAY * 7
50
- HOUR = DAY / 24
51
- MINUTE = HOUR / 60
52
- SECOND = MINUTE / 60
53
-
54
- UnitName = {YEAR=>'year', MONTH =>'month', WEEK =>'week', DAY =>'day',
55
- HOUR=>'hour', MINUTE=>'minute', SECOND=>'second', SYSTEM=>'system'}
56
- Unit = UnitName.invert
57
- DurationUnits = [DAY, HOUR, MINUTE, SECOND]
58
-
59
- #
60
- # オブジェクト生成用クラスメソッド
61
- #
62
- class << self
63
- #
64
- # 日時分秒からのオブジェクト生成
65
- #
66
- # @param [Array<Numeric>] value ( 日, 時, 分, 秒 ) 下位の桁は省略可
67
- #
68
- # @return [When::TM::Duration]
69
- #
70
- def dhms(*value)
71
- units = DurationUnits.dup
72
- Duration.new(value.inject(0) {|s,v| s + v * units.shift})
73
- end
74
-
75
- #
76
- # メソッド名に相当する単位で表した value に対応する When::TM::Duration を生成する
77
- # @method unit
78
- # @param [Numeric] value
79
- # @return [When::TM::Duration]
80
- # @note unit は second, minute, hour, day, week に読み替える
81
-
82
- # @private
83
- Unit.keys.each do |key|
84
- module_eval %Q{
85
- def #{key}(value)
86
- new(value * Unit['#{key}'])
87
- end
88
- }
89
- end
90
- end
91
-
92
- # 時間間隔の長さ (128秒単位)
93
- #
94
- # @return [Numeric]
95
- #
96
- attr_accessor :duration
97
-
98
- #
99
- # メソッド名に相当する単位で表した時間間隔の大きさ
100
- # @method unit
101
- # @return [Numeric]
102
- # @note unit は second, minute, hour, day, week に読み替える
103
-
104
- # @private
105
- Unit.keys.each do |key|
106
- module_eval %Q{
107
- def #{key}
108
- duration / Unit['#{key}']
109
- end
110
- }
111
- end
112
-
113
- # 時間間隔の長さ / 秒
114
- #
115
- # @return [Float]
116
- #
117
- def to_f
118
- duration / SECOND
119
- end
120
- alias :to_float :to_f
121
-
122
- # 時間間隔の長さ / 秒
123
- #
124
- # @return [Integer] (四捨五入値)
125
- #
126
- def to_i
127
- to_f.round
128
- end
129
- alias :to_int :to_i
130
-
131
- # 符号反転
132
- #
133
- # @return [When::TM::Duration]
134
- #
135
- def -@
136
- Duration.new(-@duration)
137
- end
138
-
139
- # 絶対値
140
- #
141
- # @return [When::TM::Duration]
142
- #
143
- def abs
144
- sign >= 0 ? self.dup : -self
145
- end
146
-
147
- # 符号
148
- #
149
- # @return [Integer] 0 との比較により、負,0,正の値を返す
150
- #
151
- def sign
152
- @duration <=> 0
153
- end
154
-
155
- # 比較
156
- #
157
- # @param [Numeric, When::TM::Duration] other
158
- #
159
- # @return [Integer] other との比較により、負,0,正の値を返す
160
- #
161
- def <=>(other)
162
- self.to_f <=> other.to_f
163
- end
164
-
165
- # オブジェクトの同値
166
- #
167
- # @param [Object] other
168
- #
169
- # @return [Boolean]
170
- # [ true - 同値 ]
171
- # [ false - 非同値 ]
172
- #
173
- def ==(other)
174
- return false unless other.instance_of?(self.class)
175
- return self.duration == other.duration
176
- end
177
-
178
- #
179
- # 加算
180
- #
181
- # @param [Numeric, When::TM::Duration] other 秒数とみなす
182
- # @param [その他] other 日時とみなす
183
- #
184
- # @return [When::TM::Duration] (other が Numeric, When::TM::Duration の場合)
185
- # @return [other と同じクラス] (other がその他の場合)
186
- #
187
- def +(other)
188
- case other
189
- when Duration ; Duration.new(@duration + other.duration)
190
- when Numeric ; Duration.new(@duration + other * SECOND)
191
- else ; other + self
192
- end
193
- end
194
-
195
- #
196
- # 減算
197
- #
198
- # @param [Numeric, When::TM::Duration] other 秒数とみなす
199
- #
200
- # @return [When::TM::Duration]
201
- #
202
- def -(other)
203
- Duration.new(@duration - (other.kind_of?(Duration) ? other.duration : other * SECOND))
204
- end
205
-
206
- #
207
- # 乗算
208
- #
209
- # @param [Numeric] other
210
- #
211
- # @return [When::TM::Duration]
212
- #
213
- def *(other)
214
- Duration.new(@duration * other)
215
- end
216
-
217
- #
218
- # 除算
219
- #
220
- # @param [Numeric, When::TM::Duration] other 秒数とみなす
221
- #
222
- # @return [When::TM::Duration] (other が Numeric の場合)
223
- # @return [Numeric] (other が When::TM::Duration の場合)
224
- #
225
- def /(other)
226
- other.kind_of?(Duration) ? @duration / other.duration : Duration.new(@duration / other)
227
- end
228
-
229
- #
230
- # 時間間隔を日時分秒を表すArrayに変換する
231
- #
232
- # @param [Integer] n 最下位要素のインデクス(デフォルト When::SECOND)
233
- #
234
- # @return [Array] [ 日, 時, 分, 秒 ]
235
- #
236
- def to_dhms(n=When::SECOND)
237
- a = []
238
- m = @duration
239
- n.times do |i|
240
- d, m = m.divmod(DurationUnits[i])
241
- a << d
242
- end
243
- a << m / DurationUnits[n]
244
- a
245
- end
246
-
247
- #
248
- # 時間間隔の要素を取り出す
249
- #
250
- # @param [Integer] n 要素のインデクス
251
- #
252
- # @return [Numeric] (秒は Float, その他は Integer)
253
- #
254
- def [](n)
255
- to_dhms([n+1,When::SECOND].min)[n]
256
- end
257
-
258
- #
259
- # 指定時刻よりselfの時間間隔だけ後の時刻オブジェクト
260
- #
261
- # @param [::Time, When::TM::TemporalPosition] time 指定時刻
262
- #
263
- # @return [引数と同種の時刻オブジェクト]
264
- #
265
- def after(time=Time.now)
266
- time + self
267
- end
268
- alias :since :after
269
-
270
- #
271
- # 指定時刻よりselfの時間間隔だけ前の時刻オブジェクト
272
- #
273
- # @param [::Time, When::TM::TemporalPosition] time 指定時刻
274
- #
275
- # @return [引数と同種の時刻オブジェクト]
276
- #
277
- def before(time=Time.now)
278
- time - self
279
- end
280
- alias :ago :before
281
-
282
- # 文字列化
283
- #
284
- # @return [String]
285
- #
286
- def to_s
287
- to_dhms.to_s
288
- end
289
-
290
- #
291
- # When::TM::Duration への変換
292
- #
293
- # @note 必ずコピーを作る
294
- #
295
- # @return [When::TM::Duration]
296
- #
297
- def to_duration
298
- Duration.new(duration)
299
- end
300
-
301
- #
302
- # ActiveSupport::Duration への変換
303
- #
304
- # @return [ActiveSupport::Duration]
305
- #
306
- def to_as_duration
307
- [[:weeks, WEEK], [:days, DAY], [:hours, HOUR], [:minutes, MINUTE], [:seconds, SECOND]].each do |unit|
308
- div, mod = duration.divmod(unit[1])
309
- return div.send(unit[0]) if mod == 0
310
- end
311
- (duration / SECOND).seconds
312
- end
313
-
314
- # coerce
315
- # @private
316
- def coerce(other)
317
- [other, @duration]
318
- end
319
-
320
- #
321
- # Duration オブジェクトの初期化
322
- #
323
- # @param [Numeric] value Duration値 / 128秒
324
- #
325
- def initialize(value)
326
- @duration = value
327
- end
328
- end
329
- end
330
- end
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Minimum subset - A multicultural and multilingualized calendar library based on ISO 8601, ISO 19108 and RFC 5545
4
+
5
+ Copyright (C) 2013 Takashi SUGA
6
+
7
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
8
+
9
+ =end
10
+
11
+ module When
12
+
13
+ # 分解能定数
14
+
15
+ CENTURY = -4
16
+ DECADE = -3
17
+ YEAR = -2
18
+ MONTH = -1
19
+ WEEK = -0.5
20
+ DAY = 0
21
+ HOUR = 1
22
+ MINUTE = 2
23
+ SECOND = 3
24
+ STRING = 5
25
+ SYSTEM = (Float::MANT_DIG*0.3).to_i
26
+
27
+ #
28
+ # (5.2) Temporal Objects Package
29
+ #
30
+ #
31
+ module TM
32
+
33
+ # 時間次元における長さ又は距離を記述するために使うデータ型
34
+ #
35
+ # see {gml schema}[link:http://schemas.opengis.net/gml/3.1.1/base/temporal.xsd#duration]
36
+ #
37
+ class Duration
38
+
39
+ # 物理的な時間間隔の定数
40
+ #
41
+ # 時間の「秒」を Float で表現して丸め誤差が発生しない範囲で、
42
+ # もっとも大きな時間間隔(86400s を 2 の因数で割りつくした値)
43
+ # を単位 SYSTEM とする
44
+ #
45
+ SYSTEM = 1.0
46
+ DAY = SYSTEM * 675
47
+ YEAR = DAY * 365.2425
48
+ MONTH = YEAR / 12
49
+ WEEK = DAY * 7
50
+ HOUR = DAY / 24
51
+ MINUTE = HOUR / 60
52
+ SECOND = MINUTE / 60
53
+
54
+ UnitName = {YEAR=>'year', MONTH =>'month', WEEK =>'week', DAY =>'day',
55
+ HOUR=>'hour', MINUTE=>'minute', SECOND=>'second', SYSTEM=>'system'}
56
+ Unit = UnitName.invert
57
+ DurationUnits = [DAY, HOUR, MINUTE, SECOND]
58
+
59
+ #
60
+ # オブジェクト生成用クラスメソッド
61
+ #
62
+ class << self
63
+ #
64
+ # 日時分秒からのオブジェクト生成
65
+ #
66
+ # @param [Array<Numeric>] value ( 日, 時, 分, 秒 ) 下位の桁は省略可
67
+ #
68
+ # @return [When::TM::Duration]
69
+ #
70
+ def dhms(*value)
71
+ units = DurationUnits.dup
72
+ Duration.new(value.inject(0) {|s,v| s + v * units.shift})
73
+ end
74
+
75
+ #
76
+ # メソッド名に相当する単位で表した value に対応する When::TM::Duration を生成する
77
+ # @method unit
78
+ # @param [Numeric] value
79
+ # @return [When::TM::Duration]
80
+ # @note unit は second, minute, hour, day, week に読み替える
81
+
82
+ # @private
83
+ Unit.keys.each do |key|
84
+ module_eval %Q{
85
+ def #{key}(value)
86
+ new(value * Unit['#{key}'])
87
+ end
88
+ }
89
+ end
90
+ end
91
+
92
+ # 時間間隔の長さ (128秒単位)
93
+ #
94
+ # @return [Numeric]
95
+ #
96
+ attr_accessor :duration
97
+
98
+ #
99
+ # メソッド名に相当する単位で表した時間間隔の大きさ
100
+ # @method unit
101
+ # @return [Numeric]
102
+ # @note unit は second, minute, hour, day, week に読み替える
103
+
104
+ # @private
105
+ Unit.keys.each do |key|
106
+ module_eval %Q{
107
+ def #{key}
108
+ duration / Unit['#{key}']
109
+ end
110
+ }
111
+ end
112
+
113
+ # 時間間隔の長さ / 秒
114
+ #
115
+ # @return [Float]
116
+ #
117
+ def to_f
118
+ duration / SECOND
119
+ end
120
+ alias :to_float :to_f
121
+
122
+ # 時間間隔の長さ / 秒
123
+ #
124
+ # @return [Integer] (四捨五入値)
125
+ #
126
+ def to_i
127
+ to_f.round
128
+ end
129
+ alias :to_int :to_i
130
+
131
+ # 符号反転
132
+ #
133
+ # @return [When::TM::Duration]
134
+ #
135
+ def -@
136
+ Duration.new(-@duration)
137
+ end
138
+
139
+ # 絶対値
140
+ #
141
+ # @return [When::TM::Duration]
142
+ #
143
+ def abs
144
+ sign >= 0 ? self.dup : -self
145
+ end
146
+
147
+ # 符号
148
+ #
149
+ # @return [Integer] 0 との比較により、負,0,正の値を返す
150
+ #
151
+ def sign
152
+ @duration <=> 0
153
+ end
154
+
155
+ # 比較
156
+ #
157
+ # @param [Numeric, When::TM::Duration] other
158
+ #
159
+ # @return [Integer] other との比較により、負,0,正の値を返す
160
+ #
161
+ def <=>(other)
162
+ self.to_f <=> other.to_f
163
+ end
164
+
165
+ # オブジェクトの同値
166
+ #
167
+ # @param [Object] other
168
+ #
169
+ # @return [Boolean]
170
+ # [ true - 同値 ]
171
+ # [ false - 非同値 ]
172
+ #
173
+ def ==(other)
174
+ return false unless other.instance_of?(self.class)
175
+ return self.duration == other.duration
176
+ end
177
+
178
+ #
179
+ # 加算
180
+ #
181
+ # @param [Numeric, When::TM::Duration] other 秒数とみなす
182
+ # @param [その他] other 日時とみなす
183
+ #
184
+ # @return [When::TM::Duration] (other が Numeric, When::TM::Duration の場合)
185
+ # @return [other と同じクラス] (other がその他の場合)
186
+ #
187
+ def +(other)
188
+ case other
189
+ when Duration ; Duration.new(@duration + other.duration)
190
+ when Numeric ; Duration.new(@duration + other * SECOND)
191
+ else ; other + self
192
+ end
193
+ end
194
+
195
+ #
196
+ # 減算
197
+ #
198
+ # @param [Numeric, When::TM::Duration] other 秒数とみなす
199
+ #
200
+ # @return [When::TM::Duration]
201
+ #
202
+ def -(other)
203
+ Duration.new(@duration - (other.kind_of?(Duration) ? other.duration : other * SECOND))
204
+ end
205
+
206
+ #
207
+ # 乗算
208
+ #
209
+ # @param [Numeric] other
210
+ #
211
+ # @return [When::TM::Duration]
212
+ #
213
+ def *(other)
214
+ Duration.new(@duration * other)
215
+ end
216
+
217
+ #
218
+ # 除算
219
+ #
220
+ # @param [Numeric, When::TM::Duration] other 秒数とみなす
221
+ #
222
+ # @return [When::TM::Duration] (other が Numeric の場合)
223
+ # @return [Numeric] (other が When::TM::Duration の場合)
224
+ #
225
+ def /(other)
226
+ other.kind_of?(Duration) ? @duration / other.duration : Duration.new(@duration / other)
227
+ end
228
+
229
+ #
230
+ # 時間間隔を日時分秒を表すArrayに変換する
231
+ #
232
+ # @param [Integer] n 最下位要素のインデクス(デフォルト When::SECOND)
233
+ #
234
+ # @return [Array] [ 日, 時, 分, 秒 ]
235
+ #
236
+ def to_dhms(n=When::SECOND)
237
+ a = []
238
+ m = @duration
239
+ n.times do |i|
240
+ d, m = m.divmod(DurationUnits[i])
241
+ a << d
242
+ end
243
+ a << m / DurationUnits[n]
244
+ a
245
+ end
246
+
247
+ #
248
+ # 時間間隔の要素を取り出す
249
+ #
250
+ # @param [Integer] n 要素のインデクス
251
+ #
252
+ # @return [Numeric] (秒は Float, その他は Integer)
253
+ #
254
+ def [](n)
255
+ to_dhms([n+1,When::SECOND].min)[n]
256
+ end
257
+
258
+ #
259
+ # 指定時刻よりselfの時間間隔だけ後の時刻オブジェクト
260
+ #
261
+ # @param [::Time, When::TM::TemporalPosition] time 指定時刻
262
+ #
263
+ # @return [引数と同種の時刻オブジェクト]
264
+ #
265
+ def after(time=Time.now)
266
+ time + self
267
+ end
268
+ alias :since :after
269
+
270
+ #
271
+ # 指定時刻よりselfの時間間隔だけ前の時刻オブジェクト
272
+ #
273
+ # @param [::Time, When::TM::TemporalPosition] time 指定時刻
274
+ #
275
+ # @return [引数と同種の時刻オブジェクト]
276
+ #
277
+ def before(time=Time.now)
278
+ time - self
279
+ end
280
+ alias :ago :before
281
+
282
+ # 文字列化
283
+ #
284
+ # @return [String]
285
+ #
286
+ def to_s
287
+ to_dhms.to_s
288
+ end
289
+
290
+ #
291
+ # When::TM::Duration への変換
292
+ #
293
+ # @note 必ずコピーを作る
294
+ #
295
+ # @return [When::TM::Duration]
296
+ #
297
+ def to_duration
298
+ Duration.new(duration)
299
+ end
300
+
301
+ #
302
+ # ActiveSupport::Duration への変換
303
+ #
304
+ # @return [ActiveSupport::Duration]
305
+ #
306
+ def to_as_duration
307
+ [[:weeks, WEEK], [:days, DAY], [:hours, HOUR], [:minutes, MINUTE], [:seconds, SECOND]].each do |unit|
308
+ div, mod = duration.divmod(unit[1])
309
+ return div.send(unit[0]) if mod == 0
310
+ end
311
+ (duration / SECOND).seconds
312
+ end
313
+
314
+ # coerce
315
+ # @private
316
+ def coerce(other)
317
+ [other, @duration]
318
+ end
319
+
320
+ #
321
+ # Duration オブジェクトの初期化
322
+ #
323
+ # @param [Numeric] value Duration値 / 128秒
324
+ #
325
+ def initialize(value)
326
+ @duration = value
327
+ end
328
+ end
329
+ end
330
+ end