rubysl-date 1.0.1 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2a79e200c26dce696d67d54ceee32ca7ea7926e3
4
- data.tar.gz: d909437349a82b70bc3c1e98701636f19e4d1bd6
3
+ metadata.gz: ef338a6f69e34ebe197850c7e8f26b5a31b5e9df
4
+ data.tar.gz: f832b4ac193923f9ae808e3d59443a3098843aad
5
5
  SHA512:
6
- metadata.gz: 3ae6ba9b9a16f3b949ba2246b5157789e8ff18dc1e9d874f9908e668336ce3dae50c2564e42f463dd7bf08ef9192859bab848f775bd5a750cd0f31aa9abecf32
7
- data.tar.gz: ee53807380e45124a257b51fe61f257d1d93956b343acc65d0465dc4df7dbf3557ecf7b7f2030d567c915e1165c4a70457c85431c2f889d25f1806145fb6003e
6
+ metadata.gz: 69b4b3c1a906551fff012aa639c82ed7e8178f77fd389678e6cab6ca883796b576ab5e2e4f2ae8ba3dbf973a6338fd94128a83671c875bc6b1878a4f9b874b88
7
+ data.tar.gz: 90cb9b3a4ec7f461abd20fb40bccf45cb70040bbcbf4dc44d6abd0dfc07d578fb17a8dfa70b37c343f50ede0eb452673c28d0b02f3ab6a91c7181bb210c2c022
@@ -1,7 +1,9 @@
1
1
  language: ruby
2
+ before_install:
3
+ - rvm use $RVM --install --binary --fuzzy
4
+ - gem update --system
5
+ - gem --version
6
+ - gem install rubysl-bundler
2
7
  env:
3
- - RUBYLIB=lib
4
- script: bundle exec mspec
5
- rvm:
6
- - 1.8.7
7
- - rbx-nightly-18mode
8
+ - RVM=rbx-nightly-d21 RUBYLIB=lib
9
+ script: bundle exec mspec spec
@@ -0,0 +1,431 @@
1
+ # delta.rb: Written by Tadayoshi Funaba 2004-2009
2
+
3
+ require 'date'
4
+ require 'date/delta/parser'
5
+
6
+ class Date
7
+
8
+ class Delta
9
+
10
+ include Comparable
11
+
12
+ UNIT_PREFIXES = {
13
+ 'yotta' => Rational(10**24),
14
+ 'zetta' => Rational(10**21),
15
+ 'exa' => Rational(10**18),
16
+ 'peta' => Rational(10**15),
17
+ 'tera' => Rational(10**12),
18
+ 'giga' => Rational(10**9),
19
+ 'mega' => Rational(10**6),
20
+ 'kilo' => Rational(10**3),
21
+ 'hecto' => Rational(10**2),
22
+ 'deca' => Rational(10**1),
23
+ 'deka' => Rational(10**1),
24
+ 'deci' => Rational(1, 10**1),
25
+ 'centi' => Rational(1, 10**2),
26
+ 'milli' => Rational(1, 10**3),
27
+ 'decimilli' => Rational(1, 10**4),
28
+ 'centimilli' => Rational(1, 10**5),
29
+ 'micro' => Rational(1, 10**6),
30
+ 'nano' => Rational(1, 10**9),
31
+ 'millimicro' => Rational(1, 10**9),
32
+ 'pico' => Rational(1, 10**12),
33
+ 'micromicro' => Rational(1, 10**12),
34
+ 'femto' => Rational(1, 10**15),
35
+ 'atto' => Rational(1, 10**18),
36
+ 'zepto' => Rational(1, 10**21),
37
+ 'yocto' => Rational(1, 10**24)
38
+ }
39
+
40
+ IUNITS = {
41
+ 'year' => Complex(0, 12),
42
+ 'month' => Complex(0, 1)
43
+ }
44
+
45
+ RUNITS = {
46
+ 'day' => Rational(1),
47
+ 'week' => Rational(7),
48
+ 'sennight' => Rational(7),
49
+ 'fortnight' => Rational(14),
50
+ 'hour' => Rational(1, 24),
51
+ 'minute' => Rational(1, 1440),
52
+ 'second' => Rational(1, 86400)
53
+ }
54
+
55
+ UNIT_PREFIXES.each do |k, v|
56
+ RUNITS[k + 'second'] = v * RUNITS['second']
57
+ end
58
+
59
+ remove_const :UNIT_PREFIXES
60
+
61
+ UNITS = {}
62
+
63
+ IUNITS.each do |k, v|
64
+ UNITS[k] = v
65
+ end
66
+
67
+ RUNITS.each do |k, v|
68
+ UNITS[k] = v
69
+ end
70
+
71
+ UNITS4KEY = {}
72
+
73
+ UNITS.each do |k, v|
74
+ UNITS4KEY[k] = UNITS4KEY[k + 's'] = v
75
+ end
76
+
77
+ UNITS4KEY['y'] = UNITS4KEY['years']
78
+ UNITS4KEY['yr'] = UNITS4KEY['years']
79
+ UNITS4KEY['yrs'] = UNITS4KEY['years']
80
+ UNITS4KEY['m'] = UNITS4KEY['months']
81
+ UNITS4KEY['mo'] = UNITS4KEY['months']
82
+ UNITS4KEY['mon'] = UNITS4KEY['months']
83
+ UNITS4KEY['mnth'] = UNITS4KEY['months']
84
+ UNITS4KEY['mnths'] = UNITS4KEY['months']
85
+ UNITS4KEY['w'] = UNITS4KEY['weeks']
86
+ UNITS4KEY['wk'] = UNITS4KEY['weeks']
87
+ UNITS4KEY['d'] = UNITS4KEY['days']
88
+ UNITS4KEY['dy'] = UNITS4KEY['days']
89
+ UNITS4KEY['dys'] = UNITS4KEY['days']
90
+ UNITS4KEY['h'] = UNITS4KEY['hours']
91
+ UNITS4KEY['hr'] = UNITS4KEY['hours']
92
+ UNITS4KEY['hrs'] = UNITS4KEY['hours']
93
+ UNITS4KEY['min'] = UNITS4KEY['minutes']
94
+ UNITS4KEY['mins'] = UNITS4KEY['minutes']
95
+ UNITS4KEY['s'] = UNITS4KEY['seconds']
96
+ UNITS4KEY['sec'] = UNITS4KEY['seconds']
97
+ UNITS4KEY['secs'] = UNITS4KEY['seconds']
98
+ UNITS4KEY['ms'] = UNITS4KEY['milliseconds']
99
+ UNITS4KEY['msec'] = UNITS4KEY['milliseconds']
100
+ UNITS4KEY['msecs'] = UNITS4KEY['milliseconds']
101
+ UNITS4KEY['milli'] = UNITS4KEY['milliseconds']
102
+ UNITS4KEY['us'] = UNITS4KEY['microseconds']
103
+ UNITS4KEY['usec'] = UNITS4KEY['microseconds']
104
+ UNITS4KEY['usecs'] = UNITS4KEY['microseconds']
105
+ UNITS4KEY['micro'] = UNITS4KEY['microseconds']
106
+ UNITS4KEY['ns'] = UNITS4KEY['nanoseconds']
107
+ UNITS4KEY['nsec'] = UNITS4KEY['nanoseconds']
108
+ UNITS4KEY['nsecs'] = UNITS4KEY['nanoseconds']
109
+ UNITS4KEY['nano'] = UNITS4KEY['nanoseconds']
110
+
111
+ def self.delta_to_dhms(delta)
112
+ fr = delta.imag.abs
113
+ y, fr = fr.divmod(12)
114
+ m, fr = fr.divmod(1)
115
+
116
+ if delta.imag < 0
117
+ y = -y
118
+ m = -m
119
+ end
120
+
121
+ fr = delta.real.abs
122
+ ss, fr = fr.divmod(SECONDS_IN_DAY) # 4p
123
+ d, ss = ss.divmod(86400)
124
+ h, ss = ss.divmod(3600)
125
+ min, s = ss.divmod(60)
126
+
127
+ if delta.real < 0
128
+ d = -d
129
+ h = -h
130
+ min = -min
131
+ s = -s
132
+ end
133
+
134
+ return y, m, d, h, min, s, fr
135
+ end
136
+
137
+ def self.dhms_to_delta(y, m, d, h, min, s, fr)
138
+ fr = 0 if fr == 0
139
+ Complex(0, y.to_i * 12 + m.to_i) +
140
+ Rational(d * 86400 + h * 3600 + min * 60 + (s + fr), 86400) # 4p
141
+ end
142
+
143
+ def initialize(delta)
144
+ @delta = delta
145
+ @__ca__ = {}
146
+ end
147
+
148
+ class << self; alias_method :new!, :new end
149
+
150
+ def self.new(arg=0, h=0, min=0, s=0)
151
+ if Hash === arg
152
+ d = Complex(0)
153
+ arg.each do |k, v|
154
+ k = k.to_s.downcase
155
+ unless UNITS4KEY[k]
156
+ raise ArgumentError, "unknown keyword #{k}"
157
+ end
158
+ d += v * UNITS4KEY[k]
159
+ end
160
+ else
161
+ d = dhms_to_delta(0, 0, arg, h, min, s, 0)
162
+ end
163
+ new!(d)
164
+ end
165
+
166
+ UNITS.each_key do |k|
167
+ module_eval <<-"end;"
168
+ def self.#{k}s(n=1)
169
+ new(:d=>n * UNITS['#{k}'])
170
+ end
171
+ end;
172
+ end
173
+
174
+ class << self; alias_method :mins, :minutes end
175
+ class << self; alias_method :secs, :seconds end
176
+
177
+ def self.parse(str)
178
+ d = begin (@@pa ||= Parser.new).parse(str)
179
+ rescue Racc::ParseError
180
+ raise ArgumentError, 'syntax error'
181
+ end
182
+ new!(d)
183
+ end
184
+
185
+ def self.diff(d1, d2) new(d1.ajd - d2.ajd) end
186
+
187
+ class << self
188
+
189
+ def once(*ids) # :nodoc: -- restricted
190
+ for id in ids
191
+ module_eval <<-"end;"
192
+ alias_method :__#{id.object_id}__, :#{id.to_s}
193
+ private :__#{id.object_id}__
194
+ def #{id.to_s}(*args)
195
+ @__ca__[#{id.object_id}] ||= __#{id.object_id}__(*args)
196
+ end
197
+ end;
198
+ end
199
+ end
200
+
201
+ private :once
202
+
203
+ end
204
+
205
+ def dhms() self.class.delta_to_dhms(@delta) end
206
+
207
+ once :dhms
208
+
209
+ def delta() @delta end
210
+
211
+ protected :delta
212
+
213
+ def years() dhms[0] end
214
+ def months() dhms[1] end
215
+ def days() dhms[2] end
216
+ def hours() dhms[3] end
217
+ def minutes() dhms[4] end
218
+ def seconds() dhms[5] end
219
+ def second_fractions() dhms[6] end
220
+
221
+ alias_method :mins, :minutes
222
+ alias_method :secs, :seconds
223
+ alias_method :sec_fractions, :second_fractions
224
+
225
+ RUNITS.each_key do |k|
226
+ module_eval <<-"end;"
227
+ def in_#{k}s(u=1)
228
+ if @delta.imag != 0
229
+ raise ArgumentError, "#{k}: #{self} has month"
230
+ end
231
+ @delta.real / (u * RUNITS['#{k}'])
232
+ end
233
+ end;
234
+ end # <<dummy
235
+
236
+ alias_method :in_mins, :in_minutes
237
+ alias_method :in_secs, :in_seconds
238
+
239
+ def zero?() @delta.zero? end
240
+ def nonzero?() unless zero? then self end end
241
+
242
+ def integer? () @delta.imag == 0 && @delta.real.integer? end
243
+
244
+ def -@ () self.class.new!(-@delta) end
245
+ def +@ () self.class.new!(+@delta) end
246
+
247
+ def dx_addsub(m, n)
248
+ case n
249
+ when Numeric; return self.class.new!(@delta.__send__(m, n))
250
+ when Delta; return self.class.new!(@delta.__send__(m, n.delta))
251
+ else
252
+ l, r = n.coerce(self)
253
+ return l.__send__(m, r)
254
+ end
255
+ end
256
+
257
+ private :dx_addsub
258
+
259
+ def + (n) dx_addsub(:+, n) end
260
+ def - (n) dx_addsub(:-, n) end
261
+
262
+ def dx_muldiv(m, n)
263
+ case n
264
+ when Numeric
265
+ return self.class.new!(@delta.__send__(m, n))
266
+ else
267
+ l, r = n.coerce(self)
268
+ return l.__send__(m, r)
269
+ end
270
+ end
271
+
272
+ private :dx_muldiv
273
+
274
+ def * (n) dx_muldiv(:*, n) end
275
+ def / (n) dx_muldiv(:/, n) end
276
+
277
+ def dx_conv1(m, n)
278
+ if @delta.imag != 0
279
+ raise ArgumentError, "#{m}: #{self} has month"
280
+ end
281
+ case n
282
+ when Numeric
283
+ return self.class.new!(Complex(@delta.real.__send__(m, n), 0))
284
+ else
285
+ l, r = n.coerce(self)
286
+ return l.__send__(m, r)
287
+ end
288
+ end
289
+
290
+ private :dx_conv1
291
+
292
+ def % (n) dx_conv1(:%, n) end
293
+
294
+ def div(n) dx_conv1(:div, n) end
295
+ def modulo(n) dx_conv1(:modulo, n) end
296
+ def divmod(n) [div(n), modulo(n)] end
297
+
298
+ def quotient(n)
299
+ if @delta.imag != 0
300
+ raise ArgumentError, "quotient: #{self} has month"
301
+ end
302
+ case n
303
+ when Numeric
304
+ return self.class.new!(Complex((@delta.real / n).truncate))
305
+ else
306
+ l, r = n.coerce(self)
307
+ return l.__send__(m, r)
308
+ end
309
+ end
310
+
311
+ def remainder(n) dx_conv1(:remainder, n) end
312
+ def quotrem(n) [quotient(n), remainder(n)] end
313
+
314
+ def ** (n) dx_conv1(:**, n) end
315
+ def quo(n) dx_muldiv(:quo, n) end
316
+
317
+ def <=> (other)
318
+ if @delta.imag != 0
319
+ raise ArgumentError, "<=>: #{self} has month"
320
+ end
321
+ case other
322
+ when Numeric; return @delta.real <=> other
323
+ when Delta; return @delta.real <=> other.delta.real
324
+ else
325
+ begin
326
+ l, r = other.coerce(self)
327
+ return l <=> r
328
+ rescue NoMethodError
329
+ end
330
+ end
331
+ nil
332
+ end
333
+
334
+ def == (other)
335
+ case other
336
+ when Numeric; return @delta == other
337
+ when Delta; return @delta == other
338
+ else
339
+ begin
340
+ l, r = other.coerce(self)
341
+ return l == r
342
+ rescue NoMethodError
343
+ end
344
+ end
345
+ nil
346
+ end
347
+
348
+ def coerce(other)
349
+ case other
350
+ when Numeric; return other, @delta
351
+ else
352
+ super
353
+ end
354
+ end
355
+
356
+ def eql? (other) Delta === other && self == other end
357
+ def hash() @delta.hash end
358
+
359
+ def dx_conv0(m)
360
+ if @delta.imag != 0
361
+ raise ArgumentError, "#{m}: #{self} has month"
362
+ end
363
+ @delta.real.__send__(m)
364
+ end
365
+
366
+ private :dx_conv0
367
+
368
+ def abs() dx_conv0(:abs) end
369
+
370
+ def ceil() dx_conv0(:ceil) end
371
+ def floor() dx_conv0(:floor) end
372
+ def round() dx_conv0(:round) end
373
+ def truncate() dx_conv0(:truncate) end
374
+
375
+ def to_i() dx_conv0(:to_i) end
376
+ def to_f() dx_conv0(:to_f) end
377
+ def to_r() dx_conv0(:to_r) end
378
+ def to_c() @delta end
379
+
380
+ alias_method :to_int, :to_i
381
+
382
+ def inspect() format('#<%s: %s (%s)>', self.class, to_s, @delta) end
383
+
384
+ def to_s
385
+ format(%(%s(%dd %.02d:%02d'%02d"%03d)%s(%dy %dm)), # '
386
+ if @delta.real < 0 then '-' else '+' end,
387
+ days.abs, hours.abs, mins.abs, secs.abs, sec_fractions.abs * 1000,
388
+ if @delta.imag < 0 then '-' else '+' end,
389
+ years.abs, months.abs)
390
+ end
391
+
392
+ def marshal_dump() @delta end
393
+
394
+ def marshal_load(a)
395
+ @delta = a
396
+ @__ca__ = {}
397
+ end
398
+
399
+ end
400
+
401
+ end
402
+
403
+ vsave = $VERBOSE
404
+ $VERBOSE = false
405
+
406
+ class Date
407
+
408
+ def + (n)
409
+ case n
410
+ when Numeric; return self.class.new!(@ajd + n, @of, @sg)
411
+ when Delta
412
+ d = n.__send__(:delta)
413
+ return (self >> d.imag) + d.real
414
+ end
415
+ raise TypeError, 'expected numeric'
416
+ end
417
+
418
+ def - (x)
419
+ case x
420
+ when Numeric; return self.class.new!(@ajd - x, @of, @sg)
421
+ when Date; return @ajd - x.ajd
422
+ when Delta
423
+ d = x.__send__(:delta)
424
+ return (self << d.imag) - d.real
425
+ end
426
+ raise TypeError, 'expected numeric'
427
+ end
428
+
429
+ end
430
+
431
+ $VERBOSE = vsave