crabfarm 0.6.1 → 0.6.2
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.
- checksums.yaml +4 -4
- data/assets/live-tools/tools.js +0 -1
- data/lib/crabfarm/adapters/browser/abstract_webdriver.rb +13 -28
- data/lib/crabfarm/adapters/browser/base.rb +43 -0
- data/lib/crabfarm/adapters/browser/chrome.rb +5 -1
- data/lib/crabfarm/adapters/browser/firefox.rb +4 -0
- data/lib/crabfarm/adapters/browser/noop.rb +3 -10
- data/lib/crabfarm/adapters/browser/phantom_js.rb +8 -8
- data/lib/crabfarm/adapters/driver_wrapper/pincers.rb +6 -0
- data/lib/crabfarm/cli.rb +1 -7
- data/lib/crabfarm/context.rb +17 -21
- data/lib/crabfarm/driver_pool.rb +3 -2
- data/lib/crabfarm/errors.rb +2 -0
- data/lib/crabfarm/http_client.rb +1 -1
- data/lib/crabfarm/live/context.rb +32 -2
- data/lib/crabfarm/live/controller.rb +19 -16
- data/lib/crabfarm/live/interactable.rb +5 -14
- data/lib/crabfarm/live/manager.rb +85 -95
- data/lib/crabfarm/live/navigator_runner.rb +43 -40
- data/lib/crabfarm/live/navigator_runner_direct.rb +1 -2
- data/lib/crabfarm/live/navigator_runner_rspec.rb +34 -55
- data/lib/crabfarm/live/reducer_runner.rb +43 -22
- data/lib/crabfarm/live/reducer_runner_direct.rb +1 -2
- data/lib/crabfarm/live/reducer_runner_rspec.rb +0 -5
- data/lib/crabfarm/live/viewer.rb +92 -0
- data/lib/crabfarm/live/watcher.rb +6 -1
- data/lib/crabfarm/modes/live.rb +1 -1
- data/lib/crabfarm/modes/recorder/snapshot.rb +9 -25
- data/lib/crabfarm/support/webdriver_factory.rb +1 -1
- data/lib/crabfarm/templates/Gemfile.erb +1 -1
- data/lib/crabfarm/utils/rspec_runner.rb +54 -22
- data/lib/crabfarm/version.rb +1 -1
- metadata +4 -2
@@ -5,16 +5,6 @@ module Crabfarm
|
|
5
5
|
module Live
|
6
6
|
class ReducerRunner
|
7
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
8
|
def initialize(_manager, _target)
|
19
9
|
@manager = _manager
|
20
10
|
@target = _target
|
@@ -26,10 +16,6 @@ module Crabfarm
|
|
26
16
|
@dsl ||= Dsl.new self
|
27
17
|
end
|
28
18
|
|
29
|
-
def snapshot
|
30
|
-
if @snapshot.nil? then snapshot_for(@target) else @snapshot end
|
31
|
-
end
|
32
|
-
|
33
19
|
def use_snapshot(_snapshot)
|
34
20
|
@snapshot = _snapshot
|
35
21
|
@rspec = false
|
@@ -49,11 +35,6 @@ module Crabfarm
|
|
49
35
|
@rspec = true
|
50
36
|
end
|
51
37
|
|
52
|
-
def prepare(_class, _path, _params) # decorator
|
53
|
-
@manager.primary_driver.get("file://#{_path}")
|
54
|
-
nil
|
55
|
-
end
|
56
|
-
|
57
38
|
def execute
|
58
39
|
strategy = if @rspec
|
59
40
|
ReducerRunnerRSpec.new @manager, @target
|
@@ -61,11 +42,51 @@ module Crabfarm
|
|
61
42
|
ReducerRunnerDirect.new @manager, snapshot, @target, @params
|
62
43
|
end
|
63
44
|
|
64
|
-
|
65
|
-
|
45
|
+
begin
|
46
|
+
Factories::SnapshotReducer.with_decorator decorator do
|
47
|
+
strategy.execute
|
48
|
+
end
|
49
|
+
|
50
|
+
@manager.show_file decorator.last_path unless decorator.last_path.nil?
|
51
|
+
strategy.show_results
|
52
|
+
rescue Crabfarm::LiveInterrupted
|
53
|
+
Utils::Console.info "Execution interrupted"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def decorator
|
60
|
+
@decorator ||= DisplayFileDecorator.new @manager
|
61
|
+
end
|
62
|
+
|
63
|
+
def snapshot
|
64
|
+
if @snapshot.nil? then snapshot_for(@target) else @snapshot end
|
65
|
+
end
|
66
|
+
|
67
|
+
class Dsl
|
68
|
+
extend Forwardable
|
69
|
+
|
70
|
+
def initialize(_runner)
|
71
|
+
@runner = _runner
|
72
|
+
end
|
73
|
+
|
74
|
+
def_delegators :@runner, :use_snapshot, :use_params, :clear_params, :use_rspec
|
75
|
+
end
|
76
|
+
|
77
|
+
class DisplayFileDecorator
|
78
|
+
|
79
|
+
attr_reader :last_path
|
80
|
+
|
81
|
+
def initialize(_manager)
|
82
|
+
@manager = _manager
|
83
|
+
end
|
84
|
+
|
85
|
+
def prepare(_class, _path, _params)
|
86
|
+
@last_path = _path
|
87
|
+
nil
|
66
88
|
end
|
67
89
|
|
68
|
-
strategy.show_results
|
69
90
|
end
|
70
91
|
|
71
92
|
end
|
@@ -1,14 +1,9 @@
|
|
1
|
-
require 'crabfarm/utils/rspec_runner'
|
2
1
|
require 'crabfarm/live/navigator_runner_rspec'
|
3
2
|
|
4
3
|
module Crabfarm
|
5
4
|
module Live
|
6
5
|
class ReducerRunnerRSpec < NavigatorRunnerRSpec
|
7
6
|
|
8
|
-
def execute
|
9
|
-
@examples = Utils::RSpecRunner.run_spec_for spec_for(@target), live: true
|
10
|
-
end
|
11
|
-
|
12
7
|
private
|
13
8
|
|
14
9
|
def spec_for(_class)
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require 'crabfarm/utils/console'
|
3
|
+
require 'crabfarm/utils/webdriver'
|
4
|
+
|
5
|
+
module Crabfarm
|
6
|
+
module Live
|
7
|
+
class Viewer
|
8
|
+
|
9
|
+
INJECTION_TM = 5 # seconds
|
10
|
+
|
11
|
+
attr_reader :driver
|
12
|
+
|
13
|
+
def initialize(_driver)
|
14
|
+
@driver = _driver
|
15
|
+
@injected = false
|
16
|
+
end
|
17
|
+
|
18
|
+
def welcome
|
19
|
+
driver.get 'https://www.crabtrap.io/welcome.html'
|
20
|
+
@injected = false
|
21
|
+
end
|
22
|
+
|
23
|
+
def reset
|
24
|
+
driver.get 'https://www.crabtrap.io/instructions.html'
|
25
|
+
@injected = false
|
26
|
+
end
|
27
|
+
|
28
|
+
def show_file(_path)
|
29
|
+
driver.get "file://#{_path}"
|
30
|
+
@injected = false
|
31
|
+
end
|
32
|
+
|
33
|
+
def show_content(_content)
|
34
|
+
temp_file = Tempfile.new 'cb_live'
|
35
|
+
temp_file.write _content
|
36
|
+
temp_file.close
|
37
|
+
|
38
|
+
begin
|
39
|
+
show_file temp_file.path # block requests? not sure
|
40
|
+
ensure
|
41
|
+
temp_file.unlink
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def show_message(_status, _title, _subtitle, _content=nil, _content_type=:text)
|
46
|
+
inject_web_tools
|
47
|
+
Utils::Console.trap_errors 'loading web dialog' do
|
48
|
+
driver.execute_script(
|
49
|
+
"window.crabfarm.showDialog.apply(null, arguments);",
|
50
|
+
_status.to_s,
|
51
|
+
_title,
|
52
|
+
_subtitle,
|
53
|
+
_content,
|
54
|
+
_content_type.to_s
|
55
|
+
);
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def show_selector_gadget
|
60
|
+
inject_web_tools
|
61
|
+
Utils::Console.trap_errors 'loading selector gadget' do
|
62
|
+
driver.execute_script(
|
63
|
+
'window.crabfarm.showSelectorGadget();'
|
64
|
+
)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def inject_web_tools
|
71
|
+
return if @injected
|
72
|
+
|
73
|
+
Utils::Console.trap_errors 'injecting web tools' do
|
74
|
+
Utils::Webdriver.inject_style driver, 'https://www.crabtrap.io/selectorgadget_combined.css'
|
75
|
+
Utils::Webdriver.inject_style driver, 'https://www.crabtrap.io/tools.css'
|
76
|
+
Utils::Webdriver.inject_script driver, 'https://www.crabtrap.io/selectorgadget_combined.js'
|
77
|
+
Utils::Webdriver.inject_script driver, 'https://www.crabtrap.io/tools.js'
|
78
|
+
Timeout::timeout(INJECTION_TM) { wait_for_injection }
|
79
|
+
end
|
80
|
+
|
81
|
+
@injected = true
|
82
|
+
end
|
83
|
+
|
84
|
+
def wait_for_injection
|
85
|
+
while driver.execute_script "return (typeof window.crabfarm === 'undefined');"
|
86
|
+
sleep 1.0
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -59,7 +59,12 @@ module Crabfarm
|
|
59
59
|
end
|
60
60
|
|
61
61
|
if target and target < Crabfarm::Live::Interactable
|
62
|
-
@
|
62
|
+
if @thread and @thread.alive?
|
63
|
+
@thread.terminate
|
64
|
+
@thread.join
|
65
|
+
end
|
66
|
+
|
67
|
+
@thread = Thread.new { @controller.execute_live target }
|
63
68
|
break
|
64
69
|
end
|
65
70
|
end
|
data/lib/crabfarm/modes/live.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'rainbow'
|
2
2
|
require 'rainbow/ext/string'
|
3
3
|
require 'crabfarm/modes/console'
|
4
|
+
require 'crabfarm/utils/rspec_runner'
|
4
5
|
require 'crabfarm/modes/shared/snapshot_decorator'
|
5
|
-
require 'crabfarm/modes/shared/interactive_decorator'
|
6
6
|
|
7
7
|
module Crabfarm
|
8
8
|
module Modes
|
@@ -10,20 +10,13 @@ module Crabfarm
|
|
10
10
|
module Snapshot
|
11
11
|
extend self
|
12
12
|
|
13
|
-
def start(_context, _navigator
|
13
|
+
def start(_context, _navigator)
|
14
14
|
return puts "Must provide a navigator name" unless _navigator.is_a? String
|
15
15
|
|
16
16
|
begin
|
17
|
-
puts "Navigating, waiting to hit a reducer...".color(Console::Colors::NOTICE)
|
17
|
+
puts "Navigating using last #{_navigator} spec, waiting to hit a reducer...".color(Console::Colors::NOTICE)
|
18
18
|
Factories::Reducer.with_decorator Shared::SnapshotDecorator do
|
19
|
-
|
20
|
-
Factories::Navigator.with_decorator Shared::InteractiveDecorator do
|
21
|
-
service.transition _context, _navigator
|
22
|
-
end
|
23
|
-
else
|
24
|
-
_query = parse_query_string _query
|
25
|
-
service.transition _context, _navigator, _query
|
26
|
-
end
|
19
|
+
@example = Utils::RSpecRunner.run_single_spec_for spec_for(_navigator)
|
27
20
|
end
|
28
21
|
puts "Navigation completed".color(Console::Colors::NOTICE)
|
29
22
|
rescue Exception => e
|
@@ -34,20 +27,11 @@ module Crabfarm
|
|
34
27
|
|
35
28
|
private
|
36
29
|
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
result = {}
|
43
|
-
|
44
|
-
parts = _string.split '&'
|
45
|
-
parts.each do |part|
|
46
|
-
key, val = part.split '='
|
47
|
-
result[key.to_sym] = Shared::InteractiveDecorator::InteractiveHash.parse_input val
|
48
|
-
end
|
49
|
-
|
50
|
-
result
|
30
|
+
def spec_for(_class_name)
|
31
|
+
route = Utils::Naming.route_from_constant(_class_name)
|
32
|
+
route = route.join(File::SEPARATOR)
|
33
|
+
route = route + '_spec.rb'
|
34
|
+
File.join('spec','navigators', route)
|
51
35
|
end
|
52
36
|
|
53
37
|
end
|
@@ -15,7 +15,7 @@ module Crabfarm
|
|
15
15
|
})
|
16
16
|
end
|
17
17
|
|
18
|
-
common_setup Selenium::WebDriver.for(:chrome, :desired_capabilities
|
18
|
+
common_setup Selenium::WebDriver.for(:chrome, detach: false, desired_capabilities: capabilities), _options
|
19
19
|
end
|
20
20
|
|
21
21
|
def build_firefox_driver(_options={})
|
@@ -6,31 +6,23 @@ module Crabfarm
|
|
6
6
|
extend self
|
7
7
|
|
8
8
|
class SilentFormatter
|
9
|
-
::RSpec::Core::Formatters.register self
|
10
|
-
|
11
9
|
def initialize(_output)
|
10
|
+
# do nothing with output (very silent!)
|
12
11
|
end
|
13
12
|
end
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
def run_spec_for(_target, _filter=nil)
|
20
|
-
|
21
|
-
_target = Array(_target)
|
22
|
-
# TODO: check target exist?
|
23
|
-
|
24
|
-
first_time_config
|
14
|
+
def run_single_spec_for(_target, _tag=nil)
|
15
|
+
setup_rspec_once
|
25
16
|
|
26
17
|
begin
|
27
|
-
|
28
|
-
::RSpec.configuration.inclusion_filter = _filter if _filter
|
18
|
+
configuration.reset
|
29
19
|
|
30
|
-
runner = ::RSpec::Core::Runner.new
|
31
|
-
runner.
|
20
|
+
runner = ::RSpec::Core::Runner.new config_options(_target)
|
21
|
+
runner.setup $stderr, $stdout
|
22
|
+
example = skip_all_but_one _tag
|
23
|
+
runner.run_specs(world.ordered_example_groups)
|
32
24
|
|
33
|
-
|
25
|
+
example
|
34
26
|
ensure
|
35
27
|
::RSpec.clear_examples
|
36
28
|
end
|
@@ -38,15 +30,55 @@ module Crabfarm
|
|
38
30
|
|
39
31
|
private
|
40
32
|
|
41
|
-
def
|
33
|
+
def world
|
34
|
+
::RSpec.world
|
35
|
+
end
|
36
|
+
|
37
|
+
def configuration
|
38
|
+
::RSpec.configuration
|
39
|
+
end
|
40
|
+
|
41
|
+
def setup_rspec_once
|
42
42
|
unless @ready
|
43
|
-
|
43
|
+
::RSpec::Core::Formatters.register SilentFormatter
|
44
|
+
@ready = true
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def config_options(_target)
|
49
|
+
::RSpec::Core::ConfigurationOptions.new [
|
50
|
+
_target,
|
44
51
|
'-f','Crabfarm::Utils::RSpecRunner::SilentFormatter'
|
45
|
-
|
52
|
+
]
|
53
|
+
end
|
46
54
|
|
47
|
-
|
48
|
-
|
55
|
+
def skip_all_but_one(_tag)
|
56
|
+
best_example = world.all_examples.inject(nil) do |best, example|
|
57
|
+
example.metadata[:skip] = true
|
58
|
+
if is_better_example? example, best, _tag
|
59
|
+
example
|
60
|
+
else
|
61
|
+
best
|
62
|
+
end
|
49
63
|
end
|
64
|
+
|
65
|
+
best_example.metadata[:skip] = false if best_example
|
66
|
+
best_example
|
67
|
+
end
|
68
|
+
|
69
|
+
def is_better_example?(_new, _old, _tag)
|
70
|
+
return true if _old.nil?
|
71
|
+
|
72
|
+
if _tag
|
73
|
+
new_tagged = !!(_new.metadata[_tag])
|
74
|
+
old_tagged = !!(_old.metadata[_tag])
|
75
|
+
|
76
|
+
# preffer tagged
|
77
|
+
return new_tagged if new_tagged != old_tagged
|
78
|
+
end
|
79
|
+
|
80
|
+
# preffer higher line number
|
81
|
+
return _new.metadata[:line_number] > _old.metadata[:line_number]
|
50
82
|
end
|
51
83
|
|
52
84
|
end
|
data/lib/crabfarm/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crabfarm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ignacio Baixas
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -417,6 +417,7 @@ extensions: []
|
|
417
417
|
extra_rdoc_files: []
|
418
418
|
files:
|
419
419
|
- lib/crabfarm/adapters/browser/abstract_webdriver.rb
|
420
|
+
- lib/crabfarm/adapters/browser/base.rb
|
420
421
|
- lib/crabfarm/adapters/browser/chrome.rb
|
421
422
|
- lib/crabfarm/adapters/browser/firefox.rb
|
422
423
|
- lib/crabfarm/adapters/browser/noop.rb
|
@@ -463,6 +464,7 @@ files:
|
|
463
464
|
- lib/crabfarm/live/reducer_runner.rb
|
464
465
|
- lib/crabfarm/live/reducer_runner_direct.rb
|
465
466
|
- lib/crabfarm/live/reducer_runner_rspec.rb
|
467
|
+
- lib/crabfarm/live/viewer.rb
|
466
468
|
- lib/crabfarm/live/watcher.rb
|
467
469
|
- lib/crabfarm/modes/console.rb
|
468
470
|
- lib/crabfarm/modes/generator.rb
|