simple_workflow 1.0.11 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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.