dotiw 2.0 → 3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.markdown +15 -1
- data/lib/dotiw/action_view_ext/helpers/date_helper.rb +29 -18
- data/lib/dotiw/locale/de.yml +25 -0
- data/lib/dotiw/locale/en.yml +1 -0
- data/{spec/translations → lib/dotiw/locale}/es.yml +3 -2
- data/lib/dotiw/locale/it.yml +24 -0
- data/lib/dotiw/locale/ja.yml +24 -0
- data/lib/dotiw/locale/nb.yml +25 -0
- data/lib/dotiw/locale/nl.yml +25 -0
- data/lib/dotiw/locale/pl.yml +32 -0
- data/lib/dotiw/locale/ru.yml +39 -0
- data/lib/dotiw/time_hash.rb +15 -4
- data/lib/dotiw/version.rb +1 -1
- data/spec/lib/dotiw_spec.rb +88 -68
- metadata +10 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aed9b495f66627b6c68f2e8ca572e2958ef44bf8
|
4
|
+
data.tar.gz: d49193040ff64bb85cd25829666a47268fc9ccc8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb4f3572b53a3a6dad22d64fd9793ce6df58791664b8dc9a3a98e6f7745b1a6fdad38d6b7e9014de30e46f33ad472ea5bc96ab1cc4bd0de97e897ebdc5aad318
|
7
|
+
data.tar.gz: 6d19cfebf638180ddf0bd8d5f2479df83baeb3426220dd57c645deb40294950f71200ffa5c0199e31ea9905359e2c12f71aac8bd749fdee85a658fc7b658c375
|
data/README.markdown
CHANGED
@@ -36,11 +36,25 @@ world*:
|
|
36
36
|
|
37
37
|
Oh, and did I mention it supports I18n? Oh yeah. Rock on!
|
38
38
|
|
39
|
+
## Install
|
40
|
+
|
41
|
+
Install it as a gem:
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
gem 'dotiw'
|
45
|
+
```
|
46
|
+
|
47
|
+
Or from GitHub:
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
gem 'dotiw', github: 'radar/dotiw'
|
51
|
+
```
|
52
|
+
|
39
53
|
### Options
|
40
54
|
|
41
55
|
#### :locale
|
42
56
|
|
43
|
-
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
|
57
|
+
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 your app's default locale (the `config.i18n.default_locale` you have set in `/config/application.rb`):
|
44
58
|
|
45
59
|
>> distance_of_time_in_words(Time.now, Time.now + 1.minute, false, :locale => :es)
|
46
60
|
=> "1 minuto"
|
@@ -5,9 +5,9 @@ module ActionView
|
|
5
5
|
|
6
6
|
def distance_of_time_in_words_hash(from_time, to_time, options = {})
|
7
7
|
from_time = from_time.to_time if !from_time.is_a?(Time) && from_time.respond_to?(:to_time)
|
8
|
-
to_time
|
8
|
+
to_time = to_time.to_time if !to_time.is_a?(Time) && to_time.respond_to?(:to_time)
|
9
9
|
|
10
|
-
DOTIW::TimeHash.new(
|
10
|
+
DOTIW::TimeHash.new(nil, from_time, to_time, options).to_hash
|
11
11
|
end
|
12
12
|
|
13
13
|
def distance_of_time(seconds, options = {})
|
@@ -40,35 +40,46 @@ module ActionView
|
|
40
40
|
distance_of_time_in_words(from_time, Time.now, include_seconds_or_options)
|
41
41
|
end
|
42
42
|
|
43
|
-
|
43
|
+
private
|
44
44
|
def display_time_in_words(hash, options = {})
|
45
45
|
options.reverse_merge!(
|
46
|
-
|
46
|
+
:include_seconds => false
|
47
47
|
).symbolize_keys!
|
48
48
|
|
49
49
|
include_seconds = options.delete(:include_seconds)
|
50
50
|
hash.delete(:seconds) if !include_seconds && hash[:minutes]
|
51
51
|
|
52
|
-
options[:except] = Array.wrap(options[:except]).map!(&:
|
53
|
-
options[:only] = Array.wrap(options[:only]).map!(&:
|
52
|
+
options[:except] = Array.wrap(options[:except]).map!(&:to_sym) if options[:except]
|
53
|
+
options[:only] = Array.wrap(options[:only]).map!(&:to_sym) if options[:only]
|
54
54
|
|
55
55
|
# Remove all the values that are nil or excluded. Keep the required ones.
|
56
56
|
hash.delete_if do |key, value|
|
57
57
|
value.nil? || value.zero? ||
|
58
|
-
|
59
|
-
|
58
|
+
(options[:except] && options[:except].include?(key)) ||
|
59
|
+
(options[:only] && !options[:only].include?(key))
|
60
60
|
end
|
61
|
-
return I18n.t('datetime.distance_in_words.less_than_x_seconds', :count => 1, :locale => options[:locale]) if hash.empty?
|
62
|
-
|
63
|
-
options.delete(:except)
|
64
|
-
options.delete(:only)
|
65
61
|
|
66
62
|
i18n_scope = options.delete(:scope) || DOTIW::DEFAULT_I18N_SCOPE
|
63
|
+
if hash.empty?
|
64
|
+
fractions = DOTIW::TimeHash::TIME_FRACTIONS
|
65
|
+
fractions = fractions & options[:only] if options[:only]
|
66
|
+
fractions = fractions - options[:except] if options[:except]
|
67
|
+
|
68
|
+
I18n.with_options :locale => options[:locale], :scope => i18n_scope do |locale|
|
69
|
+
# e.g. try to format 'less than 1 days', fallback to '0 days'
|
70
|
+
return locale.translate :less_than_x,
|
71
|
+
:distance => locale.translate(fractions.first, :count => 1),
|
72
|
+
:default => locale.translate(fractions.first, :count => 0)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
67
76
|
output = []
|
68
77
|
I18n.with_options :locale => options[:locale], :scope => i18n_scope do |locale|
|
69
78
|
output = hash.map { |key, value| locale.t(key, :count => value) }
|
70
79
|
end
|
71
80
|
|
81
|
+
options.delete(:except)
|
82
|
+
options.delete(:only)
|
72
83
|
highest_measures = options.delete(:highest_measures)
|
73
84
|
highest_measures = 1 if options.delete(:highest_measure_only)
|
74
85
|
if highest_measures
|
@@ -76,14 +87,14 @@ module ActionView
|
|
76
87
|
end
|
77
88
|
|
78
89
|
options[:words_connector] ||= I18n.translate :'datetime.dotiw.words_connector',
|
79
|
-
|
80
|
-
|
90
|
+
:default => :'support.array.words_connector',
|
91
|
+
:locale => options[:locale]
|
81
92
|
options[:two_words_connector] ||= I18n.translate :'datetime.dotiw.two_words_connector',
|
82
|
-
|
83
|
-
|
93
|
+
:default => :'support.array.two_words_connector',
|
94
|
+
:locale => options[:locale]
|
84
95
|
options[:last_word_connector] ||= I18n.translate :'datetime.dotiw.last_word_connector',
|
85
|
-
|
86
|
-
|
96
|
+
:default => :'support.array.last_word_connector',
|
97
|
+
:locale => options[:locale]
|
87
98
|
|
88
99
|
output.to_sentence(options)
|
89
100
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
de:
|
2
|
+
datetime:
|
3
|
+
dotiw:
|
4
|
+
seconds:
|
5
|
+
one: 1 Sekunde
|
6
|
+
other: "%{count} Sekunden"
|
7
|
+
minutes:
|
8
|
+
one: 1 Minute
|
9
|
+
other: "%{count} Minuten"
|
10
|
+
hours:
|
11
|
+
one: 1 Stunde
|
12
|
+
other: "%{count} Stunden"
|
13
|
+
days:
|
14
|
+
one: 1 Tag
|
15
|
+
other: "%{count} Tage"
|
16
|
+
weeks:
|
17
|
+
one: 1 Woche
|
18
|
+
other: "%{count} Wochen"
|
19
|
+
months:
|
20
|
+
one: 1 Monat
|
21
|
+
other: "%{count} Monate"
|
22
|
+
years:
|
23
|
+
one: 1 Jahr
|
24
|
+
other: "%{count} Jahre"
|
25
|
+
less_than_x: "weniger als %{distance}"
|
data/lib/dotiw/locale/en.yml
CHANGED
@@ -2,10 +2,10 @@ es:
|
|
2
2
|
datetime:
|
3
3
|
dotiw:
|
4
4
|
seconds:
|
5
|
-
one:
|
5
|
+
one: un segundo
|
6
6
|
other: "%{count} segundos"
|
7
7
|
minutes:
|
8
|
-
one:
|
8
|
+
one: un minuto
|
9
9
|
other: "%{count} minutos"
|
10
10
|
hours:
|
11
11
|
one: una hora
|
@@ -22,3 +22,4 @@ es:
|
|
22
22
|
years:
|
23
23
|
one: un año
|
24
24
|
other: "%{count} años"
|
25
|
+
less_than_x: "menos de %{distance}"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
it:
|
2
|
+
datetime:
|
3
|
+
dotiw:
|
4
|
+
seconds:
|
5
|
+
one: un secondo
|
6
|
+
other: "%{count} secondi"
|
7
|
+
minutes:
|
8
|
+
one: un minuto
|
9
|
+
other: "%{count} minuti"
|
10
|
+
hours:
|
11
|
+
one: una ora
|
12
|
+
other: "%{count} ore"
|
13
|
+
days:
|
14
|
+
one: un giorno
|
15
|
+
other: "%{count} giorni"
|
16
|
+
weeks:
|
17
|
+
one: una settimana
|
18
|
+
other: "%{count} settimane"
|
19
|
+
months:
|
20
|
+
one: un mese
|
21
|
+
other: "%{count} mesi"
|
22
|
+
years:
|
23
|
+
one: un anno
|
24
|
+
other: "%{count} anni"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
ja:
|
2
|
+
datetime:
|
3
|
+
dotiw:
|
4
|
+
seconds:
|
5
|
+
one: "1秒"
|
6
|
+
other: "%{count}秒"
|
7
|
+
minutes:
|
8
|
+
one: "1分"
|
9
|
+
other: "%{count}分"
|
10
|
+
hours:
|
11
|
+
one: "1時間"
|
12
|
+
other: "%{count}時間"
|
13
|
+
days:
|
14
|
+
one: "1日間"
|
15
|
+
other: "%{count}日間"
|
16
|
+
weeks:
|
17
|
+
one: "1週間"
|
18
|
+
other: "%{count}週間"
|
19
|
+
months:
|
20
|
+
one: "1ヶ月"
|
21
|
+
other: "%{count}ヶ月"
|
22
|
+
years:
|
23
|
+
one: "1年間"
|
24
|
+
other: "%{count}年間"
|
@@ -0,0 +1,25 @@
|
|
1
|
+
nb:
|
2
|
+
datetime:
|
3
|
+
dotiw:
|
4
|
+
seconds:
|
5
|
+
one: 1 sekund
|
6
|
+
other: "%{count} sekunder"
|
7
|
+
minutes:
|
8
|
+
one: 1 minutt
|
9
|
+
other: "%{count} minutter"
|
10
|
+
hours:
|
11
|
+
one: 1 time
|
12
|
+
other: "%{count} timer"
|
13
|
+
days:
|
14
|
+
one: 1 dag
|
15
|
+
other: "%{count} dager"
|
16
|
+
weeks:
|
17
|
+
one: 1 uke
|
18
|
+
other: "%{count} uke"
|
19
|
+
months:
|
20
|
+
one: 1 måned
|
21
|
+
other: "%{count} måneder"
|
22
|
+
years:
|
23
|
+
one: 1 år
|
24
|
+
other: "%{count} år"
|
25
|
+
less_than_x: "mindre enn %{distance}"
|
@@ -0,0 +1,25 @@
|
|
1
|
+
nl:
|
2
|
+
datetime:
|
3
|
+
dotiw:
|
4
|
+
seconds:
|
5
|
+
one: 1 seconde
|
6
|
+
other: "%{count} seconden"
|
7
|
+
minutes:
|
8
|
+
one: 1 minuut
|
9
|
+
other: "%{count} minuten"
|
10
|
+
hours:
|
11
|
+
one: 1 uur
|
12
|
+
other: "%{count} uur"
|
13
|
+
days:
|
14
|
+
one: 1 dag
|
15
|
+
other: "%{count} dagen"
|
16
|
+
weeks:
|
17
|
+
one: 1 week
|
18
|
+
other: "%{count} weken"
|
19
|
+
months:
|
20
|
+
one: 1 maand
|
21
|
+
other: "%{count} maanden"
|
22
|
+
years:
|
23
|
+
one: 1 jaar
|
24
|
+
other: "%{count} jaar"
|
25
|
+
less_than_x: "minder dan %{distance}"
|
@@ -0,0 +1,32 @@
|
|
1
|
+
pl:
|
2
|
+
datetime:
|
3
|
+
dotiw:
|
4
|
+
seconds:
|
5
|
+
one: "1 sekunda"
|
6
|
+
few: "%{count} sekundy"
|
7
|
+
other: "%{count} sekund"
|
8
|
+
minutes:
|
9
|
+
one: "1 minuta"
|
10
|
+
few: "%{count} minuty"
|
11
|
+
other: "%{count} minut"
|
12
|
+
hours:
|
13
|
+
one: "1 godzina"
|
14
|
+
few: "%{count} godziny"
|
15
|
+
other: "%{count} godzin"
|
16
|
+
days:
|
17
|
+
one: "1 dzień"
|
18
|
+
few: "%{count} dni"
|
19
|
+
other: "%{count} dni"
|
20
|
+
weeks:
|
21
|
+
one: "1 tydzień"
|
22
|
+
few: "%{count} tygodnie"
|
23
|
+
other: "%{count} tygodni"
|
24
|
+
months:
|
25
|
+
one: "1 miesiąc"
|
26
|
+
few: "%{count} miesiące"
|
27
|
+
other: "%{count} miesięcy"
|
28
|
+
years:
|
29
|
+
one: "1 rok"
|
30
|
+
few: "%{count} lata"
|
31
|
+
other: "%{count} lat"
|
32
|
+
less_than_x: "mniej niż %{distance}"
|
@@ -0,0 +1,39 @@
|
|
1
|
+
ru:
|
2
|
+
datetime:
|
3
|
+
dotiw:
|
4
|
+
seconds:
|
5
|
+
one: "%{count} секунда"
|
6
|
+
few: "%{count} секунды"
|
7
|
+
many: "%{count} секунд"
|
8
|
+
other: "%{count} секунды"
|
9
|
+
minutes:
|
10
|
+
one: "%{count} минута"
|
11
|
+
few: "%{count} минуты"
|
12
|
+
many: "%{count} минут"
|
13
|
+
other: "%{count} минуты"
|
14
|
+
hours:
|
15
|
+
one: "%{count} час"
|
16
|
+
few: "%{count} часа"
|
17
|
+
many: "%{count} часов"
|
18
|
+
other: "%{count} часа"
|
19
|
+
days:
|
20
|
+
one: "%{count} день"
|
21
|
+
few: "%{count} дня"
|
22
|
+
many: "%{count} дней"
|
23
|
+
other: "%{count} дня"
|
24
|
+
weeks:
|
25
|
+
one: "%{count} неделя"
|
26
|
+
few: "%{count} недели"
|
27
|
+
many: "%{count} недель"
|
28
|
+
other: "%{count} недели"
|
29
|
+
months:
|
30
|
+
one: "%{count} месяц"
|
31
|
+
few: "%{count} месяца"
|
32
|
+
many: "%{count} месяцев"
|
33
|
+
other: "%{count} месяца"
|
34
|
+
years:
|
35
|
+
one: "%{count} год"
|
36
|
+
few: "%{count} года"
|
37
|
+
many: "%{count} лет"
|
38
|
+
other: "%{count} года"
|
39
|
+
less_than_x: "меньше, чем %{distance}"
|
data/lib/dotiw/time_hash.rb
CHANGED
@@ -11,8 +11,17 @@ module DOTIW
|
|
11
11
|
self.options = options
|
12
12
|
self.distance = distance
|
13
13
|
self.from_time = from_time || Time.now
|
14
|
-
self.to_time = to_time || (self.from_time + self.distance.seconds)
|
14
|
+
self.to_time = to_time || (@to_time_not_given = true && self.from_time + self.distance.seconds)
|
15
15
|
self.smallest, self.largest = [self.from_time, self.to_time].minmax
|
16
|
+
self.to_time += 1.hour if @to_time_not_given && self.smallest.dst? && !self.largest.dst?
|
17
|
+
self.to_time -= 1.hour if @to_time_not_given && !self.smallest.dst? && self.largest.dst?
|
18
|
+
self.smallest, self.largest = [self.from_time, self.to_time].minmax
|
19
|
+
self.distance ||= begin
|
20
|
+
d = largest - smallest
|
21
|
+
d -= 1.hour if self.smallest.dst? && !self.largest.dst?
|
22
|
+
d += 1.hour if !self.smallest.dst? && self.largest.dst?
|
23
|
+
d
|
24
|
+
end
|
16
25
|
|
17
26
|
build_time_hash
|
18
27
|
end
|
@@ -64,7 +73,7 @@ module DOTIW
|
|
64
73
|
end
|
65
74
|
|
66
75
|
def build_days
|
67
|
-
output[:days], self.distance = distance.divmod(1.day)
|
76
|
+
output[:days], self.distance = distance.divmod(1.day) if output[:days].nil?
|
68
77
|
end
|
69
78
|
|
70
79
|
def build_months
|
@@ -101,7 +110,9 @@ module DOTIW
|
|
101
110
|
output[:months] = months
|
102
111
|
output[:days] = days
|
103
112
|
|
104
|
-
total_days, self.distance =
|
113
|
+
total_days, self.distance = distance.abs.divmod(1.day)
|
114
|
+
|
115
|
+
[total_days, self.distance]
|
105
116
|
end
|
106
117
|
end # TimeHash
|
107
|
-
end # DOTIW
|
118
|
+
end # DOTIW
|
data/lib/dotiw/version.rb
CHANGED
data/spec/lib/dotiw_spec.rb
CHANGED
@@ -7,11 +7,12 @@ describe "A better distance_of_time_in_words" do
|
|
7
7
|
include ActionView::Helpers::TextHelper
|
8
8
|
include ActionView::Helpers::NumberHelper
|
9
9
|
|
10
|
+
START_TIME = "01-08-2009".to_time
|
11
|
+
|
10
12
|
before do
|
11
13
|
I18n.locale = :en
|
12
|
-
|
13
|
-
allow(Time).to receive(:now).and_return(
|
14
|
-
allow(Time.zone).to receive(:now).and_return(time)
|
14
|
+
allow(Time).to receive(:now).and_return(START_TIME)
|
15
|
+
allow(Time.zone).to receive(:now).and_return(START_TIME)
|
15
16
|
end
|
16
17
|
|
17
18
|
describe "distance of time" do
|
@@ -50,20 +51,20 @@ describe "A better distance_of_time_in_words" do
|
|
50
51
|
[:years, :months, :days, :minutes, :seconds].each do |name|
|
51
52
|
describe name do
|
52
53
|
it "exactly" do
|
53
|
-
hash = distance_of_time_in_words_hash(
|
54
|
+
hash = distance_of_time_in_words_hash(START_TIME, START_TIME + 1.send(name))
|
54
55
|
expect(hash[name]).to eq(1)
|
55
56
|
end
|
56
57
|
|
57
58
|
it "two" do
|
58
|
-
hash = distance_of_time_in_words_hash(
|
59
|
+
hash = distance_of_time_in_words_hash(START_TIME, START_TIME + 2.send(name))
|
59
60
|
expect(hash[name]).to eq(2)
|
60
61
|
end
|
61
62
|
end
|
62
63
|
end
|
63
64
|
|
64
65
|
it "should be happy with lots of measurements" do
|
65
|
-
hash = distance_of_time_in_words_hash(
|
66
|
-
|
66
|
+
hash = distance_of_time_in_words_hash(START_TIME,
|
67
|
+
START_TIME + 1.year + 2.months + 3.days + 4.hours + 5.minutes + 6.seconds)
|
67
68
|
expect(hash[:years]).to eq(1)
|
68
69
|
expect(hash[:months]).to eq(2)
|
69
70
|
expect(hash[:days]).to eq(3)
|
@@ -76,20 +77,25 @@ describe "A better distance_of_time_in_words" do
|
|
76
77
|
|
77
78
|
describe "real version" do
|
78
79
|
it "debe hablar español" do
|
79
|
-
expect(distance_of_time_in_words(
|
80
|
-
expect(distance_of_time_in_words(
|
80
|
+
expect(distance_of_time_in_words(START_TIME, START_TIME + 1.days, :locale => :es)).to eq("un día")
|
81
|
+
expect(distance_of_time_in_words(START_TIME, START_TIME + 5.days, :locale => :es)).to eq("5 días")
|
82
|
+
end
|
83
|
+
|
84
|
+
it "deve parlare l'italiano" do
|
85
|
+
expect(distance_of_time_in_words(START_TIME, START_TIME + 1.days, true, :locale => :it)).to eq("un giorno")
|
86
|
+
expect(distance_of_time_in_words(START_TIME, START_TIME + 5.days, true, :locale => :it)).to eq("5 giorni")
|
81
87
|
end
|
82
88
|
|
83
89
|
fragments = [
|
84
|
-
[
|
85
|
-
[
|
86
|
-
[
|
87
|
-
[
|
88
|
-
[
|
89
|
-
[
|
90
|
-
[
|
90
|
+
[START_TIME, START_TIME + 5.days + 3.minutes, "5 days and 3 minutes"],
|
91
|
+
[START_TIME, START_TIME + 1.minute, "1 minute"],
|
92
|
+
[START_TIME, START_TIME + 3.years, "3 years"],
|
93
|
+
[START_TIME, START_TIME + 10.years, "10 years"],
|
94
|
+
[START_TIME, START_TIME + 10.years, "10 years"],
|
95
|
+
[START_TIME, START_TIME + 3.hour, "3 hours"],
|
96
|
+
[START_TIME, START_TIME + 13.months, "1 year and 1 month"],
|
91
97
|
# Any numeric sequence is merely coincidental.
|
92
|
-
[
|
98
|
+
[START_TIME, START_TIME + 1.year + 2.months + 3.days + 4.hours + 5.minutes + 6.seconds, "1 year, 2 months, 3 days, 4 hours, 5 minutes, and 6 seconds"],
|
93
99
|
["2009-3-16".to_time, "2008-4-14".to_time, "11 months and 2 days"],
|
94
100
|
["2009-3-16".to_time + 1.minute, "2008-4-14".to_time, "11 months, 2 days, and 1 minute"],
|
95
101
|
["2009-4-14".to_time, "2008-3-16".to_time, "1 year and 29 days"],
|
@@ -104,26 +110,28 @@ describe "A better distance_of_time_in_words" do
|
|
104
110
|
|
105
111
|
describe "accumulate on" do
|
106
112
|
fragments = [
|
107
|
-
[
|
108
|
-
|
113
|
+
[START_TIME,
|
114
|
+
START_TIME + 10.minute,
|
109
115
|
:seconds,
|
110
116
|
"600 seconds"],
|
111
|
-
[
|
112
|
-
|
117
|
+
[START_TIME,
|
118
|
+
START_TIME + 10.hour + 10.minute + 1.second,
|
113
119
|
:minutes,
|
114
120
|
"610 minutes and 1 second"],
|
115
|
-
[
|
116
|
-
|
121
|
+
[START_TIME,
|
122
|
+
START_TIME + 2.day + 10000.hour + 10.second,
|
117
123
|
:hours,
|
118
124
|
"10048 hours and 10 seconds"],
|
119
|
-
[
|
120
|
-
|
125
|
+
[START_TIME,
|
126
|
+
START_TIME + 2.day + 10000.hour + 10.second,
|
121
127
|
:days,
|
122
128
|
"418 days, 16 hours, and 10 seconds"],
|
123
|
-
[
|
124
|
-
|
129
|
+
[START_TIME,
|
130
|
+
START_TIME + 2.day + 10000.hour + 10.second,
|
125
131
|
:months,
|
126
|
-
"13 months, 16 hours, and 10 seconds"]
|
132
|
+
"13 months, 22 days, 16 hours, and 10 seconds"],
|
133
|
+
["2015-1-15".to_time, "2016-3-15".to_time, :months, "14 months"]
|
134
|
+
|
127
135
|
]
|
128
136
|
fragments.each do |start, finish, accumulator, output|
|
129
137
|
it "should be #{output}" do
|
@@ -155,77 +163,89 @@ describe "A better distance_of_time_in_words" do
|
|
155
163
|
describe "with output options" do
|
156
164
|
fragments = [
|
157
165
|
# Any numeric sequence is merely coincidental.
|
158
|
-
[
|
159
|
-
|
166
|
+
[START_TIME,
|
167
|
+
START_TIME + 1.year + 2.months + 3.days + 4.hours + 5.minutes + 6.seconds,
|
160
168
|
{ :words_connector => " - " },
|
161
169
|
"1 year - 2 months - 3 days - 4 hours - 5 minutes, and 6 seconds"],
|
162
|
-
[
|
163
|
-
|
170
|
+
[START_TIME,
|
171
|
+
START_TIME + 5.minutes + 6.seconds,
|
164
172
|
{ :two_words_connector => " - " },
|
165
173
|
"5 minutes - 6 seconds"],
|
166
|
-
[
|
167
|
-
|
174
|
+
[START_TIME,
|
175
|
+
START_TIME + 4.hours + 5.minutes + 6.seconds,
|
168
176
|
{ :last_word_connector => " - " },
|
169
177
|
"4 hours, 5 minutes - 6 seconds"],
|
170
|
-
[
|
171
|
-
|
178
|
+
[START_TIME,
|
179
|
+
START_TIME + 1.year + 2.months + 3.days + 4.hours + 5.minutes + 6.seconds,
|
172
180
|
{ :except => "minutes" },
|
173
181
|
"1 year, 2 months, 3 days, 4 hours, and 6 seconds"],
|
174
|
-
[
|
175
|
-
|
182
|
+
[START_TIME,
|
183
|
+
START_TIME + 1.hour + 1.minute,
|
176
184
|
{ :except => "minutes"}, "1 hour"],
|
177
|
-
[
|
178
|
-
|
185
|
+
[START_TIME,
|
186
|
+
START_TIME + 1.hour + 1.day + 1.minute,
|
179
187
|
{ :except => ["minutes", "hours"]},
|
180
188
|
"1 day"],
|
181
|
-
[
|
182
|
-
|
189
|
+
[START_TIME,
|
190
|
+
START_TIME + 1.hour + 1.day + 1.minute,
|
183
191
|
{ :only => ["minutes", "hours"]},
|
184
192
|
"1 hour and 1 minute"],
|
185
|
-
[
|
186
|
-
|
193
|
+
[START_TIME,
|
194
|
+
START_TIME + 1.year + 2.months + 3.days + 4.hours + 5.minutes + 6.seconds,
|
187
195
|
{ :vague => true },
|
188
196
|
"about 1 year"],
|
189
|
-
[
|
190
|
-
|
197
|
+
[START_TIME,
|
198
|
+
START_TIME + 1.year + 2.months + 3.days + 4.hours + 5.minutes + 6.seconds,
|
191
199
|
{ :vague => "Yes please" },
|
192
200
|
"about 1 year"],
|
193
|
-
[
|
194
|
-
|
201
|
+
[START_TIME,
|
202
|
+
START_TIME + 1.year + 2.months + 3.days + 4.hours + 5.minutes + 6.seconds,
|
195
203
|
{ :vague => false },
|
196
204
|
"1 year, 2 months, 3 days, 4 hours, 5 minutes, and 6 seconds"],
|
197
|
-
[
|
198
|
-
|
205
|
+
[START_TIME,
|
206
|
+
START_TIME + 1.year + 2.months + 3.days + 4.hours + 5.minutes + 6.seconds,
|
199
207
|
{ :vague => nil },
|
200
208
|
"1 year, 2 months, 3 days, 4 hours, 5 minutes, and 6 seconds"],
|
201
|
-
[
|
202
|
-
|
209
|
+
[START_TIME,
|
210
|
+
START_TIME + 1.year + 2.months + 3.days + 4.hours + 5.minutes + 6.seconds,
|
203
211
|
{ :except => "minutes" },
|
204
212
|
"1 year, 2 months, 3 days, 4 hours, and 6 seconds"],
|
205
|
-
[
|
206
|
-
|
213
|
+
[START_TIME,
|
214
|
+
START_TIME + 1.hour + 2.minutes + 3.seconds,
|
207
215
|
{ :highest_measure_only => true },
|
208
216
|
"1 hour"],
|
209
|
-
[
|
210
|
-
|
217
|
+
[START_TIME,
|
218
|
+
START_TIME + 1.hours + 2.minutes + 3.seconds,
|
211
219
|
{ :highest_measures => 1 },
|
212
220
|
"1 hour"],
|
213
|
-
[
|
214
|
-
|
221
|
+
[START_TIME,
|
222
|
+
START_TIME + 2.year + 3.months + 4.days + 5.hours + 6.minutes + 7.seconds,
|
215
223
|
{ :highest_measures => 3 },
|
216
224
|
"2 years, 3 months, and 4 days"],
|
217
|
-
[
|
218
|
-
|
225
|
+
[START_TIME,
|
226
|
+
START_TIME + 2.year + 3.weeks + 4.days + 5.hours + 6.minutes + 7.seconds,
|
219
227
|
{ :highest_measures => 2 },
|
220
228
|
"2 years and 25 days"],
|
221
|
-
[
|
222
|
-
|
229
|
+
[START_TIME,
|
230
|
+
START_TIME + 4.days + 6.minutes + 7.seconds,
|
223
231
|
{ :highest_measures => 3 },
|
224
232
|
"4 days, 6 minutes, and 7 seconds"],
|
225
|
-
[
|
226
|
-
|
233
|
+
[START_TIME,
|
234
|
+
START_TIME + 1.year + 2.weeks,
|
227
235
|
{ :highest_measures => 3 },
|
228
|
-
"1 year and 14 days"]
|
236
|
+
"1 year and 14 days"],
|
237
|
+
[START_TIME,
|
238
|
+
START_TIME + 1.days,
|
239
|
+
{ :only => [:years, :months] },
|
240
|
+
"less than 1 month"],
|
241
|
+
[START_TIME,
|
242
|
+
START_TIME + 5.minutes,
|
243
|
+
{ :except => [:hours, :minutes, :seconds] },
|
244
|
+
"less than 1 day"],
|
245
|
+
[START_TIME,
|
246
|
+
START_TIME + 1.days,
|
247
|
+
{ :highest_measures => 1, :only => [:years, :months] },
|
248
|
+
"less than 1 month"]
|
229
249
|
]
|
230
250
|
fragments.each do |start, finish, options, output|
|
231
251
|
it "should be #{output}" do
|
@@ -235,12 +255,12 @@ describe "A better distance_of_time_in_words" do
|
|
235
255
|
|
236
256
|
describe "include_seconds" do
|
237
257
|
it "is ignored if only seconds have passed" do
|
238
|
-
expect(distance_of_time_in_words(
|
258
|
+
expect(distance_of_time_in_words(START_TIME, START_TIME + 1.second, false)).to eq("1 second")
|
239
259
|
end
|
240
260
|
|
241
261
|
it "removes seconds in all other cases" do
|
242
|
-
expect(distance_of_time_in_words(
|
243
|
-
|
262
|
+
expect(distance_of_time_in_words(START_TIME,
|
263
|
+
START_TIME + 1.year + 2.months + 3.days + 4.hours + 5.minutes + 6.seconds,
|
244
264
|
false)).to eq("1 year, 2 months, 3 days, 4 hours, and 5 minutes")
|
245
265
|
end
|
246
266
|
end # include_seconds
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dotiw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '
|
4
|
+
version: '3.0'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Bigg
|
@@ -109,12 +109,19 @@ files:
|
|
109
109
|
- dotiw.gemspec
|
110
110
|
- lib/dotiw.rb
|
111
111
|
- lib/dotiw/action_view_ext/helpers/date_helper.rb
|
112
|
+
- lib/dotiw/locale/de.yml
|
112
113
|
- lib/dotiw/locale/en.yml
|
114
|
+
- lib/dotiw/locale/es.yml
|
115
|
+
- lib/dotiw/locale/it.yml
|
116
|
+
- lib/dotiw/locale/ja.yml
|
117
|
+
- lib/dotiw/locale/nb.yml
|
118
|
+
- lib/dotiw/locale/nl.yml
|
119
|
+
- lib/dotiw/locale/pl.yml
|
120
|
+
- lib/dotiw/locale/ru.yml
|
113
121
|
- lib/dotiw/time_hash.rb
|
114
122
|
- lib/dotiw/version.rb
|
115
123
|
- spec/lib/dotiw_spec.rb
|
116
124
|
- spec/spec_helper.rb
|
117
|
-
- spec/translations/es.yml
|
118
125
|
homepage:
|
119
126
|
licenses: []
|
120
127
|
metadata: {}
|
@@ -134,11 +141,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
134
141
|
version: '0'
|
135
142
|
requirements: []
|
136
143
|
rubyforge_project:
|
137
|
-
rubygems_version: 2.
|
144
|
+
rubygems_version: 2.4.6
|
138
145
|
signing_key:
|
139
146
|
specification_version: 4
|
140
147
|
summary: Better distance_of_time_in_words for Rails
|
141
148
|
test_files:
|
142
149
|
- spec/lib/dotiw_spec.rb
|
143
150
|
- spec/spec_helper.rb
|
144
|
-
- spec/translations/es.yml
|