crabfarm 0.0.6 → 0.0.8
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.rb +12 -2
- data/lib/crabfarm/base_parser.rb +2 -2
- data/lib/crabfarm/base_state.rb +3 -4
- data/lib/crabfarm/cli.rb +10 -6
- data/lib/crabfarm/configuration.rb +4 -0
- data/lib/crabfarm/context.rb +4 -5
- data/lib/crabfarm/default_driver_factory.rb +3 -0
- data/lib/crabfarm/driver_bucket.rb +3 -4
- data/lib/crabfarm/driver_bucket_pool.rb +12 -9
- data/lib/crabfarm/engines/safe_state_loop.rb +16 -10
- data/lib/crabfarm/loader_service.rb +29 -0
- data/lib/crabfarm/mocks/noop_driver.rb +6 -0
- data/lib/crabfarm/modes/console.rb +14 -8
- data/lib/crabfarm/modes/generator.rb +12 -10
- data/lib/crabfarm/modes/server.rb +4 -3
- data/lib/crabfarm/rspec.rb +1 -3
- data/lib/crabfarm/state_store.rb +1 -1
- data/lib/crabfarm/templates/boot.rb.erb +8 -4
- data/lib/crabfarm/version.rb +1 -1
- metadata +4 -4
- data/lib/crabfarm/loader.rb +0 -97
- data/lib/crabfarm/module_helper.rb +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c6a40d52475ec34390f4dca75207062dfdae26b
|
4
|
+
data.tar.gz: 9b298a6d3b4eb50d42eb153c274b638dff02ed63
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2ecc793d6ec88e0dba2cbd806195fc1c94785cefcea02a4384ca0a7a2e5fd5df983e35bf9a1488b8383251122191a30d6222f2a5796f259bcdf009bd3a4a8ef
|
7
|
+
data.tar.gz: 65763873d5038ad0eacb535732c9f0e395f91959b5328eb1726d3bd3e4aa7ee3af77bd5d6f93e398b4a60406f099a89e5952e61ff49e7d7d133524551e67a274
|
data/lib/crabfarm.rb
CHANGED
@@ -5,7 +5,7 @@ require "selenium-webdriver"
|
|
5
5
|
require "crabfarm/version"
|
6
6
|
require "crabfarm/errors"
|
7
7
|
require "crabfarm/configuration"
|
8
|
-
require "crabfarm/
|
8
|
+
require "crabfarm/loader_service"
|
9
9
|
require "crabfarm/driver_bucket"
|
10
10
|
require "crabfarm/driver_bucket_pool"
|
11
11
|
require "crabfarm/default_driver_factory"
|
@@ -16,9 +16,19 @@ require "crabfarm/context"
|
|
16
16
|
require "crabfarm/base_state"
|
17
17
|
require "crabfarm/base_parser"
|
18
18
|
require "crabfarm/strategies"
|
19
|
-
require "crabfarm/loader"
|
20
19
|
|
21
20
|
module Crabfarm
|
21
|
+
|
22
|
+
@@config = Configuration.new
|
23
|
+
|
24
|
+
def self.config
|
25
|
+
@@config
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.read_crabfile(_path)
|
29
|
+
@@config.instance_eval File.read _path
|
30
|
+
end
|
31
|
+
|
22
32
|
module Strategies
|
23
33
|
# bundled browser dsl adapters
|
24
34
|
register :browser_dsl, :surfer, 'Crabfarm::SurferBrowserDsl', 'crabfarm/adapters/browser/surfer'
|
data/lib/crabfarm/base_parser.rb
CHANGED
@@ -7,8 +7,8 @@ module Crabfarm
|
|
7
7
|
@browser_dsl = _dsl
|
8
8
|
end
|
9
9
|
|
10
|
-
def initialize(
|
11
|
-
dsl_class = Strategies.load(:browser_dsl, class_browser_dsl ||
|
10
|
+
def initialize(_driver, _params)
|
11
|
+
dsl_class = Strategies.load(:browser_dsl, class_browser_dsl || Crabfarm.config.browser_dsl)
|
12
12
|
@browser = dsl_class.wrap _driver
|
13
13
|
@params = _params
|
14
14
|
|
data/lib/crabfarm/base_state.rb
CHANGED
@@ -18,14 +18,13 @@ module Crabfarm
|
|
18
18
|
@class_output_builder = _builder
|
19
19
|
end
|
20
20
|
|
21
|
-
def initialize(
|
22
|
-
@module = _module
|
21
|
+
def initialize(_pool, _store, _params)
|
23
22
|
@pool = _pool
|
24
23
|
@store = _store
|
25
24
|
@params = _params
|
26
25
|
|
27
|
-
@dsl = Strategies.load(:browser_dsl, class_browser_dsl ||
|
28
|
-
@builder = Strategies.load(:output_builder, class_output_builder ||
|
26
|
+
@dsl = Strategies.load(:browser_dsl, class_browser_dsl || Crabfarm.config.browser_dsl)
|
27
|
+
@builder = Strategies.load(:output_builder, class_output_builder || Crabfarm.config.output_builder)
|
29
28
|
end
|
30
29
|
|
31
30
|
def browser(_name=nil)
|
data/lib/crabfarm/cli.rb
CHANGED
@@ -13,11 +13,11 @@ module Crabfarm
|
|
13
13
|
Support::GLI.generate_options c
|
14
14
|
|
15
15
|
c.action do |global_options,options,args|
|
16
|
-
next puts "This command can only be run inside a crabfarm application" unless defined?
|
16
|
+
next puts "This command can only be run inside a crabfarm application" unless defined? CF_PATH
|
17
17
|
|
18
18
|
require "crabfarm/modes/console"
|
19
|
-
|
20
|
-
Crabfarm::Modes::Console.start
|
19
|
+
Crabfarm.config.set Support::GLI.parse_options options
|
20
|
+
Crabfarm::Modes::Console.start
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -32,10 +32,13 @@ module Crabfarm
|
|
32
32
|
c.desc "Set the server min and max threads, defaults to 0:16"
|
33
33
|
c.flag [:t,:threads]
|
34
34
|
|
35
|
+
c.desc "Activate code reload before every request"
|
36
|
+
c.switch :reload, :default_value => true
|
37
|
+
|
35
38
|
Support::GLI.generate_options c
|
36
39
|
|
37
40
|
c.action do |global_options,options,args|
|
38
|
-
next puts "This command can only be run inside a crabfarm application" unless defined?
|
41
|
+
next puts "This command can only be run inside a crabfarm application" unless defined? CF_PATH
|
39
42
|
|
40
43
|
require "crabfarm/modes/server"
|
41
44
|
server_options = {}
|
@@ -43,8 +46,9 @@ module Crabfarm
|
|
43
46
|
server_options[:Port] = options[:port] || 3100
|
44
47
|
server_options[:Threads] = options[:threads] unless options[:threads].nil?
|
45
48
|
|
46
|
-
|
47
|
-
Crabfarm::
|
49
|
+
ActiveSupport::Dependencies.mechanism = :require unless options[:reload]
|
50
|
+
Crabfarm.config.set Support::GLI.parse_options options
|
51
|
+
Crabfarm::Modes::Server.start server_options
|
48
52
|
end
|
49
53
|
end
|
50
54
|
|
data/lib/crabfarm/context.rb
CHANGED
@@ -6,14 +6,13 @@ module Crabfarm
|
|
6
6
|
|
7
7
|
def_delegators :@pool, :driver
|
8
8
|
|
9
|
-
def initialize
|
10
|
-
@
|
11
|
-
@
|
12
|
-
@store = StateStore.new @module
|
9
|
+
def initialize
|
10
|
+
@pool = DriverBucketPool.new
|
11
|
+
@store = StateStore.new
|
13
12
|
end
|
14
13
|
|
15
14
|
def run_state(_name, _params={})
|
16
|
-
state =
|
15
|
+
state = LoaderService.load_state(_name).new @pool, @store, _params
|
17
16
|
state.crawl
|
18
17
|
state
|
19
18
|
end
|
@@ -11,6 +11,9 @@ module Crabfarm
|
|
11
11
|
raise ConfigurationError.new 'must provide a webdriver type' if driver_name.nil?
|
12
12
|
|
13
13
|
case driver_name
|
14
|
+
when :noop
|
15
|
+
require "crabfarm/mocks/noop_driver"
|
16
|
+
driver = Crabfarm::Mocks::NoopDriver.new # TODO: improve dummy driver...
|
14
17
|
when :remote
|
15
18
|
# setup a custom client to use longer timeouts
|
16
19
|
client = Selenium::WebDriver::Remote::Http::Default.new
|
@@ -3,8 +3,7 @@ module Crabfarm
|
|
3
3
|
|
4
4
|
attr_reader :session_id
|
5
5
|
|
6
|
-
def initialize(
|
7
|
-
@module = _module
|
6
|
+
def initialize(_session_id, _factory)
|
8
7
|
@session_id = _session_id
|
9
8
|
@factory = _factory
|
10
9
|
@driver = nil
|
@@ -16,8 +15,8 @@ module Crabfarm
|
|
16
15
|
end
|
17
16
|
|
18
17
|
def parse(_parser_class, _options={})
|
19
|
-
_parser_class =
|
20
|
-
parser = _parser_class.new
|
18
|
+
_parser_class = LoaderService.load_parser(_parser_class) if _parser_class.is_a? String or _parser_class.is_a? Symbol
|
19
|
+
parser = _parser_class.new self, _options
|
21
20
|
parser.parse
|
22
21
|
return parser
|
23
22
|
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
module Crabfarm
|
2
2
|
class DriverBucketPool
|
3
3
|
|
4
|
-
def initialize
|
5
|
-
@module = _module
|
4
|
+
def initialize
|
6
5
|
@buckets = Hash.new
|
7
6
|
@phantom = nil
|
8
7
|
|
@@ -12,7 +11,7 @@ module Crabfarm
|
|
12
11
|
def driver(_session_id=nil)
|
13
12
|
_session_id ||= :default_driver
|
14
13
|
bucket = @buckets[_session_id.to_sym]
|
15
|
-
bucket = @buckets[_session_id.to_sym] = DriverBucket.new(
|
14
|
+
bucket = @buckets[_session_id.to_sym] = DriverBucket.new(_session_id, build_driver_factory) if bucket.nil?
|
16
15
|
bucket
|
17
16
|
end
|
18
17
|
|
@@ -29,20 +28,24 @@ module Crabfarm
|
|
29
28
|
private
|
30
29
|
|
31
30
|
def init_phantom_if_required
|
32
|
-
if
|
33
|
-
@phantom = PhantomRunner.new
|
31
|
+
if config.phantom_mode_enabled?
|
32
|
+
@phantom = PhantomRunner.new config.phantom_config
|
34
33
|
@phantom.start
|
35
34
|
end
|
36
35
|
end
|
37
36
|
|
38
37
|
def build_driver_factory
|
39
|
-
if
|
40
|
-
PhantomDriverFactory.new @phantom,
|
38
|
+
if config.phantom_mode_enabled?
|
39
|
+
PhantomDriverFactory.new @phantom, config.driver_config
|
41
40
|
else
|
42
|
-
return
|
43
|
-
DefaultDriverFactory.new
|
41
|
+
return config.driver_factory if config.driver_factory
|
42
|
+
DefaultDriverFactory.new config.driver_config
|
44
43
|
end
|
45
44
|
end
|
46
45
|
|
46
|
+
def config
|
47
|
+
Crabfarm.config
|
48
|
+
end
|
49
|
+
|
47
50
|
end
|
48
51
|
end
|
@@ -1,11 +1,12 @@
|
|
1
|
+
require 'benchmark'
|
1
2
|
require 'ostruct'
|
2
3
|
|
3
4
|
module Crabfarm
|
4
5
|
module Engines
|
5
6
|
class SafeStateLoop
|
6
7
|
|
7
|
-
def initialize
|
8
|
-
@context =
|
8
|
+
def initialize
|
9
|
+
@context = Crabfarm::Context.new
|
9
10
|
@running = true
|
10
11
|
@working = false
|
11
12
|
@lock = Mutex.new
|
@@ -21,6 +22,7 @@ module Crabfarm
|
|
21
22
|
def change_state(_name, _params={}, _wait=nil)
|
22
23
|
@lock.synchronize {
|
23
24
|
raise StillWorkingError.new if @working
|
25
|
+
# TODO: test class reloading here?
|
24
26
|
@next_state_name = _name
|
25
27
|
@next_state_params = _params
|
26
28
|
@working = true
|
@@ -69,20 +71,24 @@ module Crabfarm
|
|
69
71
|
OpenStruct.new({
|
70
72
|
name: @state_name,
|
71
73
|
params: @state_params,
|
72
|
-
doc: @doc
|
74
|
+
doc: @doc,
|
75
|
+
elapsed: @elapsed
|
73
76
|
})
|
74
77
|
end
|
75
78
|
|
76
79
|
def crawl_loop
|
77
80
|
while @running
|
78
81
|
if @working
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
82
|
+
@elapsed = Benchmark.measure do
|
83
|
+
begin
|
84
|
+
ActiveSupport::Dependencies.clear
|
85
|
+
@doc = @context.run_state(@next_state_name, @next_state_params).output_as_json
|
86
|
+
@error = nil
|
87
|
+
rescue Exception => e
|
88
|
+
@doc = nil
|
89
|
+
@error = e
|
90
|
+
end
|
91
|
+
end.real
|
86
92
|
|
87
93
|
@state_name = @next_state_name
|
88
94
|
@state_params = @next_state_params
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Crabfarm
|
2
|
+
class LoaderService
|
3
|
+
|
4
|
+
def self.load_state(_name)
|
5
|
+
load_entity _name, 'state', BaseState
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.load_parser(_name)
|
9
|
+
load_entity _name, 'parser', BaseParser
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def self.load_entity(_name, _role, _type)
|
15
|
+
|
16
|
+
if _name.is_a? String or _name.is_a? Symbol
|
17
|
+
name = _name.to_s.gsub(/[^A-Z0-9:]+/i, '_').camelize
|
18
|
+
mod = name.constantize rescue nil
|
19
|
+
else
|
20
|
+
mod = _name
|
21
|
+
end
|
22
|
+
|
23
|
+
raise EntityNotFoundError.new _role, name if mod.nil?
|
24
|
+
raise EntityNotFoundError.new _role, name unless mod < _type
|
25
|
+
mod
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'benchmark'
|
1
2
|
require 'readline'
|
2
3
|
require 'rainbow'
|
3
4
|
require 'rainbow/ext/string'
|
@@ -11,8 +12,7 @@ module Crabfarm
|
|
11
12
|
|
12
13
|
attr_reader :context
|
13
14
|
|
14
|
-
def initialize
|
15
|
-
@loader = _loader
|
15
|
+
def initialize
|
16
16
|
reload!
|
17
17
|
end
|
18
18
|
|
@@ -20,10 +20,10 @@ module Crabfarm
|
|
20
20
|
unless @context.nil?
|
21
21
|
puts "Reloading crawler source".color(:green)
|
22
22
|
@context.release
|
23
|
-
|
23
|
+
ActiveSupport::Dependencies.clear
|
24
24
|
end
|
25
25
|
|
26
|
-
@context =
|
26
|
+
@context = Crabfarm::Context.new
|
27
27
|
end
|
28
28
|
|
29
29
|
def transition(_name=nil, _params={})
|
@@ -33,8 +33,14 @@ module Crabfarm
|
|
33
33
|
end
|
34
34
|
|
35
35
|
begin
|
36
|
-
|
37
|
-
|
36
|
+
elapsed = Benchmark.measure do
|
37
|
+
puts "Transitioning to #{_name.to_s.camelize} state"
|
38
|
+
doc = @context.run_state(_name, _params).output_as_json
|
39
|
+
|
40
|
+
puts "State changed, generated document:"
|
41
|
+
puts JSON.pretty_generate(doc).color(:green).gsub(/(^|\\n)/, ' ')
|
42
|
+
end
|
43
|
+
puts "Completed in #{elapsed.real} s"
|
38
44
|
rescue EntityNotFoundError => e
|
39
45
|
puts "#{e.to_s}".color(:red)
|
40
46
|
rescue => e
|
@@ -56,8 +62,8 @@ module Crabfarm
|
|
56
62
|
alias :r :reset
|
57
63
|
end
|
58
64
|
|
59
|
-
def self.start
|
60
|
-
dsl = ConsoleDsl.new
|
65
|
+
def self.start
|
66
|
+
dsl = ConsoleDsl.new
|
61
67
|
|
62
68
|
loop do
|
63
69
|
begin
|
@@ -33,16 +33,16 @@ module Crabfarm
|
|
33
33
|
def generate_state(_name)
|
34
34
|
with_crawler_path do
|
35
35
|
binding = { state_class: _name.camelize }
|
36
|
-
path('app', 'states', _name.
|
37
|
-
path('spec', 'states', _name.
|
36
|
+
path('app', 'states', _name.underscore + '.rb').render('state.rb', binding)
|
37
|
+
path('spec', 'states', _name.underscore + '_spec.rb').render('state_spec.rb', binding)
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
41
|
def generate_parser(_name)
|
42
42
|
with_crawler_path do
|
43
43
|
binding = { parser_class: _name.camelize }
|
44
|
-
path('app', 'parsers', _name.
|
45
|
-
path('spec', 'parsers', _name.
|
44
|
+
path('app', 'parsers', _name.underscore + '.rb').render('parser.rb', binding)
|
45
|
+
path('spec', 'parsers', _name.underscore + '_spec.rb').render('parser_spec.rb', binding)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -77,18 +77,16 @@ module Crabfarm
|
|
77
77
|
self
|
78
78
|
end
|
79
79
|
|
80
|
-
|
81
|
-
|
82
80
|
private
|
83
81
|
|
84
82
|
def generate_dir(_path, _silent)
|
85
83
|
path = File.join(*_path)
|
86
84
|
dir = Pathname.new path
|
87
85
|
unless dir.exist?
|
88
|
-
|
86
|
+
render_op "mkdir", path, :green
|
89
87
|
dir.mkpath
|
90
88
|
else
|
91
|
-
|
89
|
+
render_op "skip", path, :yellow unless _silent
|
92
90
|
end
|
93
91
|
end
|
94
92
|
|
@@ -97,13 +95,13 @@ module Crabfarm
|
|
97
95
|
output = File.join(*_path)
|
98
96
|
|
99
97
|
unless Pathname.new(output).exist?
|
100
|
-
|
98
|
+
render_op "render", output, :green
|
101
99
|
File.open(output, "w") do |f|
|
102
100
|
f.write eval_template_with_hash(template, _binding)
|
103
101
|
f.chmod(_mod) unless _mod.nil?
|
104
102
|
end
|
105
103
|
else
|
106
|
-
|
104
|
+
render_op "skip", output, :yellow
|
107
105
|
end
|
108
106
|
end
|
109
107
|
|
@@ -115,6 +113,10 @@ module Crabfarm
|
|
115
113
|
def template_dir
|
116
114
|
File.expand_path('../../templates', __FILE__)
|
117
115
|
end
|
116
|
+
|
117
|
+
def render_op(_op, _message, _color)
|
118
|
+
puts _op.rjust(10).color(_color) + ' ' + _message
|
119
|
+
end
|
118
120
|
end
|
119
121
|
end
|
120
122
|
end
|
@@ -34,7 +34,8 @@ module Crabfarm
|
|
34
34
|
{
|
35
35
|
name: _state.name,
|
36
36
|
params: _state.params,
|
37
|
-
doc: _state.doc
|
37
|
+
doc: _state.doc,
|
38
|
+
elapsed: _state.elapsed
|
38
39
|
}
|
39
40
|
end
|
40
41
|
end
|
@@ -61,8 +62,8 @@ module Crabfarm
|
|
61
62
|
@@evaluator
|
62
63
|
end
|
63
64
|
|
64
|
-
def self.start(
|
65
|
-
@@evaluator = Engines::SafeStateLoop.new
|
65
|
+
def self.start(_options)
|
66
|
+
@@evaluator = Engines::SafeStateLoop.new
|
66
67
|
begin
|
67
68
|
Support::CustomPuma.run API, _options
|
68
69
|
ensure
|
data/lib/crabfarm/rspec.rb
CHANGED
data/lib/crabfarm/state_store.rb
CHANGED
@@ -4,9 +4,13 @@ require 'bundler'
|
|
4
4
|
|
5
5
|
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __FILE__)
|
6
6
|
Bundler.setup
|
7
|
-
require 'crabfarm'
|
8
|
-
|
9
|
-
# Run code loader
|
10
7
|
|
11
8
|
CF_PATH = File.expand_path('../', __FILE__)
|
12
|
-
|
9
|
+
|
10
|
+
# Setup code autoloading
|
11
|
+
require 'active_support/dependencies'
|
12
|
+
ActiveSupport::Dependencies.autoload_paths += Dir.glob File.join(CF_PATH, 'app', '**')
|
13
|
+
|
14
|
+
# Load crabfarm framework and configuration
|
15
|
+
require 'crabfarm'
|
16
|
+
Crabfarm.read_crabfile File.join(CF_PATH, 'Crabfile')
|
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.0.
|
4
|
+
version: 0.0.8
|
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-01-
|
11
|
+
date: 2015-01-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jbuilder
|
@@ -310,11 +310,11 @@ files:
|
|
310
310
|
- lib/crabfarm/engines/safe_state_loop.rb
|
311
311
|
- lib/crabfarm/errors.rb
|
312
312
|
- lib/crabfarm/forked_state.rb
|
313
|
-
- lib/crabfarm/
|
313
|
+
- lib/crabfarm/loader_service.rb
|
314
|
+
- lib/crabfarm/mocks/noop_driver.rb
|
314
315
|
- lib/crabfarm/modes/console.rb
|
315
316
|
- lib/crabfarm/modes/generator.rb
|
316
317
|
- lib/crabfarm/modes/server.rb
|
317
|
-
- lib/crabfarm/module_helper.rb
|
318
318
|
- lib/crabfarm/phantom_driver_factory.rb
|
319
319
|
- lib/crabfarm/phantom_runner.rb
|
320
320
|
- lib/crabfarm/rspec.rb
|
data/lib/crabfarm/loader.rb
DELETED
@@ -1,97 +0,0 @@
|
|
1
|
-
require 'active_support'
|
2
|
-
|
3
|
-
module Crabfarm
|
4
|
-
|
5
|
-
class Loader
|
6
|
-
|
7
|
-
attr_reader :module
|
8
|
-
|
9
|
-
def initialize(_base_path, _module=Object)
|
10
|
-
@path = _base_path
|
11
|
-
@module = _module
|
12
|
-
@config = nil
|
13
|
-
@source_loaded = false
|
14
|
-
end
|
15
|
-
|
16
|
-
def load(_overrides=nil)
|
17
|
-
load_config _overrides
|
18
|
-
load_source
|
19
|
-
end
|
20
|
-
|
21
|
-
def load_config(_overrides=nil)
|
22
|
-
raise ConfigurationError.new 'Source already loaded, call unload_source first' if @source_loaded
|
23
|
-
raise ConfigurationError.new 'Crabfile not found' unless File.exists? crafile_path
|
24
|
-
|
25
|
-
@config = read_crabfile crafile_path
|
26
|
-
@config.set _overrides unless _overrides.nil?
|
27
|
-
end
|
28
|
-
|
29
|
-
def load_source
|
30
|
-
raise ConfigurationError.new 'Crabfile must be loaded first' if @config.nil?
|
31
|
-
raise ConfigurationError.new 'Source already loaded, call reload_source instead' if @source_loaded
|
32
|
-
|
33
|
-
require_from_path source_path
|
34
|
-
@source_loaded = true
|
35
|
-
end
|
36
|
-
|
37
|
-
def unload_source
|
38
|
-
# TODO: unload every class in a list
|
39
|
-
@source_loaded = false
|
40
|
-
end
|
41
|
-
|
42
|
-
def reload_source
|
43
|
-
unload_source if @source_loaded
|
44
|
-
load_source
|
45
|
-
end
|
46
|
-
|
47
|
-
def is_loaded?
|
48
|
-
@source_loaded
|
49
|
-
end
|
50
|
-
|
51
|
-
def load_context(_overrides={})
|
52
|
-
raise ConfigurationError.new 'Must load source first' unless @source_loaded
|
53
|
-
Context.new ModuleHelper.new @module, @config
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def crafile_path
|
59
|
-
File.join @path, 'Crabfile'
|
60
|
-
end
|
61
|
-
|
62
|
-
def source_path
|
63
|
-
File.join @path, 'app'
|
64
|
-
end
|
65
|
-
|
66
|
-
def read_crabfile(_path)
|
67
|
-
config = Configuration.new
|
68
|
-
config.instance_eval File.read crafile_path
|
69
|
-
return config
|
70
|
-
end
|
71
|
-
|
72
|
-
def require_from_path(_src_path)
|
73
|
-
@module.module_eval do
|
74
|
-
# TODO: put every loaded class in a list, store last update or hash so next time is required
|
75
|
-
# it can be reloaded automatically.
|
76
|
-
|
77
|
-
pending = Dir.glob(File.join(_src_path, '**/*')).select { |f| f.end_with? '.rb' }.map { |f| f[0...-3] }
|
78
|
-
|
79
|
-
while pending.size > 0
|
80
|
-
new_pending = []
|
81
|
-
pending.each do |file|
|
82
|
-
begin
|
83
|
-
require file
|
84
|
-
rescue NameError => e
|
85
|
-
new_pending << file
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
require new_pending.first if new_pending.size == pending.size
|
90
|
-
pending = new_pending
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
end
|
96
|
-
|
97
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'active_support'
|
2
|
-
|
3
|
-
module Crabfarm
|
4
|
-
class ModuleHelper
|
5
|
-
|
6
|
-
attr_reader :dsl
|
7
|
-
|
8
|
-
def initialize(_module, _config=nil)
|
9
|
-
@module = _module
|
10
|
-
@config = _config || @module::CF_CONFIG
|
11
|
-
end
|
12
|
-
|
13
|
-
def settings
|
14
|
-
@config
|
15
|
-
end
|
16
|
-
|
17
|
-
def load_state(_name)
|
18
|
-
load_entity _name, 'state', BaseState
|
19
|
-
end
|
20
|
-
|
21
|
-
def load_parser(_name)
|
22
|
-
load_entity _name, 'parser', BaseParser
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def load_entity(_name, _role, _type)
|
28
|
-
name = _name.to_s.gsub(/[^A-Z0-9:]+/i, '_').camelize
|
29
|
-
mod = @module.const_get(name) rescue nil
|
30
|
-
raise EntityNotFoundError.new _role, name if mod.nil?
|
31
|
-
raise EntityNotFoundError.new _role, name unless mod < _type
|
32
|
-
mod
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
end
|