dotiw 2.0 → 3.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.
- 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
|