openc3 5.14.2 → 5.15.1

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.

Potentially problematic release.


This version of openc3 might be problematic. Click here for more details.

Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/bin/openc3cli +1 -1
  3. data/data/config/_id_items.yaml +2 -3
  4. data/data/config/telemetry_modifiers.yaml +0 -1
  5. data/lib/openc3/accessors/accessor.rb +3 -3
  6. data/lib/openc3/accessors/http_accessor.rb +1 -1
  7. data/lib/openc3/api/cmd_api.rb +50 -7
  8. data/lib/openc3/api/tlm_api.rb +16 -5
  9. data/lib/openc3/logs/buffered_packet_log_writer.rb +5 -0
  10. data/lib/openc3/logs/packet_log_reader.rb +8 -9
  11. data/lib/openc3/microservices/interface_microservice.rb +29 -18
  12. data/lib/openc3/microservices/trigger_group_microservice.rb +9 -9
  13. data/lib/openc3/models/auth_model.rb +5 -7
  14. data/lib/openc3/models/cvt_model.rb +9 -4
  15. data/lib/openc3/models/gem_model.rb +7 -5
  16. data/lib/openc3/models/metric_model.rb +8 -0
  17. data/lib/openc3/models/model.rb +21 -6
  18. data/lib/openc3/models/plugin_model.rb +8 -2
  19. data/lib/openc3/models/python_package_model.rb +3 -0
  20. data/lib/openc3/models/scope_model.rb +2 -2
  21. data/lib/openc3/models/target_model.rb +21 -28
  22. data/lib/openc3/models/tool_model.rb +2 -2
  23. data/lib/openc3/packets/json_packet.rb +5 -3
  24. data/lib/openc3/script/commands.rb +2 -2
  25. data/lib/openc3/script/storage.rb +28 -12
  26. data/lib/openc3/script/suite_results.rb +9 -9
  27. data/lib/openc3/system/system.rb +4 -5
  28. data/lib/openc3/top_level.rb +32 -23
  29. data/lib/openc3/topics/command_decom_topic.rb +2 -1
  30. data/lib/openc3/topics/command_topic.rb +2 -1
  31. data/lib/openc3/topics/telemetry_topic.rb +7 -2
  32. data/lib/openc3/utilities/authorization.rb +1 -1
  33. data/lib/openc3/utilities/aws_bucket.rb +21 -15
  34. data/lib/openc3/utilities/bucket.rb +1 -1
  35. data/lib/openc3/utilities/logger.rb +3 -3
  36. data/lib/openc3/utilities/process_manager.rb +15 -9
  37. data/lib/openc3/utilities/store_autoload.rb +33 -2
  38. data/lib/openc3/utilities/store_queued.rb +23 -24
  39. data/lib/openc3/version.rb +6 -6
  40. data/templates/tool_angular/package.json +2 -2
  41. data/templates/tool_svelte/package.json +1 -1
  42. data/templates/tool_vue/package.json +2 -2
  43. data/templates/widget/package.json +2 -2
  44. metadata +16 -7
  45. data/templates/tool_angular/yarn.lock +0 -8155
  46. data/templates/tool_react/yarn.lock +0 -7201
  47. data/templates/tool_svelte/yarn.lock +0 -5519
  48. data/templates/tool_vue/yarn.lock +0 -9455
  49. data/templates/widget/yarn.lock +0 -9338
@@ -14,7 +14,7 @@
14
14
  # GNU Affero General Public License for more details.
15
15
 
16
16
  # Modified by OpenC3, Inc.
17
- # All changes Copyright 2022, OpenC3, Inc.
17
+ # All changes Copyright 2024, OpenC3, Inc.
18
18
  # All Rights Reserved
19
19
  #
20
20
  # This file may also be used under the terms of a commercial license
@@ -22,7 +22,6 @@
22
22
 
23
23
  # This file contains top level functions in the OpenC3 namespace
24
24
 
25
- require 'thread'
26
25
  require 'digest'
27
26
  require 'open3'
28
27
  require 'openc3/core_ext'
@@ -50,6 +49,16 @@ class HazardousError < StandardError
50
49
  end
51
50
  end
52
51
 
52
+ # If a disabled command is sent through the {OpenC3::Api} this error is raised.
53
+ class DisabledError < StandardError
54
+ attr_accessor :target_name
55
+ attr_accessor :cmd_name
56
+
57
+ def to_s
58
+ "#{target_name} #{cmd_name} is Disabled"
59
+ end
60
+ end
61
+
53
62
  # OpenC3 is almost
54
63
  # wholly contained within the OpenC3 module. OpenC3 also extends some of the
55
64
  # core Ruby classes to add additional functionality.
@@ -102,18 +111,18 @@ module OpenC3
102
111
  file.write(OPENC3_MARSHAL_HEADER)
103
112
  file.write(Marshal.dump(obj))
104
113
  end
105
- rescue Exception => exception
114
+ rescue Exception => e
106
115
  begin
107
116
  File.delete(marshal_filename)
108
117
  rescue Exception
109
118
  # Oh well - we tried
110
119
  end
111
- if exception.class == TypeError and exception.message =~ /Thread::Mutex/
112
- original_backtrace = exception.backtrace
113
- exception = exception.exception("Mutex exists in a packet. Note: Packets must not be read during class initializers for Conversions, Limits Responses, etc.: #{exception}")
114
- exception.set_backtrace(original_backtrace)
120
+ if e.class == TypeError and e.message =~ /Thread::Mutex/
121
+ original_backtrace = e.backtrace
122
+ e = e.exception("Mutex exists in a packet. Note: Packets must not be read during class initializers for Conversions, Limits Responses, etc.: #{e}")
123
+ e.set_backtrace(original_backtrace)
115
124
  end
116
- self.handle_fatal_exception(exception)
125
+ self.handle_fatal_exception(e)
117
126
  end
118
127
 
119
128
  # Loads the marshal file back into a Ruby object
@@ -132,9 +141,9 @@ module OpenC3
132
141
  Logger.warn "Marshal load failed with invalid marshal file: #{marshal_filename}"
133
142
  return nil
134
143
  end
135
- rescue Exception => exception
144
+ rescue Exception => e
136
145
  if File.exist?(marshal_filename)
137
- Logger.error "Marshal load failed with exception: #{marshal_filename}\n#{exception.formatted}"
146
+ Logger.error "Marshal load failed with exception: #{marshal_filename}\n#{e.formatted}"
138
147
  else
139
148
  Logger.info "Marshal file does not exist: #{marshal_filename}"
140
149
  end
@@ -145,7 +154,7 @@ module OpenC3
145
154
  rescue Exception
146
155
  # Oh well - we tried
147
156
  end
148
- self.handle_fatal_exception(exception) if File.exist?(marshal_filename)
157
+ self.handle_fatal_exception(e) if File.exist?(marshal_filename)
149
158
  return nil
150
159
  end
151
160
 
@@ -354,7 +363,7 @@ module OpenC3
354
363
  #
355
364
  # @param error [Exception] The exception to handle
356
365
  # @param try_gui [Boolean] Whether to try and create a GUI exception popup
357
- def self.handle_fatal_exception(error, try_gui = true)
366
+ def self.handle_fatal_exception(error, _try_gui = true)
358
367
  unless SystemExit === error or SignalException === error
359
368
  $openc3_fatal_exception = error
360
369
  self.write_exception_file(error)
@@ -380,7 +389,7 @@ module OpenC3
380
389
  #
381
390
  # @param error [Exception] The exception to handle
382
391
  # @param try_gui [Boolean] Whether to try and create a GUI exception popup
383
- def self.handle_critical_exception(error, try_gui = true)
392
+ def self.handle_critical_exception(error, _try_gui = true)
384
393
  Logger.error "Critical Exception! #{error.formatted}"
385
394
  self.write_exception_file(error)
386
395
  end
@@ -397,15 +406,15 @@ module OpenC3
397
406
  retry_count = 0
398
407
  begin
399
408
  yield
400
- rescue => error
409
+ rescue => e
401
410
  Logger.error "#{name} thread unexpectedly died. Retries: #{retry_count} of #{retry_attempts}"
402
- Logger.error error.formatted
411
+ Logger.error e.formatted
403
412
  retry_count += 1
404
413
  if retry_count <= retry_attempts
405
- self.write_exception_file(error)
414
+ self.write_exception_file(e)
406
415
  retry
407
416
  end
408
- handle_fatal_exception(error)
417
+ handle_fatal_exception(e)
409
418
  end
410
419
  end
411
420
  end
@@ -440,15 +449,15 @@ module OpenC3
440
449
  # @param log_error [Boolean] Whether to log an error if we can't require the class
441
450
  def self.require_file(filename, log_error = true)
442
451
  require filename
443
- rescue Exception => err
444
- msg = "Unable to require #{filename} due to #{err.message}. "\
452
+ rescue Exception => e
453
+ msg = "Unable to require #{filename} due to #{e.message}. "\
445
454
  "Ensure #{filename} is in the OpenC3 lib directory."
446
455
  Logger.error msg if log_error
447
456
  raise $!, msg, $!.backtrace
448
457
  end
449
458
 
450
459
  # @param filename [String] Name of the file to open in the web browser
451
- def self.open_in_web_browser(filename)
460
+ def self.open_in_web_browser(_filename)
452
461
  puts "open_in_web_browser is DEPRECATED"
453
462
  end
454
463
 
@@ -456,12 +465,12 @@ module OpenC3
456
465
  # Working directory is global, so this can make other threads wait
457
466
  # Ruby Dir.chdir with block always throws an error if multiple threads
458
467
  # call Dir.chdir
459
- def self.set_working_dir(working_dir, &block)
468
+ def self.set_working_dir(working_dir, &)
460
469
  if $openc3_chdir_mutex.owned?
461
- set_working_dir_internal(working_dir, &block)
470
+ set_working_dir_internal(working_dir, &)
462
471
  else
463
472
  $openc3_chdir_mutex.synchronize do
464
- set_working_dir_internal(working_dir, &block)
473
+ set_working_dir_internal(working_dir, &)
465
474
  end
466
475
  end
467
476
  end
@@ -21,6 +21,7 @@
21
21
  # if purchased from OpenC3, Inc.
22
22
 
23
23
  require 'openc3/topics/topic'
24
+ require 'openc3/utilities/store_queued'
24
25
 
25
26
  module OpenC3
26
27
  class CommandDecomTopic < Topic
@@ -39,7 +40,7 @@ module OpenC3
39
40
  json_hash[item.name + "__U"] = packet.read_item(item, :WITH_UNITS) if item.units
40
41
  end
41
42
  msg_hash['json_data'] = JSON.generate(json_hash.as_json(:allow_nan => true))
42
- Topic.write_topic(topic, msg_hash)
43
+ EphemeralStoreQueued.write_topic(topic, msg_hash)
43
44
  end
44
45
 
45
46
  def self.get_cmd_item(target_name, packet_name, param_name, type: :WITH_UNITS, scope: $openc3_scope)
@@ -21,6 +21,7 @@
21
21
  # if purchased from OpenC3, Inc.
22
22
 
23
23
  require 'openc3/topics/topic'
24
+ require 'openc3/utilities/store_queued'
24
25
  require 'openc3/utilities/open_telemetry'
25
26
 
26
27
  module OpenC3
@@ -36,7 +37,7 @@ module OpenC3
36
37
  received_count: packet.received_count,
37
38
  stored: packet.stored.to_s,
38
39
  buffer: packet.buffer(false) }
39
- Topic.write_topic(topic, msg_hash)
40
+ EphemeralStoreQueued.write_topic(topic, msg_hash)
40
41
  end
41
42
 
42
43
  # @param command [Hash] Command hash structure read to be written to a topic
@@ -21,10 +21,11 @@
21
21
  # if purchased from OpenC3, Inc.
22
22
 
23
23
  require 'openc3/topics/topic'
24
+ require 'openc3/utilities/store_queued'
24
25
 
25
26
  module OpenC3
26
27
  class TelemetryTopic < Topic
27
- def self.write_packet(packet, scope:)
28
+ def self.write_packet(packet, queued: false, scope:)
28
29
  msg_hash = {
29
30
  :time => packet.packet_time.to_nsec_from_epoch,
30
31
  :received_time => packet.received_time.to_nsec_from_epoch,
@@ -35,7 +36,11 @@ module OpenC3
35
36
  :buffer => packet.buffer(false)
36
37
  }
37
38
  msg_hash[:extra] = JSON.generate(packet.extra.as_json, allow_nan: true) if packet.extra
38
- Topic.write_topic("#{scope}__TELEMETRY__{#{packet.target_name}}__#{packet.packet_name}", msg_hash)
39
+ if queued
40
+ EphemeralStoreQueued.write_topic("#{scope}__TELEMETRY__{#{packet.target_name}}__#{packet.packet_name}", msg_hash)
41
+ else
42
+ Topic.write_topic("#{scope}__TELEMETRY__{#{packet.target_name}}__#{packet.packet_name}", msg_hash)
43
+ end
39
44
  end
40
45
  end
41
46
  end
@@ -42,7 +42,7 @@ rescue LoadError
42
42
 
43
43
  if $openc3_authorize
44
44
  raise AuthError.new("Token is required") unless token
45
- unless OpenC3::AuthModel.verify(token, permission: permission)
45
+ unless OpenC3::AuthModel.verify(token)
46
46
  raise AuthError.new("Password is invalid for '#{permission}' permission")
47
47
  end
48
48
  end
@@ -26,7 +26,9 @@ module OpenC3
26
26
  CREATE_CHECK_COUNT = 100 # 10 seconds
27
27
 
28
28
  def initialize
29
+ super()
29
30
  @client = Aws::S3::Client.new
31
+ @aws_arn = ENV['OPENC3_AWS_ARN_PREFIX'] || 'arn:aws'
30
32
  end
31
33
 
32
34
  def create(bucket)
@@ -59,7 +61,7 @@ module OpenC3
59
61
  ]
60
62
  },
61
63
  "Resource": [
62
- "arn:aws:s3:::#{bucket}"
64
+ "#{@aws_arn}:s3:::#{bucket}"
63
65
  ],
64
66
  "Sid": ""
65
67
  },
@@ -74,7 +76,7 @@ module OpenC3
74
76
  ]
75
77
  },
76
78
  "Resource": [
77
- "arn:aws:s3:::#{bucket}/*"
79
+ "#{@aws_arn}:s3:::#{bucket}/*"
78
80
  ],
79
81
  "Sid": ""
80
82
  }
@@ -198,19 +200,23 @@ module OpenC3
198
200
  end
199
201
 
200
202
  # @returns [Boolean] Whether the file exists
201
- def check_object(bucket:, key:)
202
- @client.wait_until(:object_exists,
203
- {
204
- bucket: bucket,
205
- key: key
206
- },
207
- {
208
- max_attempts: 30,
209
- delay: 0.1, # seconds
210
- }
211
- )
212
- true
213
- rescue Aws::Waiters::Errors::TooManyAttemptsError
203
+ def check_object(bucket:, key:, retries: true)
204
+ if retries
205
+ @client.wait_until(:object_exists,
206
+ {
207
+ bucket: bucket,
208
+ key: key
209
+ },
210
+ {
211
+ max_attempts: 30,
212
+ delay: 0.1, # seconds
213
+ }
214
+ )
215
+ true
216
+ else
217
+ head_object(bucket: bucket, key: key)
218
+ end
219
+ rescue NotFound, Aws::Waiters::Errors::TooManyAttemptsError
214
220
  false
215
221
  end
216
222
 
@@ -69,7 +69,7 @@ module OpenC3
69
69
  raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'"
70
70
  end
71
71
 
72
- def check_object(bucket:, key:)
72
+ def check_object(bucket:, key:, retries: true)
73
73
  raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'"
74
74
  end
75
75
 
@@ -22,7 +22,7 @@
22
22
 
23
23
  require 'openc3/core_ext/class'
24
24
  require 'openc3/core_ext/time'
25
- require 'openc3/topics/topic'
25
+ require 'openc3/utilities/store_queued'
26
26
  require 'socket'
27
27
  require 'logger'
28
28
  require 'time'
@@ -206,9 +206,9 @@ module OpenC3
206
206
  end
207
207
  unless @no_store
208
208
  if scope
209
- Topic.write_topic("#{scope}__openc3_log_messages", data)
209
+ EphemeralStoreQueued.write_topic("#{scope}__openc3_log_messages", data)
210
210
  else
211
- Topic.write_topic("NOSCOPE__openc3_log_messages", data)
211
+ EphemeralStoreQueued.write_topic("NOSCOPE__openc3_log_messages", data)
212
212
  end
213
213
  end
214
214
  end
@@ -68,9 +68,9 @@ module OpenC3
68
68
  @monitor_thread = Thread.new do
69
69
  begin
70
70
  monitor()
71
- rescue => err
72
- Logger.error("ProcessManager unexpectedly died\n#{err.formatted}", scope: 'DEFAULT')
73
- raise "ProcessManager unexpectedly died\n#{err.formatted}"
71
+ rescue => e
72
+ Logger.error("ProcessManager unexpectedly died\n#{e.formatted}", scope: 'DEFAULT')
73
+ raise "ProcessManager unexpectedly died\n#{e.formatted}"
74
74
  end
75
75
  end
76
76
  end
@@ -96,7 +96,9 @@ module OpenC3
96
96
  process.status.output = output
97
97
  if process.exit_code != 0
98
98
  process.status.state = "Crashed"
99
- elsif output.include?('"level":"ERROR"') || output.include?('"level":"WARN"')
99
+ elsif output.include?('"level":"ERROR"')
100
+ process.status.state = "Error"
101
+ elsif output.include?('"level":"WARN"')
100
102
  process.status.state = "Warning"
101
103
  else
102
104
  process.status.state = "Complete"
@@ -115,11 +117,15 @@ module OpenC3
115
117
  process.status.update
116
118
  end
117
119
  processes_to_delete.each do |process|
118
- if process.status.state == "Complete"
119
- Logger.info("Process #{process.status.name}:#{process.process_type}:#{process.detail} completed with state #{process.status.state}", scope: process.scope)
120
+ message = "Process #{process.status.name}:#{process.process_type}:#{process.detail} completed with state #{process.status.state}\nProcess Output:\n#{process.status.output}"
121
+ if process.status.state != "Complete"
122
+ if process.status.state == "Warning"
123
+ Logger.warn(message, scope: process.scope)
124
+ else
125
+ Logger.error(message, scope: process.scope)
126
+ end
120
127
  else
121
- Logger.error("Process #{process.status.name}:#{process.process_type}:#{process.detail} completed with state #{process.status.state}", scope: process.scope)
122
- Logger.error("Process Output:\n#{process.status.output}", scope: process.scope)
128
+ Logger.info(message, scope: process.scope)
123
129
  end
124
130
 
125
131
  @processes.delete(process)
@@ -131,7 +137,7 @@ module OpenC3
131
137
  scopes = ScopeModel.names
132
138
  scopes.each do |scope|
133
139
  statuses = ProcessStatusModel.get_all_models(scope: scope)
134
- statuses.each do |status_name, status|
140
+ statuses.each do |_status_name, status|
135
141
  if (current_time - Time.from_nsec_from_epoch(status.updated_at)) > CLEANUP_CYCLE_SECONDS
136
142
  status.destroy
137
143
  end
@@ -21,6 +21,7 @@
21
21
  # if purchased from OpenC3, Inc.
22
22
 
23
23
  require 'redis'
24
+ require "hiredis-client"
24
25
  require 'json'
25
26
  require 'connection_pool'
26
27
 
@@ -32,6 +33,36 @@ else
32
33
  end
33
34
 
34
35
  module OpenC3
36
+ class StoreConnectionPool < ConnectionPool
37
+ NO_OPTIONS = {}
38
+
39
+ def pipelined
40
+ if $openc3_redis_cluster
41
+ yield # TODO: Update keys to support pipelining in cluster
42
+ else
43
+ with(NO_OPTIONS) do |redis|
44
+ redis.pipelined do |pipeline|
45
+ Thread.current[:pipeline] = pipeline
46
+ begin
47
+ yield
48
+ ensure
49
+ Thread.current[:pipeline] = nil
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ def with(options = NO_OPTIONS, &block)
57
+ pipeline = Thread.current[:pipeline]
58
+ if pipeline
59
+ yield pipeline
60
+ else
61
+ super(options, &block)
62
+ end
63
+ end
64
+ end
65
+
35
66
  class Store
36
67
  # Variable that holds the singleton instance
37
68
  @instance = nil
@@ -67,7 +98,7 @@ module OpenC3
67
98
  @redis_username = ENV['OPENC3_REDIS_USERNAME']
68
99
  @redis_key = ENV['OPENC3_REDIS_PASSWORD']
69
100
  @redis_url = "redis://#{ENV['OPENC3_REDIS_HOSTNAME']}:#{ENV['OPENC3_REDIS_PORT']}"
70
- @redis_pool = ConnectionPool.new(size: pool_size) { build_redis() }
101
+ @redis_pool = StoreConnectionPool.new(size: pool_size) { build_redis() }
71
102
  end
72
103
 
73
104
  unless $openc3_redis_cluster
@@ -212,7 +243,7 @@ module OpenC3
212
243
  def initialize(pool_size = 10)
213
244
  super(pool_size)
214
245
  @redis_url = "redis://#{ENV['OPENC3_REDIS_EPHEMERAL_HOSTNAME']}:#{ENV['OPENC3_REDIS_EPHEMERAL_PORT']}"
215
- @redis_pool = ConnectionPool.new(size: pool_size) { build_redis() }
246
+ @redis_pool = StoreConnectionPool.new(size: pool_size) { build_redis() }
216
247
  end
217
248
  end
218
249
  end
@@ -60,19 +60,29 @@ module OpenC3
60
60
  end
61
61
  end
62
62
 
63
+ def set_update_interval(interval)
64
+ if interval < @update_interval and interval > 0.0
65
+ @update_interval = interval
66
+ end
67
+ end
68
+
69
+ def process_queue
70
+ unless @store_queue.empty?
71
+ # Pipeline the requests to redis to improve performance
72
+ @store.redis_pool.pipelined do
73
+ while !@store_queue.empty?
74
+ action = @store_queue.pop()
75
+ @store.public_send(action.message, *action.args, **action.kwargs, &action.block)
76
+ end
77
+ end
78
+ end
79
+ end
80
+
63
81
  def store_thread_body
64
82
  while true
65
83
  start_time = Time.now
66
84
 
67
- unless @store_queue.empty?
68
- # Pipeline the requests to redis to improve performance
69
- @store.pipelined do
70
- while !@store_queue.empty?
71
- action = @store_queue.pop()
72
- @store.method_missing(action.message, *action.args, **action.kwargs, &action.block)
73
- end
74
- end
75
- end
85
+ process_queue()
76
86
 
77
87
  # Only check whether to update at a set interval
78
88
  run_time = Time.now - start_time
@@ -87,25 +97,14 @@ module OpenC3
87
97
  OpenC3.kill_thread(self, @update_thread) if @update_thread
88
98
  @update_thread = nil
89
99
  # Drain the queue before shutdown
90
- unless @store_queue.empty?
91
- # Pipeline the requests to redis to improve performance
92
- @store.pipelined do
93
- while !@store_queue.empty?
94
- action = @store_queue.pop()
95
- @store.method_missing(action.message, *action.args, **action.kwargs, &action.block)
96
- end
97
- end
98
- end
100
+ process_queue()
99
101
  end
100
102
 
103
+ MessageStruct = Struct.new(:message, :args, :kwargs, :block)
104
+
101
105
  # Record the message for pipelining by the thread
102
106
  def method_missing(message, *args, **kwargs, &block)
103
- o = OpenStruct.new
104
- o.message = message
105
- o.args = args
106
- o.kwargs = kwargs
107
- o.block = block
108
- @store_queue.push(o)
107
+ @store_queue.push(MessageStruct.new(message, args, kwargs, block))
109
108
  end
110
109
 
111
110
  # Returns the store we're working with
@@ -1,14 +1,14 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- OPENC3_VERSION = '5.14.2'
3
+ OPENC3_VERSION = '5.15.1'
4
4
  module OpenC3
5
5
  module Version
6
6
  MAJOR = '5'
7
- MINOR = '14'
8
- PATCH = '2'
7
+ MINOR = '15'
8
+ PATCH = '1'
9
9
  OTHER = ''
10
- BUILD = 'e5d9da06d95d4404fba6f9fd5a74a130ef176bd4'
10
+ BUILD = 'e825c03f698ac51170218e43cec3c3cecefe58fa'
11
11
  end
12
- VERSION = '5.14.2'
13
- GEM_VERSION = '5.14.2'
12
+ VERSION = '5.15.1'
13
+ GEM_VERSION = '5.15.1'
14
14
  end
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "<%= tool_name %>",
3
- "version": "5.14.2",
3
+ "version": "5.15.1",
4
4
  "scripts": {
5
5
  "ng": "ng",
6
6
  "start": "ng serve",
@@ -12,7 +12,7 @@
12
12
  },
13
13
  "private": true,
14
14
  "dependencies": {
15
- "@openc3/tool-common": "5.14.2",
15
+ "@openc3/tool-common": "5.15.1",
16
16
  "@angular/animations": "^17.0.8",
17
17
  "@angular/cdk": "^17.0.4",
18
18
  "@angular/common": "^17.0.8",
@@ -11,7 +11,7 @@
11
11
  "smui-theme": "smui-theme compile build/smui.css -i src/theme"
12
12
  },
13
13
  "dependencies": {
14
- "@openc3/tool-common": "5.14.2",
14
+ "@openc3/tool-common": "5.15.1",
15
15
  "@astrouxds/astro-web-components": "7.20.0",
16
16
  "@smui/button": "^7.0.0-beta.16",
17
17
  "@smui/card": "^7.0.0-beta.16",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "<%= tool_name %>",
3
- "version": "5.14.2",
3
+ "version": "5.15.1",
4
4
  "private": true,
5
5
  "scripts": {
6
6
  "serve": "vue-cli-service serve",
@@ -11,7 +11,7 @@
11
11
  "test:components": "vue-cli-service test:components"
12
12
  },
13
13
  "dependencies": {
14
- "@openc3/tool-common": "5.14.2",
14
+ "@openc3/tool-common": "5.15.1",
15
15
  "@astrouxds/astro-web-components": "7.20.0",
16
16
  "axios": "1.6.5",
17
17
  "date-fns": "2.30.0",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "widget",
3
- "version": "5.14.2",
3
+ "version": "5.15.1",
4
4
  "private": true,
5
5
  "scripts": {
6
6
  "build": "vue-cli-service build --target lib --dest tools/widgets/<%= widget_name %> --formats umd-min <%= widget_path %> --name <%= widget_name %>"
7
7
  },
8
8
  "dependencies": {
9
- "@openc3/tool-common": "5.14.2",
9
+ "@openc3/tool-common": "5.15.1",
10
10
  "@astrouxds/astro-web-components": "7.20.0",
11
11
  "vue": "2.7.16",
12
12
  "vuetify": "2.7.1"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openc3
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.14.2
4
+ version: 5.15.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Melton
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-02-10 00:00:00.000000000 Z
12
+ date: 2024-03-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -179,6 +179,20 @@ dependencies:
179
179
  - - "~>"
180
180
  - !ruby/object:Gem::Version
181
181
  version: '5.0'
182
+ - !ruby/object:Gem::Dependency
183
+ name: hiredis-client
184
+ requirement: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - "~>"
187
+ - !ruby/object:Gem::Version
188
+ version: '0.20'
189
+ type: :runtime
190
+ prerelease: false
191
+ version_requirements: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - "~>"
194
+ - !ruby/object:Gem::Version
195
+ version: '0.20'
182
196
  - !ruby/object:Gem::Dependency
183
197
  name: rubyzip
184
198
  requirement: !ruby/object:Gem::Requirement
@@ -1167,7 +1181,6 @@ files:
1167
1181
  - templates/tool_angular/tsconfig.app.json
1168
1182
  - templates/tool_angular/tsconfig.json
1169
1183
  - templates/tool_angular/tsconfig.spec.json
1170
- - templates/tool_angular/yarn.lock
1171
1184
  - templates/tool_react/.eslintrc
1172
1185
  - templates/tool_react/.gitignore
1173
1186
  - templates/tool_react/.prettierignore
@@ -1178,7 +1191,6 @@ files:
1178
1191
  - templates/tool_react/src/root.component.js
1179
1192
  - templates/tool_react/src/root.component.test.js
1180
1193
  - templates/tool_react/webpack.config.js
1181
- - templates/tool_react/yarn.lock
1182
1194
  - templates/tool_svelte/.gitignore
1183
1195
  - templates/tool_svelte/.prettierignore
1184
1196
  - templates/tool_svelte/.prettierrc.js
@@ -1196,7 +1208,6 @@ files:
1196
1208
  - templates/tool_svelte/src/services/openc3-api.js
1197
1209
  - templates/tool_svelte/src/theme/_smui-theme.scss
1198
1210
  - templates/tool_svelte/src/tool_name.js
1199
- - templates/tool_svelte/yarn.lock
1200
1211
  - templates/tool_vue/.browserslistrc
1201
1212
  - templates/tool_vue/.env.standalone
1202
1213
  - templates/tool_vue/.eslintrc.js
@@ -1211,7 +1222,6 @@ files:
1211
1222
  - templates/tool_vue/src/router.js
1212
1223
  - templates/tool_vue/src/tools/tool_name/tool_name.vue
1213
1224
  - templates/tool_vue/vue.config.js
1214
- - templates/tool_vue/yarn.lock
1215
1225
  - templates/widget/.browserslistrc
1216
1226
  - templates/widget/.eslintrc.js
1217
1227
  - templates/widget/.nycrc
@@ -1222,7 +1232,6 @@ files:
1222
1232
  - templates/widget/package.json
1223
1233
  - templates/widget/src/Widget.vue
1224
1234
  - templates/widget/vue.config.js
1225
- - templates/widget/yarn.lock
1226
1235
  homepage: https://github.com/OpenC3/cosmos
1227
1236
  licenses:
1228
1237
  - AGPL-3.0-only