crabfarm 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/assets/live-tools/tools.js +0 -1
  3. data/lib/crabfarm/adapters/browser/abstract_webdriver.rb +13 -28
  4. data/lib/crabfarm/adapters/browser/base.rb +43 -0
  5. data/lib/crabfarm/adapters/browser/chrome.rb +5 -1
  6. data/lib/crabfarm/adapters/browser/firefox.rb +4 -0
  7. data/lib/crabfarm/adapters/browser/noop.rb +3 -10
  8. data/lib/crabfarm/adapters/browser/phantom_js.rb +8 -8
  9. data/lib/crabfarm/adapters/driver_wrapper/pincers.rb +6 -0
  10. data/lib/crabfarm/cli.rb +1 -7
  11. data/lib/crabfarm/context.rb +17 -21
  12. data/lib/crabfarm/driver_pool.rb +3 -2
  13. data/lib/crabfarm/errors.rb +2 -0
  14. data/lib/crabfarm/http_client.rb +1 -1
  15. data/lib/crabfarm/live/context.rb +32 -2
  16. data/lib/crabfarm/live/controller.rb +19 -16
  17. data/lib/crabfarm/live/interactable.rb +5 -14
  18. data/lib/crabfarm/live/manager.rb +85 -95
  19. data/lib/crabfarm/live/navigator_runner.rb +43 -40
  20. data/lib/crabfarm/live/navigator_runner_direct.rb +1 -2
  21. data/lib/crabfarm/live/navigator_runner_rspec.rb +34 -55
  22. data/lib/crabfarm/live/reducer_runner.rb +43 -22
  23. data/lib/crabfarm/live/reducer_runner_direct.rb +1 -2
  24. data/lib/crabfarm/live/reducer_runner_rspec.rb +0 -5
  25. data/lib/crabfarm/live/viewer.rb +92 -0
  26. data/lib/crabfarm/live/watcher.rb +6 -1
  27. data/lib/crabfarm/modes/live.rb +1 -1
  28. data/lib/crabfarm/modes/recorder/snapshot.rb +9 -25
  29. data/lib/crabfarm/support/webdriver_factory.rb +1 -1
  30. data/lib/crabfarm/templates/Gemfile.erb +1 -1
  31. data/lib/crabfarm/utils/rspec_runner.rb +54 -22
  32. data/lib/crabfarm/version.rb +1 -1
  33. 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
- Factories::SnapshotReducer.with_decorator self do
65
- @manager.block_requests { strategy.execute }
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
@@ -23,8 +23,7 @@ module Crabfarm
23
23
  end
24
24
 
25
25
  def show_results
26
- @manager.inject_web_tools
27
- @manager.show_dialog(
26
+ @manager.show_message(
28
27
  :neutral,
29
28
  'Reducing completed!',
30
29
  "The page was parsed in #{@elapsed.real} seconds",
@@ -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
- @controller.execute_live target
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
@@ -26,7 +26,7 @@ module Crabfarm
26
26
  Utils::Console.exception exc
27
27
  ensure
28
28
  Utils::Console.system 'Exiting'
29
- Crabfarm.live.stop rescue nil
29
+ Crabfarm.live.stop
30
30
  end
31
31
  end
32
32
 
@@ -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, _query=nil)
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
- if _query.nil?
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 service
38
- TransitionService
39
- end
40
-
41
- def parse_query_string(_string)
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 => capabilities), _options
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={})
@@ -10,6 +10,6 @@ gem 'nokogiri', "~> 1.6.6"
10
10
  gem "selenium-webdriver", "~> 2.47"
11
11
 
12
12
  group :test do
13
- gem "rspec", "~> 3.2.0"
13
+ gem "rspec", "~> 3.3.0"
14
14
  gem "rspec-nc"
15
15
  end
@@ -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
- class DummyOptions
16
- def configure(_); end
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
- ::RSpec.configuration.files_or_directories_to_run = _target
28
- ::RSpec.configuration.inclusion_filter = _filter if _filter
18
+ configuration.reset
29
19
 
30
- runner = ::RSpec::Core::Runner.new DummyOptions.new
31
- runner.run $stderr, $stdout
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
- ::RSpec.world.example_groups.map { |g| g.filtered_examples }.flatten
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 first_time_config
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
- options = ::RSpec::Core::ConfigurationOptions.new [
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
- options.configure ::RSpec.configuration
48
- @ready = true
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
@@ -1,3 +1,3 @@
1
1
  module Crabfarm
2
- VERSION = "0.6.1"
2
+ VERSION = "0.6.2"
3
3
  end
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.1
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-14 00:00:00.000000000 Z
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