nakajima-rack-flash 0.0.5 → 0.0.6
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.
- data/lib/rack/flash.rb +61 -58
- metadata +1 -11
data/lib/rack/flash.rb
CHANGED
|
@@ -1,33 +1,46 @@
|
|
|
1
|
-
require 'metaid'
|
|
2
|
-
|
|
3
1
|
module Rack
|
|
4
2
|
class Flash
|
|
3
|
+
# Raised when the session passed to FlashHash initialize is nil. This
|
|
4
|
+
# is usually an indicator that session middleware is not in use.
|
|
5
5
|
class SessionUnavailable < StandardError; end
|
|
6
|
-
|
|
6
|
+
|
|
7
7
|
# Implements bracket accessors for storing and retrieving flash entries.
|
|
8
8
|
class FlashHash
|
|
9
9
|
attr_reader :flagged
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
def initialize(store, opts={})
|
|
12
12
|
raise Rack::Flash::SessionUnavailable \
|
|
13
13
|
.new('Rack::Flash depends on session middleware.') unless store
|
|
14
|
-
|
|
14
|
+
|
|
15
15
|
@opts = opts
|
|
16
16
|
@store = store
|
|
17
17
|
@store[:__FLASH__] ||= {}
|
|
18
|
+
|
|
19
|
+
if accessors = @opts[:accessorize]
|
|
20
|
+
accessors.each { |opt| def_accessor(opt) }
|
|
21
|
+
end
|
|
18
22
|
end
|
|
19
23
|
|
|
20
24
|
# Remove an entry from the session and return its value. Cache result in
|
|
21
25
|
# the instance cache.
|
|
22
26
|
def [](key)
|
|
23
|
-
|
|
27
|
+
key = key.to_sym
|
|
28
|
+
cache[key] ||= values.delete(key)
|
|
24
29
|
end
|
|
25
30
|
|
|
26
31
|
# Store the entry in the session, updating the instance cache as well.
|
|
27
32
|
def []=(key,val)
|
|
28
|
-
|
|
33
|
+
key = key.to_sym
|
|
34
|
+
cache[key] = values[key] = val
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Store a flash entry for only the current request, swept regardless of
|
|
38
|
+
# whether or not it was actually accessed. Useful for AJAX requests, where
|
|
39
|
+
# you want a flash message, even though you're response isn't redirecting.
|
|
40
|
+
def now
|
|
41
|
+
cache
|
|
29
42
|
end
|
|
30
|
-
|
|
43
|
+
|
|
31
44
|
# Checks for the presence of a flash entry without retrieving or removing
|
|
32
45
|
# it from the cache or store.
|
|
33
46
|
def has?(key)
|
|
@@ -38,62 +51,29 @@ module Rack
|
|
|
38
51
|
def flag!
|
|
39
52
|
@flagged = values.keys
|
|
40
53
|
end
|
|
41
|
-
|
|
54
|
+
|
|
42
55
|
# Remove flagged entries from flash session, clear flagged list.
|
|
43
56
|
def sweep!
|
|
44
57
|
Array(flagged).each { |key| values.delete(key) }
|
|
45
58
|
flagged.clear
|
|
46
59
|
end
|
|
47
|
-
|
|
60
|
+
|
|
48
61
|
# Hide the underlying :__FLASH__ session key and only expose values stored
|
|
49
62
|
# in the flash.
|
|
50
63
|
def inspect
|
|
51
64
|
'#<FlashHash @values=%s>' % [values.inspect]
|
|
52
65
|
end
|
|
53
|
-
|
|
66
|
+
|
|
54
67
|
# Human readable for logging.
|
|
55
68
|
def to_s
|
|
56
69
|
values.inspect
|
|
57
70
|
end
|
|
58
|
-
|
|
59
|
-
# Allow more convenient style for accessing flash entries (This isn't really
|
|
60
|
-
# necessary for Sinatra, since it provides the flash[:foo] hash that we're all
|
|
61
|
-
# used to. This is for vanilla Rack apps where it can be difficult to define
|
|
62
|
-
# such helpers as middleware).
|
|
63
|
-
def method_missing(sym, *args)
|
|
64
|
-
super unless @opts[:accessorize]
|
|
65
|
-
key = sym.to_s =~ /\w=$/ ? sym.to_s[0..-2] : sym
|
|
66
|
-
def_accessors(key)
|
|
67
|
-
send(sym, *args)
|
|
68
|
-
end
|
|
69
71
|
|
|
70
72
|
private
|
|
71
|
-
|
|
72
|
-
def get(key)
|
|
73
|
-
raise ArgumentError.new("Flash key must be symbol.") unless key.is_a?(Symbol)
|
|
74
|
-
cache[key] ||= values.delete(key)
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def set(key, val)
|
|
78
|
-
raise ArgumentError.new("Flash key must be symbol.") unless key.is_a?(Symbol)
|
|
79
|
-
cache[key] = values[key] = val
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def def_accessors(key)
|
|
83
|
-
return if respond_to?(key)
|
|
84
|
-
|
|
85
|
-
meta_def(key) do
|
|
86
|
-
self[key]
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
meta_def("#{key}=") do |val|
|
|
90
|
-
self[key] = val
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
73
|
|
|
94
|
-
# Maintain an instance-level cache of retrieved flash entries. These
|
|
95
|
-
# will have been removed from the session, but are still available
|
|
96
|
-
# the cache.
|
|
74
|
+
# Maintain an instance-level cache of retrieved flash entries. These
|
|
75
|
+
# entries will have been removed from the session, but are still available
|
|
76
|
+
# through the cache.
|
|
97
77
|
def cache
|
|
98
78
|
@cache ||= {}
|
|
99
79
|
end
|
|
@@ -103,23 +83,46 @@ module Rack
|
|
|
103
83
|
def values
|
|
104
84
|
@store[:__FLASH__]
|
|
105
85
|
end
|
|
86
|
+
|
|
87
|
+
# Generate accessor methods for the given entry key if :accessorize is true.
|
|
88
|
+
def def_accessor(key)
|
|
89
|
+
raise ArgumentError.new('Invalid entry type: %s' % key) if respond_to?(key)
|
|
90
|
+
|
|
91
|
+
class << self; self end.class_eval do
|
|
92
|
+
define_method(key) { |*args| val = args.first; val ? (self[key]=val) : self[key] }
|
|
93
|
+
define_method("#{key}=") { |val| self[key] = val }
|
|
94
|
+
define_method("#{key}!") { |val| cache[key] = val }
|
|
95
|
+
end
|
|
96
|
+
end
|
|
106
97
|
end
|
|
107
|
-
|
|
98
|
+
|
|
99
|
+
# -------------------------------------------------------------------------
|
|
100
|
+
# - Rack Middleware implementation
|
|
101
|
+
|
|
108
102
|
def initialize(app, opts={})
|
|
103
|
+
if defined?(Sinatra::Base)
|
|
104
|
+
Sinatra::Base.class_eval do
|
|
105
|
+
def flash; env['rack-flash'] end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
109
|
@app, @opts = app, opts
|
|
110
110
|
end
|
|
111
111
|
|
|
112
112
|
def call(env)
|
|
113
|
-
env['rack-flash']
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
end
|
|
113
|
+
env['rack-flash'] ||= Rack::Flash::FlashHash.new(env['rack.session'], @opts)
|
|
114
|
+
|
|
115
|
+
if @opts[:sweep]
|
|
116
|
+
env['rack-flash'].flag!
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
res = @app.call(env)
|
|
118
120
|
|
|
119
|
-
if
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
121
|
+
if @opts[:sweep]
|
|
122
|
+
env['rack-flash'].sweep!
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
res
|
|
123
126
|
end
|
|
124
127
|
end
|
|
125
|
-
end
|
|
128
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: nakajima-rack-flash
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Pat Nakajima
|
|
@@ -22,16 +22,6 @@ dependencies:
|
|
|
22
22
|
- !ruby/object:Gem::Version
|
|
23
23
|
version: "0"
|
|
24
24
|
version:
|
|
25
|
-
- !ruby/object:Gem::Dependency
|
|
26
|
-
name: metaid
|
|
27
|
-
type: :runtime
|
|
28
|
-
version_requirement:
|
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
30
|
-
requirements:
|
|
31
|
-
- - ">="
|
|
32
|
-
- !ruby/object:Gem::Version
|
|
33
|
-
version: "0"
|
|
34
|
-
version:
|
|
35
25
|
description:
|
|
36
26
|
email: patnakajima@gmail.com
|
|
37
27
|
executables: []
|