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