juice10-action_flow 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. data/.document +5 -0
  2. data/Gemfile +13 -0
  3. data/Gemfile.lock +20 -0
  4. data/LICENSE.txt +20 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +206 -0
  7. data/Rakefile +53 -0
  8. data/VERSION +1 -0
  9. data/action_flow.gemspec +149 -0
  10. data/init.rb +1 -0
  11. data/install.rb +1 -0
  12. data/lib/action_flow.rb +59 -0
  13. data/lib/action_flow/blank_slate.rb +33 -0
  14. data/lib/action_flow/expression.rb +135 -0
  15. data/lib/action_flow/filters.rb +25 -0
  16. data/lib/action_flow/flow.rb +54 -0
  17. data/lib/action_flow/flow/controller.rb +91 -0
  18. data/lib/action_flow/flow/state.rb +73 -0
  19. data/lib/action_flow/helpers.rb +15 -0
  20. data/lib/action_flow/variable.rb +14 -0
  21. data/test/helper.rb +18 -0
  22. data/test/test_action_flow.rb +7 -0
  23. data/test_app/.gitignore +4 -0
  24. data/test_app/Gemfile +34 -0
  25. data/test_app/Gemfile.lock +131 -0
  26. data/test_app/README +256 -0
  27. data/test_app/Rakefile +7 -0
  28. data/test_app/app/controllers/application_controller.rb +6 -0
  29. data/test_app/app/controllers/settings_controller.rb +33 -0
  30. data/test_app/app/helpers/application_helper.rb +4 -0
  31. data/test_app/app/views/layouts/application.html.erb +14 -0
  32. data/test_app/app/views/settings/_step.html.erb +22 -0
  33. data/test_app/app/views/settings/intro.html.erb +12 -0
  34. data/test_app/app/views/settings/outro.html.erb +8 -0
  35. data/test_app/config.ru +4 -0
  36. data/test_app/config/application.rb +42 -0
  37. data/test_app/config/boot.rb +6 -0
  38. data/test_app/config/cucumber.yml +8 -0
  39. data/test_app/config/database.yml +25 -0
  40. data/test_app/config/environment.rb +5 -0
  41. data/test_app/config/environments/cucumber.rb +35 -0
  42. data/test_app/config/environments/development.rb +26 -0
  43. data/test_app/config/environments/production.rb +49 -0
  44. data/test_app/config/environments/test.rb +35 -0
  45. data/test_app/config/initializers/backtrace_silencers.rb +7 -0
  46. data/test_app/config/initializers/inflections.rb +10 -0
  47. data/test_app/config/initializers/mime_types.rb +5 -0
  48. data/test_app/config/initializers/secret_token.rb +7 -0
  49. data/test_app/config/initializers/session_store.rb +8 -0
  50. data/test_app/config/locales/en.yml +5 -0
  51. data/test_app/config/routes.rb +58 -0
  52. data/test_app/db/schema.rb +15 -0
  53. data/test_app/db/seeds.rb +7 -0
  54. data/test_app/features/flow_management.feature +122 -0
  55. data/test_app/features/flow_with_array_alternatives.feature +13 -0
  56. data/test_app/features/flows_with_conditions.feature +60 -0
  57. data/test_app/features/mutual_exclusion.feature +39 -0
  58. data/test_app/features/step_definitions/flow_steps.rb +20 -0
  59. data/test_app/features/step_definitions/url_steps.rb +7 -0
  60. data/test_app/features/step_definitions/web_steps.rb +211 -0
  61. data/test_app/features/support/env.rb +39 -0
  62. data/test_app/features/support/hooks.rb +3 -0
  63. data/test_app/features/support/paths.rb +33 -0
  64. data/test_app/features/support/selectors.rb +39 -0
  65. data/test_app/lib/tasks/.gitkeep +0 -0
  66. data/test_app/lib/tasks/cucumber.rake +57 -0
  67. data/test_app/public/404.html +26 -0
  68. data/test_app/public/422.html +26 -0
  69. data/test_app/public/500.html +26 -0
  70. data/test_app/public/favicon.ico +0 -0
  71. data/test_app/public/images/rails.png +0 -0
  72. data/test_app/public/index.html +239 -0
  73. data/test_app/public/javascripts/application.js +2 -0
  74. data/test_app/public/javascripts/controls.js +965 -0
  75. data/test_app/public/javascripts/dragdrop.js +974 -0
  76. data/test_app/public/javascripts/effects.js +1123 -0
  77. data/test_app/public/javascripts/prototype.js +6001 -0
  78. data/test_app/public/javascripts/rails.js +191 -0
  79. data/test_app/public/robots.txt +5 -0
  80. data/test_app/public/stylesheets/.gitkeep +0 -0
  81. data/test_app/script/about +4 -0
  82. data/test_app/script/console +3 -0
  83. data/test_app/script/cucumber +10 -0
  84. data/test_app/script/dbconsole +3 -0
  85. data/test_app/script/destroy +3 -0
  86. data/test_app/script/generate +3 -0
  87. data/test_app/script/performance/benchmarker +3 -0
  88. data/test_app/script/performance/profiler +3 -0
  89. data/test_app/script/plugin +3 -0
  90. data/test_app/script/rails +6 -0
  91. data/test_app/script/runner +3 -0
  92. data/test_app/script/server +3 -0
  93. data/test_app/test/performance/browsing_test.rb +9 -0
  94. data/test_app/test/test_helper.rb +13 -0
  95. data/test_app/vendor/plugins/.gitkeep +0 -0
  96. data/test_app/vendor/plugins/action_flow/init.rb +2 -0
  97. data/uninstall.rb +1 -0
  98. metadata +224 -0
@@ -0,0 +1,191 @@
1
+ (function() {
2
+ // Technique from Juriy Zaytsev
3
+ // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
4
+ function isEventSupported(eventName) {
5
+ var el = document.createElement('div');
6
+ eventName = 'on' + eventName;
7
+ var isSupported = (eventName in el);
8
+ if (!isSupported) {
9
+ el.setAttribute(eventName, 'return;');
10
+ isSupported = typeof el[eventName] == 'function';
11
+ }
12
+ el = null;
13
+ return isSupported;
14
+ }
15
+
16
+ function isForm(element) {
17
+ return Object.isElement(element) && element.nodeName.toUpperCase() == 'FORM'
18
+ }
19
+
20
+ function isInput(element) {
21
+ if (Object.isElement(element)) {
22
+ var name = element.nodeName.toUpperCase()
23
+ return name == 'INPUT' || name == 'SELECT' || name == 'TEXTAREA'
24
+ }
25
+ else return false
26
+ }
27
+
28
+ var submitBubbles = isEventSupported('submit'),
29
+ changeBubbles = isEventSupported('change')
30
+
31
+ if (!submitBubbles || !changeBubbles) {
32
+ // augment the Event.Handler class to observe custom events when needed
33
+ Event.Handler.prototype.initialize = Event.Handler.prototype.initialize.wrap(
34
+ function(init, element, eventName, selector, callback) {
35
+ init(element, eventName, selector, callback)
36
+ // is the handler being attached to an element that doesn't support this event?
37
+ if ( (!submitBubbles && this.eventName == 'submit' && !isForm(this.element)) ||
38
+ (!changeBubbles && this.eventName == 'change' && !isInput(this.element)) ) {
39
+ // "submit" => "emulated:submit"
40
+ this.eventName = 'emulated:' + this.eventName
41
+ }
42
+ }
43
+ )
44
+ }
45
+
46
+ if (!submitBubbles) {
47
+ // discover forms on the page by observing focus events which always bubble
48
+ document.on('focusin', 'form', function(focusEvent, form) {
49
+ // special handler for the real "submit" event (one-time operation)
50
+ if (!form.retrieve('emulated:submit')) {
51
+ form.on('submit', function(submitEvent) {
52
+ var emulated = form.fire('emulated:submit', submitEvent, true)
53
+ // if custom event received preventDefault, cancel the real one too
54
+ if (emulated.returnValue === false) submitEvent.preventDefault()
55
+ })
56
+ form.store('emulated:submit', true)
57
+ }
58
+ })
59
+ }
60
+
61
+ if (!changeBubbles) {
62
+ // discover form inputs on the page
63
+ document.on('focusin', 'input, select, texarea', function(focusEvent, input) {
64
+ // special handler for real "change" events
65
+ if (!input.retrieve('emulated:change')) {
66
+ input.on('change', function(changeEvent) {
67
+ input.fire('emulated:change', changeEvent, true)
68
+ })
69
+ input.store('emulated:change', true)
70
+ }
71
+ })
72
+ }
73
+
74
+ function handleRemote(element) {
75
+ var method, url, params;
76
+
77
+ var event = element.fire("ajax:before");
78
+ if (event.stopped) return false;
79
+
80
+ if (element.tagName.toLowerCase() === 'form') {
81
+ method = element.readAttribute('method') || 'post';
82
+ url = element.readAttribute('action');
83
+ params = element.serialize();
84
+ } else {
85
+ method = element.readAttribute('data-method') || 'get';
86
+ url = element.readAttribute('href');
87
+ params = {};
88
+ }
89
+
90
+ new Ajax.Request(url, {
91
+ method: method,
92
+ parameters: params,
93
+ evalScripts: true,
94
+
95
+ onComplete: function(request) { element.fire("ajax:complete", request); },
96
+ onSuccess: function(request) { element.fire("ajax:success", request); },
97
+ onFailure: function(request) { element.fire("ajax:failure", request); }
98
+ });
99
+
100
+ element.fire("ajax:after");
101
+ }
102
+
103
+ function handleMethod(element) {
104
+ var method = element.readAttribute('data-method'),
105
+ url = element.readAttribute('href'),
106
+ csrf_param = $$('meta[name=csrf-param]')[0],
107
+ csrf_token = $$('meta[name=csrf-token]')[0];
108
+
109
+ var form = new Element('form', { method: "POST", action: url, style: "display: none;" });
110
+ element.parentNode.insert(form);
111
+
112
+ if (method !== 'post') {
113
+ var field = new Element('input', { type: 'hidden', name: '_method', value: method });
114
+ form.insert(field);
115
+ }
116
+
117
+ if (csrf_param) {
118
+ var param = csrf_param.readAttribute('content'),
119
+ token = csrf_token.readAttribute('content'),
120
+ field = new Element('input', { type: 'hidden', name: param, value: token });
121
+ form.insert(field);
122
+ }
123
+
124
+ form.submit();
125
+ }
126
+
127
+
128
+ document.on("click", "*[data-confirm]", function(event, element) {
129
+ var message = element.readAttribute('data-confirm');
130
+ if (!confirm(message)) event.stop();
131
+ });
132
+
133
+ document.on("click", "a[data-remote]", function(event, element) {
134
+ if (event.stopped) return;
135
+ handleRemote(element);
136
+ event.stop();
137
+ });
138
+
139
+ document.on("click", "a[data-method]", function(event, element) {
140
+ if (event.stopped) return;
141
+ handleMethod(element);
142
+ event.stop();
143
+ });
144
+
145
+ document.on("submit", function(event) {
146
+ var element = event.findElement(),
147
+ message = element.readAttribute('data-confirm');
148
+ if (message && !confirm(message)) {
149
+ event.stop();
150
+ return false;
151
+ }
152
+
153
+ var inputs = element.select("input[type=submit][data-disable-with]");
154
+ inputs.each(function(input) {
155
+ input.disabled = true;
156
+ input.writeAttribute('data-original-value', input.value);
157
+ input.value = input.readAttribute('data-disable-with');
158
+ });
159
+
160
+ var element = event.findElement("form[data-remote]");
161
+ if (element) {
162
+ handleRemote(element);
163
+ event.stop();
164
+ }
165
+ });
166
+
167
+ document.on("ajax:after", "form", function(event, element) {
168
+ var inputs = element.select("input[type=submit][disabled=true][data-disable-with]");
169
+ inputs.each(function(input) {
170
+ input.value = input.readAttribute('data-original-value');
171
+ input.removeAttribute('data-original-value');
172
+ input.disabled = false;
173
+ });
174
+ });
175
+
176
+ Ajax.Responders.register({
177
+ onCreate: function(request) {
178
+ var csrf_meta_tag = $$('meta[name=csrf-token]')[0];
179
+
180
+ if (csrf_meta_tag) {
181
+ var header = 'X-CSRF-Token',
182
+ token = csrf_meta_tag.readAttribute('content');
183
+
184
+ if (!request.options.requestHeaders) {
185
+ request.options.requestHeaders = {};
186
+ }
187
+ request.options.requestHeaders[header] = token;
188
+ }
189
+ }
190
+ });
191
+ })();
@@ -0,0 +1,5 @@
1
+ # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
2
+ #
3
+ # To ban all spiders from the entire site uncomment the next two lines:
4
+ # User-Agent: *
5
+ # Disallow: /
File without changes
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path('../../config/boot', __FILE__)
3
+ $LOAD_PATH.unshift "#{RAILTIES_PATH}/builtin/rails_info"
4
+ require 'commands/about'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path('../../config/boot', __FILE__)
3
+ require 'commands/console'
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ vendored_cucumber_bin = Dir["#{File.dirname(__FILE__)}/../vendor/{gems,plugins}/cucumber*/bin/cucumber"].first
4
+ if vendored_cucumber_bin
5
+ load File.expand_path(vendored_cucumber_bin)
6
+ else
7
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
8
+ require 'cucumber'
9
+ load Cucumber::BINARY
10
+ end
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path('../../config/boot', __FILE__)
3
+ require 'commands/dbconsole'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path('../../config/boot', __FILE__)
3
+ require 'commands/destroy'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path('../../config/boot', __FILE__)
3
+ require 'commands/generate'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path('../../../config/boot', __FILE__)
3
+ require 'commands/performance/benchmarker'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path('../../../config/boot', __FILE__)
3
+ require 'commands/performance/profiler'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path('../../config/boot', __FILE__)
3
+ require 'commands/plugin'
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path('../../config/boot', __FILE__)
3
+ require 'commands/runner'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path('../../config/boot', __FILE__)
3
+ require 'commands/server'
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+ require 'rails/performance_test_help'
3
+
4
+ # Profiling results for each test method are written to tmp/performance.
5
+ class BrowsingTest < ActionDispatch::PerformanceTest
6
+ def test_homepage
7
+ get '/'
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path('../../config/environment', __FILE__)
3
+ require 'rails/test_help'
4
+
5
+ class ActiveSupport::TestCase
6
+ # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
7
+ #
8
+ # Note: You'll currently still have to declare fixtures explicitly in integration tests
9
+ # -- they do not yet inherit this setting
10
+ fixtures :all
11
+
12
+ # Add more helper methods to be used by all tests here...
13
+ end
File without changes
@@ -0,0 +1,2 @@
1
+ require File.dirname(__FILE__) + '/../../../../init'
2
+
@@ -0,0 +1 @@
1
+ # Uninstall hook code here
metadata ADDED
@@ -0,0 +1,224 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: juice10-action_flow
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Justin Halsall
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-04-19 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: shoulda
23
+ version_requirements: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ prerelease: false
33
+ type: :development
34
+ requirement: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: bundler
37
+ version_requirements: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ~>
41
+ - !ruby/object:Gem::Version
42
+ hash: 23
43
+ segments:
44
+ - 1
45
+ - 0
46
+ - 0
47
+ version: 1.0.0
48
+ prerelease: false
49
+ type: :development
50
+ requirement: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: jeweler
53
+ version_requirements: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ~>
57
+ - !ruby/object:Gem::Version
58
+ hash: 7
59
+ segments:
60
+ - 1
61
+ - 5
62
+ - 2
63
+ version: 1.5.2
64
+ prerelease: false
65
+ type: :development
66
+ requirement: *id003
67
+ - !ruby/object:Gem::Dependency
68
+ name: rcov
69
+ version_requirements: &id004 !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ hash: 3
75
+ segments:
76
+ - 0
77
+ version: "0"
78
+ prerelease: false
79
+ type: :development
80
+ requirement: *id004
81
+ description: ActionFlow provides a simple way to model multi-step processes such as wizards, sign-up flows, checkout processes and the like in Rails. It allows sequences to be easily composed and reordered, as well as letting you alter the behaviour and appearance of pages based on which flow they have been accessed through.
82
+ email: justin@juice10.com
83
+ executables: []
84
+
85
+ extensions: []
86
+
87
+ extra_rdoc_files:
88
+ - LICENSE.txt
89
+ - README.rdoc
90
+ files:
91
+ - .document
92
+ - Gemfile
93
+ - Gemfile.lock
94
+ - LICENSE.txt
95
+ - MIT-LICENSE
96
+ - README.rdoc
97
+ - Rakefile
98
+ - VERSION
99
+ - action_flow.gemspec
100
+ - init.rb
101
+ - install.rb
102
+ - lib/action_flow.rb
103
+ - lib/action_flow/blank_slate.rb
104
+ - lib/action_flow/expression.rb
105
+ - lib/action_flow/filters.rb
106
+ - lib/action_flow/flow.rb
107
+ - lib/action_flow/flow/controller.rb
108
+ - lib/action_flow/flow/state.rb
109
+ - lib/action_flow/helpers.rb
110
+ - lib/action_flow/variable.rb
111
+ - test/helper.rb
112
+ - test/test_action_flow.rb
113
+ - test_app/.gitignore
114
+ - test_app/Gemfile
115
+ - test_app/Gemfile.lock
116
+ - test_app/README
117
+ - test_app/Rakefile
118
+ - test_app/app/controllers/application_controller.rb
119
+ - test_app/app/controllers/settings_controller.rb
120
+ - test_app/app/helpers/application_helper.rb
121
+ - test_app/app/views/layouts/application.html.erb
122
+ - test_app/app/views/settings/_step.html.erb
123
+ - test_app/app/views/settings/intro.html.erb
124
+ - test_app/app/views/settings/outro.html.erb
125
+ - test_app/config.ru
126
+ - test_app/config/application.rb
127
+ - test_app/config/boot.rb
128
+ - test_app/config/cucumber.yml
129
+ - test_app/config/database.yml
130
+ - test_app/config/environment.rb
131
+ - test_app/config/environments/cucumber.rb
132
+ - test_app/config/environments/development.rb
133
+ - test_app/config/environments/production.rb
134
+ - test_app/config/environments/test.rb
135
+ - test_app/config/initializers/backtrace_silencers.rb
136
+ - test_app/config/initializers/inflections.rb
137
+ - test_app/config/initializers/mime_types.rb
138
+ - test_app/config/initializers/secret_token.rb
139
+ - test_app/config/initializers/session_store.rb
140
+ - test_app/config/locales/en.yml
141
+ - test_app/config/routes.rb
142
+ - test_app/db/schema.rb
143
+ - test_app/db/seeds.rb
144
+ - test_app/features/flow_management.feature
145
+ - test_app/features/flow_with_array_alternatives.feature
146
+ - test_app/features/flows_with_conditions.feature
147
+ - test_app/features/mutual_exclusion.feature
148
+ - test_app/features/step_definitions/flow_steps.rb
149
+ - test_app/features/step_definitions/url_steps.rb
150
+ - test_app/features/step_definitions/web_steps.rb
151
+ - test_app/features/support/env.rb
152
+ - test_app/features/support/hooks.rb
153
+ - test_app/features/support/paths.rb
154
+ - test_app/features/support/selectors.rb
155
+ - test_app/lib/tasks/.gitkeep
156
+ - test_app/lib/tasks/cucumber.rake
157
+ - test_app/public/404.html
158
+ - test_app/public/422.html
159
+ - test_app/public/500.html
160
+ - test_app/public/favicon.ico
161
+ - test_app/public/images/rails.png
162
+ - test_app/public/index.html
163
+ - test_app/public/javascripts/application.js
164
+ - test_app/public/javascripts/controls.js
165
+ - test_app/public/javascripts/dragdrop.js
166
+ - test_app/public/javascripts/effects.js
167
+ - test_app/public/javascripts/prototype.js
168
+ - test_app/public/javascripts/rails.js
169
+ - test_app/public/robots.txt
170
+ - test_app/public/stylesheets/.gitkeep
171
+ - test_app/script/about
172
+ - test_app/script/console
173
+ - test_app/script/cucumber
174
+ - test_app/script/dbconsole
175
+ - test_app/script/destroy
176
+ - test_app/script/generate
177
+ - test_app/script/performance/benchmarker
178
+ - test_app/script/performance/profiler
179
+ - test_app/script/plugin
180
+ - test_app/script/rails
181
+ - test_app/script/runner
182
+ - test_app/script/server
183
+ - test_app/test/performance/browsing_test.rb
184
+ - test_app/test/test_helper.rb
185
+ - test_app/vendor/plugins/.gitkeep
186
+ - test_app/vendor/plugins/action_flow/init.rb
187
+ - uninstall.rb
188
+ has_rdoc: true
189
+ homepage: http://github.com/juice10/action_flow
190
+ licenses:
191
+ - MIT
192
+ post_install_message:
193
+ rdoc_options: []
194
+
195
+ require_paths:
196
+ - lib
197
+ required_ruby_version: !ruby/object:Gem::Requirement
198
+ none: false
199
+ requirements:
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ hash: 3
203
+ segments:
204
+ - 0
205
+ version: "0"
206
+ required_rubygems_version: !ruby/object:Gem::Requirement
207
+ none: false
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ hash: 3
212
+ segments:
213
+ - 0
214
+ version: "0"
215
+ requirements: []
216
+
217
+ rubyforge_project:
218
+ rubygems_version: 1.5.2
219
+ signing_key:
220
+ specification_version: 3
221
+ summary: ActionFlow provides a simple way to model multi-step processes such as wizards, sign-up flows, checkout processes in Rails.
222
+ test_files:
223
+ - test/helper.rb
224
+ - test/test_action_flow.rb