ruote-cukes 2.1.9

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.
@@ -0,0 +1,8 @@
1
+
2
+ = ruote-cukes - CHANGELOG.txt
3
+
4
+
5
+ == ruote-cukes - 2.1.9 released 2010/06/14
6
+
7
+ - initial release
8
+
@@ -0,0 +1,11 @@
1
+
2
+ = CREDITS.txt
3
+
4
+ John Mettraux - http://jmettraux.wordpress.com
5
+
6
+ Nicholas Faiz - http://github.com/biv
7
+ Kenneth Kalmer - http://github.com/kennethkalmer
8
+
9
+
10
+ Many thanks to the authors of Cucumber : http://cukes.info/
11
+
@@ -0,0 +1,78 @@
1
+
2
+ = ruote-cukes
3
+
4
+ Cucumber helpers (steps) for testing ruote process definitions and participants.
5
+
6
+ Scenario: alpha to bravo
7
+ Given I have a ruote engine
8
+ And the catchall participant is registered
9
+ When I launch the flow
10
+ """
11
+ Ruote.process_definition do
12
+ sequence do
13
+ alpha
14
+ participant :ref => '${f:next}'
15
+ end
16
+ end
17
+ """
18
+ Then the process should reach alpha
19
+ When I get the first workitem of participant alpha
20
+ And I update the workitem with
21
+ | next | charly |
22
+ And I reply with the workitem
23
+ Then the process should reach charly
24
+
25
+ Note the usage of two columns cucumber tables for storing fields (or variables). The first column hold the keys, while the second one the values.
26
+
27
+ Look at features/ for the whole range of examples.
28
+
29
+
30
+ == using them
31
+
32
+ gem install ruote-cukes
33
+
34
+ then make sure to include
35
+
36
+ require 'ruote-cukes'
37
+
38
+ in your feature support or step definitions.
39
+
40
+
41
+ == complex fields
42
+
43
+ When using cucumber tables to represent fields (or variables), ruote-cukes will always try to decode the values via JSON. This thus becomes possible :
44
+
45
+ Scenario: alpha to bravo
46
+ Given I have a ruote engine
47
+ And the catchall participant is registered
48
+ And the initial fields are
49
+ | targets | ["alice","bob"] |
50
+ When I launch the flow
51
+ """
52
+ Ruote.process_definition do
53
+ concurrent_iterator :on_field => 'targets', :to_f => 'f' do
54
+ participant :ref => '${f:f}'
55
+ end
56
+ end
57
+ """
58
+ Then the process should reach alice
59
+ And the process should reach bob
60
+
61
+
62
+ == running the example features
63
+
64
+ Make sure the ruote and cucumber gems are installed and run
65
+
66
+ cucumber
67
+
68
+
69
+ == author
70
+
71
+ John Mettraux
72
+ http://jmettraux.wordpress.com
73
+
74
+
75
+ == license
76
+
77
+ MIT
78
+
@@ -0,0 +1,43 @@
1
+
2
+ require 'lib/ruote/cukes/version.rb'
3
+
4
+ require 'rubygems'
5
+ require 'rake'
6
+
7
+
8
+ begin
9
+
10
+ require 'jeweler'
11
+
12
+ Jeweler::Tasks.new do |gem|
13
+
14
+ gem.version = Ruote::Cukes::VERSION
15
+ gem.name = 'ruote-cukes'
16
+ gem.summary = 'cucumber helpers for testing ruote definitions and participants'
17
+ gem.description = %{
18
+ cucumber helpers (steps) for testing ruote process definitions and participants
19
+ }
20
+ gem.email = 'jmettraux@gmail.com'
21
+ gem.homepage = 'http://ruote.rubyforge.org'
22
+ gem.authors = [ 'John Mettraux' ]
23
+ gem.rubyforge_project = 'ruote'
24
+ #gem.test_file = 'test/test.rb'
25
+
26
+ gem.add_dependency 'ruote', '>= 2.1.9'
27
+ gem.add_dependency 'cucumber'
28
+
29
+ gem.add_development_dependency 'rake'
30
+ gem.add_development_dependency 'jeweler'
31
+
32
+ # Gem::Specification http://www.rubygems.org/read/chapter/20
33
+ end
34
+ Jeweler::GemcutterTasks.new
35
+ rescue LoadError
36
+ puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler'
37
+ end
38
+
39
+ require 'rake/clean'
40
+ CLEAN.include('pkg')
41
+
42
+ task :default => [ :clean ]
43
+
@@ -0,0 +1,7 @@
1
+
2
+ [o] use tables for field input
3
+ [o] "When I update the workitem with" should do storage_participant.first if
4
+ there is no workitem present
5
+
6
+ [ ] something about participants
7
+
@@ -0,0 +1,14 @@
1
+
2
+ Feature: basic
3
+
4
+ a basic feature example
5
+
6
+ Scenario: from a to b
7
+ Given I have a ruote engine
8
+ And the catchall participant is registered
9
+ And I launch the flow at flows/a_to_b.rb
10
+ When I get the first workitem of participant alpha
11
+ Then I should have a workitem
12
+ And the process should be alive
13
+ And the process should have no errors
14
+
@@ -0,0 +1,20 @@
1
+
2
+ Feature: I launch the flow
3
+
4
+ the process definition is embedded in the feature
5
+
6
+ Scenario: alpha to bravo
7
+ Given I have a ruote engine
8
+ And the catchall participant is registered
9
+ And I launch the flow
10
+ """
11
+ Ruote.process_definition do
12
+ sequence do
13
+ alpha
14
+ bravo
15
+ end
16
+ end
17
+ """
18
+ When I get the first workitem of participant alpha
19
+ Then I should have a workitem
20
+
@@ -0,0 +1,21 @@
1
+
2
+ Feature: the fields table can hold json values
3
+
4
+ the second column of
5
+
6
+ Scenario: alpha to bravo
7
+ Given I have a ruote engine
8
+ And the catchall participant is registered
9
+ And the initial fields are
10
+ | targets | ["alice","bob"] |
11
+ When I launch the flow
12
+ """
13
+ Ruote.process_definition do
14
+ concurrent_iterator :on_field => 'targets', :to_f => 'f' do
15
+ participant :ref => '${f:f}'
16
+ end
17
+ end
18
+ """
19
+ Then the process should reach alice
20
+ And the process should reach bob
21
+
@@ -0,0 +1,17 @@
1
+
2
+ Feature: When the initial fields are
3
+
4
+ using a cucumber table to set the initial fields of a workitem (launchitem)
5
+
6
+ Scenario: alpha to bravo
7
+ Given I have a ruote engine
8
+ And the catchall participant is registered
9
+ And the initial fields are
10
+ | customer | Alain-san |
11
+ | company | super asia exchange |
12
+ And I launch the flow at flows/a_to_b.rb
13
+ When I get the first workitem of participant alpha
14
+ Then the workitem should include
15
+ | customer | Alain-san |
16
+ | company | super asia exchange |
17
+
@@ -0,0 +1,13 @@
1
+
2
+ Feature: When I launch
3
+
4
+ of course, launch may be a Given or a When
5
+
6
+ Scenario: from alpha to bravo
7
+ Given I have a ruote engine
8
+ And the catchall participant is registered
9
+ When I launch the flow at flows/a.rb
10
+ Then the process should reach alpha
11
+ When I reply
12
+ Then the process should be over
13
+
@@ -0,0 +1,14 @@
1
+
2
+ Feature: When I reply with the workitem
3
+
4
+ a step definition for letting a workitem resume in its flow
5
+
6
+ Scenario: alpha to bravo
7
+ Given I have a ruote engine
8
+ And the catchall participant is registered
9
+ When I launch the flow at flows/a_to_b.rb
10
+ Then the process should reach alpha
11
+ When I get the first workitem of alpha
12
+ And I reply with the workitem
13
+ Then the process should reach bravo
14
+
@@ -0,0 +1,5 @@
1
+
2
+ $:.unshift('lib')
3
+
4
+ require 'ruote/cukes'
5
+
@@ -0,0 +1,18 @@
1
+
2
+ Feature: When I update the workitem with
3
+
4
+ changing the fields (payload) of a workitem
5
+
6
+ Scenario: alpha to bravo
7
+ Given I have a ruote engine
8
+ And the catchall participant is registered
9
+ When I launch the flow at flows/a_to_b.rb
10
+ Then the process should reach alpha
11
+ When I get the first workitem of alpha
12
+ And I update the workitem with
13
+ | customer | Alf |
14
+ And I reply with the workitem
15
+ Then the process should reach bravo
16
+ And the workitem should include
17
+ | customer | Alf |
18
+
@@ -0,0 +1,12 @@
1
+
2
+ Feature: When I launch
3
+
4
+ of course, launch may be a Given or a When
5
+
6
+ Scenario: from alpha to bravo
7
+ Given I have a ruote engine
8
+ And the catchall participant is registered
9
+ When I launch the flow at flows/a_to_b.rb
10
+ Then the process should reach alpha
11
+ And the process should reach participant alpha
12
+
@@ -0,0 +1,24 @@
1
+
2
+ Feature: ruote-cukes features
3
+
4
+ showing a rather complete example
5
+
6
+ Scenario: alpha to bravo
7
+ Given I have a ruote engine
8
+ And the catchall participant is registered
9
+ When I launch the flow
10
+ """
11
+ Ruote.process_definition do
12
+ sequence do
13
+ alpha
14
+ participant :ref => '${f:next}'
15
+ end
16
+ end
17
+ """
18
+ Then the process should reach alpha
19
+ When I get the first workitem of participant alpha
20
+ And I update the workitem with
21
+ | next | charly |
22
+ And I reply with the workitem
23
+ Then the process should reach charly
24
+
@@ -0,0 +1,8 @@
1
+
2
+ #
3
+ # a tiny process with only a stop to participant alpha
4
+ #
5
+ Ruote.process_definition do
6
+ alpha
7
+ end
8
+
@@ -0,0 +1,8 @@
1
+
2
+ Ruote.process_definition do
3
+ sequence do
4
+ alpha
5
+ bravo
6
+ end
7
+ end
8
+
@@ -0,0 +1,213 @@
1
+ #--
2
+ # Copyright (c) 2010, John Mettraux, jmettraux@gmail.com
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+ # Made in Japan.
23
+ #++
24
+
25
+
26
+ require 'test/unit/assertions'
27
+ include Test::Unit::Assertions
28
+ # not sure about that for now...
29
+
30
+ require 'json'
31
+ require 'ruote'
32
+
33
+ require 'ruote/cukes/version'
34
+
35
+
36
+ #
37
+ # a variable container in a singleton, or something like that
38
+ #
39
+ module Ruote::Cukes
40
+
41
+ def self.method_missing (m, *args)
42
+ m = m.to_s
43
+ if args.size == 1 && mm = m.match(/^(.+)=$/)
44
+ (@vars ||= {})[mm[1]] = args.first
45
+ elsif args.size == 0
46
+ (@vars ||= {})[m]
47
+ else
48
+ super
49
+ end
50
+ end
51
+
52
+ def self.workitem
53
+
54
+ if wi = @vars['workitem']
55
+ return wi
56
+ end
57
+
58
+ wi = @vars['storage_participant'].first
59
+
60
+ @vars['workitem'] = wi
61
+ end
62
+ end
63
+
64
+ #
65
+ # re-opening the cucumber table class to add a fancy to_hash method
66
+ #
67
+ class Cucumber::Ast::Table
68
+
69
+ def to_hash
70
+
71
+ self.raw.inject({}) do |h, (k, v)|
72
+ h[k] = (Rufus::Json.decode(v) rescue v)
73
+ h
74
+ end
75
+ end
76
+ end
77
+
78
+
79
+ #
80
+ # ENGINE
81
+
82
+ Given /I have a ruote engine/ do
83
+
84
+ Ruote::Cukes.engine =
85
+ Ruote::Engine.new(
86
+ Ruote::Worker.new(
87
+ Ruote::HashStorage.new(
88
+ 's_logger' => [ 'ruote/log/test_logger', 'Ruote::TestLogger' ])))
89
+ end
90
+
91
+
92
+ #
93
+ # PARTICIPANTS
94
+
95
+ Given /the catch[- ]?all participant is registered/ do
96
+
97
+ Ruote::Cukes.storage_participant =
98
+ Ruote::Cukes.engine.register_participant('.+', Ruote::StorageParticipant)
99
+
100
+ Ruote::Cukes.storage_participant.context = Ruote::Cukes.engine.context
101
+ # due to a bug in ruote 2.1.7, remove when 2.1.8 is out
102
+ end
103
+
104
+ Given /I get the first workitem of (?:participant )?(.+)$/ do |pname|
105
+
106
+ sleep 0.100 # give some time to the engine
107
+
108
+ Ruote::Cukes.workitem =
109
+ Ruote::Cukes.storage_participant.by_participant(pname).first
110
+ end
111
+
112
+
113
+ #
114
+ # LAUNCH
115
+
116
+ Given /the initial fields are$/ do |table|
117
+
118
+ Ruote::Cukes.launch_fields = table.to_hash
119
+ end
120
+
121
+ Given /the initial variables are (.+)$/ do |table|
122
+
123
+ Ruote::Cukes.launch_variables = table.to_hash
124
+ end
125
+
126
+ Given /I launch the flow at (.+)$/ do |path|
127
+
128
+ Ruote::Cukes.last_wfid = Ruote::Cukes.engine.launch(
129
+ path,
130
+ Ruote::Cukes.launch_fields || {},
131
+ Ruote::Cukes.launch_variables || {})
132
+ end
133
+
134
+ Given /I launch the flow$/ do |process_definition|
135
+
136
+ Ruote::Cukes.last_wfid = Ruote::Cukes.engine.launch(
137
+ process_definition,
138
+ Ruote::Cukes.launch_fields || {},
139
+ Ruote::Cukes.launch_variables || {})
140
+ end
141
+
142
+
143
+ #
144
+ # WORKITEMS
145
+
146
+ When /^I reply with the workitem$/ do
147
+
148
+ Ruote::Cukes.storage_participant.reply(Ruote::Cukes.workitem)
149
+ Ruote::Cukes.workitem = nil
150
+ end
151
+
152
+ When /^I update the workitem with$/ do |table|
153
+
154
+ Ruote::Cukes.workitem.fields.merge!(table.to_hash)
155
+ end
156
+
157
+ When /^I reply$/ do
158
+
159
+ sleep 0.100 # give some time to the engine
160
+
161
+ Ruote::Cukes.storage_participant.reply(
162
+ Ruote::Cukes.storage_participant.all.first)
163
+ end
164
+
165
+ Then /I should have a workitem/ do
166
+
167
+ assert_not_nil Ruote::Cukes.workitem
168
+ end
169
+
170
+ Then /^the workitem (?:fields )?should include$/ do |table|
171
+
172
+ fields = table.to_hash
173
+
174
+ assert_nil fields.find { |k, v|
175
+ Ruote::Cukes.workitem.fields[k] != v
176
+ }
177
+ end
178
+
179
+
180
+
181
+ #
182
+ # PROCESSES
183
+
184
+ Then /^the process should be alive$/ do
185
+
186
+ assert_not_nil Ruote::Cukes.engine.process(Ruote::Cukes.last_wfid)
187
+ end
188
+
189
+ Then /^the process should have no errors$/ do
190
+
191
+ assert_equal [], Ruote::Cukes.engine.process(Ruote::Cukes.last_wfid).errors
192
+ end
193
+
194
+ Then /^the process should reach (?:participant )?(.+)$/ do |pname|
195
+
196
+ sleep 0.100 # give some time to the engine
197
+
198
+ assert_not_nil Ruote::Cukes.storage_participant.all.find { |wi|
199
+ wi.fei.wfid == Ruote::Cukes.last_wfid && wi.participant_name == pname
200
+ }
201
+ end
202
+
203
+ Then /^the process should be over$/ do
204
+
205
+ sleep 0.100 # give some time to the engine
206
+
207
+ assert_not_nil Ruote::Cukes.engine.context.logger.log.find do |r|
208
+ r['action'] == 'terminated' && r['wfid'] == Ruote::Cukes.last_wfid
209
+ end
210
+
211
+ assert_nil Ruote::Cukes.engine.process(Ruote::Cukes.last_wfid)
212
+ end
213
+
@@ -0,0 +1,8 @@
1
+
2
+ module Ruote
3
+ module Cukes
4
+
5
+ VERSION = '2.1.9'
6
+ end
7
+ end
8
+
@@ -0,0 +1,71 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{ruote-cukes}
8
+ s.version = "2.1.9"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["John Mettraux"]
12
+ s.date = %q{2010-06-14}
13
+ s.description = %q{
14
+ cucumber helpers (steps) for testing ruote process definitions and participants
15
+ }
16
+ s.email = %q{jmettraux@gmail.com}
17
+ s.extra_rdoc_files = [
18
+ "README.rdoc"
19
+ ]
20
+ s.files = [
21
+ "CHANGELOG.txt",
22
+ "CREDITS.txt",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "TODO.txt",
26
+ "features/basic.feature",
27
+ "features/embedded.feature",
28
+ "features/fields_and_json.feature",
29
+ "features/initial_fields.feature",
30
+ "features/over.feature",
31
+ "features/reply.feature",
32
+ "features/step_definitions/requiring.rb",
33
+ "features/update.feature",
34
+ "features/when.feature",
35
+ "features/whole.feature",
36
+ "flows/a.rb",
37
+ "flows/a_to_b.rb",
38
+ "lib/ruote/cukes.rb",
39
+ "lib/ruote/cukes/version.rb",
40
+ "ruote-cukes.gemspec"
41
+ ]
42
+ s.homepage = %q{http://ruote.rubyforge.org}
43
+ s.rdoc_options = ["--charset=UTF-8"]
44
+ s.require_paths = ["lib"]
45
+ s.rubyforge_project = %q{ruote}
46
+ s.rubygems_version = %q{1.3.6}
47
+ s.summary = %q{cucumber helpers for testing ruote definitions and participants}
48
+
49
+ if s.respond_to? :specification_version then
50
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
51
+ s.specification_version = 3
52
+
53
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
54
+ s.add_runtime_dependency(%q<ruote>, [">= 2.1.9"])
55
+ s.add_runtime_dependency(%q<cucumber>, [">= 0"])
56
+ s.add_development_dependency(%q<rake>, [">= 0"])
57
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
58
+ else
59
+ s.add_dependency(%q<ruote>, [">= 2.1.9"])
60
+ s.add_dependency(%q<cucumber>, [">= 0"])
61
+ s.add_dependency(%q<rake>, [">= 0"])
62
+ s.add_dependency(%q<jeweler>, [">= 0"])
63
+ end
64
+ else
65
+ s.add_dependency(%q<ruote>, [">= 2.1.9"])
66
+ s.add_dependency(%q<cucumber>, [">= 0"])
67
+ s.add_dependency(%q<rake>, [">= 0"])
68
+ s.add_dependency(%q<jeweler>, [">= 0"])
69
+ end
70
+ end
71
+
metadata ADDED
@@ -0,0 +1,131 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruote-cukes
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 2
7
+ - 1
8
+ - 9
9
+ version: 2.1.9
10
+ platform: ruby
11
+ authors:
12
+ - John Mettraux
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-06-14 00:00:00 +09:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: ruote
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 2
29
+ - 1
30
+ - 9
31
+ version: 2.1.9
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: cucumber
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ type: :runtime
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ segments:
54
+ - 0
55
+ version: "0"
56
+ type: :development
57
+ version_requirements: *id003
58
+ - !ruby/object:Gem::Dependency
59
+ name: jeweler
60
+ prerelease: false
61
+ requirement: &id004 !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ segments:
66
+ - 0
67
+ version: "0"
68
+ type: :development
69
+ version_requirements: *id004
70
+ description: "\n\
71
+ cucumber helpers (steps) for testing ruote process definitions and participants\n "
72
+ email: jmettraux@gmail.com
73
+ executables: []
74
+
75
+ extensions: []
76
+
77
+ extra_rdoc_files:
78
+ - README.rdoc
79
+ files:
80
+ - CHANGELOG.txt
81
+ - CREDITS.txt
82
+ - README.rdoc
83
+ - Rakefile
84
+ - TODO.txt
85
+ - features/basic.feature
86
+ - features/embedded.feature
87
+ - features/fields_and_json.feature
88
+ - features/initial_fields.feature
89
+ - features/over.feature
90
+ - features/reply.feature
91
+ - features/step_definitions/requiring.rb
92
+ - features/update.feature
93
+ - features/when.feature
94
+ - features/whole.feature
95
+ - flows/a.rb
96
+ - flows/a_to_b.rb
97
+ - lib/ruote/cukes.rb
98
+ - lib/ruote/cukes/version.rb
99
+ - ruote-cukes.gemspec
100
+ has_rdoc: true
101
+ homepage: http://ruote.rubyforge.org
102
+ licenses: []
103
+
104
+ post_install_message:
105
+ rdoc_options:
106
+ - --charset=UTF-8
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ segments:
114
+ - 0
115
+ version: "0"
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ segments:
121
+ - 0
122
+ version: "0"
123
+ requirements: []
124
+
125
+ rubyforge_project: ruote
126
+ rubygems_version: 1.3.6
127
+ signing_key:
128
+ specification_version: 3
129
+ summary: cucumber helpers for testing ruote definitions and participants
130
+ test_files: []
131
+