chronic-davispuh 0.10.2.v0.1da32066b3f46f2506b3471e39557497e34afa27
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/.travis.yml +10 -0
- data/Gemfile +3 -0
- data/HISTORY.md +243 -0
- data/LICENSE +21 -0
- data/README.md +185 -0
- data/Rakefile +68 -0
- data/chronic.gemspec +27 -0
- data/lib/chronic.rb +122 -0
- data/lib/chronic/arrow.rb +270 -0
- data/lib/chronic/date.rb +272 -0
- data/lib/chronic/definition.rb +208 -0
- data/lib/chronic/dictionary.rb +36 -0
- data/lib/chronic/handler.rb +44 -0
- data/lib/chronic/handlers/anchor.rb +65 -0
- data/lib/chronic/handlers/arrow.rb +84 -0
- data/lib/chronic/handlers/date.rb +270 -0
- data/lib/chronic/handlers/date_time.rb +72 -0
- data/lib/chronic/handlers/general.rb +130 -0
- data/lib/chronic/handlers/narrow.rb +54 -0
- data/lib/chronic/handlers/time.rb +167 -0
- data/lib/chronic/handlers/time_zone.rb +50 -0
- data/lib/chronic/objects/anchor_object.rb +263 -0
- data/lib/chronic/objects/arrow_object.rb +27 -0
- data/lib/chronic/objects/date_object.rb +164 -0
- data/lib/chronic/objects/date_time_object.rb +64 -0
- data/lib/chronic/objects/handler_object.rb +81 -0
- data/lib/chronic/objects/narrow_object.rb +85 -0
- data/lib/chronic/objects/time_object.rb +96 -0
- data/lib/chronic/objects/time_zone_object.rb +27 -0
- data/lib/chronic/parser.rb +154 -0
- data/lib/chronic/span.rb +32 -0
- data/lib/chronic/tag.rb +84 -0
- data/lib/chronic/tags/day_name.rb +34 -0
- data/lib/chronic/tags/day_portion.rb +33 -0
- data/lib/chronic/tags/day_special.rb +30 -0
- data/lib/chronic/tags/grabber.rb +29 -0
- data/lib/chronic/tags/keyword.rb +63 -0
- data/lib/chronic/tags/month_name.rb +39 -0
- data/lib/chronic/tags/ordinal.rb +52 -0
- data/lib/chronic/tags/pointer.rb +28 -0
- data/lib/chronic/tags/rational.rb +35 -0
- data/lib/chronic/tags/scalar.rb +101 -0
- data/lib/chronic/tags/season_name.rb +31 -0
- data/lib/chronic/tags/separator.rb +130 -0
- data/lib/chronic/tags/sign.rb +35 -0
- data/lib/chronic/tags/time_special.rb +34 -0
- data/lib/chronic/tags/time_zone.rb +56 -0
- data/lib/chronic/tags/unit.rb +174 -0
- data/lib/chronic/time.rb +141 -0
- data/lib/chronic/time_zone.rb +80 -0
- data/lib/chronic/token.rb +61 -0
- data/lib/chronic/token_group.rb +271 -0
- data/lib/chronic/tokenizer.rb +42 -0
- data/lib/chronic/version.rb +3 -0
- data/test/helper.rb +12 -0
- data/test/test_chronic.rb +190 -0
- data/test/test_daylight_savings.rb +98 -0
- data/test/test_handler.rb +113 -0
- data/test/test_parsing.rb +1520 -0
- data/test/test_span.rb +23 -0
- data/test/test_token.rb +31 -0
- metadata +218 -0
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'chronic/handlers/date'
|
2
|
+
require 'chronic/handlers/time'
|
3
|
+
require 'chronic/handlers/time_zone'
|
4
|
+
|
5
|
+
module Chronic
|
6
|
+
module DateTimeHandlers
|
7
|
+
include DateHandlers
|
8
|
+
include TimeHandlers
|
9
|
+
include TimeZoneHandlers
|
10
|
+
|
11
|
+
# Handle scalar-year/scalar-month/scalar-day/scalar-hour/scalar-minute/scalar-second
|
12
|
+
# formats: yyyy-mm-ddTh:m:s
|
13
|
+
def handle_sy_sm_sd_h_m_s
|
14
|
+
handle_sy_sm_sd
|
15
|
+
next_tag # T
|
16
|
+
handle_h_m_s
|
17
|
+
end
|
18
|
+
|
19
|
+
# Handle scalar-year/scalar-month/scalar-day/scalar-hour/scalar-minute/scalar-second
|
20
|
+
# formats: yyyy-mm-ddTh:m:sZ
|
21
|
+
def handle_sy_sm_sd_h_m_s_tz
|
22
|
+
handle_sy_sm_sd
|
23
|
+
next_tag # T
|
24
|
+
handle_h_m_s
|
25
|
+
handle_generic
|
26
|
+
end
|
27
|
+
|
28
|
+
# Handle scalar-year/scalar-month/scalar-day/scalar-hour/scalar-minute/scalar-second/scalar-subsecond
|
29
|
+
# formats: yyyy-mm-ddTh:m:s.sss
|
30
|
+
def handle_sy_sm_sd_h_m_s_ss
|
31
|
+
handle_sy_sm_sd
|
32
|
+
next_tag
|
33
|
+
handle_h_m_s_ss
|
34
|
+
end
|
35
|
+
|
36
|
+
# Handle scalar-year/scalar-month/scalar-day/scalar-hour/scalar-minute/scalar-second/scalar-subsecond
|
37
|
+
# formats: yyyy-mm-ddTh:m:s.sssZ
|
38
|
+
def handle_sy_sm_sd_h_m_s_ss_tz
|
39
|
+
handle_sy_sm_sd
|
40
|
+
next_tag
|
41
|
+
handle_h_m_s_ss
|
42
|
+
handle_generic
|
43
|
+
end
|
44
|
+
|
45
|
+
# Handle scalar-year/scalar-month/scalar-day/scalar-hour/scalar-minute/scalar-second/sign/scalar-hour/scalar-minute
|
46
|
+
# formats: yyyy-mm-ddTh:m:s+hh:mm
|
47
|
+
def handle_sy_sm_sd_h_m_s_hh_mm
|
48
|
+
handle_sy_sm_sd_h_m_s
|
49
|
+
handle_hh_mm
|
50
|
+
end
|
51
|
+
|
52
|
+
# Handle scalar-year/scalar-month/scalar-day/scalar-hour/scalar-minute/scalar-second/scalar-subsecond/sign/scalar-hour/scalar-minute
|
53
|
+
# formats: yyyy-mm-ddTh:m:s.sss +hh:mm
|
54
|
+
def handle_sy_sm_sd_h_m_s_ss_hh_mm
|
55
|
+
handle_sy_sm_sd_h_m_s_ss
|
56
|
+
handle_hh_mm
|
57
|
+
end
|
58
|
+
|
59
|
+
# Handle day-name/month-name/scalar-day/scalar-hour/scalar-minute/scalar-second/abbr/scalar-year
|
60
|
+
# formats: dn month dd h:m:s abbr yyyy
|
61
|
+
def handle_dn_mn_sd_h_m_s_abbr_sy
|
62
|
+
handle_dn_mn_sd
|
63
|
+
next_tag
|
64
|
+
handle_h_m_s
|
65
|
+
next_tag
|
66
|
+
handle_abbr
|
67
|
+
next_tag
|
68
|
+
handle_sy
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
module Chronic
|
2
|
+
module GeneralHandlers
|
3
|
+
def reset_handler
|
4
|
+
@index = @begin
|
5
|
+
@grabber = nil
|
6
|
+
@day_special = nil
|
7
|
+
@time_special = nil
|
8
|
+
@precision = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
# Handle at
|
12
|
+
# formats: at
|
13
|
+
def handle_at
|
14
|
+
handle_possible(KeywordAt)
|
15
|
+
handle_possible(SeparatorSpace)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Handle in
|
19
|
+
# formats: in
|
20
|
+
def handle_in
|
21
|
+
handle_possible(KeywordIn)
|
22
|
+
handle_possible(SeparatorSpace)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Handle grabber
|
26
|
+
# formats: gr
|
27
|
+
def handle_gr
|
28
|
+
@grabber = @tokens[@index].get_tag(Grabber).type
|
29
|
+
@index += 1
|
30
|
+
end
|
31
|
+
|
32
|
+
# Handle ordinal
|
33
|
+
# formats: o
|
34
|
+
def handle_o
|
35
|
+
@number = @tokens[@index].get_tag(Ordinal).type
|
36
|
+
@count = @number
|
37
|
+
@index += 1
|
38
|
+
end
|
39
|
+
|
40
|
+
# Handle scalar
|
41
|
+
# formats: s
|
42
|
+
def handle_s
|
43
|
+
@count = @tokens[@index].get_tag(Scalar).type
|
44
|
+
@index += 1
|
45
|
+
end
|
46
|
+
|
47
|
+
# Handle scalar-year
|
48
|
+
# formats: yyyy
|
49
|
+
def handle_sy
|
50
|
+
handle_possible(SeparatorSpace)
|
51
|
+
handle_possible(SeparatorApostrophe)
|
52
|
+
@year = @tokens[@index].get_tag(ScalarYear).type
|
53
|
+
@have_year = true
|
54
|
+
@index += 1
|
55
|
+
@precision = :year
|
56
|
+
end
|
57
|
+
|
58
|
+
# Handle rational
|
59
|
+
# formats: r
|
60
|
+
def handle_r
|
61
|
+
@count = @tokens[@index].get_tag(Rational).type
|
62
|
+
@index += 1
|
63
|
+
end
|
64
|
+
|
65
|
+
# Handle unit
|
66
|
+
# formats: u
|
67
|
+
def handle_u
|
68
|
+
@unit = @tokens[@index].get_tag(Unit).type
|
69
|
+
@index += 1
|
70
|
+
@precision = :unit
|
71
|
+
end
|
72
|
+
|
73
|
+
# Handle time-special
|
74
|
+
# formats: ts
|
75
|
+
def handle_ts
|
76
|
+
handle_at
|
77
|
+
handle_in
|
78
|
+
@time_special = @tokens[@index].get_tag(TimeSpecial).type
|
79
|
+
@index += 1
|
80
|
+
@precision = :time_special
|
81
|
+
end
|
82
|
+
|
83
|
+
# Handle day-special
|
84
|
+
# formats: ds
|
85
|
+
def handle_ds
|
86
|
+
@day_special = @tokens[@index].get_tag(DaySpecial).type
|
87
|
+
@index += 1
|
88
|
+
@precision = :day_special
|
89
|
+
end
|
90
|
+
|
91
|
+
# Handle day-name
|
92
|
+
# formats: dn
|
93
|
+
def handle_dn
|
94
|
+
@wday = Date::DAYS[@tokens[@index].get_tag(DayName).type]
|
95
|
+
@index += 1
|
96
|
+
@precision = :day
|
97
|
+
end
|
98
|
+
|
99
|
+
# Handle month-name
|
100
|
+
# formats: month
|
101
|
+
def handle_mn
|
102
|
+
handle_possible(SeparatorSpace)
|
103
|
+
handle_possible(SeparatorSpace) if handle_possible(KeywordIn)
|
104
|
+
@month = Date::MONTHS[@tokens[@index].get_tag(MonthName).type]
|
105
|
+
@index += 1
|
106
|
+
@precision = :month
|
107
|
+
end
|
108
|
+
|
109
|
+
# Handle season-name
|
110
|
+
# formats: season
|
111
|
+
def handle_sn
|
112
|
+
handle_possible(SeparatorSpace)
|
113
|
+
@season = @tokens[@index].get_tag(SeasonName).type
|
114
|
+
@index += 1
|
115
|
+
@precision = :season
|
116
|
+
end
|
117
|
+
|
118
|
+
# Handle keyword-q/scalar
|
119
|
+
# formats: Qs
|
120
|
+
def handle_q_s
|
121
|
+
next_tag # Q
|
122
|
+
@quarter = @tokens[@index].get_tag(Scalar).type
|
123
|
+
@number = @quarter
|
124
|
+
@index += 1
|
125
|
+
@precision = :quarter
|
126
|
+
@unit = :quarter
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'chronic/handlers/general'
|
2
|
+
|
3
|
+
module Chronic
|
4
|
+
module NarrowHandlers
|
5
|
+
include GeneralHandlers
|
6
|
+
|
7
|
+
# Handle ordinal/day-name
|
8
|
+
# formats: o u
|
9
|
+
def handle_o_dn
|
10
|
+
handle_o
|
11
|
+
handle_possible(SeparatorSpace)
|
12
|
+
handle_dn
|
13
|
+
end
|
14
|
+
|
15
|
+
# Handle ordinal/unit
|
16
|
+
# formats: o u
|
17
|
+
def handle_o_u
|
18
|
+
handle_o
|
19
|
+
handle_possible(SeparatorSpace)
|
20
|
+
handle_u
|
21
|
+
end
|
22
|
+
|
23
|
+
# Handle ordinal-day/grabber/unit-month
|
24
|
+
# formats: dd(st|nd|rd|th) of last/this/next month
|
25
|
+
def handle_od_gr
|
26
|
+
handle_od
|
27
|
+
next_tag
|
28
|
+
handle_gr
|
29
|
+
# ignore unit
|
30
|
+
@year, @month = Date::add_month(@local_date.year, @local_date.month, @modifier)
|
31
|
+
next_tag
|
32
|
+
end
|
33
|
+
|
34
|
+
# Handle ordinal-month/grabber/unit-year
|
35
|
+
# formats: mm(st|nd|rd|th) of last/this/next year
|
36
|
+
def handle_om_gr
|
37
|
+
handle_om
|
38
|
+
next_tag
|
39
|
+
handle_gr
|
40
|
+
# ignore unit
|
41
|
+
@year = @local_date.year + @modifier
|
42
|
+
next_tag
|
43
|
+
end
|
44
|
+
|
45
|
+
# Handle grabber/ordinal/unit
|
46
|
+
# formats: last/this/next o u
|
47
|
+
def handle_gr_o_u
|
48
|
+
handle_gr
|
49
|
+
next_tag
|
50
|
+
handle_o_u
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
require 'chronic/handlers/general'
|
2
|
+
|
3
|
+
module Chronic
|
4
|
+
module TimeHandlers
|
5
|
+
include GeneralHandlers
|
6
|
+
# Handle scalar-hour/scalar-minute/scalar-second/scalar-subsecond
|
7
|
+
# formats: h:m:s.SSS, h:m:s:SSS
|
8
|
+
def handle_h_m_s_ss
|
9
|
+
handle_h_m_s
|
10
|
+
next_tag
|
11
|
+
subsecond = @tokens[@index].get_tag(ScalarSubsecond)
|
12
|
+
@subsecond_size = 10 ** subsecond.width
|
13
|
+
@subsecond = subsecond.type.to_f / subsecond_size
|
14
|
+
next_tag
|
15
|
+
@precision = :subsecond
|
16
|
+
end
|
17
|
+
|
18
|
+
# Handle scalar-hour/scalar-minute/scalar-second/day-portion
|
19
|
+
# formats: h:m:s dp
|
20
|
+
def handle_h_m_s_dp
|
21
|
+
handle_h_m_s
|
22
|
+
handle_dp
|
23
|
+
end
|
24
|
+
|
25
|
+
# Handle scalar-hour/scalar-minute/scalar-second
|
26
|
+
# formats: h:m:s
|
27
|
+
def handle_h_m_s
|
28
|
+
handle_h_m
|
29
|
+
next_tag
|
30
|
+
handle_s
|
31
|
+
end
|
32
|
+
|
33
|
+
# Handle scalar-wide/day-portion
|
34
|
+
# formats: hhmm dp
|
35
|
+
def handle_hhmm_dp
|
36
|
+
handle_hhmm
|
37
|
+
handle_dp
|
38
|
+
end
|
39
|
+
|
40
|
+
# Handle scalar-hour/scalar-minute/time-special
|
41
|
+
# formats: h:m in ts
|
42
|
+
def handle_h_m_ts
|
43
|
+
handle_h_m
|
44
|
+
next_tag
|
45
|
+
next_tag # in
|
46
|
+
next_tag
|
47
|
+
handle_ts
|
48
|
+
@precision = :minute
|
49
|
+
end
|
50
|
+
|
51
|
+
# Handle scalar-hour/scalar-minute/day-portion
|
52
|
+
# formats: h:m dp, h.m dp
|
53
|
+
def handle_h_m_dp
|
54
|
+
handle_h_m
|
55
|
+
handle_dp
|
56
|
+
end
|
57
|
+
|
58
|
+
# Handle time-special/scalar-hour/scalar-minute
|
59
|
+
# formats: ts at h:m
|
60
|
+
def handle_ts_h_m
|
61
|
+
handle_ts
|
62
|
+
next_tag
|
63
|
+
handle_h_m
|
64
|
+
end
|
65
|
+
|
66
|
+
# Handle time-special/scalar-hour
|
67
|
+
# formats: ts at h
|
68
|
+
def handle_ts_h
|
69
|
+
handle_ts
|
70
|
+
next_tag
|
71
|
+
handle_h
|
72
|
+
end
|
73
|
+
|
74
|
+
# Handle scalar-hour/scalar-minute
|
75
|
+
# formats: h:m, h.m
|
76
|
+
def handle_h_m
|
77
|
+
handle_h
|
78
|
+
next_tag
|
79
|
+
handle_m
|
80
|
+
end
|
81
|
+
|
82
|
+
# Handle scalar-wide
|
83
|
+
# formats: hhmm
|
84
|
+
def handle_hhmm
|
85
|
+
handle_at
|
86
|
+
wide = @tokens[@index].get_tag(ScalarWide).type
|
87
|
+
@hour = wide[0, 2].to_i
|
88
|
+
@minute = wide[2, 4].to_i
|
89
|
+
@ambiguous = false
|
90
|
+
next_tag
|
91
|
+
@precision = :minute
|
92
|
+
end
|
93
|
+
|
94
|
+
# Handle grabber/day-portion
|
95
|
+
# formats: gr dp
|
96
|
+
def handle_gr_dp
|
97
|
+
handle_gr
|
98
|
+
next_tag
|
99
|
+
handle_dp
|
100
|
+
end
|
101
|
+
|
102
|
+
# Handle scalar-hour/time-special
|
103
|
+
# formats: h at|in ts
|
104
|
+
def handle_h_ts
|
105
|
+
handle_h
|
106
|
+
next_tag
|
107
|
+
handle_ts
|
108
|
+
@precision = :hour
|
109
|
+
end
|
110
|
+
|
111
|
+
# Handle scalar-hour/day-portion
|
112
|
+
# formats: h dp
|
113
|
+
def handle_h_dp
|
114
|
+
handle_h
|
115
|
+
handle_possible(SeparatorSpace)
|
116
|
+
handle_dp
|
117
|
+
end
|
118
|
+
|
119
|
+
# Handle scalar-hour/keyword-to/scalar-hour
|
120
|
+
# formats: h to h
|
121
|
+
def handle_h_h
|
122
|
+
handle_h
|
123
|
+
next_tag # space
|
124
|
+
next_tag # to
|
125
|
+
next_tag # space
|
126
|
+
handle_h
|
127
|
+
end
|
128
|
+
|
129
|
+
# Handle scalar-hour
|
130
|
+
# formats: h
|
131
|
+
def handle_h
|
132
|
+
handle_at
|
133
|
+
handle_possible(SeparatorSpace)
|
134
|
+
tag = @tokens[@index].get_tag(ScalarHour)
|
135
|
+
@hour = tag.type
|
136
|
+
@ambiguous = false if @hour.zero? or @hour > 12 or (tag.width >= 2 and @hour < 10 and @options[:hours24] != false)
|
137
|
+
next_tag
|
138
|
+
@precision = :hour
|
139
|
+
end
|
140
|
+
|
141
|
+
# Handle scalar-minute
|
142
|
+
# formats: m
|
143
|
+
def handle_m
|
144
|
+
@minute = @tokens[@index].get_tag(ScalarMinute).type
|
145
|
+
next_tag
|
146
|
+
@precision = :minute
|
147
|
+
end
|
148
|
+
|
149
|
+
# Handle scalar-second
|
150
|
+
# formats: s
|
151
|
+
def handle_s
|
152
|
+
@second = @tokens[@index].get_tag(ScalarSecond).type
|
153
|
+
next_tag
|
154
|
+
@precision = :second
|
155
|
+
end
|
156
|
+
|
157
|
+
# Handle day-portion
|
158
|
+
# formats: dp
|
159
|
+
def handle_dp
|
160
|
+
handle_at
|
161
|
+
handle_in
|
162
|
+
@day_portion = @tokens[@index].get_tag(DayPortion).type
|
163
|
+
next_tag
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Chronic
|
2
|
+
module TimeZoneHandlers
|
3
|
+
|
4
|
+
# Handle offset
|
5
|
+
# formats: UTC, Z
|
6
|
+
def handle_generic
|
7
|
+
@offset = @tokens[@index].get_tag(TimeZoneGeneric).type
|
8
|
+
next_tag
|
9
|
+
end
|
10
|
+
|
11
|
+
# Handle abbr
|
12
|
+
# formats: UTC, GMT, etc
|
13
|
+
def handle_abbr
|
14
|
+
@abbr = @tokens[@index].get_tag(TimeZoneAbbreviation).type
|
15
|
+
next_tag
|
16
|
+
end
|
17
|
+
|
18
|
+
# Handle scalar-wide
|
19
|
+
# formats: hhmm
|
20
|
+
def handle_hhmm
|
21
|
+
handle_sign
|
22
|
+
wide = @tokens[@index].get_tag(ScalarWide).type
|
23
|
+
@tzhour = wide[0, 2].to_i
|
24
|
+
@tzminute = wide[2, 4].to_i
|
25
|
+
next_tag
|
26
|
+
end
|
27
|
+
|
28
|
+
# Handle sign/scalar-hour/scalar-minute
|
29
|
+
# formats: +hh:mm, -hh:mm
|
30
|
+
def handle_hh_mm
|
31
|
+
handle_sign
|
32
|
+
@tzhour = @tokens[@index].get_tag(ScalarHour).type
|
33
|
+
next_tag
|
34
|
+
next_tag
|
35
|
+
@tzminute = @tokens[@index].get_tag(ScalarMinute).type
|
36
|
+
next_tag
|
37
|
+
end
|
38
|
+
|
39
|
+
# Handle sign
|
40
|
+
# formats: +, -
|
41
|
+
def handle_sign
|
42
|
+
sign = @tokens[@index].get_tag(Sign)
|
43
|
+
if sign
|
44
|
+
@sign = sign
|
45
|
+
next_tag
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|