chronic 0.4.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY.md CHANGED
@@ -1,9 +1,24 @@
1
- # 0.4.4
1
+ # TBA
2
+
3
+ * Replace commas with spaces instead of removing the char (Thomas Walpole)
4
+ * Added tests for RepeaterSeason
5
+ * Re-factored tests. Now rather than having a test_parsing method for testing
6
+ all handlers, break them down independent of handler method. For example
7
+ with handler `handle_sm_sd_sy` the subsequent test would be
8
+ `test_handle_sm_sd_sy`
9
+ * Added support for parsing ordinal-dates/month-names/year, ie:
10
+ `2nd of May 1995`
11
+ * Added support for parsing ordinal-dates and month names, ie:
12
+ `22nd of February at 6:30pm`
13
+ * Fix `Time.construct` leap year checking. Instead use `Date.leap?(year)`
14
+
15
+ # 0.4.4 / 2011-06-12
2
16
 
3
17
  * Fix RepeaterYear for fetching past year offsets when the current day is
4
18
  later than the last day of the same month in a past year (leap years) ie
5
19
  on 29th/feb (leap year) `last year` should (and now does) return 28th/feb
6
20
  instead of 1st/march
21
+ * Opt in for gem testing http://test.rubygems.org/
7
22
 
8
23
  # 0.4.3 / 2011-06-08
9
24
 
@@ -1,3 +1,6 @@
1
+ .gemtest
2
+ .gitignore
3
+ .yardopts
1
4
  HISTORY.md
2
5
  LICENSE
3
6
  Manifest.txt
@@ -30,6 +33,7 @@ lib/chronic/repeaters/repeater_weekday.rb
30
33
  lib/chronic/repeaters/repeater_weekend.rb
31
34
  lib/chronic/repeaters/repeater_year.rb
32
35
  lib/chronic/scalar.rb
36
+ lib/chronic/season.rb
33
37
  lib/chronic/separator.rb
34
38
  lib/chronic/span.rb
35
39
  lib/chronic/tag.rb
@@ -47,6 +51,7 @@ test/test_RepeaterHour.rb
47
51
  test/test_RepeaterMinute.rb
48
52
  test/test_RepeaterMonth.rb
49
53
  test/test_RepeaterMonthName.rb
54
+ test/test_RepeaterSeason.rb
50
55
  test/test_RepeaterTime.rb
51
56
  test/test_RepeaterWeek.rb
52
57
  test/test_RepeaterWeekday.rb
data/README.md CHANGED
@@ -98,10 +98,14 @@ Complex
98
98
  * 3rd month next year
99
99
  * 3rd thursday this september
100
100
  * 4th day last week
101
+ * fourteenth of june 2010 at eleven o'clock in the evening
102
+ * may seventh '97 at three in the morning
101
103
 
102
104
  Specific Dates
103
105
 
104
106
  * January 5
107
+ * 22nd of june
108
+ * 5th may 2017
105
109
  * February twenty first
106
110
  * dec 25
107
111
  * may 27th
@@ -125,6 +129,7 @@ Specific Dates
125
129
  Specific Times (many of the above with an added time)
126
130
 
127
131
  * January 5 at 7pm
132
+ * 22nd of june at 8am
128
133
  * 1979-05-27 05:00:00
129
134
  * etc
130
135
 
@@ -28,7 +28,7 @@ require 'date'
28
28
  #
29
29
  # @author Tom Preston-Werner, Lee Jarvis
30
30
  module Chronic
31
- VERSION = "0.4.4"
31
+ VERSION = "0.5.0"
32
32
 
33
33
  class << self
34
34
 
@@ -77,6 +77,7 @@ require 'chronic/ordinal'
77
77
  require 'chronic/separator'
78
78
  require 'chronic/time_zone'
79
79
  require 'chronic/numerizer'
80
+ require 'chronic/season'
80
81
 
81
82
  require 'chronic/repeater'
82
83
  require 'chronic/repeaters/repeater_year'
@@ -118,10 +119,9 @@ class Time
118
119
  day <= 56 || raise("day must be no more than 56 (makes month resolution easier)")
119
120
  if day > 28
120
121
  # no month ever has fewer than 28 days, so only do this if necessary
121
- leap_year = (year % 4 == 0) && !(year % 100 == 0)
122
122
  leap_year_month_days = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
123
123
  common_year_month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
124
- days_this_month = leap_year ? leap_year_month_days[month - 1] : common_year_month_days[month - 1]
124
+ days_this_month = Date.leap?(year) ? leap_year_month_days[month - 1] : common_year_month_days[month - 1]
125
125
  if day > days_this_month
126
126
  month += day / days_this_month
127
127
  day = day % days_this_month
@@ -111,7 +111,8 @@ module Chronic
111
111
  # @return [String] A new string ready for Chronic to parse
112
112
  def pre_normalize(text)
113
113
  text = text.to_s.downcase
114
- text.gsub!(/['"\.,]/, '')
114
+ text.gsub!(/['"\.]/, '')
115
+ text.gsub!(/,/,' ')
115
116
  text.gsub!(/\bsecond (of|day|month|hour|minute|second)\b/, '2nd \1')
116
117
  text = numericize_numbers(text)
117
118
  text.gsub!(/ \-(\d{4})\b/, ' tzminus\1')
@@ -180,6 +181,8 @@ module Chronic
180
181
  Handler.new([:repeater_month_name, :scalar_day, :separator_at?, 'time?'], :handle_rmn_sd),
181
182
  Handler.new([:repeater_time, :repeater_day_portion?, :separator_on?, :repeater_month_name, :scalar_day], :handle_rmn_sd_on),
182
183
  Handler.new([:repeater_month_name, :ordinal_day, :separator_at?, 'time?'], :handle_rmn_od),
184
+ Handler.new([:ordinal_day, :repeater_month_name, :scalar_year, :separator_at?, 'time?'], :handle_od_rmn_sy),
185
+ Handler.new([:ordinal_day, :repeater_month_name, :separator_at?, 'time?'], :handle_od_rmn),
183
186
  Handler.new([:repeater_time, :repeater_day_portion?, :separator_on?, :repeater_month_name, :ordinal_day], :handle_rmn_od_on),
184
187
  Handler.new([:repeater_month_name, :scalar_year], :handle_rmn_sy),
185
188
  Handler.new([:scalar_day, :repeater_month_name, :scalar_year, :separator_at?, 'time?'], :handle_sd_rmn_sy),
@@ -258,8 +261,7 @@ module Chronic
258
261
  definitions[:arrow].each do |handler|
259
262
  if handler.match(tokens, definitions)
260
263
  puts "-arrow" if Chronic.debug
261
- tags = [SeparatorAt, SeparatorSlashOrDash, SeparatorComma]
262
- good_tokens = tokens.reject { |o| tags.any? { |t| o.get_tag(t) } }
264
+ good_tokens = tokens.reject { |o| o.get_tag(SeparatorAt) || o.get_tag(SeparatorSlashOrDash) || o.get_tag(SeparatorComma) }
263
265
  return Handlers.send(handler.handler_method, good_tokens, options)
264
266
  end
265
267
  end
@@ -31,6 +31,11 @@ module Chronic
31
31
  handle_m_d(tokens[0].get_tag(RepeaterMonthName), tokens[1].get_tag(OrdinalDay).type, tokens[2..tokens.size], options)
32
32
  end
33
33
 
34
+ # Handle ordinal-day/repeater-month-name
35
+ def handle_od_rmn(tokens, options) #:nodoc:
36
+ handle_m_d(tokens[1].get_tag(RepeaterMonthName), tokens[0].get_tag(OrdinalDay).type, tokens[2..tokens.size], options)
37
+ end
38
+
34
39
  # Handle repeater-month-name/ordinal-day with separator-on
35
40
  def handle_rmn_od_on(tokens, options) #:nodoc:
36
41
  if tokens.size > 3
@@ -98,6 +103,22 @@ module Chronic
98
103
  end
99
104
  end
100
105
 
106
+ # Handle oridinal-day/repeater-month-name/scalar-year
107
+ def handle_od_rmn_sy(tokens, options) #:nodoc:
108
+ day = tokens[0].get_tag(OrdinalDay).type
109
+ month = tokens[1].get_tag(RepeaterMonthName).index
110
+ year = tokens[2].get_tag(ScalarYear).type
111
+
112
+ time_tokens = tokens.last(tokens.size - 3)
113
+
114
+ begin
115
+ day_start = Chronic.time_class.local(year, month, day)
116
+ day_or_time(day_start, time_tokens, options)
117
+ rescue ArgumentError
118
+ nil
119
+ end
120
+ end
121
+
101
122
  # Handle scalar-day/repeater-month-name/scalar-year
102
123
  def handle_sd_rmn_sy(tokens, options) #:nodoc:
103
124
  new_tokens = [tokens[1], tokens[0], tokens[2]]
@@ -119,7 +119,7 @@ module Chronic
119
119
 
120
120
  # returns the width (in seconds or months) of this repeatable.
121
121
  def width
122
- raise("Repeatable#width must be overridden in subclasses")
122
+ raise("Repeater#width must be overridden in subclasses")
123
123
  end
124
124
 
125
125
  # returns the next occurance of this repeatable.
@@ -24,25 +24,24 @@ module Chronic
24
24
  super
25
25
 
26
26
  if !@current_month_begin
27
- target_month = symbol_to_number(@type)
28
27
  case pointer
29
28
  when :future
30
- if @now.month < target_month
31
- @current_month_begin = Time.construct(@now.year, target_month)
32
- elsif @now.month > target_month
33
- @current_month_begin = Time.construct(@now.year + 1, target_month)
29
+ if @now.month < index
30
+ @current_month_begin = Time.construct(@now.year, index)
31
+ elsif @now.month > index
32
+ @current_month_begin = Time.construct(@now.year + 1, index)
34
33
  end
35
34
  when :none
36
- if @now.month <= target_month
37
- @current_month_begin = Time.construct(@now.year, target_month)
38
- elsif @now.month > target_month
39
- @current_month_begin = Time.construct(@now.year + 1, target_month)
35
+ if @now.month <= index
36
+ @current_month_begin = Time.construct(@now.year, index)
37
+ elsif @now.month > index
38
+ @current_month_begin = Time.construct(@now.year + 1, index)
40
39
  end
41
40
  when :past
42
- if @now.month >= target_month
43
- @current_month_begin = Time.construct(@now.year, target_month)
44
- elsif @now.month < target_month
45
- @current_month_begin = Time.construct(@now.year - 1, target_month)
41
+ if @now.month >= index
42
+ @current_month_begin = Time.construct(@now.year, index)
43
+ elsif @now.month < index
44
+ @current_month_begin = Time.construct(@now.year - 1, index)
46
45
  end
47
46
  end
48
47
  @current_month_begin || raise("Current month should be set by now")
@@ -85,17 +84,11 @@ module Chronic
85
84
  end
86
85
 
87
86
  def index
88
- symbol_to_number(@type)
87
+ @index ||= MONTHS[@type]
89
88
  end
90
89
 
91
90
  def to_s
92
91
  super << '-monthname-' << @type.to_s
93
92
  end
94
-
95
- private
96
-
97
- def symbol_to_number(sym)
98
- MONTHS[sym] || raise("Invalid symbol specified")
99
- end
100
93
  end
101
94
  end
@@ -1,40 +1,4 @@
1
1
  module Chronic
2
- class Season
3
- # @return [MiniDate]
4
- attr_reader :start
5
-
6
- # @return [MiniDate]
7
- attr_reader :end
8
-
9
- # @param [MiniDate] start_date
10
- # @param [MiniDate] end_date
11
- def initialize(start_date, end_date)
12
- @start = start_date
13
- @end = end_date
14
- end
15
-
16
- # @param [Symbol] season The season name
17
- # @param [Integer] pointer The direction (-1 for past, 1 for future)
18
- # @return [Symbol] The new season name
19
- def self.find_next_season(season, pointer)
20
- lookup = {:spring => 0, :summer => 1, :autumn => 2, :winter => 3}
21
- next_season_num = (lookup[season] + 1 * pointer) % 4
22
- lookup.invert[next_season_num]
23
- end
24
-
25
- # @param [Symbol] season The season name
26
- # @return [Symbol] The new season name
27
- def self.season_after(season)
28
- find_next_season(season, +1)
29
- end
30
-
31
- # @param [Symbol] season The season name
32
- # @return [Symbol] The new season name
33
- def self.season_before(season)
34
- find_next_season(season, -1)
35
- end
36
- end
37
-
38
2
  class RepeaterSeason < Repeater #:nodoc:
39
3
  SEASON_SECONDS = 7_862_400 # 91 * 24 * 60 * 60
40
4
  SEASONS = {
@@ -9,8 +9,6 @@ module Chronic
9
9
  end
10
10
 
11
11
  def this(pointer = :future)
12
- # super
13
-
14
12
  direction = pointer == :future ? 1 : -1
15
13
 
16
14
  today = Time.construct(@now.year, @now.month, @now.day)
@@ -0,0 +1,37 @@
1
+ module Chronic
2
+ class Season
3
+ # @return [MiniDate]
4
+ attr_reader :start
5
+
6
+ # @return [MiniDate]
7
+ attr_reader :end
8
+
9
+ # @param [MiniDate] start_date
10
+ # @param [MiniDate] end_date
11
+ def initialize(start_date, end_date)
12
+ @start = start_date
13
+ @end = end_date
14
+ end
15
+
16
+ # @param [Symbol] season The season name
17
+ # @param [Integer] pointer The direction (-1 for past, 1 for future)
18
+ # @return [Symbol] The new season name
19
+ def self.find_next_season(season, pointer)
20
+ lookup = {:spring => 0, :summer => 1, :autumn => 2, :winter => 3}
21
+ next_season_num = (lookup[season] + 1 * pointer) % 4
22
+ lookup.invert[next_season_num]
23
+ end
24
+
25
+ # @param [Symbol] season The season name
26
+ # @return [Symbol] The new season name
27
+ def self.season_after(season)
28
+ find_next_season(season, +1)
29
+ end
30
+
31
+ # @param [Symbol] season The season name
32
+ # @return [Symbol] The new season name
33
+ def self.season_before(season)
34
+ find_next_season(season, -1)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,40 @@
1
+ require File.join(File.dirname(__FILE__), *%w[helper])
2
+
3
+ class TestRepeaterSeason < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @now = Time.local(2006, 8, 16, 14, 0, 0, 0)
7
+ end
8
+
9
+ def test_next_future
10
+ seasons = Chronic::RepeaterSeason.new(:season)
11
+ seasons.start = @now
12
+
13
+ next_season = seasons.next(:future)
14
+ assert_equal Time.local(2006, 9, 23), next_season.begin
15
+ assert_equal Time.local(2006, 12, 21), next_season.end
16
+ end
17
+
18
+ def test_next_past
19
+ seasons = Chronic::RepeaterSeason.new(:season)
20
+ seasons.start = @now
21
+
22
+ last_season = seasons.next(:past)
23
+ assert_equal Time.local(2006, 3, 20), last_season.begin
24
+ assert_equal Time.local(2006, 6, 20), last_season.end
25
+ end
26
+
27
+ def test_this
28
+ seasons = Chronic::RepeaterSeason.new(:season)
29
+ seasons.start = @now
30
+
31
+ this_season = seasons.this(:future)
32
+ assert_equal Time.local(2006, 8, 17), this_season.begin
33
+ assert_equal Time.local(2006, 9, 22), this_season.end
34
+
35
+ this_season = seasons.this(:past)
36
+ assert_equal Time.local(2006, 6, 21), this_season.begin
37
+ assert_equal Time.local(2006, 8, 16), this_season.end
38
+ end
39
+
40
+ end
@@ -31,7 +31,7 @@ class TestTime < Test::Unit::TestCase
31
31
  assert_equal Time.local(2006, 2, 1), Time.construct(2006, 1, 32)
32
32
  assert_equal Time.local(2006, 3, 5), Time.construct(2006, 2, 33)
33
33
  assert_equal Time.local(2004, 3, 4), Time.construct(2004, 2, 33)
34
- assert_equal Time.local(2000, 3, 5), Time.construct(2000, 2, 33)
34
+ assert_equal Time.local(2000, 3, 4), Time.construct(2000, 2, 33)
35
35
 
36
36
  assert_nothing_raised do
37
37
  Time.construct(2006, 1, 56)
@@ -8,8 +8,21 @@ class TestParsing < Test::Unit::TestCase
8
8
  @time_2006_08_16_14_00_00 = TIME_2006_08_16_14_00_00
9
9
  end
10
10
 
11
- def test_parse_guess_dates
12
- # rm_sd
11
+ def test_parse_m_d
12
+ end
13
+
14
+ def test_handle_rmn_sd
15
+ time = parse_now("aug 3")
16
+ assert_equal Time.local(2006, 8, 3, 12), time
17
+
18
+ time = parse_now("aug 3", :context => :past)
19
+ assert_equal Time.local(2006, 8, 3, 12), time
20
+
21
+ time = parse_now("aug 20")
22
+ assert_equal Time.local(2006, 8, 20, 12), time
23
+
24
+ time = parse_now("aug 20", :context => :future)
25
+ assert_equal Time.local(2006, 8, 20, 12), time
13
26
 
14
27
  time = parse_now("may 27")
15
28
  assert_equal Time.local(2007, 5, 27, 12), time
@@ -25,23 +38,9 @@ class TestParsing < Test::Unit::TestCase
25
38
 
26
39
  time = parse_now("may 28 at 5:32.19pm", :context => :past)
27
40
  assert_equal Time.local(2006, 5, 28, 17, 32, 19), time
41
+ end
28
42
 
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
-
43
+ def test_handle_rmn_sd_on
45
44
  time = parse_now("5pm on may 28")
46
45
  assert_equal Time.local(2007, 5, 28, 17), time
47
46
 
@@ -50,9 +49,9 @@ class TestParsing < Test::Unit::TestCase
50
49
 
51
50
  time = parse_now("5 on may 28", :ambiguous_time_range => :none)
52
51
  assert_equal Time.local(2007, 5, 28, 05), time
52
+ end
53
53
 
54
- # rm_od
55
-
54
+ def test_handle_rmn_od
56
55
  time = parse_now("may 27th")
57
56
  assert_equal Time.local(2007, 5, 27, 12), time
58
57
 
@@ -67,9 +66,20 @@ class TestParsing < Test::Unit::TestCase
67
66
 
68
67
  time = parse_now("may 27th at 5", :ambiguous_time_range => :none)
69
68
  assert_equal Time.local(2007, 5, 27, 5), time
69
+ end
70
+
71
+ def test_handle_od_rmn
72
+ time = parse_now("22nd February")
73
+ assert_equal Time.local(2007, 2, 22, 12), time
70
74
 
71
- # rm_od_on
75
+ time = parse_now("31st of may at 6:30pm")
76
+ assert_equal Time.local(2007, 5, 31, 18, 30), time
72
77
 
78
+ time = parse_now("11th december 8am")
79
+ assert_equal Time.local(2006, 12, 11, 8), time
80
+ end
81
+
82
+ def test_handle_rmn_od_on
73
83
  time = parse_now("5:00 pm may 27th", :context => :past)
74
84
  assert_equal Time.local(2006, 5, 27, 17), time
75
85
 
@@ -81,16 +91,65 @@ class TestParsing < Test::Unit::TestCase
81
91
 
82
92
  time = parse_now("5 on may 27th", :ambiguous_time_range => :none)
83
93
  assert_equal Time.local(2007, 5, 27, 5), time
94
+ end
84
95
 
85
- # rm_sy
96
+ def test_handle_rmn_sy
97
+ time = parse_now("may 97")
98
+ assert_equal Time.local(1997, 5, 16, 12), time
86
99
 
87
- time = parse_now("June 1979")
88
- assert_equal Time.local(1979, 6, 16, 0), time
100
+ time = parse_now("may 33", :ambiguous_year_future_bias => 10)
101
+ assert_equal Time.local(2033, 5, 16, 12), time
89
102
 
90
- time = parse_now("dec 79")
91
- assert_equal Time.local(1979, 12, 16, 12), time
103
+ time = parse_now("may 32")
104
+ assert_equal Time.local(2032, 5, 16, 12, 0, 0), time
105
+ end
92
106
 
93
- # rm_od_sy
107
+ def test_handle_rdn_rmn_sd_t_tz_sy
108
+ time = parse_now("Mon Apr 02 17:00:00 PDT 2007")
109
+ assert_equal 1175558400, time.to_i
110
+ end
111
+
112
+ def test_handle_rmn_sd_sy
113
+ time = parse_now("November 18, 2010")
114
+ assert_equal Time.local(2010, 11, 18, 12), time
115
+
116
+ time = parse_now("Jan 1,2010")
117
+ assert_equal Time.local(2010, 1, 1, 12), time
118
+
119
+ time = parse_now("February 14, 2004")
120
+ assert_equal Time.local(2004, 2, 14, 12), time
121
+
122
+ time = parse_now("jan 3 2010")
123
+ assert_equal Time.local(2010, 1, 3, 12), time
124
+
125
+ time = parse_now("jan 3 2010 midnight")
126
+ assert_equal Time.local(2010, 1, 4, 0), time
127
+
128
+ time = parse_now("jan 3 2010 at midnight")
129
+ assert_equal Time.local(2010, 1, 4, 0), time
130
+
131
+ time = parse_now("jan 3 2010 at 4", :ambiguous_time_range => :none)
132
+ assert_equal Time.local(2010, 1, 3, 4), time
133
+
134
+ time = parse_now("may 27, 1979")
135
+ assert_equal Time.local(1979, 5, 27, 12), time
136
+
137
+ time = parse_now("may 27 79")
138
+ assert_equal Time.local(1979, 5, 27, 12), time
139
+
140
+ time = parse_now("may 27 79 4:30")
141
+ assert_equal Time.local(1979, 5, 27, 16, 30), time
142
+
143
+ time = parse_now("may 27 79 at 4:30", :ambiguous_time_range => :none)
144
+ assert_equal Time.local(1979, 5, 27, 4, 30), time
145
+
146
+ time = parse_now("may 27 32")
147
+ assert_equal Time.local(2032, 5, 27, 12, 0, 0), time
148
+ end
149
+
150
+ def test_handle_rmn_od_sy
151
+ time = parse_now("may 1st 01")
152
+ assert_equal Time.local(2001, 5, 1, 12), time
94
153
 
95
154
  time = parse_now("November 18th 2010")
96
155
  assert_equal Time.local(2010, 11, 18, 12), time
@@ -121,44 +180,17 @@ class TestParsing < Test::Unit::TestCase
121
180
 
122
181
  time = parse_now("March 30th 79 at 4:30", :ambiguous_time_range => :none)
123
182
  assert_equal Time.local(1979, 3, 30, 4, 30), time
183
+ end
124
184
 
125
- # rm_sd_sy
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
-
133
- time = parse_now("jan 3 2010")
134
- assert_equal Time.local(2010, 1, 3, 12), time
135
-
136
- time = parse_now("jan 3 2010 midnight")
137
- assert_equal Time.local(2010, 1, 4, 0), time
138
-
139
- time = parse_now("jan 3 2010 at midnight")
140
- assert_equal Time.local(2010, 1, 4, 0), time
141
-
142
- time = parse_now("jan 3 2010 at 4", :ambiguous_time_range => :none)
143
- assert_equal Time.local(2010, 1, 3, 4), time
144
-
145
- #time = parse_now("January 12, '00")
146
- #assert_equal Time.local(2000, 1, 12, 12), time
147
-
148
- time = parse_now("may 27, 1979")
149
- assert_equal Time.local(1979, 5, 27, 12), time
150
-
151
- time = parse_now("may 27 79")
152
- assert_equal Time.local(1979, 5, 27, 12), time
153
-
154
- time = parse_now("may 27 79 4:30")
155
- assert_equal Time.local(1979, 5, 27, 16, 30), time
156
-
157
- time = parse_now("may 27 79 at 4:30", :ambiguous_time_range => :none)
158
- assert_equal Time.local(1979, 5, 27, 4, 30), time
185
+ def test_handle_od_rmn_sy
186
+ time = parse_now("22nd February 2012")
187
+ assert_equal Time.local(2012, 2, 22, 12), time
159
188
 
160
- # sd_rm_sy
189
+ time = parse_now("11th december 79")
190
+ assert_equal Time.local(1979, 12, 11, 12), time
191
+ end
161
192
 
193
+ def test_handle_sd_rmn_sy
162
194
  time = parse_now("3 jan 2010")
163
195
  assert_equal Time.local(2010, 1, 3, 12), time
164
196
 
@@ -167,36 +199,25 @@ class TestParsing < Test::Unit::TestCase
167
199
 
168
200
  time = parse_now("27 Oct 2006 7:30pm")
169
201
  assert_equal Time.local(2006, 10, 27, 19, 30), time
202
+ end
170
203
 
171
- # sm_sd_sy
172
-
204
+ def test_handle_sm_sd_sy
173
205
  time = parse_now("5/27/1979")
174
206
  assert_equal Time.local(1979, 5, 27, 12), time
175
207
 
176
208
  time = parse_now("5/27/1979 4am")
177
209
  assert_equal Time.local(1979, 5, 27, 4), time
210
+ end
178
211
 
179
- # sd_sm_sy
180
-
212
+ def test_handle_sd_sm_sy
181
213
  time = parse_now("27/5/1979")
182
214
  assert_equal Time.local(1979, 5, 27, 12), time
183
215
 
184
216
  time = parse_now("27/5/1979 @ 0700")
185
217
  assert_equal Time.local(1979, 5, 27, 7), time
218
+ end
186
219
 
187
- # sm_sy
188
-
189
- time = parse_now("05/06")
190
- assert_equal Time.local(2006, 5, 16, 12), time
191
-
192
- time = parse_now("12/06")
193
- assert_equal Time.local(2006, 12, 16, 12), time
194
-
195
- time = parse_now("13/06")
196
- assert_equal nil, time
197
-
198
- # sy_sm_sd
199
-
220
+ def test_handle_sy_sm_sd
200
221
  time = parse_now("2000-1-1")
201
222
  assert_equal Time.local(2000, 1, 1, 12), time
202
223
 
@@ -218,43 +239,73 @@ class TestParsing < Test::Unit::TestCase
218
239
  time = parse_now("2006-08-20 15:30.30")
219
240
  assert_equal Time.local(2006, 8, 20, 15, 30, 30), time
220
241
 
221
- # rdn_rm_rd_rt_rtz_ry
242
+ time = parse_now("1902-08-20")
243
+ assert_equal Time.local(1902, 8, 20, 12, 0, 0), time
244
+ end
222
245
 
223
- time = parse_now("Mon Apr 02 17:00:00 PDT 2007")
224
- assert_equal 1175558400, time.to_i
246
+ def test_handle_sm_sy
247
+ time = parse_now("05/06")
248
+ assert_equal Time.local(2006, 5, 16, 12), time
225
249
 
226
- now = Time.now
227
- time = parse_now(now.to_s)
228
- # assert_equal now.to_s, time.to_s
250
+ time = parse_now("12/06")
251
+ assert_equal Time.local(2006, 12, 16, 12), time
229
252
 
230
- # rm_sd_rt
253
+ time = parse_now("13/06")
254
+ assert_equal nil, time
255
+ end
231
256
 
232
- #time = parse_now("jan 5 13:00")
233
- #assert_equal Time.local(2007, 1, 5, 13), time
257
+ def test_handle_r
258
+ end
234
259
 
235
- # old dates
260
+ def test_handle_r_g_r
261
+ end
236
262
 
237
- time = parse_now("may 40")
238
- assert_equal Time.local(2040, 5, 16, 12, 0, 0), time
263
+ def test_handle_srp
264
+ end
239
265
 
240
- time = parse_now("may 27 40")
241
- assert_equal Time.local(2040, 5, 27, 12, 0, 0), time
266
+ def test_handle_s_r_p
267
+ end
242
268
 
243
- time = parse_now("1800-08-20")
244
- assert_equal Time.local(1800, 8, 20, 12, 0, 0), time
269
+ def test_handle_p_s_r
245
270
  end
246
271
 
247
- def test_parse_two_digit_years
248
- time = parse_now("may 97")
249
- assert_equal Time.local(1997, 5, 16, 12), time
272
+ def test_handle_s_r_p_a
273
+ end
250
274
 
251
- time = parse_now("may 1st 01")
252
- assert_equal Time.local(2001, 5, 1, 12), time
275
+ def test_handle_orr
276
+ end
277
+
278
+ def test_handle_o_r_s_r
279
+ time = parse_now("3rd wednesday in november")
280
+ assert_equal Time.local(2006, 11, 15, 12), time
253
281
 
254
- time = parse_now("may 79", :ambiguous_year_future_bias => 10)
255
- assert_equal Time.local(2079, 5, 16, 12), time
282
+ time = parse_now("10th wednesday in november")
283
+ assert_equal nil, time
284
+
285
+ # time = parse_now("3rd wednesday in 2007")
286
+ # assert_equal Time.local(2007, 1, 20, 12), time
256
287
  end
257
288
 
289
+ def test_handle_o_r_g_r
290
+ time = parse_now("3rd month next year", :guess => false)
291
+ assert_equal Time.local(2007, 3), time.begin
292
+
293
+ time = parse_now("3rd month next year", :guess => false)
294
+ assert_equal Time.local(2007, 3, 1), time.begin
295
+
296
+ time = parse_now("3rd thursday this september")
297
+ assert_equal Time.local(2006, 9, 21, 12), time
298
+
299
+ now = Time.parse("1/10/2010")
300
+ time = parse_now("3rd thursday this november", :now => now)
301
+ assert_equal Time.local(2010, 11, 18, 12), time
302
+
303
+ time = parse_now("4th day last week")
304
+ assert_equal Time.local(2006, 8, 9, 12), time
305
+ end
306
+
307
+ # end of testing handlers
308
+
258
309
  def test_parse_guess_r
259
310
  time = parse_now("friday")
260
311
  assert_equal Time.local(2006, 8, 18, 12), time
@@ -649,17 +700,6 @@ class TestParsing < Test::Unit::TestCase
649
700
  # future
650
701
  end
651
702
 
652
- def test_parse_guess_o_r_s_r
653
- time = parse_now("3rd wednesday in november")
654
- assert_equal Time.local(2006, 11, 15, 12), time
655
-
656
- time = parse_now("10th wednesday in november")
657
- assert_equal nil, time
658
-
659
- # time = parse_now("3rd wednesday in 2007")
660
- # assert_equal Time.local(2007, 1, 20, 12), time
661
- end
662
-
663
703
  def test_parse_guess_o_r_g_r
664
704
  time = parse_now("3rd month next year", :guess => false)
665
705
  assert_equal Time.local(2007, 3), time.begin
metadata CHANGED
@@ -1,32 +1,29 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: chronic
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
4
5
  prerelease:
5
- version: 0.4.4
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Tom Preston-Werner
9
9
  - Lee Jarvis
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
-
14
- date: 2011-06-12 00:00:00 Z
13
+ date: 2011-07-01 00:00:00.000000000 +01:00
14
+ default_executable:
15
15
  dependencies: []
16
-
17
16
  description: Chronic is a natural language date/time parser written in pure Ruby.
18
- email:
17
+ email:
19
18
  - tom@mojombo.com
20
19
  - lee@jarvis.co
21
20
  executables: []
22
-
23
21
  extensions: []
24
-
25
- extra_rdoc_files:
22
+ extra_rdoc_files:
26
23
  - README.md
27
24
  - HISTORY.md
28
25
  - LICENSE
29
- files:
26
+ files:
30
27
  - .gemtest
31
28
  - .gitignore
32
29
  - .yardopts
@@ -62,6 +59,7 @@ files:
62
59
  - lib/chronic/repeaters/repeater_weekend.rb
63
60
  - lib/chronic/repeaters/repeater_year.rb
64
61
  - lib/chronic/scalar.rb
62
+ - lib/chronic/season.rb
65
63
  - lib/chronic/separator.rb
66
64
  - lib/chronic/span.rb
67
65
  - lib/chronic/tag.rb
@@ -79,6 +77,7 @@ files:
79
77
  - test/test_RepeaterMinute.rb
80
78
  - test/test_RepeaterMonth.rb
81
79
  - test/test_RepeaterMonthName.rb
80
+ - test/test_RepeaterSeason.rb
82
81
  - test/test_RepeaterTime.rb
83
82
  - test/test_RepeaterWeek.rb
84
83
  - test/test_RepeaterWeekday.rb
@@ -88,34 +87,33 @@ files:
88
87
  - test/test_Time.rb
89
88
  - test/test_Token.rb
90
89
  - test/test_parsing.rb
90
+ has_rdoc: true
91
91
  homepage: http://github.com/mojombo/chronic
92
92
  licenses: []
93
-
94
93
  post_install_message:
95
- rdoc_options:
94
+ rdoc_options:
96
95
  - --charset=UTF-8
97
- require_paths:
96
+ require_paths:
98
97
  - lib
99
- required_ruby_version: !ruby/object:Gem::Requirement
98
+ required_ruby_version: !ruby/object:Gem::Requirement
100
99
  none: false
101
- requirements:
102
- - - ">="
103
- - !ruby/object:Gem::Version
104
- version: "0"
105
- required_rubygems_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
105
  none: false
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: "0"
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
111
110
  requirements: []
112
-
113
111
  rubyforge_project: chronic
114
- rubygems_version: 1.8.5
112
+ rubygems_version: 1.6.2
115
113
  signing_key:
116
114
  specification_version: 3
117
115
  summary: Natural language date/time parsing.
118
- test_files:
116
+ test_files:
119
117
  - test/helper.rb
120
118
  - test/test_Chronic.rb
121
119
  - test/test_DaylightSavings.rb
@@ -128,6 +126,7 @@ test_files:
128
126
  - test/test_RepeaterMinute.rb
129
127
  - test/test_RepeaterMonth.rb
130
128
  - test/test_RepeaterMonthName.rb
129
+ - test/test_RepeaterSeason.rb
131
130
  - test/test_RepeaterTime.rb
132
131
  - test/test_RepeaterWeek.rb
133
132
  - test/test_RepeaterWeekday.rb