rizwanreza-chronic 0.0.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 (54) hide show
  1. data/README.rdoc +188 -0
  2. data/lib/chronic.rb +57 -0
  3. data/lib/chronic/blunt.rb +234 -0
  4. data/lib/chronic/chronic.rb +326 -0
  5. data/lib/chronic/grabber.rb +26 -0
  6. data/lib/chronic/handlers.rb +549 -0
  7. data/lib/chronic/ordinal.rb +39 -0
  8. data/lib/chronic/pointer.rb +29 -0
  9. data/lib/chronic/repeater.rb +139 -0
  10. data/lib/chronic/repeaters/repeater_day.rb +52 -0
  11. data/lib/chronic/repeaters/repeater_day_name.rb +53 -0
  12. data/lib/chronic/repeaters/repeater_day_portion.rb +94 -0
  13. data/lib/chronic/repeaters/repeater_decade.rb +23 -0
  14. data/lib/chronic/repeaters/repeater_fortnight.rb +70 -0
  15. data/lib/chronic/repeaters/repeater_hour.rb +58 -0
  16. data/lib/chronic/repeaters/repeater_minute.rb +57 -0
  17. data/lib/chronic/repeaters/repeater_month.rb +66 -0
  18. data/lib/chronic/repeaters/repeater_month_name.rb +98 -0
  19. data/lib/chronic/repeaters/repeater_season.rb +150 -0
  20. data/lib/chronic/repeaters/repeater_season_name.rb +45 -0
  21. data/lib/chronic/repeaters/repeater_second.rb +41 -0
  22. data/lib/chronic/repeaters/repeater_time.rb +124 -0
  23. data/lib/chronic/repeaters/repeater_week.rb +73 -0
  24. data/lib/chronic/repeaters/repeater_weekday.rb +77 -0
  25. data/lib/chronic/repeaters/repeater_weekend.rb +65 -0
  26. data/lib/chronic/repeaters/repeater_year.rb +64 -0
  27. data/lib/chronic/scalar.rb +76 -0
  28. data/lib/chronic/separator.rb +91 -0
  29. data/lib/chronic/time_zone.rb +26 -0
  30. data/lib/core_ext/object.rb +7 -0
  31. data/lib/core_ext/time.rb +74 -0
  32. data/lib/numerizer/numerizer.rb +98 -0
  33. data/test/test_Chronic.rb +75 -0
  34. data/test/test_DaylightSavings.rb +119 -0
  35. data/test/test_Handler.rb +110 -0
  36. data/test/test_Numerizer.rb +54 -0
  37. data/test/test_RepeaterDayName.rb +52 -0
  38. data/test/test_RepeaterDecade.rb +46 -0
  39. data/test/test_RepeaterFortnight.rb +63 -0
  40. data/test/test_RepeaterHour.rb +68 -0
  41. data/test/test_RepeaterMinute.rb +35 -0
  42. data/test/test_RepeaterMonth.rb +47 -0
  43. data/test/test_RepeaterMonthName.rb +57 -0
  44. data/test/test_RepeaterSeason.rb +43 -0
  45. data/test/test_RepeaterTime.rb +72 -0
  46. data/test/test_RepeaterWeek.rb +63 -0
  47. data/test/test_RepeaterWeekday.rb +56 -0
  48. data/test/test_RepeaterWeekend.rb +75 -0
  49. data/test/test_RepeaterYear.rb +63 -0
  50. data/test/test_Span.rb +33 -0
  51. data/test/test_Time.rb +50 -0
  52. data/test/test_Token.rb +26 -0
  53. data/test/test_parsing.rb +809 -0
  54. metadata +118 -0
@@ -0,0 +1,119 @@
1
+ require 'chronic'
2
+ require 'test/unit'
3
+
4
+ class TestDaylightSavings < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @begin_daylight_savings = Time.local(2008, 3, 9, 5, 0, 0, 0)
8
+ @end_daylight_savings = Time.local(2008, 11, 2, 5, 0, 0, 0)
9
+ end
10
+
11
+ def test_begin_past
12
+ # ambiguous - resolve to last night
13
+ t = Chronic::RepeaterTime.new('900')
14
+ t.start = @begin_daylight_savings
15
+ assert_equal Time.local(2008, 3, 8, 21), t.next(:past).begin
16
+
17
+ # ambiguous - resolve to this afternoon
18
+ t = Chronic::RepeaterTime.new('900')
19
+ t.start = Time.local(2008, 3, 9, 22, 0, 0, 0)
20
+ assert_equal Time.local(2008, 3, 9, 21), t.next(:past).begin
21
+
22
+ # ambiguous - resolve to this morning
23
+ t = Chronic::RepeaterTime.new('400')
24
+ t.start = @begin_daylight_savings
25
+ assert_equal Time.local(2008, 3, 9, 4), t.next(:past).begin
26
+
27
+ # unambiguous - resolve to today
28
+ t = Chronic::RepeaterTime.new('0400')
29
+ t.start = @begin_daylight_savings
30
+ assert_equal Time.local(2008, 3, 9, 4), t.next(:past).begin
31
+
32
+ # unambiguous - resolve to yesterday
33
+ t = Chronic::RepeaterTime.new('1300')
34
+ t.start = @begin_daylight_savings
35
+ assert_equal Time.local(2008, 3, 8, 13), t.next(:past).begin
36
+ end
37
+
38
+ def test_begin_future
39
+ # ambiguous - resolve to this morning
40
+ t = Chronic::RepeaterTime.new('900')
41
+ t.start = @begin_daylight_savings
42
+ assert_equal Time.local(2008, 3, 9, 9), t.next(:future).begin
43
+
44
+ # ambiguous - resolve to this afternoon
45
+ t = Chronic::RepeaterTime.new('900')
46
+ t.start = Time.local(2008, 3, 9, 13, 0, 0, 0)
47
+ assert_equal Time.local(2008, 3, 9, 21), t.next(:future).begin
48
+
49
+ # ambiguous - resolve to tomorrow
50
+ t = Chronic::RepeaterTime.new('900')
51
+ t.start = Time.local(2008, 3, 9, 22, 0, 0, 0)
52
+ assert_equal Time.local(2008, 3, 10, 9), t.next(:future).begin
53
+
54
+ # unambiguous - resolve to today
55
+ t = Chronic::RepeaterTime.new('0900')
56
+ t.start = @begin_daylight_savings
57
+ assert_equal Time.local(2008, 3, 9, 9), t.next(:future).begin
58
+
59
+ # unambiguous - resolve to tomorrow
60
+ t = Chronic::RepeaterTime.new('0400')
61
+ t.start = @begin_daylight_savings
62
+ assert_equal Time.local(2008, 3, 10, 4), t.next(:future).begin
63
+ end
64
+
65
+ def test_end_past
66
+ # ambiguous - resolve to last night
67
+ t = Chronic::RepeaterTime.new('900')
68
+ t.start = @end_daylight_savings
69
+ assert_equal Time.local(2008, 11, 1, 21), t.next(:past).begin
70
+
71
+ # ambiguous - resolve to this afternoon
72
+ t = Chronic::RepeaterTime.new('900')
73
+ t.start = Time.local(2008, 11, 2, 22, 0, 0, 0)
74
+ assert_equal Time.local(2008, 11, 2, 21), t.next(:past).begin
75
+
76
+ # ambiguous - resolve to this morning
77
+ t = Chronic::RepeaterTime.new('400')
78
+ t.start = @end_daylight_savings
79
+ assert_equal Time.local(2008, 11, 2, 4), t.next(:past).begin
80
+
81
+ # unambiguous - resolve to today
82
+ t = Chronic::RepeaterTime.new('0400')
83
+ t.start = @end_daylight_savings
84
+ assert_equal Time.local(2008, 11, 2, 4), t.next(:past).begin
85
+
86
+ # unambiguous - resolve to yesterday
87
+ t = Chronic::RepeaterTime.new('1300')
88
+ t.start = @end_daylight_savings
89
+ assert_equal Time.local(2008, 11, 1, 13), t.next(:past).begin
90
+ end
91
+
92
+ def test_end_future
93
+ # ambiguous - resolve to this morning
94
+ t = Chronic::RepeaterTime.new('900')
95
+ t.start = @end_daylight_savings
96
+ assert_equal Time.local(2008, 11, 2, 9), t.next(:future).begin
97
+
98
+ # ambiguous - resolve to this afternoon
99
+ t = Chronic::RepeaterTime.new('900')
100
+ t.start = Time.local(2008, 11, 2, 13, 0, 0, 0)
101
+ assert_equal Time.local(2008, 11, 2, 21), t.next(:future).begin
102
+
103
+ # ambiguous - resolve to tomorrow
104
+ t = Chronic::RepeaterTime.new('900')
105
+ t.start = Time.local(2008, 11, 2, 22, 0, 0, 0)
106
+ assert_equal Time.local(2008, 11, 3, 9), t.next(:future).begin
107
+
108
+ # unambiguous - resolve to today
109
+ t = Chronic::RepeaterTime.new('0900')
110
+ t.start = @end_daylight_savings
111
+ assert_equal Time.local(2008, 11, 2, 9), t.next(:future).begin
112
+
113
+ # unambiguous - resolve to tomorrow
114
+ t = Chronic::RepeaterTime.new('0400')
115
+ t.start = @end_daylight_savings
116
+ assert_equal Time.local(2008, 11, 3, 4), t.next(:future).begin
117
+ end
118
+
119
+ end
@@ -0,0 +1,110 @@
1
+ require 'chronic'
2
+ require 'test/unit'
3
+
4
+ class TestHandler < Test::Unit::TestCase
5
+
6
+ def setup
7
+ # Wed Aug 16 14:00:00 UTC 2006
8
+ @now = Time.local(2006, 8, 16, 14, 0, 0, 0)
9
+ end
10
+
11
+ def test_handler_class_1
12
+ handler = Chronic::Handler.new([:repeater], :handler)
13
+
14
+ tokens = [Chronic::Token.new('friday')]
15
+ tokens[0].tag(Chronic::RepeaterDayName.new(:friday))
16
+
17
+ assert handler.match(tokens, Chronic.definitions)
18
+
19
+ tokens << Chronic::Token.new('afternoon')
20
+ tokens[1].tag(Chronic::RepeaterDayPortion.new(:afternoon))
21
+
22
+ assert !handler.match(tokens, Chronic.definitions)
23
+ end
24
+
25
+ def test_handler_class_2
26
+ handler = Chronic::Handler.new([:repeater, :repeater?], :handler)
27
+
28
+ tokens = [Chronic::Token.new('friday')]
29
+ tokens[0].tag(Chronic::RepeaterDayName.new(:friday))
30
+
31
+ assert handler.match(tokens, Chronic.definitions)
32
+
33
+ tokens << Chronic::Token.new('afternoon')
34
+ tokens[1].tag(Chronic::RepeaterDayPortion.new(:afternoon))
35
+
36
+ assert handler.match(tokens, Chronic.definitions)
37
+
38
+ tokens << Chronic::Token.new('afternoon')
39
+ tokens[2].tag(Chronic::RepeaterDayPortion.new(:afternoon))
40
+
41
+ assert !handler.match(tokens, Chronic.definitions)
42
+ end
43
+
44
+ def test_handler_class_3
45
+ handler = Chronic::Handler.new([:repeater, 'time?'], :handler)
46
+
47
+ tokens = [Chronic::Token.new('friday')]
48
+ tokens[0].tag(Chronic::RepeaterDayName.new(:friday))
49
+
50
+ assert handler.match(tokens, Chronic.definitions)
51
+
52
+ tokens << Chronic::Token.new('afternoon')
53
+ tokens[1].tag(Chronic::RepeaterDayPortion.new(:afternoon))
54
+
55
+ assert !handler.match(tokens, Chronic.definitions)
56
+ end
57
+
58
+ def test_handler_class_4
59
+ handler = Chronic::Handler.new([:repeater_month_name, :scalar_day, 'time?'], :handler)
60
+
61
+ tokens = [Chronic::Token.new('may')]
62
+ tokens[0].tag(Chronic::RepeaterMonthName.new(:may))
63
+
64
+ assert !handler.match(tokens, Chronic.definitions)
65
+
66
+ tokens << Chronic::Token.new('27')
67
+ tokens[1].tag(Chronic::ScalarDay.new(27))
68
+
69
+ assert handler.match(tokens, Chronic.definitions)
70
+ end
71
+
72
+ def test_handler_class_5
73
+ handler = Chronic::Handler.new([:repeater, 'time?'], :handler)
74
+
75
+ tokens = [Chronic::Token.new('friday')]
76
+ tokens[0].tag(Chronic::RepeaterDayName.new(:friday))
77
+
78
+ assert handler.match(tokens, Chronic.definitions)
79
+
80
+ tokens << Chronic::Token.new('5:00')
81
+ tokens[1].tag(Chronic::RepeaterTime.new('5:00'))
82
+
83
+ assert handler.match(tokens, Chronic.definitions)
84
+
85
+ tokens << Chronic::Token.new('pm')
86
+ tokens[2].tag(Chronic::RepeaterDayPortion.new(:pm))
87
+
88
+ assert handler.match(tokens, Chronic.definitions)
89
+ end
90
+
91
+ def test_handler_class_6
92
+ handler = Chronic::Handler.new([:scalar, :repeater, :pointer], :handler)
93
+
94
+ tokens = [Chronic::Token.new('3'),
95
+ Chronic::Token.new('years'),
96
+ Chronic::Token.new('past')]
97
+
98
+ tokens[0].tag(Chronic::Scalar.new(3))
99
+ tokens[1].tag(Chronic::RepeaterYear.new(:year))
100
+ tokens[2].tag(Chronic::Pointer.new(:past))
101
+
102
+ assert handler.match(tokens, Chronic.definitions)
103
+ end
104
+
105
+ def test_constantize
106
+ handler = Chronic::Handler.new([], :handler)
107
+ assert_equal Chronic::RepeaterTime, handler.constantize(:repeater_time)
108
+ end
109
+
110
+ end
@@ -0,0 +1,54 @@
1
+ require 'test/unit'
2
+ require 'chronic'
3
+
4
+ class ParseNumbersTest < Test::Unit::TestCase
5
+
6
+ def test_straight_parsing
7
+ strings = { 1 => 'one',
8
+ 5 => 'five',
9
+ 10 => 'ten',
10
+ 11 => 'eleven',
11
+ 12 => 'twelve',
12
+ 13 => 'thirteen',
13
+ 14 => 'fourteen',
14
+ 15 => 'fifteen',
15
+ 16 => 'sixteen',
16
+ 17 => 'seventeen',
17
+ 18 => 'eighteen',
18
+ 19 => 'nineteen',
19
+ 20 => 'twenty',
20
+ 27 => 'twenty seven',
21
+ 31 => 'thirty-one',
22
+ 41 => 'forty one',
23
+ 42 => 'fourty two',
24
+ 59 => 'fifty nine',
25
+ 100 => 'a hundred',
26
+ 100 => 'one hundred',
27
+ 150 => 'one hundred and fifty',
28
+ # 150 => 'one fifty',
29
+ 200 => 'two-hundred',
30
+ 500 => '5 hundred',
31
+ 999 => 'nine hundred and ninety nine',
32
+ 1_000 => 'one thousand',
33
+ 1_200 => 'twelve hundred',
34
+ 1_200 => 'one thousand two hundred',
35
+ 17_000 => 'seventeen thousand',
36
+ 21_473 => 'twentyone-thousand-four-hundred-and-seventy-three',
37
+ 74_002 => 'seventy four thousand and two',
38
+ 99_999 => 'ninety nine thousand nine hundred ninety nine',
39
+ 100_000 => '100 thousand',
40
+ 250_000 => 'two hundred fifty thousand',
41
+ 1_000_000 => 'one million',
42
+ 1_250_007 => 'one million two hundred fifty thousand and seven',
43
+ 1_000_000_000 => 'one billion',
44
+ 1_000_000_001 => 'one billion and one' }
45
+
46
+ strings.keys.sort.each do |key|
47
+ assert_equal key, Numerizer.numerize(strings[key]).to_i
48
+ end
49
+ end
50
+
51
+ def test_edges
52
+ assert_equal "27 Oct 2006 7:30am", Numerizer.numerize("27 Oct 2006 7:30am")
53
+ end
54
+ end
@@ -0,0 +1,52 @@
1
+ require 'chronic'
2
+ require 'test/unit'
3
+
4
+ class TestRepeaterDayName < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @now = Time.local(2006, 8, 16, 14, 0, 0, 0)
8
+ end
9
+
10
+ def test_match
11
+ token = Chronic::Token.new('saturday')
12
+ repeater = Chronic::Repeater.scan_for_day_names(token)
13
+ assert_equal Chronic::RepeaterDayName, repeater.class
14
+ assert_equal :saturday, repeater.type
15
+
16
+ token = Chronic::Token.new('sunday')
17
+ repeater = Chronic::Repeater.scan_for_day_names(token)
18
+ assert_equal Chronic::RepeaterDayName, repeater.class
19
+ assert_equal :sunday, repeater.type
20
+ end
21
+
22
+ def test_next_future
23
+ mondays = Chronic::RepeaterDayName.new(:monday)
24
+ mondays.start = @now
25
+
26
+ span = mondays.next(:future)
27
+
28
+ assert_equal Time.local(2006, 8, 21), span.begin
29
+ assert_equal Time.local(2006, 8, 22), span.end
30
+
31
+ span = mondays.next(:future)
32
+
33
+ assert_equal Time.local(2006, 8, 28), span.begin
34
+ assert_equal Time.local(2006, 8, 29), span.end
35
+ end
36
+
37
+ def test_next_past
38
+ mondays = Chronic::RepeaterDayName.new(:monday)
39
+ mondays.start = @now
40
+
41
+ span = mondays.next(:past)
42
+
43
+ assert_equal Time.local(2006, 8, 14), span.begin
44
+ assert_equal Time.local(2006, 8, 15), span.end
45
+
46
+ span = mondays.next(:past)
47
+
48
+ assert_equal Time.local(2006, 8, 7), span.begin
49
+ assert_equal Time.local(2006, 8, 8), span.end
50
+ end
51
+
52
+ end
@@ -0,0 +1,46 @@
1
+ require 'chronic'
2
+ require 'test/unit'
3
+
4
+ class TestRepeaterDecade < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @now = Time.local(2006, 8, 16, 14, 0, 0, 0)
8
+ end
9
+
10
+ def test_discard_nonsense
11
+ p = Chronic::RepeaterDecade::DECADE_PATTERN
12
+ assert_no_match p, "1930"
13
+ assert_no_match p, "1941s"
14
+ assert_no_match p, "1829s"
15
+ end
16
+
17
+ def test_start_dates
18
+ assert_decade_begins "1980s", 1980
19
+ assert_decade_begins "20s", 1920
20
+ assert_decade_begins "30's", 1930
21
+ assert_decade_begins "2010's", 2010
22
+ assert_decade_begins "'70s", 1970
23
+ end
24
+
25
+ def test_end_dates
26
+ assert_decade_ends "1980s", 1990
27
+ assert_decade_ends "20s", 1930
28
+ assert_decade_ends "30's", 1940
29
+ assert_decade_ends "2010's", 2020
30
+ assert_decade_ends "'70s", 1980
31
+ end
32
+
33
+ private
34
+
35
+ def assert_decade_begins(decade_str, year)
36
+ d = Chronic::RepeaterDecade.new(decade_str)
37
+ d.start = @now
38
+ assert_equal Time.local(year, 1, 1), d.this.begin
39
+ end
40
+
41
+ def assert_decade_ends(decade_str, year)
42
+ d = Chronic::RepeaterDecade.new(decade_str)
43
+ d.start = @now
44
+ assert_equal Time.local(year, 1, 1), d.this.end
45
+ end
46
+ end
@@ -0,0 +1,63 @@
1
+ require 'chronic'
2
+ require 'test/unit'
3
+
4
+ class TestRepeaterFortnight < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @now = Time.local(2006, 8, 16, 14, 0, 0, 0)
8
+ end
9
+
10
+ def test_next_future
11
+ fortnights = Chronic::RepeaterFortnight.new(:fortnight)
12
+ fortnights.start = @now
13
+
14
+ next_fortnight = fortnights.next(:future)
15
+ assert_equal Time.local(2006, 8, 20), next_fortnight.begin
16
+ assert_equal Time.local(2006, 9, 3), next_fortnight.end
17
+
18
+ next_next_fortnight = fortnights.next(:future)
19
+ assert_equal Time.local(2006, 9, 3), next_next_fortnight.begin
20
+ assert_equal Time.local(2006, 9, 17), next_next_fortnight.end
21
+ end
22
+
23
+ def test_next_past
24
+ fortnights = Chronic::RepeaterFortnight.new(:fortnight)
25
+ fortnights.start = @now
26
+
27
+ last_fortnight = fortnights.next(:past)
28
+ assert_equal Time.local(2006, 7, 30), last_fortnight.begin
29
+ assert_equal Time.local(2006, 8, 13), last_fortnight.end
30
+
31
+ last_last_fortnight = fortnights.next(:past)
32
+ assert_equal Time.local(2006, 7, 16), last_last_fortnight.begin
33
+ assert_equal Time.local(2006, 7, 30), last_last_fortnight.end
34
+ end
35
+
36
+ def test_this_future
37
+ fortnights = Chronic::RepeaterFortnight.new(:fortnight)
38
+ fortnights.start = @now
39
+
40
+ this_fortnight = fortnights.this(:future)
41
+ assert_equal Time.local(2006, 8, 16, 15), this_fortnight.begin
42
+ assert_equal Time.local(2006, 8, 27), this_fortnight.end
43
+ end
44
+
45
+ def test_this_past
46
+ fortnights = Chronic::RepeaterFortnight.new(:fortnight)
47
+ fortnights.start = @now
48
+
49
+ this_fortnight = fortnights.this(:past)
50
+ assert_equal Time.local(2006, 8, 13, 0), this_fortnight.begin
51
+ assert_equal Time.local(2006, 8, 16, 14), this_fortnight.end
52
+ end
53
+
54
+ def test_offset
55
+ span = Chronic::Span.new(@now, @now + 1)
56
+
57
+ offset_span = Chronic::RepeaterFortnight.new(:week).offset(span, 3, :future)
58
+
59
+ assert_equal Time.local(2006, 9, 27, 14), offset_span.begin
60
+ assert_equal Time.local(2006, 9, 27, 14, 0, 1), offset_span.end
61
+ end
62
+
63
+ end