simple_workflow 1.6.0 → 2.1.0
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 +5 -5
- data/Gemfile.lock +128 -98
- data/Rakefile +2 -1
- data/lib/simple_workflow/controller.rb +3 -1
- data/lib/simple_workflow/detour.rb +13 -6
- data/lib/simple_workflow/helper.rb +20 -7
- data/lib/simple_workflow/middleware.rb +11 -3
- data/lib/simple_workflow/railtie.rb +4 -4
- data/lib/simple_workflow/version.rb +1 -1
- data/simple_workflow-2.0.0.gem +0 -0
- data/simple_workflow.gemspec +27 -0
- data/test/controller_test.rb +1 -1
- data/test/helper_test.rb +18 -11
- data/test/middleware_test.rb +9 -6
- data/test/test_helper.rb +6 -4
- metadata +45 -13
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: f3e6b480412f12b33ab1a43ea40edfd280fcf843e7b48307b79a186ea8dfec18
|
|
4
|
+
data.tar.gz: '094717e238b6c347acdab6f597b65b1139f1a73dc2646c55ffe3bc702f2074c2'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: aa6f9b54442208aee5c61201b3277862a055c6d5e7cbf462f0abbf2e8d249909505dd684ca2c786fdafaba445ed55a0b3a0dcee4d6d3afffde7edbe47a3ee92a
|
|
7
|
+
data.tar.gz: 43249992ddb88144cfcc00ced9d9570c2aa722604ae4c2ff6f4d25c23db8f614bf33c0e9b2d197a3d48d92eb06253e35b72e3142d1ec6d090b9e2c380123869b
|
data/Gemfile.lock
CHANGED
|
@@ -1,147 +1,178 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
simple_workflow (1.
|
|
5
|
-
rails (>= 4.2, <
|
|
4
|
+
simple_workflow (2.1.0)
|
|
5
|
+
rails (>= 4.2, < 7)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: https://rubygems.org/
|
|
9
9
|
specs:
|
|
10
|
-
actioncable (
|
|
11
|
-
actionpack (=
|
|
10
|
+
actioncable (6.1.0)
|
|
11
|
+
actionpack (= 6.1.0)
|
|
12
|
+
activesupport (= 6.1.0)
|
|
12
13
|
nio4r (~> 2.0)
|
|
13
14
|
websocket-driver (>= 0.6.1)
|
|
14
|
-
|
|
15
|
-
actionpack (=
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
actionmailbox (6.1.0)
|
|
16
|
+
actionpack (= 6.1.0)
|
|
17
|
+
activejob (= 6.1.0)
|
|
18
|
+
activerecord (= 6.1.0)
|
|
19
|
+
activestorage (= 6.1.0)
|
|
20
|
+
activesupport (= 6.1.0)
|
|
21
|
+
mail (>= 2.7.1)
|
|
22
|
+
actionmailer (6.1.0)
|
|
23
|
+
actionpack (= 6.1.0)
|
|
24
|
+
actionview (= 6.1.0)
|
|
25
|
+
activejob (= 6.1.0)
|
|
26
|
+
activesupport (= 6.1.0)
|
|
18
27
|
mail (~> 2.5, >= 2.5.4)
|
|
19
28
|
rails-dom-testing (~> 2.0)
|
|
20
|
-
actionpack (
|
|
21
|
-
actionview (=
|
|
22
|
-
activesupport (=
|
|
23
|
-
rack (~> 2.0)
|
|
29
|
+
actionpack (6.1.0)
|
|
30
|
+
actionview (= 6.1.0)
|
|
31
|
+
activesupport (= 6.1.0)
|
|
32
|
+
rack (~> 2.0, >= 2.0.9)
|
|
24
33
|
rack-test (>= 0.6.3)
|
|
25
34
|
rails-dom-testing (~> 2.0)
|
|
26
|
-
rails-html-sanitizer (~> 1.0, >= 1.0
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
|
36
|
+
actiontext (6.1.0)
|
|
37
|
+
actionpack (= 6.1.0)
|
|
38
|
+
activerecord (= 6.1.0)
|
|
39
|
+
activestorage (= 6.1.0)
|
|
40
|
+
activesupport (= 6.1.0)
|
|
41
|
+
nokogiri (>= 1.8.5)
|
|
42
|
+
actionview (6.1.0)
|
|
43
|
+
activesupport (= 6.1.0)
|
|
29
44
|
builder (~> 3.1)
|
|
30
45
|
erubi (~> 1.4)
|
|
31
46
|
rails-dom-testing (~> 2.0)
|
|
32
|
-
rails-html-sanitizer (~> 1.
|
|
33
|
-
activejob (
|
|
34
|
-
activesupport (=
|
|
47
|
+
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
|
48
|
+
activejob (6.1.0)
|
|
49
|
+
activesupport (= 6.1.0)
|
|
35
50
|
globalid (>= 0.3.6)
|
|
36
|
-
activemodel (
|
|
37
|
-
activesupport (=
|
|
38
|
-
activerecord (
|
|
39
|
-
activemodel (=
|
|
40
|
-
activesupport (=
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
activerecord (=
|
|
51
|
+
activemodel (6.1.0)
|
|
52
|
+
activesupport (= 6.1.0)
|
|
53
|
+
activerecord (6.1.0)
|
|
54
|
+
activemodel (= 6.1.0)
|
|
55
|
+
activesupport (= 6.1.0)
|
|
56
|
+
activestorage (6.1.0)
|
|
57
|
+
actionpack (= 6.1.0)
|
|
58
|
+
activejob (= 6.1.0)
|
|
59
|
+
activerecord (= 6.1.0)
|
|
60
|
+
activesupport (= 6.1.0)
|
|
45
61
|
marcel (~> 0.3.1)
|
|
46
|
-
|
|
62
|
+
mimemagic (~> 0.3.2)
|
|
63
|
+
activesupport (6.1.0)
|
|
47
64
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
48
|
-
i18n (>=
|
|
49
|
-
minitest (
|
|
50
|
-
tzinfo (~>
|
|
65
|
+
i18n (>= 1.6, < 2)
|
|
66
|
+
minitest (>= 5.1)
|
|
67
|
+
tzinfo (~> 2.0)
|
|
68
|
+
zeitwerk (~> 2.3)
|
|
51
69
|
ansi (1.5.0)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
globalid (0.4.1)
|
|
70
|
+
ast (2.4.1)
|
|
71
|
+
builder (3.2.4)
|
|
72
|
+
concurrent-ruby (1.1.7)
|
|
73
|
+
crass (1.0.6)
|
|
74
|
+
docile (1.3.3)
|
|
75
|
+
erubi (1.10.0)
|
|
76
|
+
globalid (0.4.2)
|
|
60
77
|
activesupport (>= 4.2.0)
|
|
61
|
-
i18n (1.
|
|
78
|
+
i18n (1.8.5)
|
|
62
79
|
concurrent-ruby (~> 1.0)
|
|
63
|
-
|
|
64
|
-
loofah (2.2.2)
|
|
80
|
+
loofah (2.8.0)
|
|
65
81
|
crass (~> 1.0.2)
|
|
66
82
|
nokogiri (>= 1.5.9)
|
|
67
|
-
mail (2.7.
|
|
83
|
+
mail (2.7.1)
|
|
68
84
|
mini_mime (>= 0.1.1)
|
|
69
|
-
marcel (0.3.
|
|
85
|
+
marcel (0.3.3)
|
|
70
86
|
mimemagic (~> 0.3.2)
|
|
71
|
-
method_source (0.
|
|
72
|
-
mimemagic (0.3.
|
|
73
|
-
mini_mime (1.0.
|
|
74
|
-
mini_portile2 (2.
|
|
75
|
-
minitest (5.
|
|
76
|
-
minitest-reporters (1.2
|
|
87
|
+
method_source (1.0.0)
|
|
88
|
+
mimemagic (0.3.5)
|
|
89
|
+
mini_mime (1.0.2)
|
|
90
|
+
mini_portile2 (2.4.0)
|
|
91
|
+
minitest (5.14.2)
|
|
92
|
+
minitest-reporters (1.4.2)
|
|
77
93
|
ansi
|
|
78
94
|
builder
|
|
79
95
|
minitest (>= 5.0)
|
|
80
96
|
ruby-progressbar
|
|
81
|
-
nio4r (2.
|
|
82
|
-
nokogiri (1.
|
|
83
|
-
mini_portile2 (~> 2.
|
|
84
|
-
parallel (1.
|
|
85
|
-
parser (2.
|
|
86
|
-
ast (~> 2.4.
|
|
87
|
-
|
|
88
|
-
rack (2.0.5)
|
|
97
|
+
nio4r (2.5.4)
|
|
98
|
+
nokogiri (1.10.10)
|
|
99
|
+
mini_portile2 (~> 2.4.0)
|
|
100
|
+
parallel (1.20.1)
|
|
101
|
+
parser (2.7.2.0)
|
|
102
|
+
ast (~> 2.4.1)
|
|
103
|
+
rack (2.2.3)
|
|
89
104
|
rack-test (1.1.0)
|
|
90
105
|
rack (>= 1.0, < 3)
|
|
91
|
-
rails (
|
|
92
|
-
actioncable (=
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
106
|
+
rails (6.1.0)
|
|
107
|
+
actioncable (= 6.1.0)
|
|
108
|
+
actionmailbox (= 6.1.0)
|
|
109
|
+
actionmailer (= 6.1.0)
|
|
110
|
+
actionpack (= 6.1.0)
|
|
111
|
+
actiontext (= 6.1.0)
|
|
112
|
+
actionview (= 6.1.0)
|
|
113
|
+
activejob (= 6.1.0)
|
|
114
|
+
activemodel (= 6.1.0)
|
|
115
|
+
activerecord (= 6.1.0)
|
|
116
|
+
activestorage (= 6.1.0)
|
|
117
|
+
activesupport (= 6.1.0)
|
|
118
|
+
bundler (>= 1.15.0)
|
|
119
|
+
railties (= 6.1.0)
|
|
103
120
|
sprockets-rails (>= 2.0.0)
|
|
104
121
|
rails-dom-testing (2.0.3)
|
|
105
122
|
activesupport (>= 4.2.0)
|
|
106
123
|
nokogiri (>= 1.6)
|
|
107
|
-
rails-html-sanitizer (1.0
|
|
108
|
-
loofah (~> 2.
|
|
109
|
-
railties (
|
|
110
|
-
actionpack (=
|
|
111
|
-
activesupport (=
|
|
124
|
+
rails-html-sanitizer (1.3.0)
|
|
125
|
+
loofah (~> 2.3)
|
|
126
|
+
railties (6.1.0)
|
|
127
|
+
actionpack (= 6.1.0)
|
|
128
|
+
activesupport (= 6.1.0)
|
|
112
129
|
method_source
|
|
113
130
|
rake (>= 0.8.7)
|
|
114
|
-
thor (
|
|
131
|
+
thor (~> 1.0)
|
|
115
132
|
rainbow (3.0.0)
|
|
116
|
-
rake (
|
|
117
|
-
|
|
133
|
+
rake (13.0.3)
|
|
134
|
+
regexp_parser (2.0.1)
|
|
135
|
+
rexml (3.2.4)
|
|
136
|
+
rubocop (0.93.1)
|
|
118
137
|
parallel (~> 1.10)
|
|
119
|
-
parser (>= 2.5)
|
|
120
|
-
powerpack (~> 0.1)
|
|
138
|
+
parser (>= 2.7.1.5)
|
|
121
139
|
rainbow (>= 2.2.2, < 4.0)
|
|
140
|
+
regexp_parser (>= 1.8)
|
|
141
|
+
rexml
|
|
142
|
+
rubocop-ast (>= 0.6.0)
|
|
122
143
|
ruby-progressbar (~> 1.7)
|
|
123
|
-
unicode-display_width (
|
|
124
|
-
|
|
125
|
-
|
|
144
|
+
unicode-display_width (>= 1.4.0, < 2.0)
|
|
145
|
+
rubocop-ast (1.3.0)
|
|
146
|
+
parser (>= 2.7.1.5)
|
|
147
|
+
rubocop-performance (1.9.1)
|
|
148
|
+
rubocop (>= 0.90.0, < 2.0)
|
|
149
|
+
rubocop-ast (>= 0.4.0)
|
|
150
|
+
rubocop-rails (2.9.1)
|
|
151
|
+
activesupport (>= 4.2.0)
|
|
152
|
+
rack (>= 1.1)
|
|
153
|
+
rubocop (>= 0.90.0, < 2.0)
|
|
154
|
+
ruby-progressbar (1.10.1)
|
|
155
|
+
simplecov (0.20.0)
|
|
126
156
|
docile (~> 1.1)
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
simplecov-html (0.
|
|
130
|
-
|
|
157
|
+
simplecov-html (~> 0.11)
|
|
158
|
+
simplecov_json_formatter (~> 0.1)
|
|
159
|
+
simplecov-html (0.12.3)
|
|
160
|
+
simplecov_json_formatter (0.1.2)
|
|
161
|
+
sprockets (4.0.2)
|
|
131
162
|
concurrent-ruby (~> 1.0)
|
|
132
163
|
rack (> 1, < 3)
|
|
133
|
-
sprockets-rails (3.2.
|
|
164
|
+
sprockets-rails (3.2.2)
|
|
134
165
|
actionpack (>= 4.0)
|
|
135
166
|
activesupport (>= 4.0)
|
|
136
167
|
sprockets (>= 3.0.0)
|
|
137
|
-
thor (0.
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
websocket-driver (0.7.0)
|
|
168
|
+
thor (1.0.1)
|
|
169
|
+
tzinfo (2.0.4)
|
|
170
|
+
concurrent-ruby (~> 1.0)
|
|
171
|
+
unicode-display_width (1.7.0)
|
|
172
|
+
websocket-driver (0.7.3)
|
|
143
173
|
websocket-extensions (>= 0.1.0)
|
|
144
|
-
websocket-extensions (0.1.
|
|
174
|
+
websocket-extensions (0.1.5)
|
|
175
|
+
zeitwerk (2.4.2)
|
|
145
176
|
|
|
146
177
|
PLATFORMS
|
|
147
178
|
ruby
|
|
@@ -149,8 +180,7 @@ PLATFORMS
|
|
|
149
180
|
DEPENDENCIES
|
|
150
181
|
minitest-reporters (~> 1.0)
|
|
151
182
|
rubocop (~> 0.49)
|
|
183
|
+
rubocop-performance (~> 1.5)
|
|
184
|
+
rubocop-rails (~> 2.4)
|
|
152
185
|
simple_workflow!
|
|
153
186
|
simplecov (~> 0.9)
|
|
154
|
-
|
|
155
|
-
BUNDLED WITH
|
|
156
|
-
1.16.3
|
data/Rakefile
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
require 'rake'
|
|
4
4
|
require 'rake/clean'
|
|
5
5
|
require 'rake/testtask'
|
|
6
|
-
require File.dirname(__FILE__)
|
|
6
|
+
require "#{File.dirname(__FILE__)}/lib/simple_workflow/version"
|
|
7
7
|
|
|
8
8
|
GEM_FILE = "simple_workflow-#{SimpleWorkflow::VERSION}.gem"
|
|
9
9
|
GEM_SPEC_FILE = 'simple_workflow.gemspec'
|
|
@@ -24,6 +24,7 @@ desc 'Push the gem to RubyGems'
|
|
|
24
24
|
task release: :gem do
|
|
25
25
|
output = `git status --porcelain`
|
|
26
26
|
raise "Workspace not clean!\n#{output}" unless output.empty?
|
|
27
|
+
|
|
27
28
|
sh "git tag #{SimpleWorkflow::VERSION}"
|
|
28
29
|
sh 'git push --tags'
|
|
29
30
|
sh "gem push #{GEM_FILE}"
|
|
@@ -31,6 +31,7 @@ module SimpleWorkflow::Controller
|
|
|
31
31
|
|
|
32
32
|
def back(response_status_and_flash)
|
|
33
33
|
return false if session[:detours].nil?
|
|
34
|
+
|
|
34
35
|
detour = pop_detour(session)
|
|
35
36
|
post = detour.delete(:request_method) == :post
|
|
36
37
|
if post
|
|
@@ -58,6 +59,7 @@ module SimpleWorkflow::Controller
|
|
|
58
59
|
end
|
|
59
60
|
|
|
60
61
|
return unless (other_flashes = response_status_and_flash.delete(:flash))
|
|
62
|
+
|
|
61
63
|
flash.update(other_flashes)
|
|
62
64
|
end
|
|
63
65
|
private :save_flash
|
|
@@ -71,6 +73,6 @@ module SimpleWorkflow::Controller
|
|
|
71
73
|
</form>
|
|
72
74
|
</body>
|
|
73
75
|
</html>
|
|
74
|
-
|
|
76
|
+
HTML
|
|
75
77
|
end
|
|
76
78
|
end
|
|
@@ -3,19 +3,26 @@
|
|
|
3
3
|
# Utility methods to manage the breadcrumb history
|
|
4
4
|
module SimpleWorkflow::Detour
|
|
5
5
|
def store_detour_in_session(session, options)
|
|
6
|
-
if session[:detours]
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
if session[:detours]
|
|
7
|
+
if session[:detours].last == options
|
|
8
|
+
Rails.logger.try(:debug, "Ignored duplicate detour: #{options.inspect}")
|
|
9
|
+
return
|
|
10
|
+
end
|
|
11
|
+
if session[:detours].delete(options)
|
|
12
|
+
Rails.logger.try(:debug, "Deleted duplicate detour: #{options.inspect}")
|
|
13
|
+
end
|
|
14
|
+
else
|
|
15
|
+
session[:detours] = []
|
|
9
16
|
end
|
|
10
|
-
session[:detours] ||= []
|
|
11
17
|
session[:detours] << options
|
|
12
18
|
Rails.logger.try(:debug, "Added detour (#{session[:detours].try(:size) || 0}): #{options.inspect}")
|
|
13
19
|
end
|
|
14
20
|
|
|
15
|
-
def pop_detour(session)
|
|
21
|
+
def pop_detour(session, origin_options = nil)
|
|
16
22
|
detours = session[:detours]
|
|
17
23
|
return nil unless detours
|
|
18
|
-
|
|
24
|
+
|
|
25
|
+
detour = detours.delete(origin_options) || detours.pop
|
|
19
26
|
Rails.logger.debug "popped detour: #{detour.inspect} #{session[:detours].size} more"
|
|
20
27
|
reset_workflow(session) if detours.empty?
|
|
21
28
|
detour
|
|
@@ -44,7 +44,7 @@ module SimpleWorkflow::Helper
|
|
|
44
44
|
end
|
|
45
45
|
origin.update(origin_options) if origin.keys == [:anchor]
|
|
46
46
|
url = url_for(options)
|
|
47
|
-
url + (url
|
|
47
|
+
url + (/\?/.match?(url) ? '&' : '?') + origin.to_h.to_param('detour')
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
def origin_options
|
|
@@ -58,9 +58,10 @@ module SimpleWorkflow::Helper
|
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
def image_link_to(image_source, title, url_options, image_options = nil, link_options = nil)
|
|
61
|
-
|
|
61
|
+
case link_options
|
|
62
|
+
when true
|
|
62
63
|
link_options = { method: :post }
|
|
63
|
-
|
|
64
|
+
when false
|
|
64
65
|
link_options = nil
|
|
65
66
|
end
|
|
66
67
|
image_options ||= { class: 'image-submit' }
|
|
@@ -70,9 +71,10 @@ module SimpleWorkflow::Helper
|
|
|
70
71
|
|
|
71
72
|
def image_link_to_remote(image_source, title, link_options, image_options = nil,
|
|
72
73
|
html_options = {})
|
|
73
|
-
|
|
74
|
+
case html_options
|
|
75
|
+
when true
|
|
74
76
|
html_options = { method: :post }
|
|
75
|
-
|
|
77
|
+
when false
|
|
76
78
|
html_options = {}
|
|
77
79
|
end
|
|
78
80
|
image_options ||= { class: 'image-submit' }
|
|
@@ -84,7 +86,12 @@ module SimpleWorkflow::Helper
|
|
|
84
86
|
!session[:detours].nil?
|
|
85
87
|
end
|
|
86
88
|
|
|
87
|
-
def back_or_link_to(title, options = nil, html_options = nil)
|
|
89
|
+
def back_or_link_to(title, options = nil, html_options = nil, &block)
|
|
90
|
+
if block
|
|
91
|
+
html_options = options
|
|
92
|
+
options = title
|
|
93
|
+
title = nil
|
|
94
|
+
end
|
|
88
95
|
if session[:detours]
|
|
89
96
|
link_options = { return_from_detour: true }.update(session[:detours].last)
|
|
90
97
|
|
|
@@ -97,7 +104,13 @@ module SimpleWorkflow::Helper
|
|
|
97
104
|
link_options = options
|
|
98
105
|
end
|
|
99
106
|
|
|
100
|
-
|
|
107
|
+
if link_options
|
|
108
|
+
if block
|
|
109
|
+
link_to(link_options, html_options, &block)
|
|
110
|
+
else
|
|
111
|
+
link_to(title, link_options, html_options)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
101
114
|
rescue ActionController::UrlGenerationError => e
|
|
102
115
|
if session[:detours]
|
|
103
116
|
logger.error "Exception linking to origin: #{e.class} #{e}"
|
|
@@ -43,6 +43,7 @@ class SimpleWorkflow::Middleware
|
|
|
43
43
|
|
|
44
44
|
def remove_old_detours(env)
|
|
45
45
|
return unless session(env).instance_variable_get('@by').is_a?(ActionDispatch::Session::CookieStore)
|
|
46
|
+
|
|
46
47
|
session_size = workflow_size = nil
|
|
47
48
|
session = session(env)
|
|
48
49
|
cookie_jar = cookie_jar(env)
|
|
@@ -53,7 +54,8 @@ class SimpleWorkflow::Middleware
|
|
|
53
54
|
wf_ser_val = serialize_session(cookie_jar, session[:detours])
|
|
54
55
|
workflow_size = encryptor.encrypt_and_sign(wf_ser_val).size
|
|
55
56
|
break unless workflow_size >= 2048 ||
|
|
56
|
-
|
|
57
|
+
(session_size >= 3072 && session[:detours] && !session[:detours].empty?)
|
|
58
|
+
|
|
57
59
|
Rails.logger.warn("Workflow too large (#{workflow_size}/#{session_size}). Dropping oldest detour.")
|
|
58
60
|
session[:detours].shift
|
|
59
61
|
reset_workflow(session) if session[:detours].empty?
|
|
@@ -62,6 +64,7 @@ class SimpleWorkflow::Middleware
|
|
|
62
64
|
session: #{session_size} bytes, workflow(#{session[:detours].try(:size) || 0}): #{workflow_size} bytes
|
|
63
65
|
MSG
|
|
64
66
|
return unless session_size > 4096
|
|
67
|
+
|
|
65
68
|
Rails.logger.warn <<-MSG.strip_heredoc
|
|
66
69
|
simple_workflow: session exceeds cookie size limit: #{session_size} bytes. Workflow empty! Not My Fault!
|
|
67
70
|
MSG
|
|
@@ -71,6 +74,7 @@ class SimpleWorkflow::Middleware
|
|
|
71
74
|
|
|
72
75
|
def remove_discarded_flashes(session)
|
|
73
76
|
return unless (old_flashes = session[:flash] && session[:flash]['discard'])
|
|
77
|
+
|
|
74
78
|
Rails.logger.warn <<-MSG.strip_heredoc
|
|
75
79
|
simple_workflow: found discarded flash entries: #{old_flashes}. Deleting them.
|
|
76
80
|
MSG
|
|
@@ -78,7 +82,7 @@ class SimpleWorkflow::Middleware
|
|
|
78
82
|
Rails.logger.warn "simple_workflow: session: #{session.to_hash}"
|
|
79
83
|
end
|
|
80
84
|
|
|
81
|
-
if ActionPack::VERSION::MAJOR
|
|
85
|
+
if ActionPack::VERSION::MAJOR >= 5
|
|
82
86
|
def serialize_session(cookie_jar, session)
|
|
83
87
|
cookie_jar.send(:serialize, session)
|
|
84
88
|
end
|
|
@@ -90,8 +94,10 @@ class SimpleWorkflow::Middleware
|
|
|
90
94
|
|
|
91
95
|
def encryptor(env)
|
|
92
96
|
return @simple_workflow_encryptor if @simple_workflow_encryptor
|
|
97
|
+
|
|
93
98
|
@simple_workflow_encryptor = cookie_jar(env).instance_variable_get(:@encryptor)
|
|
94
99
|
return @simple_workflow_encryptor if @simple_workflow_encryptor
|
|
100
|
+
|
|
95
101
|
Rails.logger.warn 'simple_workflow: Could not get encryptor from the cookie jar'
|
|
96
102
|
secret_key_base = Rails.application.config.secret_key_base || Rails.application.config.secret_token ||
|
|
97
103
|
SecureRandom.hex(64)
|
|
@@ -105,6 +111,8 @@ class SimpleWorkflow::Middleware
|
|
|
105
111
|
def store_detour_from_params(env)
|
|
106
112
|
store_detour_in_session(session(env), params(env)[:detour]) if params(env)[:detour]
|
|
107
113
|
return unless params(env)[:return_from_detour] && session(env)[:detours]
|
|
108
|
-
|
|
114
|
+
|
|
115
|
+
params_hash = params(env).to_h.reject { |k, _v| %i[detour return_from_detour].include? k.to_sym }
|
|
116
|
+
pop_detour(session(env), params_hash)
|
|
109
117
|
end
|
|
110
118
|
end
|
|
@@ -7,14 +7,14 @@ module SimpleWorkflow
|
|
|
7
7
|
app.middleware.insert_before ActionDispatch::Flash, SimpleWorkflow::Middleware
|
|
8
8
|
|
|
9
9
|
# Make workflow test utility methods available in views
|
|
10
|
-
ActionView::Base.
|
|
10
|
+
ActionView::Base.include SimpleWorkflow::Helper
|
|
11
11
|
|
|
12
12
|
# Make workflow test utility methods available in controllers
|
|
13
|
-
ActionController::Base.
|
|
14
|
-
ActionController::Base.
|
|
13
|
+
ActionController::Base.include SimpleWorkflow::Helper
|
|
14
|
+
ActionController::Base.include SimpleWorkflow::Controller
|
|
15
15
|
|
|
16
16
|
# Make workflow test utility methods available in ActiveSupport test cases
|
|
17
|
-
ActiveSupport::TestCase.
|
|
17
|
+
ActiveSupport::TestCase.include SimpleWorkflow::TestHelper
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
end
|
|
Binary file
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rake'
|
|
4
|
+
require './lib/simple_workflow/version'
|
|
5
|
+
require 'date'
|
|
6
|
+
|
|
7
|
+
Gem::Specification.new do |s|
|
|
8
|
+
s.name = 'simple_workflow'
|
|
9
|
+
s.version = SimpleWorkflow::VERSION
|
|
10
|
+
s.date = Date.today.strftime '%Y-%m-%d' # rubocop:disable Rails/Date
|
|
11
|
+
s.authors = ['Uwe Kubosch']
|
|
12
|
+
s.email = 'uwe@kubosch.no'
|
|
13
|
+
s.summary = 'Add simple breadcrumbs "detour" workflow to Ruby On Rails.'
|
|
14
|
+
s.homepage = 'https://github.com/donv/simple_workflow'
|
|
15
|
+
s.description = 'Expands Ruby on Rails to allow simple breadcrumb detour workflows.'
|
|
16
|
+
s.required_ruby_version = '>= 2.5', '<4'
|
|
17
|
+
s.licenses = %w[MIT]
|
|
18
|
+
s.files = FileList['[A-Z]*', 'lib/**/*', 'test/**/*'].to_a
|
|
19
|
+
|
|
20
|
+
s.add_runtime_dependency('rails', '>=4.2', '<7')
|
|
21
|
+
|
|
22
|
+
s.add_development_dependency('minitest-reporters', '~>1.0')
|
|
23
|
+
s.add_development_dependency('rubocop', '~>1.0')
|
|
24
|
+
s.add_development_dependency('rubocop-performance', '~>1.5')
|
|
25
|
+
s.add_development_dependency('rubocop-rails', '~>2.4')
|
|
26
|
+
s.add_development_dependency('simplecov', '~>0.9')
|
|
27
|
+
end
|
data/test/controller_test.rb
CHANGED
|
@@ -18,7 +18,7 @@ class ControllerTest < MiniTest::Test
|
|
|
18
18
|
@session = {}
|
|
19
19
|
@bad_route = false
|
|
20
20
|
# TODO(uwe): Remove when we stop testing Rails 4.1
|
|
21
|
-
Rails.app_class = TestApp
|
|
21
|
+
Rails.app_class = TestApp unless /^4\.1\./.match?(Rails.version)
|
|
22
22
|
# ODOT
|
|
23
23
|
end
|
|
24
24
|
|
data/test/helper_test.rb
CHANGED
|
@@ -10,18 +10,24 @@ class HelperTest < MiniTest::Test
|
|
|
10
10
|
def test_with_detour
|
|
11
11
|
assert_equal '?detour%5Baction%5D=myaction&detour%5Bcontroller%5D=mycontroller&detour%5Bid%5D=42' \
|
|
12
12
|
'&detour%5Bquery%5D%5Bnested%5D=criterium',
|
|
13
|
-
|
|
13
|
+
with_detour('')
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def test_with_detour_with_origin
|
|
17
17
|
assert_equal '?detour%5Baction%5D=index&detour%5Bcontroller%5D=dashboard',
|
|
18
|
-
|
|
18
|
+
with_detour('', controller: :dashboard, action: :index)
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def test_with_detour_with_only_anchor_as_origin
|
|
22
22
|
assert_equal '?detour%5Baction%5D=myaction&detour%5Banchor%5D=tab_2' \
|
|
23
23
|
'&detour%5Bcontroller%5D=mycontroller&detour%5Bid%5D=42&detour%5Bquery%5D%5Bnested%5D=criterium',
|
|
24
|
-
|
|
24
|
+
with_detour('', anchor: :tab_2)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
module SimpleWorkflow::Controller
|
|
28
|
+
def self.binary_params_for?(_action)
|
|
29
|
+
false
|
|
30
|
+
end
|
|
25
31
|
end
|
|
26
32
|
|
|
27
33
|
def test_with_detour_with_string_origin
|
|
@@ -33,7 +39,7 @@ class HelperTest < MiniTest::Test
|
|
|
33
39
|
|
|
34
40
|
assert_equal '?detour%5Baction%5D=index&detour%5Banchor%5D=tab_2' \
|
|
35
41
|
'&detour%5Bcontroller%5D=simple_workflow%2F&detour%5Bhullo%5D=1',
|
|
36
|
-
|
|
42
|
+
with_detour('', '/dashboard/index?hullo=1#tab_2')
|
|
37
43
|
ensure
|
|
38
44
|
Rails.application = nil
|
|
39
45
|
end
|
|
@@ -45,7 +51,7 @@ class HelperTest < MiniTest::Test
|
|
|
45
51
|
'&detour%5Bquery%5D%5Bnested%5D=criterium',
|
|
46
52
|
{ id: 'link_tag_id', title: 'Link title' },
|
|
47
53
|
],
|
|
48
|
-
|
|
54
|
+
detour_to('Link Text', 'Link target', id: 'link_tag_id', title: 'Link title')
|
|
49
55
|
end
|
|
50
56
|
|
|
51
57
|
def test_image_button_to
|
|
@@ -56,26 +62,27 @@ class HelperTest < MiniTest::Test
|
|
|
56
62
|
onclick: "form.action='{:id=>\"image_tag_id\"}'"
|
|
57
63
|
}
|
|
58
64
|
],
|
|
59
|
-
|
|
65
|
+
image_button_to('my_image.png', 'Link Title', { id: 'image_tag_id' },
|
|
66
|
+
title: 'Image title')
|
|
60
67
|
end
|
|
61
68
|
|
|
62
69
|
def test_image_link_to
|
|
63
70
|
assert_equal [
|
|
64
71
|
['my_image.png', { title: 'Link Title', alt: 'Link Title' }], { id: 'image_tag_id' }, nil
|
|
65
72
|
],
|
|
66
|
-
|
|
73
|
+
image_link_to('my_image.png', 'Link Title', { id: 'image_tag_id' }, title: 'Image title')
|
|
67
74
|
end
|
|
68
75
|
|
|
69
76
|
def test_back_or_link_to
|
|
70
77
|
assert_equal ['Link title', { controller: :mycontroller, action: :my_action }, nil],
|
|
71
|
-
|
|
78
|
+
back_or_link_to('Link title', controller: :mycontroller, action: :my_action)
|
|
72
79
|
end
|
|
73
80
|
|
|
74
81
|
def test_back_or_link_to_with_routing_error
|
|
75
82
|
@session = { detours: [{ controller: :does_not_exist }] }
|
|
76
83
|
@routing_error = ActionController::UrlGenerationError
|
|
77
84
|
assert_equal ['Link title', { controller: :mycontroller, action: :my_action }, nil],
|
|
78
|
-
|
|
85
|
+
back_or_link_to('Link title', controller: :mycontroller, action: :my_action)
|
|
79
86
|
end
|
|
80
87
|
|
|
81
88
|
private
|
|
@@ -87,7 +94,7 @@ class HelperTest < MiniTest::Test
|
|
|
87
94
|
def params
|
|
88
95
|
ActionController::Parameters.new(
|
|
89
96
|
controller: 'mycontroller', action: 'myaction', id: 42, query: { nested: 'criterium' }
|
|
90
|
-
|
|
97
|
+
)
|
|
91
98
|
end
|
|
92
99
|
|
|
93
100
|
def session
|
|
@@ -102,7 +109,7 @@ class HelperTest < MiniTest::Test
|
|
|
102
109
|
if defined?(@routing_error) && @routing_error
|
|
103
110
|
e = @routing_error
|
|
104
111
|
@routing_error = nil
|
|
105
|
-
raise e
|
|
112
|
+
raise e, 'Error'
|
|
106
113
|
end
|
|
107
114
|
options
|
|
108
115
|
end
|
data/test/middleware_test.rb
CHANGED
|
@@ -45,11 +45,13 @@ class MiddlewareTest < MiniTest::Test
|
|
|
45
45
|
_, env, = @stack.call env_for('/?detour[controller]=test_first')
|
|
46
46
|
(50..99).each do |i|
|
|
47
47
|
next_env = env_for("/?detour[controller]=test_#{i}",
|
|
48
|
-
|
|
48
|
+
'rack.session' => env['rack.session'],
|
|
49
|
+
'rack.session.options' => env['rack.session.options'])
|
|
49
50
|
_, env, = @stack.call next_env
|
|
50
51
|
end
|
|
51
52
|
last_env = env_for('/?detour[controller]=test_last',
|
|
52
|
-
|
|
53
|
+
'rack.session' => env['rack.session'],
|
|
54
|
+
'rack.session.options' => env['rack.session.options'])
|
|
53
55
|
status, env, response = @stack.call last_env
|
|
54
56
|
|
|
55
57
|
assert_equal 200, status
|
|
@@ -57,7 +59,7 @@ class MiddlewareTest < MiniTest::Test
|
|
|
57
59
|
assert_equal(%w[session_id detours], env['rack.session'].to_hash.keys)
|
|
58
60
|
|
|
59
61
|
assert_equal(((57..99).to_a + [:last]).map { |i| { 'controller' => "test_#{i}" } },
|
|
60
|
-
|
|
62
|
+
env['rack.session'].to_hash['detours'])
|
|
61
63
|
end
|
|
62
64
|
|
|
63
65
|
def test_huge_detour_over_4k
|
|
@@ -77,8 +79,8 @@ class MiddlewareTest < MiniTest::Test
|
|
|
77
79
|
def test_return_from_detour
|
|
78
80
|
_, headers1, = @stack.call env_for('/?detour[controller]=test_first')
|
|
79
81
|
env = env_for('/?return_from_detour=true',
|
|
80
|
-
|
|
81
|
-
|
|
82
|
+
'rack.session' => headers1['rack.session'],
|
|
83
|
+
'rack.session.options' => headers1['rack.session.options'])
|
|
82
84
|
status, headers, response = @stack.call env
|
|
83
85
|
|
|
84
86
|
assert_equal 200, status
|
|
@@ -92,13 +94,14 @@ class MiddlewareTest < MiniTest::Test
|
|
|
92
94
|
|
|
93
95
|
def env_for(url, opts = {})
|
|
94
96
|
default_opts = {
|
|
97
|
+
ActionDispatch::Cookies::COOKIES_ROTATIONS => ActiveSupport::Messages::RotationConfiguration.new,
|
|
95
98
|
ActionDispatch::Cookies::COOKIES_SERIALIZER => :json,
|
|
96
99
|
ActionDispatch::Cookies::ENCRYPTED_COOKIE_SALT => 'salt',
|
|
97
100
|
ActionDispatch::Cookies::ENCRYPTED_SIGNED_COOKIE_SALT => 'signed_salt',
|
|
98
101
|
ActionDispatch::Cookies::GENERATOR_KEY => ActiveSupport::KeyGenerator.new('secret'),
|
|
99
102
|
ActionDispatch::Cookies::SECRET_KEY_BASE => 'secret',
|
|
100
103
|
}
|
|
101
|
-
if
|
|
104
|
+
if /^5\.2\./.match?(Rails.version)
|
|
102
105
|
default_opts[ActionDispatch::Cookies::COOKIES_ROTATIONS] = Struct.new(:encrypted).new([])
|
|
103
106
|
end
|
|
104
107
|
Rack::MockRequest.env_for(url, default_opts.update(opts))
|
data/test/test_helper.rb
CHANGED
|
@@ -13,8 +13,10 @@ MiniTest::Reporters.use!
|
|
|
13
13
|
require 'rails'
|
|
14
14
|
require 'simple_workflow'
|
|
15
15
|
|
|
16
|
-
if Gem::Requirement.new('~>4.2') =~ Gem::Version.new(Rails.version)
|
|
17
|
-
ActiveSupport::TestCase.test_order = :random
|
|
18
|
-
end
|
|
19
|
-
|
|
20
16
|
FileUtils.mkdir_p File.expand_path '../log', __dir__
|
|
17
|
+
|
|
18
|
+
module SimpleWorkflow::Controller
|
|
19
|
+
def self.action_encoding_template(action)
|
|
20
|
+
false
|
|
21
|
+
end
|
|
22
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: simple_workflow
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 2.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Uwe Kubosch
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2021-02-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|
|
@@ -19,7 +19,7 @@ dependencies:
|
|
|
19
19
|
version: '4.2'
|
|
20
20
|
- - "<"
|
|
21
21
|
- !ruby/object:Gem::Version
|
|
22
|
-
version: '
|
|
22
|
+
version: '7'
|
|
23
23
|
type: :runtime
|
|
24
24
|
prerelease: false
|
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -29,7 +29,7 @@ dependencies:
|
|
|
29
29
|
version: '4.2'
|
|
30
30
|
- - "<"
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: '
|
|
32
|
+
version: '7'
|
|
33
33
|
- !ruby/object:Gem::Dependency
|
|
34
34
|
name: minitest-reporters
|
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -50,14 +50,42 @@ dependencies:
|
|
|
50
50
|
requirements:
|
|
51
51
|
- - "~>"
|
|
52
52
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: '0
|
|
53
|
+
version: '1.0'
|
|
54
|
+
type: :development
|
|
55
|
+
prerelease: false
|
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - "~>"
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '1.0'
|
|
61
|
+
- !ruby/object:Gem::Dependency
|
|
62
|
+
name: rubocop-performance
|
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - "~>"
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '1.5'
|
|
54
68
|
type: :development
|
|
55
69
|
prerelease: false
|
|
56
70
|
version_requirements: !ruby/object:Gem::Requirement
|
|
57
71
|
requirements:
|
|
58
72
|
- - "~>"
|
|
59
73
|
- !ruby/object:Gem::Version
|
|
60
|
-
version: '
|
|
74
|
+
version: '1.5'
|
|
75
|
+
- !ruby/object:Gem::Dependency
|
|
76
|
+
name: rubocop-rails
|
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - "~>"
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '2.4'
|
|
82
|
+
type: :development
|
|
83
|
+
prerelease: false
|
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - "~>"
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '2.4'
|
|
61
89
|
- !ruby/object:Gem::Dependency
|
|
62
90
|
name: simplecov
|
|
63
91
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -91,6 +119,8 @@ files:
|
|
|
91
119
|
- lib/simple_workflow/railtie.rb
|
|
92
120
|
- lib/simple_workflow/test_helper.rb
|
|
93
121
|
- lib/simple_workflow/version.rb
|
|
122
|
+
- simple_workflow-2.0.0.gem
|
|
123
|
+
- simple_workflow.gemspec
|
|
94
124
|
- test/controller_test.rb
|
|
95
125
|
- test/helper_test.rb
|
|
96
126
|
- test/middleware_test.rb
|
|
@@ -100,24 +130,26 @@ homepage: https://github.com/donv/simple_workflow
|
|
|
100
130
|
licenses:
|
|
101
131
|
- MIT
|
|
102
132
|
metadata: {}
|
|
103
|
-
post_install_message:
|
|
133
|
+
post_install_message:
|
|
104
134
|
rdoc_options: []
|
|
105
135
|
require_paths:
|
|
106
136
|
- lib
|
|
107
137
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
108
138
|
requirements:
|
|
109
|
-
- - "
|
|
139
|
+
- - ">="
|
|
140
|
+
- !ruby/object:Gem::Version
|
|
141
|
+
version: '2.5'
|
|
142
|
+
- - "<"
|
|
110
143
|
- !ruby/object:Gem::Version
|
|
111
|
-
version: '
|
|
144
|
+
version: '4'
|
|
112
145
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
146
|
requirements:
|
|
114
147
|
- - ">="
|
|
115
148
|
- !ruby/object:Gem::Version
|
|
116
149
|
version: '0'
|
|
117
150
|
requirements: []
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
signing_key:
|
|
151
|
+
rubygems_version: 3.2.3
|
|
152
|
+
signing_key:
|
|
121
153
|
specification_version: 4
|
|
122
154
|
summary: Add simple breadcrumbs "detour" workflow to Ruby On Rails.
|
|
123
155
|
test_files: []
|