chronic 0.2.3 → 0.3.0

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 (57) hide show
  1. data/HISTORY.md +76 -0
  2. data/LICENSE +21 -0
  3. data/README.md +165 -0
  4. data/Rakefile +145 -18
  5. data/benchmark/benchmark.rb +13 -0
  6. data/chronic.gemspec +85 -0
  7. data/lib/chronic.rb +21 -19
  8. data/lib/chronic/chronic.rb +59 -49
  9. data/lib/chronic/grabber.rb +2 -2
  10. data/lib/chronic/handlers.rb +167 -112
  11. data/lib/{numerizer → chronic/numerizer}/numerizer.rb +17 -23
  12. data/lib/chronic/ordinal.rb +6 -6
  13. data/lib/chronic/pointer.rb +3 -3
  14. data/lib/chronic/repeater.rb +26 -12
  15. data/lib/chronic/repeaters/repeater_day.rb +17 -12
  16. data/lib/chronic/repeaters/repeater_day_name.rb +17 -12
  17. data/lib/chronic/repeaters/repeater_day_portion.rb +13 -12
  18. data/lib/chronic/repeaters/repeater_fortnight.rb +14 -9
  19. data/lib/chronic/repeaters/repeater_hour.rb +15 -10
  20. data/lib/chronic/repeaters/repeater_minute.rb +15 -10
  21. data/lib/chronic/repeaters/repeater_month.rb +20 -15
  22. data/lib/chronic/repeaters/repeater_month_name.rb +21 -16
  23. data/lib/chronic/repeaters/repeater_season.rb +136 -9
  24. data/lib/chronic/repeaters/repeater_season_name.rb +38 -17
  25. data/lib/chronic/repeaters/repeater_second.rb +15 -10
  26. data/lib/chronic/repeaters/repeater_time.rb +49 -42
  27. data/lib/chronic/repeaters/repeater_week.rb +16 -11
  28. data/lib/chronic/repeaters/repeater_weekday.rb +77 -0
  29. data/lib/chronic/repeaters/repeater_weekend.rb +14 -9
  30. data/lib/chronic/repeaters/repeater_year.rb +19 -13
  31. data/lib/chronic/scalar.rb +16 -14
  32. data/lib/chronic/separator.rb +25 -10
  33. data/lib/chronic/time_zone.rb +4 -3
  34. data/test/helper.rb +7 -0
  35. data/test/test_Chronic.rb +17 -18
  36. data/test/test_DaylightSavings.rb +118 -0
  37. data/test/test_Handler.rb +37 -38
  38. data/test/test_Numerizer.rb +8 -5
  39. data/test/test_RepeaterDayName.rb +15 -16
  40. data/test/test_RepeaterFortnight.rb +16 -17
  41. data/test/test_RepeaterHour.rb +18 -19
  42. data/test/test_RepeaterMinute.rb +34 -0
  43. data/test/test_RepeaterMonth.rb +16 -17
  44. data/test/test_RepeaterMonthName.rb +17 -18
  45. data/test/test_RepeaterTime.rb +20 -22
  46. data/test/test_RepeaterWeek.rb +16 -17
  47. data/test/test_RepeaterWeekday.rb +55 -0
  48. data/test/test_RepeaterWeekend.rb +21 -22
  49. data/test/test_RepeaterYear.rb +17 -18
  50. data/test/test_Span.rb +5 -6
  51. data/test/test_Time.rb +11 -12
  52. data/test/test_Token.rb +5 -6
  53. data/test/test_parsing.rb +300 -204
  54. metadata +74 -52
  55. data/History.txt +0 -53
  56. data/README.txt +0 -149
  57. data/test/suite.rb +0 -9
@@ -1,8 +1,7 @@
1
- require 'chronic'
2
- require 'test/unit'
1
+ require File.join(File.dirname(__FILE__), *%w[helper])
3
2
 
4
3
  class TestSpan < Test::Unit::TestCase
5
-
4
+
6
5
  def setup
7
6
  # Wed Aug 16 14:00:00 UTC 2006
8
7
  @now = Time.local(2006, 8, 16, 14, 0, 0, 0)
@@ -12,7 +11,7 @@ class TestSpan < Test::Unit::TestCase
12
11
  span = Chronic::Span.new(Time.local(2006, 8, 16, 0), Time.local(2006, 8, 17, 0))
13
12
  assert_equal (60 * 60 * 24), span.width
14
13
  end
15
-
14
+
16
15
  def test_span_math
17
16
  s = Chronic::Span.new(1, 2)
18
17
  assert_equal 2, (s + 1).begin
@@ -20,5 +19,5 @@ class TestSpan < Test::Unit::TestCase
20
19
  assert_equal 0, (s - 1).begin
21
20
  assert_equal 1, (s - 1).end
22
21
  end
23
-
24
- end
22
+
23
+ end
@@ -1,50 +1,49 @@
1
- require 'chronic'
2
- require 'test/unit'
1
+ require File.join(File.dirname(__FILE__), *%w[helper])
3
2
 
4
3
  class TestTime < Test::Unit::TestCase
5
-
4
+
6
5
  def setup
7
6
  end
8
-
7
+
9
8
  def test_normal
10
9
  assert_equal Time.local(2006, 1, 2, 0, 0, 0), Time.construct(2006, 1, 2, 0, 0, 0)
11
10
  assert_equal Time.local(2006, 1, 2, 3, 0, 0), Time.construct(2006, 1, 2, 3, 0, 0)
12
11
  assert_equal Time.local(2006, 1, 2, 3, 4, 0), Time.construct(2006, 1, 2, 3, 4, 0)
13
12
  assert_equal Time.local(2006, 1, 2, 3, 4, 5), Time.construct(2006, 1, 2, 3, 4, 5)
14
13
  end
15
-
14
+
16
15
  def test_second_overflow
17
16
  assert_equal Time.local(2006, 1, 1, 0, 1, 30), Time.construct(2006, 1, 1, 0, 0, 90)
18
17
  assert_equal Time.local(2006, 1, 1, 0, 5, 0), Time.construct(2006, 1, 1, 0, 0, 300)
19
18
  end
20
-
19
+
21
20
  def test_minute_overflow
22
21
  assert_equal Time.local(2006, 1, 1, 1, 30), Time.construct(2006, 1, 1, 0, 90)
23
22
  assert_equal Time.local(2006, 1, 1, 5), Time.construct(2006, 1, 1, 0, 300)
24
23
  end
25
-
24
+
26
25
  def test_hour_overflow
27
26
  assert_equal Time.local(2006, 1, 2, 12), Time.construct(2006, 1, 1, 36)
28
27
  assert_equal Time.local(2006, 1, 7), Time.construct(2006, 1, 1, 144)
29
28
  end
30
-
29
+
31
30
  def test_day_overflow
32
31
  assert_equal Time.local(2006, 2, 1), Time.construct(2006, 1, 32)
33
32
  assert_equal Time.local(2006, 3, 5), Time.construct(2006, 2, 33)
34
33
  assert_equal Time.local(2004, 3, 4), Time.construct(2004, 2, 33)
35
34
  assert_equal Time.local(2000, 3, 5), Time.construct(2000, 2, 33)
36
-
35
+
37
36
  assert_nothing_raised do
38
37
  Time.construct(2006, 1, 56)
39
38
  end
40
-
39
+
41
40
  assert_raise(RuntimeError) do
42
41
  Time.construct(2006, 1, 57)
43
42
  end
44
43
  end
45
-
44
+
46
45
  def test_month_overflow
47
46
  assert_equal Time.local(2006, 1), Time.construct(2005, 13)
48
47
  assert_equal Time.local(2005, 12), Time.construct(2000, 72)
49
48
  end
50
- end
49
+ end
@@ -1,13 +1,12 @@
1
- require 'chronic'
2
- require 'test/unit'
1
+ require File.join(File.dirname(__FILE__), *%w[helper])
3
2
 
4
3
  class TestToken < Test::Unit::TestCase
5
-
4
+
6
5
  def setup
7
6
  # Wed Aug 16 14:00:00 UTC 2006
8
7
  @now = Time.local(2006, 8, 16, 14, 0, 0, 0)
9
8
  end
10
-
9
+
11
10
  def test_token
12
11
  token = Chronic::Token.new('foo')
13
12
  assert_equal 0, token.tags.size
@@ -22,5 +21,5 @@ class TestToken < Test::Unit::TestCase
22
21
  assert_equal 1, token.tags.size
23
22
  assert_equal 'foo', token.word
24
23
  end
25
-
26
- end
24
+
25
+ end
@@ -1,614 +1,710 @@
1
- require 'chronic'
2
- require 'time'
3
- require 'test/unit'
1
+ require File.join(File.dirname(__FILE__), *%w[helper])
4
2
 
5
3
  class TestParsing < Test::Unit::TestCase
6
4
  # Wed Aug 16 14:00:00 UTC 2006
7
5
  TIME_2006_08_16_14_00_00 = Time.local(2006, 8, 16, 14, 0, 0, 0)
8
-
6
+
9
7
  def setup
10
8
  @time_2006_08_16_14_00_00 = TIME_2006_08_16_14_00_00
11
9
  end
12
-
10
+
13
11
  def test_parse_guess_dates
14
12
  # rm_sd
15
13
 
16
14
  time = parse_now("may 27")
17
15
  assert_equal Time.local(2007, 5, 27, 12), time
18
-
16
+
19
17
  time = parse_now("may 28", :context => :past)
20
18
  assert_equal Time.local(2006, 5, 28, 12), time
21
-
19
+
22
20
  time = parse_now("may 28 5pm", :context => :past)
23
21
  assert_equal Time.local(2006, 5, 28, 17), time
24
-
22
+
25
23
  time = parse_now("may 28 at 5pm", :context => :past)
26
24
  assert_equal Time.local(2006, 5, 28, 17), time
27
-
25
+
28
26
  time = parse_now("may 28 at 5:32.19pm", :context => :past)
29
27
  assert_equal Time.local(2006, 5, 28, 17, 32, 19), time
30
-
28
+
29
+ # rm_sd_on
30
+
31
+ time = parse_now("5pm on may 28")
32
+ assert_equal Time.local(2007, 5, 28, 17), time
33
+
34
+ time = parse_now("5pm may 28")
35
+ assert_equal Time.local(2007, 5, 28, 17), time
36
+
37
+ time = parse_now("5 on may 28", :ambiguous_time_range => :none)
38
+ assert_equal Time.local(2007, 5, 28, 05), time
39
+
31
40
  # rm_od
32
-
41
+
33
42
  time = parse_now("may 27th")
34
43
  assert_equal Time.local(2007, 5, 27, 12), time
35
-
44
+
36
45
  time = parse_now("may 27th", :context => :past)
37
46
  assert_equal Time.local(2006, 5, 27, 12), time
38
-
47
+
39
48
  time = parse_now("may 27th 5:00 pm", :context => :past)
40
49
  assert_equal Time.local(2006, 5, 27, 17), time
41
-
50
+
42
51
  time = parse_now("may 27th at 5pm", :context => :past)
43
52
  assert_equal Time.local(2006, 5, 27, 17), time
44
-
53
+
45
54
  time = parse_now("may 27th at 5", :ambiguous_time_range => :none)
46
55
  assert_equal Time.local(2007, 5, 27, 5), time
47
-
56
+
57
+ # rm_od_on
58
+
59
+ time = parse_now("5:00 pm may 27th", :context => :past)
60
+ assert_equal Time.local(2006, 5, 27, 17), time
61
+
62
+ time = parse_now("5pm on may 27th", :context => :past)
63
+ assert_equal Time.local(2006, 5, 27, 17), time
64
+
65
+ time = parse_now("5 on may 27th", :ambiguous_time_range => :none)
66
+ assert_equal Time.local(2007, 5, 27, 5), time
67
+
48
68
  # rm_sy
49
-
69
+
50
70
  time = parse_now("June 1979")
51
71
  assert_equal Time.local(1979, 6, 16, 0), time
52
-
72
+
53
73
  time = parse_now("dec 79")
54
74
  assert_equal Time.local(1979, 12, 16, 12), time
55
-
75
+
56
76
  # rm_sd_sy
57
-
77
+
58
78
  time = parse_now("jan 3 2010")
59
79
  assert_equal Time.local(2010, 1, 3, 12), time
60
-
80
+
61
81
  time = parse_now("jan 3 2010 midnight")
62
82
  assert_equal Time.local(2010, 1, 4, 0), time
63
-
83
+
64
84
  time = parse_now("jan 3 2010 at midnight")
65
85
  assert_equal Time.local(2010, 1, 4, 0), time
66
-
86
+
67
87
  time = parse_now("jan 3 2010 at 4", :ambiguous_time_range => :none)
68
88
  assert_equal Time.local(2010, 1, 3, 4), time
69
-
89
+
70
90
  #time = parse_now("January 12, '00")
71
91
  #assert_equal Time.local(2000, 1, 12, 12), time
72
-
92
+
93
+ time = parse_now("may 27, 1979")
94
+ assert_equal Time.local(1979, 5, 27, 12), time
95
+
73
96
  time = parse_now("may 27 79")
74
97
  assert_equal Time.local(1979, 5, 27, 12), time
75
-
98
+
76
99
  time = parse_now("may 27 79 4:30")
77
100
  assert_equal Time.local(1979, 5, 27, 16, 30), time
78
-
101
+
79
102
  time = parse_now("may 27 79 at 4:30", :ambiguous_time_range => :none)
80
103
  assert_equal Time.local(1979, 5, 27, 4, 30), time
81
-
104
+
82
105
  # sd_rm_sy
83
106
 
84
107
  time = parse_now("3 jan 2010")
85
108
  assert_equal Time.local(2010, 1, 3, 12), time
86
-
109
+
87
110
  time = parse_now("3 jan 2010 4pm")
88
111
  assert_equal Time.local(2010, 1, 3, 16), time
89
-
112
+
113
+ time = parse_now("27 Oct 2006 7:30pm")
114
+ assert_equal Time.local(2006, 10, 27, 19, 30), time
115
+
90
116
  # sm_sd_sy
91
-
117
+
92
118
  time = parse_now("5/27/1979")
93
119
  assert_equal Time.local(1979, 5, 27, 12), time
94
-
120
+
95
121
  time = parse_now("5/27/1979 4am")
96
122
  assert_equal Time.local(1979, 5, 27, 4), time
97
-
123
+
98
124
  # sd_sm_sy
99
-
125
+
100
126
  time = parse_now("27/5/1979")
101
127
  assert_equal Time.local(1979, 5, 27, 12), time
102
-
128
+
103
129
  time = parse_now("27/5/1979 @ 0700")
104
130
  assert_equal Time.local(1979, 5, 27, 7), time
105
-
131
+
106
132
  # sm_sy
107
-
133
+
108
134
  time = parse_now("05/06")
109
135
  assert_equal Time.local(2006, 5, 16, 12), time
110
-
136
+
111
137
  time = parse_now("12/06")
112
138
  assert_equal Time.local(2006, 12, 16, 12), time
113
-
139
+
114
140
  time = parse_now("13/06")
115
141
  assert_equal nil, time
116
-
142
+
117
143
  # sy_sm_sd
118
-
144
+
119
145
  time = parse_now("2000-1-1")
120
146
  assert_equal Time.local(2000, 1, 1, 12), time
121
-
147
+
122
148
  time = parse_now("2006-08-20")
123
149
  assert_equal Time.local(2006, 8, 20, 12), time
124
-
150
+
125
151
  time = parse_now("2006-08-20 7pm")
126
152
  assert_equal Time.local(2006, 8, 20, 19), time
127
-
153
+
128
154
  time = parse_now("2006-08-20 03:00")
129
155
  assert_equal Time.local(2006, 8, 20, 3), time
130
-
156
+
131
157
  time = parse_now("2006-08-20 03:30:30")
132
158
  assert_equal Time.local(2006, 8, 20, 3, 30, 30), time
133
-
159
+
134
160
  time = parse_now("2006-08-20 15:30:30")
135
161
  assert_equal Time.local(2006, 8, 20, 15, 30, 30), time
136
-
162
+
137
163
  time = parse_now("2006-08-20 15:30.30")
138
164
  assert_equal Time.local(2006, 8, 20, 15, 30, 30), time
139
-
165
+
140
166
  # rdn_rm_rd_rt_rtz_ry
141
-
167
+
142
168
  time = parse_now("Mon Apr 02 17:00:00 PDT 2007")
143
- assert_equal Time.local(2007, 4, 2, 17), time
144
-
169
+ assert_equal 1175558400, time.to_i
170
+
145
171
  now = Time.now
146
172
  time = parse_now(now.to_s)
147
173
  assert_equal now.to_s, time.to_s
148
-
174
+
149
175
  # rm_sd_rt
150
-
176
+
151
177
  #time = parse_now("jan 5 13:00")
152
178
  #assert_equal Time.local(2007, 1, 5, 13), time
153
-
154
- # due to limitations of the Time class, these don't work
155
-
179
+
180
+ # old dates
181
+
156
182
  time = parse_now("may 40")
157
- assert_equal nil, time
158
-
183
+ assert_equal Time.local(40, 5, 16, 12, 0, 0), time
184
+
159
185
  time = parse_now("may 27 40")
160
- assert_equal nil, time
161
-
186
+ assert_equal Time.local(40, 5, 27, 12, 0, 0), time
187
+
162
188
  time = parse_now("1800-08-20")
163
- assert_equal nil, time
164
- end
165
-
166
- def test_foo
167
- Chronic.parse('two months ago this friday')
189
+ assert_equal Time.local(1800, 8, 20, 12, 0, 0), time
168
190
  end
169
191
 
170
192
  def test_parse_guess_r
171
193
  time = parse_now("friday")
172
194
  assert_equal Time.local(2006, 8, 18, 12), time
173
-
195
+
174
196
  time = parse_now("tue")
175
197
  assert_equal Time.local(2006, 8, 22, 12), time
176
-
198
+
177
199
  time = parse_now("5")
178
200
  assert_equal Time.local(2006, 8, 16, 17), time
179
-
201
+
180
202
  time = Chronic.parse("5", :now => Time.local(2006, 8, 16, 3, 0, 0, 0), :ambiguous_time_range => :none)
181
203
  assert_equal Time.local(2006, 8, 16, 5), time
182
-
204
+
183
205
  time = parse_now("13:00")
184
206
  assert_equal Time.local(2006, 8, 17, 13), time
185
-
207
+
186
208
  time = parse_now("13:45")
187
209
  assert_equal Time.local(2006, 8, 17, 13, 45), time
188
-
210
+
189
211
  time = parse_now("november")
190
212
  assert_equal Time.local(2006, 11, 16), time
191
213
  end
192
-
214
+
193
215
  def test_parse_guess_rr
194
216
  time = parse_now("friday 13:00")
195
217
  assert_equal Time.local(2006, 8, 18, 13), time
196
-
218
+
197
219
  time = parse_now("monday 4:00")
198
220
  assert_equal Time.local(2006, 8, 21, 16), time
199
-
221
+
200
222
  time = parse_now("sat 4:00", :ambiguous_time_range => :none)
201
223
  assert_equal Time.local(2006, 8, 19, 4), time
202
-
224
+
203
225
  time = parse_now("sunday 4:20", :ambiguous_time_range => :none)
204
226
  assert_equal Time.local(2006, 8, 20, 4, 20), time
205
-
227
+
206
228
  time = parse_now("4 pm")
207
229
  assert_equal Time.local(2006, 8, 16, 16), time
208
-
230
+
209
231
  time = parse_now("4 am", :ambiguous_time_range => :none)
210
232
  assert_equal Time.local(2006, 8, 16, 4), time
211
-
233
+
212
234
  time = parse_now("12 pm")
213
235
  assert_equal Time.local(2006, 8, 16, 12), time
214
-
236
+
215
237
  time = parse_now("12:01 pm")
216
238
  assert_equal Time.local(2006, 8, 16, 12, 1), time
217
-
239
+
218
240
  time = parse_now("12:01 am")
219
241
  assert_equal Time.local(2006, 8, 16, 0, 1), time
220
-
242
+
221
243
  time = parse_now("12 am")
222
244
  assert_equal Time.local(2006, 8, 16), time
223
-
245
+
224
246
  time = parse_now("4:00 in the morning")
225
247
  assert_equal Time.local(2006, 8, 16, 4), time
226
-
248
+
227
249
  time = parse_now("november 4")
228
250
  assert_equal Time.local(2006, 11, 4, 12), time
229
-
251
+
230
252
  time = parse_now("aug 24")
231
253
  assert_equal Time.local(2006, 8, 24, 12), time
232
254
  end
233
-
255
+
234
256
  def test_parse_guess_rrr
235
257
  time = parse_now("friday 1 pm")
236
258
  assert_equal Time.local(2006, 8, 18, 13), time
237
-
259
+
238
260
  time = parse_now("friday 11 at night")
239
261
  assert_equal Time.local(2006, 8, 18, 23), time
240
-
262
+
241
263
  time = parse_now("friday 11 in the evening")
242
264
  assert_equal Time.local(2006, 8, 18, 23), time
243
-
265
+
244
266
  time = parse_now("sunday 6am")
245
267
  assert_equal Time.local(2006, 8, 20, 6), time
246
-
268
+
247
269
  time = parse_now("friday evening at 7")
248
270
  assert_equal Time.local(2006, 8, 18, 19), time
249
271
  end
250
-
272
+
251
273
  def test_parse_guess_gr
252
274
  # year
253
-
275
+
254
276
  time = parse_now("this year")
255
277
  assert_equal Time.local(2006, 10, 24, 12, 30), time
256
-
278
+
257
279
  time = parse_now("this year", :context => :past)
258
280
  assert_equal Time.local(2006, 4, 24, 12, 30), time
259
-
281
+
260
282
  # month
261
-
283
+
262
284
  time = parse_now("this month")
263
285
  assert_equal Time.local(2006, 8, 24, 12), time
264
-
286
+
265
287
  time = parse_now("this month", :context => :past)
266
288
  assert_equal Time.local(2006, 8, 8, 12), time
267
-
289
+
268
290
  time = Chronic.parse("next month", :now => Time.local(2006, 11, 15))
269
291
  assert_equal Time.local(2006, 12, 16, 12), time
270
-
292
+
271
293
  # month name
272
-
294
+
273
295
  time = parse_now("last november")
274
296
  assert_equal Time.local(2005, 11, 16), time
275
-
297
+
276
298
  # fortnight
277
-
299
+
278
300
  time = parse_now("this fortnight")
279
301
  assert_equal Time.local(2006, 8, 21, 19, 30), time
280
-
302
+
281
303
  time = parse_now("this fortnight", :context => :past)
282
304
  assert_equal Time.local(2006, 8, 14, 19), time
283
-
305
+
284
306
  # week
285
-
307
+
286
308
  time = parse_now("this week")
287
309
  assert_equal Time.local(2006, 8, 18, 7, 30), time
288
-
310
+
289
311
  time = parse_now("this week", :context => :past)
290
312
  assert_equal Time.local(2006, 8, 14, 19), time
291
-
313
+
292
314
  # weekend
293
-
315
+
294
316
  time = parse_now("this weekend")
295
317
  assert_equal Time.local(2006, 8, 20), time
296
-
318
+
297
319
  time = parse_now("this weekend", :context => :past)
298
320
  assert_equal Time.local(2006, 8, 13), time
299
-
321
+
300
322
  time = parse_now("last weekend")
301
323
  assert_equal Time.local(2006, 8, 13), time
302
-
324
+
303
325
  # day
304
-
326
+
305
327
  time = parse_now("this day")
306
328
  assert_equal Time.local(2006, 8, 16, 19, 30), time
307
-
329
+
308
330
  time = parse_now("this day", :context => :past)
309
331
  assert_equal Time.local(2006, 8, 16, 7), time
310
-
332
+
311
333
  time = parse_now("today")
312
334
  assert_equal Time.local(2006, 8, 16, 19, 30), time
313
-
335
+
314
336
  time = parse_now("yesterday")
315
337
  assert_equal Time.local(2006, 8, 15, 12), time
316
-
338
+
317
339
  time = parse_now("tomorrow")
318
340
  assert_equal Time.local(2006, 8, 17, 12), time
319
-
341
+
320
342
  # day name
321
-
343
+
322
344
  time = parse_now("this tuesday")
323
345
  assert_equal Time.local(2006, 8, 22, 12), time
324
-
346
+
325
347
  time = parse_now("next tuesday")
326
348
  assert_equal Time.local(2006, 8, 22, 12), time
327
-
349
+
328
350
  time = parse_now("last tuesday")
329
351
  assert_equal Time.local(2006, 8, 15, 12), time
330
-
352
+
331
353
  time = parse_now("this wed")
332
354
  assert_equal Time.local(2006, 8, 23, 12), time
333
-
355
+
334
356
  time = parse_now("next wed")
335
357
  assert_equal Time.local(2006, 8, 23, 12), time
336
-
358
+
337
359
  time = parse_now("last wed")
338
360
  assert_equal Time.local(2006, 8, 9, 12), time
339
-
361
+
340
362
  # day portion
341
-
363
+
342
364
  time = parse_now("this morning")
343
365
  assert_equal Time.local(2006, 8, 16, 9), time
344
-
366
+
345
367
  time = parse_now("tonight")
346
368
  assert_equal Time.local(2006, 8, 16, 22), time
347
-
369
+
348
370
  # minute
349
-
371
+
350
372
  time = parse_now("next minute")
351
373
  assert_equal Time.local(2006, 8, 16, 14, 1, 30), time
352
-
374
+
353
375
  # second
354
-
376
+
355
377
  time = parse_now("this second")
356
378
  assert_equal Time.local(2006, 8, 16, 14), time
357
-
379
+
358
380
  time = parse_now("this second", :context => :past)
359
381
  assert_equal Time.local(2006, 8, 16, 14), time
360
-
382
+
361
383
  time = parse_now("next second")
362
384
  assert_equal Time.local(2006, 8, 16, 14, 0, 1), time
363
-
385
+
364
386
  time = parse_now("last second")
365
387
  assert_equal Time.local(2006, 8, 16, 13, 59, 59), time
366
388
  end
367
-
368
- def test_parse_guess_grr
389
+
390
+ def test_parse_guess_grr
369
391
  time = parse_now("yesterday at 4:00")
370
392
  assert_equal Time.local(2006, 8, 15, 16), time
371
-
393
+
372
394
  time = parse_now("today at 9:00")
373
395
  assert_equal Time.local(2006, 8, 16, 9), time
374
-
396
+
375
397
  time = parse_now("today at 2100")
376
398
  assert_equal Time.local(2006, 8, 16, 21), time
377
-
399
+
378
400
  time = parse_now("this day at 0900")
379
401
  assert_equal Time.local(2006, 8, 16, 9), time
380
-
402
+
381
403
  time = parse_now("tomorrow at 0900")
382
404
  assert_equal Time.local(2006, 8, 17, 9), time
383
-
405
+
384
406
  time = parse_now("yesterday at 4:00", :ambiguous_time_range => :none)
385
407
  assert_equal Time.local(2006, 8, 15, 4), time
386
-
408
+
387
409
  time = parse_now("last friday at 4:00")
388
410
  assert_equal Time.local(2006, 8, 11, 16), time
389
-
411
+
390
412
  time = parse_now("next wed 4:00")
391
413
  assert_equal Time.local(2006, 8, 23, 16), time
392
-
414
+
393
415
  time = parse_now("yesterday afternoon")
394
416
  assert_equal Time.local(2006, 8, 15, 15), time
395
-
417
+
396
418
  time = parse_now("last week tuesday")
397
419
  assert_equal Time.local(2006, 8, 8, 12), time
398
-
420
+
399
421
  time = parse_now("tonight at 7")
400
422
  assert_equal Time.local(2006, 8, 16, 19), time
401
-
423
+
402
424
  time = parse_now("tonight 7")
403
425
  assert_equal Time.local(2006, 8, 16, 19), time
404
-
426
+
405
427
  time = parse_now("7 tonight")
406
428
  assert_equal Time.local(2006, 8, 16, 19), time
407
429
  end
408
-
430
+
409
431
  def test_parse_guess_grrr
410
432
  time = parse_now("today at 6:00pm")
411
433
  assert_equal Time.local(2006, 8, 16, 18), time
412
-
434
+
413
435
  time = parse_now("today at 6:00am")
414
436
  assert_equal Time.local(2006, 8, 16, 6), time
415
-
437
+
416
438
  time = parse_now("this day 1800")
417
439
  assert_equal Time.local(2006, 8, 16, 18), time
418
-
440
+
419
441
  time = parse_now("yesterday at 4:00pm")
420
442
  assert_equal Time.local(2006, 8, 15, 16), time
421
-
443
+
422
444
  time = parse_now("tomorrow evening at 7")
423
445
  assert_equal Time.local(2006, 8, 17, 19), time
424
-
446
+
425
447
  time = parse_now("tomorrow morning at 5:30")
426
448
  assert_equal Time.local(2006, 8, 17, 5, 30), time
427
-
449
+
428
450
  time = parse_now("next monday at 12:01 am")
429
451
  assert_equal Time.local(2006, 8, 21, 00, 1), time
430
-
452
+
431
453
  time = parse_now("next monday at 12:01 pm")
432
454
  assert_equal Time.local(2006, 8, 21, 12, 1), time
433
455
  end
434
-
456
+
435
457
  def test_parse_guess_rgr
436
458
  time = parse_now("afternoon yesterday")
437
459
  assert_equal Time.local(2006, 8, 15, 15), time
438
-
460
+
439
461
  time = parse_now("tuesday last week")
440
462
  assert_equal Time.local(2006, 8, 8, 12), time
441
463
  end
442
-
464
+
443
465
  def test_parse_guess_s_r_p
444
466
  # past
445
-
467
+
446
468
  time = parse_now("3 years ago")
447
469
  assert_equal Time.local(2003, 8, 16, 14), time
448
-
470
+
449
471
  time = parse_now("1 month ago")
450
472
  assert_equal Time.local(2006, 7, 16, 14), time
451
-
473
+
452
474
  time = parse_now("1 fortnight ago")
453
475
  assert_equal Time.local(2006, 8, 2, 14), time
454
-
476
+
455
477
  time = parse_now("2 fortnights ago")
456
478
  assert_equal Time.local(2006, 7, 19, 14), time
457
-
479
+
458
480
  time = parse_now("3 weeks ago")
459
481
  assert_equal Time.local(2006, 7, 26, 14), time
460
-
482
+
461
483
  time = parse_now("2 weekends ago")
462
484
  assert_equal Time.local(2006, 8, 5), time
463
-
485
+
464
486
  time = parse_now("3 days ago")
465
487
  assert_equal Time.local(2006, 8, 13, 14), time
466
-
488
+
467
489
  #time = parse_now("1 monday ago")
468
490
  #assert_equal Time.local(2006, 8, 14, 12), time
469
-
491
+
470
492
  time = parse_now("5 mornings ago")
471
493
  assert_equal Time.local(2006, 8, 12, 9), time
472
-
494
+
473
495
  time = parse_now("7 hours ago")
474
496
  assert_equal Time.local(2006, 8, 16, 7), time
475
-
497
+
476
498
  time = parse_now("3 minutes ago")
477
499
  assert_equal Time.local(2006, 8, 16, 13, 57), time
478
-
500
+
479
501
  time = parse_now("20 seconds before now")
480
502
  assert_equal Time.local(2006, 8, 16, 13, 59, 40), time
481
503
 
482
504
  # future
483
-
505
+
484
506
  time = parse_now("3 years from now")
485
507
  assert_equal Time.local(2009, 8, 16, 14, 0, 0), time
486
-
508
+
487
509
  time = parse_now("6 months hence")
488
510
  assert_equal Time.local(2007, 2, 16, 14), time
489
-
511
+
490
512
  time = parse_now("3 fortnights hence")
491
513
  assert_equal Time.local(2006, 9, 27, 14), time
492
-
514
+
493
515
  time = parse_now("1 week from now")
494
516
  assert_equal Time.local(2006, 8, 23, 14, 0, 0), time
495
-
517
+
496
518
  time = parse_now("1 weekend from now")
497
519
  assert_equal Time.local(2006, 8, 19), time
498
-
520
+
499
521
  time = parse_now("2 weekends from now")
500
522
  assert_equal Time.local(2006, 8, 26), time
501
-
523
+
502
524
  time = parse_now("1 day hence")
503
525
  assert_equal Time.local(2006, 8, 17, 14), time
504
-
526
+
505
527
  time = parse_now("5 mornings hence")
506
528
  assert_equal Time.local(2006, 8, 21, 9), time
507
-
529
+
508
530
  time = parse_now("1 hour from now")
509
531
  assert_equal Time.local(2006, 8, 16, 15), time
510
-
532
+
511
533
  time = parse_now("20 minutes hence")
512
534
  assert_equal Time.local(2006, 8, 16, 14, 20), time
513
-
535
+
514
536
  time = parse_now("20 seconds from now")
515
537
  assert_equal Time.local(2006, 8, 16, 14, 0, 20), time
516
-
538
+
517
539
  time = Chronic.parse("2 months ago", :now => Time.parse("2007-03-07 23:30"))
518
540
  assert_equal Time.local(2007, 1, 7, 23, 30), time
519
541
  end
520
-
542
+
521
543
  def test_parse_guess_p_s_r
522
544
  time = parse_now("in 3 hours")
523
545
  assert_equal Time.local(2006, 8, 16, 17), time
524
546
  end
525
-
547
+
526
548
  def test_parse_guess_s_r_p_a
527
549
  # past
528
-
550
+
529
551
  time = parse_now("3 years ago tomorrow")
530
552
  assert_equal Time.local(2003, 8, 17, 12), time
531
-
553
+
532
554
  time = parse_now("3 years ago this friday")
533
555
  assert_equal Time.local(2003, 8, 18, 12), time
534
-
556
+
535
557
  time = parse_now("3 months ago saturday at 5:00 pm")
536
558
  assert_equal Time.local(2006, 5, 19, 17), time
537
-
559
+
538
560
  time = parse_now("2 days from this second")
539
561
  assert_equal Time.local(2006, 8, 18, 14), time
540
-
562
+
541
563
  time = parse_now("7 hours before tomorrow at midnight")
542
564
  assert_equal Time.local(2006, 8, 17, 17), time
543
-
565
+
544
566
  # future
545
567
  end
546
-
568
+
547
569
  def test_parse_guess_o_r_s_r
548
570
  time = parse_now("3rd wednesday in november")
549
571
  assert_equal Time.local(2006, 11, 15, 12), time
550
-
572
+
551
573
  time = parse_now("10th wednesday in november")
552
574
  assert_equal nil, time
553
-
575
+
554
576
  # time = parse_now("3rd wednesday in 2007")
555
577
  # assert_equal Time.local(2007, 1, 20, 12), time
556
578
  end
557
-
579
+
558
580
  def test_parse_guess_o_r_g_r
559
581
  time = parse_now("3rd month next year")
560
582
  assert_equal Time.local(2007, 3, 16, 12, 30), time
561
-
583
+
562
584
  time = parse_now("3rd thursday this september")
563
585
  assert_equal Time.local(2006, 9, 21, 12), time
564
-
586
+
565
587
  time = parse_now("4th day last week")
566
588
  assert_equal Time.local(2006, 8, 9, 12), time
567
589
  end
568
-
590
+
569
591
  def test_parse_guess_nonsense
570
592
  time = parse_now("some stupid nonsense")
571
593
  assert_equal nil, time
594
+
595
+ time = parse_now("Ham Sandwich")
596
+ assert_equal nil, time
572
597
  end
573
-
598
+
574
599
  def test_parse_span
575
600
  span = parse_now("friday", :guess => false)
576
601
  assert_equal Time.local(2006, 8, 18), span.begin
577
602
  assert_equal Time.local(2006, 8, 19), span.end
578
-
603
+
579
604
  span = parse_now("november", :guess => false)
580
605
  assert_equal Time.local(2006, 11), span.begin
581
606
  assert_equal Time.local(2006, 12), span.end
582
-
607
+
583
608
  span = Chronic.parse("weekend" , :now => @time_2006_08_16_14_00_00, :guess => false)
584
609
  assert_equal Time.local(2006, 8, 19), span.begin
585
610
  assert_equal Time.local(2006, 8, 21), span.end
586
611
  end
587
-
612
+
613
+ def test_parse_with_endian_precedence
614
+ date = '11/02/2007'
615
+
616
+ expect_for_middle_endian = Time.local(2007, 11, 2, 12)
617
+ expect_for_little_endian = Time.local(2007, 2, 11, 12)
618
+
619
+ # default precedence should be toward middle endianness
620
+ assert_equal expect_for_middle_endian, Chronic.parse(date)
621
+
622
+ assert_equal expect_for_middle_endian, Chronic.parse(date, :endian_precedence => [:middle, :little])
623
+
624
+ assert_equal expect_for_little_endian, Chronic.parse(date, :endian_precedence => [:little, :middle])
625
+ end
626
+
588
627
  def test_parse_words
589
628
  assert_equal parse_now("33 days from now"), parse_now("thirty-three days from now")
590
629
  assert_equal parse_now("2867532 seconds from now"), parse_now("two million eight hundred and sixty seven thousand five hundred and thirty two seconds from now")
591
630
  assert_equal parse_now("may 10th"), parse_now("may tenth")
592
631
  end
593
-
632
+
594
633
  def test_parse_only_complete_pointers
595
634
  assert_equal parse_now("eat pasty buns today at 2pm"), @time_2006_08_16_14_00_00
596
635
  assert_equal parse_now("futuristically speaking today at 2pm"), @time_2006_08_16_14_00_00
597
636
  assert_equal parse_now("meeting today at 2pm"), @time_2006_08_16_14_00_00
598
637
  end
599
-
638
+
639
+ def test_am_pm
640
+ assert_equal Time.local(2006, 8, 16), parse_now("8/16/2006 at 12am")
641
+ assert_equal Time.local(2006, 8, 16, 12), parse_now("8/16/2006 at 12pm")
642
+ end
643
+
644
+ def test_a_p
645
+ assert_equal Time.local(2006, 8, 16, 0, 15), parse_now("8/16/2006 at 12:15a")
646
+ assert_equal Time.local(2006, 8, 16, 18, 30), parse_now("8/16/2006 at 6:30p")
647
+ end
648
+
600
649
  def test_argument_validation
601
650
  assert_raise(Chronic::InvalidArgumentException) do
602
651
  time = Chronic.parse("may 27", :foo => :bar)
603
652
  end
604
-
653
+
605
654
  assert_raise(Chronic::InvalidArgumentException) do
606
655
  time = Chronic.parse("may 27", :context => :bar)
607
656
  end
608
657
  end
609
-
658
+
659
+ def test_seasons
660
+ t = parse_now("this spring", :guess => false)
661
+ assert_equal Time.local(2007, 3, 20), t.begin
662
+ assert_equal Time.local(2007, 6, 20), t.end
663
+
664
+ t = parse_now("this winter", :guess => false)
665
+ assert_equal Time.local(2006, 12, 22, 23), t.begin
666
+ assert_equal Time.local(2007, 3, 19), t.end
667
+
668
+ t = parse_now("last spring", :guess => false)
669
+ assert_equal Time.local(2006, 3, 20, 23), t.begin
670
+ assert_equal Time.local(2006, 6, 20), t.end
671
+
672
+ t = parse_now("last winter", :guess => false)
673
+ assert_equal Time.local(2005, 12, 22, 23), t.begin
674
+ assert_equal Time.local(2006, 3, 19, 23), t.end
675
+
676
+ t = parse_now("next spring", :guess => false)
677
+ assert_equal Time.local(2007, 3, 20), t.begin
678
+ assert_equal Time.local(2007, 6, 20), t.end
679
+ end
680
+
681
+ # regression
682
+
683
+ # def test_partial
684
+ # assert_equal '', parse_now("2 hours")
685
+ # end
686
+
687
+ def test_days_in_november
688
+ t1 = Chronic.parse('1st thursday in november', :now => Time.local(2007))
689
+ assert_equal Time.local(2007, 11, 1, 12), t1
690
+
691
+ t1 = Chronic.parse('1st friday in november', :now => Time.local(2007))
692
+ assert_equal Time.local(2007, 11, 2, 12), t1
693
+
694
+ t1 = Chronic.parse('1st saturday in november', :now => Time.local(2007))
695
+ assert_equal Time.local(2007, 11, 3, 12), t1
696
+
697
+ t1 = Chronic.parse('1st sunday in november', :now => Time.local(2007))
698
+ assert_equal Time.local(2007, 11, 4, 11), t1
699
+
700
+ # Chronic.debug = true
701
+ #
702
+ # t1 = Chronic.parse('1st monday in november', :now => Time.local(2007))
703
+ # assert_equal Time.local(2007, 11, 5, 11), t1
704
+ end
705
+
610
706
  private
611
707
  def parse_now(string, options={})
612
708
  Chronic.parse(string, {:now => TIME_2006_08_16_14_00_00 }.merge(options))
613
709
  end
614
- end
710
+ end