class Rack::TimeZoneMiddleware

Constants

DEFAULT_AS_TIME_ZONE
DEFAULT_KEY
DEFAULT_TIME_ZONE
MAP_WARNING
VERSION

Attributes

app[R]
options[R]
runner[R]

Public Class Methods

new(app, opts = {}, &block) click to toggle source
# File lib/rack/time-zone-middleware.rb, line 14
def initialize(app, opts = {}, &block)
  @app = app

  @options = {}
  options[:default_tz]    = opts.fetch(:default_tz, DEFAULT_TIME_ZONE)
  options[:default_as_tz] = opts.fetch(:default_as_tz, DEFAULT_AS_TIME_ZONE)
  options[:time_zone_key] = opts.fetch(:time_zone_key, DEFAULT_KEY)
  options[:cookie_key]    = opts.fetch(:cookie_key, DEFAULT_COOKIE_KEY)

  @time_zone_map = opts.fetch(:time_zone_map, nil) || default_time_zone_map

  if block_given?
    @runner = block
  else
    @runner = ->(mw, env) { _call(mw, env) }
  end
end

Public Instance Methods

call(env) click to toggle source
# File lib/rack/time-zone-middleware.rb, line 32
def call(env)
  runner.call(self, env)
end
find_as_time_zone(name) click to toggle source
# File lib/rack/time-zone-middleware.rb, line 36
def find_as_time_zone(name)
  zone_name, _ = time_zone_map.detect { |_, v| v.eql? name }
  zone_name || options[:default_as_tz]
rescue
  options[:default_as_tz]
end

Private Instance Methods

_call(mw, env) click to toggle source
# File lib/rack/time-zone-middleware.rb, line 58
def _call(mw, env)
  request = ::Rack::Request.new(env)

  time_zone = request.cookies[mw.options[:cookie_key]] || mw.options[:default_tz]
  env[mw.options[:time_zone_key]] = mw.find_as_time_zone(time_zone)

  mw.app.call(env)
end
default_time_zone_map(no_test=true) click to toggle source
# File lib/rack/time-zone-middleware.rb, line 49
def default_time_zone_map(no_test=true)
  if no_test && defined?(::ActiveSupport::TimeZone::MAPPING)
    -> { ::ActiveSupport::TimeZone::MAPPING }
  else
    $stderr.puts MAP_WARNING
    -> { {} }
  end
end
time_zone_map() click to toggle source
# File lib/rack/time-zone-middleware.rb, line 45
def time_zone_map
  @time_zone_map.is_a?(Proc) ? @time_zone_map.call : @time_zone_map
end