hpoydar-chronic_duration 0.3.1 → 0.4.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
@@ -1,6 +1,8 @@
1
1
  = Chronic Duration
2
2
 
3
- 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.)
3
+ 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.)
4
+
5
+ The reverse can also be accomplished with the output method. So pass in seconds and you will get values like 4 ins 31.51 secs.
4
6
 
5
7
  == Installation
6
8
 
@@ -13,6 +15,8 @@ A simple Ruby natural language parser for elapsed time. (For example, 4 hours an
13
15
  => true
14
16
  >> ChronicDuration.parse('4 minutes and 30 seconds')
15
17
  => 270
18
+ >> ChronicDuration.output(270)
19
+ => 4 mins 30 secs
16
20
 
17
21
  Nil is returned if the string can't be parsed
18
22
 
@@ -33,4 +37,5 @@ Examples of parse-able strings:
33
37
 
34
38
  * Benchmark and optimize
35
39
  * Context specific matching (E.g., for '4m30s', assume 'm' is minutes)
36
- * Smartly parse vacation-like durations (E.g., '4 days and 3 nights')
40
+ * Smartly parse vacation-like durations (E.g., '4 days and 3 nights')
41
+ * Allow alternative formatting for output
@@ -6,8 +6,57 @@ module ChronicDuration
6
6
  result == 0 ? nil : result
7
7
  end
8
8
 
9
+ # Refactor, DRY up, make recursive
10
+ def output(seconds)
11
+
12
+ years = months = days = hours = minutes = 0
13
+
14
+ if seconds >= 60
15
+ minutes = (seconds / 60).to_i
16
+ seconds = seconds % 60
17
+ if minutes >= 60
18
+ hours = (minutes / 60).to_i
19
+ minutes = (minutes % 60).to_i
20
+ if hours >= 24
21
+ days = (hours / 24).to_i
22
+ hours = (hours % 24).to_i
23
+ if days >= 30
24
+ months = (days / 30).to_i
25
+ days = (days % 30).to_i
26
+ if months >= 12
27
+ years = (months / 12).to_i
28
+ months = (months % 12).to_i
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ result = []
36
+
37
+ result << pluralize(years, 'yr')
38
+ result << pluralize(months, 'mo')
39
+ result << pluralize(days, 'day')
40
+ result << pluralize(hours, 'hr')
41
+ result << pluralize(minutes, 'min')
42
+ result << pluralize(seconds, 'sec')
43
+
44
+ result = result.join(' ').squeeze(' ').strip
45
+ return nil if result.length == 0
46
+
47
+ result
48
+ end
49
+
9
50
  private
10
51
 
52
+ # A poor man's pluralizer
53
+ def pluralize(number, word)
54
+ return '' if number == 0
55
+ res = "#{number} #{word}"
56
+ res << 's' unless number == 1
57
+ res
58
+ end
59
+
11
60
  def calculate_from_words(string)
12
61
  val = 0
13
62
  words = string.split(' ')
@@ -46,6 +46,31 @@ describe ChronicDuration, '.parse' do
46
46
 
47
47
  end
48
48
 
49
+ describe ChronicDuration, '.output' do
50
+
51
+ @exemplars = {
52
+ '1 min 20 secs' => 60 + 20,
53
+ '1 min 20.51 secs' => 60 + 20.51,
54
+ '3 mins 20.51 secs' => 3 * 60 + 20.51,
55
+ '4 hrs 1 min 1 sec' => 4 * 3600 + 60 + 1,
56
+ '3 mins 4 secs' => 3 * 60 + 4,
57
+ '2 hrs 20 mins' => 2 * 3600 + 20 * 60,
58
+ '1 mo 1 day' => 1 * 30 * 24 * 3600 + 24 * 3600,
59
+ '6 mos 1 day' => 6 * 30 * 24 * 3600 + 24 * 3600,
60
+ '6 mos 2 days' => 6 * 30 * 24 * 3600 + 2 * 24 * 3600,
61
+ '2 hrs 30 mins' => 2.5 * 3600
62
+ }
63
+
64
+
65
+ @exemplars.each do |k, v|
66
+ it "should properly output a duration of #{v}" do
67
+ ChronicDuration.output(v).should == k
68
+ end
69
+ end
70
+
71
+ end
72
+
73
+
49
74
  # Some of the private methods deserve some spec'ing to aid
50
75
  # us in development...
51
76
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hpoydar-chronic_duration
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henry Poydar
@@ -9,11 +9,11 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-13 00:00:00 -08:00
12
+ date: 2009-01-14 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
16
- description: 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.)
16
+ description: 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.
17
17
  email: henry@poydar.com
18
18
  executables: []
19
19