local_time 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c2499d2a165c030164525b49b02920c90c4b4953
4
- data.tar.gz: 41e33a6cbb60e66d98aba1a9089b82e324207314
3
+ metadata.gz: 84f0f9773b1e9bfac34c2e579af56d6c784a8d23
4
+ data.tar.gz: a1606c79f356e6e09b67f5b2adca382e38366a9f
5
5
  SHA512:
6
- metadata.gz: a03eda21f6d818690cf468931e43f832afdf5fc27a5adaac2d6af551b48b5f2fff3b0990e98d5ef2d49edd3ff361a4776c2e10a691a8598f69940844108c984f
7
- data.tar.gz: d9843bb2c0f6a8f892a99218a1e95c25ea88f55ddef92be471ceac46ce25d352974947219c08de3e0cfe96b28fb4081cde6b7ebe09432673628db4e6e963a53f
6
+ metadata.gz: 88db2bd3c1a77268ef0e8a59a18c81bed59c9f3b837bd3f9d2e555862228ded216dc7a2cf8e2d19a1c06fc262ada3ca319e4b2538eeae3ea826c3ecbe65c113f
7
+ data.tar.gz: 71e7a980c10839bc5e81dda212a9a99f1dd9a5ec68cbd3a082e754126de0dfccad334e3efc28bb01a1c416b71c31bc7bdece4a9c848a2de60e7d771513de9121
@@ -1,4 +1,4 @@
1
- Copyright 2013 Javan Makhmali
1
+ Copyright 2014 Javan Makhmali
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
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
- RelativeTimeAgo.generate time
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).presence || '%B %e, %Y %l:%M%P'
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('%B %e, %Y %l:%M%P'), options
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
@@ -1,5 +1,6 @@
1
1
  #= require qunit
2
2
  #= require moment
3
+ #= require sinon-timers
3
4
  #= require local_time
4
5
  #= require_directory ./unit
5
6
  #= require_self
@@ -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
- # This will fail on the first 7 days of the year.
34
- # Not sure how to test without somehow stubbing Date.
35
- if moment().dayOfYear() > 7
36
- date = moment().subtract("days", 7).format "MMM D"
37
- assertTimeAgo "on #{date}", "days", 7
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.2.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: 2013-12-11 00:00:00.000000000 Z
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