crabfarm 0.4.2 → 0.5.1

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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/assets/live-tools/instructions.html +17 -0
  3. data/assets/live-tools/tools.css +16 -0
  4. data/assets/live-tools/tools.js +41 -47
  5. data/assets/live-tools/welcome.html +18 -0
  6. data/lib/crabfarm/adapters/browser/abstract_webdriver.rb +19 -16
  7. data/lib/crabfarm/adapters/browser/phantom_js.rb +11 -11
  8. data/lib/crabfarm/assertion/fields.rb +8 -0
  9. data/lib/crabfarm/base_navigator.rb +4 -11
  10. data/lib/crabfarm/base_reducer.rb +5 -1
  11. data/lib/crabfarm/cli.rb +13 -13
  12. data/lib/crabfarm/context.rb +15 -3
  13. data/lib/crabfarm/factories/context.rb +24 -0
  14. data/lib/crabfarm/factories/decorable.rb +71 -0
  15. data/lib/crabfarm/factories/navigator.rb +14 -0
  16. data/lib/crabfarm/factories/reducer.rb +14 -0
  17. data/lib/crabfarm/factories/snapshot_reducer.rb +14 -0
  18. data/lib/crabfarm/http_client.rb +2 -5
  19. data/lib/crabfarm/live/context.rb +21 -0
  20. data/lib/crabfarm/live/controller.rb +20 -72
  21. data/lib/crabfarm/live/interactable.rb +6 -2
  22. data/lib/crabfarm/live/manager.rb +90 -18
  23. data/lib/crabfarm/live/navigator_runner.rb +43 -13
  24. data/lib/crabfarm/live/navigator_runner_direct.rb +39 -0
  25. data/lib/crabfarm/live/navigator_runner_rspec.rb +111 -0
  26. data/lib/crabfarm/live/reducer_runner.rb +61 -10
  27. data/lib/crabfarm/live/reducer_runner_direct.rb +41 -0
  28. data/lib/crabfarm/live/reducer_runner_rspec.rb +23 -0
  29. data/lib/crabfarm/live/watcher.rb +21 -7
  30. data/lib/crabfarm/modes/console.rb +1 -1
  31. data/lib/crabfarm/modes/live.rb +7 -4
  32. data/lib/crabfarm/modes/recorder/memento.rb +1 -5
  33. data/lib/crabfarm/modes/recorder/snapshot.rb +2 -2
  34. data/lib/crabfarm/modes/shared/interactive_decorator.rb +0 -1
  35. data/lib/crabfarm/modes/shared/snapshot_decorator.rb +17 -22
  36. data/lib/crabfarm/rspec/navigator_spec_helpers.rb +56 -0
  37. data/lib/crabfarm/rspec/reducer_spec_helpers.rb +29 -0
  38. data/lib/crabfarm/rspec/reducer_spy.rb +36 -0
  39. data/lib/crabfarm/rspec/reducer_spy_manager.rb +38 -0
  40. data/lib/crabfarm/rspec.rb +22 -66
  41. data/lib/crabfarm/support/phantom_runner.rb +77 -0
  42. data/lib/crabfarm/templates/Gemfile.erb +1 -0
  43. data/lib/crabfarm/transition_service.rb +3 -48
  44. data/lib/crabfarm/utils/console.rb +77 -0
  45. data/lib/crabfarm/utils/naming.rb +4 -3
  46. data/lib/crabfarm/utils/resolve.rb +39 -0
  47. data/lib/crabfarm/utils/rspec_runner.rb +54 -0
  48. data/lib/crabfarm/{live/helpers.rb → utils/webdriver.rb} +3 -3
  49. data/lib/crabfarm/version.rb +1 -1
  50. data/lib/crabfarm.rb +24 -3
  51. metadata +23 -6
  52. data/lib/crabfarm/context_factory.rb +0 -32
  53. data/lib/crabfarm/global_state.rb +0 -22
  54. data/lib/crabfarm/phantom_runner.rb +0 -75
@@ -0,0 +1,21 @@
1
+ require 'crabfarm/utils/webdriver'
2
+
3
+ module Crabfarm
4
+ module Live
5
+ class Context < Crabfarm::Context
6
+
7
+ def initialize(_manager)
8
+ @manager = _manager
9
+ end
10
+
11
+ def proxy
12
+ "127.0.0.1:#{@manager.proxy_port}"
13
+ end
14
+
15
+ def viewer
16
+ @manager
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -1,35 +1,25 @@
1
- require 'benchmark'
2
- require 'rainbow'
3
- require 'rainbow/ext/string'
4
- require 'crabfarm/modes/console'
5
-
6
- require 'crabfarm/support/webdriver_factory'
7
- require 'crabfarm/crabtrap_runner'
8
-
9
- require 'crabfarm/live/helpers.rb'
10
- require 'crabfarm/live/navigator_runner.rb'
11
- require 'crabfarm/live/reducer_runner.rb'
1
+ require 'crabfarm/utils/console'
2
+ require 'crabfarm/live/navigator_runner'
3
+ require 'crabfarm/live/reducer_runner'
12
4
 
13
5
  module Crabfarm
14
6
  module Live
15
7
  class Controller
16
8
 
17
- Colors = Crabfarm::Modes::Console::Colors
18
-
19
- class LiveWarning < StandardError; end
20
-
21
9
  def initialize(_manager)
22
10
  @manager = _manager
23
11
  end
24
12
 
13
+ def display_external_error(_exc)
14
+ @manager.reset_driver_status
15
+ display_error_feedback _exc
16
+ end
17
+
25
18
  def execute_live(_class)
26
19
  begin
27
20
  runner = build_runner_for _class
28
21
  prepare_session_for runner
29
- elapsed = Benchmark.measure { runner.execute }
30
- display_feedback runner, elapsed
31
- rescue LiveWarning => exc
32
- display_warning_feedback exc
22
+ runner.execute
33
23
  rescue Exception => exc
34
24
  display_error_feedback exc
35
25
  ensure
@@ -40,9 +30,9 @@ module Crabfarm
40
30
  private
41
31
 
42
32
  def build_runner_for(_class)
43
- raise LiveWarning.new "'#{_class.to_s} is not Interactable" unless _class < Interactable
33
+ raise ArgumentError.new "'#{_class.to_s} is not Interactable" unless _class < Interactable
44
34
 
45
- puts "Launching #{_class.to_s}".color Colors::NOTICE
35
+ Utils::Console.operation "Launching #{_class.to_s}"
46
36
 
47
37
  runner = if _class.live_delegate
48
38
  build_runner_for _class.live_delegate
@@ -52,8 +42,8 @@ module Crabfarm
52
42
  elsif _class < BaseReducer
53
43
  ReducerRunner
54
44
  else
55
- raise LiveWarning.new "Don't know how to run #{_class.to_s}, you should provide a navigator or reducer as delegate."
56
- end.new _class
45
+ raise ConfigurationError.new "Don't know how to run #{_class.to_s}, you should provide a navigator or reducer as delegate."
46
+ end.new @manager, _class
57
47
  end
58
48
 
59
49
  runner.dsl.instance_eval(&_class.live_setup) if _class.live_setup
@@ -61,65 +51,23 @@ module Crabfarm
61
51
  end
62
52
 
63
53
  def prepare_session_for(_runner)
64
- @manager.stop_crabtrap
65
- if _runner.memento
66
- @manager.start_crabtrap :replay, memento_path(_runner.memento)
67
- else
68
- @manager.start_crabtrap :pass
69
- end
54
+ @manager.reset_driver_status
70
55
  end
71
56
 
72
57
  def clean_up_session
73
58
  # leave crabtrap running for debugging purposes.
74
59
  end
75
60
 
76
- def display_feedback(_runner, _elapsed)
77
- load_web_ui
78
-
79
- @manager.primary_driver.execute_script(
80
- "window.crabfarm.showResults(arguments[0], arguments[1]);",
81
- _runner.output,
82
- _elapsed.real
83
- );
84
-
85
- puts _runner.output.to_s.color Colors::RESULT
86
- puts "Completed in #{_elapsed.real} s".color Colors::NOTICE
87
- end
88
-
89
61
  def display_error_feedback(_exc)
90
- load_web_ui
91
-
92
- @manager.primary_driver.execute_script(
93
- "window.crabfarm.showError(arguments[0], arguments[1]);",
62
+ @manager.inject_web_tools
63
+ @manager.show_dialog(
64
+ :error,
65
+ 'Crawler error!',
94
66
  "#{_exc.class.to_s}: #{_exc.to_s}",
95
67
  _exc.backtrace.join("\n")
96
- );
97
-
98
- puts "#{_exc.class.to_s}: #{_exc.to_s}".color Colors::ERROR
99
- puts _exc.backtrace
100
- end
101
-
102
- def display_warning_feedback(_exc)
103
- load_web_ui
104
- puts "Warning: #{_exc.to_s}".color Colors::WARNING
105
- end
106
-
107
- def load_web_ui
108
- Helpers.inject_style @manager.primary_driver, 'https://www.crabtrap.io/selectorgadget_combined.css'
109
- Helpers.inject_style @manager.primary_driver, 'https://www.crabtrap.io/tools.css'
110
- Helpers.inject_script @manager.primary_driver, 'https://www.crabtrap.io/selectorgadget_combined.js'
111
- Helpers.inject_script @manager.primary_driver, 'https://www.crabtrap.io/tools.js'
112
- wait_for_injection
113
- end
114
-
115
- def wait_for_injection
116
- while @manager.primary_driver.execute_script "return (typeof window.crabfarm === 'undefined');"
117
- sleep 1.0
118
- end
119
- end
68
+ )
120
69
 
121
- def memento_path(_name)
122
- File.join(GlobalState.mementos_path, _name + '.json.gz')
70
+ Utils::Console.exception _exc
123
71
  end
124
72
 
125
73
  end
@@ -1,4 +1,4 @@
1
- require 'crabfarm/live/helpers'
1
+ require 'crabfarm/utils/webdriver'
2
2
 
3
3
  module Crabfarm
4
4
  module Live
@@ -15,6 +15,10 @@ module Crabfarm
15
15
  @setup = _setup
16
16
  end
17
17
 
18
+ def live_rspec?
19
+ @setup.nil?
20
+ end
21
+
18
22
  def live_delegate
19
23
  @delegate
20
24
  end
@@ -37,7 +41,7 @@ module Crabfarm
37
41
  _elements = Crabfarm.live.primary_driver.find_elements(css: _elements)
38
42
  end
39
43
 
40
- Helpers.set_style _elements, "border: 3px solid yellow;"
44
+ Utils::Webdriver.set_style _elements, "border: 3px solid yellow;"
41
45
  end
42
46
  end
43
47
 
@@ -1,3 +1,6 @@
1
+ require 'timeout'
2
+ require 'crabfarm/utils/console'
3
+ require 'crabfarm/utils/webdriver'
1
4
  require 'crabfarm/support/webdriver_factory'
2
5
  require 'crabfarm/crabtrap_runner'
3
6
 
@@ -5,9 +8,11 @@ module Crabfarm
5
8
  module Live
6
9
  class Manager
7
10
 
11
+ INJECTION_TM = 5 # seconds
12
+
8
13
  def initialize
9
14
  @port = Utils::PortDiscovery.find_available_port
10
- @driver = Crabfarm.config.recorder_driver
15
+ @driver_name = Crabfarm.config.recorder_driver
11
16
  end
12
17
 
13
18
  def proxy_port
@@ -15,6 +20,7 @@ module Crabfarm
15
20
  end
16
21
 
17
22
  def start
23
+ set_memento
18
24
  load_primary_driver
19
25
  end
20
26
 
@@ -27,26 +33,39 @@ module Crabfarm
27
33
  @driver
28
34
  end
29
35
 
30
- def generate_support_driver
31
- # TODO: improve on this mechanics, maybe use a frame in the same driver for this
32
- build_driver
36
+ def reset_driver_status
37
+ # TODO: manage driver handles and recreate driver if needed
38
+ primary_driver.get('https://www.crabtrap.io/instructions.html')
33
39
  end
34
40
 
35
- def start_crabtrap(_mode, _memento_path=nil)
36
-
37
- raise ConfigurationError.new "No memento found at #{_memento_path}" unless File.exists? _memento_path
41
+ def block_requests
42
+ begin
43
+ stop_crabtrap
44
+ return yield
45
+ ensure
46
+ set_memento nil
47
+ end
48
+ end
38
49
 
39
- if @crabtrap.nil?
40
- options = {
41
- mode: _mode,
42
- bucket_path: _memento_path,
43
- port: @port,
44
- virtual: File.expand_path('./assets/live-tools', Crabfarm.root)
45
- }
50
+ def set_memento(_memento=nil)
46
51
 
47
- @crabtrap = CrabtrapRunner.new config.crabtrap_config.merge(options)
48
- @crabtrap.start
52
+ options = if _memento
53
+ path = Utils::Resolve.memento_path _memento
54
+ raise ConfigurationError.new "No memento found at #{path}" unless File.exists? path
55
+ { mode: :replay, bucket_path: path }
56
+ else
57
+ { mode: :pass }
49
58
  end
59
+
60
+ options.merge!({
61
+ port: @port,
62
+ virtual: File.expand_path('./assets/live-tools', Crabfarm.root)
63
+ })
64
+
65
+ stop_crabtrap
66
+ @crabtrap = CrabtrapRunner.new config.crabtrap_config.merge(options)
67
+ @crabtrap.start
68
+
50
69
  end
51
70
 
52
71
  def stop_crabtrap
@@ -56,18 +75,65 @@ module Crabfarm
56
75
  else nil end
57
76
  end
58
77
 
78
+ def inject_web_tools
79
+ Utils::Console.trap_errors 'injecting web tools' do
80
+ Utils::Webdriver.inject_style primary_driver, 'https://www.crabtrap.io/selectorgadget_combined.css'
81
+ Utils::Webdriver.inject_style primary_driver, 'https://www.crabtrap.io/tools.css'
82
+ Utils::Webdriver.inject_script primary_driver, 'https://www.crabtrap.io/selectorgadget_combined.js'
83
+ Utils::Webdriver.inject_script primary_driver, 'https://www.crabtrap.io/tools.js'
84
+ Timeout::timeout(INJECTION_TM) { wait_for_injection }
85
+ end
86
+ end
87
+
88
+ def show_dialog(_status, _title, _subtitle, _content=nil, _content_type=:text)
89
+ Utils::Console.trap_errors 'loading web dialog' do
90
+ primary_driver.execute_script(
91
+ "window.crabfarm.showDialog.apply(null, arguments);",
92
+ _status.to_s,
93
+ _title,
94
+ _subtitle,
95
+ _content,
96
+ _content_type.to_s
97
+ );
98
+ end
99
+ end
100
+
101
+ def show_selector_gadget()
102
+ Utils::Console.trap_errors 'loading selector gadget' do
103
+ primary_driver.execute_script(
104
+ 'window.crabfarm.showSelectorGadget();'
105
+ )
106
+ end
107
+ end
108
+
109
+ # Viewer implementation
110
+
111
+ def attach(_primary=true)
112
+ if _primary then primary_driver else build_driver end
113
+ end
114
+
115
+ def detach(_driver)
116
+ if _driver != primary_driver
117
+ _driver.quit rescue nil
118
+ end
119
+ end
120
+
59
121
  private
60
122
 
61
123
  def load_primary_driver
62
124
  @driver = build_driver
125
+ @driver.get('https://www.crabtrap.io/welcome.html')
63
126
  end
64
127
 
65
128
  def release_primary_driver
66
- @driver.quit rescue nil unless @driver.nil?
129
+ unless @driver.nil?
130
+ @driver.quit rescue nil
131
+ @driver = nil
132
+ end
67
133
  end
68
134
 
69
135
  def build_driver
70
- case @driver
136
+ case @driver_name
71
137
  when :firefox
72
138
  Crabfarm::Support::WebdriverFactory.build_firefox_driver driver_config
73
139
  when :chrome
@@ -85,6 +151,12 @@ module Crabfarm
85
151
  Crabfarm.config
86
152
  end
87
153
 
154
+ def wait_for_injection
155
+ while primary_driver.execute_script "return (typeof window.crabfarm === 'undefined');"
156
+ sleep 1.0
157
+ end
158
+ end
159
+
88
160
  end
89
161
  end
90
162
  end
@@ -1,4 +1,6 @@
1
- require 'json'
1
+ require 'crabfarm/live/context'
2
+ require 'crabfarm/live/navigator_runner_direct'
3
+ require 'crabfarm/live/navigator_runner_rspec'
2
4
 
3
5
  module Crabfarm
4
6
  module Live
@@ -11,11 +13,13 @@ module Crabfarm
11
13
  @runner = _runner
12
14
  end
13
15
 
14
- def_delegators :@runner, :use_memento, :use_params, :clear_params, :navigate_to
16
+ def_delegators :@runner, :use_memento, :use_params, :clear_params, :use_rspec, :navigate_to
15
17
  end
16
18
 
17
- def initialize(_target)
19
+ def initialize(_manager, _target)
20
+ @manager = _manager
18
21
  @target = _target
22
+ @rspec = true
19
23
  @params = {}
20
24
  end
21
25
 
@@ -29,32 +33,44 @@ module Crabfarm
29
33
 
30
34
  def use_memento(_memento)
31
35
  @memento = _memento
36
+ @rspec = false
32
37
  end
33
38
 
34
39
  def use_params(_params={})
35
40
  @params = @params.merge _params
41
+ @rspec = false
36
42
  end
37
43
 
38
44
  def clear_params
39
45
  @params = {}
46
+ @rspec = false
47
+ end
48
+
49
+ def use_rspec
50
+ @rspec = true
40
51
  end
41
52
 
42
53
  def navigate_to(_navigator, _params={})
54
+ # TODO.
55
+ end
56
+
57
+ def prepare(_memento) # decorator
58
+ @manager.set_memento _memento
59
+ Context.new @manager
43
60
  end
44
61
 
45
62
  def execute
46
- context = Crabfarm::Context.new
47
- begin
48
- # TODO: execute prerequisites
49
- @transition = TransitionService.transition context, @target, @params
50
- ensure
51
- context.release
63
+ strategy = if @rspec
64
+ NavigatorRunnerRSpec.new @manager, @target
65
+ else
66
+ NavigatorRunnerDirect.new @manager, memento, @target, @params
52
67
  end
53
- end
54
68
 
55
- def output
56
- return nil if @transition.document.nil?
57
- JSON.pretty_generate(@transition.document).gsub(/(^|\\n)/, ' ')
69
+ Factories::Context.with_decorator self do
70
+ strategy.execute
71
+ end
72
+
73
+ strategy.show_results
58
74
  end
59
75
 
60
76
  private
@@ -63,6 +79,20 @@ module Crabfarm
63
79
  Utils::Naming.route_from_constant(_class.to_s).join(File::SEPARATOR)
64
80
  end
65
81
 
82
+ def show_result
83
+ @manager.inject_web_tools
84
+ @manager.show_dialog(
85
+ :neutral,
86
+ 'Navigation completed!',
87
+ "The page was scrapped in #{@elapsed.real} seconds",
88
+ @transition.document.to_json,
89
+ :json
90
+ )
91
+
92
+ Utils::Console.json_result @transition.document
93
+ Utils::Console.info "Completed in #{@elapsed.real} s"
94
+ end
95
+
66
96
  end
67
97
  end
68
98
  end
@@ -0,0 +1,39 @@
1
+ require 'benchmark'
2
+ require 'crabfarm/utils/console'
3
+
4
+ module Crabfarm
5
+ module Live
6
+ class NavigatorRunnerDirect
7
+
8
+ def initialize(_manager, _memento, _target, _params)
9
+ @manager = _manager
10
+ @memento = _memento
11
+ @target = _target
12
+ @params = _params
13
+ end
14
+
15
+ def execute
16
+ Crabfarm.with_context @memento do |ctx|
17
+ @elapsed = Benchmark.measure do
18
+ @transition = TransitionService.transition ctx, @target, (@params || {})
19
+ end
20
+ end
21
+ end
22
+
23
+ def show_results
24
+ @manager.inject_web_tools
25
+ @manager.show_dialog(
26
+ :neutral,
27
+ 'Navigation completed!',
28
+ "The page was scrapped in #{@elapsed.real} seconds",
29
+ @transition.document.to_json,
30
+ :json
31
+ )
32
+
33
+ Utils::Console.json_result @transition.document
34
+ Utils::Console.info "Completed in #{@elapsed.real} s"
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,111 @@
1
+ require 'crabfarm/utils/console'
2
+ require 'crabfarm/utils/rspec_runner'
3
+
4
+ module Crabfarm
5
+ module Live
6
+ class NavigatorRunnerRSpec
7
+
8
+ def initialize(_manager, _target)
9
+ @manager = _manager
10
+ @target = _target
11
+ end
12
+
13
+ def execute
14
+ @examples = Factories::Context.with_decorator self do
15
+ Utils::RSpecRunner.run_spec_for spec_for(@target), live: true
16
+ end
17
+ end
18
+
19
+ def show_results
20
+ @manager.inject_web_tools
21
+ if @examples.count == 0
22
+ show_empty_warning
23
+ elsif @examples.count == 1
24
+ show_example_output @examples.first
25
+ else
26
+ show_example_summary @examples
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def spec_for(_class)
33
+ route = Utils::Naming.route_from_constant(_class.to_s)
34
+ route = route.join(File::SEPARATOR)
35
+ route = route + '_spec.rb'
36
+ File.join('spec','navigators', route)
37
+ end
38
+
39
+ def show_empty_warning
40
+ @manager.show_dialog(
41
+ :warning,
42
+ 'No examples were found!',
43
+ 'Make sure you have tagged some specs with live: true'
44
+ )
45
+
46
+ Utils::Console.warning 'No examples were found!'
47
+ end
48
+
49
+ def show_example_summary(_examples)
50
+ total = _examples.count
51
+ error = _examples.select { |e| !e.exception.nil? }.count
52
+ errored = (error > 0)
53
+
54
+ if error > 0
55
+ @manager.show_dialog(
56
+ :error,
57
+ 'FAILED',
58
+ "#{error} of #{total} tests failed"
59
+ )
60
+
61
+ Utils::Console.error "#{total} examples, #{error} failures"
62
+ else
63
+ @manager.show_dialog(
64
+ :success,
65
+ 'SUCCESS',
66
+ "All #{total} tests passed!"
67
+ )
68
+
69
+ Utils::Console.result "#{total} examples, 0 failures"
70
+ end
71
+ end
72
+
73
+ def show_example_output(_example)
74
+
75
+ handle_standard_errors _example
76
+
77
+ if _example.exception
78
+ @manager.show_dialog(
79
+ :error,
80
+ 'FAILED',
81
+ _example.exception.to_s,
82
+ _example.metadata[:result].to_json,
83
+ :json
84
+ )
85
+
86
+ Utils::Console.error "1 example, 1 failure"
87
+ Utils::Console.error _example.exception.to_s
88
+ Utils::Console.json_result _example.metadata[:result]
89
+ else
90
+ @manager.show_dialog(
91
+ :success,
92
+ 'SUCCESS',
93
+ "\"#{_example.full_description}\"",
94
+ _example.metadata[:result].to_json,
95
+ :json
96
+ )
97
+
98
+ Utils::Console.result "1 example, 0 failures"
99
+ Utils::Console.json_result _example.metadata[:result]
100
+ end
101
+ end
102
+
103
+ def handle_standard_errors(_example)
104
+ if _example.exception and not _example.exception.is_a? ::RSpec::Expectations::ExpectationNotMetError
105
+ raise _example.exception
106
+ end
107
+ end
108
+
109
+ end
110
+ end
111
+ end
@@ -1,20 +1,71 @@
1
+ require 'crabfarm/live/reducer_runner_direct'
2
+ require 'crabfarm/live/reducer_runner_rspec'
3
+
1
4
  module Crabfarm
2
5
  module Live
3
- class ReducerRunner < NavigatorRunner
6
+ class ReducerRunner
7
+
8
+ class Dsl
9
+ extend Forwardable
10
+
11
+ def initialize(_runner)
12
+ @runner = _runner
13
+ end
14
+
15
+ def_delegators :@runner, :use_snapshot, :use_params, :clear_params, :use_rspec
16
+ end
17
+
18
+ def initialize(_manager, _target)
19
+ @manager = _manager
20
+ @target = _target
21
+ @rspec = true
22
+ @params = {}
23
+ end
24
+
25
+ def dsl
26
+ @dsl ||= Dsl.new self
27
+ end
28
+
29
+ def snapshot
30
+ if @snapshot.nil? then snapshot_for(@target) else @snapshot end
31
+ end
32
+
33
+ def use_snapshot(_snapshot)
34
+ @snapshot = _snapshot
35
+ @rspec = false
36
+ end
4
37
 
5
- def initialize(_target)
6
- # use navigator runner for now.
7
- super navigator_from_reducer _target
38
+ def use_params(_params={})
39
+ @params = @params.merge _params
40
+ @rspec = false
8
41
  end
9
42
 
10
- def navigator_from_reducer _reducer
11
- m = _reducer.to_s.match(/^(.*?)Reducer$/)
12
- if m
13
- navigator = m[1].constantize rescue nil
14
- return navigator if navigator and navigator < BaseNavigator
43
+ def clear_params
44
+ @params = {}
45
+ @rspec = false
46
+ end
47
+
48
+ def use_rspec
49
+ @rspec = true
50
+ end
51
+
52
+ def prepare(_class, _path, _params) # decorator
53
+ @manager.primary_driver.get("file://#{_path}")
54
+ nil
55
+ end
56
+
57
+ def execute
58
+ strategy = if @rspec
59
+ ReducerRunnerRSpec.new @manager, @target
60
+ else
61
+ ReducerRunnerDirect.new @manager, snapshot, @target, @params
62
+ end
63
+
64
+ Factories::SnapshotReducer.with_decorator self do
65
+ @manager.block_requests { strategy.execute }
15
66
  end
16
67
 
17
- raise Controller::LiveWarning.new "Could not find a matching navigator for reducer #{_reducer.to_s}"
68
+ strategy.show_results
18
69
  end
19
70
 
20
71
  end