simple_workflow 1.3.1 → 1.3.2

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: a401f2ff7174eab0a404f384aaf5cf6e0145c4df
4
- data.tar.gz: 2c7550459676d6176f5ef806b936cea4d5f5ffe6
3
+ metadata.gz: df30a1c9f24abcc2eed8341f903f43dc726dfa0c
4
+ data.tar.gz: 7a67d053ee88dcb7860b3b3bc0046b633610913c
5
5
  SHA512:
6
- metadata.gz: 735d22fee950b342604df519018045b16df0edb84cb1b6d2704459577415a0843c705a46cdd9727042904d15b2a337414b8ff59bf8e09a94ce2083e52dd41762
7
- data.tar.gz: 36563aade7344805d5a6995f298a07cfa6a6f1b409547c2cd184dbe5edd607aea6ea891f6d2cdad737f137b8cce91acef4a1fc694cc8fa2696baec47c0ea7bf2
6
+ metadata.gz: 31b7fde7ad4ae7b569b85b4b625621cb10e7f5878c0d27311c3fb2f79afa78e9b1f21c8c091197be3090e79848e45daa527b02f076d194bf808de51898badd50
7
+ data.tar.gz: 1d33d84a1ad300aeca822ca9f821362ed896f0c37505de24e3ea34589f816911b834b936a90bd88257596a4516ae4d702ee6df5d25547383deee2bb9828429d0
data/Gemfile.lock CHANGED
@@ -1,45 +1,45 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simple_workflow (1.3.0)
4
+ simple_workflow (1.3.2)
5
5
  rails (>= 4, < 5.1)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- actioncable (5.0.1)
11
- actionpack (= 5.0.1)
12
- nio4r (~> 1.2)
10
+ actioncable (5.0.2)
11
+ actionpack (= 5.0.2)
12
+ nio4r (>= 1.2, < 3.0)
13
13
  websocket-driver (~> 0.6.1)
14
- actionmailer (5.0.1)
15
- actionpack (= 5.0.1)
16
- actionview (= 5.0.1)
17
- activejob (= 5.0.1)
14
+ actionmailer (5.0.2)
15
+ actionpack (= 5.0.2)
16
+ actionview (= 5.0.2)
17
+ activejob (= 5.0.2)
18
18
  mail (~> 2.5, >= 2.5.4)
19
19
  rails-dom-testing (~> 2.0)
20
- actionpack (5.0.1)
21
- actionview (= 5.0.1)
22
- activesupport (= 5.0.1)
20
+ actionpack (5.0.2)
21
+ actionview (= 5.0.2)
22
+ activesupport (= 5.0.2)
23
23
  rack (~> 2.0)
24
24
  rack-test (~> 0.6.3)
25
25
  rails-dom-testing (~> 2.0)
26
26
  rails-html-sanitizer (~> 1.0, >= 1.0.2)
27
- actionview (5.0.1)
28
- activesupport (= 5.0.1)
27
+ actionview (5.0.2)
28
+ activesupport (= 5.0.2)
29
29
  builder (~> 3.1)
30
30
  erubis (~> 2.7.0)
31
31
  rails-dom-testing (~> 2.0)
32
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
33
- activejob (5.0.1)
34
- activesupport (= 5.0.1)
32
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
33
+ activejob (5.0.2)
34
+ activesupport (= 5.0.2)
35
35
  globalid (>= 0.3.6)
36
- activemodel (5.0.1)
37
- activesupport (= 5.0.1)
38
- activerecord (5.0.1)
39
- activemodel (= 5.0.1)
40
- activesupport (= 5.0.1)
36
+ activemodel (5.0.2)
37
+ activesupport (= 5.0.2)
38
+ activerecord (5.0.2)
39
+ activemodel (= 5.0.2)
40
+ activesupport (= 5.0.2)
41
41
  arel (~> 7.0)
42
- activesupport (5.0.1)
42
+ activesupport (5.0.2)
43
43
  concurrent-ruby (~> 1.0, >= 1.0.2)
44
44
  i18n (~> 0.7)
45
45
  minitest (~> 5.1)
@@ -47,15 +47,14 @@ GEM
47
47
  ansi (1.5.0)
48
48
  arel (7.1.4)
49
49
  ast (2.3.0)
50
- builder (3.2.2)
51
- concurrent-ruby (1.0.3)
50
+ builder (3.2.3)
51
+ concurrent-ruby (1.0.5)
52
52
  docile (1.1.5)
53
53
  erubis (2.7.0)
54
54
  globalid (0.3.7)
55
55
  activesupport (>= 4.1.0)
56
- i18n (0.7.0)
57
- json (2.0.2)
58
- json (2.0.2-java)
56
+ i18n (0.8.1)
57
+ json (2.0.3)
59
58
  loofah (2.0.3)
60
59
  nokogiri (>= 1.5.9)
61
60
  mail (2.6.4)
@@ -66,53 +65,53 @@ GEM
66
65
  mime-types-data (3.2016.0521)
67
66
  mini_portile2 (2.1.0)
68
67
  minitest (5.10.1)
69
- minitest-reporters (1.1.13)
68
+ minitest-reporters (1.1.14)
70
69
  ansi
71
70
  builder
72
71
  minitest (>= 5.0)
73
72
  ruby-progressbar
74
- nio4r (1.2.1)
75
- nokogiri (1.6.8.1)
73
+ nio4r (2.0.0)
74
+ nokogiri (1.7.1)
76
75
  mini_portile2 (~> 2.1.0)
77
- parser (2.3.3.1)
76
+ parser (2.4.0.0)
78
77
  ast (~> 2.2)
79
78
  powerpack (0.1.1)
80
79
  rack (2.0.1)
81
80
  rack-test (0.6.3)
82
81
  rack (>= 1.0)
83
- rails (5.0.1)
84
- actioncable (= 5.0.1)
85
- actionmailer (= 5.0.1)
86
- actionpack (= 5.0.1)
87
- actionview (= 5.0.1)
88
- activejob (= 5.0.1)
89
- activemodel (= 5.0.1)
90
- activerecord (= 5.0.1)
91
- activesupport (= 5.0.1)
82
+ rails (5.0.2)
83
+ actioncable (= 5.0.2)
84
+ actionmailer (= 5.0.2)
85
+ actionpack (= 5.0.2)
86
+ actionview (= 5.0.2)
87
+ activejob (= 5.0.2)
88
+ activemodel (= 5.0.2)
89
+ activerecord (= 5.0.2)
90
+ activesupport (= 5.0.2)
92
91
  bundler (>= 1.3.0, < 2.0)
93
- railties (= 5.0.1)
92
+ railties (= 5.0.2)
94
93
  sprockets-rails (>= 2.0.0)
95
- rails-dom-testing (2.0.1)
94
+ rails-dom-testing (2.0.2)
96
95
  activesupport (>= 4.2.0, < 6.0)
97
- nokogiri (~> 1.6.0)
96
+ nokogiri (~> 1.6)
98
97
  rails-html-sanitizer (1.0.3)
99
98
  loofah (~> 2.0)
100
- railties (5.0.1)
101
- actionpack (= 5.0.1)
102
- activesupport (= 5.0.1)
99
+ railties (5.0.2)
100
+ actionpack (= 5.0.2)
101
+ activesupport (= 5.0.2)
103
102
  method_source
104
103
  rake (>= 0.8.7)
105
104
  thor (>= 0.18.1, < 2.0)
106
- rainbow (2.1.0)
105
+ rainbow (2.2.1)
107
106
  rake (12.0.0)
108
- rubocop (0.46.0)
109
- parser (>= 2.3.1.1, < 3.0)
107
+ rubocop (0.47.1)
108
+ parser (>= 2.3.3.1, < 3.0)
110
109
  powerpack (~> 0.1)
111
110
  rainbow (>= 1.99.1, < 3.0)
112
111
  ruby-progressbar (~> 1.7)
113
112
  unicode-display_width (~> 1.0, >= 1.0.1)
114
113
  ruby-progressbar (1.8.1)
115
- simplecov (0.12.0)
114
+ simplecov (0.14.1)
116
115
  docile (~> 1.1.0)
117
116
  json (>= 1.8, < 3)
118
117
  simplecov-html (~> 0.10.0)
@@ -125,16 +124,15 @@ GEM
125
124
  activesupport (>= 4.0)
126
125
  sprockets (>= 3.0.0)
127
126
  thor (0.19.4)
128
- thread_safe (0.3.5)
129
- tzinfo (1.2.2)
127
+ thread_safe (0.3.6)
128
+ tzinfo (1.2.3)
130
129
  thread_safe (~> 0.1)
131
- unicode-display_width (1.1.2)
132
- websocket-driver (0.6.4)
130
+ unicode-display_width (1.1.3)
131
+ websocket-driver (0.6.5)
133
132
  websocket-extensions (>= 0.1.0)
134
133
  websocket-extensions (0.1.2)
135
134
 
136
135
  PLATFORMS
137
- java
138
136
  ruby
139
137
 
140
138
  DEPENDENCIES
@@ -144,4 +142,4 @@ DEPENDENCIES
144
142
  simplecov (~> 0.9)
145
143
 
146
144
  BUNDLED WITH
147
- 1.13.6
145
+ 1.14.6
@@ -53,21 +53,20 @@ module SimpleWorkflow::Controller
53
53
  flash[:notice] = notice
54
54
  end
55
55
 
56
- if (other_flashes = response_status_and_flash.delete(:flash))
57
- flash.update(other_flashes)
58
- end
56
+ return unless (other_flashes = response_status_and_flash.delete(:flash))
57
+ flash.update(other_flashes)
59
58
  end
60
59
  private :save_flash
61
60
 
62
61
  def redirect_to_post(options)
63
62
  url = url_for options
64
- render text: <<EOF, layout: false
65
- <html>
66
- <body onload="document.getElementById('form').submit()">
67
- <form id="form" action="#{url}" method="POST">
68
- </form>
69
- </body>
70
- </html>
63
+ render text: <<EOF.strip_heredoc, layout: false
64
+ <html>
65
+ <body onload="document.getElementById('form').submit()">
66
+ <form id="form" action="#{url}" method="POST">
67
+ </form>
68
+ </body>
69
+ </html>
71
70
  EOF
72
71
  end
73
72
  end
@@ -1,4 +1,7 @@
1
+ require_relative 'detour'
1
2
  module SimpleWorkflow::Helper
3
+ include SimpleWorkflow::Detour
4
+
2
5
  def image_button_to(image_source, title, options, html_options = {})
3
6
  image_submit_tag image_source, { class: 'image-submit', alt: title, title: title,
4
7
  id: "#{title}_#{options[:id]}", name: title,
@@ -33,7 +36,7 @@ module SimpleWorkflow::Helper
33
36
  end
34
37
 
35
38
  def origin_options
36
- params.reject { |k, _v| [:detour, :return_from_detour].include? k.to_sym }
39
+ params.reject { |k, _v| %i(detour return_from_detour).include? k.to_sym }
37
40
  end
38
41
 
39
42
  def image_detour_to(image_source, title, url_options, image_options = nil, link_options = nil)
@@ -70,14 +73,24 @@ module SimpleWorkflow::Helper
70
73
 
71
74
  def back_or_link_to(title, options = nil, html_options = nil)
72
75
  if session[:detours]
73
- options = { return_from_detour: true }.update(session[:detours].last)
76
+ link_options = { return_from_detour: true }.update(session[:detours].last)
74
77
 
75
78
  # FIXME(uwe): Write a test to prove this line is needed.
76
- options['id'] ||= nil
79
+ link_options['id'] ||= nil
77
80
  # EMXIF
78
81
 
79
- logger.debug "linked return from detour: #{options.inspect}"
82
+ logger.debug "linked return from detour: #{link_options.inspect}"
83
+ else
84
+ link_options = options
85
+ end
86
+
87
+ link_to(title, link_options, html_options) if options
88
+ rescue ActionController::UrlGenerationError => e
89
+ if session[:detours]
90
+ logger.error "Exception linking to origin: #{e.class} #{e}"
91
+ pop_detour(session)
92
+ retry
80
93
  end
81
- link_to(title, options, html_options) if options
94
+ raise
82
95
  end
83
96
  end
@@ -38,33 +38,30 @@ class SimpleWorkflow::Middleware
38
38
  end
39
39
 
40
40
  def remove_old_detours(env)
41
- if session(env).instance_variable_get('@by').is_a?(ActionDispatch::Session::CookieStore)
42
- session_size = workflow_size = nil
43
- session = session(env)
44
- # env[ActionDispatch::Cookies::COOKIES_SERIALIZER]
45
- cookie_jar = cookie_jar(env)
46
- encryptor = encryptor(env)
47
- loop do
48
- ser_val = serialize_session(cookie_jar, session.to_hash)
49
- session_size = encryptor.encrypt_and_sign(ser_val).size
50
- wf_ser_val = serialize_session(cookie_jar, session[:detours])
51
- workflow_size = encryptor.encrypt_and_sign(wf_ser_val).size
52
- break unless workflow_size >= 2048 || (session_size >= 3072 && session[:detours] && !session[:detours].empty?)
53
- Rails.logger.warn "Workflow too large (#{workflow_size}/#{session_size}). Dropping oldest detour."
54
- session[:detours].shift
55
- reset_workflow(session) if session[:detours].empty?
56
- end
57
- Rails.logger.debug "session: #{session_size} bytes, workflow(#{session[:detours].try(:size) || 0}): #{workflow_size} bytes"
58
- if session_size > 4096
59
- Rails.logger.warn "simple_workflow: session exceeds cookie size limit: #{session_size} bytes. Workflow empty! Not My Fault!"
60
- Rails.logger.warn "simple_workflow: session: #{session.to_hash}"
61
- if (old_flashes = session[:flash] && session[:flash]['discard'])
62
- Rails.logger.warn "simple_workflow: found discarded flash entries: #{old_flashes}. Deleting them."
63
- session[:flash]['flashes'] = session[:flash]['flashes'].except(*old_flashes)
64
- Rails.logger.warn "simple_workflow: session: #{session.to_hash}"
65
- end
66
- end
41
+ return unless session(env).instance_variable_get('@by').is_a?(ActionDispatch::Session::CookieStore)
42
+ session_size = workflow_size = nil
43
+ session = session(env)
44
+ # env[ActionDispatch::Cookies::COOKIES_SERIALIZER]
45
+ cookie_jar = cookie_jar(env)
46
+ encryptor = encryptor(env)
47
+ loop do
48
+ ser_val = serialize_session(cookie_jar, session.to_hash)
49
+ session_size = encryptor.encrypt_and_sign(ser_val).size
50
+ wf_ser_val = serialize_session(cookie_jar, session[:detours])
51
+ workflow_size = encryptor.encrypt_and_sign(wf_ser_val).size
52
+ break unless workflow_size >= 2048 || (session_size >= 3072 && session[:detours] && !session[:detours].empty?)
53
+ Rails.logger.warn "Workflow too large (#{workflow_size}/#{session_size}). Dropping oldest detour."
54
+ session[:detours].shift
55
+ reset_workflow(session) if session[:detours].empty?
67
56
  end
57
+ Rails.logger.debug "session: #{session_size} bytes, workflow(#{session[:detours].try(:size) || 0}): #{workflow_size} bytes"
58
+ return unless session_size > 4096
59
+ Rails.logger.warn "simple_workflow: session exceeds cookie size limit: #{session_size} bytes. Workflow empty! Not My Fault!"
60
+ Rails.logger.warn "simple_workflow: session: #{session.to_hash}"
61
+ return unless (old_flashes = session[:flash] && session[:flash]['discard'])
62
+ Rails.logger.warn "simple_workflow: found discarded flash entries: #{old_flashes}. Deleting them."
63
+ session[:flash]['flashes'] = session[:flash]['flashes'].except(*old_flashes)
64
+ Rails.logger.warn "simple_workflow: session: #{session.to_hash}"
68
65
  end
69
66
 
70
67
  if ActionPack::VERSION::MAJOR == 5
@@ -96,8 +93,7 @@ class SimpleWorkflow::Middleware
96
93
  if params(env)[:detour]
97
94
  store_detour_in_session(session(env), params(env)[:detour])
98
95
  end
99
- if params(env)[:return_from_detour] && session(env)[:detours]
100
- pop_detour(session(env))
101
- end
96
+ return unless params(env)[:return_from_detour] && session(env)[:detours]
97
+ pop_detour(session(env))
102
98
  end
103
99
  end
@@ -1,3 +1,3 @@
1
1
  module SimpleWorkflow
2
- VERSION = '1.3.1'.freeze
2
+ VERSION = '1.3.2'.freeze
3
3
  end
data/test/helper_test.rb CHANGED
@@ -35,17 +35,42 @@ class HelperTest < MiniTest::Test
35
35
  image_link_to('my_image.png', 'Link Title', { id: 'image_tag_id' }, title: 'Image title')
36
36
  end
37
37
 
38
+ def test_back_or_link_to
39
+ assert_equal ['Link title', { controller: :mycontroller, action: :my_action }, nil],
40
+ back_or_link_to('Link title', controller: :mycontroller, action: :my_action)
41
+ end
42
+
43
+ def test_back_or_link_to_with_routing_error
44
+ @session = { detours: [{ controller: :does_not_exist }] }
45
+ @routing_error = ActionController::UrlGenerationError
46
+ assert_equal ['Link title', { controller: :mycontroller, action: :my_action }, nil],
47
+ back_or_link_to('Link title', controller: :mycontroller, action: :my_action)
48
+ end
49
+
38
50
  private
39
51
 
52
+ def logger
53
+ @logger ||= Logger.new(File.expand_path('../log/test.log', __dir__))
54
+ end
55
+
40
56
  def params
41
57
  { controller: 'mycontroller', action: 'myaction', id: 42, query: { nested: 'criterium' } }
42
58
  end
43
59
 
60
+ def session
61
+ @session ||= {}
62
+ end
63
+
44
64
  def url_for(options)
45
65
  options.to_s
46
66
  end
47
67
 
48
68
  def link_to(*options)
69
+ if defined?(@routing_error) && @routing_error
70
+ e = @routing_error
71
+ @routing_error = nil
72
+ raise e
73
+ end
49
74
  options
50
75
  end
51
76
 
@@ -54,12 +54,14 @@ class MiddlewareTest < MiniTest::Test
54
54
  assert_equal 'app response', response
55
55
  assert_equal(%w(session_id detours), env['rack.session'].to_hash.keys)
56
56
 
57
- 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' }],
57
+ assert_equal(((57..99).to_a + [:last]).map { |i| { 'controller' => "test_#{i}" } },
58
58
  env['rack.session'].to_hash['detours'])
59
59
  end
60
60
 
61
61
  def test_huge_detour_over_4k
62
+ # rubocop:disable Metrics/LineLength
62
63
  query = "/orders/TeYphD2wcYyBDFaKTnmAog/edit?detour%5Baction%5D=index&detour%5Bcommit%5D=Search&detour%5Bcontroller%5D=order_drilldown&detour%5Bdrilldown_search%5D%5Bdimensions%5D%5B%5D=arrival&detour%5Bdrilldown_search%5D%5Bdimensions%5D%5B%5D=delay&detour%5Bdrilldown_search%5D%5Bdisplay_type%5D=NONE&detour%5Bdrilldown_search%5D%5Bfields%5D%5Bactual_time%5D=1&detour%5Bdrilldown_search%5D%5Bfields%5D%5Bcomments%5D=1&detour%5Bdrilldown_search%5D%5Bfields%5D%5Bdelay%5D=1&detour%5Bdrilldown_search%5D%5Bfields%5D%5Bdescription%5D=1&detour%5Bdrilldown_search%5D%5Bfields%5D%5Bdirection%5D=0&detour%5Bdrilldown_search%5D%5Bfields%5D%5Bdrop_off_stand%5D=0&detour%5Bdrilldown_search%5D%5Bfields%5D%5Bestimated%5D=1&detour%5Bdrilldown_search%5D%5Bfields%5D%5Bfirst_vehicle%5D=1&detour%5Bdrilldown_search%5D%5Bfields%5D%5Bofb%5D=0&detour%5Bdrilldown_search%5D%5Bfields%5D%5Bonb%5D=0&detour%5Bdrilldown_search%5D%5Bfields%5D%5Boperation%5D=0&detour%5Bdrilldown_search%5D%5Bfields%5D%5Bpick_up%5D=1&detour%5Bdrilldown_search%5D%5Bfields%5D%5Bpick_up_stand%5D=0&detour%5Bdrilldown_search%5D%5Bfields%5D%5Bplanned%5D=0&detour%5Bdrilldown_search%5D%5Bfields%5D%5Bprobable%5D=1&detour%5Bdrilldown_search%5D%5Bfields%5D%5Bscheduled%5D=1&detour%5Bdrilldown_search%5D%5Bfields%5D%5Bsta%5D=0&detour%5Bdrilldown_search%5D%5Bfields%5D%5Btime%5D=0&detour%5Bdrilldown_search%5D%5Bfilter%5D%5Barrival%5D%5B%5D=Arrival&detour%5Bdrilldown_search%5D%5Bfilter%5D%5Barrival%5D%5B%5D=Departure&detour%5Bdrilldown_search%5D%5Bfilter%5D%5Bcalendar_date%5D%5B%5D=2016-03-01&detour%5Bdrilldown_search%5D%5Blist%5D=1&detour%5Bdrilldown_search%5D%5Blist_change_times%5D=0&detour%5Bdrilldown_search%5D%5Border_by_value%5D=0&detour%5Bdrilldown_search%5D%5Bpercent%5D=1&detour%5Bdrilldown_search%5D%5Bselect_value%5D=COUNT&detour%5Bdrilldown_search%5D%5Btitle%5D=OSL+Daily+Delay+Report+2016-04-16#{'+etc' * 200}&detour%5Butf8%5D=%E2%9C%93"
64
+ # rubocop:enable Metrics/LineLength
63
65
  env = env_for(query)
64
66
 
65
67
  status, headers, response = @stack.call env
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.3.1
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uwe Kubosch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-23 00:00:00.000000000 Z
11
+ date: 2017-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -116,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
116
116
  version: '0'
117
117
  requirements: []
118
118
  rubyforge_project: donv/simple_workflow
119
- rubygems_version: 2.5.1
119
+ rubygems_version: 2.6.11
120
120
  signing_key:
121
121
  specification_version: 4
122
122
  summary: Add simple breadcrumbs "detour" workflow to Ruby On Rails.