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.
- checksums.yaml +7 -0
- data/.travis.yml +8 -0
- data/HISTORY.md +17 -0
- data/README.md +38 -45
- data/lib/chronic/handler.rb +7 -7
- data/lib/chronic/handlers.rb +83 -27
- data/lib/chronic/numerizer.rb +11 -2
- data/lib/chronic/{chronic.rb → parser.rb} +55 -134
- data/lib/chronic/repeater.rb +11 -11
- data/lib/chronic/separator.rb +15 -1
- data/lib/chronic/span.rb +2 -2
- data/lib/chronic/token.rb +4 -0
- data/lib/chronic.rb +96 -69
- data/test/test_chronic.rb +9 -27
- data/test/test_handler.rb +17 -13
- data/test/test_numerizer.rb +15 -1
- data/test/test_parsing.rb +130 -18
- data/test/test_span.rb +1 -1
- metadata +13 -18
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
105
|
+
assert handler.match(tokens, definitions)
|
|
102
106
|
end
|
|
103
107
|
|
|
104
108
|
end
|
data/test/test_numerizer.rb
CHANGED
|
@@ -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-
|
|
13
|
-
assert_equal Time.local(2012, 8, 2,
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
317
|
-
|
|
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
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.
|
|
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:
|
|
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:
|
|
135
|
+
rubygems_version: 2.0.0
|
|
141
136
|
signing_key:
|
|
142
|
-
specification_version:
|
|
137
|
+
specification_version: 4
|
|
143
138
|
summary: Natural language date/time parsing.
|
|
144
139
|
test_files:
|
|
145
140
|
- test/helper.rb
|