symbiont 0.1.9 → 0.2.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.
- data/Gemfile.lock +22 -7
- data/HISTORY.md +6 -0
- data/app/public/css/site.css +16 -0
- data/app/public/js/site.js +3 -1
- data/app/views/comics.erb +23 -1
- data/app/views/webobject.erb +1 -1
- data/lib/symbiont/data_setter.rb +7 -3
- data/lib/symbiont/enclosers.rb +24 -27
- data/lib/symbiont/evaluators.rb +52 -23
- data/lib/symbiont/factory.rb +19 -75
- data/lib/symbiont/generators.rb +172 -44
- data/lib/symbiont/platform_watir/platform_object.rb +202 -18
- data/lib/symbiont/version.rb +1 -1
- data/lib/symbiont/web_objects/button.rb +1 -1
- data/lib/symbiont/web_objects/checkbox.rb +1 -1
- data/lib/symbiont/web_objects/heading.rb +12 -0
- data/lib/symbiont/web_objects/hidden_field.rb +19 -0
- data/lib/symbiont/web_objects/label.rb +15 -0
- data/lib/symbiont/web_objects/list_item.rb +13 -0
- data/lib/symbiont/web_objects/ordered_list.rb +49 -0
- data/lib/symbiont/web_objects/radio.rb +1 -1
- data/lib/symbiont/web_objects/select_list.rb +1 -1
- data/lib/symbiont/web_objects/table.rb +4 -0
- data/lib/symbiont/web_objects/table_row.rb +4 -0
- data/lib/symbiont/web_objects/text_area.rb +26 -0
- data/lib/symbiont/web_objects/unordered_list.rb +49 -0
- data/lib/symbiont.rb +7 -0
- data/lucid.yml +6 -0
- data/spec/spec_helper.rb +70 -16
- data/spec/symbiont/data_setter_spec.rb +65 -62
- data/spec/symbiont/enclosers_spec.rb +76 -57
- data/spec/symbiont/evaluators_spec.rb +95 -75
- data/spec/symbiont/factory_spec.rb +174 -122
- data/spec/symbiont/generators/button_generators_spec.rb +34 -31
- data/spec/symbiont/generators/checkbox_generators_spec.rb +79 -75
- data/spec/symbiont/generators/div_generators_spec.rb +56 -52
- data/spec/symbiont/generators/hidden_field_generators_spec.rb +65 -0
- data/spec/symbiont/generators/link_generators_spec.rb +30 -27
- data/spec/symbiont/generators/paragraph_generators_spec.rb +22 -17
- data/spec/symbiont/generators/radio_generators_spec.rb +76 -77
- data/spec/symbiont/generators/select_list_generators_spec.rb +93 -77
- data/spec/symbiont/generators/span_generators_spec.rb +56 -52
- data/spec/symbiont/generators/{cell_generators_spec.rb → table_cell_generators_spec.rb} +56 -52
- data/spec/symbiont/generators/table_generators_spec.rb +56 -52
- data/spec/symbiont/generators/text_area_generators_spec.rb +72 -0
- data/spec/symbiont/generators/text_field_generators_spec.rb +30 -27
- data/spec/symbiont/generators_spec.rb +38 -28
- data/spec/symbiont/locators_spec.rb +68 -68
- data/spec/symbiont/platform_object_spec.rb +2 -4
- data/spec/symbiont/symbiont_spec.rb +10 -8
- data/spec/symbiont/web_object_spec.rb +194 -194
- data/spec/symbiont/web_objects/button_spec.rb +38 -30
- data/spec/symbiont/web_objects/checkbox_spec.rb +27 -27
- data/spec/symbiont/web_objects/div_spec.rb +18 -11
- data/spec/symbiont/web_objects/heading_spec.rb +22 -0
- data/spec/symbiont/web_objects/hidden_field_spec.rb +18 -0
- data/spec/symbiont/web_objects/label_spec.rb +18 -0
- data/spec/symbiont/web_objects/link_spec.rb +33 -33
- data/spec/symbiont/web_objects/list_item_spec.rb +18 -0
- data/spec/symbiont/web_objects/option_spec.rb +9 -9
- data/spec/symbiont/web_objects/ordered_list_spec.rb +53 -0
- data/spec/symbiont/web_objects/paragraph_spec.rb +9 -2
- data/spec/symbiont/web_objects/radio_spec.rb +27 -27
- data/spec/symbiont/web_objects/select_list_spec.rb +69 -69
- data/spec/symbiont/web_objects/span_spec.rb +18 -11
- data/spec/symbiont/web_objects/table_cell_spec.rb +19 -19
- data/spec/symbiont/web_objects/table_row_spec.rb +58 -58
- data/spec/symbiont/web_objects/table_spec.rb +61 -61
- data/spec/symbiont/web_objects/text_area_spec.rb +18 -0
- data/spec/symbiont/web_objects/text_field_spec.rb +39 -39
- data/spec/symbiont/web_objects/unordered_list_spec.rb +51 -0
- data/specs/common/support/browser.rb +25 -0
- data/specs/common/support/env.rb +6 -0
- data/specs/common/support/events.rb +15 -0
- data/specs/enclosers.feature +9 -0
- data/specs/evaluators.feature +26 -0
- data/specs/pages/characters.rb +22 -0
- data/specs/pages/home.rb +9 -0
- data/specs/pages/stardate.rb +23 -0
- data/specs/pages/web_objects.rb +77 -0
- data/specs/select_list.feature +53 -0
- data/specs/steps/enclosers_steps.rb +17 -0
- data/specs/steps/evaluators_steps.rb +44 -0
- data/specs/steps/navigation_steps.rb +14 -0
- data/specs/steps/select_list_steps.rb +94 -0
- data/specs/steps/table_cell_steps.rb +31 -0
- data/specs/steps/table_steps.rb +87 -0
- data/specs/table.feature +49 -0
- data/specs/table_cell.feature +27 -0
- data/symbiont.gemspec +4 -1
- metadata +72 -6
- data/cucumber.yml +0 -6
data/Gemfile.lock
CHANGED
|
@@ -1,23 +1,36 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
symbiont (0.
|
|
5
|
-
selenium-webdriver (= 2.
|
|
4
|
+
symbiont (0.2.0)
|
|
5
|
+
selenium-webdriver (= 2.31.0)
|
|
6
6
|
watir-webdriver (= 0.6.2)
|
|
7
7
|
|
|
8
8
|
GEM
|
|
9
9
|
remote: http://rubygems.org/
|
|
10
10
|
specs:
|
|
11
|
-
childprocess (0.3.
|
|
12
|
-
ffi (~> 1.0, >= 1.0.
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
childprocess (0.3.9)
|
|
12
|
+
ffi (~> 1.0, >= 1.0.11)
|
|
13
|
+
diff-lcs (1.2.1)
|
|
14
|
+
ffi (1.5.0-x86-mingw32)
|
|
15
|
+
multi_json (1.7.1)
|
|
16
|
+
rspec (2.13.0)
|
|
17
|
+
rspec-core (~> 2.13.0)
|
|
18
|
+
rspec-expectations (~> 2.13.0)
|
|
19
|
+
rspec-mocks (~> 2.13.0)
|
|
20
|
+
rspec-core (2.13.1)
|
|
21
|
+
rspec-expectations (2.13.0)
|
|
22
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
|
23
|
+
rspec-mocks (2.13.0)
|
|
15
24
|
rubyzip (0.9.9)
|
|
16
|
-
selenium-webdriver (2.
|
|
25
|
+
selenium-webdriver (2.31.0)
|
|
17
26
|
childprocess (>= 0.2.5)
|
|
18
27
|
multi_json (~> 1.0)
|
|
19
28
|
rubyzip
|
|
20
29
|
websocket (~> 1.0.4)
|
|
30
|
+
simplecov (0.7.1)
|
|
31
|
+
multi_json (~> 1.0)
|
|
32
|
+
simplecov-html (~> 0.7.1)
|
|
33
|
+
simplecov-html (0.7.1)
|
|
21
34
|
watir-webdriver (0.6.2)
|
|
22
35
|
selenium-webdriver (>= 2.18.0)
|
|
23
36
|
websocket (1.0.7)
|
|
@@ -26,4 +39,6 @@ PLATFORMS
|
|
|
26
39
|
x86-mingw32
|
|
27
40
|
|
|
28
41
|
DEPENDENCIES
|
|
42
|
+
rspec
|
|
43
|
+
simplecov
|
|
29
44
|
symbiont!
|
data/HISTORY.md
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
Change Log and History
|
|
2
2
|
======================
|
|
3
3
|
|
|
4
|
+
Version 0.2.0 / 2013-03-28
|
|
5
|
+
--------------------------
|
|
6
|
+
|
|
7
|
+
This release adds in more web objects, like labels, headings, and lists. I have also begun putting the unit tests back in place. An initial start has been made at recognizing multiple elements of a given type.
|
|
8
|
+
|
|
9
|
+
|
|
4
10
|
Version 0.1.9 / 2013-02-06
|
|
5
11
|
--------------------------
|
|
6
12
|
|
data/app/public/css/site.css
CHANGED
|
@@ -428,3 +428,19 @@ div.expanded {
|
|
|
428
428
|
background-color: rgb(110,138,195);
|
|
429
429
|
}
|
|
430
430
|
/* End: Login Form */
|
|
431
|
+
|
|
432
|
+
#pub-grid {
|
|
433
|
+
border: 1px solid black;
|
|
434
|
+
color: white;
|
|
435
|
+
background-color: green;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
#pub-grid thead {
|
|
439
|
+
border-bottom: 1px solid black;
|
|
440
|
+
vertical-align: center;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
#pub-grid td {
|
|
444
|
+
vertical-align: bottom;
|
|
445
|
+
padding: 20px;
|
|
446
|
+
}
|
data/app/public/js/site.js
CHANGED
data/app/views/comics.erb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<section>
|
|
2
2
|
|
|
3
|
-
<table id="comic-grid" class="display">
|
|
3
|
+
<table id="comic-grid" name="comic-grid" class="display">
|
|
4
4
|
<thead>
|
|
5
5
|
<tr>
|
|
6
6
|
<th>Name</th>
|
|
@@ -319,4 +319,26 @@
|
|
|
319
319
|
</tbody>
|
|
320
320
|
</table>
|
|
321
321
|
|
|
322
|
+
<p>Basic Data:</p>
|
|
323
|
+
<table id="pub-grid">
|
|
324
|
+
<thead>
|
|
325
|
+
<tr>
|
|
326
|
+
<th>Publisher</th>
|
|
327
|
+
<th>Founded</th>
|
|
328
|
+
<th>Original Name</th>
|
|
329
|
+
</tr>
|
|
330
|
+
</thead>
|
|
331
|
+
<tbody>
|
|
332
|
+
<tr>
|
|
333
|
+
<td>DC</td>
|
|
334
|
+
<td id="dc_founded" name="dc_founded" class="pub">1934</td>
|
|
335
|
+
<td>National Allied Publications</td>
|
|
336
|
+
</tr>
|
|
337
|
+
<tr>
|
|
338
|
+
<td>Marvel</td>
|
|
339
|
+
<td id="marvel_founded" name="marvel_founded" class="pub">1939</td>
|
|
340
|
+
<td>Timely Publications</td>
|
|
341
|
+
</tr>
|
|
342
|
+
</tbody>
|
|
343
|
+
</table>
|
|
322
344
|
</section>
|
data/app/views/webobject.erb
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
</div>
|
|
31
31
|
<div>
|
|
32
32
|
<label for="dob" class="label">Date of Birth</label>
|
|
33
|
-
<input name="dob" type="text" id="dob" class="date" title="Please type your date of birth using this format: 01/19/2000"
|
|
33
|
+
<input name="dob" type="text" id="dob" class="date" title="Please type your date of birth using this format: 01/19/2000">
|
|
34
34
|
</div>
|
|
35
35
|
<div>
|
|
36
36
|
<label for="password" class="label">Password</label>
|
data/lib/symbiont/data_setter.rb
CHANGED
|
@@ -21,12 +21,15 @@ module Symbiont
|
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
def use_check_data_with(key, value)
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
if value
|
|
25
|
+
self.send "check_#{key}"
|
|
26
|
+
else
|
|
27
|
+
self.send "uncheck_#{key}"
|
|
28
|
+
end
|
|
26
29
|
end
|
|
27
30
|
|
|
28
31
|
def use_select_data_with(key, value)
|
|
29
|
-
|
|
32
|
+
self.send "select_#{key}" if value
|
|
30
33
|
end
|
|
31
34
|
|
|
32
35
|
def text_settable_for(key)
|
|
@@ -42,6 +45,7 @@ module Symbiont
|
|
|
42
45
|
end
|
|
43
46
|
|
|
44
47
|
def object_enabled_for(key)
|
|
48
|
+
return true if (self.send "#{key}_object").tag_name == "textarea"
|
|
45
49
|
self.send("#{key}_object").enabled?
|
|
46
50
|
end
|
|
47
51
|
|
data/lib/symbiont/enclosers.rb
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
module Symbiont
|
|
2
2
|
module Enclosers
|
|
3
|
+
# Provides a context for an action that must succeed within a given time period.
|
|
4
|
+
# The logic here is simply that the result of the action will be true (meaning
|
|
5
|
+
# the action was carried out) or false, which means the action did not succeed
|
|
6
|
+
# in the time allotted.
|
|
7
|
+
#
|
|
8
|
+
# @param [Integer] timeout the amount of time in seconds to wait
|
|
9
|
+
# @param [String] message the text to return if the action did not occur in time
|
|
10
|
+
# @param [Proc] block the code that calls the desired action
|
|
11
|
+
#
|
|
12
|
+
# @example
|
|
13
|
+
# @page.wait_for(5, 'page with expected title not found') do
|
|
14
|
+
# @page.title.should == "Test App"
|
|
15
|
+
# end
|
|
16
|
+
def wait_for(timeout=Symbiont.page_level_wait, message=nil, &block)
|
|
17
|
+
platform.wait_for(timeout, message, &block)
|
|
18
|
+
end
|
|
3
19
|
|
|
4
20
|
# Used to identify a web object or action on a web object as existing
|
|
5
21
|
# within an enclosing window object. The window can be referenced using
|
|
@@ -33,9 +49,7 @@ module Symbiont
|
|
|
33
49
|
# button :login, id: "btnSubmit", frame: encloser
|
|
34
50
|
# end
|
|
35
51
|
def within_frame(locator, encloser=nil, &block)
|
|
36
|
-
encloser
|
|
37
|
-
encloser << locator
|
|
38
|
-
block.call(encloser)
|
|
52
|
+
platform.within_frame(locator, encloser, &block)
|
|
39
53
|
end
|
|
40
54
|
|
|
41
55
|
# Used to identify a web object as existing within an enclosing object
|
|
@@ -54,23 +68,6 @@ module Symbiont
|
|
|
54
68
|
yield if block_given?
|
|
55
69
|
end
|
|
56
70
|
|
|
57
|
-
# Provides a context for an action that must succeed within a given time period.
|
|
58
|
-
# The logic here is simply that the result of the action will be true (meaning
|
|
59
|
-
# the action was carried out) or false, which means the action did not succeed
|
|
60
|
-
# in the time allotted.
|
|
61
|
-
#
|
|
62
|
-
# @param [Integer] timeout the amount of time in seconds to wait
|
|
63
|
-
# @param [String] message the text to return if the action did not occur in time
|
|
64
|
-
# @param [Proc] block the code that calls the desired action
|
|
65
|
-
#
|
|
66
|
-
# @example
|
|
67
|
-
# @page.wait_for(5, 'page with expected title not found') do
|
|
68
|
-
# @page.title.should == "Test App"
|
|
69
|
-
# end
|
|
70
|
-
def wait_for(timeout=Symbiont.page_level_wait, message=nil, &block)
|
|
71
|
-
platform.wait_for(timeout, message, &block)
|
|
72
|
-
end
|
|
73
|
-
|
|
74
71
|
# Provides a context for an action that will generate a JavaScript alert
|
|
75
72
|
# message box. The alert invocation will be overridden by the platform.
|
|
76
73
|
#
|
|
@@ -81,15 +78,15 @@ module Symbiont
|
|
|
81
78
|
# response = @page.will_alert do
|
|
82
79
|
# @page.submitForm
|
|
83
80
|
# end
|
|
84
|
-
def will_alert(&block)
|
|
85
|
-
platform.will_alert(&block)
|
|
81
|
+
def will_alert(encloser=nil, &block)
|
|
82
|
+
platform.will_alert(encloser, &block)
|
|
86
83
|
end
|
|
87
84
|
|
|
88
85
|
# Provides a context for an action that will generate a JavaScript
|
|
89
86
|
# confirmation message box. The confirmation invocation will be
|
|
90
87
|
# overridden by the platform.
|
|
91
88
|
#
|
|
92
|
-
# @param [bool] true to accept the confirmation, false to cancel it
|
|
89
|
+
# @param [bool] response true to accept the confirmation, false to cancel it
|
|
93
90
|
# @param [Proc] block the code that generates the confirmation
|
|
94
91
|
# @return [String] the message contained in the confirmation message box
|
|
95
92
|
#
|
|
@@ -97,8 +94,8 @@ module Symbiont
|
|
|
97
94
|
# response = @page.will_confirm(true) do
|
|
98
95
|
# @page.areYouSure
|
|
99
96
|
# end
|
|
100
|
-
def will_confirm(response, &block)
|
|
101
|
-
platform.will_confirm(response, &block)
|
|
97
|
+
def will_confirm(response, encloser=nil, &block)
|
|
98
|
+
platform.will_confirm(response, encloser, &block)
|
|
102
99
|
end
|
|
103
100
|
|
|
104
101
|
# Provides a context for an action that will generate a JavaScript prompt
|
|
@@ -113,8 +110,8 @@ module Symbiont
|
|
|
113
110
|
# response = @page.will_prompt("use this") do
|
|
114
111
|
# @page.useValue
|
|
115
112
|
# end
|
|
116
|
-
def will_prompt(response, &block)
|
|
117
|
-
platform.will_prompt(response, &block)
|
|
113
|
+
def will_prompt(response, encloser=nil, &block)
|
|
114
|
+
platform.will_prompt(response, encloser, &block)
|
|
118
115
|
end
|
|
119
116
|
|
|
120
117
|
end # module: Enclosers
|
data/lib/symbiont/evaluators.rb
CHANGED
|
@@ -1,52 +1,81 @@
|
|
|
1
1
|
module Symbiont
|
|
2
2
|
module Evaluators
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
## Browser-Level Actions ##
|
|
5
|
+
|
|
4
6
|
def visit(url)
|
|
5
7
|
platform.visit(url)
|
|
6
8
|
end
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def markup
|
|
13
|
-
platform.markup
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
alias_method :html, :markup
|
|
17
|
-
|
|
18
|
-
def title
|
|
19
|
-
platform.title
|
|
20
|
-
end
|
|
21
|
-
|
|
9
|
+
|
|
10
|
+
alias_method :navigate_to, :visit
|
|
11
|
+
|
|
22
12
|
def url
|
|
23
13
|
platform.url
|
|
24
14
|
end
|
|
25
|
-
|
|
15
|
+
|
|
16
|
+
alias_method :current_url, :url
|
|
17
|
+
|
|
26
18
|
# Save a snapshot of the current screen to a provided file location.
|
|
27
19
|
# The file will be saved as a PNG file in the path specified or in the
|
|
28
20
|
# location where the tests are being run from.
|
|
29
21
|
def screenshot(file)
|
|
30
22
|
platform.screenshot file
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def focus
|
|
34
|
-
platform.focus
|
|
35
23
|
end
|
|
36
24
|
|
|
37
|
-
alias_method :
|
|
25
|
+
alias_method :save_screenshot, :screenshot
|
|
38
26
|
|
|
39
27
|
# Executes JavaScript against the browser instance.
|
|
40
28
|
def run_script(script)
|
|
41
29
|
platform.run_script(script)
|
|
42
30
|
end
|
|
43
|
-
|
|
31
|
+
|
|
44
32
|
alias_method :execute_script, :run_script
|
|
45
33
|
|
|
46
34
|
def back
|
|
47
35
|
platform.back
|
|
48
36
|
end
|
|
49
37
|
|
|
38
|
+
def forward
|
|
39
|
+
platform.forward
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def refresh
|
|
43
|
+
platform.refresh
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def remove_cookies
|
|
47
|
+
platform.remove_cookies
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
alias_method :clear_cookies, :remove_cookies
|
|
51
|
+
|
|
52
|
+
## Page-Level Actions ##
|
|
53
|
+
|
|
54
|
+
def text
|
|
55
|
+
platform.text
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def markup
|
|
59
|
+
platform.markup
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
alias_method :html, :markup
|
|
63
|
+
|
|
64
|
+
def title
|
|
65
|
+
platform.title
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Returns the element on a page that has the focus.
|
|
69
|
+
def focus
|
|
70
|
+
platform.focus
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
alias_method :what_has_focus?, :focus
|
|
74
|
+
|
|
75
|
+
def wait_for_app(value=1)
|
|
76
|
+
sleep value
|
|
77
|
+
end
|
|
78
|
+
|
|
50
79
|
# Provides an evaluator that attempts to wait for any pending AJAX
|
|
51
80
|
# requests from the jQuery library.
|
|
52
81
|
def wait_for_pending_requests(time_limit=30, message_if_timeout=nil)
|
data/lib/symbiont/factory.rb
CHANGED
|
@@ -7,9 +7,9 @@ module Symbiont
|
|
|
7
7
|
# @param [optional] block Logic to execute within the context of the
|
|
8
8
|
# definition
|
|
9
9
|
# @return [Object] instance of the definition
|
|
10
|
-
def on(definition, &block)
|
|
11
|
-
|
|
12
|
-
@active = definition.new(@browser)
|
|
10
|
+
def on(definition, visit=false, &block)
|
|
11
|
+
definition = get_object_for(definition) if definition.is_a? String
|
|
12
|
+
@active = definition.new(@browser, visit)
|
|
13
13
|
block.call @active if block
|
|
14
14
|
@active
|
|
15
15
|
end
|
|
@@ -22,81 +22,25 @@ module Symbiont
|
|
|
22
22
|
# definition
|
|
23
23
|
# @return [Object] instance of the definition
|
|
24
24
|
def on_view(definition, &block)
|
|
25
|
-
|
|
26
|
-
block.call @active if block
|
|
27
|
-
@active
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
alias :during :on
|
|
31
|
-
alias :start_activity :on_view
|
|
32
|
-
|
|
33
|
-
# Starts a workflow, which is a set of predefined actions. You can use
|
|
34
|
-
# this to navigate through a set of actions (and thus a set of
|
|
35
|
-
# definitions). This is done by calling an action that is specified as
|
|
36
|
-
# part of the workflow path. This action will be called on the relevant
|
|
37
|
-
# definition at each point of the workflow.
|
|
38
|
-
#
|
|
39
|
-
# @param [Class] definition an instance of the definition; note this
|
|
40
|
-
# instance must have the workflow action defined on it.
|
|
41
|
-
# @param [Hash] elements a hash that contains an element with the
|
|
42
|
-
# key :using. This is used to lookup the actions for the workflow.
|
|
43
|
-
# @param [optional] block Logic to execute within the context of the
|
|
44
|
-
# workflow.
|
|
45
|
-
# @return [Object] the definition being used at that point of the
|
|
46
|
-
# workflow.
|
|
47
|
-
def start_workflow(definition, elements = {:using => :default}, &block)
|
|
48
|
-
path = workflow_path_for(elements)
|
|
49
|
-
to_element = find_element_for(path, definition) - 1
|
|
50
|
-
go_through_definitions(path[0..to_element])
|
|
51
|
-
on(definition, &block)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# This provides a way to start a workflow from somewhere other than the
|
|
55
|
-
# start of the workflow. Specifically, the workflow will start from whatever
|
|
56
|
-
# the active definition is.
|
|
57
|
-
#
|
|
58
|
-
# @param [Class] definition an instance of the definition; note this
|
|
59
|
-
# instance must have the workflow action defined on it.
|
|
60
|
-
# @param [Hash] elements a hash that contains an element with the
|
|
61
|
-
# key :using. This is used to lookup the actions for the workflow.
|
|
62
|
-
# @param [optional] block Logic to execute within the context of the
|
|
63
|
-
# workflow.
|
|
64
|
-
# @return [Object] the definition being used at that point of the
|
|
65
|
-
# workflow.
|
|
66
|
-
def continue_workflow(definition, elements = {:using => :default}, &block)
|
|
67
|
-
path = workflow_path_for(elements)
|
|
68
|
-
from_element = find_element_for(path, @active.class) + 1
|
|
69
|
-
to_element = find_element_for(path, definition) - 1
|
|
70
|
-
go_through_definitions(path[from_element..to_element])
|
|
71
|
-
on(definition, &block)
|
|
25
|
+
on(definition, true, &block)
|
|
72
26
|
end
|
|
73
|
-
|
|
74
|
-
def
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
27
|
+
|
|
28
|
+
def if_on(definition, &block)
|
|
29
|
+
definition = get_object_for(definition) if definition.is_a? String
|
|
30
|
+
return @active unless @active.class == definition
|
|
31
|
+
on(definition, false, &block)
|
|
78
32
|
end
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
33
|
+
|
|
34
|
+
alias_method :during, :on
|
|
35
|
+
alias_method :start_activity, :on_view
|
|
36
|
+
alias_method :start_on, :on_view
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
def get_object_for(definition)
|
|
41
|
+
definition.split('::').inject(Object) do |obj, name|
|
|
42
|
+
obj.const_get(name)
|
|
89
43
|
end
|
|
90
44
|
end
|
|
91
|
-
|
|
92
|
-
class << self
|
|
93
|
-
attr_accessor :symbiont_workflow
|
|
94
|
-
|
|
95
|
-
def workflow=(path)
|
|
96
|
-
raise("A default workflow path for a Factory workflow must exist.") unless path[:default]
|
|
97
|
-
@symbiont_workflow = path
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
|
|
101
45
|
end # module: Factory
|
|
102
46
|
end # module: Symbiont
|