chronic 0.8.0 → 0.9.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.
data/test/test_handler.rb CHANGED
@@ -7,18 +7,22 @@ class TestHandler < TestCase
7
7
  @now = Time.local(2006, 8, 16, 14, 0, 0, 0)
8
8
  end
9
9
 
10
+ def definitions
11
+ @definitions ||= Chronic::Parser.new.definitions
12
+ end
13
+
10
14
  def test_handler_class_1
11
15
  handler = Chronic::Handler.new([:repeater], :handler)
12
16
 
13
17
  tokens = [Chronic::Token.new('friday')]
14
18
  tokens[0].tag(Chronic::RepeaterDayName.new(:friday))
15
19
 
16
- assert handler.match(tokens, Chronic.definitions)
20
+ assert handler.match(tokens, definitions)
17
21
 
18
22
  tokens << Chronic::Token.new('afternoon')
19
23
  tokens[1].tag(Chronic::RepeaterDayPortion.new(:afternoon))
20
24
 
21
- assert !handler.match(tokens, Chronic.definitions)
25
+ assert !handler.match(tokens, definitions)
22
26
  end
23
27
 
24
28
  def test_handler_class_2
@@ -27,17 +31,17 @@ class TestHandler < TestCase
27
31
  tokens = [Chronic::Token.new('friday')]
28
32
  tokens[0].tag(Chronic::RepeaterDayName.new(:friday))
29
33
 
30
- assert handler.match(tokens, Chronic.definitions)
34
+ assert handler.match(tokens, definitions)
31
35
 
32
36
  tokens << Chronic::Token.new('afternoon')
33
37
  tokens[1].tag(Chronic::RepeaterDayPortion.new(:afternoon))
34
38
 
35
- assert handler.match(tokens, Chronic.definitions)
39
+ assert handler.match(tokens, definitions)
36
40
 
37
41
  tokens << Chronic::Token.new('afternoon')
38
42
  tokens[2].tag(Chronic::RepeaterDayPortion.new(:afternoon))
39
43
 
40
- assert !handler.match(tokens, Chronic.definitions)
44
+ assert !handler.match(tokens, definitions)
41
45
  end
42
46
 
43
47
  def test_handler_class_3
@@ -46,12 +50,12 @@ class TestHandler < TestCase
46
50
  tokens = [Chronic::Token.new('friday')]
47
51
  tokens[0].tag(Chronic::RepeaterDayName.new(:friday))
48
52
 
49
- assert handler.match(tokens, Chronic.definitions)
53
+ assert handler.match(tokens, definitions)
50
54
 
51
55
  tokens << Chronic::Token.new('afternoon')
52
56
  tokens[1].tag(Chronic::RepeaterDayPortion.new(:afternoon))
53
57
 
54
- assert !handler.match(tokens, Chronic.definitions)
58
+ assert !handler.match(tokens, definitions)
55
59
  end
56
60
 
57
61
  def test_handler_class_4
@@ -60,12 +64,12 @@ class TestHandler < TestCase
60
64
  tokens = [Chronic::Token.new('may')]
61
65
  tokens[0].tag(Chronic::RepeaterMonthName.new(:may))
62
66
 
63
- assert !handler.match(tokens, Chronic.definitions)
67
+ assert !handler.match(tokens, definitions)
64
68
 
65
69
  tokens << Chronic::Token.new('27')
66
70
  tokens[1].tag(Chronic::ScalarDay.new(27))
67
71
 
68
- assert handler.match(tokens, Chronic.definitions)
72
+ assert handler.match(tokens, definitions)
69
73
  end
70
74
 
71
75
  def test_handler_class_5
@@ -74,17 +78,17 @@ class TestHandler < TestCase
74
78
  tokens = [Chronic::Token.new('friday')]
75
79
  tokens[0].tag(Chronic::RepeaterDayName.new(:friday))
76
80
 
77
- assert handler.match(tokens, Chronic.definitions)
81
+ assert handler.match(tokens, definitions)
78
82
 
79
83
  tokens << Chronic::Token.new('5:00')
80
84
  tokens[1].tag(Chronic::RepeaterTime.new('5:00'))
81
85
 
82
- assert handler.match(tokens, Chronic.definitions)
86
+ assert handler.match(tokens, definitions)
83
87
 
84
88
  tokens << Chronic::Token.new('pm')
85
89
  tokens[2].tag(Chronic::RepeaterDayPortion.new(:pm))
86
90
 
87
- assert handler.match(tokens, Chronic.definitions)
91
+ assert handler.match(tokens, definitions)
88
92
  end
89
93
 
90
94
  def test_handler_class_6
@@ -98,7 +102,7 @@ class TestHandler < TestCase
98
102
  tokens[1].tag(Chronic::RepeaterYear.new(:year))
99
103
  tokens[2].tag(Chronic::Pointer.new(:past))
100
104
 
101
- assert handler.match(tokens, Chronic.definitions)
105
+ assert handler.match(tokens, definitions)
102
106
  end
103
107
 
104
108
  end
@@ -57,12 +57,26 @@ class ParseNumbersTest < TestCase
57
57
  'second day' => '2nd day',
58
58
  'second of may' => '2nd of may',
59
59
  'fifth' => '5th',
60
+ 'twelfth' => '12th',
61
+ 'twentieth' => '20th',
62
+ 'thirtieth' => '30th',
63
+ 'fourtieth' => '40th',
64
+ 'fiftieth' => '50th',
65
+ 'sixtieth' => '60th',
66
+ 'seventieth' => '70th',
67
+ 'eightieth' => '80th',
68
+ 'ninetieth' => '90th',
69
+ 'hundredth' => '100th',
70
+ 'thousandth' => '1000th',
71
+ 'millionth' => '1000000th',
72
+ 'billionth' => '1000000000th',
73
+ 'trillionth' => '1000000000000th',
60
74
  'twenty third' => '23rd',
61
75
  'first day month two' => '1st day month 2'
62
76
  }.each do |key, val|
63
77
  # Use pre_normalize here instead of Numerizer directly because
64
78
  # pre_normalize deals with parsing 'second' appropriately
65
- assert_equal val, Chronic.pre_normalize(key)
79
+ assert_equal val, Chronic::Parser.new.pre_normalize(key)
66
80
  end
67
81
  end
68
82
 
data/test/test_parsing.rb CHANGED
@@ -9,11 +9,21 @@ class TestParsing < TestCase
9
9
  end
10
10
 
11
11
  def test_handle_generic
12
- time = Chronic.parse("2012-08-02T12:00:00+01:00")
13
- assert_equal Time.local(2012, 8, 2, 12), time
12
+ time = Chronic.parse("2012-08-02T13:00:00")
13
+ assert_equal Time.local(2012, 8, 2, 13), time
14
+
15
+ time = Chronic.parse("2012-08-02T13:00:00+01:00")
16
+ assert_equal Time.utc(2012, 8, 2, 12), time
17
+
18
+ time = Chronic.parse("2012-08-02T08:00:00-04:00")
19
+ assert_equal Time.utc(2012, 8, 2, 12), time
14
20
 
15
21
  time = Chronic.parse("2012-08-02T12:00:00Z")
16
22
  assert_equal Time.utc(2012, 8, 2, 12), time
23
+
24
+ time = Chronic.parse("2012-01-03 01:00:00.100")
25
+ time2 = Time.parse("2012-01-03 01:00:00.100")
26
+ assert_equal time, time2
17
27
  end
18
28
 
19
29
  def test_handle_rmn_sd
@@ -23,9 +33,15 @@ class TestParsing < TestCase
23
33
  time = parse_now("aug 3", :context => :past)
24
34
  assert_equal Time.local(2006, 8, 3, 12), time
25
35
 
36
+ time = parse_now("aug. 3")
37
+ assert_equal Time.local(2006, 8, 3, 12), time
38
+
26
39
  time = parse_now("aug 20")
27
40
  assert_equal Time.local(2006, 8, 20, 12), time
28
41
 
42
+ time = parse_now("aug-20")
43
+ assert_equal Time.local(2006, 8, 20, 12), time
44
+
29
45
  time = parse_now("aug 20", :context => :future)
30
46
  assert_equal Time.local(2006, 8, 20, 12), time
31
47
 
@@ -98,6 +114,12 @@ class TestParsing < TestCase
98
114
  time = parse_now("22 February")
99
115
  assert_equal Time.local(2007, 2, 22, 12), time
100
116
 
117
+ time = parse_now("22 feb")
118
+ assert_equal Time.local(2007, 2, 22, 12), time
119
+
120
+ time = parse_now("22-feb")
121
+ assert_equal Time.local(2007, 2, 22, 12), time
122
+
101
123
  time = parse_now("31 of may at 6:30pm")
102
124
  assert_equal Time.local(2007, 5, 31, 18, 30), time
103
125
 
@@ -182,6 +204,9 @@ class TestParsing < TestCase
182
204
 
183
205
  time = parse_now("may 27 32")
184
206
  assert_equal Time.local(2032, 5, 27, 12, 0, 0), time
207
+
208
+ time = parse_now("oct 5 2012 1045pm")
209
+ assert_equal Time.local(2012, 10, 5, 22, 45), time
185
210
  end
186
211
 
187
212
  def test_handle_rmn_od_sy
@@ -302,19 +327,29 @@ class TestParsing < TestCase
302
327
 
303
328
  def test_handle_sm_sd
304
329
  time = parse_now("05/06")
305
- assert_equal Time.local(2006, 5, 6, 12), time
330
+ assert_equal Time.local(2007, 5, 6, 12), time
306
331
 
307
332
  time = parse_now("05/06", :endian_precedence => [:little, :medium])
308
- assert_equal Time.local(2006, 6, 5, 12), time
333
+ assert_equal Time.local(2007, 6, 5, 12), time
309
334
 
310
335
  time = parse_now("05/06 6:05:57 PM")
311
- assert_equal Time.local(2006, 5, 6, 18, 05, 57), time
336
+ assert_equal Time.local(2007, 5, 6, 18, 05, 57), time
312
337
 
313
338
  time = parse_now("05/06 6:05:57 PM", :endian_precedence => [:little, :medium])
314
- assert_equal Time.local(2006, 6, 5, 18, 05, 57), time
339
+ assert_equal Time.local(2007, 6, 5, 18, 05, 57), time
340
+
341
+ time = parse_now("13/09")
342
+ assert_equal Time.local(2006, 9, 13, 12), time
315
343
 
316
- time = parse_now("13/01")
317
- assert_equal Time.local(2006, 1, 13, 12), time
344
+ # future
345
+ time = parse_now("05/06") # future is default context
346
+ assert_equal Time.local(2007, 5, 6, 12), time
347
+
348
+ time = parse_now("1/13", :context => :future)
349
+ assert_equal Time.local(2007, 1, 13, 12), time
350
+
351
+ time = parse_now("3/13", :context => :none)
352
+ assert_equal Time.local(2006, 3, 13, 12), time
318
353
  end
319
354
 
320
355
  # def test_handle_sm_sy
@@ -328,12 +363,26 @@ class TestParsing < TestCase
328
363
  # assert_equal nil, time
329
364
  # end
330
365
 
366
+ def test_handle_sy_sm
367
+ time = parse_now("2012-06")
368
+ assert_equal Time.local(2012, 06, 16), time
369
+
370
+ time = parse_now("2013/11")
371
+ assert_equal Time.local(2013, 11, 16), time
372
+ end
373
+
331
374
  def test_handle_r
332
375
  time = parse_now("9am on Saturday")
333
376
  assert_equal Time.local(2006, 8, 19, 9), time
334
377
 
335
378
  time = parse_now("on Tuesday")
336
379
  assert_equal Time.local(2006, 8, 22, 12), time
380
+
381
+ time = parse_now("1:00:00 PM")
382
+ assert_equal Time.local(2006, 8, 16, 13), time
383
+
384
+ time = parse_now("01:00:00 PM")
385
+ assert_equal Time.local(2006, 8, 16, 13), time
337
386
  end
338
387
 
339
388
  def test_handle_r_g_r
@@ -402,6 +451,9 @@ class TestParsing < TestCase
402
451
  def test_handle_sm_rmn_sy
403
452
  time = parse_now('30-Mar-11')
404
453
  assert_equal Time.local(2011, 3, 30, 12), time
454
+
455
+ time = parse_now('31-Aug-12')
456
+ assert_equal Time.local(2012, 8, 31), time
405
457
  end
406
458
 
407
459
  # end of testing handlers
@@ -834,6 +886,16 @@ class TestParsing < TestCase
834
886
 
835
887
  time = Chronic.parse("2 months ago", :now => Time.parse("2007-03-07 23:30"))
836
888
  assert_equal Time.local(2007, 1, 7, 23, 30), time
889
+
890
+ # Two repeaters
891
+ time = parse_now("25 minutes and 20 seconds from now")
892
+ assert_equal Time.local(2006, 8, 16, 14, 25, 20), time
893
+
894
+ time = parse_now("24 hours and 20 minutes from now")
895
+ assert_equal Time.local(2006, 8, 17, 14, 20, 0), time
896
+
897
+ time = parse_now("24 hours 20 minutes from now")
898
+ assert_equal Time.local(2006, 8, 17, 14, 20, 0), time
837
899
  end
838
900
 
839
901
  def test_parse_guess_p_s_r
@@ -923,6 +985,27 @@ class TestParsing < TestCase
923
985
  assert_equal parse_now("second monday in january"), parse_now("2nd monday in january")
924
986
  end
925
987
 
988
+ def test_relative_to_an_hour_before
989
+ # example prenormalization "10 to 2" becomes "10 minutes past 2"
990
+ assert_equal Time.local(2006, 8, 16, 13, 50), parse_now("10 to 2")
991
+ assert_equal Time.local(2006, 8, 16, 13, 50), parse_now("10 till 2")
992
+ assert_equal Time.local(2006, 8, 16, 13, 50), parse_now("10 prior to 2")
993
+ assert_equal Time.local(2006, 8, 16, 13, 50), parse_now("10 before 2")
994
+
995
+ # uses the current hour, so 2006-08-16 13:50:00, not 14:50
996
+ assert_equal Time.local(2006, 8, 16, 13, 50), parse_now("10 to")
997
+ assert_equal Time.local(2006, 8, 16, 13, 50), parse_now("10 till")
998
+
999
+ assert_equal Time.local(2006, 8, 16, 15, 45), parse_now("quarter to 4")
1000
+ end
1001
+
1002
+ def test_relative_to_an_hour_after
1003
+ # not nil
1004
+ assert_equal Time.local(2006, 8, 16, 14, 10), parse_now("10 after 2")
1005
+ assert_equal Time.local(2006, 8, 16, 14, 10), parse_now("10 past 2")
1006
+ assert_equal Time.local(2006, 8, 16, 14, 30), parse_now("half past 2")
1007
+ end
1008
+
926
1009
  def test_parse_only_complete_pointers
927
1010
  assert_equal parse_now("eat pasty buns today at 2pm"), @time_2006_08_16_14_00_00
928
1011
  assert_equal parse_now("futuristically speaking today at 2pm"), @time_2006_08_16_14_00_00
@@ -939,16 +1022,6 @@ class TestParsing < TestCase
939
1022
  assert_equal Time.local(2006, 8, 16, 18, 30), parse_now("8/16/2006 at 6:30p")
940
1023
  end
941
1024
 
942
- def test_argument_validation
943
- assert_raises(ArgumentError) do
944
- time = Chronic.parse("may 27", :foo => :bar)
945
- end
946
-
947
- assert_raises(ArgumentError) do
948
- time = Chronic.parse("may 27", :context => :bar)
949
- end
950
- end
951
-
952
1025
  def test_seasons
953
1026
  t = parse_now("this spring", :guess => false)
954
1027
  assert_equal Time.local(2007, 3, 20), t.begin
@@ -1019,6 +1092,38 @@ class TestParsing < TestCase
1019
1092
  assert_equal Time.local(2006, 12, 31, 12), time
1020
1093
  end
1021
1094
 
1095
+ def test_handle_rdn_rmn_sd_rt
1096
+ time = parse_now("Thu Aug 10 4pm")
1097
+ assert_equal Time.local(2006, 8, 10, 16), time
1098
+
1099
+ time = parse_now("Thu Aug 10 at 4pm")
1100
+ assert_equal Time.local(2006, 8, 10, 16), time
1101
+ end
1102
+
1103
+ def test_handle_rdn_rmn_od_rt
1104
+ time = parse_now("Thu Aug 10th at 4pm")
1105
+ assert_equal Time.local(2006, 8, 10, 16), time
1106
+ end
1107
+
1108
+ def test_handle_rdn_od_rt
1109
+ time = parse_now("Thu 17th at 4pm")
1110
+ assert_equal Time.local(2006, 8, 17, 16), time
1111
+
1112
+ time = parse_now("Thu 16th at 4pm")
1113
+ assert_equal Time.local(2006, 8, 16, 16), time
1114
+
1115
+ time = parse_now("Thu 1st at 4pm")
1116
+ assert_equal Time.local(2006, 9, 1, 16), time
1117
+
1118
+ time = parse_now("Thu 1st at 4pm", :context => :past)
1119
+ assert_equal Time.local(2006, 8, 1, 16), time
1120
+ end
1121
+
1122
+ def test_handle_rdn_od
1123
+ time = parse_now("Thu 17th")
1124
+ assert_equal Time.local(2006, 8, 17, 12), time
1125
+ end
1126
+
1022
1127
  def test_handle_rdn_rmn_sd_sy
1023
1128
  time = parse_now("Thu Aug 10 2006")
1024
1129
  assert_equal Time.local(2006, 8, 10, 12), time
@@ -1044,8 +1149,15 @@ class TestParsing < TestCase
1044
1149
  assert_equal Time.local(2006, 12, 31, 12), time
1045
1150
  end
1046
1151
 
1152
+ def test_normalizing_day_portions
1153
+ assert_equal pre_normalize("8:00 pm February 11"), pre_normalize("8:00 p.m. February 11")
1154
+ end
1155
+
1047
1156
  private
1048
1157
  def parse_now(string, options={})
1049
1158
  Chronic.parse(string, {:now => TIME_2006_08_16_14_00_00 }.merge(options))
1050
1159
  end
1160
+ def pre_normalize(s)
1161
+ Chronic::Parser.new.pre_normalize s
1162
+ end
1051
1163
  end
data/test/test_span.rb CHANGED
@@ -9,7 +9,7 @@ class TestSpan < TestCase
9
9
 
10
10
  def test_span_width
11
11
  span = Chronic::Span.new(Time.local(2006, 8, 16, 0), Time.local(2006, 8, 17, 0))
12
- assert_equal (60 * 60 * 24), span.width
12
+ assert_equal((60 * 60 * 24), span.width)
13
13
  end
14
14
 
15
15
  def test_span_math
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chronic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
5
- prerelease:
4
+ version: 0.9.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Tom Preston-Werner
@@ -10,38 +9,34 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2012-09-16 00:00:00.000000000 Z
12
+ date: 2013-02-25 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: rake
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
- - - ! '>='
18
+ - - '>='
21
19
  - !ruby/object:Gem::Version
22
20
  version: '0'
23
21
  type: :development
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
- - - ! '>='
25
+ - - '>='
29
26
  - !ruby/object:Gem::Version
30
27
  version: '0'
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: minitest
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
- - - ! '>='
32
+ - - '>='
37
33
  - !ruby/object:Gem::Version
38
34
  version: '0'
39
35
  type: :development
40
36
  prerelease: false
41
37
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
38
  requirements:
44
- - - ! '>='
39
+ - - '>='
45
40
  - !ruby/object:Gem::Version
46
41
  version: '0'
47
42
  description: Chronic is a natural language date/time parser written in pure Ruby.
@@ -56,19 +51,20 @@ extra_rdoc_files:
56
51
  - LICENSE
57
52
  files:
58
53
  - .gitignore
54
+ - .travis.yml
59
55
  - HISTORY.md
60
56
  - LICENSE
61
57
  - README.md
62
58
  - Rakefile
63
59
  - chronic.gemspec
64
60
  - lib/chronic.rb
65
- - lib/chronic/chronic.rb
66
61
  - lib/chronic/grabber.rb
67
62
  - lib/chronic/handler.rb
68
63
  - lib/chronic/handlers.rb
69
64
  - lib/chronic/mini_date.rb
70
65
  - lib/chronic/numerizer.rb
71
66
  - lib/chronic/ordinal.rb
67
+ - lib/chronic/parser.rb
72
68
  - lib/chronic/pointer.rb
73
69
  - lib/chronic/repeater.rb
74
70
  - lib/chronic/repeaters/repeater_day.rb
@@ -118,28 +114,27 @@ files:
118
114
  - test/test_token.rb
119
115
  homepage: http://github.com/mojombo/chronic
120
116
  licenses: []
117
+ metadata: {}
121
118
  post_install_message:
122
119
  rdoc_options:
123
120
  - --charset=UTF-8
124
121
  require_paths:
125
122
  - lib
126
123
  required_ruby_version: !ruby/object:Gem::Requirement
127
- none: false
128
124
  requirements:
129
- - - ! '>='
125
+ - - '>='
130
126
  - !ruby/object:Gem::Version
131
127
  version: '0'
132
128
  required_rubygems_version: !ruby/object:Gem::Requirement
133
- none: false
134
129
  requirements:
135
- - - ! '>='
130
+ - - '>='
136
131
  - !ruby/object:Gem::Version
137
132
  version: '0'
138
133
  requirements: []
139
134
  rubyforge_project: chronic
140
- rubygems_version: 1.8.23
135
+ rubygems_version: 2.0.0
141
136
  signing_key:
142
- specification_version: 3
137
+ specification_version: 4
143
138
  summary: Natural language date/time parsing.
144
139
  test_files:
145
140
  - test/helper.rb