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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 49f46da2cebfc684c3bfa9285698ed55e8d266bb4bdce293ab18fbf979496652
4
- data.tar.gz: e290dd04b7341ebba8a1e567d17348930049ff16aa68409cfb8162db064225ff
3
+ metadata.gz: 610c8e32889fe2c4f1fe939e6281ea9a4ed47438723d47b605f6ce74b51a3f7c
4
+ data.tar.gz: c727fbf0febe067f634be639ed46a7642e2c47d5e3accadcb276b506f5f02c9a
5
5
  SHA512:
6
- metadata.gz: 62876302ad244a1ac5e4679fe16d682bc21c7e4264bcc5400907c0fa171d463f83193888d247f6437f7be9c3c4544f1b3b79b9d46fbe32fa3afb6ba1255c1403
7
- data.tar.gz: 64738b0d3b30dd28524c50b7090631f97fcdc6f29941cd566e2804a004834e924babe008406077c0214b46dfe67495c804641ce4343ee268fc836f66e83da1de
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.4.199] - 2026-03-24
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.4.19'
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: :settings,
13
- transport: :settings,
14
- cache: :settings,
15
- data: :settings,
16
- extensions: :transport,
17
- api: :transport
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] == 'fail'
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(14)
299
+ label = CHECK_LABELS.fetch(name, name.to_s).ljust(22)
223
300
  case result[:status]
224
301
  when 'pass'
225
- line = " #{label}#{formatter.colorize('pass', :green)}"
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
- out.json(version: Legion::VERSION, ruby: RUBY_VERSION, platform: RUBY_PLATFORM,
96
- components: installed_components, extensions: discovered_lexs.size)
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
- lex_count = discovered_lexs.size
111
- puts " #{out.colorize("#{lex_count} extension(s)", :accent)} installed"
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
- %w[legion-transport legion-data legion-cache legion-crypt legion-json legion-logging legion-settings
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[gem_name.sub('legion-', '').to_sym] = '(not installed)'
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.all_names.select { |g| g.start_with?('lex-') }
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
- Legion::Logging.info "[Routes] auto-route registered: POST /api/lex/#{route_path}" if defined?(Legion::Logging)
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
- Legion::Logging.debug "[Transport] build start: #{lex_name}" if defined?(Legion::Logging)
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
- Legion::Logging.info "[Transport] built exchanges=#{@exchanges.count} queues=#{@queues.count} for #{lex_name}" if defined?(Legion::Logging)
25
+ log.info "[Transport] built exchanges=#{@exchanges.count} queues=#{@queues.count} for #{lex_name}"
26
26
  rescue StandardError => e
27
- Legion::Logging.error "[Transport] build failed for #{lex_name}: #{e.message}"
28
- Legion::Logging.error e.backtrace
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
- Legion::Logging.warn "#{exchange} is already defined"
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
- Legion::Logging.warn "#{queue} is already defined"
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/AbcSize, Metrics/CyclomaticComplexity, Metrics/ParameterLists, Metrics/MethodLength, Metrics/PerceivedComplexity
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
- Legion::Logging.info "[Runner] start: #{runner_class}##{function} task_id=#{task_id}" if defined?(Legion::Logging)
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
- Legion::Logging.debug "[Runner] HandledTask raised in #{runner_class}##{function}: #{e.message}" if defined?(Legion::Logging)
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
- Legion::Logging.error "[Runner] exception in #{runner_class}##{function}: #{e.message}" if defined?(Legion::Logging)
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
- Legion::Logging.info "[Runner] complete: #{runner_class}##{function} status=#{status} duration_ms=#{duration_ms}" if defined?(Legion::Logging)
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
- Legion::Logging.debug("Audit in runner.run failed: #{e.message}") if defined?(Legion::Logging)
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Legion
4
- VERSION = '1.4.199'
4
+ VERSION = '1.5.0'
5
5
  end
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.199
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.4.19
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.4.19
263
+ version: 1.5.0
264
264
  - !ruby/object:Gem::Dependency
265
265
  name: legion-json
266
266
  requirement: !ruby/object:Gem::Requirement