chronic 0.4.0 → 0.4.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/HISTORY.md CHANGED
@@ -1,3 +1,7 @@
1
+ # 0.4.1
2
+
3
+ * Fix MiniDate ranges for parsing seasons (Thomas Walpole)
4
+
1
5
  # 0.4.0 / 2011-06-04
2
6
 
3
7
  * Ensure context is being passed through grabbers. Now "Sunday at 2:18pm"
data/Manifest.txt CHANGED
@@ -40,6 +40,7 @@ test/helper.rb
40
40
  test/test_Chronic.rb
41
41
  test/test_DaylightSavings.rb
42
42
  test/test_Handler.rb
43
+ test/test_MiniDate.rb
43
44
  test/test_Numerizer.rb
44
45
  test/test_RepeaterDayName.rb
45
46
  test/test_RepeaterFortnight.rb
data/chronic.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'chronic'
3
- s.version = '0.4.0'
3
+ s.version = '0.4.1'
4
4
  s.rubyforge_project = 'chronic'
5
5
 
6
6
  s.summary = "Natural language date/time parsing."
@@ -57,6 +57,7 @@ Gem::Specification.new do |s|
57
57
  test/test_Chronic.rb
58
58
  test/test_DaylightSavings.rb
59
59
  test/test_Handler.rb
60
+ test/test_MiniDate.rb
60
61
  test/test_Numerizer.rb
61
62
  test/test_RepeaterDayName.rb
62
63
  test/test_RepeaterFortnight.rb
@@ -325,7 +325,7 @@ module Chronic
325
325
  # raise(ChronicPain, "Invalid repeater: #{repeater.class}")
326
326
  # end
327
327
 
328
- span = self.parse("this second", :guess => false, :now => @now)
328
+ span = Span.new(@now, @now + 1)
329
329
 
330
330
  self.handle_srp(tokens, span, options)
331
331
  end
@@ -399,7 +399,7 @@ module Chronic
399
399
  end
400
400
 
401
401
  puts "--#{outer_span}" if Chronic.debug
402
- anchor = find_within(repeaters, outer_span, pointer)
402
+ find_within(repeaters, outer_span, pointer)
403
403
  end
404
404
 
405
405
  def get_repeaters(tokens) #:nodoc:
@@ -3,18 +3,19 @@ module Chronic
3
3
  attr_accessor :month, :day
4
4
 
5
5
  def initialize(month, day)
6
+ raise(InvalidArgumentException, "1..12 are valid months") unless (1..12).include?(month)
6
7
  @month = month
7
8
  @day = day
8
9
  end
9
10
 
10
11
  def is_between?(md_start, md_end)
12
+ return false if (@month==md_start.month && @month==md_end.month && (@day < md_start.day || @day > md_end.day))
11
13
  return true if (@month == md_start.month and @day >= md_start.day) ||
12
14
  (@month == md_end.month and @day <= md_end.day)
13
-
14
- i = md_start.month + 1
15
+ i = (md_start.month % 12) + 1
15
16
  until i == md_end.month
16
17
  return true if @month == i
17
- i = (i+1) % 12
18
+ i = (i % 12) + 1
18
19
  end
19
20
 
20
21
  return false
@@ -1,8 +1,6 @@
1
1
  module Chronic
2
-
3
2
  class Ordinal < Tag #:nodoc:
4
3
  def self.scan(tokens, options)
5
- # for each token
6
4
  tokens.each_index do |i|
7
5
  if t = scan_for_ordinals(tokens[i]) then tokens[i].tag(t) end
8
6
  if t = scan_for_days(tokens[i]) then tokens[i].tag(t) end
@@ -1,8 +1,6 @@
1
1
  module Chronic
2
-
3
2
  class Pointer < Tag #:nodoc:
4
3
  def self.scan(tokens, options)
5
- # for each token
6
4
  tokens.each_index do |i|
7
5
  if t = scan_for_all(tokens[i]) then tokens[i].tag(t) end
8
6
  end
@@ -21,5 +19,4 @@ module Chronic
21
19
  'pointer-' << @type.to_s
22
20
  end
23
21
  end
24
-
25
22
  end
@@ -1,7 +1,6 @@
1
1
  module Chronic
2
2
  class Repeater < Tag #:nodoc:
3
3
  def self.scan(tokens, options)
4
- # for each token
5
4
  tokens.each_index do |i|
6
5
  if t = scan_for_season_names(tokens[i]) then tokens[i].tag(t); next end
7
6
  if t = scan_for_month_names(tokens[i]) then tokens[i].tag(t); next end
@@ -69,10 +68,7 @@ module Chronic
69
68
  end
70
69
 
71
70
  def self.scan_for_times(token)
72
- if token.word =~ /^\d{1,2}(:?\d{2})?([\.:]?\d{2})?$/
73
- return Chronic::RepeaterTime.new(token.word)
74
- end
75
- return nil
71
+ scan_for token, RepeaterTime, /^\d{1,2}(:?\d{2})?([\.:]?\d{2})?$/
76
72
  end
77
73
 
78
74
  def self.scan_for_units(token)
@@ -109,14 +105,11 @@ module Chronic
109
105
 
110
106
  # returns the next occurance of this repeatable.
111
107
  def next(pointer)
112
- !@now.nil? || raise("Start point must be set before calling #next")
113
- [:future, :none, :past].include?(pointer) || raise("First argument 'pointer' must be one of :past or :future")
114
- #raise("Repeatable#next must be overridden in subclasses")
108
+ raise("Start point must be set before calling #next") unless @now
115
109
  end
116
110
 
117
111
  def this(pointer)
118
- !@now.nil? || raise("Start point must be set before calling #this")
119
- [:future, :past, :none].include?(pointer) || raise("First argument 'pointer' must be one of :past, :future, :none")
112
+ raise("Start point must be set before calling #this") unless @now
120
113
  end
121
114
 
122
115
  def to_s
@@ -56,7 +56,7 @@ module Chronic
56
56
  end
57
57
 
58
58
  def width
59
- (365 * 24 * 60 * 60)
59
+ YEAR_SECONDS
60
60
  end
61
61
 
62
62
  def to_s
@@ -1,10 +1,8 @@
1
1
  module Chronic
2
-
3
2
  class Scalar < Tag #:nodoc:
4
3
  DAY_PORTIONS = %w( am pm morning afternoon evening night )
5
4
 
6
5
  def self.scan(tokens, options)
7
- # for each token
8
6
  tokens.each_index do |i|
9
7
  if t = scan_for_scalars(tokens[i], tokens[i + 1]) then tokens[i].tag(t) end
10
8
  if t = scan_for_days(tokens[i], tokens[i + 1]) then tokens[i].tag(t) end
@@ -80,5 +78,4 @@ module Chronic
80
78
  super << '-year-' << @type.to_s
81
79
  end
82
80
  end
83
-
84
- end
81
+ end
@@ -1,5 +1,4 @@
1
1
  module Chronic
2
-
3
2
  class Separator < Tag #:nodoc:
4
3
  def self.scan(tokens, options)
5
4
  tokens.each_index do |i|
@@ -69,5 +68,4 @@ module Chronic
69
68
  super << '-on'
70
69
  end
71
70
  end
72
-
73
- end
71
+ end
data/lib/chronic/tag.rb CHANGED
@@ -16,8 +16,13 @@ module Chronic
16
16
  private
17
17
 
18
18
  def scan_for(token, klass, items={})
19
- items.each do |item, symbol|
20
- return klass.new(symbol) if item =~ token.word
19
+ case items
20
+ when Regexp
21
+ return klass.new(token.word) if items =~ token.word
22
+ when Hash
23
+ items.each do |item, symbol|
24
+ return klass.new(symbol) if item =~ token.word
25
+ end
21
26
  end
22
27
  nil
23
28
  end
data/lib/chronic.rb CHANGED
@@ -8,7 +8,7 @@
8
8
  #=============================================================================
9
9
 
10
10
  module Chronic
11
- VERSION = "0.4.0"
11
+ VERSION = "0.4.1"
12
12
 
13
13
  class << self
14
14
  attr_accessor :debug
@@ -0,0 +1,32 @@
1
+ require File.join(File.dirname(__FILE__), *%w[helper])
2
+
3
+ class TestMiniDate < Test::Unit::TestCase
4
+ def test_valid_month
5
+ assert_raise(Chronic::InvalidArgumentException){ Chronic::MiniDate.new(0,12) }
6
+ assert_raise(Chronic::InvalidArgumentException){ Chronic::MiniDate.new(13,1) }
7
+ end
8
+
9
+ def test_is_between
10
+ m=Chronic::MiniDate.new(3,2)
11
+ assert m.is_between?(Chronic::MiniDate.new(2,4), Chronic::MiniDate.new(4,7))
12
+ assert !m.is_between?(Chronic::MiniDate.new(1,5), Chronic::MiniDate.new(2,7))
13
+
14
+ #There was a hang if date tested is in december and outside the testing range
15
+ m=Chronic::MiniDate.new(12,24)
16
+ assert !m.is_between?(Chronic::MiniDate.new(10,1), Chronic::MiniDate.new(12,21))
17
+ end
18
+
19
+ def test_is_between_short_range
20
+ m=Chronic::MiniDate.new(5,10)
21
+ assert m.is_between?(Chronic::MiniDate.new(5,3), Chronic::MiniDate.new(5,12))
22
+ assert !m.is_between?(Chronic::MiniDate.new(5,11), Chronic::MiniDate.new(5,15))
23
+ end
24
+
25
+ def test_is_between_wrapping_range
26
+ m=Chronic::MiniDate.new(1,1)
27
+ assert m.is_between?(Chronic::MiniDate.new(11,11), Chronic::MiniDate.new(2,2))
28
+ m=Chronic::MiniDate.new(12,12)
29
+ assert m.is_between?(Chronic::MiniDate.new(11,11), Chronic::MiniDate.new(1,5))
30
+ end
31
+
32
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: chronic
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.4.0
5
+ version: 0.4.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Tom Preston-Werner
@@ -11,7 +11,7 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2011-06-04 00:00:00 Z
14
+ date: 2011-06-05 00:00:00 Z
15
15
  dependencies: []
16
16
 
17
17
  description: Chronic is a natural language date/time parser written in pure Ruby.
@@ -69,6 +69,7 @@ files:
69
69
  - test/test_Chronic.rb
70
70
  - test/test_DaylightSavings.rb
71
71
  - test/test_Handler.rb
72
+ - test/test_MiniDate.rb
72
73
  - test/test_Numerizer.rb
73
74
  - test/test_RepeaterDayName.rb
74
75
  - test/test_RepeaterFortnight.rb
@@ -116,6 +117,7 @@ test_files:
116
117
  - test/test_Chronic.rb
117
118
  - test/test_DaylightSavings.rb
118
119
  - test/test_Handler.rb
120
+ - test/test_MiniDate.rb
119
121
  - test/test_Numerizer.rb
120
122
  - test/test_RepeaterDayName.rb
121
123
  - test/test_RepeaterFortnight.rb