crabfarm 0.4.2 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
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,77 @@
1
+ require 'json'
2
+ require 'inquirer'
3
+ require 'rainbow'
4
+ require 'rainbow/ext/string'
5
+
6
+ module Crabfarm
7
+ module Utils
8
+ module Console
9
+ extend self
10
+
11
+ COLOR_INFO = '888888'
12
+ COLOR_QUESTION = '888888'
13
+ COLOR_WARNING = :yellow
14
+ COLOR_ERROR = :red
15
+ COLOR_HIGHLIGHT = '00FF00'
16
+
17
+ def system(_message)
18
+ puts _message
19
+ end
20
+
21
+ def operation(_message)
22
+ puts _message
23
+ end
24
+
25
+ def info(_message)
26
+ puts _message.color COLOR_INFO
27
+ end
28
+
29
+ def result(_message)
30
+ puts _message.color COLOR_HIGHLIGHT
31
+ end
32
+
33
+ def json_result(_data)
34
+ if _data.nil?
35
+ result 'nil'
36
+ else
37
+ result JSON.pretty_generate(_data).gsub(/(^|\\n)/, ' ')
38
+ end
39
+ end
40
+
41
+ def warning(_message)
42
+ puts _message.color COLOR_WARNING
43
+ end
44
+
45
+ def error(_message)
46
+ puts _message.color COLOR_ERROR
47
+ end
48
+
49
+ def exception(_exc)
50
+ error "#{_exc.class.to_s}: #{_exc.to_s}"
51
+ backtrace _exc
52
+ end
53
+
54
+ def backtrace(_exc)
55
+ _exc.backtrace.each { |i| info(i) }
56
+ end
57
+
58
+ def question(_question)
59
+ Ask.input(_question.color COLOR_QUESTION)
60
+ end
61
+
62
+ def trap_errors(_context)
63
+ begin
64
+ yield
65
+ rescue SystemExit, Interrupt
66
+ raise
67
+ rescue Exception => e
68
+ error = "Error #{_context}"
69
+ warning error + ', check log for more information'
70
+ Crabfarm.logger.error error
71
+ Crabfarm.logger.error e
72
+ end
73
+ end
74
+
75
+ end
76
+ end
77
+ end
@@ -1,16 +1,17 @@
1
1
  module Crabfarm
2
2
  module Utils
3
3
  module Naming
4
+ extend self
4
5
 
5
- def self.is_constant_name?(_name)
6
+ def is_constant_name?(_name)
6
7
  /^([A-Z][A-Za-z0-9]*)(\:\:[A-Z][A-Za-z0-9]*)*$/ === _name
7
8
  end
8
9
 
9
- def self.route_from_constant(_class_name)
10
+ def route_from_constant(_class_name)
10
11
  _class_name.split('::').map(&:underscore)
11
12
  end
12
13
 
13
- def self.decode_crabfarm_uri(_uri)
14
+ def decode_crabfarm_uri(_uri)
14
15
  _uri.to_s.split('/').map { |p| p.gsub(/[^A-Z0-9:]+/i, '_').camelize }.join('::')
15
16
  end
16
17
 
@@ -0,0 +1,39 @@
1
+ module Crabfarm
2
+ module Utils
3
+ module Resolve
4
+ extend self
5
+
6
+ def navigator_class(_name)
7
+ if _name.is_a? String or _name.is_a? Symbol
8
+ (Naming.decode_crabfarm_uri(_name.to_s)).constantize
9
+ else _name end
10
+ end
11
+
12
+ def reducer_class(_name)
13
+ if _name.is_a? String or _name.is_a? Symbol
14
+ (Naming.decode_crabfarm_uri(_name.to_s) + 'Reducer').constantize
15
+ else _name end
16
+ end
17
+
18
+ def memento_path(_name)
19
+ File.join(mementos_path, _name.to_s + '.json.gz')
20
+ end
21
+
22
+ def snapshot_path(_name, _format)
23
+ _name = self.to_s.underscore if _name.nil?
24
+ File.join(snapshots_path, _name + '.' + _format)
25
+ end
26
+
27
+ private
28
+
29
+ def mementos_path
30
+ File.join(Crabfarm.app_path, 'spec/mementos')
31
+ end
32
+
33
+ def snapshots_path
34
+ File.join(Crabfarm.app_path, 'spec/snapshots')
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,54 @@
1
+ require 'rspec'
2
+
3
+ module Crabfarm
4
+ module Utils
5
+ module RSpecRunner
6
+ extend self
7
+
8
+ class SilentFormatter
9
+ ::RSpec::Core::Formatters.register self
10
+
11
+ def initialize(_output)
12
+ end
13
+ end
14
+
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
25
+
26
+ begin
27
+ ::RSpec.configuration.files_or_directories_to_run = _target
28
+ ::RSpec.configuration.inclusion_filter = _filter if _filter
29
+
30
+ runner = ::RSpec::Core::Runner.new DummyOptions.new
31
+ runner.run $stderr, $stdout
32
+
33
+ ::RSpec.world.example_groups.map { |g| g.filtered_examples }.flatten
34
+ ensure
35
+ ::RSpec.clear_examples
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def first_time_config
42
+ unless @ready
43
+ options = ::RSpec::Core::ConfigurationOptions.new [
44
+ '-f','Crabfarm::Utils::RSpecRunner::SilentFormatter'
45
+ ]
46
+
47
+ options.configure ::RSpec.configuration
48
+ @ready = true
49
+ end
50
+ end
51
+
52
+ end
53
+ end
54
+ end
@@ -1,6 +1,6 @@
1
1
  module Crabfarm
2
- module Live
3
- module Helpers
2
+ module Utils
3
+ module Webdriver
4
4
  extend self
5
5
 
6
6
  def inject_script(_driver, _path)
@@ -39,4 +39,4 @@ module Crabfarm
39
39
 
40
40
  end
41
41
  end
42
- end
42
+ end
@@ -1,3 +1,3 @@
1
1
  module Crabfarm
2
- VERSION = "0.4.2"
2
+ VERSION = "0.5.1"
3
3
  end
data/lib/crabfarm.rb CHANGED
@@ -6,21 +6,24 @@ require "active_support/inflector"
6
6
  require "crabfarm/version"
7
7
  require "crabfarm/errors"
8
8
  require "crabfarm/configuration"
9
- require "crabfarm/global_state"
10
9
  require "crabfarm/driver_pool"
11
10
  require "crabfarm/http_client"
12
- require "crabfarm/phantom_runner"
13
11
  require "crabfarm/state_store"
14
12
  require "crabfarm/context"
15
- require "crabfarm/context_factory"
16
13
  require "crabfarm/transition_service"
17
14
  require "crabfarm/base_navigator"
18
15
  require "crabfarm/base_reducer"
19
16
  require "crabfarm/base_struct"
20
17
  require "crabfarm/strategies"
21
18
 
19
+ require "crabfarm/factories/context"
20
+ require "crabfarm/factories/navigator"
21
+ require "crabfarm/factories/reducer"
22
+ require "crabfarm/factories/snapshot_reducer"
23
+
22
24
  require "crabfarm/utils/port_discovery"
23
25
  require "crabfarm/utils/naming"
26
+ require "crabfarm/utils/resolve"
24
27
 
25
28
  module Crabfarm
26
29
 
@@ -33,6 +36,14 @@ module Crabfarm
33
36
  File.dirname __dir__
34
37
  end
35
38
 
39
+ def self.inside_crawler_app?
40
+ defined? CF_PATH
41
+ end
42
+
43
+ def self.app_path
44
+ CF_PATH
45
+ end
46
+
36
47
  def self.config
37
48
  @@config
38
49
  end
@@ -71,6 +82,16 @@ module Crabfarm
71
82
  @@debug
72
83
  end
73
84
 
85
+ def self.with_context(_memento=nil)
86
+ ctx = Factories::Context.build _memento
87
+ begin
88
+ ctx.prepare
89
+ yield ctx
90
+ ensure
91
+ ctx.release
92
+ end
93
+ end
94
+
74
95
  module Strategies
75
96
  # bundled browser adapters
76
97
  register :browser, :phantomjs, 'Crabfarm::Adapters::Browser::PhantomJs', dependencies: ['selenium-webdriver']
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.4.2
4
+ version: 0.5.1
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-05-13 00:00:00.000000000 Z
11
+ date: 2015-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -425,7 +425,6 @@ files:
425
425
  - lib/crabfarm/cli.rb
426
426
  - lib/crabfarm/configuration.rb
427
427
  - lib/crabfarm/context.rb
428
- - lib/crabfarm/context_factory.rb
429
428
  - lib/crabfarm/crabtrap_context.rb
430
429
  - lib/crabfarm/crabtrap_runner.rb
431
430
  - lib/crabfarm/driver_pool.rb
@@ -435,15 +434,23 @@ files:
435
434
  - lib/crabfarm/engines/async_state_manager.rb
436
435
  - lib/crabfarm/engines/sync_state_manager.rb
437
436
  - lib/crabfarm/errors.rb
437
+ - lib/crabfarm/factories/context.rb
438
+ - lib/crabfarm/factories/decorable.rb
439
+ - lib/crabfarm/factories/navigator.rb
440
+ - lib/crabfarm/factories/reducer.rb
441
+ - lib/crabfarm/factories/snapshot_reducer.rb
438
442
  - lib/crabfarm/forked_navigator.rb
439
- - lib/crabfarm/global_state.rb
440
443
  - lib/crabfarm/http_client.rb
444
+ - lib/crabfarm/live/context.rb
441
445
  - lib/crabfarm/live/controller.rb
442
- - lib/crabfarm/live/helpers.rb
443
446
  - lib/crabfarm/live/interactable.rb
444
447
  - lib/crabfarm/live/manager.rb
445
448
  - lib/crabfarm/live/navigator_runner.rb
449
+ - lib/crabfarm/live/navigator_runner_direct.rb
450
+ - lib/crabfarm/live/navigator_runner_rspec.rb
446
451
  - lib/crabfarm/live/reducer_runner.rb
452
+ - lib/crabfarm/live/reducer_runner_direct.rb
453
+ - lib/crabfarm/live/reducer_runner_rspec.rb
447
454
  - lib/crabfarm/live/watcher.rb
448
455
  - lib/crabfarm/modes/console.rb
449
456
  - lib/crabfarm/modes/generator.rb
@@ -454,12 +461,16 @@ files:
454
461
  - lib/crabfarm/modes/server.rb
455
462
  - lib/crabfarm/modes/shared/interactive_decorator.rb
456
463
  - lib/crabfarm/modes/shared/snapshot_decorator.rb
457
- - lib/crabfarm/phantom_runner.rb
464
+ - lib/crabfarm/rspec/navigator_spec_helpers.rb
465
+ - lib/crabfarm/rspec/reducer_spec_helpers.rb
466
+ - lib/crabfarm/rspec/reducer_spy.rb
467
+ - lib/crabfarm/rspec/reducer_spy_manager.rb
458
468
  - lib/crabfarm/rspec.rb
459
469
  - lib/crabfarm/state_store.rb
460
470
  - lib/crabfarm/strategies.rb
461
471
  - lib/crabfarm/support/custom_puma.rb
462
472
  - lib/crabfarm/support/gli.rb
473
+ - lib/crabfarm/support/phantom_runner.rb
463
474
  - lib/crabfarm/support/webdriver_factory.rb
464
475
  - lib/crabfarm/templates/boot.rb.erb
465
476
  - lib/crabfarm/templates/crabfarm_bin.erb
@@ -476,16 +487,22 @@ files:
476
487
  - lib/crabfarm/templates/spec_helper.rb.erb
477
488
  - lib/crabfarm/templates/struct.rb.erb
478
489
  - lib/crabfarm/transition_service.rb
490
+ - lib/crabfarm/utils/console.rb
479
491
  - lib/crabfarm/utils/naming.rb
480
492
  - lib/crabfarm/utils/port_discovery.rb
481
493
  - lib/crabfarm/utils/processes.rb
494
+ - lib/crabfarm/utils/resolve.rb
495
+ - lib/crabfarm/utils/rspec_runner.rb
496
+ - lib/crabfarm/utils/webdriver.rb
482
497
  - lib/crabfarm/version.rb
483
498
  - lib/crabfarm.rb
484
499
  - bin/crabfarm
500
+ - assets/live-tools/instructions.html
485
501
  - assets/live-tools/selectorgadget_combined.css
486
502
  - assets/live-tools/selectorgadget_combined.js
487
503
  - assets/live-tools/tools.css
488
504
  - assets/live-tools/tools.js
505
+ - assets/live-tools/welcome.html
489
506
  homepage: https://github.com/platanus/crabfarm-gem
490
507
  licenses:
491
508
  - MIT
@@ -1,32 +0,0 @@
1
- module Crabfarm
2
- module ContextFactory
3
-
4
- def with_context(_memento=nil)
5
- ctx = build_context(_memento)
6
- begin
7
- ctx.prepare
8
- yield ctx
9
- ensure
10
- ctx.release
11
- end
12
- end
13
-
14
- def build_context(_memento=nil)
15
- if _memento.nil?
16
- Crabfarm::Context.new
17
- else
18
- load_crabtrap_context _memento
19
- end
20
- end
21
-
22
- def load_crabtrap_context(_memento)
23
- require 'crabfarm/crabtrap_context'
24
- require 'crabfarm/modes/recorder/memento'
25
- m_path = Modes::Recorder::Memento.memento_path _memento
26
- raise ResourceNotFoundError.new "Could not find memento '#{_name}'" unless File.exists? m_path
27
- Crabfarm::CrabtrapContext.new :replay, m_path
28
- end
29
-
30
- extend self
31
- end
32
- end
@@ -1,22 +0,0 @@
1
- module Crabfarm
2
- module GlobalState
3
-
4
- def inside_crawler_app?
5
- defined? CF_PATH
6
- end
7
-
8
- def app_path
9
- CF_PATH
10
- end
11
-
12
- def mementos_path
13
- File.join(app_path, 'spec/mementos')
14
- end
15
-
16
- def snapshots_path
17
- File.join app_path, 'spec/snapshots'
18
- end
19
-
20
- extend self
21
- end
22
- end
@@ -1,75 +0,0 @@
1
- require 'timeout'
2
- require 'crabfarm/utils/processes'
3
-
4
- module Crabfarm
5
- class PhantomRunner
6
-
7
- PHANTOM_START_TM = 5 # seconds
8
-
9
- def initialize(_config={})
10
- @config = _config;
11
- @process = nil
12
- end
13
-
14
- def port
15
- @config[:port]
16
- end
17
-
18
- def start
19
- logger.info "Starting phantomjs in port #{port}"
20
- @process = spawn_phantomjs
21
- logger.info "Phantomjs started (PID: #{@process.pid})"
22
- end
23
-
24
- def stop
25
- unless @process.nil?
26
- logger.info "Stopping phantomjs (PID: #{@process.pid})"
27
- @process.stop
28
- @process = nil
29
- logger.info "Phantomjs stopped"
30
- end
31
- end
32
-
33
- private
34
-
35
- def spawn_phantomjs
36
- proc = nil
37
- begin
38
- proc = Utils::Processes.start_logged_process 'phantomjs', phantomjs_cmd, logger
39
- Timeout::timeout(PHANTOM_START_TM) { wait_for_server }
40
- rescue ChildProcess::LaunchError
41
- raise BinaryMissingError.new 'phantomjs', @config[:bin_path]
42
- rescue Timeout::Error
43
- proc.stop
44
- raise
45
- end
46
- proc
47
- end
48
-
49
- def phantomjs_cmd
50
- cmd = [@config[:bin_path]]
51
- cmd << '--load-images=false' unless @config[:load_images]
52
- cmd << "--proxy=#{@config[:proxy]}" unless @config[:proxy].nil?
53
- cmd << "--webdriver=#{port}"
54
- cmd << "--ssl-protocol=#{@config[:ssl]}" unless @config[:ssl].nil?
55
- cmd << "--ignore-ssl-errors=true"
56
- cmd << "--webdriver-loglevel=WARN"
57
- cmd
58
- end
59
-
60
- def wait_for_server
61
- loop do
62
- begin
63
- Net::HTTP.get_response(URI.parse("http://127.0.0.1:#{port}/status"))
64
- break
65
- rescue
66
- end
67
- end
68
- end
69
-
70
- def logger
71
- Crabfarm.logger
72
- end
73
-
74
- end
75
- end