legionio 0.3.1 → 0.4.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/.circleci/config.yml +27 -10
- data/.gitignore +1 -0
- data/.rubocop.yml +7 -2
- data/CHANGELOG.md +21 -0
- data/Dockerfile +9 -0
- data/Gemfile +0 -11
- data/README.md +158 -42
- data/Rakefile +0 -6
- data/bitbucket-pipelines.yml +17 -52
- data/docker_deploy.rb +8 -0
- data/exe/legion +3 -49
- data/{bin/legion → exe/legionio} +5 -42
- data/exe/lex_gen +5 -0
- data/{legion.gemspec → legionio.gemspec} +25 -20
- data/lib/legion.rb +4 -0
- data/lib/legion/cli.rb +56 -0
- data/lib/legion/cli/chain.rb +35 -0
- data/lib/legion/cli/cohort.rb +10 -0
- data/lib/legion/cli/function.rb +41 -0
- data/lib/legion/cli/lex/actor.rb +31 -0
- data/lib/legion/cli/lex/exchange.rb +32 -0
- data/lib/legion/cli/lex/message.rb +32 -0
- data/lib/legion/cli/lex/queue.rb +45 -0
- data/lib/legion/cli/lex/runner.rb +70 -0
- data/lib/legion/cli/lex/templates/actor.erb +6 -0
- data/lib/legion/cli/lex/templates/actor_spec.erb +0 -0
- data/lib/legion/cli/lex/templates/base/bitbucket.yml.erb +69 -0
- data/lib/legion/cli/lex/templates/base/gemfile.erb +3 -0
- data/lib/legion/cli/lex/templates/base/gemspec.erb +26 -0
- data/lib/legion/cli/lex/templates/base/gitignore.erb +11 -0
- data/lib/legion/cli/lex/templates/base/lex.erb +9 -0
- data/lib/legion/cli/lex/templates/base/lex_spec.erb +5 -0
- data/lib/legion/cli/lex/templates/base/lic.erb +21 -0
- data/lib/legion/cli/lex/templates/base/rakefile.erb +6 -0
- data/lib/legion/cli/lex/templates/base/readme.md.erb +2 -0
- data/lib/legion/cli/lex/templates/base/rubocop.yml.erb +15 -0
- data/lib/legion/cli/lex/templates/base/spec_helper.rb.erb +11 -0
- data/lib/legion/cli/lex/templates/base/version.erb +7 -0
- data/lib/legion/cli/lex/templates/exchange.erb +11 -0
- data/lib/legion/cli/lex/templates/exchange_spec.erb +0 -0
- data/lib/legion/cli/lex/templates/message.erb +23 -0
- data/lib/legion/cli/lex/templates/message_spec.erb +0 -0
- data/lib/legion/cli/lex/templates/queue.erb +12 -0
- data/lib/legion/cli/lex/templates/queue_helper.erb +24 -0
- data/lib/legion/cli/lex/templates/queue_spec.erb +11 -0
- data/lib/legion/cli/lex/templates/runner.erb +11 -0
- data/lib/legion/cli/lex/templates/runner_spec.erb +11 -0
- data/lib/legion/cli/relationship.rb +22 -0
- data/lib/legion/cli/task.rb +49 -0
- data/lib/legion/cli/trigger.rb +88 -0
- data/lib/legion/cli/version.rb +5 -0
- data/lib/legion/extensions.rb +57 -62
- data/lib/legion/extensions/actors/base.rb +0 -2
- data/lib/legion/extensions/actors/poll.rb +0 -1
- data/lib/legion/extensions/actors/subscription.rb +1 -0
- data/lib/legion/extensions/builders/runners.rb +5 -0
- data/lib/legion/extensions/core.rb +9 -4
- data/lib/legion/extensions/helpers/base.rb +3 -3
- data/lib/legion/extensions/helpers/lex.rb +29 -1
- data/lib/legion/extensions/helpers/logger.rb +3 -6
- data/lib/legion/extensions/helpers/task.rb +1 -1
- data/lib/legion/extensions/transport.rb +9 -7
- data/lib/legion/lex.rb +89 -0
- data/lib/legion/service.rb +55 -4
- data/lib/legion/version.rb +1 -1
- metadata +196 -51
- data/bin/console +0 -16
- data/bin/setup +0 -8
- data/bin/test +0 -32
- data/lib/legion/exceptions/handled_task.rb +0 -6
- data/lib/legion/exceptions/invalidjson.rb +0 -5
- data/lib/legion/exceptions/missingargument.rb +0 -6
- data/lib/legion/exceptions/wrongtype.rb +0 -10
- data/lib/legion/exceptions/wrongtypes/array.rb +0 -8
- data/lib/legion/exceptions/wrongtypes/hash.rb +0 -8
- data/lib/legion/exceptions/wrongtypes/integer.rb +0 -8
- data/lib/legion/exceptions/wrongtypes/string.rb +0 -8
- data/settings/client.json +0 -25
@@ -0,0 +1,22 @@
|
|
1
|
+
module Legion
|
2
|
+
class Cli
|
3
|
+
class Relationship < Thor
|
4
|
+
desc 'create', 'creates a new relationship'
|
5
|
+
def create(_name, _type)
|
6
|
+
trigger_id = invoke('legion:cli:function:find', [], internal: true, capture: true) # rubocop:disable Lint/UselessAssignment
|
7
|
+
end
|
8
|
+
|
9
|
+
desc 'activate', 'actives a relationship'
|
10
|
+
def active; end
|
11
|
+
|
12
|
+
desc 'deactivate', 'deactivates a relationship'
|
13
|
+
def deactivate; end
|
14
|
+
|
15
|
+
desc 'modify', 'modify an existing relationship'
|
16
|
+
def modify; end
|
17
|
+
|
18
|
+
desc 'delete', 'deletes a relationship'
|
19
|
+
def delete; end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Legion
|
2
|
+
class Cli
|
3
|
+
class Task < Thor
|
4
|
+
package_name 'Legion'
|
5
|
+
|
6
|
+
option :limit, type: :numeric, required: true, default: 10, desc: 'how many tasks to return'
|
7
|
+
desc 'show', 'show'
|
8
|
+
option :status, type: :string, required: false, desc: 'search for specific status'
|
9
|
+
def show
|
10
|
+
Legion::Service.new(cache: false, crypt: false, extensions: false, log_level: 'error')
|
11
|
+
rows = [%w[id relationship function status]]
|
12
|
+
Legion::Data::Model::Task.limit(options[:limit]).order(:id).reverse_each do |row|
|
13
|
+
rows.push([row.values[:id], row.values[:relationship_id], row.values[:function_id], row.values[:status]])
|
14
|
+
end
|
15
|
+
|
16
|
+
print_table rows
|
17
|
+
end
|
18
|
+
|
19
|
+
desc 'test', 'test'
|
20
|
+
def status(id)
|
21
|
+
Legion::Service.new(cache: false, crypt: false, extensions: false, log_level: 'error')
|
22
|
+
say Legion::Data::Model::Task[id].values
|
23
|
+
end
|
24
|
+
|
25
|
+
desc 'logs', 'logs'
|
26
|
+
option :limit, type: :numeric, required: true, default: 10, desc: 'how many tasks to return'
|
27
|
+
def logs(id)
|
28
|
+
Legion::Service.new(cache: false, crypt: false, extensions: false, log_level: 'error')
|
29
|
+
rows = [%w[id node_id created entry]]
|
30
|
+
Legion::Data::Model::TaskLog.where(task_id: id).limit(options[:limit]).each do |row|
|
31
|
+
rows.push([row.values[:id], row.values[:node_id], row.values[:created], row.values[:entry]])
|
32
|
+
end
|
33
|
+
print_table rows
|
34
|
+
end
|
35
|
+
|
36
|
+
desc 'purge', 'purge'
|
37
|
+
def purge
|
38
|
+
Legion::Service.new(cache: false, crypt: false, extensions: false, log_level: 'error')
|
39
|
+
days = ask 'how many days do you want to keep?', default: 7
|
40
|
+
dataset = Legion::Data::Model::Task.where { created < DateTime.now - days.to_i }
|
41
|
+
yes? "This will delete #{dataset.count} tasks, continue?", :red
|
42
|
+
dataset.delete
|
43
|
+
say 'Done!'
|
44
|
+
end
|
45
|
+
|
46
|
+
default_task :show
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Legion
|
2
|
+
class Cli
|
3
|
+
class Trigger < Thor
|
4
|
+
desc 'queue', 'used to send a job directly to a worker via Legion::Transport'
|
5
|
+
option :extension, type: :string, required: false, desc: 'extension short name'
|
6
|
+
option :runner, type: :string, required: false, desc: 'runner short name'
|
7
|
+
option :function, type: :string, required: false, desc: 'function short name'
|
8
|
+
option :delay, type: :numeric, default: 0, desc: 'how long to wait before running the task'
|
9
|
+
def queue(*args) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity,Metrics/MethodLength
|
10
|
+
Legion::Service.new(cache: false, crypt: false, extensions: false, log_level: 'error')
|
11
|
+
include Legion::Extensions::Helpers::Task
|
12
|
+
response = if options['extension'].is_a? String
|
13
|
+
options[:extension]
|
14
|
+
else
|
15
|
+
ask 'trigger extension?', limited_to: Legion::Data::Model::Extension.map(:name)
|
16
|
+
end
|
17
|
+
trigger_extension = Legion::Data::Model::Extension.where(name: response).first
|
18
|
+
runners = Legion::Data::Model::Runner.where(extension_id: trigger_extension.values[:id])
|
19
|
+
if runners.count == 1
|
20
|
+
trigger_runner = runners.first
|
21
|
+
say "Auto selecting #{trigger_runner.values[:name]} since it is the only option for runners"
|
22
|
+
else
|
23
|
+
response = options[:runner].is_a?(String) ? options[:runner] : ask('trigger runner?', limited_to: runners.map(:name))
|
24
|
+
trigger_runner = Legion::Data::Model::Runner.where(name: response).where(extension_id: trigger_extension.values[:id]).first
|
25
|
+
end
|
26
|
+
|
27
|
+
functions = Legion::Data::Model::Function.where(runner_id: trigger_runner.values[:id])
|
28
|
+
|
29
|
+
if functions.count == 1
|
30
|
+
trigger_function = functions.first
|
31
|
+
say "Auto selecting #{trigger_function.values[:name]} since it is the only option for functions"
|
32
|
+
else
|
33
|
+
response = if options[:function].is_a?(String)
|
34
|
+
options[:function]
|
35
|
+
else
|
36
|
+
ask('trigger function?',
|
37
|
+
limited_to: Legion::Data::Model::Function.where(runner_id: trigger_runner.values[:id]).map(:name))
|
38
|
+
end
|
39
|
+
trigger_function = Legion::Data::Model::Function.where(runner_id: trigger_runner.values[:id]).where(name: response).first
|
40
|
+
end
|
41
|
+
say "#{trigger_runner.values[:namespace]}.#{trigger_function.values[:name]} selected as trigger", :green, :italicized
|
42
|
+
payload = {}
|
43
|
+
auto_opts = {}
|
44
|
+
unless args.count.zero?
|
45
|
+
args.each do |arg|
|
46
|
+
test = arg.split(':')
|
47
|
+
auto_opts[test[0].to_sym] = test[1]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
Legion::JSON.load(trigger_function.values[:args]).each do |arg, required|
|
52
|
+
next if %w[args payload opts options].include? arg.to_s
|
53
|
+
|
54
|
+
if auto_opts.key? arg
|
55
|
+
payload[arg.to_sym] = auto_opts[arg]
|
56
|
+
next
|
57
|
+
end
|
58
|
+
response = ask "#{required == 'keyreq' ? '[required]' : '[optional]'} #{arg} value:"
|
59
|
+
if response.empty? && required == 'keyreq'
|
60
|
+
say "Error! #{arg} is required and cannot be empty", :red
|
61
|
+
redo
|
62
|
+
end
|
63
|
+
payload[arg.to_sym] = response unless response.empty?
|
64
|
+
end
|
65
|
+
|
66
|
+
status = options[:delay].zero? ? 'task.queued' : 'task.delayed'
|
67
|
+
task = generate_task_id(function_id: trigger_function.values[:id], status: status, runner_id: trigger_runner.values[:id], args: payload,
|
68
|
+
delay: options[:delay])
|
69
|
+
|
70
|
+
unless options[:delay].zero?
|
71
|
+
say "Task: #{task[:task_id]} is queued and will be run in #{options[:delay]}s"
|
72
|
+
return true
|
73
|
+
end
|
74
|
+
|
75
|
+
routing_key = "#{trigger_extension.values[:exchange]}.#{trigger_runner.values[:queue]}.#{trigger_function.values[:name]}"
|
76
|
+
exchange = Legion::Transport::Messages::Dynamic.new(function: trigger_function.values[:name], function_id: trigger_function.values[:id],
|
77
|
+
routing_key: routing_key, args: payload)
|
78
|
+
exchange.options[:task_id] = task[:task_id]
|
79
|
+
exchange.publish if options[:delay].zero?
|
80
|
+
|
81
|
+
say "Task: #{task[:task_id]} was queued"
|
82
|
+
end
|
83
|
+
remove_command :generate_task_id
|
84
|
+
|
85
|
+
default_task :queue
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
data/lib/legion/extensions.rb
CHANGED
@@ -54,6 +54,7 @@ module Legion
|
|
54
54
|
next
|
55
55
|
end
|
56
56
|
@loaded_extensions.push(extension)
|
57
|
+
sleep(0.1)
|
57
58
|
end
|
58
59
|
Legion::Logging.info "#{@extensions.count} extensions loaded with subscription:#{@subscription_tasks.count},every:#{@timer_tasks.count},poll:#{@poll_tasks.count},once:#{@once_tasks.count},loop:#{@loop_tasks.count}"
|
59
60
|
end
|
@@ -62,6 +63,21 @@ module Legion
|
|
62
63
|
return unless gem_load(values[:gem_name], extension)
|
63
64
|
|
64
65
|
extension = Kernel.const_get(values[:extension_class])
|
66
|
+
if extension.data_required? && Legion::Settings[:data][:connected] == false
|
67
|
+
Legion::Logging.warn "#{values[:extension_name]} requires Legion::Data but isn't enabled, skipping"
|
68
|
+
return false
|
69
|
+
end
|
70
|
+
|
71
|
+
if extension.cache_required? && Legion::Settings[:cache][:connected] == false
|
72
|
+
Legion::Logging.warn "#{values[:extension_name]} requires Legion::Cache but isn't enabled, skipping"
|
73
|
+
return false
|
74
|
+
end
|
75
|
+
|
76
|
+
if extension.vault_required? && Legion::Settings[:crypt][:vault][:connected] == false
|
77
|
+
Legion::Logging.warn "#{values[:extension_name]} requires Legion::Crypt::Vault but isn't enabled, skipping"
|
78
|
+
return false
|
79
|
+
end
|
80
|
+
|
65
81
|
has_logger = extension.respond_to?(:log)
|
66
82
|
extension.autobuild
|
67
83
|
|
@@ -109,6 +125,8 @@ module Legion
|
|
109
125
|
actor_class.new
|
110
126
|
end
|
111
127
|
|
128
|
+
return if extension_hash[:running_class].respond_to?(:enabled?) && !extension_hash[:running_class].enabled?
|
129
|
+
|
112
130
|
if actor_class.ancestors.include? Legion::Extensions::Actors::Every
|
113
131
|
@timer_tasks.push(extension_hash)
|
114
132
|
elsif actor_class.ancestors.include? Legion::Extensions::Actors::Once
|
@@ -136,8 +154,7 @@ module Legion
|
|
136
154
|
end
|
137
155
|
|
138
156
|
def gem_load(gem_name, name)
|
139
|
-
|
140
|
-
require gem_path
|
157
|
+
require "#{Gem::Specification.find_by_name(gem_name).gem_dir}/lib/legion/extensions/#{name}"
|
141
158
|
true
|
142
159
|
rescue LoadError => e
|
143
160
|
Legion::Logging.error e.message
|
@@ -148,62 +165,6 @@ module Legion
|
|
148
165
|
|
149
166
|
def find_extensions
|
150
167
|
@extensions ||= {}
|
151
|
-
# puts Gem.install('lex-esphome')
|
152
|
-
# puts Gem::Installer.new('lex-esphome')
|
153
|
-
# test = Gem::Installer.new('lex-esphome')
|
154
|
-
# puts test.install
|
155
|
-
# puts Gem::Dependency.new('lex-esphome')
|
156
|
-
# $LOAD_PATH << "#{ENV['GEM_HOME']}/gems/lex-esphome-0.1.0/lib"
|
157
|
-
# require 'legion/extensions/esphome'
|
158
|
-
# $LOAD_PATH << "#{ENV['GEM_HOME']}/gems/lex-esphome-0.1.0/lib"
|
159
|
-
# ENV['MY_RUBY_HOME'] #/Users/miverso2/.rvm/rubies/ruby-2.7.0
|
160
|
-
# ENV['GEM_HOME'] # /Users/miverso2/.rvm/gems/ruby-2.7.0
|
161
|
-
# require 'rubygems/dependency_installer.rb'
|
162
|
-
# puts Gem::DependencyInstaller.new.install('lex-esphome')
|
163
|
-
# puts Gem::Installer.new('lex-esphome').install
|
164
|
-
# puts Gem::Installer.new('lex-esphome').ensure_loadable_spec
|
165
|
-
# puts Gem.search('lex-esphome')
|
166
|
-
# Gem.clear_paths
|
167
|
-
# require 'legion/extensions/esphome'
|
168
|
-
|
169
|
-
# puts Gem.use_gemdeps
|
170
|
-
# pp Gem.gemdeps
|
171
|
-
# puts 'gems things'
|
172
|
-
# puts Gem.loaded_specs.key? 'lex-esphome'
|
173
|
-
# pp Gem.loaded_specs.keys
|
174
|
-
#
|
175
|
-
# require 'rubygems'
|
176
|
-
# require 'rubygems/command.rb'
|
177
|
-
# require 'rubygems/dependency_installer.rb'
|
178
|
-
#
|
179
|
-
# Gem::Command.build_args = ARGV
|
180
|
-
# inst = Gem::DependencyInstaller.new
|
181
|
-
# puts inst.installed_gems
|
182
|
-
# puts inst.install 'lex-esphome', install_as_default: true
|
183
|
-
# puts inst.installed_gems
|
184
|
-
# puts '....'
|
185
|
-
# test = Gem::DependencyList.new
|
186
|
-
# test.add(inst)
|
187
|
-
# pp test.find_name('lex-esphome')
|
188
|
-
# pp test.find_name('lex-logger')
|
189
|
-
# pp test.specs
|
190
|
-
# pp Gem::DependencyList.from_specs
|
191
|
-
# pp Gem::DependencyList.from_specs.key? 'lex-logg'
|
192
|
-
# pp inst
|
193
|
-
#
|
194
|
-
# pp Gem.new.all_specs
|
195
|
-
# load 'legion/extensions/esphome.rb'
|
196
|
-
# puts Gem.register_default_spec()
|
197
|
-
# :use_gemdeps,
|
198
|
-
# :detect_gemdeps,
|
199
|
-
# :source_date_epoch,
|
200
|
-
# :gemdeps,
|
201
|
-
# :register_default_spec,
|
202
|
-
# :find_unresolved_default_spec,
|
203
|
-
# :clear_default_specs,
|
204
|
-
# :loaded_specs,
|
205
|
-
# :default_path,
|
206
|
-
|
207
168
|
Gem::Specification.all_names.each do |gem|
|
208
169
|
next unless gem[0..3] == 'lex-'
|
209
170
|
|
@@ -212,12 +173,46 @@ module Legion
|
|
212
173
|
gem_name: "lex-#{lex[1]}",
|
213
174
|
extension_name: lex[1],
|
214
175
|
version: lex[2],
|
215
|
-
extension_class: "Legion::Extensions::#{lex[1].capitalize}" }
|
176
|
+
extension_class: "Legion::Extensions::#{lex[1].split('_').collect(&:capitalize).join}" }
|
177
|
+
end
|
178
|
+
|
179
|
+
enabled = 0
|
180
|
+
requested = 0
|
181
|
+
|
182
|
+
Legion::Settings[:extensions].each do |extension, values|
|
183
|
+
next if @extensions.key? extension.to_s
|
184
|
+
next if values[:enabled] == false
|
185
|
+
|
186
|
+
requested += 1
|
187
|
+
next if values[:auto_install] == false
|
188
|
+
next if ENV['_'].include? 'bundle'
|
189
|
+
|
190
|
+
Legion::Logging.warn "#{extension} is missing, attempting to install automatically.."
|
191
|
+
install = Gem.install("lex-#{extension}", values[:version])
|
192
|
+
Legion::Logging.debug(install)
|
193
|
+
lex = Gem::Specification.find_by_name("lex-#{extension}")
|
194
|
+
|
195
|
+
@extensions[extension.to_s] = {
|
196
|
+
full_gem_name: "lex-#{extension}-#{lex.version}",
|
197
|
+
gem_name: "lex-#{extension}",
|
198
|
+
extension_name: extension.to_s,
|
199
|
+
version: lex.version,
|
200
|
+
extension_class: "Legion::Extensions::#{extension.to_s.split('_').collect(&:capitalize).join}"
|
201
|
+
}
|
202
|
+
|
203
|
+
enabled += 1
|
204
|
+
|
205
|
+
rescue StandardError, Gem::MissingSpecError => e
|
206
|
+
Legion::Logging.error "Failed to auto install #{extension}, e: #{e.message}"
|
216
207
|
end
|
208
|
+
return true if requested == enabled
|
217
209
|
|
218
|
-
|
219
|
-
|
220
|
-
|
210
|
+
Legion::Logging.warn "A total of #{requested - enabled} where skipped"
|
211
|
+
if ENV['_'].include?('bundle')
|
212
|
+
Legion::Logging.warn 'Please add them to your Gemfile since you are using bundler'
|
213
|
+
else
|
214
|
+
Legion::Logging.warn 'You must have auto_install_missing_lex set to true to auto install missing extensions'
|
215
|
+
end
|
221
216
|
end
|
222
217
|
end
|
223
218
|
end
|
@@ -20,6 +20,7 @@ module Legion
|
|
20
20
|
runner_name = file.split('/').last.sub('.rb', '')
|
21
21
|
runner_class = "#{lex_class}::Runners::#{runner_name.split('_').collect(&:capitalize).join}"
|
22
22
|
loaded_runner = Kernel.const_get(runner_class)
|
23
|
+
|
23
24
|
@runners[runner_name.to_sym] = {
|
24
25
|
extension: lex_class.to_s.downcase,
|
25
26
|
extension_name: extension_name,
|
@@ -30,6 +31,10 @@ module Legion
|
|
30
31
|
class_methods: {}
|
31
32
|
}
|
32
33
|
|
34
|
+
if settings.key?(:runners) && settings[:runners].key?(runner_name.to_sym)
|
35
|
+
@runners[runner_name.to_sym][:desc] = settings[:runners][runner_name.to_sym][:desc]
|
36
|
+
end
|
37
|
+
|
33
38
|
loaded_runner.public_instance_methods(false).each do |runner_method|
|
34
39
|
@runners[runner_name.to_sym][:class_methods][runner_method] = {
|
35
40
|
args: loaded_runner.instance_method(runner_method).parameters
|
@@ -39,7 +39,7 @@ module Legion
|
|
39
39
|
@messages = {}
|
40
40
|
build_settings
|
41
41
|
build_transport
|
42
|
-
build_data
|
42
|
+
build_data if Legion::Settings[:data][:connected] && data_required?
|
43
43
|
build_helpers
|
44
44
|
build_runners
|
45
45
|
build_actors
|
@@ -61,9 +61,13 @@ module Legion
|
|
61
61
|
false
|
62
62
|
end
|
63
63
|
|
64
|
+
def vault_required?
|
65
|
+
false
|
66
|
+
end
|
67
|
+
|
64
68
|
def build_data
|
65
69
|
auto_generate_data
|
66
|
-
|
70
|
+
lex_class::Data.build
|
67
71
|
end
|
68
72
|
|
69
73
|
def build_transport
|
@@ -117,9 +121,10 @@ module Legion
|
|
117
121
|
def auto_generate_data
|
118
122
|
require 'legion/extensions/data'
|
119
123
|
log.debug 'running meta magic to generate a data base class'
|
120
|
-
return if Kernel.const_defined? "#{lex_class}::Data"
|
121
|
-
|
122
124
|
Kernel.const_get(lex_class.to_s).const_set('Data', Module.new { extend Legion::Extensions::Data })
|
125
|
+
rescue StandardError => e
|
126
|
+
log.error e.message
|
127
|
+
log.error e.backtrace
|
123
128
|
end
|
124
129
|
end
|
125
130
|
end
|
@@ -8,7 +8,7 @@ module Legion
|
|
8
8
|
alias extension_class lex_class
|
9
9
|
|
10
10
|
def lex_name
|
11
|
-
@lex_name ||= calling_class_array[2].gsub(/(?<!^)[A-Z]/) { "_#{
|
11
|
+
@lex_name ||= calling_class_array[2].gsub(/(?<!^)[A-Z]/) { "_#{Regexp.last_match(0)}" }.downcase
|
12
12
|
end
|
13
13
|
alias extension_name lex_name
|
14
14
|
alias lex_filename lex_name
|
@@ -30,7 +30,7 @@ module Legion
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def actor_name
|
33
|
-
@actor_name ||= calling_class_array.last.gsub(/(?<!^)[A-Z]/) { "_#{
|
33
|
+
@actor_name ||= calling_class_array.last.gsub(/(?<!^)[A-Z]/) { "_#{Regexp.last_match(0)}" }.downcase
|
34
34
|
end
|
35
35
|
|
36
36
|
def actor_const
|
@@ -42,7 +42,7 @@ module Legion
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def runner_name
|
45
|
-
@runner_name ||= runner_class.to_s.split('::').last.gsub(/(?<!^)[A-Z]/) { "_#{
|
45
|
+
@runner_name ||= runner_class.to_s.split('::').last.gsub(/(?<!^)[A-Z]/) { "_#{Regexp.last_match(0)}" }.downcase
|
46
46
|
end
|
47
47
|
|
48
48
|
def runner_const
|
@@ -5,6 +5,34 @@ module Legion
|
|
5
5
|
include Legion::Extensions::Helpers::Core
|
6
6
|
include Legion::Extensions::Helpers::Logger
|
7
7
|
|
8
|
+
def function_example(function, example)
|
9
|
+
function_set(function, :example, example)
|
10
|
+
end
|
11
|
+
|
12
|
+
def function_options(function, options)
|
13
|
+
function_set(function, :options, options)
|
14
|
+
end
|
15
|
+
|
16
|
+
def function_desc(function, desc)
|
17
|
+
function_set(function, :desc, desc)
|
18
|
+
end
|
19
|
+
|
20
|
+
def function_set(function, key, value)
|
21
|
+
unless respond_to? function
|
22
|
+
log.debug "function_#{key} called but function doesn't exist, f: #{function}"
|
23
|
+
return nil
|
24
|
+
end
|
25
|
+
settings[:functions] = {} if settings[:functions].nil?
|
26
|
+
settings[:functions][function] = {} if settings[:functions][function].nil?
|
27
|
+
settings[:functions][function][key] = value
|
28
|
+
end
|
29
|
+
|
30
|
+
def runner_desc(desc)
|
31
|
+
settings[:runners] = {} if settings[:runners].nil?
|
32
|
+
settings[:runners][actor_name.to_sym] = {} if settings[:runners][actor_name.to_sym].nil?
|
33
|
+
settings[:runners][actor_name.to_sym][:desc] = desc
|
34
|
+
end
|
35
|
+
|
8
36
|
def self.included(base)
|
9
37
|
base.send :extend, Legion::Extensions::Helpers::Core if base.instance_of?(Class)
|
10
38
|
base.send :extend, Legion::Extensions::Helpers::Logger if base.instance_of?(Class)
|
@@ -12,7 +40,7 @@ module Legion
|
|
12
40
|
end
|
13
41
|
|
14
42
|
def default_settings
|
15
|
-
{ logger: { level: 'info' }, workers: 1 }
|
43
|
+
{ logger: { level: 'info' }, workers: 1, runners: {}, functions: {} }
|
16
44
|
end
|
17
45
|
end
|
18
46
|
end
|