chronic 0.6.3 → 0.6.4

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY.md CHANGED
@@ -1,3 +1,10 @@
1
+ # 0.6.4 / 2011-08-08
2
+
3
+ * Fixed bug where 'noon' was parsed as 00:00 rather than 12:00
4
+ with :ambiguous_time_range => :none (Vladimir Chernis)
5
+ * Add support for handling '2009 May 22nd'
6
+ * Add the ability to handle scalar-day/repeater-month-name as well as ordinals
7
+
1
8
  # 0.6.3 / 2011-08-01
2
9
 
3
10
  * Ensure 'thu' is parsed as Thursday for 1.8.7 generic timestamp
data/Rakefile CHANGED
@@ -5,11 +5,9 @@ def version
5
5
  contents[/VERSION = "([^"]+)"/, 1]
6
6
  end
7
7
 
8
- require 'rake/testtask'
9
- Rake::TestTask.new(:test) do |test|
10
- test.libs << 'lib' << 'test'
11
- test.pattern = 'test/**/test_*.rb'
12
- test.verbose = true
8
+ task :test do
9
+ $:.unshift './test'
10
+ Dir.glob('test/test_*.rb').each { |t| require File.basename(t) }
13
11
  end
14
12
 
15
13
  desc "Generate RCov test coverage and open in your browser"
data/lib/chronic.rb CHANGED
@@ -28,7 +28,7 @@ require 'date'
28
28
  #
29
29
  # @author Tom Preston-Werner, Lee Jarvis
30
30
  module Chronic
31
- VERSION = "0.6.3"
31
+ VERSION = "0.6.4"
32
32
 
33
33
  class << self
34
34
 
@@ -118,7 +118,7 @@ module Chronic
118
118
  text.gsub!(/\btoday\b/, 'this day')
119
119
  text.gsub!(/\btomm?orr?ow\b/, 'next day')
120
120
  text.gsub!(/\byesterday\b/, 'last day')
121
- text.gsub!(/\bnoon\b/, '12:00')
121
+ text.gsub!(/\bnoon\b/, '12:00pm')
122
122
  text.gsub!(/\bmidnight\b/, '24:00')
123
123
  text.gsub!(/\bnow\b/, 'this second')
124
124
  text.gsub!(/\b(?:ago|before(?: now)?)\b/, 'past')
@@ -179,9 +179,11 @@ module Chronic
179
179
  Handler.new([:repeater_month_name, :ordinal_day, :separator_at?, 'time?'], :handle_rmn_od),
180
180
  Handler.new([:ordinal_day, :repeater_month_name, :scalar_year, :separator_at?, 'time?'], :handle_od_rmn_sy),
181
181
  Handler.new([:ordinal_day, :repeater_month_name, :separator_at?, 'time?'], :handle_od_rmn),
182
+ Handler.new([:scalar_year, :repeater_month_name, :ordinal_day], :handle_sy_rmn_od),
182
183
  Handler.new([:repeater_time, :repeater_day_portion?, :separator_on?, :repeater_month_name, :ordinal_day], :handle_rmn_od_on),
183
184
  Handler.new([:repeater_month_name, :scalar_year], :handle_rmn_sy),
184
185
  Handler.new([:scalar_day, :repeater_month_name, :scalar_year, :separator_at?, 'time?'], :handle_sd_rmn_sy),
186
+ Handler.new([:scalar_day, :repeater_month_name, :separator_at?, 'time?'], :handle_sd_rmn),
185
187
  Handler.new([:scalar_year, :separator_slash_or_dash, :scalar_month, :separator_slash_or_dash, :scalar_day, :separator_at?, 'time?'], :handle_sy_sm_sd),
186
188
  Handler.new([:scalar_month, :separator_slash_or_dash, :scalar_year], :handle_sm_sy)
187
189
  ],
@@ -59,6 +59,32 @@ module Chronic
59
59
  handle_m_d(month, day, tokens[2..tokens.size], options)
60
60
  end
61
61
 
62
+ def handle_sy_rmn_od(tokens, options)
63
+ year = tokens[0].get_tag(ScalarYear).type
64
+ month = tokens[1].get_tag(RepeaterMonthName).index
65
+ day = tokens[2].get_tag(OrdinalDay).type
66
+ time_tokens = tokens.last(tokens.size - 3)
67
+
68
+ return if month_overflow?(year, month, day)
69
+
70
+ begin
71
+ day_start = Chronic.time_class.local(year, month, day)
72
+ day_or_time(day_start, time_tokens, options)
73
+ rescue ArgumentError
74
+ nil
75
+ end
76
+ end
77
+
78
+ # Handle scalar-day/repeater-month-name
79
+ def handle_sd_rmn(tokens, options)
80
+ month = tokens[1].get_tag(RepeaterMonthName)
81
+ day = tokens[0].get_tag(ScalarDay).type
82
+
83
+ return if month_overflow?(Chronic.now.year, month.index, day)
84
+
85
+ handle_m_d(month, day, tokens[2..tokens.size], options)
86
+ end
87
+
62
88
  # Handle repeater-month-name/ordinal-day with separator-on
63
89
  def handle_rmn_od_on(tokens, options)
64
90
  if tokens.size > 3
@@ -339,7 +365,11 @@ module Chronic
339
365
  raise ChronicPain, "Invalid grabber"
340
366
  end
341
367
 
342
- puts "--#{outer_span}" if Chronic.debug
368
+ if Chronic.debug
369
+ puts "Handler-class: #{head.class}"
370
+ puts "--#{outer_span}"
371
+ end
372
+
343
373
  find_within(repeaters, outer_span, pointer)
344
374
  end
345
375
 
@@ -3,10 +3,10 @@ module Chronic
3
3
  PORTIONS = {
4
4
  :am => 0..(12 * 60 * 60 - 1),
5
5
  :pm => (12 * 60 * 60)..(24 * 60 * 60 - 1),
6
- :morning => (6 * 60 * 60)..(12 * 60 * 60), # 6am-12am,
7
- :afternoon =>(13 * 60 * 60)..(17 * 60 * 60), # 1pm-5pm,
8
- :evening => (17 * 60 * 60)..(20 * 60 * 60), # 5pm-8pm,
9
- :night =>(20 * 60 * 60)..(24 * 60 * 60), # 8pm-12pm
6
+ :morning => (6 * 60 * 60)..(12 * 60 * 60), # 6am-12am,
7
+ :afternoon => (13 * 60 * 60)..(17 * 60 * 60), # 1pm-5pm,
8
+ :evening => (17 * 60 * 60)..(20 * 60 * 60), # 5pm-8pm,
9
+ :night => (20 * 60 * 60)..(24 * 60 * 60), # 8pm-12pm
10
10
  }
11
11
 
12
12
  def initialize(type)
@@ -31,25 +31,25 @@ module Chronic
31
31
 
32
32
  @type =
33
33
  case t.size
34
- when 1..2
35
- hours = t.to_i
36
- hours == 12 ? Tick.new(0 * 60 * 60, true) : Tick.new(hours * 60 * 60, true)
37
- when 3
38
- hours = t[0..0].to_i
39
- ambiguous = hours > 0
40
- Tick.new((hours * 60 * 60) + (t[1..2].to_i * 60), ambiguous)
41
- when 4
42
- ambiguous = time =~ /:/ && t[0..0].to_i != 0 && t[0..1].to_i <= 12
43
- hours = t[0..1].to_i
44
- hours == 12 ? Tick.new(0 * 60 * 60 + t[2..3].to_i * 60, ambiguous) : Tick.new(hours * 60 * 60 + t[2..3].to_i * 60, ambiguous)
45
- when 5
46
- Tick.new(t[0..0].to_i * 60 * 60 + t[1..2].to_i * 60 + t[3..4].to_i, true)
47
- when 6
48
- ambiguous = time =~ /:/ && t[0..0].to_i != 0 && t[0..1].to_i <= 12
49
- hours = t[0..1].to_i
50
- hours == 12 ? Tick.new(0 * 60 * 60 + t[2..3].to_i * 60 + t[4..5].to_i, ambiguous) : Tick.new(hours * 60 * 60 + t[2..3].to_i * 60 + t[4..5].to_i, ambiguous)
51
- else
52
- raise("Time cannot exceed six digits")
34
+ when 1..2
35
+ hours = t.to_i
36
+ Tick.new((hours == 12 ? 0 : hours) * 60 * 60, true)
37
+ when 3
38
+ hours = t[0..0].to_i
39
+ ambiguous = hours > 0
40
+ Tick.new((hours * 60 * 60) + (t[1..2].to_i * 60), ambiguous)
41
+ when 4
42
+ ambiguous = time =~ /:/ && t[0..0].to_i != 0 && t[0..1].to_i <= 12
43
+ hours = t[0..1].to_i
44
+ hours == 12 ? Tick.new(0 * 60 * 60 + t[2..3].to_i * 60, ambiguous) : Tick.new(hours * 60 * 60 + t[2..3].to_i * 60, ambiguous)
45
+ when 5
46
+ Tick.new(t[0..0].to_i * 60 * 60 + t[1..2].to_i * 60 + t[3..4].to_i, true)
47
+ when 6
48
+ ambiguous = time =~ /:/ && t[0..0].to_i != 0 && t[0..1].to_i <= 12
49
+ hours = t[0..1].to_i
50
+ hours == 12 ? Tick.new(0 * 60 * 60 + t[2..3].to_i * 60 + t[4..5].to_i, ambiguous) : Tick.new(hours * 60 * 60 + t[2..3].to_i * 60 + t[4..5].to_i, ambiguous)
51
+ else
52
+ raise("Time cannot exceed six digits")
53
53
  end
54
54
  end
55
55
 
@@ -29,7 +29,7 @@ module Chronic
29
29
 
30
30
  case pointer
31
31
  when :future
32
- this_year_start = Chronic.construct(@now.year, @now.month, @now.day) + RepeaterDay::DAY_SECONDS
32
+ this_year_start = Chronic.construct(@now.year, @now.month, @now.day + 1)
33
33
  this_year_end = Chronic.construct(@now.year + 1, 1, 1)
34
34
  when :past
35
35
  this_year_start = Chronic.construct(@now.year, 1, 1)
data/test/helper.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  unless defined? Chronic
2
- $:.unshift File.expand_path('../../lib')
2
+ $:.unshift File.expand_path('../../lib', __FILE__)
3
3
  require 'chronic'
4
4
  end
5
5
 
data/test/test_parsing.rb CHANGED
@@ -76,6 +76,22 @@ class TestParsing < Test::Unit::TestCase
76
76
  assert_equal Time.local(2006, 12, 11, 8), time
77
77
  end
78
78
 
79
+ def test_handle_sy_rmn_od
80
+ time = parse_now("2009 May 22nd")
81
+ assert_equal Time.local(2009, 05, 22, 12), time
82
+ end
83
+
84
+ def test_handle_sd_rmn
85
+ time = parse_now("22 February")
86
+ assert_equal Time.local(2007, 2, 22, 12), time
87
+
88
+ time = parse_now("31 of may at 6:30pm")
89
+ assert_equal Time.local(2007, 5, 31, 18, 30), time
90
+
91
+ time = parse_now("11 december 8am")
92
+ assert_equal Time.local(2006, 12, 11, 8), time
93
+ end
94
+
79
95
  def test_handle_rmn_od_on
80
96
  time = parse_now("5:00 pm may 27th", :context => :past)
81
97
  assert_equal Time.local(2006, 5, 27, 17), time
@@ -417,11 +433,11 @@ class TestParsing < Test::Unit::TestCase
417
433
  def test_parse_guess_gr
418
434
  # year
419
435
 
420
- time = parse_now("this year")
421
- assert_equal Time.local(2006, 10, 24, 12, 30), time
436
+ time = parse_now("this year", :guess => false)
437
+ assert_equal Time.local(2006, 8, 17), time.begin
422
438
 
423
- time = parse_now("this year", :context => :past)
424
- assert_equal Time.local(2006, 4, 24, 12, 30), time
439
+ time = parse_now("this year", :context => :past, :guess => false)
440
+ assert_equal Time.local(2006, 1, 1), time.begin
425
441
 
426
442
  # month
427
443
 
@@ -858,6 +874,11 @@ class TestParsing < Test::Unit::TestCase
858
874
  assert_not_equal t1, t2
859
875
  end
860
876
 
877
+ def test_noon
878
+ t1 = Chronic.parse('2011-01-01 at noon', :ambiguous_time_range => :none)
879
+ assert_equal Time.local(2011, 1, 1, 12, 0), t1
880
+ end
881
+
861
882
  private
862
883
  def parse_now(string, options={})
863
884
  Chronic.parse(string, {:now => TIME_2006_08_16_14_00_00 }.merge(options))
metadata CHANGED
@@ -1,37 +1,28 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: chronic
3
- version: !ruby/object:Gem::Version
4
- hash: 1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.4
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 6
9
- - 3
10
- version: 0.6.3
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Tom Preston-Werner
14
9
  - Lee Jarvis
15
10
  autorequire:
16
11
  bindir: bin
17
12
  cert_chain: []
18
-
19
- date: 2011-09-02 00:00:00 Z
13
+ date: 2011-09-09 00:00:00.000000000Z
20
14
  dependencies: []
21
-
22
15
  description: Chronic is a natural language date/time parser written in pure Ruby.
23
- email:
16
+ email:
24
17
  - tom@mojombo.com
25
18
  - lee@jarvis.co
26
19
  executables: []
27
-
28
20
  extensions: []
29
-
30
- extra_rdoc_files:
21
+ extra_rdoc_files:
31
22
  - README.md
32
23
  - HISTORY.md
33
24
  - LICENSE
34
- files:
25
+ files:
35
26
  - .gemtest
36
27
  - .gitignore
37
28
  - .yardopts
@@ -96,38 +87,30 @@ files:
96
87
  - test/test_parsing.rb
97
88
  homepage: http://github.com/mojombo/chronic
98
89
  licenses: []
99
-
100
90
  post_install_message:
101
- rdoc_options:
91
+ rdoc_options:
102
92
  - --charset=UTF-8
103
- require_paths:
93
+ require_paths:
104
94
  - lib
105
- required_ruby_version: !ruby/object:Gem::Requirement
95
+ required_ruby_version: !ruby/object:Gem::Requirement
106
96
  none: false
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- hash: 3
111
- segments:
112
- - 0
113
- version: "0"
114
- required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ! '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
102
  none: false
116
- requirements:
117
- - - ">="
118
- - !ruby/object:Gem::Version
119
- hash: 3
120
- segments:
121
- - 0
122
- version: "0"
103
+ requirements:
104
+ - - ! '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
123
107
  requirements: []
124
-
125
108
  rubyforge_project: chronic
126
109
  rubygems_version: 1.8.6
127
110
  signing_key:
128
111
  specification_version: 3
129
112
  summary: Natural language date/time parsing.
130
- test_files:
113
+ test_files:
131
114
  - test/helper.rb
132
115
  - test/test_Chronic.rb
133
116
  - test/test_DaylightSavings.rb