crabfarm 0.0.6 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 591615890c50a205b34d45a201987d95f4ae3fae
4
- data.tar.gz: f67f0538057b4708da26bd00a52ef4bcfaa7bd34
3
+ metadata.gz: 2c6a40d52475ec34390f4dca75207062dfdae26b
4
+ data.tar.gz: 9b298a6d3b4eb50d42eb153c274b638dff02ed63
5
5
  SHA512:
6
- metadata.gz: ee2b73e89eef91889cdeb754dfe527fcbae9e4f2491e1d3c71169d5bcee7e2f0e42c1797a2299a756af24c87a74756f85c298354e009622395a0d218e83f5212
7
- data.tar.gz: 4a0aee39da4bb582b025d417da92a57ba9269f1f5baf287c121369106494e4248cd761a121f662ea09bbe0acaa38d000a37d2e4049bcffed05f871cb1cc6a662
6
+ metadata.gz: f2ecc793d6ec88e0dba2cbd806195fc1c94785cefcea02a4384ca0a7a2e5fd5df983e35bf9a1488b8383251122191a30d6222f2a5796f259bcdf009bd3a4a8ef
7
+ data.tar.gz: 65763873d5038ad0eacb535732c9f0e395f91959b5328eb1726d3bd3e4aa7ee3af77bd5d6f93e398b4a60406f099a89e5952e61ff49e7d7d133524551e67a274
@@ -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/module_helper"
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'
@@ -7,8 +7,8 @@ module Crabfarm
7
7
  @browser_dsl = _dsl
8
8
  end
9
9
 
10
- def initialize(_module, _driver, _params)
11
- dsl_class = Strategies.load(:browser_dsl, class_browser_dsl || _module.settings.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
 
@@ -18,14 +18,13 @@ module Crabfarm
18
18
  @class_output_builder = _builder
19
19
  end
20
20
 
21
- def initialize(_module, _pool, _store, _params)
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 || @module.settings.browser_dsl)
28
- @builder = Strategies.load(:output_builder, class_output_builder || @module.settings.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)
@@ -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? CF_LOADER
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
- CF_LOADER.load Support::GLI.parse_options options
20
- Crabfarm::Modes::Console.start CF_LOADER
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? CF_LOADER
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
- CF_LOADER.load Support::GLI.parse_options options
47
- Crabfarm::Modes::Server.start CF_LOADER, server_options
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
 
@@ -39,6 +39,10 @@ module Crabfarm
39
39
  end
40
40
 
41
41
  def initialize
42
+ reset
43
+ end
44
+
45
+ def reset
42
46
  @values = {
43
47
  browser_dsl: :surfer,
44
48
  output_builder: :hash,
@@ -6,14 +6,13 @@ module Crabfarm
6
6
 
7
7
  def_delegators :@pool, :driver
8
8
 
9
- def initialize(_module)
10
- @module = _module
11
- @pool = DriverBucketPool.new @module
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 = @module.load_state(_name).new @module, @pool, @store, _params
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(_module, _session_id, _factory)
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 = @module.load_parser(_parser_class) if _parser_class.is_a? String or _parser_class.is_a? Symbol
20
- parser = _parser_class.new @module, self, _options
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(_module)
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(@module, _session_id, build_driver_factory) if bucket.nil?
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 @module.settings.phantom_mode_enabled?
33
- @phantom = PhantomRunner.new @module.settings.phantom_config
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 @module.settings.phantom_mode_enabled?
40
- PhantomDriverFactory.new @phantom, @module.settings.driver_config
38
+ if config.phantom_mode_enabled?
39
+ PhantomDriverFactory.new @phantom, config.driver_config
41
40
  else
42
- return @module.settings.driver_factory if @module.settings.driver_factory
43
- DefaultDriverFactory.new @module.settings.driver_config
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(_loader)
8
- @context = _loader.load_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
- begin
80
- @doc = @context.run_state(@next_state_name, @next_state_params).output_as_json
81
- @error = nil
82
- rescue Exception => e
83
- @doc = nil
84
- @error = e
85
- end
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
@@ -0,0 +1,6 @@
1
+ module Crabfarm
2
+ module Mocks
3
+ class NoopDriver
4
+ end
5
+ end
6
+ 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(_loader)
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
- @loader.reload_source
23
+ ActiveSupport::Dependencies.clear
24
24
  end
25
25
 
26
- @context = @loader.load_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
- doc = @context.run_state(_name, _params).output_as_json
37
- puts JSON.pretty_generate(doc).color(:green)
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(_loader)
60
- dsl = ConsoleDsl.new(_loader)
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.parameterize + '.rb').render('state.rb', binding)
37
- path('spec', 'states', _name.parameterize + '_spec.rb').render('state_spec.rb', binding)
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.parameterize + '.rb').render('parser.rb', binding)
45
- path('spec', 'parsers', _name.parameterize + '_spec.rb').render('parser_spec.rb', binding)
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
- puts "Generating #{path}".color(:green)
86
+ render_op "mkdir", path, :green
89
87
  dir.mkpath
90
88
  else
91
- puts "Skipping #{path}".color(:yellow) unless _silent
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
- puts "Rendering #{output}".color(:green)
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
- puts "Skipping #{output}, already exists".color(:yellow)
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(_loader, _options)
65
- @@evaluator = Engines::SafeStateLoop.new _loader
65
+ def self.start(_options)
66
+ @@evaluator = Engines::SafeStateLoop.new
66
67
  begin
67
68
  Support::CustomPuma.run API, _options
68
69
  ensure
@@ -1,6 +1,4 @@
1
- CF_LOADER.load
2
-
3
- CF_TEST_CONTEXT = CF_LOADER.load_context
1
+ CF_TEST_CONTEXT = Crabfarm::Context::new
4
2
  CF_TEST_BUCKET = CF_TEST_CONTEXT.driver
5
3
 
6
4
  module Crabfarm
@@ -3,7 +3,7 @@ require 'active_support'
3
3
  module Crabfarm
4
4
  class StateStore
5
5
 
6
- def initialize(_module)
6
+ def initialize
7
7
  reset
8
8
  end
9
9
 
@@ -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
- CF_LOADER = Crabfarm::Loader.new CF_PATH
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')
@@ -1,3 +1,3 @@
1
1
  module Crabfarm
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.8"
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.0.6
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-08 00:00:00.000000000 Z
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/loader.rb
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
@@ -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