dotiw 0.6.0 → 0.7.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/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dotiw (0.6.0)
4
+ dotiw (0.7.0)
5
5
  actionpack (~> 3.0.0)
6
6
 
7
7
  GEM
@@ -51,6 +51,3 @@ DEPENDENCIES
51
51
  bundler (~> 1.0.0)
52
52
  dotiw!
53
53
  rspec (~> 2.0)
54
-
55
- METADATA
56
- version: 1.0.6
data/README.markdown CHANGED
@@ -18,60 +18,47 @@ Better than "about 1 year", am I right? Of course I am.
18
18
  >> distance_of_time_in_words(Time.now, Time.now + 1.second, false)
19
19
  => "1 second"
20
20
 
21
- This takes the same options plus an additional one on the end for passing options to the output (which uses `to_sentence`).
22
-
23
- Oh, and did I mention it supports I18n? Oh yeah.
24
-
25
- ## distance\_of\_time
26
-
27
- If you have simply a number of seconds you can get the "stringified" version of this by using `distance_of_time`:
28
-
29
- >> distance_of_time(300)
30
- => "5 minutes"
21
+ The third argument for this method is whether or not to include seconds. By default this is `false` (because in Rails' `distance_of_time_in_words` it is), you can turn it on though by passing `true` as the third argument:
31
22
 
32
- ## distance\_of\_time\_in\_words\_hash
23
+ >> distance_of_time_in_words(Time.now, Time.now + 1.year + 1.second, true)
24
+ => "1 year, and 1 second"
33
25
 
34
- Don't like any format you're given? That's cool too! Here, have an indifferent hash version:
26
+ Yes this could just be merged into the options hash but I'm leaving it here to ensure "backwards-compatibility".
35
27
 
36
- >> distance_of_time_in_words_hash(Time.now, Time.now + 1.year + 2.months + 3.days + 4.hours + 5.minutes + 6.seconds)
37
- => {"days"=>3, "seconds"=>6, "minutes"=>5, "years"=>1, "hours"=>4, "months"=>2}
28
+ The last argument is an optional options hash that can be used to manipulate behavior and (which uses `to_sentence`).
38
29
 
39
- Indiferrent means that you can access all keys by their `String` or `Symbol` version.
30
+ Oh, and did I mention it supports I18n? Oh yeah.
40
31
 
41
32
  ### Options
42
33
 
43
34
  #### :locale
44
35
 
45
- The keys can be in your local language too:
36
+ You can pass in a locale and it'll output it in whatever language you want (provided you have translations, otherwise it'll default to English):
46
37
 
47
- >> distance_of_time_in_words_hash(Time.now, Time.now + 1.year + 2.months + 3.days + 4.hours + 5.minutes + 6.seconds, :locale => "es")
48
- => {"horas"=>4, "días"=>3, "minutos"=>5, "segundos"=>6, "años"=>1, "meses"=>2}
38
+ >> distance_of_time_in_words(Time.now, Time.now + 1.minute, false, :locale => "es")
39
+ => "1 minuto"
49
40
 
50
- You are not guaranteed the order of the hash in Ruby 1.8.
41
+ This will also be passed to `to_sentence`
51
42
 
52
- ## distance\_of\_time\_in\_words
43
+ #### :vague
53
44
 
54
- ### Options
45
+ Specify this if you want it to use the old `distance_of_time_in_words`. The value can be anything except `nil` or `false`.
55
46
 
56
- The third argument for this method is whether or not to include seconds. By default this is `false` (because in Rails' `distance_of_time_in_words` it is), you can turn it on though by passing `true` as the third argument:
47
+ #### :singularize
57
48
 
58
- >> distance_of_time_in_words(Time.now, Time.now + 1.year + 1.second, true)
59
- => "1 year, and 1 second"
60
-
61
- Yes this could just be merged into the options hash but I'm leaving it here to ensure "backwards-compatibility".
49
+ Specify if all values of the hash should be presented in their singular form. By default they will be pluralized whenever outside the `-1..1` range. If you wish to have them signularized, just add the option `:singularize => :always`.
62
50
 
63
- #### :vague
51
+ This option is useful for Russian and Icelandic folks (https://github.com/radar/dotiw/issues#issue/2).
64
52
 
65
- Specify this if you want it to use the old `distance_of_time_in_words`. The value can be anything except `nil` or `false`.
53
+ >> distance_of_time_in_words(Time.now, Time.now + 2.hour + 2.minute, true, :singularize => :always)
54
+ => "2 hour and 2 minute"
66
55
 
67
- #### :locale
56
+ #### :accumulate_on
68
57
 
69
- You can pass in a locale and it'll output it in whatever language you want (provided you have translations, otherwise it'll default to English):
58
+ Specifies the maximum output unit which will accumulate all the surplus. Say you set it to seconds and your time difference is of 2 minutes then the output would be 120 seconds. Here's a code example:
70
59
 
71
- >> distance_of_time_in_words(Time.now, Time.now + 1.minute, false, :locale => "es")
72
- => "1 minuto"
73
-
74
- This will also be passed to `to_sentence`
60
+ >> distance_of_time_in_words(Time.now, Time.now + 2.hour + 70.second, true, :accumulate_on => :minutes)
61
+ => "121 minutes minute and 10 seconds"
75
62
 
76
63
  #### :only
77
64
 
@@ -127,6 +114,22 @@ Using something other than ', and':
127
114
 
128
115
  >> distance_of_time_in_words(Time.now, Time.now + 1.hour + 1.minute + 1.second, true, { :last_word_connector => ', finally ' })
129
116
  => "1 hour, 1 minute, finally 1 second"
117
+
118
+ ## distance\_of\_time
119
+
120
+ If you have simply a number of seconds you can get the "stringified" version of this by using `distance_of_time`:
121
+
122
+ >> distance_of_time(300)
123
+ => "5 minutes"
124
+
125
+ ## distance\_of\_time\_in\_words\_hash
126
+
127
+ Don't like any format you're given? That's cool too! Here, have an indifferent hash version:
128
+
129
+ >> distance_of_time_in_words_hash(Time.now, Time.now + 1.year + 2.months + 3.days + 4.hours + 5.minutes + 6.seconds)
130
+ => {"days"=>3, "seconds"=>6, "minutes"=>5, "years"=>1, "hours"=>4, "months"=>2}
131
+
132
+ Indifferent means that you can access all keys by their `String` or `Symbol` version.
130
133
 
131
134
  ## distance\_of\_time\_in\_percent
132
135
 
@@ -139,4 +142,4 @@ If you want to calculate a distance of time in percent, use `distance_of_time_in
139
142
 
140
143
  * [chendo][http://github.com/chendo] - for talking through it with me and drawing on the whiteboard
141
144
  * [Derander][http://github.com/derander] - correct Spanish translations
142
- * [DBA][http://github.com/dba] - Commits leading up to the 0.6 release.
145
+ * [DBA][http://github.com/dba] - Commits leading up to the 0.7 release.
data/lib/dotiw/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module DOTIW
4
- VERSION = "0.6.0"
5
- end
4
+ VERSION = "0.7.0"
5
+ end
data/lib/dotiw.rb CHANGED
@@ -21,45 +21,6 @@ module ActionView
21
21
  display_time_in_words DOTIW::TimeHash.new(seconds).to_hash, options
22
22
  end
23
23
 
24
- def display_time_in_words(hash, include_seconds = false, options = {})
25
- options.symbolize_keys!
26
- I18n.locale = options[:locale] if options[:locale]
27
-
28
- time_measurements = { :years => I18n.t(:years, :default => "years"),
29
- :months => I18n.t(:months, :default => "months"),
30
- :weeks => I18n.t(:weeks, :default => "weeks"),
31
- :days => I18n.t(:days, :default => "days"),
32
- :hours => I18n.t(:hours, :default => "hours"),
33
- :minutes => I18n.t(:minutes, :default => "minutes"),
34
- :seconds => I18n.t(:seconds, :default => "seconds") }
35
-
36
- hash.delete(time_measurements[:seconds]) if !include_seconds && hash[time_measurements[:minutes]]
37
-
38
- # Remove all the values that are nil or excluded. Keep the required ones.
39
- time_measurements.delete_if do |measure, key|
40
- hash[key].nil? || hash[key].zero? || (!options[:except].nil? && options[:except].include?(key)) ||
41
- (options[:only] && !options[:only].include?(key))
42
- end
43
-
44
- options.delete(:except)
45
- options.delete(:only)
46
-
47
- output = []
48
-
49
- time_measurements.each do |measure, key|
50
- name = hash[key] > 1 ? key : key.singularize
51
- output += ["#{hash[key]} #{name}"]
52
- end
53
-
54
- # maybe only grab the first few values
55
- if options[:precision]
56
- output = output[0...options[:precision]]
57
- options.delete(:precision)
58
- end
59
-
60
- output.to_sentence(options)
61
- end
62
-
63
24
  def distance_of_time_in_words(from_time, to_time, include_seconds = false, options = {})
64
25
  return old_distance_of_time_in_words(from_time, to_time, include_seconds, options) if options.delete(:vague)
65
26
  hash = distance_of_time_in_words_hash(from_time, to_time, options)
@@ -72,6 +33,48 @@ module ActionView
72
33
  result = ((current_time - from_time) / distance) * 100
73
34
  number_with_precision(result, options).to_s + "%"
74
35
  end
36
+
37
+ private
38
+ def display_time_in_words(hash, include_seconds = false, options = {})
39
+ options.symbolize_keys!
40
+ I18n.locale = options[:locale] if options[:locale]
41
+
42
+ time_measurements = { :years => I18n.t(:years, :default => "years"),
43
+ :months => I18n.t(:months, :default => "months"),
44
+ :weeks => I18n.t(:weeks, :default => "weeks"),
45
+ :days => I18n.t(:days, :default => "days"),
46
+ :hours => I18n.t(:hours, :default => "hours"),
47
+ :minutes => I18n.t(:minutes, :default => "minutes"),
48
+ :seconds => I18n.t(:seconds, :default => "seconds") }
49
+
50
+ hash.delete(time_measurements[:seconds]) if !include_seconds && hash[time_measurements[:minutes]]
51
+
52
+ # Remove all the values that are nil or excluded. Keep the required ones.
53
+ time_measurements.delete_if do |measure, key|
54
+ hash[key].nil? || hash[key].zero? || (!options[:except].nil? && options[:except].include?(key)) ||
55
+ (options[:only] && !options[:only].include?(key))
56
+ end
57
+
58
+ options.delete(:except)
59
+ options.delete(:only)
60
+
61
+ output = []
62
+
63
+ time_measurements.each do |measure, key|
64
+ name = options[:singularize] == :always || hash[key].between?(-1, 1) ? key.singularize : key
65
+ output += ["#{hash[key]} #{name}"]
66
+ end
67
+
68
+ options.delete(:singularize)
69
+
70
+ # maybe only grab the first few values
71
+ if options[:precision]
72
+ output = output[0...options[:precision]]
73
+ options.delete(:precision)
74
+ end
75
+
76
+ output.to_sentence(options)
77
+ end
75
78
  end # DateHelper
76
79
  end # Helpers
77
80
  end # ActionView
@@ -199,6 +199,10 @@ describe "A better distance_of_time_in_words" do
199
199
  Time.now + 1.year + 2.months + 3.days + 4.hours + 5.minutes + 6.seconds,
200
200
  { "except" => "minutes" },
201
201
  "1 year, 2 months, 3 days, 4 hours, and 6 seconds"],
202
+ [Time.now,
203
+ Time.now + 2.year + 3.months + 4.days + 5.hours + 6.minutes + 7.seconds,
204
+ { :singularize => :always },
205
+ "2 year, 3 month, 4 day, 5 hour, 6 minute, and 7 second"]
202
206
  ].each do |start, finish, options, output|
203
207
  it "should be #{output}" do
204
208
  distance_of_time_in_words(start, finish, true, options).should eql(output)
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dotiw
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 3
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
- - 6
8
+ - 7
8
9
  - 0
9
- version: 0.6.0
10
+ version: 0.7.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Ryan Bigg
@@ -25,6 +26,7 @@ dependencies:
25
26
  requirements:
26
27
  - - ~>
27
28
  - !ruby/object:Gem::Version
29
+ hash: 7
28
30
  segments:
29
31
  - 3
30
32
  - 0
@@ -40,6 +42,7 @@ dependencies:
40
42
  requirements:
41
43
  - - ~>
42
44
  - !ruby/object:Gem::Version
45
+ hash: 23
43
46
  segments:
44
47
  - 1
45
48
  - 0
@@ -55,6 +58,7 @@ dependencies:
55
58
  requirements:
56
59
  - - ~>
57
60
  - !ruby/object:Gem::Version
61
+ hash: 3
58
62
  segments:
59
63
  - 2
60
64
  - 0
@@ -101,6 +105,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
101
105
  requirements:
102
106
  - - ">="
103
107
  - !ruby/object:Gem::Version
108
+ hash: 3
104
109
  segments:
105
110
  - 0
106
111
  version: "0"
@@ -109,6 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
114
  requirements:
110
115
  - - ">="
111
116
  - !ruby/object:Gem::Version
117
+ hash: 23
112
118
  segments:
113
119
  - 1
114
120
  - 3