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