legionio 1.4.199 → 1.5.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/CHANGELOG.md +18 -1
- data/legionio.gemspec +1 -1
- data/lib/legion/cli/check_command.rb +92 -14
- data/lib/legion/cli.rb +32 -9
- data/lib/legion/extensions/builders/routes.rb +1 -1
- data/lib/legion/extensions/transport.rb +6 -6
- data/lib/legion/runner.rb +24 -6
- data/lib/legion/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 610c8e32889fe2c4f1fe939e6281ea9a4ed47438723d47b605f6ce74b51a3f7c
|
|
4
|
+
data.tar.gz: c727fbf0febe067f634be639ed46a7642e2c47d5e3accadcb276b506f5f02c9a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 17acc62f2465c285639a2b1bce2a59f14555e89189aa5c3932d1b49f36dd5500a3a1441f0b0810f52ebecc1160d68c2e834ff852f1309872b2212404195c8bf9
|
|
7
|
+
data.tar.gz: e48c0a848e8bccc2ba4af5ad51c8f39a87b4825968329bae36f84d6a6f06b46492c57ce2b0c5f612f511ed360508488cbd06e44758461f7214803dd18026c628
|
data/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Legion Changelog
|
|
2
2
|
|
|
3
|
-
## [1.
|
|
3
|
+
## [1.5.0] - 2026-03-24
|
|
4
4
|
|
|
5
5
|
### Added
|
|
6
6
|
- `legion setup agentic` — install full cognitive stack (legion-gaia + legion-llm + all transitive deps) in one command
|
|
@@ -9,6 +9,23 @@
|
|
|
9
9
|
- `legion setup packs` — show installed/missing feature packs
|
|
10
10
|
- `--dry-run` flag on all pack install commands
|
|
11
11
|
- `legion detect` now recommends `legion setup agentic` when legion-gaia or legion-llm are missing
|
|
12
|
+
- `legionio version --full` displays all installed lex-* extension versions
|
|
13
|
+
- `legionio version` now lists all 13 legion-* gems with `(not installed)` for missing ones
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- Overhaul `legionio check` with proper namespace labels (Legion::Settings, Legion::Transport, etc.)
|
|
17
|
+
- Each check returns connection detail strings (config dir, amqp:// URL, driver -> servers, adapter -> host:port/db)
|
|
18
|
+
- Add Legion::Cache::Local and Legion::Data::Local checks with dependency chaining
|
|
19
|
+
- Fix dependency skip logic to cascade through transitive dependencies (skip-on-skip, not just skip-on-fail)
|
|
20
|
+
- Add privacy mode sub-check (`legionio check --privacy`)
|
|
21
|
+
- Comment out Bootsnap.setup in exe/legion (matching exe/legionio)
|
|
22
|
+
- Bump gemspec minimum: legion-data >= 1.5.0
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
- Runner log output now tagged with extension name (e.g. `[mesh][Runner]` instead of bare `[Runner]`)
|
|
26
|
+
- Extension Transport and Routes builders use tagged `log` helper instead of bare `Legion::Logging`
|
|
27
|
+
|
|
28
|
+
## [1.4.198] - 2026-03-24
|
|
12
29
|
|
|
13
30
|
### Changed
|
|
14
31
|
- Comment out Bootsnap.setup in exe/legion (matching exe/legionio)
|
data/legionio.gemspec
CHANGED
|
@@ -54,7 +54,7 @@ Gem::Specification.new do |spec|
|
|
|
54
54
|
|
|
55
55
|
spec.add_dependency 'legion-cache', '>= 1.3.11'
|
|
56
56
|
spec.add_dependency 'legion-crypt', '>= 1.4.9'
|
|
57
|
-
spec.add_dependency 'legion-data', '>= 1.
|
|
57
|
+
spec.add_dependency 'legion-data', '>= 1.5.0'
|
|
58
58
|
spec.add_dependency 'legion-json', '>= 1.2.1'
|
|
59
59
|
spec.add_dependency 'legion-logging', '>= 1.3.2'
|
|
60
60
|
spec.add_dependency 'legion-settings', '>= 1.3.14'
|
|
@@ -3,18 +3,32 @@
|
|
|
3
3
|
module Legion
|
|
4
4
|
module CLI
|
|
5
5
|
module Check
|
|
6
|
-
CHECKS = %i[settings crypt transport cache data].freeze
|
|
6
|
+
CHECKS = %i[settings crypt transport cache cache_local data data_local].freeze
|
|
7
7
|
EXTENSION_CHECKS = %i[extensions].freeze
|
|
8
8
|
FULL_CHECKS = %i[api].freeze
|
|
9
9
|
|
|
10
|
+
CHECK_LABELS = {
|
|
11
|
+
settings: 'Legion::Settings',
|
|
12
|
+
crypt: 'Legion::Crypt',
|
|
13
|
+
transport: 'Legion::Transport',
|
|
14
|
+
cache: 'Legion::Cache',
|
|
15
|
+
cache_local: 'Legion::Cache::Local',
|
|
16
|
+
data: 'Legion::Data',
|
|
17
|
+
data_local: 'Legion::Data::Local',
|
|
18
|
+
extensions: 'Legion::Extensions',
|
|
19
|
+
api: 'Legion::API'
|
|
20
|
+
}.freeze
|
|
21
|
+
|
|
10
22
|
# Dependencies: if a check fails, these dependents are skipped
|
|
11
23
|
DEPENDS_ON = {
|
|
12
|
-
crypt:
|
|
13
|
-
transport:
|
|
14
|
-
cache:
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
24
|
+
crypt: :settings,
|
|
25
|
+
transport: :settings,
|
|
26
|
+
cache: :settings,
|
|
27
|
+
cache_local: :cache,
|
|
28
|
+
data: :settings,
|
|
29
|
+
data_local: :data,
|
|
30
|
+
extensions: :transport,
|
|
31
|
+
api: :transport
|
|
18
32
|
}.freeze
|
|
19
33
|
|
|
20
34
|
autoload :PrivacyCheck, 'legion/cli/check/privacy_check'
|
|
@@ -85,7 +99,7 @@ module Legion
|
|
|
85
99
|
|
|
86
100
|
checks.each do |name|
|
|
87
101
|
dep = DEPENDS_ON[name]
|
|
88
|
-
if dep && results[dep] && results[dep][:status]
|
|
102
|
+
if dep && results[dep] && %w[fail skip].include?(results[dep][:status])
|
|
89
103
|
results[name] = { status: 'skip', error: "#{dep} failed" }
|
|
90
104
|
print_result(formatter, name, results[name], options) unless options[:json]
|
|
91
105
|
next
|
|
@@ -111,9 +125,9 @@ module Legion
|
|
|
111
125
|
|
|
112
126
|
def run_check(name, options)
|
|
113
127
|
start = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
|
|
114
|
-
send(:"check_#{name}", options)
|
|
128
|
+
detail = send(:"check_#{name}", options)
|
|
115
129
|
elapsed = (::Process.clock_gettime(::Process::CLOCK_MONOTONIC) - start).round(2)
|
|
116
|
-
{ status: 'pass', time: elapsed }
|
|
130
|
+
{ status: 'pass', time: elapsed, detail: detail }
|
|
117
131
|
rescue StandardError, LoadError => e
|
|
118
132
|
elapsed = (::Process.clock_gettime(::Process::CLOCK_MONOTONIC) - start).round(2)
|
|
119
133
|
{ status: 'fail', error: e.message, time: elapsed }
|
|
@@ -123,27 +137,82 @@ module Legion
|
|
|
123
137
|
require 'legion/settings'
|
|
124
138
|
dir = Connection.send(:resolve_config_dir)
|
|
125
139
|
Legion::Settings.load(config_dir: dir)
|
|
140
|
+
dir || Legion::Settings.instance_variable_get(:@config_dir) || '(default)'
|
|
126
141
|
end
|
|
127
142
|
|
|
128
143
|
def check_crypt(_options)
|
|
129
144
|
require 'legion/crypt'
|
|
130
145
|
Legion::Crypt.start
|
|
146
|
+
vault_addr = ENV.fetch('VAULT_ADDR', nil)
|
|
147
|
+
connected = defined?(Legion::Crypt) && Legion::Crypt.respond_to?(:vault_connected?) && Legion::Crypt.vault_connected?
|
|
148
|
+
connected ? "Vault #{vault_addr || 'connected'}" : 'no Vault'
|
|
131
149
|
end
|
|
132
150
|
|
|
133
151
|
def check_transport(_options)
|
|
134
152
|
require 'legion/transport'
|
|
135
153
|
Legion::Settings.merge_settings('transport', Legion::Transport::Settings.default)
|
|
136
154
|
Legion::Transport::Connection.setup
|
|
155
|
+
if Legion::Transport::Connection.lite_mode?
|
|
156
|
+
'InProcess (lite mode)'
|
|
157
|
+
else
|
|
158
|
+
ts = Legion::Settings[:transport] || {}
|
|
159
|
+
host = ts.dig(:connection, :host) || '127.0.0.1'
|
|
160
|
+
port = ts.dig(:connection, :port) || 5672
|
|
161
|
+
vhost = ts.dig(:connection, :vhost) || '/'
|
|
162
|
+
user = ts.dig(:connection, :user) || 'guest'
|
|
163
|
+
"amqp://#{user}@#{host}:#{port}#{vhost}"
|
|
164
|
+
end
|
|
137
165
|
end
|
|
138
166
|
|
|
139
167
|
def check_cache(_options)
|
|
140
168
|
require 'legion/cache'
|
|
169
|
+
if defined?(Legion::Cache) && Legion::Cache.respond_to?(:using_memory?) && Legion::Cache.using_memory?
|
|
170
|
+
'Memory (lite mode)'
|
|
171
|
+
else
|
|
172
|
+
cs = Legion::Settings[:cache] || {}
|
|
173
|
+
driver = cs[:driver] || 'dalli'
|
|
174
|
+
servers = Array(cs[:servers] || cs[:server] || ['127.0.0.1'])
|
|
175
|
+
"#{driver} -> #{servers.join(', ')}"
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def check_cache_local(_options)
|
|
180
|
+
raise 'Legion::Cache::Local not available' unless defined?(Legion::Cache::Local) && Legion::Cache::Local.respond_to?(:setup)
|
|
181
|
+
|
|
182
|
+
Legion::Cache::Local.setup
|
|
183
|
+
cs = Legion::Cache::Settings.respond_to?(:local) ? Legion::Cache::Settings.local : {}
|
|
184
|
+
driver = cs[:driver] || 'dalli'
|
|
185
|
+
servers = Array(cs[:servers] || cs[:server] || ['127.0.0.1'])
|
|
186
|
+
"#{driver} -> #{servers.join(', ')}"
|
|
141
187
|
end
|
|
142
188
|
|
|
143
189
|
def check_data(_options)
|
|
144
190
|
require 'legion/data'
|
|
145
191
|
Legion::Settings.merge_settings(:data, Legion::Data::Settings.default)
|
|
146
192
|
Legion::Data.setup
|
|
193
|
+
ds = Legion::Settings[:data] || {}
|
|
194
|
+
adapter = ds[:adapter] || 'sqlite'
|
|
195
|
+
if adapter == 'sqlite'
|
|
196
|
+
db_path = ds[:database] || 'legion.db'
|
|
197
|
+
"sqlite -> #{db_path}"
|
|
198
|
+
else
|
|
199
|
+
host = ds[:host] || '127.0.0.1'
|
|
200
|
+
port = ds[:port]
|
|
201
|
+
database = ds[:database] || 'legion'
|
|
202
|
+
"#{adapter} -> #{host}#{":#{port}" if port}/#{database}"
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def check_data_local(_options)
|
|
207
|
+
if defined?(Legion::Data::Local) && Legion::Data::Local.respond_to?(:setup)
|
|
208
|
+
Legion::Data::Local.setup unless Legion::Data::Local.respond_to?(:connected?) && Legion::Data::Local.connected?
|
|
209
|
+
db_path = Legion::Data::Local.respond_to?(:db_path) ? Legion::Data::Local.db_path : '~/.legionio/local.db'
|
|
210
|
+
"sqlite -> #{db_path}"
|
|
211
|
+
elsif defined?(Legion::Data)
|
|
212
|
+
'not configured'
|
|
213
|
+
else
|
|
214
|
+
raise 'Legion::Data not available'
|
|
215
|
+
end
|
|
147
216
|
end
|
|
148
217
|
|
|
149
218
|
def check_extensions(_options)
|
|
@@ -208,10 +277,18 @@ module Legion
|
|
|
208
277
|
Legion::Cache.shutdown
|
|
209
278
|
end
|
|
210
279
|
|
|
280
|
+
def shutdown_cache_local
|
|
281
|
+
Legion::Cache::Local.shutdown if defined?(Legion::Cache::Local) && Legion::Cache::Local.respond_to?(:shutdown)
|
|
282
|
+
end
|
|
283
|
+
|
|
211
284
|
def shutdown_data
|
|
212
285
|
Legion::Data.shutdown
|
|
213
286
|
end
|
|
214
287
|
|
|
288
|
+
def shutdown_data_local
|
|
289
|
+
Legion::Data::Local.shutdown if defined?(Legion::Data::Local) && Legion::Data::Local.respond_to?(:shutdown)
|
|
290
|
+
end
|
|
291
|
+
|
|
215
292
|
def shutdown_extensions
|
|
216
293
|
Legion::Extensions.shutdown
|
|
217
294
|
end
|
|
@@ -219,16 +296,17 @@ module Legion
|
|
|
219
296
|
def shutdown_api; end
|
|
220
297
|
|
|
221
298
|
def print_result(formatter, name, result, options)
|
|
222
|
-
label = name.to_s.ljust(
|
|
299
|
+
label = CHECK_LABELS.fetch(name, name.to_s).ljust(22)
|
|
223
300
|
case result[:status]
|
|
224
301
|
when 'pass'
|
|
225
|
-
|
|
302
|
+
detail = result[:detail] ? " #{formatter.colorize(result[:detail].to_s, :muted)}" : ''
|
|
303
|
+
line = " #{label} #{formatter.colorize('pass', :green)}#{detail}"
|
|
226
304
|
line += " (#{result[:time]}s)" if options[:verbose]
|
|
227
305
|
when 'fail'
|
|
228
|
-
line = " #{label}#{formatter.colorize('FAIL', :red)} #{result[:error]}"
|
|
306
|
+
line = " #{label} #{formatter.colorize('FAIL', :red)} #{result[:error]}"
|
|
229
307
|
line += " (#{result[:time]}s)" if options[:verbose]
|
|
230
308
|
when 'skip'
|
|
231
|
-
line = " #{label}#{formatter.colorize('skip', :yellow)} #{result[:error]}"
|
|
309
|
+
line = " #{label} #{formatter.colorize('skip', :yellow)} #{result[:error]}"
|
|
232
310
|
end
|
|
233
311
|
puts line
|
|
234
312
|
end
|
data/lib/legion/cli.rb
CHANGED
|
@@ -82,6 +82,13 @@ module Legion
|
|
|
82
82
|
exit(1)
|
|
83
83
|
end
|
|
84
84
|
|
|
85
|
+
LEGION_GEMS = %w[
|
|
86
|
+
legion-transport legion-cache legion-crypt legion-data
|
|
87
|
+
legion-json legion-logging legion-settings
|
|
88
|
+
legion-llm legion-gaia legion-mcp legion-rbac
|
|
89
|
+
legion-tty legion-ffi
|
|
90
|
+
].freeze
|
|
91
|
+
|
|
85
92
|
class_option :json, type: :boolean, default: false, desc: 'Output as JSON'
|
|
86
93
|
class_option :no_color, type: :boolean, default: false, desc: 'Disable color output'
|
|
87
94
|
class_option :verbose, type: :boolean, default: false, aliases: ['-V'], desc: 'Verbose logging'
|
|
@@ -89,11 +96,15 @@ module Legion
|
|
|
89
96
|
|
|
90
97
|
desc 'version', 'Show version information'
|
|
91
98
|
map %w[-v --version] => :version
|
|
99
|
+
option :full, type: :boolean, default: false, desc: 'Include all installed lex-* extension versions'
|
|
92
100
|
def version
|
|
93
101
|
out = formatter
|
|
102
|
+
lexs = discovered_lexs
|
|
94
103
|
if options[:json]
|
|
95
|
-
|
|
96
|
-
|
|
104
|
+
payload = { version: Legion::VERSION, ruby: RUBY_VERSION, platform: RUBY_PLATFORM,
|
|
105
|
+
components: installed_components, extensions: lexs.size }
|
|
106
|
+
payload[:extension_versions] = lex_versions(lexs) if options[:full]
|
|
107
|
+
out.json(payload)
|
|
97
108
|
else
|
|
98
109
|
out.banner(version: Legion::VERSION)
|
|
99
110
|
out.spacer
|
|
@@ -107,8 +118,15 @@ module Legion
|
|
|
107
118
|
end
|
|
108
119
|
|
|
109
120
|
out.spacer
|
|
110
|
-
|
|
111
|
-
|
|
121
|
+
puts " #{out.colorize("#{lexs.size} extension(s)", :accent)} installed"
|
|
122
|
+
|
|
123
|
+
if options[:full] && lexs.any?
|
|
124
|
+
out.spacer
|
|
125
|
+
out.header('Extensions')
|
|
126
|
+
lex_versions(lexs).each do |name, ver|
|
|
127
|
+
puts " #{out.colorize(name.ljust(20), :label)} #{ver}"
|
|
128
|
+
end
|
|
129
|
+
end
|
|
112
130
|
end
|
|
113
131
|
end
|
|
114
132
|
|
|
@@ -405,20 +423,25 @@ module Legion
|
|
|
405
423
|
|
|
406
424
|
def installed_components
|
|
407
425
|
components = { legionio: Legion::VERSION }
|
|
408
|
-
|
|
409
|
-
legion-llm legion-gaia legion-tty].each do |gem_name|
|
|
410
|
-
spec = Gem::Specification.find_by_name(gem_name)
|
|
426
|
+
LEGION_GEMS.each do |gem_name|
|
|
411
427
|
short = gem_name.sub('legion-', '')
|
|
428
|
+
spec = Gem::Specification.find_by_name(gem_name)
|
|
412
429
|
components[short.to_sym] = spec.version.to_s
|
|
413
430
|
rescue Gem::MissingSpecError => e
|
|
414
431
|
Legion::Logging.debug("CLI#installed_components gem #{gem_name} not installed: #{e.message}") if defined?(Legion::Logging)
|
|
415
|
-
components[
|
|
432
|
+
components[short.to_sym] = '(not installed)'
|
|
416
433
|
end
|
|
417
434
|
components
|
|
418
435
|
end
|
|
419
436
|
|
|
420
437
|
def discovered_lexs
|
|
421
|
-
Gem::Specification.
|
|
438
|
+
Gem::Specification.select { |s| s.name.start_with?('lex-') }
|
|
439
|
+
.group_by(&:name)
|
|
440
|
+
.transform_values { |specs| specs.max_by(&:version) }
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
def lex_versions(lexs)
|
|
444
|
+
lexs.sort_by { |name, _| name }.to_h { |name, spec| [name, spec.version.to_s] }
|
|
422
445
|
end
|
|
423
446
|
|
|
424
447
|
def find_pidfile
|
|
@@ -28,7 +28,7 @@ module Legion
|
|
|
28
28
|
|
|
29
29
|
methods.each do |function|
|
|
30
30
|
route_path = "#{extension_name}/#{runner_name}/#{function}"
|
|
31
|
-
|
|
31
|
+
log.info "[Routes] auto-route registered: POST /api/lex/#{route_path}"
|
|
32
32
|
@routes[route_path] = {
|
|
33
33
|
lex_name: extension_name,
|
|
34
34
|
runner_name: runner_name,
|
|
@@ -9,7 +9,7 @@ module Legion
|
|
|
9
9
|
attr_accessor :exchanges, :queues, :consumers, :messages
|
|
10
10
|
|
|
11
11
|
def build
|
|
12
|
-
|
|
12
|
+
log.debug "[Transport] build start: #{lex_name}"
|
|
13
13
|
@queues = []
|
|
14
14
|
@exchanges = []
|
|
15
15
|
@messages = []
|
|
@@ -22,10 +22,10 @@ module Legion
|
|
|
22
22
|
build_e_to_q(additional_e_to_q)
|
|
23
23
|
auto_create_dlx_exchange
|
|
24
24
|
auto_create_dlx_queue
|
|
25
|
-
|
|
25
|
+
log.info "[Transport] built exchanges=#{@exchanges.count} queues=#{@queues.count} for #{lex_name}"
|
|
26
26
|
rescue StandardError => e
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
log.error "[Transport] build failed for #{lex_name}: #{e.message}"
|
|
28
|
+
log.error e.backtrace
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def generate_base_modules
|
|
@@ -49,7 +49,7 @@ module Legion
|
|
|
49
49
|
|
|
50
50
|
def auto_create_exchange(exchange, default_exchange = false) # rubocop:disable Style/OptionalBooleanParameter
|
|
51
51
|
if Object.const_defined? exchange
|
|
52
|
-
|
|
52
|
+
log.warn "#{exchange} is already defined"
|
|
53
53
|
return
|
|
54
54
|
end
|
|
55
55
|
return build_default_exchange if default_exchange
|
|
@@ -62,7 +62,7 @@ module Legion
|
|
|
62
62
|
|
|
63
63
|
def auto_create_queue(queue)
|
|
64
64
|
if Kernel.const_defined?(queue)
|
|
65
|
-
|
|
65
|
+
log.warn "#{queue} is already defined"
|
|
66
66
|
return
|
|
67
67
|
end
|
|
68
68
|
|
data/lib/legion/runner.rb
CHANGED
|
@@ -7,9 +7,11 @@ require 'legion/transport/messages/check_subtask'
|
|
|
7
7
|
|
|
8
8
|
module Legion
|
|
9
9
|
module Runner
|
|
10
|
-
def self.run(runner_class:, function:, task_id: nil, args: nil, check_subtask: true, generate_task: true, parent_id: nil, master_id: nil, catch_exceptions: false, **opts) # rubocop:disable Layout/LineLength, Metrics/
|
|
10
|
+
def self.run(runner_class:, function:, task_id: nil, args: nil, check_subtask: true, generate_task: true, parent_id: nil, master_id: nil, catch_exceptions: false, **opts) # rubocop:disable Layout/LineLength, Metrics/CyclomaticComplexity, Metrics/ParameterLists, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
11
11
|
started_at = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
|
|
12
|
-
|
|
12
|
+
lex_tag = derive_lex_tag(runner_class)
|
|
13
|
+
rlog = runner_logger(lex_tag)
|
|
14
|
+
rlog.info "[Runner] start: #{runner_class}##{function} task_id=#{task_id}"
|
|
13
15
|
runner_class = Kernel.const_get(runner_class) if runner_class.is_a? String
|
|
14
16
|
|
|
15
17
|
if task_id.nil? && generate_task
|
|
@@ -31,11 +33,11 @@ module Legion
|
|
|
31
33
|
|
|
32
34
|
result = runner_class.send(function, **args)
|
|
33
35
|
rescue Legion::Exception::HandledTask => e
|
|
34
|
-
|
|
36
|
+
rlog.debug "[Runner] HandledTask raised in #{runner_class}##{function}: #{e.message}"
|
|
35
37
|
status = 'task.exception'
|
|
36
38
|
result = { error: {} }
|
|
37
39
|
rescue StandardError => e
|
|
38
|
-
|
|
40
|
+
rlog.error "[Runner] exception in #{runner_class}##{function}: #{e.message}"
|
|
39
41
|
runner_class.handle_exception(e,
|
|
40
42
|
**opts,
|
|
41
43
|
runner_class: runner_class,
|
|
@@ -50,7 +52,7 @@ module Legion
|
|
|
50
52
|
ensure
|
|
51
53
|
status = 'task.completed' if status.nil?
|
|
52
54
|
duration_ms = ((::Process.clock_gettime(::Process::CLOCK_MONOTONIC) - started_at) * 1000).round
|
|
53
|
-
|
|
55
|
+
rlog.info "[Runner] complete: #{runner_class}##{function} status=#{status} duration_ms=#{duration_ms}"
|
|
54
56
|
Legion::Events.emit("task.#{status == 'task.completed' ? 'completed' : 'failed'}",
|
|
55
57
|
task_id: task_id, runner_class: runner_class.to_s, function: function, status: status)
|
|
56
58
|
Legion::Runner::Status.update(task_id: task_id, status: status) unless task_id.nil?
|
|
@@ -76,10 +78,26 @@ module Legion
|
|
|
76
78
|
detail: { task_id: task_id, error: error_message }
|
|
77
79
|
)
|
|
78
80
|
rescue StandardError => e
|
|
79
|
-
|
|
81
|
+
rlog.debug("Audit in runner.run failed: #{e.message}")
|
|
80
82
|
end
|
|
81
83
|
end
|
|
82
84
|
return { success: true, status: status, result: result, task_id: task_id } # rubocop:disable Lint/EnsureReturn
|
|
83
85
|
end
|
|
86
|
+
|
|
87
|
+
def self.derive_lex_tag(runner_class)
|
|
88
|
+
name = runner_class.is_a?(String) ? runner_class : runner_class.to_s
|
|
89
|
+
parts = name.split('::')
|
|
90
|
+
ext_idx = parts.index('Extensions')
|
|
91
|
+
return parts.last.downcase unless ext_idx && parts[ext_idx + 1]
|
|
92
|
+
|
|
93
|
+
parts[ext_idx + 1].gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
|
94
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
|
95
|
+
.downcase
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def self.runner_logger(tag)
|
|
99
|
+
@runner_loggers ||= {}
|
|
100
|
+
@runner_loggers[tag] ||= Legion::Logging::Logger.new(lex: tag)
|
|
101
|
+
end
|
|
84
102
|
end
|
|
85
103
|
end
|
data/lib/legion/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: legionio
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Esity
|
|
@@ -253,14 +253,14 @@ dependencies:
|
|
|
253
253
|
requirements:
|
|
254
254
|
- - ">="
|
|
255
255
|
- !ruby/object:Gem::Version
|
|
256
|
-
version: 1.
|
|
256
|
+
version: 1.5.0
|
|
257
257
|
type: :runtime
|
|
258
258
|
prerelease: false
|
|
259
259
|
version_requirements: !ruby/object:Gem::Requirement
|
|
260
260
|
requirements:
|
|
261
261
|
- - ">="
|
|
262
262
|
- !ruby/object:Gem::Version
|
|
263
|
-
version: 1.
|
|
263
|
+
version: 1.5.0
|
|
264
264
|
- !ruby/object:Gem::Dependency
|
|
265
265
|
name: legion-json
|
|
266
266
|
requirement: !ruby/object:Gem::Requirement
|