simple_workflow 1.0.11 → 1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1159a9e1ad93965adecf21d36c2f7d966dd5146e
4
- data.tar.gz: da4c0ada51c13752d4ba46f6f8b779d8e243e5bc
3
+ metadata.gz: 7b0aaefffccf2f6cae0b554c08bdfdd59535a2a2
4
+ data.tar.gz: 8be9945fb088a813a4e79c83378137957f99c924
5
5
  SHA512:
6
- metadata.gz: 3eaf6642c535336d4d2c9f9150b0c36c1fc56a20be071b5d29c4559a0af356115a0d0f255cf978ca14b14d65aed488e0bea01c9516bb22f6c38289a988eb9a92
7
- data.tar.gz: 66cd0e22959d4a52aa82dfa5252d1a3e5b05815af28bda62dc3ac407fcb1f4edb46945cde57bfc78444475a8b41779d85886b473245fcbf32aa829d0da4696f5
6
+ metadata.gz: 5b82cee1cbdfe7841ca5f22dc0bb885e321c287d1da1e12d727d66a76dabd5e84dcbb32f1d5adf56d02879b090f961d679a90401b15737f39687837b35bd5f55
7
+ data.tar.gz: 89fcca43ee312be2d4e188b8bddc5c60996eaba10778eb0d07da7d4e9e7460169a2dac1d1c022b0735b8805cd5d935afe532c38b97c335f5cbdc67e0c3a66e9a
data/Gemfile.lock CHANGED
@@ -1,108 +1,117 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simple_workflow (1.0.11)
4
+ simple_workflow (1.1.0)
5
5
  rails (~> 4.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- actionmailer (4.2.0)
11
- actionpack (= 4.2.0)
12
- actionview (= 4.2.0)
13
- activejob (= 4.2.0)
10
+ actionmailer (4.2.6)
11
+ actionpack (= 4.2.6)
12
+ actionview (= 4.2.6)
13
+ activejob (= 4.2.6)
14
14
  mail (~> 2.5, >= 2.5.4)
15
15
  rails-dom-testing (~> 1.0, >= 1.0.5)
16
- actionpack (4.2.0)
17
- actionview (= 4.2.0)
18
- activesupport (= 4.2.0)
19
- rack (~> 1.6.0)
16
+ actionpack (4.2.6)
17
+ actionview (= 4.2.6)
18
+ activesupport (= 4.2.6)
19
+ rack (~> 1.6)
20
20
  rack-test (~> 0.6.2)
21
21
  rails-dom-testing (~> 1.0, >= 1.0.5)
22
- rails-html-sanitizer (~> 1.0, >= 1.0.1)
23
- actionview (4.2.0)
24
- activesupport (= 4.2.0)
22
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
23
+ actionview (4.2.6)
24
+ activesupport (= 4.2.6)
25
25
  builder (~> 3.1)
26
26
  erubis (~> 2.7.0)
27
27
  rails-dom-testing (~> 1.0, >= 1.0.5)
28
- rails-html-sanitizer (~> 1.0, >= 1.0.1)
29
- activejob (4.2.0)
30
- activesupport (= 4.2.0)
28
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
29
+ activejob (4.2.6)
30
+ activesupport (= 4.2.6)
31
31
  globalid (>= 0.3.0)
32
- activemodel (4.2.0)
33
- activesupport (= 4.2.0)
32
+ activemodel (4.2.6)
33
+ activesupport (= 4.2.6)
34
34
  builder (~> 3.1)
35
- activerecord (4.2.0)
36
- activemodel (= 4.2.0)
37
- activesupport (= 4.2.0)
35
+ activerecord (4.2.6)
36
+ activemodel (= 4.2.6)
37
+ activesupport (= 4.2.6)
38
38
  arel (~> 6.0)
39
- activesupport (4.2.0)
39
+ activesupport (4.2.6)
40
40
  i18n (~> 0.7)
41
41
  json (~> 1.7, >= 1.7.7)
42
42
  minitest (~> 5.1)
43
43
  thread_safe (~> 0.3, >= 0.3.4)
44
44
  tzinfo (~> 1.1)
45
- arel (6.0.0)
45
+ ansi (1.5.0)
46
+ arel (6.0.3)
46
47
  builder (3.2.2)
48
+ concurrent-ruby (1.0.1)
49
+ docile (1.1.5)
47
50
  erubis (2.7.0)
48
- globalid (0.3.0)
51
+ globalid (0.3.6)
49
52
  activesupport (>= 4.1.0)
50
- hike (1.2.3)
51
53
  i18n (0.7.0)
52
- json (1.8.2)
53
- json (1.8.2-java)
54
- loofah (2.0.1)
54
+ json (1.8.3)
55
+ json (1.8.3-java)
56
+ loofah (2.0.3)
55
57
  nokogiri (>= 1.5.9)
56
- mail (2.6.3)
57
- mime-types (>= 1.16, < 3)
58
- mime-types (2.4.3)
59
- mini_portile (0.6.2)
60
- minitest (5.5.1)
61
- multi_json (1.10.1)
62
- nokogiri (1.6.5)
63
- mini_portile (~> 0.6.0)
64
- nokogiri (1.6.5-java)
65
- rack (1.6.0)
58
+ mail (2.6.4)
59
+ mime-types (>= 1.16, < 4)
60
+ mime-types (3.0)
61
+ mime-types-data (~> 3.2015)
62
+ mime-types-data (3.2016.0221)
63
+ mini_portile2 (2.0.0)
64
+ minitest (5.8.4)
65
+ minitest-reporters (1.1.8)
66
+ ansi
67
+ builder
68
+ minitest (>= 5.0)
69
+ ruby-progressbar
70
+ nokogiri (1.6.7.2)
71
+ mini_portile2 (~> 2.0.0.rc2)
72
+ rack (1.6.4)
66
73
  rack-test (0.6.3)
67
74
  rack (>= 1.0)
68
- rails (4.2.0)
69
- actionmailer (= 4.2.0)
70
- actionpack (= 4.2.0)
71
- actionview (= 4.2.0)
72
- activejob (= 4.2.0)
73
- activemodel (= 4.2.0)
74
- activerecord (= 4.2.0)
75
- activesupport (= 4.2.0)
75
+ rails (4.2.6)
76
+ actionmailer (= 4.2.6)
77
+ actionpack (= 4.2.6)
78
+ actionview (= 4.2.6)
79
+ activejob (= 4.2.6)
80
+ activemodel (= 4.2.6)
81
+ activerecord (= 4.2.6)
82
+ activesupport (= 4.2.6)
76
83
  bundler (>= 1.3.0, < 2.0)
77
- railties (= 4.2.0)
84
+ railties (= 4.2.6)
78
85
  sprockets-rails
79
86
  rails-deprecated_sanitizer (1.0.3)
80
87
  activesupport (>= 4.2.0.alpha)
81
- rails-dom-testing (1.0.5)
88
+ rails-dom-testing (1.0.7)
82
89
  activesupport (>= 4.2.0.beta, < 5.0)
83
90
  nokogiri (~> 1.6.0)
84
91
  rails-deprecated_sanitizer (>= 1.0.1)
85
- rails-html-sanitizer (1.0.1)
92
+ rails-html-sanitizer (1.0.3)
86
93
  loofah (~> 2.0)
87
- railties (4.2.0)
88
- actionpack (= 4.2.0)
89
- activesupport (= 4.2.0)
94
+ railties (4.2.6)
95
+ actionpack (= 4.2.6)
96
+ activesupport (= 4.2.6)
90
97
  rake (>= 0.8.7)
91
98
  thor (>= 0.18.1, < 2.0)
92
- rake (10.4.2)
93
- sprockets (2.12.3)
94
- hike (~> 1.2)
95
- multi_json (~> 1.0)
96
- rack (~> 1.0)
97
- tilt (~> 1.1, != 1.3.0)
98
- sprockets-rails (2.2.2)
99
- actionpack (>= 3.0)
100
- activesupport (>= 3.0)
101
- sprockets (>= 2.8, < 4.0)
99
+ rake (11.1.2)
100
+ ruby-progressbar (1.7.5)
101
+ simplecov (0.11.2)
102
+ docile (~> 1.1.0)
103
+ json (~> 1.8)
104
+ simplecov-html (~> 0.10.0)
105
+ simplecov-html (0.10.0)
106
+ sprockets (3.6.0)
107
+ concurrent-ruby (~> 1.0)
108
+ rack (> 1, < 3)
109
+ sprockets-rails (3.0.4)
110
+ actionpack (>= 4.0)
111
+ activesupport (>= 4.0)
112
+ sprockets (>= 3.0.0)
102
113
  thor (0.19.1)
103
- thread_safe (0.3.4)
104
- thread_safe (0.3.4-java)
105
- tilt (1.4.1)
114
+ thread_safe (0.3.5)
106
115
  tzinfo (1.2.2)
107
116
  thread_safe (~> 0.1)
108
117
 
@@ -111,4 +120,9 @@ PLATFORMS
111
120
  ruby
112
121
 
113
122
  DEPENDENCIES
123
+ minitest-reporters (~> 1.0)
114
124
  simple_workflow!
125
+ simplecov (~> 0.9)
126
+
127
+ BUNDLED WITH
128
+ 1.11.2
data/History.rdoc CHANGED
@@ -1,3 +1,16 @@
1
+ == 1.1.0 2016-04-17
2
+
3
+ === Feature
4
+
5
+ * Rewrite as Rails Engine middleware
6
+ * Add support for Ruby 2.3 and JRuby 9000
7
+ * Require Ruby 2.1 or later
8
+
9
+ === Fixes
10
+
11
+ * Better session cookie overflow protection
12
+
13
+
1
14
  == 1.0.11 2015-01-22
2
15
 
3
16
  === Fixes
data/README.md CHANGED
@@ -7,32 +7,33 @@ simple_workflow
7
7
  * http://rubydoc.info/gems/simple_workflow
8
8
  * https://rubygems.org/gems/simple_workflow
9
9
 
10
- ## DESCRIPTION:
10
+ ## DESCRIPTION
11
11
 
12
- Extension to Rails to allow detours with returns.
12
+ Extension to Rails to allow simple workflow browser navigation using detours
13
+ with returns.
13
14
 
14
- ## FEATURES/PROBLEMS:
15
+ ## FEATURES
15
16
 
16
- * switch your "link_to" lines to "detour_to" and your controller "redirect_to" to "back_or_redirect_to" to allow users
17
- to return from whence they came.
17
+ * switch your "link_to" lines to "detour_to" and your controller "redirect_to"
18
+ to "back_or_redirect_to" to allow users to return from whence they came.
18
19
 
19
20
  ## SYNOPSIS:
20
21
 
21
22
  In views:
22
23
 
23
- detour_to :controller => :my_models, :action => :create
24
- back_or_link_to :controller => :welcome, :action => :index
25
- image_button_to :controller => :my_models, :action => :create
24
+ detour_to :controller => :my_models, :action => :create
25
+ back_or_link_to :controller => :welcome, :action => :index
26
+ image_button_to :controller => :my_models, :action => :create
26
27
 
27
- link_to 'Link with custom origin', with_detour(destination_path, origin_path)
28
+ link_to 'Link with custom origin', with_detour(destination_path, origin_path)
28
29
 
29
30
  In controllers:
30
31
 
31
- back_or_redirect_to :controller => :my_models, :action => :index
32
+ back_or_redirect_to :controller => :my_models, :action => :index
32
33
 
33
34
  In your tests:
34
35
 
35
- def test_valid_login_redirects_as_specified
36
+ def test_valid_login_redirects_as_specified
36
37
  add_stored_detour "/bogus/location"
37
38
  post :login, :user => { :login => "tesla", :password => "atest" }
38
39
  assert_logged_in users(:tesla)
@@ -40,19 +41,20 @@ In your tests:
40
41
  assert_redirected_to "http://#{request.host}/bogus/location"
41
42
  end
42
43
 
43
- ## REQUIREMENTS:
44
+ ## REQUIREMENTS
44
45
 
45
- * Rails
46
+ * Ruby 2.1 or newer. JRuby supported!
47
+ * Rails 4.x
46
48
 
47
- ## INSTALL:
49
+ ## INSTALL
48
50
 
49
- gem install simple_workflow
51
+ gem install simple_workflow
50
52
 
51
53
  or in Gemfile
52
54
 
53
- gem 'simple_workflow'
55
+ gem 'simple_workflow'
54
56
 
55
- ## LICENSE:
57
+ ## LICENSE
56
58
 
57
59
  (The MIT License)
58
60
 
data/Rakefile CHANGED
@@ -8,7 +8,7 @@ GEM_SPEC_FILE = 'simple_workflow.gemspec'
8
8
 
9
9
  CLEAN.include('simple_workflow-*.gem', 'tmp')
10
10
 
11
- task default: :gem
11
+ task default: :test
12
12
 
13
13
  desc 'Generate a gem'
14
14
  task gem: GEM_FILE
@@ -1,5 +1,4 @@
1
- $:.unshift(File.dirname(__FILE__)) unless
2
- $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
1
+ $:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
2
 
4
3
  require 'action_controller'
5
4
 
@@ -7,6 +6,8 @@ require 'simple_workflow/version'
7
6
  require 'simple_workflow/helper'
8
7
  require 'simple_workflow/controller'
9
8
  require 'simple_workflow/test_helper'
9
+ require 'simple_workflow/middleware'
10
+ require 'simple_workflow/railtie'
10
11
 
11
12
  module ApplicationHelper
12
13
  include SimpleWorkflow::Helper
@@ -15,7 +16,6 @@ end
15
16
  class ActionController::Base
16
17
  include SimpleWorkflow::Helper
17
18
  include SimpleWorkflow::Controller
18
- before_filter :store_detour_from_params
19
19
  end
20
20
 
21
21
  class ActiveSupport::TestCase
@@ -1,4 +1,8 @@
1
+ require 'simple_workflow/detour'
2
+
1
3
  module SimpleWorkflow::Controller
4
+ include SimpleWorkflow::Detour
5
+
2
6
  # Like ActionController::Base#redirect_to, but stores the location we come from, enabling returning here later.
3
7
  def detour_to(options)
4
8
  store_detour(params)
@@ -18,56 +22,13 @@ module SimpleWorkflow::Controller
18
22
  def store_detour(options, post = false)
19
23
  options = options.dup.permit!.to_h if options.is_a?(ActionController::Parameters)
20
24
  options[:request_method] = :post if post
21
- if session[:detours] && session[:detours].last == options
22
- logger.debug "Ignored duplicate detour: #{options.inspect}"
23
- return
24
- end
25
- session[:detours] ||= []
26
- session[:detours] << options
27
- remove_old_detours
28
- logger.debug "Added detour (#{session[:detours].try(:size) || 0}): #{options.inspect}"
29
- end
30
-
31
- def remove_old_detours
32
- if Rails.application.config.session_store == ActionDispatch::Session::CookieStore
33
- ss = ws = nil
34
- loop do
35
- ser_val = cookies.signed_or_encrypted.send(:serialize, nil, session.to_hash)
36
- ss = encryptor.encrypt_and_sign(ser_val).size
37
- wf_ser_val = cookies.signed_or_encrypted.send(:serialize, nil, session[:detours])
38
- ws = encryptor.encrypt_and_sign(wf_ser_val).size
39
- break unless ws >= 2048 || (ss >= 3072 && session[:detours] && session[:detours].size > 0)
40
- logger.warn "Workflow too large (#{ws}/#{ss}). Dropping oldest detour."
41
- session[:detours].shift
42
- reset_workflow if session[:detours].empty?
43
- end
44
- logger.debug "session: #{ss} bytes, workflow(#{session[:detours].try(:size) || 0}): #{ws} bytes"
45
- end
46
- end
47
-
48
- def encryptor
49
- return @simple_workflow_encryptor if @simple_workflow_encryptor
50
- @simple_workflow_encryptor = cookies.signed_or_encrypted.instance_variable_get(:@encryptor)
51
- return @simple_workflow_encryptor if @simple_workflow_encryptor
52
- secret_key_base = Rails.application.config.secret_key_base ||
53
- Rails.application.config.secret_token ||
54
- SecureRandom.hex(64)
55
- key_generator = ActiveSupport::KeyGenerator.new(secret_key_base, iterations: 1000)
56
- key_generator = ActiveSupport::CachingKeyGenerator.new(key_generator)
57
- secret = key_generator.generate_key('encrypted cookie')
58
- sign_secret = key_generator.generate_key('signed encrypted cookie')
59
- @simple_workflow_encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret)
25
+ store_detour_in_session(session, options)
60
26
  end
61
- private :encryptor
62
27
 
63
28
  def store_detour_from_params
64
- if params[:detour]
65
- store_detour(params[:detour])
66
- end
67
- if params[:return_from_detour] && session[:detours]
68
- pop_detour
69
- end
70
29
  end
30
+ deprecate :store_detour_from_params,
31
+ deprecator: ActiveSupport::Deprecation.new('1.2', 'SimpleWorkflow') # TODO(uwe)
71
32
 
72
33
  def back(response_status_and_flash)
73
34
  return false if session[:detours].nil?
@@ -0,0 +1,11 @@
1
+ module SimpleWorkflow::Detour
2
+ def store_detour_in_session(session, options)
3
+ if session[:detours] && session[:detours].last == options
4
+ Rails.logger.try(:debug, "Ignored duplicate detour: #{options.inspect}")
5
+ return
6
+ end
7
+ session[:detours] ||= []
8
+ session[:detours] << options
9
+ Rails.logger.try(:debug, "Added detour (#{session[:detours].try(:size) || 0}): #{options.inspect}")
10
+ end
11
+ end
@@ -0,0 +1,83 @@
1
+ require 'simple_workflow/detour'
2
+
3
+ class SimpleWorkflow::Middleware
4
+ include SimpleWorkflow::Detour
5
+
6
+ def initialize(app)
7
+ @app = app
8
+ @simple_workflow_encryptor = nil
9
+ end
10
+
11
+ def call(env)
12
+ store_detour_from_params(env)
13
+ status, headers, response = @app.call(env)
14
+ remove_old_detours(env)
15
+ [status, headers, response]
16
+ end
17
+
18
+ private
19
+
20
+ def request(env)
21
+ ActionDispatch::Request.new(env)
22
+ end
23
+
24
+ def cookie_jar(env)
25
+ request(env).cookie_jar.signed_or_encrypted
26
+ end
27
+
28
+ def params(env)
29
+ request(env).params
30
+ end
31
+
32
+ def cookies(env)
33
+ request(env).cookies
34
+ end
35
+
36
+ def session(env)
37
+ env['rack.session']
38
+ end
39
+
40
+ def remove_old_detours(env)
41
+ if (cookie_store = session(env).instance_variable_get('@by'))
42
+ .is_a? ActionDispatch::Session::CookieStore
43
+ ss = ws = nil
44
+ session = session(env)
45
+ loop do
46
+ # env[ActionDispatch::Cookies::COOKIES_SERIALIZER]
47
+ ser_val = cookie_jar(env).send(:serialize, nil, session.to_hash)
48
+ ss = encryptor(env).encrypt_and_sign(ser_val).size
49
+ wf_ser_val = cookie_jar(env).send(:serialize, nil, session[:detours])
50
+ ws = encryptor(env).encrypt_and_sign(wf_ser_val).size
51
+ break unless ws >= 2048 || (ss >= 3072 && session[:detours] && session[:detours].size > 0)
52
+ Rails.logger.warn "Workflow too large (#{ws}/#{ss}). Dropping oldest detour."
53
+ session[:detours].shift
54
+ reset_workflow if session[:detours].empty?
55
+ end
56
+ Rails.logger.debug "session: #{ss} bytes, workflow(#{session[:detours].try(:size) || 0}): #{ws} bytes"
57
+ end
58
+ end
59
+
60
+ def encryptor(env)
61
+ return @simple_workflow_encryptor if @simple_workflow_encryptor
62
+ @simple_workflow_encryptor = cookie_jar(env).instance_variable_get(:@encryptor)
63
+ return @simple_workflow_encryptor if @simple_workflow_encryptor
64
+ secret_key_base = Rails.application.config.secret_key_base ||
65
+ Rails.application.config.secret_token ||
66
+ SecureRandom.hex(64)
67
+ key_generator = ActiveSupport::KeyGenerator.new(secret_key_base, iterations: 1000)
68
+ key_generator = ActiveSupport::CachingKeyGenerator.new(key_generator)
69
+ secret = key_generator.generate_key('encrypted cookie')
70
+ sign_secret = key_generator.generate_key('signed encrypted cookie')
71
+ @simple_workflow_encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret)
72
+ end
73
+
74
+ def store_detour_from_params(env)
75
+ if params(env)[:detour]
76
+ store_detour_in_session(session(env), params(env)[:detour])
77
+ end
78
+ if params(env)[:return_from_detour] && session[:detours]
79
+ pop_detour
80
+ end
81
+ end
82
+
83
+ end
@@ -0,0 +1,8 @@
1
+ module SimpleWorkflow
2
+ class Railtie < Rails::Railtie
3
+ initializer 'SimpleWorkflow.configure_rails_initialization' do |app|
4
+ app.middleware.insert_before ActionDispatch::Flash,
5
+ SimpleWorkflow::Middleware
6
+ end
7
+ end
8
+ end
@@ -1,3 +1,3 @@
1
1
  module SimpleWorkflow
2
- VERSION = '1.0.11'
2
+ VERSION = '1.1.0'
3
3
  end
@@ -10,7 +10,11 @@ class ControllerTest < MiniTest::Test
10
10
  @cookies = ActionDispatch::Cookies::CookieJar.new(ActiveSupport::KeyGenerator.new('secret'), nil, false, options)
11
11
  @logger = Rails.logger
12
12
  @session = {}
13
- Rails.app_class = TestApp
13
+ # TODO(uwe): Remove when we stop testing Rails 4.1
14
+ if Rails.version !~ /^4\.1\./
15
+ Rails.app_class = TestApp
16
+ end
17
+ # ODOT
14
18
  end
15
19
 
16
20
  def test_store_detour
@@ -21,6 +25,12 @@ class ControllerTest < MiniTest::Test
21
25
  assert_equal({detours: [location]}, session)
22
26
  end
23
27
 
28
+ # TODO(uwe): Remove. The method does nothing. Just a stub for compatability.
29
+ def test_deprecated_store_detour_from_params
30
+ store_detour_from_params
31
+ assert_equal({}, session)
32
+ end
33
+ # ODOT
24
34
  end
25
35
 
26
36
  class TestApp < Rails::Application
data/test/helper_test.rb CHANGED
@@ -5,7 +5,7 @@ class HelperTest < MiniTest::Test
5
5
 
6
6
  def test_with_detour
7
7
  assert_equal '?detour%5Baction%5D=myaction&detour%5Bcontroller%5D=mycontroller&detour%5Bid%5D=42&detour%5Bquery%5D%5Bnested%5D=criterium',
8
- with_detour('')
8
+ with_detour('')
9
9
  end
10
10
 
11
11
  private
@@ -0,0 +1,75 @@
1
+ require_relative 'test_helper'
2
+ require 'simple_workflow/middleware'
3
+ require_relative 'test_app'
4
+
5
+ class MiddlewareTest < MiniTest::Test
6
+ def setup
7
+ @app = TestApp.instance
8
+ # @app = ->(env) { [200, env, 'app response'] }
9
+ @stack = Rack::Builder.new @app do
10
+ use ActionDispatch::Cookies
11
+ use ActionDispatch::Session::CookieStore
12
+ use SimpleWorkflow::Middleware
13
+ use ActionDispatch::Flash
14
+ end
15
+ @request = Rack::MockRequest.new(@stack)
16
+ end
17
+
18
+ def test_get_without_detour
19
+ env = env_for('/')
20
+
21
+ status, headers, response = @stack.call env
22
+
23
+ assert_equal 200, status
24
+ assert_equal(env, headers)
25
+ assert_equal 'app response', response
26
+ assert_equal([], headers['rack.session'].to_hash.keys)
27
+ assert_equal(nil, headers['rack.session'].to_hash['detours'])
28
+ end
29
+
30
+ def test_detour
31
+ env = env_for('/?detour[controller]=test')
32
+
33
+ status, headers, response = @stack.call env
34
+
35
+ assert_equal 200, status
36
+ assert_equal(env, headers)
37
+ assert_equal 'app response', response
38
+ assert_equal(%w(session_id detours), headers['rack.session'].to_hash.keys)
39
+ assert_equal([{'controller' => 'test'}], headers['rack.session'].to_hash['detours'])
40
+ end
41
+
42
+ def test_detour_cleanup
43
+ _, env, _ = @stack.call env_for('/?detour[controller]=test_first')
44
+ (50..99).each do |i|
45
+ _, env, _ = @stack.call env_for("/?detour[controller]=test_#{i}",
46
+ 'rack.session' => env['rack.session'],
47
+ 'rack.session.options' => env['rack.session.options']
48
+ )
49
+ end
50
+ status, env, response = @stack.call env_for('/?detour[controller]=test_last',
51
+ 'rack.session' => env['rack.session'],
52
+ 'rack.session.options' => env['rack.session.options']
53
+ )
54
+
55
+ assert_equal 200, status
56
+ assert_equal 'app response', response
57
+ assert_equal(%w(session_id detours), env['rack.session'].to_hash.keys)
58
+
59
+ assert_equal([{'controller' => 'test_57'}, {'controller' => 'test_58'}, {'controller' => 'test_59'}, {'controller' => 'test_60'}, {'controller' => 'test_61'}, {'controller' => 'test_62'}, {'controller' => 'test_63'}, {'controller' => 'test_64'}, {'controller' => 'test_65'}, {'controller' => 'test_66'}, {'controller' => 'test_67'}, {'controller' => 'test_68'}, {'controller' => 'test_69'}, {'controller' => 'test_70'}, {'controller' => 'test_71'}, {'controller' => 'test_72'}, {'controller' => 'test_73'}, {'controller' => 'test_74'}, {'controller' => 'test_75'}, {'controller' => 'test_76'}, {'controller' => 'test_77'}, {'controller' => 'test_78'}, {'controller' => 'test_79'}, {'controller' => 'test_80'}, {'controller' => 'test_81'}, {'controller' => 'test_82'}, {'controller' => 'test_83'}, {'controller' => 'test_84'}, {'controller' => 'test_85'}, {'controller' => 'test_86'}, {'controller' => 'test_87'}, {'controller' => 'test_88'}, {'controller' => 'test_89'}, {'controller' => "test_90"}, {"controller" => "test_91"}, {"controller" => "test_92"}, {"controller" => "test_93"}, {"controller" => "test_94"}, {"controller" => "test_95"}, {"controller" => "test_96"}, {"controller" => "test_97"}, {"controller" => "test_98"}, {"controller" => "test_99"}, {"controller" => "test_last"}],
60
+ env['rack.session'].to_hash['detours'])
61
+ end
62
+
63
+ private
64
+
65
+ def env_for(url, opts={})
66
+ default_opts = {
67
+ ActionDispatch::Cookies::COOKIES_SERIALIZER => :json,
68
+ ActionDispatch::Cookies::GENERATOR_KEY => ActiveSupport::KeyGenerator.new('secret'),
69
+ ActionDispatch::Cookies::SECRET_KEY_BASE => 'secret',
70
+ # ActionDispatch::Cookies::SECRET_TOKEN => 'secret',
71
+ }
72
+ Rack::MockRequest.env_for(url, default_opts.update(opts))
73
+ end
74
+
75
+ end
data/test/test_app.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'rails'
2
+
3
+ class TestApp < Rails::Application
4
+ config.action_dispatch.cookies_serializer = :json
5
+ config.action_dispatch.key_generator = ActiveSupport::KeyGenerator.new('secret')
6
+ config.logger = Logger.new('log/test.log')
7
+ config.secret_key_base = 'secret key base'
8
+ # config.secret_token = 'secret token'
9
+
10
+ Rails.logger = config.logger
11
+
12
+ def call(env)
13
+ [200, env, 'app response']
14
+ end
15
+ end
data/test/test_helper.rb CHANGED
@@ -1,4 +1,15 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
+ require 'simplecov'
4
+ SimpleCov.start { coverage_dir File.expand_path('../coverage', File.dirname(__FILE__)) }
3
5
  require 'minitest/autorun'
4
- require File.dirname(__FILE__) + '/../lib/simple_workflow'
6
+ require 'minitest/reporters'
7
+ MiniTest::Reporters.use!
8
+ require 'rails'
9
+ require 'simple_workflow'
10
+
11
+ if Gem::Requirement.new('~>4.2') =~ Gem::Version.new(Rails.version)
12
+ ActiveSupport::TestCase.test_order = :random
13
+ end
14
+
15
+ FileUtils.mkdir_p File.expand_path '../log', __dir__
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.0.11
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uwe Kubosch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-22 00:00:00.000000000 Z
11
+ date: 2016-04-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: simplecov
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.9'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.9'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest-reporters
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
27
55
  description: Expands Ruby On Rails to allow simple breadcrumb detour workflows.
28
56
  email: uwe@kubosch.no
29
57
  executables: []
@@ -37,11 +65,16 @@ files:
37
65
  - Rakefile
38
66
  - lib/simple_workflow.rb
39
67
  - lib/simple_workflow/controller.rb
68
+ - lib/simple_workflow/detour.rb
40
69
  - lib/simple_workflow/helper.rb
70
+ - lib/simple_workflow/middleware.rb
71
+ - lib/simple_workflow/railtie.rb
41
72
  - lib/simple_workflow/test_helper.rb
42
73
  - lib/simple_workflow/version.rb
43
74
  - test/controller_test.rb
44
75
  - test/helper_test.rb
76
+ - test/middleware_test.rb
77
+ - test/test_app.rb
45
78
  - test/test_helper.rb
46
79
  homepage: https://github.com/donv/simple_workflow
47
80
  licenses:
@@ -53,9 +86,9 @@ require_paths:
53
86
  - lib
54
87
  required_ruby_version: !ruby/object:Gem::Requirement
55
88
  requirements:
56
- - - ">="
89
+ - - "~>"
57
90
  - !ruby/object:Gem::Version
58
- version: '0'
91
+ version: '2.1'
59
92
  required_rubygems_version: !ruby/object:Gem::Requirement
60
93
  requirements:
61
94
  - - ">="
@@ -63,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
96
  version: '0'
64
97
  requirements: []
65
98
  rubyforge_project: donv/simple_workflow
66
- rubygems_version: 2.4.5
99
+ rubygems_version: 2.5.1
67
100
  signing_key:
68
101
  specification_version: 4
69
102
  summary: Add simple breadcrumbs "detour" workflow to Ruby On Rails.