rack-time-zone-middleware 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|