crabfarm 0.6.2 → 0.7.0
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/lib/crabfarm/adapters/browser/phantom_js.rb +1 -0
- data/lib/crabfarm/base_navigator.rb +1 -1
- data/lib/crabfarm/base_reducer.rb +0 -4
- data/lib/crabfarm/base_struct.rb +0 -4
- data/lib/crabfarm/configuration.rb +7 -6
- data/lib/crabfarm/crabtrap_runner.rb +1 -0
- data/lib/crabfarm/engines/async_state_manager.rb +8 -8
- data/lib/crabfarm/engines/sync_state_manager.rb +8 -8
- data/lib/crabfarm/live/navigator_runner_direct.rb +2 -5
- data/lib/crabfarm/modes/console.rb +23 -21
- data/lib/crabfarm/modes/server.rb +2 -2
- data/lib/crabfarm/rspec.rb +1 -1
- data/lib/crabfarm/support/phantom_runner.rb +1 -1
- data/lib/crabfarm/templates/Crabfile.erb +4 -8
- data/lib/crabfarm/templates/Gemfile.erb +1 -1
- data/lib/crabfarm/transition_service.rb +8 -5
- data/lib/crabfarm/utils/processes.rb +20 -17
- data/lib/crabfarm/utils/stream_dumper.rb +142 -0
- data/lib/crabfarm/version.rb +1 -1
- data/lib/crabfarm.rb +6 -2
- metadata +113 -87
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d58ed7568693ec48b019ca4bf3d8051073938d1b
|
4
|
+
data.tar.gz: c0853a7063ef07de79950d23802993c5d5f4bc27
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd5f294f3424f16316633894cfa3e25bfa464ef3a56aaa099d572a1eaf74873de840e89ee7afd7ff7f047f261d7179a9fb9c85c6549ba69b09cb4228e0a93a8c
|
7
|
+
data.tar.gz: a27f2e4ff7adef226539f4ff24301d0c6c2162c47b4a35d519a1737aa0bc4d76878c1b5518cd4de1e5e47454393ba6ac08880364008bd1a620296e7c3c0e4763
|
data/lib/crabfarm/base_struct.rb
CHANGED
@@ -22,17 +22,16 @@ module Crabfarm
|
|
22
22
|
|
23
23
|
# Phantom launcher configuration
|
24
24
|
[:phantom_load_images, :boolean, 'Phantomjs image loading, only for phantomjs driver.'],
|
25
|
+
[:phantom_log_level, ['error', 'warn', 'info', 'debug'], 'Phantomjs log level.'],
|
25
26
|
[:phantom_ssl, ['sslv3', 'sslv2', 'tlsv1', 'any'], 'Phantomjs ssl mode: sslv3, sslv2, tlsv1 or any, only for phantomjs driver.'],
|
26
27
|
[:phantom_bin_path, :string, 'Phantomjs binary path, only for phantomjs driver.'],
|
27
28
|
|
28
29
|
# Crabtrap launcher configuration
|
29
30
|
[:crabtrap_bin_path, :string, 'Crabtrap binary path.'],
|
31
|
+
[:crabtrap_log_level, ['error', 'warn', 'info', 'debug'], 'Crabtrap log level'],
|
30
32
|
|
31
33
|
# Recorder configuration
|
32
|
-
[:recorder_driver, :string, 'Recorder driver name, defaults to \'firefox\'']
|
33
|
-
|
34
|
-
# Live configurations
|
35
|
-
[:live_full_reload, :boolean, 'Whether to create a new driver session on every live reload or not']
|
34
|
+
[:recorder_driver, :string, 'Recorder driver name, defaults to \'firefox\'']
|
36
35
|
]
|
37
36
|
.map { |o| Option.new(*o) }
|
38
37
|
|
@@ -67,9 +66,10 @@ module Crabfarm
|
|
67
66
|
phantom_load_images: false,
|
68
67
|
phantom_ssl: 'any',
|
69
68
|
phantom_bin_path: 'phantomjs',
|
69
|
+
phantom_log_level: :warn,
|
70
70
|
crabtrap_bin_path: 'crabtrap',
|
71
|
-
|
72
|
-
|
71
|
+
crabtrap_log_level: :warn,
|
72
|
+
recorder_driver: :firefox
|
73
73
|
}
|
74
74
|
end
|
75
75
|
|
@@ -87,6 +87,7 @@ module Crabfarm
|
|
87
87
|
def crabtrap_config
|
88
88
|
{
|
89
89
|
bin_path: crabtrap_bin_path,
|
90
|
+
log_level: crabtrap_log_level,
|
90
91
|
proxy: proxy
|
91
92
|
}
|
92
93
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'benchmark'
|
2
1
|
require 'ostruct'
|
3
2
|
|
4
3
|
module Crabfarm
|
@@ -106,18 +105,19 @@ module Crabfarm
|
|
106
105
|
if @working
|
107
106
|
begin
|
108
107
|
logger.info "Transitioning state: #{@next_state_name}"
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
108
|
+
ActiveSupport::Dependencies.clear
|
109
|
+
ts = TransitionService.transition(@context, @next_state_name, @next_state_params)
|
110
|
+
@elapsed = ts.elapsed
|
111
|
+
@doc = ts.document
|
112
|
+
@error = nil
|
113
113
|
|
114
114
|
logger.info "Transitioned in #{@elapsed.real}"
|
115
|
-
@error = nil
|
116
115
|
rescue Exception => e
|
117
|
-
logger.error "Error during transition:"
|
118
|
-
logger.error e
|
119
116
|
@doc = nil
|
120
117
|
@error = e
|
118
|
+
|
119
|
+
logger.error "Error during transition:"
|
120
|
+
logger.error e
|
121
121
|
end
|
122
122
|
|
123
123
|
@lock.synchronize {
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'benchmark'
|
2
1
|
require 'ostruct'
|
3
2
|
|
4
3
|
module Crabfarm
|
@@ -27,13 +26,14 @@ module Crabfarm
|
|
27
26
|
|
28
27
|
def navigate(_name, _params={})
|
29
28
|
@lock.synchronize {
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
29
|
+
ts = TransitionService.transition(@context, _name, _params)
|
30
|
+
|
31
|
+
OpenStruct.new({
|
32
|
+
name: _name,
|
33
|
+
params: _params,
|
34
|
+
doc: ts.document,
|
35
|
+
elapsed: ts.elapsed
|
36
|
+
})
|
37
37
|
}
|
38
38
|
end
|
39
39
|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'benchmark'
|
2
1
|
require 'crabfarm/utils/console'
|
3
2
|
|
4
3
|
module Crabfarm
|
@@ -14,9 +13,7 @@ module Crabfarm
|
|
14
13
|
|
15
14
|
def execute
|
16
15
|
Crabfarm.with_context @memento do |ctx|
|
17
|
-
@
|
18
|
-
@transition = TransitionService.transition ctx, @target, (@params || {})
|
19
|
-
end
|
16
|
+
@transition = TransitionService.transition ctx, @target, (@params || {})
|
20
17
|
end
|
21
18
|
end
|
22
19
|
|
@@ -24,7 +21,7 @@ module Crabfarm
|
|
24
21
|
@manager.show_message(
|
25
22
|
:neutral,
|
26
23
|
'Navigation completed!',
|
27
|
-
"The page was scrapped in #{@elapsed
|
24
|
+
"The page was scrapped in #{@transition.elapsed} seconds",
|
28
25
|
@transition.document.to_json,
|
29
26
|
:json
|
30
27
|
)
|
@@ -2,6 +2,7 @@ require 'readline'
|
|
2
2
|
require 'rainbow'
|
3
3
|
require 'rainbow/ext/string'
|
4
4
|
require 'json'
|
5
|
+
require 'crabfarm/utils/console'
|
5
6
|
require 'crabfarm/engines/sync_state_manager'
|
6
7
|
|
7
8
|
module Crabfarm
|
@@ -23,60 +24,62 @@ module Crabfarm
|
|
23
24
|
end
|
24
25
|
|
25
26
|
def reload!
|
26
|
-
|
27
|
+
console.info "Reloading crawler source"
|
27
28
|
@manager.reload
|
28
29
|
nil
|
29
30
|
end
|
30
31
|
|
31
32
|
def reset
|
32
|
-
|
33
|
+
console.info "Resetting crawling context"
|
33
34
|
@manager.reset
|
34
35
|
nil
|
35
36
|
end
|
36
37
|
|
37
38
|
def navigate(_name=nil, _params={})
|
38
39
|
if _name.nil?
|
39
|
-
|
40
|
+
console.warning "Must provide a navigator name"
|
40
41
|
return
|
41
42
|
end
|
42
43
|
|
43
44
|
begin
|
44
|
-
|
45
|
+
console.info "Navigating..."
|
45
46
|
output = @manager.navigate _name, _params
|
46
|
-
|
47
|
-
|
47
|
+
console.json_result output.doc
|
48
|
+
console.info "Completed in #{output.elapsed.real} s"
|
48
49
|
|
49
|
-
rescue Exception =>
|
50
|
-
|
51
|
-
puts e.backtrace
|
50
|
+
rescue Exception => exc
|
51
|
+
console.exception exc
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
55
|
def snap(_name=nil, _params={})
|
56
56
|
if _name.nil?
|
57
|
-
|
57
|
+
console.warning "Must provide a navigator name"
|
58
58
|
return
|
59
59
|
end
|
60
60
|
|
61
61
|
begin
|
62
|
-
|
62
|
+
console.info "Navigating, waiting to hit a reducer..."
|
63
63
|
require 'crabfarm/modes/shared/snapshot_decorator'
|
64
64
|
Factories::Reducer.with_decorator Shared::SnapshotDecorator do
|
65
65
|
@manager.navigate _name, _params
|
66
66
|
end
|
67
|
-
|
67
|
+
console.info "Navigation completed"
|
68
68
|
|
69
|
-
rescue Exception =>
|
70
|
-
|
71
|
-
puts e.backtrace
|
69
|
+
rescue Exception => exc
|
70
|
+
console.exception exc
|
72
71
|
end
|
73
72
|
end
|
74
73
|
|
75
74
|
def help
|
76
|
-
|
75
|
+
console.info "Ejem..."
|
77
76
|
nil
|
78
77
|
end
|
79
78
|
|
79
|
+
def console
|
80
|
+
Crabfarm::Utils::Console
|
81
|
+
end
|
82
|
+
|
80
83
|
alias :nav :navigate
|
81
84
|
end
|
82
85
|
|
@@ -88,16 +91,15 @@ module Crabfarm
|
|
88
91
|
output = dsl.instance_eval Readline.readline("> ", true)
|
89
92
|
puts output.inspect unless output.nil?
|
90
93
|
rescue SyntaxError => se
|
91
|
-
|
94
|
+
Crabfarm::Utils::Console.exception se
|
92
95
|
rescue SystemExit, Interrupt
|
93
96
|
break
|
94
|
-
rescue =>
|
95
|
-
|
96
|
-
puts e.backtrace
|
97
|
+
rescue => exc
|
98
|
+
Crabfarm::Utils::Console.exception exc
|
97
99
|
end
|
98
100
|
end
|
99
101
|
|
100
|
-
|
102
|
+
Crabfarm::Utils::Console.system "Exiting"
|
101
103
|
end
|
102
104
|
|
103
105
|
end
|
@@ -14,7 +14,7 @@ module Crabfarm
|
|
14
14
|
prefix :api
|
15
15
|
|
16
16
|
rescue_from Grape::Exceptions::ValidationErrors do |e|
|
17
|
-
rack_response({ errors: e
|
17
|
+
rack_response({ errors: e }.to_json, 400)
|
18
18
|
end
|
19
19
|
|
20
20
|
rescue_from Crabfarm::ApiError do |e|
|
@@ -54,7 +54,7 @@ module Crabfarm
|
|
54
54
|
optional :wait, type: Float
|
55
55
|
end
|
56
56
|
put :state do
|
57
|
-
print_state evaluator.navigate params[:name], params[:params], wait
|
57
|
+
print_state evaluator.navigate params[:name], params[:params] || {}, wait
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
data/lib/crabfarm/rspec.rb
CHANGED
@@ -14,7 +14,7 @@ RSpec.configure do |config|
|
|
14
14
|
example.run
|
15
15
|
ensure
|
16
16
|
# store result in metadata so it can be accessed by formatters/reporters
|
17
|
-
example.metadata[:result] = @reducer_state
|
17
|
+
example.metadata[:result] = @reducer_state if @reducer_state
|
18
18
|
end
|
19
19
|
elsif described_class < Crabfarm::BaseNavigator
|
20
20
|
Crabfarm.with_context example.metadata[:navigating] do |ctx|
|
@@ -55,7 +55,7 @@ module Crabfarm
|
|
55
55
|
cmd << "--ssl-protocol=#{@config[:ssl]}" unless @config[:ssl].nil?
|
56
56
|
cmd << "--ignore-ssl-errors=true"
|
57
57
|
cmd << "--web-security=false"
|
58
|
-
cmd << "--webdriver-loglevel
|
58
|
+
cmd << "--webdriver-loglevel=#{@config[:log_level].to_s.upcase}"
|
59
59
|
cmd
|
60
60
|
end
|
61
61
|
|
@@ -36,7 +36,10 @@ set_webdriver_dsl :pincers
|
|
36
36
|
# The following parameters only apply if using the :phantomjs webdriver
|
37
37
|
|
38
38
|
# Make phantom load images when requesting documents
|
39
|
-
# set_phantom_load_images
|
39
|
+
# set_phantom_load_images true
|
40
|
+
|
41
|
+
# Set phantom log level, defaults to warning
|
42
|
+
# set_phantom_log_level :warn
|
40
43
|
|
41
44
|
# Set phantom ssl mode, defaults to :any, posible options are sslv3, sslv2, tlsv1 or any
|
42
45
|
# set_phantom_ssl 'any'
|
@@ -70,10 +73,3 @@ set_webdriver_dsl :pincers
|
|
70
73
|
|
71
74
|
# Change the browser used for the recording command, available options are 'firefox' or 'chrome'
|
72
75
|
# set_recorder_driver :firefox
|
73
|
-
|
74
|
-
|
75
|
-
# Live mode configuration
|
76
|
-
########################################
|
77
|
-
|
78
|
-
# Build a new webdriver session on each reload
|
79
|
-
# set_live_full_reload false
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
|
1
3
|
module Crabfarm
|
2
4
|
class TransitionService
|
3
5
|
|
@@ -5,7 +7,7 @@ module Crabfarm
|
|
5
7
|
self.new(_context).transition(_name, _params)
|
6
8
|
end
|
7
9
|
|
8
|
-
attr_reader :document, :navigator
|
10
|
+
attr_reader :document, :navigator, :elapsed
|
9
11
|
|
10
12
|
def initialize(_context)
|
11
13
|
@context = _context
|
@@ -14,10 +16,11 @@ module Crabfarm
|
|
14
16
|
def transition(_name_or_class, _params={})
|
15
17
|
navigator_class = Utils::Resolve.navigator_class _name_or_class
|
16
18
|
|
17
|
-
@
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
@elapsed = Benchmark.measure do
|
20
|
+
@context.prepare
|
21
|
+
@navigator = Factories::Navigator.build navigator_class, @context, _params
|
22
|
+
@document = @navigator.run
|
23
|
+
end.real
|
21
24
|
|
22
25
|
self
|
23
26
|
end
|
@@ -1,30 +1,33 @@
|
|
1
1
|
require 'childprocess'
|
2
|
+
require 'crabfarm/utils/stream_dumper'
|
2
3
|
|
3
4
|
ChildProcess.posix_spawn = true
|
4
5
|
|
5
|
-
module Crabfarm
|
6
|
-
module Utils
|
7
|
-
module Processes
|
6
|
+
module Crabfarm::Utils
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
re, we = IO.pipe
|
8
|
+
module Processes
|
9
|
+
def self.start_logged_process(_name, _cmd, _logger, _env={})
|
12
10
|
|
13
|
-
|
14
|
-
|
15
|
-
proc.io.stdout = wo
|
16
|
-
proc.io.stderr = we
|
17
|
-
proc.start
|
11
|
+
ro, wo = IO.pipe
|
12
|
+
re, we = IO.pipe
|
18
13
|
|
19
|
-
|
20
|
-
|
14
|
+
proc = ChildProcess.build(*_cmd)
|
15
|
+
proc.environment.merge! _env
|
16
|
+
proc.io.stdout = wo
|
17
|
+
proc.io.stderr = we
|
18
|
+
proc.start
|
21
19
|
|
22
|
-
|
23
|
-
|
20
|
+
# close write endpoints after fork
|
21
|
+
wo.close
|
22
|
+
we.close
|
24
23
|
|
25
|
-
|
26
|
-
|
24
|
+
# register log consumers
|
25
|
+
StreamDumper.register_stream(ro) { |l| _logger.info "[#{_name.upcase}] #{l}" }
|
26
|
+
StreamDumper.register_stream(re) { |l| _logger.warn "[#{_name.upcase}] #{l}" }
|
27
27
|
|
28
|
+
proc
|
28
29
|
end
|
29
30
|
end
|
31
|
+
|
30
32
|
end
|
33
|
+
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'thwait'
|
2
|
+
|
3
|
+
module Crabfarm::Utils
|
4
|
+
|
5
|
+
class StreamDumper
|
6
|
+
|
7
|
+
class Reload < StandardError; end
|
8
|
+
|
9
|
+
def self.consumer
|
10
|
+
@@consumer ||= self.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.register_stream(_stream, &_block)
|
14
|
+
consumer.register_stream _stream, &_block
|
15
|
+
consumer.restart
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@streams = []
|
20
|
+
@lock = Mutex.new
|
21
|
+
@worker = nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def register_stream(_stream, &_block)
|
25
|
+
@lock.synchronize { @streams << Wrapper.new(_stream, _block) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def restart
|
29
|
+
@lock.synchronize do
|
30
|
+
if @worker and @worker.alive?
|
31
|
+
@worker.raise Reload # signal worker to reload streams
|
32
|
+
else
|
33
|
+
@worker = load_worker
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def load_worker
|
41
|
+
Thread.new do
|
42
|
+
looped = 0
|
43
|
+
begin
|
44
|
+
while @streams.count > 0
|
45
|
+
all_streams = dump_streams
|
46
|
+
result = IO.select(all_streams << $stdin, [], all_streams)
|
47
|
+
if result
|
48
|
+
process_ready_streams result[0]
|
49
|
+
discard_errored_streams result[2]
|
50
|
+
end
|
51
|
+
looped += 1
|
52
|
+
end
|
53
|
+
rescue Reload
|
54
|
+
retry
|
55
|
+
rescue SystemExit
|
56
|
+
# nothing
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def process_ready_streams(_streams)
|
62
|
+
_streams.each do |stream|
|
63
|
+
wrapper = find_stream_wrapper stream
|
64
|
+
if wrapper
|
65
|
+
wrapper.process_lines
|
66
|
+
remove_wrapper wrapper, :eof if wrapper.eof?
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def discard_errored_streams(_streams)
|
72
|
+
_streams.each do |stream|
|
73
|
+
wrapper = find_stream_wrapper stream
|
74
|
+
remove_wrapper wrapper, :error if wrapper
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def find_stream_wrapper(_stream)
|
79
|
+
@streams.find { |s| s.stream == _stream }
|
80
|
+
end
|
81
|
+
|
82
|
+
def remove_wrapper(_wrapper, _reason)
|
83
|
+
@lock.synchronize { @streams.delete _wrapper }
|
84
|
+
end
|
85
|
+
|
86
|
+
def dump_streams
|
87
|
+
@streams.map(&:stream)
|
88
|
+
end
|
89
|
+
|
90
|
+
class Wrapper
|
91
|
+
|
92
|
+
MAX_LENGTH = 2048
|
93
|
+
|
94
|
+
attr_reader :stream
|
95
|
+
|
96
|
+
def initialize(_stream, _block)
|
97
|
+
@stream = _stream
|
98
|
+
@block = _block
|
99
|
+
@buffer = []
|
100
|
+
@eof = false
|
101
|
+
end
|
102
|
+
|
103
|
+
def eof?
|
104
|
+
@eof
|
105
|
+
end
|
106
|
+
|
107
|
+
def process_lines
|
108
|
+
begin
|
109
|
+
loop do
|
110
|
+
chunk = @stream.read_nonblock(MAX_LENGTH)
|
111
|
+
process_chunk chunk
|
112
|
+
end
|
113
|
+
rescue IO::WaitReadable
|
114
|
+
# nothing, just stop looping
|
115
|
+
rescue EOFError
|
116
|
+
@eof = true
|
117
|
+
rescue Exception => exc
|
118
|
+
puts "Error in stream consumer: #{exc}"
|
119
|
+
@eof = true
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def process_chunk(_chunk)
|
124
|
+
index = _chunk.index $/
|
125
|
+
|
126
|
+
unless index.nil?
|
127
|
+
head = _chunk[0..index-1]
|
128
|
+
tail = _chunk[index+1..-1]
|
129
|
+
|
130
|
+
@block.call(@buffer.join + head)
|
131
|
+
@buffer.clear
|
132
|
+
|
133
|
+
process_chunk tail
|
134
|
+
else
|
135
|
+
@buffer << _chunk
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
end
|
data/lib/crabfarm/version.rb
CHANGED
data/lib/crabfarm.rb
CHANGED
@@ -50,9 +50,13 @@ module Crabfarm
|
|
50
50
|
|
51
51
|
def self.logger
|
52
52
|
if @@logger.nil?
|
53
|
-
|
54
|
-
|
53
|
+
if @@config.log_path.nil? or @@config.log_path.empty?
|
54
|
+
@@logger = Logger.new STDOUT
|
55
|
+
else
|
56
|
+
@@logger = Logger.new File.join(@@config.log_path, 'crawler.log')
|
57
|
+
end
|
55
58
|
end
|
59
|
+
|
56
60
|
@@logger
|
57
61
|
end
|
58
62
|
|
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
|
+
version: 0.7.0
|
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-
|
11
|
+
date: 2015-09-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,7 +16,7 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.0
|
19
|
+
version: '3.0'
|
20
20
|
- - <
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: '5'
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 3.0
|
29
|
+
version: '3.0'
|
30
30
|
- - <
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '5'
|
@@ -36,61 +36,64 @@ dependencies:
|
|
36
36
|
requirements:
|
37
37
|
- - ~>
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: 2.12
|
39
|
+
version: '2.12'
|
40
40
|
type: :runtime
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
44
|
- - ~>
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: 2.12
|
46
|
+
version: '2.12'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: inquirer
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
51
|
- - ~>
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0.2
|
53
|
+
version: '0.2'
|
54
54
|
type: :runtime
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - ~>
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version: 0.2
|
60
|
+
version: '0.2'
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
62
|
name: rainbow
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
65
|
- - ~>
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: 2.0
|
67
|
+
version: '2.0'
|
68
68
|
type: :runtime
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - ~>
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: 2.0
|
74
|
+
version: '2.0'
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: grape
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
79
|
- - ~>
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: 0.10
|
81
|
+
version: '0.10'
|
82
82
|
type: :runtime
|
83
83
|
prerelease: false
|
84
84
|
version_requirements: !ruby/object:Gem::Requirement
|
85
85
|
requirements:
|
86
86
|
- - ~>
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version: 0.10
|
88
|
+
version: '0.10'
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
90
|
name: puma
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
92
92
|
requirements:
|
93
93
|
- - ~>
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '2.10'
|
96
|
+
- - '>='
|
94
97
|
- !ruby/object:Gem::Version
|
95
98
|
version: 2.10.2
|
96
99
|
type: :runtime
|
@@ -98,27 +101,33 @@ dependencies:
|
|
98
101
|
version_requirements: !ruby/object:Gem::Requirement
|
99
102
|
requirements:
|
100
103
|
- - ~>
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '2.10'
|
106
|
+
- - '>='
|
101
107
|
- !ruby/object:Gem::Version
|
102
108
|
version: 2.10.2
|
103
109
|
- !ruby/object:Gem::Dependency
|
104
110
|
name: git
|
105
111
|
requirement: !ruby/object:Gem::Requirement
|
106
112
|
requirements:
|
107
|
-
- -
|
113
|
+
- - ~>
|
108
114
|
- !ruby/object:Gem::Version
|
109
|
-
version: '
|
115
|
+
version: '2.12'
|
110
116
|
type: :runtime
|
111
117
|
prerelease: false
|
112
118
|
version_requirements: !ruby/object:Gem::Requirement
|
113
119
|
requirements:
|
114
|
-
- -
|
120
|
+
- - ~>
|
115
121
|
- !ruby/object:Gem::Version
|
116
|
-
version: '
|
122
|
+
version: '2.12'
|
117
123
|
- !ruby/object:Gem::Dependency
|
118
124
|
name: childprocess
|
119
125
|
requirement: !ruby/object:Gem::Requirement
|
120
126
|
requirements:
|
121
127
|
- - ~>
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0.5'
|
130
|
+
- - '>='
|
122
131
|
- !ruby/object:Gem::Version
|
123
132
|
version: 0.5.5
|
124
133
|
type: :runtime
|
@@ -126,6 +135,9 @@ dependencies:
|
|
126
135
|
version_requirements: !ruby/object:Gem::Requirement
|
127
136
|
requirements:
|
128
137
|
- - ~>
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0.5'
|
140
|
+
- - '>='
|
129
141
|
- !ruby/object:Gem::Version
|
130
142
|
version: 0.5.5
|
131
143
|
- !ruby/object:Gem::Dependency
|
@@ -146,16 +158,16 @@ dependencies:
|
|
146
158
|
name: pry-byebug
|
147
159
|
requirement: !ruby/object:Gem::Requirement
|
148
160
|
requirements:
|
149
|
-
- -
|
161
|
+
- - ~>
|
150
162
|
- !ruby/object:Gem::Version
|
151
|
-
version: '
|
163
|
+
version: '3.2'
|
152
164
|
type: :runtime
|
153
165
|
prerelease: false
|
154
166
|
version_requirements: !ruby/object:Gem::Requirement
|
155
167
|
requirements:
|
156
|
-
- -
|
168
|
+
- - ~>
|
157
169
|
- !ruby/object:Gem::Version
|
158
|
-
version: '
|
170
|
+
version: '3.2'
|
159
171
|
- !ruby/object:Gem::Dependency
|
160
172
|
name: selenium-webdriver
|
161
173
|
requirement: !ruby/object:Gem::Requirement
|
@@ -175,6 +187,9 @@ dependencies:
|
|
175
187
|
requirement: !ruby/object:Gem::Requirement
|
176
188
|
requirements:
|
177
189
|
- - ~>
|
190
|
+
- !ruby/object:Gem::Version
|
191
|
+
version: '1.6'
|
192
|
+
- - '>='
|
178
193
|
- !ruby/object:Gem::Version
|
179
194
|
version: 1.6.6
|
180
195
|
type: :development
|
@@ -182,6 +197,9 @@ dependencies:
|
|
182
197
|
version_requirements: !ruby/object:Gem::Requirement
|
183
198
|
requirements:
|
184
199
|
- - ~>
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '1.6'
|
202
|
+
- - '>='
|
185
203
|
- !ruby/object:Gem::Version
|
186
204
|
version: 1.6.6
|
187
205
|
- !ruby/object:Gem::Dependency
|
@@ -190,14 +208,14 @@ dependencies:
|
|
190
208
|
requirements:
|
191
209
|
- - ~>
|
192
210
|
- !ruby/object:Gem::Version
|
193
|
-
version: 0.
|
211
|
+
version: '0.6'
|
194
212
|
type: :development
|
195
213
|
prerelease: false
|
196
214
|
version_requirements: !ruby/object:Gem::Requirement
|
197
215
|
requirements:
|
198
216
|
- - ~>
|
199
217
|
- !ruby/object:Gem::Version
|
200
|
-
version: 0.
|
218
|
+
version: '0.6'
|
201
219
|
- !ruby/object:Gem::Dependency
|
202
220
|
name: bundler
|
203
221
|
requirement: !ruby/object:Gem::Requirement
|
@@ -216,77 +234,80 @@ dependencies:
|
|
216
234
|
name: rake
|
217
235
|
requirement: !ruby/object:Gem::Requirement
|
218
236
|
requirements:
|
219
|
-
- -
|
237
|
+
- - ~>
|
220
238
|
- !ruby/object:Gem::Version
|
221
|
-
version: '
|
239
|
+
version: '10.4'
|
222
240
|
type: :development
|
223
241
|
prerelease: false
|
224
242
|
version_requirements: !ruby/object:Gem::Requirement
|
225
243
|
requirements:
|
226
|
-
- -
|
244
|
+
- - ~>
|
227
245
|
- !ruby/object:Gem::Version
|
228
|
-
version: '
|
246
|
+
version: '10.4'
|
229
247
|
- !ruby/object:Gem::Dependency
|
230
248
|
name: rspec
|
231
249
|
requirement: !ruby/object:Gem::Requirement
|
232
250
|
requirements:
|
233
|
-
- -
|
251
|
+
- - ~>
|
234
252
|
- !ruby/object:Gem::Version
|
235
|
-
version: '
|
253
|
+
version: '3.1'
|
236
254
|
type: :development
|
237
255
|
prerelease: false
|
238
256
|
version_requirements: !ruby/object:Gem::Requirement
|
239
257
|
requirements:
|
240
|
-
- -
|
258
|
+
- - ~>
|
241
259
|
- !ruby/object:Gem::Version
|
242
|
-
version: '
|
260
|
+
version: '3.1'
|
243
261
|
- !ruby/object:Gem::Dependency
|
244
262
|
name: rspec-nc
|
245
263
|
requirement: !ruby/object:Gem::Requirement
|
246
264
|
requirements:
|
247
|
-
- -
|
265
|
+
- - ~>
|
248
266
|
- !ruby/object:Gem::Version
|
249
|
-
version: '0'
|
267
|
+
version: '0.2'
|
250
268
|
type: :development
|
251
269
|
prerelease: false
|
252
270
|
version_requirements: !ruby/object:Gem::Requirement
|
253
271
|
requirements:
|
254
|
-
- -
|
272
|
+
- - ~>
|
255
273
|
- !ruby/object:Gem::Version
|
256
|
-
version: '0'
|
274
|
+
version: '0.2'
|
257
275
|
- !ruby/object:Gem::Dependency
|
258
276
|
name: guard
|
259
277
|
requirement: !ruby/object:Gem::Requirement
|
260
278
|
requirements:
|
261
|
-
- -
|
279
|
+
- - ~>
|
262
280
|
- !ruby/object:Gem::Version
|
263
|
-
version: '
|
281
|
+
version: '2.11'
|
264
282
|
type: :development
|
265
283
|
prerelease: false
|
266
284
|
version_requirements: !ruby/object:Gem::Requirement
|
267
285
|
requirements:
|
268
|
-
- -
|
286
|
+
- - ~>
|
269
287
|
- !ruby/object:Gem::Version
|
270
|
-
version: '
|
288
|
+
version: '2.11'
|
271
289
|
- !ruby/object:Gem::Dependency
|
272
290
|
name: guard-rspec
|
273
291
|
requirement: !ruby/object:Gem::Requirement
|
274
292
|
requirements:
|
275
|
-
- -
|
293
|
+
- - ~>
|
276
294
|
- !ruby/object:Gem::Version
|
277
|
-
version: '
|
295
|
+
version: '4.5'
|
278
296
|
type: :development
|
279
297
|
prerelease: false
|
280
298
|
version_requirements: !ruby/object:Gem::Requirement
|
281
299
|
requirements:
|
282
|
-
- -
|
300
|
+
- - ~>
|
283
301
|
- !ruby/object:Gem::Version
|
284
|
-
version: '
|
302
|
+
version: '4.5'
|
285
303
|
- !ruby/object:Gem::Dependency
|
286
304
|
name: terminal-notifier-guard
|
287
305
|
requirement: !ruby/object:Gem::Requirement
|
288
306
|
requirements:
|
289
307
|
- - ~>
|
308
|
+
- !ruby/object:Gem::Version
|
309
|
+
version: '1.6'
|
310
|
+
- - '>='
|
290
311
|
- !ruby/object:Gem::Version
|
291
312
|
version: 1.6.1
|
292
313
|
type: :development
|
@@ -294,55 +315,61 @@ dependencies:
|
|
294
315
|
version_requirements: !ruby/object:Gem::Requirement
|
295
316
|
requirements:
|
296
317
|
- - ~>
|
318
|
+
- !ruby/object:Gem::Version
|
319
|
+
version: '1.6'
|
320
|
+
- - '>='
|
297
321
|
- !ruby/object:Gem::Version
|
298
322
|
version: 1.6.1
|
299
323
|
- !ruby/object:Gem::Dependency
|
300
324
|
name: pry
|
301
325
|
requirement: !ruby/object:Gem::Requirement
|
302
326
|
requirements:
|
303
|
-
- -
|
327
|
+
- - ~>
|
304
328
|
- !ruby/object:Gem::Version
|
305
|
-
version: '0'
|
329
|
+
version: '0.10'
|
306
330
|
type: :development
|
307
331
|
prerelease: false
|
308
332
|
version_requirements: !ruby/object:Gem::Requirement
|
309
333
|
requirements:
|
310
|
-
- -
|
334
|
+
- - ~>
|
311
335
|
- !ruby/object:Gem::Version
|
312
|
-
version: '0'
|
336
|
+
version: '0.10'
|
313
337
|
- !ruby/object:Gem::Dependency
|
314
338
|
name: pry-remote
|
315
339
|
requirement: !ruby/object:Gem::Requirement
|
316
340
|
requirements:
|
317
|
-
- -
|
341
|
+
- - ~>
|
318
342
|
- !ruby/object:Gem::Version
|
319
|
-
version: '0'
|
343
|
+
version: '0.1'
|
320
344
|
type: :development
|
321
345
|
prerelease: false
|
322
346
|
version_requirements: !ruby/object:Gem::Requirement
|
323
347
|
requirements:
|
324
|
-
- -
|
348
|
+
- - ~>
|
325
349
|
- !ruby/object:Gem::Version
|
326
|
-
version: '0'
|
350
|
+
version: '0.1'
|
327
351
|
- !ruby/object:Gem::Dependency
|
328
352
|
name: pry-nav
|
329
353
|
requirement: !ruby/object:Gem::Requirement
|
330
354
|
requirements:
|
331
|
-
- -
|
355
|
+
- - ~>
|
332
356
|
- !ruby/object:Gem::Version
|
333
|
-
version: '0'
|
357
|
+
version: '0.2'
|
334
358
|
type: :development
|
335
359
|
prerelease: false
|
336
360
|
version_requirements: !ruby/object:Gem::Requirement
|
337
361
|
requirements:
|
338
|
-
- -
|
362
|
+
- - ~>
|
339
363
|
- !ruby/object:Gem::Version
|
340
|
-
version: '0'
|
364
|
+
version: '0.2'
|
341
365
|
- !ruby/object:Gem::Dependency
|
342
366
|
name: pdf-reader
|
343
367
|
requirement: !ruby/object:Gem::Requirement
|
344
368
|
requirements:
|
345
369
|
- - ~>
|
370
|
+
- !ruby/object:Gem::Version
|
371
|
+
version: '1.3'
|
372
|
+
- - '>='
|
346
373
|
- !ruby/object:Gem::Version
|
347
374
|
version: 1.3.3
|
348
375
|
type: :development
|
@@ -351,54 +378,46 @@ dependencies:
|
|
351
378
|
requirements:
|
352
379
|
- - ~>
|
353
380
|
- !ruby/object:Gem::Version
|
354
|
-
version: 1.3
|
355
|
-
- !ruby/object:Gem::Dependency
|
356
|
-
name: capybara
|
357
|
-
requirement: !ruby/object:Gem::Requirement
|
358
|
-
requirements:
|
359
|
-
- - '>='
|
360
|
-
- !ruby/object:Gem::Version
|
361
|
-
version: '0'
|
362
|
-
type: :development
|
363
|
-
prerelease: false
|
364
|
-
version_requirements: !ruby/object:Gem::Requirement
|
365
|
-
requirements:
|
381
|
+
version: '1.3'
|
366
382
|
- - '>='
|
367
383
|
- !ruby/object:Gem::Version
|
368
|
-
version:
|
384
|
+
version: 1.3.3
|
369
385
|
- !ruby/object:Gem::Dependency
|
370
386
|
name: watir-webdriver
|
371
387
|
requirement: !ruby/object:Gem::Requirement
|
372
388
|
requirements:
|
373
|
-
- -
|
389
|
+
- - ~>
|
374
390
|
- !ruby/object:Gem::Version
|
375
|
-
version: '0'
|
391
|
+
version: '0.7'
|
376
392
|
type: :development
|
377
393
|
prerelease: false
|
378
394
|
version_requirements: !ruby/object:Gem::Requirement
|
379
395
|
requirements:
|
380
|
-
- -
|
396
|
+
- - ~>
|
381
397
|
- !ruby/object:Gem::Version
|
382
|
-
version: '0'
|
398
|
+
version: '0.7'
|
383
399
|
- !ruby/object:Gem::Dependency
|
384
400
|
name: jbuilder
|
385
401
|
requirement: !ruby/object:Gem::Requirement
|
386
402
|
requirements:
|
387
403
|
- - ~>
|
388
404
|
- !ruby/object:Gem::Version
|
389
|
-
version: 2.2
|
405
|
+
version: '2.2'
|
390
406
|
type: :development
|
391
407
|
prerelease: false
|
392
408
|
version_requirements: !ruby/object:Gem::Requirement
|
393
409
|
requirements:
|
394
410
|
- - ~>
|
395
411
|
- !ruby/object:Gem::Version
|
396
|
-
version: 2.2
|
412
|
+
version: '2.2'
|
397
413
|
- !ruby/object:Gem::Dependency
|
398
414
|
name: fakefs
|
399
415
|
requirement: !ruby/object:Gem::Requirement
|
400
416
|
requirements:
|
401
417
|
- - ~>
|
418
|
+
- !ruby/object:Gem::Version
|
419
|
+
version: '0.6'
|
420
|
+
- - '>='
|
402
421
|
- !ruby/object:Gem::Version
|
403
422
|
version: 0.6.7
|
404
423
|
type: :development
|
@@ -406,9 +425,15 @@ dependencies:
|
|
406
425
|
version_requirements: !ruby/object:Gem::Requirement
|
407
426
|
requirements:
|
408
427
|
- - ~>
|
428
|
+
- !ruby/object:Gem::Version
|
429
|
+
version: '0.6'
|
430
|
+
- - '>='
|
409
431
|
- !ruby/object:Gem::Version
|
410
432
|
version: 0.6.7
|
411
|
-
description:
|
433
|
+
description: "\n Crabfarm lets you build web scrappers using TDD, it is also very
|
434
|
+
opinionated about\n the way a scrapper should be structured. Scrappers created
|
435
|
+
by crabfarm can be hosted\n and monitored in the Crabfarm grid infrastructure.\n
|
436
|
+
\ "
|
412
437
|
email:
|
413
438
|
- ignacio@platan.us
|
414
439
|
executables:
|
@@ -416,6 +441,14 @@ executables:
|
|
416
441
|
extensions: []
|
417
442
|
extra_rdoc_files: []
|
418
443
|
files:
|
444
|
+
- assets/live-tools/instructions.html
|
445
|
+
- assets/live-tools/selectorgadget_combined.css
|
446
|
+
- assets/live-tools/selectorgadget_combined.js
|
447
|
+
- assets/live-tools/tools.css
|
448
|
+
- assets/live-tools/tools.js
|
449
|
+
- assets/live-tools/welcome.html
|
450
|
+
- bin/crabfarm
|
451
|
+
- lib/crabfarm.rb
|
419
452
|
- lib/crabfarm/adapters/browser/abstract_webdriver.rb
|
420
453
|
- lib/crabfarm/adapters/browser/base.rb
|
421
454
|
- lib/crabfarm/adapters/browser/chrome.rb
|
@@ -475,25 +508,25 @@ files:
|
|
475
508
|
- lib/crabfarm/modes/server.rb
|
476
509
|
- lib/crabfarm/modes/shared/interactive_decorator.rb
|
477
510
|
- lib/crabfarm/modes/shared/snapshot_decorator.rb
|
511
|
+
- lib/crabfarm/rspec.rb
|
478
512
|
- lib/crabfarm/rspec/navigator_spec_helpers.rb
|
479
513
|
- lib/crabfarm/rspec/reducer_spec_helpers.rb
|
480
514
|
- lib/crabfarm/rspec/reducer_spy.rb
|
481
515
|
- lib/crabfarm/rspec/reducer_spy_manager.rb
|
482
|
-
- lib/crabfarm/rspec.rb
|
483
516
|
- lib/crabfarm/state_store.rb
|
484
517
|
- lib/crabfarm/strategies.rb
|
485
518
|
- lib/crabfarm/support/custom_puma.rb
|
486
519
|
- lib/crabfarm/support/gli.rb
|
487
520
|
- lib/crabfarm/support/phantom_runner.rb
|
488
521
|
- lib/crabfarm/support/webdriver_factory.rb
|
522
|
+
- lib/crabfarm/templates/Crabfile.erb
|
523
|
+
- lib/crabfarm/templates/Gemfile.erb
|
489
524
|
- lib/crabfarm/templates/boot.rb.erb
|
490
525
|
- lib/crabfarm/templates/crabfarm_bin.erb
|
491
|
-
- lib/crabfarm/templates/Crabfile.erb
|
492
526
|
- lib/crabfarm/templates/dot_crabfarm.erb
|
493
527
|
- lib/crabfarm/templates/dot_gitignore.erb
|
494
528
|
- lib/crabfarm/templates/dot_gitkeep.erb
|
495
529
|
- lib/crabfarm/templates/dot_rspec.erb
|
496
|
-
- lib/crabfarm/templates/Gemfile.erb
|
497
530
|
- lib/crabfarm/templates/navigator.rb.erb
|
498
531
|
- lib/crabfarm/templates/navigator_spec.rb.erb
|
499
532
|
- lib/crabfarm/templates/reducer.rb.erb
|
@@ -507,16 +540,9 @@ files:
|
|
507
540
|
- lib/crabfarm/utils/processes.rb
|
508
541
|
- lib/crabfarm/utils/resolve.rb
|
509
542
|
- lib/crabfarm/utils/rspec_runner.rb
|
543
|
+
- lib/crabfarm/utils/stream_dumper.rb
|
510
544
|
- lib/crabfarm/utils/webdriver.rb
|
511
545
|
- lib/crabfarm/version.rb
|
512
|
-
- lib/crabfarm.rb
|
513
|
-
- bin/crabfarm
|
514
|
-
- assets/live-tools/instructions.html
|
515
|
-
- assets/live-tools/selectorgadget_combined.css
|
516
|
-
- assets/live-tools/selectorgadget_combined.js
|
517
|
-
- assets/live-tools/tools.css
|
518
|
-
- assets/live-tools/tools.js
|
519
|
-
- assets/live-tools/welcome.html
|
520
546
|
homepage: https://github.com/platanus/crabfarm-gem
|
521
547
|
licenses:
|
522
548
|
- MIT
|
@@ -537,9 +563,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
537
563
|
version: '0'
|
538
564
|
requirements: []
|
539
565
|
rubyforge_project:
|
540
|
-
rubygems_version: 2.
|
566
|
+
rubygems_version: 2.4.8
|
541
567
|
signing_key:
|
542
568
|
specification_version: 4
|
543
|
-
summary: Crabfarm
|
569
|
+
summary: Crabfarm is a TDD oriented web scrapping framework
|
544
570
|
test_files: []
|
545
571
|
has_rdoc:
|