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.
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