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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6030c8f5342aa87d294dfef6a8144a3d17997d44
4
- data.tar.gz: 7a9e56ab384b56eda9bb02508ff05c8a107eca85
3
+ metadata.gz: 5597742125cbf05656c5a565c9a47221aa44352a
4
+ data.tar.gz: 16266cec9861ba54fb12b64105b8887f103948b6
5
5
  SHA512:
6
- metadata.gz: 895a59efa778fda557e4a23cf84436dd674099109ffdbe6ea96bb3ec67f32b32f935e13d95772ee47eb72e00f6449dfce0905ff2e957656151a572586e4fa039
7
- data.tar.gz: d18904e4c9b8b2e623626e8822bd236bba3413ad13f06d9451420b03aef30bd71a7a44f00a9fa77db97a556d6f286f145daece52a876cd2d2239fe5722795cc6
6
+ metadata.gz: f1cd433ef9be1d7a7b40d62fef42c55448f30f83607587a218ffe47f560f31ccb981b13e0298fe8e4fa9ba7c30cd65c828942eaaad7010d1c8912b987104a11e
7
+ data.tar.gz: 43e925446255ae98141d3e0eacfcf18592bcf0054b77797ec8dba83799cbd59641e8e28703b1355e5f175876128aae90aa92ec9bedae83cb2c47e846d1266048
data/.gitignore CHANGED
@@ -9,3 +9,7 @@
9
9
  /tmp/
10
10
  /.idea
11
11
  .ruby-version
12
+ .irb_history
13
+ .byebug_history
14
+ /coverage/
15
+ /test/coverage/
data/Gemfile CHANGED
@@ -5,3 +5,8 @@ gemspec
5
5
  gem 'rack', '~> 1.6'
6
6
  gem 'activesupport', '~> 4.0'
7
7
  gem 'coveralls', require: false
8
+
9
+ gem 'pry', platforms: :mri
10
+ gem 'pry-byebug', platforms: :mri
11
+ gem 'minitest-byebug', platforms: :mri
12
+ gem 'byebug', platforms: :mri
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
- ## AngularJS TimeZone updater factory example via [JsTz](http://pellepim.bitbucket.org/jstz/)
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, _ = ::ActiveSupport::TimeZone::MAPPING.detect { |_, v| v.eql? 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
 
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class TimeZoneMiddleware
3
- VERSION = '0.1.3'
3
+ VERSION = '0.1.4'
4
4
  end
5
5
  end
@@ -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 'bundler', '~> 1.0'
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', '~> 5.6'
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.3
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-15 00:00:00.000000000 Z
11
+ date: 2016-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: activesupport
14
+ name: rack
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.0.0
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: 4.0.0
26
+ version: 1.2.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: rack
28
+ name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.2.0
34
- type: :runtime
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: 1.2.0
40
+ version: 4.0.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement