local_time 0.2.0 → 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/MIT-LICENSE +1 -1
- data/README.md +24 -0
- data/app/assets/javascripts/local_time.js.coffee +6 -4
- data/app/helpers/local_time_helper.rb +19 -2
- data/test/helpers/local_time_helper_test.rb +43 -1
- data/test/javascripts/index.js.coffee +1 -0
- data/test/javascripts/unit/public_api_test.js.coffee +21 -0
- data/test/javascripts/unit/time_ago_test.js.coffee +5 -6
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84f0f9773b1e9bfac34c2e579af56d6c784a8d23
|
4
|
+
data.tar.gz: a1606c79f356e6e09b67f5b2adca382e38366a9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88db2bd3c1a77268ef0e8a59a18c81bed59c9f3b837bd3f9d2e555862228ded216dc7a2cf8e2d19a1c06fc262ada3ca319e4b2538eeae3ea826c3ecbe65c113f
|
7
|
+
data.tar.gz: 71e7a980c10839bc5e81dda212a9a99f1dd9a5ec68cbd3a082e754126de0dfccad334e3efc28bb01a1c416b71c31bc7bdece4a9c848a2de60e7d771513de9121
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -37,6 +37,13 @@ Alias for local_time with a month-formatted default
|
|
37
37
|
<%= local_date(time, format: '%B %e, %Y') %>
|
38
38
|
```
|
39
39
|
|
40
|
+
To use a strftime format already defined in your app, pass a symbol as the format.
|
41
|
+
```erb
|
42
|
+
<%= local_time(date, format: :long) %>
|
43
|
+
```
|
44
|
+
|
45
|
+
`I18n.t("time.formats.#{format}")`, `I18n.t("date.formats.#{format}")`, `Time::DATE_FORMATS[format]`, and `Date::DATE_FORMATS[format]` will be scanned (in that order) for your format.
|
46
|
+
|
40
47
|
Note: The included strftime JavaScript implementation is not 100% complete. It supports the following directives: `%a %A %b %B %c %d %e %H %I %l %m %M %p %P %S %w %y %Y`
|
41
48
|
|
42
49
|
#### Time ago helper
|
@@ -63,8 +70,25 @@ Displays the relative amount of time passed. With age, the descriptions transiti
|
|
63
70
|
|
64
71
|
The included JavaScript does not depend on any frameworks or libraries, and listens for a `DOMContentLoaded` event to run initially. It also listens on `document` for `page:update` if you're using Turbolinks and `ajaxSuccess` if you're using jQuery. This should catch most cases where new `<time>` elements have been added to the DOM and process them automatically. If you're adding new elements in another context, trigger `time:elapse` to process them.
|
65
72
|
|
73
|
+
#### JavaScript API
|
74
|
+
|
75
|
+
`strftime` and `relativeTimeAgo` are available via the global `LocalTime` object.
|
76
|
+
|
77
|
+
```js
|
78
|
+
> LocalTime.strftime(new Date, "%B %e, %Y %l:%M%P")
|
79
|
+
"February 9, 2014 12:55pm"
|
80
|
+
|
81
|
+
> LocalTime.relativeTimeAgo(new Date(new Date - 60 * 1000 * 5))
|
82
|
+
"5 minutes ago"
|
83
|
+
```
|
84
|
+
|
66
85
|
#### Version History
|
67
86
|
|
87
|
+
**0.3.0** (February 9, 2014)
|
88
|
+
|
89
|
+
* Allow :format option lookup in I18n or DATE_FORMATS hashes [Paul Dobbins]
|
90
|
+
* Expose public API to JavaScript helpers
|
91
|
+
|
68
92
|
**0.2.0** (December 10, 2013)
|
69
93
|
|
70
94
|
* Prefer `textContent` over `innerText` for Firefox compatibility
|
@@ -83,9 +83,6 @@ class CalendarDate
|
|
83
83
|
|
84
84
|
|
85
85
|
class RelativeTimeAgo
|
86
|
-
@generate: (date) ->
|
87
|
-
new this(date).toString()
|
88
|
-
|
89
86
|
constructor: (@date) ->
|
90
87
|
@calendarDate = CalendarDate.fromDate @date
|
91
88
|
|
@@ -146,6 +143,8 @@ class RelativeTimeAgo
|
|
146
143
|
formatTime: ->
|
147
144
|
strftime @date, '%l:%M%P'
|
148
145
|
|
146
|
+
relativeTimeAgo = (date) ->
|
147
|
+
new RelativeTimeAgo(date).toString()
|
149
148
|
|
150
149
|
domLoaded = false
|
151
150
|
|
@@ -187,10 +186,13 @@ document.addEventListener "DOMContentLoaded", ->
|
|
187
186
|
element.setAttribute "data-localized", true
|
188
187
|
strftime time, format
|
189
188
|
when "time-ago"
|
190
|
-
|
189
|
+
relativeTimeAgo time
|
191
190
|
|
192
191
|
setInterval ->
|
193
192
|
event = document.createEvent "Events"
|
194
193
|
event.initEvent "time:elapse", true, true
|
195
194
|
document.dispatchEvent event
|
196
195
|
, 60 * 1000
|
196
|
+
|
197
|
+
# Public API
|
198
|
+
@LocalTime = {strftime, relativeTimeAgo}
|
@@ -1,7 +1,9 @@
|
|
1
1
|
module LocalTimeHelper
|
2
|
+
DEFAULT_FORMAT = '%B %e, %Y %l:%M%P'
|
3
|
+
|
2
4
|
def local_time(time, options = {})
|
3
5
|
time = utc_time(time)
|
4
|
-
format = options.delete(:format)
|
6
|
+
format = time_format(options.delete(:format))
|
5
7
|
|
6
8
|
options[:data] ||= {}
|
7
9
|
options[:data].merge! local: :time, format: format
|
@@ -20,7 +22,7 @@ module LocalTimeHelper
|
|
20
22
|
options[:data] ||= {}
|
21
23
|
options[:data].merge! local: 'time-ago'
|
22
24
|
|
23
|
-
time_tag time, time.strftime(
|
25
|
+
time_tag time, time.strftime(DEFAULT_FORMAT), options
|
24
26
|
end
|
25
27
|
|
26
28
|
def utc_time(time_or_date)
|
@@ -30,4 +32,19 @@ module LocalTimeHelper
|
|
30
32
|
time_or_date.to_time.utc
|
31
33
|
end
|
32
34
|
end
|
35
|
+
|
36
|
+
private
|
37
|
+
def time_format(format)
|
38
|
+
if format.is_a?(Symbol)
|
39
|
+
if (i18n_format = I18n.t("time.formats.#{format}", default: [:"date.formats.#{format}", ''])).present?
|
40
|
+
i18n_format
|
41
|
+
elsif (date_format = Time::DATE_FORMATS[format] || Date::DATE_FORMATS[format])
|
42
|
+
date_format.is_a?(Proc) ? DEFAULT_FORMAT : date_format
|
43
|
+
else
|
44
|
+
DEFAULT_FORMAT
|
45
|
+
end
|
46
|
+
else
|
47
|
+
format.presence || DEFAULT_FORMAT
|
48
|
+
end
|
49
|
+
end
|
33
50
|
end
|
@@ -3,6 +3,7 @@ require 'active_support/all'
|
|
3
3
|
require 'action_view'
|
4
4
|
require 'minitest/autorun'
|
5
5
|
|
6
|
+
I18n.enforce_available_locales = false
|
6
7
|
|
7
8
|
class LocalTimeHelperTest < MiniTest::Unit::TestCase
|
8
9
|
include ActionView::Helpers::DateHelper, ActionView::Helpers::TagHelper
|
@@ -11,6 +12,11 @@ class LocalTimeHelperTest < MiniTest::Unit::TestCase
|
|
11
12
|
def setup
|
12
13
|
@original_zone = Time.zone
|
13
14
|
Time.zone = ActiveSupport::TimeZone["Central Time (US & Canada)"]
|
15
|
+
I18n.backend.store_translations(:en, {
|
16
|
+
time: { formats: { simple_time: "%b %e" } },
|
17
|
+
date: { formats: { simple_date: "%b %e" } } })
|
18
|
+
Time::DATE_FORMATS[:time_formats_simple_time] = '%b %e'
|
19
|
+
Date::DATE_FORMATS[:date_formats_simple_date] = '%b %e'
|
14
20
|
|
15
21
|
@date = "2013-11-21"
|
16
22
|
@time = Time.zone.parse(@date)
|
@@ -45,6 +51,27 @@ class LocalTimeHelperTest < MiniTest::Unit::TestCase
|
|
45
51
|
assert_equal expected, local_time(@time, format: '%b %e')
|
46
52
|
end
|
47
53
|
|
54
|
+
def test_local_time_with_i18n_format
|
55
|
+
expected = %Q(<time data-format="%b %e" data-local="time" datetime="#{@time_js}">Nov 21</time>)
|
56
|
+
assert_equal expected, local_time(@time, format: :simple_time)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_local_time_with_date_formats_format
|
60
|
+
expected = %Q(<time data-format="%b %e" data-local="time" datetime="#{@time_js}">Nov 21</time>)
|
61
|
+
assert_equal expected, local_time(@time, format: :time_formats_simple_time)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_local_time_with_missing_i18n_and_date_formats_format
|
65
|
+
expected = %Q(<time data-format="%B %e, %Y %l:%M%P" data-local="time" datetime="#{@time_js}">November 21, 2013 6:00am</time>)
|
66
|
+
assert_equal expected, local_time(@time, format: :missing_format)
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_local_time_with_date_formats_proc_format
|
70
|
+
Time::DATE_FORMATS[:proc] = proc { |time| "nope" }
|
71
|
+
expected = %Q(<time data-format="%B %e, %Y %l:%M%P" data-local="time" datetime="#{@time_js}">November 21, 2013 6:00am</time>)
|
72
|
+
assert_equal expected, local_time(@time, format: :proc)
|
73
|
+
end
|
74
|
+
|
48
75
|
def test_local_time_with_options
|
49
76
|
expected = %Q(<time data-format="%b %e" data-local="time" datetime="#{@time_js}" style="display:none">Nov 21</time>)
|
50
77
|
assert_equal expected, local_time(@time, format: '%b %e', style: 'display:none')
|
@@ -58,7 +85,22 @@ class LocalTimeHelperTest < MiniTest::Unit::TestCase
|
|
58
85
|
|
59
86
|
def test_local_date_with_format
|
60
87
|
expected = %Q(<time data-format="%b %e" data-local="time" datetime="#{@time_js}">Nov 21</time>)
|
61
|
-
assert_equal expected, local_date(@time, format: '%b %e')
|
88
|
+
assert_equal expected, local_date(@time.to_date, format: '%b %e')
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_local_date_with_i18n_format
|
92
|
+
expected = %Q(<time data-format="%b %e" data-local="time" datetime="#{@time_js}">Nov 21</time>)
|
93
|
+
assert_equal expected, local_date(@time.to_date, format: :simple_date)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_local_date_with_date_formats_format
|
97
|
+
expected = %Q(<time data-format="%b %e" data-local="time" datetime="#{@time_js}">Nov 21</time>)
|
98
|
+
assert_equal expected, local_date(@time.to_date, format: :date_formats_simple_date)
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_local_date_with_missing_i18n_and_date_formats_format
|
102
|
+
expected = %Q(<time data-format="%B %e, %Y %l:%M%P" data-local="time" datetime="#{@time_js}">November 21, 2013 6:00am</time>)
|
103
|
+
assert_equal expected, local_date(@time.to_date, format: :missing_date_format)
|
62
104
|
end
|
63
105
|
|
64
106
|
def test_local_time_ago
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module "public API"
|
2
|
+
|
3
|
+
test "strftime", ->
|
4
|
+
datetime = "2013-11-12T12:13:00Z"
|
5
|
+
time = new Date Date.parse datetime
|
6
|
+
format = "%B %e, %Y %l:%M%P"
|
7
|
+
results = LocalTime.strftime time, format
|
8
|
+
|
9
|
+
ok results
|
10
|
+
|
11
|
+
datetimeParsed = moment datetime
|
12
|
+
localParsed = moment results, "MMMM D, YYYY h:mma"
|
13
|
+
|
14
|
+
ok datetimeParsed.isValid()
|
15
|
+
ok localParsed.isValid()
|
16
|
+
equal datetimeParsed.toString(), localParsed.toString()
|
17
|
+
|
18
|
+
test "relativeTimeAgo", ->
|
19
|
+
time = moment().subtract("minutes", 42).toDate()
|
20
|
+
results = LocalTime.relativeTimeAgo(time)
|
21
|
+
equal results, "42 minutes ago"
|
@@ -30,12 +30,11 @@ test "last week", ->
|
|
30
30
|
assertTimeAgo "#{day} at #{time}", "days", 5
|
31
31
|
|
32
32
|
test "this year", ->
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
33
|
+
clock = sinon.useFakeTimers(new Date(2013,11,11,11,11).getTime(), "Date")
|
34
|
+
date = moment().subtract("days", 7).format "MMM D"
|
35
|
+
assertTimeAgo "on #{date}", "days", 7
|
36
|
+
clock.restore()
|
37
|
+
|
39
38
|
test "last year", ->
|
40
39
|
date = moment().subtract("days", 366).format "MMM D, YYYY"
|
41
40
|
assertTimeAgo "on #{date}", "days", 366
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: local_time
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Javan Makhmali
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-02-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: coffee-rails
|
@@ -56,6 +56,7 @@ files:
|
|
56
56
|
- test/javascripts/index.js.coffee
|
57
57
|
- test/javascripts/unit/local_time_test.js.coffee
|
58
58
|
- test/javascripts/unit/page_events_test.js.coffee
|
59
|
+
- test/javascripts/unit/public_api_test.js.coffee
|
59
60
|
- test/javascripts/unit/strftime_test.js.coffee
|
60
61
|
- test/javascripts/unit/time_ago_test.js.coffee
|
61
62
|
homepage:
|
@@ -89,5 +90,6 @@ test_files:
|
|
89
90
|
- test/javascripts/index.js.coffee
|
90
91
|
- test/javascripts/unit/local_time_test.js.coffee
|
91
92
|
- test/javascripts/unit/page_events_test.js.coffee
|
93
|
+
- test/javascripts/unit/public_api_test.js.coffee
|
92
94
|
- test/javascripts/unit/strftime_test.js.coffee
|
93
95
|
- test/javascripts/unit/time_ago_test.js.coffee
|