datet 0.0.7 → 0.0.8
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.
- data/VERSION +1 -1
- data/datet.gemspec +2 -2
- data/lib/datet.rb +165 -30
- data/spec/datet_spec.rb +118 -0
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.8
|
data/datet.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{datet}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.8"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kasper Johansen"]
|
12
|
-
s.date = %q{2012-07-
|
12
|
+
s.date = %q{2012-07-16}
|
13
13
|
s.description = %q{A framework for handeling date- and time-related stuff in Ruby.}
|
14
14
|
s.email = %q{k@spernj.org}
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/datet.rb
CHANGED
@@ -92,6 +92,29 @@ class Datet
|
|
92
92
|
return nil
|
93
93
|
end
|
94
94
|
|
95
|
+
#Handle nil-support.
|
96
|
+
all_nil = true
|
97
|
+
args.each do |arg|
|
98
|
+
if arg != 0 and arg
|
99
|
+
all_nil = false
|
100
|
+
break
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
if all_nil
|
105
|
+
@t_nil = true
|
106
|
+
@t_year = 0
|
107
|
+
@t_month = 0
|
108
|
+
@t_day = 0
|
109
|
+
@t_hour = 0
|
110
|
+
@t_min = 0
|
111
|
+
@t_sec = 0
|
112
|
+
@t_usec = 0
|
113
|
+
return nil
|
114
|
+
end
|
115
|
+
|
116
|
+
|
117
|
+
#Normal date-calculation support.
|
95
118
|
days_left = 0
|
96
119
|
months_left = 0
|
97
120
|
hours_left = 0
|
@@ -508,6 +531,17 @@ class Datet
|
|
508
531
|
return diw
|
509
532
|
end
|
510
533
|
|
534
|
+
#Returns the week-number of the year (1..53).
|
535
|
+
def week_no(args = nil)
|
536
|
+
week_no = (self.day_of_year.to_f / 7).to_i + 1
|
537
|
+
|
538
|
+
if args and args[:mfirst] and self.day_in_week == 1
|
539
|
+
week_no -= 1
|
540
|
+
end
|
541
|
+
|
542
|
+
return week_no
|
543
|
+
end
|
544
|
+
|
511
545
|
#Returns the days name as a string.
|
512
546
|
def day_name
|
513
547
|
return @@day_names[self.day_in_week]
|
@@ -553,6 +587,13 @@ class Datet
|
|
553
587
|
return @t_hour
|
554
588
|
end
|
555
589
|
|
590
|
+
#Returns the hour as an integer in the twelve-hour-clock.
|
591
|
+
def hour_thc
|
592
|
+
hour = @t_hour
|
593
|
+
hour -= 12 if hour > 12
|
594
|
+
return hour
|
595
|
+
end
|
596
|
+
|
556
597
|
#Returns the minute as an integer.
|
557
598
|
def min
|
558
599
|
return @t_min
|
@@ -568,6 +609,15 @@ class Datet
|
|
568
609
|
return @t_usec
|
569
610
|
end
|
570
611
|
|
612
|
+
#Returns "am" or "pm" based on the hours values.
|
613
|
+
def ampm
|
614
|
+
if @t_hour <= 12
|
615
|
+
return "am"
|
616
|
+
else
|
617
|
+
return "pm"
|
618
|
+
end
|
619
|
+
end
|
620
|
+
|
571
621
|
#Changes the year to the given year.
|
572
622
|
# datet = Datet.now #=> 2014-05-03 17:46:11 +0200
|
573
623
|
# datet.year = 2005
|
@@ -583,25 +633,20 @@ class Datet
|
|
583
633
|
end
|
584
634
|
|
585
635
|
#Returns the day in month as an integer.
|
586
|
-
def
|
636
|
+
def day
|
587
637
|
Thread.current[:datet_mode] = :days
|
588
638
|
return @t_day
|
589
639
|
end
|
590
640
|
|
591
|
-
#Changes the
|
641
|
+
#Changes the day to a given day.
|
592
642
|
#===Examples
|
593
643
|
# datet.time #=> 2005-05-03 17:46:11 +0200
|
594
|
-
# datet.
|
644
|
+
# datet.day = 8
|
595
645
|
# datet.time #=> 2005-05-08 17:46:11 +0200
|
596
|
-
def
|
646
|
+
def day=(newday)
|
597
647
|
newday = newday.to_i
|
598
|
-
|
599
|
-
|
600
|
-
self.add_days(newday - 1)
|
601
|
-
else
|
602
|
-
@t_day = newday
|
603
|
-
end
|
604
|
-
|
648
|
+
raise ArgumentError, "Invalid day: '#{newday}'." if newday < 0 or newday > self.days_in_month
|
649
|
+
@t_day = newday
|
605
650
|
return self
|
606
651
|
end
|
607
652
|
|
@@ -612,23 +657,8 @@ class Datet
|
|
612
657
|
# datet.time #=> 2012-05-09 05:36:08 +0200
|
613
658
|
def hour=(newhour)
|
614
659
|
newhour = newhour.to_i
|
615
|
-
|
616
|
-
|
617
|
-
loop do
|
618
|
-
break if newhour >= 0
|
619
|
-
day += -1
|
620
|
-
newhour += 24
|
621
|
-
end
|
622
|
-
|
623
|
-
loop do
|
624
|
-
break if newhour < 24
|
625
|
-
day += 1
|
626
|
-
newhour += -24
|
627
|
-
end
|
628
|
-
|
660
|
+
raise ArgumentError, "Invalid hour: '#{newhour}'." if newhour < 0 or newhour > 60
|
629
661
|
@t_hour = newhour
|
630
|
-
|
631
|
-
self.date = day if day != @t_day
|
632
662
|
return self
|
633
663
|
end
|
634
664
|
|
@@ -638,7 +668,9 @@ class Datet
|
|
638
668
|
# datet.min = 35
|
639
669
|
# datet.time #=> 2012-05-09 05:35:08 +0200
|
640
670
|
def min=(newmin)
|
641
|
-
|
671
|
+
newmin = newmin.to_i
|
672
|
+
raise ArgumentError, "Invalid minute: '#{newmin}'." if newmin < 0 or newmin > 60
|
673
|
+
@t_min = newmin
|
642
674
|
end
|
643
675
|
|
644
676
|
#Changes the second to a given new second.
|
@@ -647,10 +679,17 @@ class Datet
|
|
647
679
|
# datet.sec = 20
|
648
680
|
# datet.time #=> 2012-05-09 05:35:20 +0200
|
649
681
|
def sec=(newsec)
|
682
|
+
newsec = newsec.to_i
|
683
|
+
raise ArgumentError, "Invalid second: '#{newsec}'." if newsec < 0 or newsec > 60
|
650
684
|
@t_sec = newsec.to_i
|
651
685
|
end
|
652
686
|
|
653
|
-
|
687
|
+
#Changes the usecond of the object.
|
688
|
+
def usec=(newusec)
|
689
|
+
newusec = newusec.to_i
|
690
|
+
raise ArgumentError, "Invalid usecond: '#{newusec}'." if newusec < 0 or newusec > 1000000
|
691
|
+
@t_usec = newusec
|
692
|
+
end
|
654
693
|
|
655
694
|
#Changes the month to a given new month.
|
656
695
|
#===Examples
|
@@ -659,7 +698,7 @@ class Datet
|
|
659
698
|
# datet.time #=> 2012-07-09 05:35:20 +0200
|
660
699
|
def month=(newmonth)
|
661
700
|
newmonth = newmonth.to_i
|
662
|
-
raise ArgumentError, "Invalid month: '#{newmonth}'." if newmonth <= 0
|
701
|
+
raise ArgumentError, "Invalid month: '#{newmonth}'." if newmonth <= 0 or newmonth > 12
|
663
702
|
@t_month = newmonth
|
664
703
|
end
|
665
704
|
|
@@ -853,6 +892,12 @@ class Datet
|
|
853
892
|
return false
|
854
893
|
end
|
855
894
|
|
895
|
+
#Returns true if this date is a nullstamp (0000-00-00 or something like it).
|
896
|
+
def nullstamp?
|
897
|
+
return true if @t_nil
|
898
|
+
return false
|
899
|
+
end
|
900
|
+
|
856
901
|
#Returns the day of the year (0-365) as an integer.
|
857
902
|
#===Examples
|
858
903
|
# Datet.new.day_of_year #=> 123
|
@@ -1320,4 +1365,94 @@ class Datet
|
|
1320
1365
|
|
1321
1366
|
return date_str
|
1322
1367
|
end
|
1368
|
+
|
1369
|
+
#See the documentation for Time#strftime. It emulates that method.
|
1370
|
+
#This method is not complete yet and only contains some functionality.
|
1371
|
+
def strftime(str)
|
1372
|
+
replaces = {}
|
1373
|
+
res = "#{str}"
|
1374
|
+
|
1375
|
+
str.scan(/(%%|%(\^|)([A-z]))/) do |match|
|
1376
|
+
#The does the functionality of actually having a '%' in the string.
|
1377
|
+
if match[0] == "%%"
|
1378
|
+
replaces["%%"] = "%"
|
1379
|
+
next
|
1380
|
+
end
|
1381
|
+
|
1382
|
+
#Set up replace-hash for later replace.
|
1383
|
+
bigsign = match[1]
|
1384
|
+
letter = match[2]
|
1385
|
+
|
1386
|
+
le = "%#{bigsign}#{letter}"
|
1387
|
+
|
1388
|
+
#Skip if letter has already been set.
|
1389
|
+
next if replaces.key?(le)
|
1390
|
+
|
1391
|
+
case letter
|
1392
|
+
when "Y"
|
1393
|
+
replaces[le] = @t_year
|
1394
|
+
when "m"
|
1395
|
+
replaces[le] = "%02d" % @t_month
|
1396
|
+
when "d"
|
1397
|
+
replaces[le] = "%02d" % @t_day
|
1398
|
+
when "e"
|
1399
|
+
replaces[le] = @t_day
|
1400
|
+
when "H"
|
1401
|
+
replaces[le] = "%02d" % @t_hour
|
1402
|
+
when "k"
|
1403
|
+
replaces[le] = @t_hour
|
1404
|
+
when "l"
|
1405
|
+
replaces[le] = self.hour_thc
|
1406
|
+
when "I"
|
1407
|
+
replaces[le] = "%02d" % self.hour_thc
|
1408
|
+
when "M"
|
1409
|
+
replaces[le] = "%02d" % @t_min
|
1410
|
+
when "S"
|
1411
|
+
replaces[le] = "%02d" % @t_sec
|
1412
|
+
when "T"
|
1413
|
+
replaces[le] = "#{"%02d" % @t_hour}:#{"%02d" % @t_min}:#{"%02d" % @t_sec}"
|
1414
|
+
when "R"
|
1415
|
+
replaces[le] = "#{"%02d" % @t_hour}:#{"%02d" % @t_min}"
|
1416
|
+
when "r"
|
1417
|
+
replaces[le] = "#{"%02d" % self.hour_thc}:#{"%02d" % @t_min}:#{"%02d" % @t_sec} #{self.ampm.upcase}"
|
1418
|
+
when "B"
|
1419
|
+
replaces[le] = self.month_name
|
1420
|
+
when "b", "h"
|
1421
|
+
replaces[le] = self.month_name[0, 3]
|
1422
|
+
when "j"
|
1423
|
+
replaces[le] = self.day_of_year
|
1424
|
+
when "A"
|
1425
|
+
replaces[le] = self.day_name
|
1426
|
+
when "a"
|
1427
|
+
replaces[le] = self.day_name[0, 3]
|
1428
|
+
when "w"
|
1429
|
+
replaces[le] = self.day_in_week
|
1430
|
+
when "u"
|
1431
|
+
replaces[le] = self.day_in_week(:mfirst => true) + 1
|
1432
|
+
when "s"
|
1433
|
+
replaces[le] = self.to_i
|
1434
|
+
when "p"
|
1435
|
+
replaces[le] = self.ampm.upcase
|
1436
|
+
when "P"
|
1437
|
+
replaces[le] = self.ampm
|
1438
|
+
when "V"
|
1439
|
+
replaces[le] = self.week_no
|
1440
|
+
when "W"
|
1441
|
+
replaces[le] = self.week_no(:mfirst => true)
|
1442
|
+
end
|
1443
|
+
|
1444
|
+
#Replace should be uppercase.
|
1445
|
+
if bigsign == "^" and replaces.key?(le)
|
1446
|
+
replaces[le] = replaces[le].to_s.upcase
|
1447
|
+
end
|
1448
|
+
end
|
1449
|
+
|
1450
|
+
#Do the actual replaces.
|
1451
|
+
replaces.each do |key, val|
|
1452
|
+
res = res.gsub(key, val.to_s)
|
1453
|
+
end
|
1454
|
+
|
1455
|
+
#Return the replaced string.
|
1456
|
+
return res
|
1457
|
+
end
|
1323
1458
|
end
|
data/spec/datet_spec.rb
CHANGED
@@ -337,4 +337,122 @@ describe "Datet" do
|
|
337
337
|
datet.find(:incr => :month, :wday => 5)
|
338
338
|
raise "Expected dbstr to be '1970-05-08' but it wasnt: '#{datet.dbstr(:time => false)}'." if datet.dbstr(:time => false) != "1970-05-08"
|
339
339
|
end
|
340
|
+
|
341
|
+
it "should be able to calculate week numbers" do
|
342
|
+
tests = [
|
343
|
+
[Datet.new(1985, 1, 1), 1],
|
344
|
+
[Datet.new(1985, 12, 31), 53]
|
345
|
+
]
|
346
|
+
tests.each do |data|
|
347
|
+
res = data[0].week_no
|
348
|
+
raise "Expected '#{data[1]}' but got '#{res}'." if res != data[1]
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
352
|
+
it "should emulate strftime" do
|
353
|
+
datet = Datet.new(1985, 6, 17, 10, 30, 25)
|
354
|
+
|
355
|
+
tests = {
|
356
|
+
"%Y" => 1985,
|
357
|
+
"%m" => "06",
|
358
|
+
"%d" => "17",
|
359
|
+
"%e" => 17,
|
360
|
+
"%H" => 10,
|
361
|
+
"%l" => 10,
|
362
|
+
"%I" => 10,
|
363
|
+
"%k" => 10,
|
364
|
+
"%M" => 30,
|
365
|
+
"%S" => 25,
|
366
|
+
"%T" => "10:30:25",
|
367
|
+
"%R" => "10:30",
|
368
|
+
"%r" => "10:30:25 AM",
|
369
|
+
"%p" => "am",
|
370
|
+
"%P" => "AM",
|
371
|
+
"%B" => "June",
|
372
|
+
"%^B" => "JUNE",
|
373
|
+
"%b" => "Jun",
|
374
|
+
"%h" => "Jun",
|
375
|
+
"%^b" => "JUN",
|
376
|
+
"%j" => 168,
|
377
|
+
"%A" => "Monday",
|
378
|
+
"%^A" => "MONDAY",
|
379
|
+
"%a" => "Mon",
|
380
|
+
"%^a" => "MON",
|
381
|
+
"%w" => 1,
|
382
|
+
"%s" => datet.to_i,
|
383
|
+
"%P" => "am",
|
384
|
+
"%p" => "AM",
|
385
|
+
"%V" => 25,
|
386
|
+
"%W" => 24,
|
387
|
+
"%%Y" => "%Y",
|
388
|
+
"%%%%%Y" => "%%1985",
|
389
|
+
"%%%%%%%%%Y" => "%%%%1985"
|
390
|
+
}
|
391
|
+
|
392
|
+
tests.each do |key, val|
|
393
|
+
res = datet.strftime(key)
|
394
|
+
raise "Expected '#{val}' but got: '#{res}' for '#{key}'." if val.to_s != res
|
395
|
+
|
396
|
+
res2 = datet.time.strftime(key)
|
397
|
+
raise "Expected res to be the same as time res but it wasnt: '#{res}', '#{res2}' for '#{key}'." if res != res2
|
398
|
+
end
|
399
|
+
end
|
400
|
+
|
401
|
+
it "should handle nil-dates gently" do
|
402
|
+
datet = Datet.new(0, 0, 0)
|
403
|
+
|
404
|
+
tests = [
|
405
|
+
[:dbstr, "0000-00-00 00:00:00"]
|
406
|
+
]
|
407
|
+
tests.each do |data|
|
408
|
+
res = datet.__send__(data[0])
|
409
|
+
raise "Expected '#{data[1]}' but got '#{res}'." if res != data[1]
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
413
|
+
it "should not be possible to set invalid months and dates" do
|
414
|
+
datet = Datet.new
|
415
|
+
|
416
|
+
begin
|
417
|
+
datet.month = 14
|
418
|
+
raise "Should have raised error."
|
419
|
+
rescue ArgumentError
|
420
|
+
#ignore
|
421
|
+
end
|
422
|
+
|
423
|
+
begin
|
424
|
+
datet.usec = 1000005
|
425
|
+
raise "Should have raised error."
|
426
|
+
rescue ArgumentError
|
427
|
+
#ignore.
|
428
|
+
end
|
429
|
+
|
430
|
+
begin
|
431
|
+
datet.sec = 61
|
432
|
+
raise "Should have raised error."
|
433
|
+
rescue ArgumentError
|
434
|
+
#ignore
|
435
|
+
end
|
436
|
+
|
437
|
+
begin
|
438
|
+
datet.min = 70
|
439
|
+
raise "Should have raised error."
|
440
|
+
rescue ArgumentError
|
441
|
+
#ignore.
|
442
|
+
end
|
443
|
+
|
444
|
+
begin
|
445
|
+
datet.hour = 90
|
446
|
+
raise "Should have raised error."
|
447
|
+
rescue ArgumentError
|
448
|
+
#ignore.
|
449
|
+
end
|
450
|
+
|
451
|
+
begin
|
452
|
+
datet.day = 45
|
453
|
+
raise "Should have raised error."
|
454
|
+
rescue ArgumentError
|
455
|
+
#ignore.
|
456
|
+
end
|
457
|
+
end
|
340
458
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: datet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.8
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Kasper Johansen
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-07-
|
13
|
+
date: 2012-07-16 00:00:00 +02:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -93,7 +93,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
93
93
|
requirements:
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
hash:
|
96
|
+
hash: -2767607844783670018
|
97
97
|
segments:
|
98
98
|
- 0
|
99
99
|
version: "0"
|