rack-time-zone-middleware 0.1.3 → 0.1.4
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/.gitignore +4 -0
- data/Gemfile +5 -0
- data/README.md +24 -6
- data/lib/rack/time-zone-middleware.rb +20 -2
- data/lib/rack/time-zone-middleware/version.rb +1 -1
- data/rack-time-zone-middleware.gemspec +3 -3
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5597742125cbf05656c5a565c9a47221aa44352a
|
4
|
+
data.tar.gz: 16266cec9861ba54fb12b64105b8887f103948b6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f1cd433ef9be1d7a7b40d62fef42c55448f30f83607587a218ffe47f560f31ccb981b13e0298fe8e4fa9ba7c30cd65c828942eaaad7010d1c8912b987104a11e
|
7
|
+
data.tar.gz: 43e925446255ae98141d3e0eacfcf18592bcf0054b77797ec8dba83799cbd59641e8e28703b1355e5f175876128aae90aa92ec9bedae83cb2c47e846d1266048
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -28,6 +28,18 @@ Or install it yourself as:
|
|
28
28
|
|
29
29
|
$ gem install rack-time-zone-middleware
|
30
30
|
|
31
|
+
## Logic in detail
|
32
|
+
|
33
|
+
1. UI
|
34
|
+
1. Use something like [JsTz](http://pellepim.bitbucket.org/jstz/) to determine users time-zone.
|
35
|
+
2. Write time-zone name to cookie.
|
36
|
+
3. [AngularJS Example](#angularjs)
|
37
|
+
2. Ruby
|
38
|
+
1. Use one of loading ways explained below ([Usage](#usage)).
|
39
|
+
2. Provide cookie `key_name` with options, wich includes detected time-zone.
|
40
|
+
3. Provide enironment `key_name` with options, where you store its value.
|
41
|
+
4. Use `env['key_name']` to access saved value from your application or controller.
|
42
|
+
|
31
43
|
## Usage
|
32
44
|
|
33
45
|
### Sinatra/Padrino application
|
@@ -78,16 +90,22 @@ config.middleware.use Rack::TimeZoneMiddleware do |middleware, env|
|
|
78
90
|
end
|
79
91
|
```
|
80
92
|
|
93
|
+
In theory you can setup dynamic TimeZones detector(when its hash is managed from your Application, from Admin panel or something),
|
94
|
+
but in most of realizations what i saw, it is overhead.
|
95
|
+
|
81
96
|
### Options
|
82
97
|
|
83
98
|
| name | description |
|
84
99
|
|---|---|
|
85
|
-
| default_tz | TimeZone name fallback value (default: 'Europe/Moscow') |
|
86
|
-
| default_as_tz | `ActiveSupport::TimeZone` key name fallback value (default: 'Moscow') |
|
87
|
-
| cookie_key | Cookie key name (default: 'dummy.time_zone') |
|
88
|
-
| time_zone_key | Environment key name (default: 'dummy.time_zone') |
|
100
|
+
| default_tz | `optional`, TimeZone name fallback value (default: 'Europe/Moscow') |
|
101
|
+
| default_as_tz | `optional`, `ActiveSupport::TimeZone` key name fallback value (default: 'Moscow') |
|
102
|
+
| cookie_key | `optional`, Cookie key name (default: 'dummy.time_zone') |
|
103
|
+
| time_zone_key | `optional`, Environment key name (default: 'dummy.time_zone') |
|
104
|
+
| time_zone_map | `optional`, TimeZone `Hash` or `lambda`, like `{'Moscow' => 'Europe/Moscow'}`. If not provided `ActiveSupport` TZInfo map will be tried. |
|
105
|
+
|
106
|
+
## AngularJS
|
89
107
|
|
90
|
-
|
108
|
+
TimeZone updater factory example via [JsTz](http://pellepim.bitbucket.org/jstz/)
|
91
109
|
|
92
110
|
```javascript
|
93
111
|
web.services.factory('JsTz', ['ipCookie', function(ipCookie) {
|
@@ -105,7 +123,7 @@ web.services.factory('JsTz', ['ipCookie', function(ipCookie) {
|
|
105
123
|
## Dependencies:
|
106
124
|
|
107
125
|
- [Rack](https://github.com/rack/rack)
|
108
|
-
- [ActiveSupport](https://github.com/rails/rails)
|
126
|
+
- [ActiveSupport(optional)](https://github.com/rails/rails)
|
109
127
|
|
110
128
|
## Contributing
|
111
129
|
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'rack/time-zone-middleware/version'
|
2
|
-
require 'active_support/values/time_zone'
|
3
2
|
|
4
3
|
module Rack
|
5
4
|
class TimeZoneMiddleware
|
@@ -8,6 +7,8 @@ module Rack
|
|
8
7
|
DEFAULT_KEY = 'dummy.time_zone'
|
9
8
|
DEFAULT_COOKIE_KEY = DEFAULT_KEY
|
10
9
|
|
10
|
+
MAP_WARNING = "Please install `activesupport` gem and `require 'active_support/values/time_zone'` or provide custom TimeZone map, as a `Hash` like `{'Moscow' => 'Europe/Moscow'}`"
|
11
|
+
|
11
12
|
attr_reader :app, :runner, :options
|
12
13
|
|
13
14
|
def initialize(app, opts = {}, &block)
|
@@ -19,6 +20,8 @@ module Rack
|
|
19
20
|
options[:time_zone_key] = opts.fetch(:time_zone_key, DEFAULT_KEY)
|
20
21
|
options[:cookie_key] = opts.fetch(:cookie_key, DEFAULT_COOKIE_KEY)
|
21
22
|
|
23
|
+
@time_zone_map = opts.fetch(:time_zone_map, nil) || default_time_zone_map
|
24
|
+
|
22
25
|
if block_given?
|
23
26
|
@runner = block
|
24
27
|
else
|
@@ -31,12 +34,27 @@ module Rack
|
|
31
34
|
end
|
32
35
|
|
33
36
|
def find_as_time_zone(name)
|
34
|
-
zone_name, _ =
|
37
|
+
zone_name, _ = time_zone_map.detect { |_, v| v.eql? name }
|
35
38
|
zone_name || options[:default_as_tz]
|
39
|
+
rescue
|
40
|
+
options[:default_as_tz]
|
36
41
|
end
|
37
42
|
|
38
43
|
private
|
39
44
|
|
45
|
+
def time_zone_map
|
46
|
+
@time_zone_map.is_a?(Proc) ? @time_zone_map.call : @time_zone_map
|
47
|
+
end
|
48
|
+
|
49
|
+
def default_time_zone_map(no_test=true)
|
50
|
+
if no_test && defined?(::ActiveSupport::TimeZone::MAPPING)
|
51
|
+
-> { ::ActiveSupport::TimeZone::MAPPING }
|
52
|
+
else
|
53
|
+
$stderr.puts MAP_WARNING
|
54
|
+
-> { {} }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
40
58
|
def _call(mw, env)
|
41
59
|
request = ::Rack::Request.new(env)
|
42
60
|
|
@@ -21,10 +21,10 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.require_paths = ['lib']
|
22
22
|
spec.licenses = ['MIT']
|
23
23
|
|
24
|
-
spec.add_runtime_dependency 'activesupport', '>= 4.0.0'
|
25
24
|
spec.add_runtime_dependency 'rack', '>= 1.2.0'
|
26
25
|
|
27
|
-
spec.add_development_dependency '
|
26
|
+
spec.add_development_dependency 'activesupport', '>= 4.0.0'
|
27
|
+
spec.add_development_dependency 'bundler', '~> 1.0'
|
28
28
|
spec.add_development_dependency 'rake'
|
29
|
-
spec.add_development_dependency 'minitest',
|
29
|
+
spec.add_development_dependency 'minitest', '~> 5.6'
|
30
30
|
end
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-time-zone-middleware
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Merkulov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: rack
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.2.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.2.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
-
type: :
|
33
|
+
version: 4.0.0
|
34
|
+
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 4.0.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|