chronic_duration 0.8.1 → 0.9.0

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/README.rdoc CHANGED
@@ -38,10 +38,19 @@ Examples of parse-able strings:
38
38
  * '6 mos 1 day'
39
39
  * '47 yrs 6 mos and 4d'
40
40
  * 'two hours and twenty minutes'
41
+ * '3 weeks and 2 days'
42
+
43
+ ChronicDuration.raise_exceptions can be set to true to raise exceptions when the string can't be parsed.
44
+
45
+ >> ChronicDuration.raise_exceptions = true
46
+ => true
47
+ >> ChronicDuration.parse('4 elephants and 3 Astroids')
48
+ ChronicDuration::DurationParseError: An invalid word "elephants" was used in the string to be parsed.
49
+
41
50
 
42
51
  == Contributors
43
52
 
44
- jduff, olauzon
53
+ brianjlandau, jduff, olauzon
45
54
 
46
55
  == TODO
47
56
 
@@ -49,4 +58,4 @@ jduff, olauzon
49
58
  * Context specific matching (E.g., for '4m30s', assume 'm' is minutes not months)
50
59
  * Smartly parse vacation-like durations (E.g., '4 days and 3 nights')
51
60
  * :chrono output option should probably change to something like 4 days 4:00:12 instead of 4:04:00:12
52
- * Other locale support
61
+ * Other locale support
data/Rakefile CHANGED
@@ -43,7 +43,7 @@ Rake::RDocTask.new do |rdoc|
43
43
  end
44
44
 
45
45
  rdoc.rdoc_dir = 'rdoc'
46
- rdoc.title = "my-gem #{version}"
46
+ rdoc.title = "chronic_duration #{version}"
47
47
  rdoc.rdoc_files.include('README*')
48
48
  rdoc.rdoc_files.include('lib/**/*.rb')
49
49
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.1
1
+ 0.9.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{chronic_duration}
8
- s.version = "0.8.1"
8
+ s.version = "0.9.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["hpoydar"]
12
- s.date = %q{2010-01-01}
12
+ s.date = %q{2010-01-28}
13
13
  s.description = %q{A simple Ruby natural language parser for elapsed time. (For example, 4 hours and 30 minutes, 6 minutes 4 seconds, 3 days, etc.) Returns all results in seconds. Will return an integer unless you get tricky and need a float. (4 minutes and 13.47 seconds, for example.) The reverse can also be performed via the output method.}
14
14
  s.email = %q{hpoydar@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -2,6 +2,19 @@ require 'numerizer'
2
2
  module ChronicDuration
3
3
  extend self
4
4
 
5
+ class DurationParseError < StandardError
6
+ end
7
+
8
+ @@raise_exceptions = false
9
+
10
+ def self.raise_exceptions
11
+ !!@@raise_exceptions
12
+ end
13
+
14
+ def self.raise_exceptions=(value)
15
+ @@raise_exceptions = !!value
16
+ end
17
+
5
18
  # Given a string representation of elapsed time,
6
19
  # return an integer (or float, if fractions of a
7
20
  # second are input)
@@ -166,7 +179,12 @@ private
166
179
  res << word.strip
167
180
  next
168
181
  end
169
- res << mappings[word.strip] if mappings.has_key?(word.strip)
182
+ stripped_word = word.strip.gsub(/^,/, '').gsub(/,$/, '')
183
+ if mappings.has_key?(stripped_word)
184
+ res << mappings[stripped_word]
185
+ elsif !join_words.include?(stripped_word) and ChronicDuration.raise_exceptions
186
+ raise DurationParseError, "An invalid word #{word.inspect} was used in the string to be parsed."
187
+ end
170
188
  end
171
189
  res.join(' ')
172
190
  end
@@ -192,6 +210,9 @@ private
192
210
  'day' => 'days',
193
211
  'dy' => 'days',
194
212
  'd' => 'days',
213
+ 'weeks' => 'weeks',
214
+ 'week' => 'weeks',
215
+ 'w' => 'weeks',
195
216
  'months' => 'months',
196
217
  'mos' => 'months',
197
218
  'years' => 'years',
@@ -200,6 +221,10 @@ private
200
221
  }
201
222
  end
202
223
 
224
+ def join_words
225
+ ['and', 'with', 'plus']
226
+ end
227
+
203
228
  def white_list
204
229
  self.mappings.map {|k, v| k}
205
230
  end
@@ -16,13 +16,22 @@ describe ChronicDuration, '.parse' do
16
16
  '47 yrs 6 mos and 4.5d' => 47 * 31557600 + 6 * 30 * 24 * 3600 + 4.5 * 24 * 3600,
17
17
  'two hours and twenty minutes' => 2 * 3600 + 20 * 60,
18
18
  'four hours and forty minutes' => 4 * 3600 + 40 * 60,
19
- 'four hours and fourty minutes' => 4 * 3600 + 40 * 60
19
+ 'four hours, and fourty minutes' => 4 * 3600 + 40 * 60,
20
+ '3 weeks and, 2 days' => 3600 * 24 * 7 * 3 + 3600 * 24 * 2,
21
+ '3 weeks, plus 2 days' => 3600 * 24 * 7 * 3 + 3600 * 24 * 2,
22
+ '3 weeks with 2 days' => 3600 * 24 * 7 * 3 + 3600 * 24 * 2
20
23
  }
21
24
 
22
25
  it "should return nil if the string can't be parsed" do
23
26
  ChronicDuration.parse('gobblygoo').should be_nil
24
27
  end
25
28
 
29
+ it "should raise an exception if the string can't be parsed and @@raise_exceptions is set to true" do
30
+ ChronicDuration.raise_exceptions = true
31
+ lambda { ChronicDuration.parse('23 gobblygoos') }.should raise_exception(ChronicDuration::DurationParseError)
32
+ ChronicDuration.raise_exceptions = false
33
+ end
34
+
26
35
  it "should return a float if seconds are in decimals" do
27
36
  ChronicDuration.parse('12 mins 3.141 seconds').is_a?(Float).should be_true
28
37
  end
@@ -31,6 +40,8 @@ describe ChronicDuration, '.parse' do
31
40
  ChronicDuration.parse('12 mins 3 seconds').is_a?(Integer).should be_true
32
41
  end
33
42
 
43
+
44
+
34
45
  @exemplars.each do |k, v|
35
46
  it "should properly parse a duration like #{k}" do
36
47
  ChronicDuration.parse(k).should == v
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chronic_duration
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - hpoydar
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-01 00:00:00 -05:00
12
+ date: 2010-01-28 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency