openc3 5.14.2 → 5.15.1

Sign up to get free protection for your applications and to get access to all the features.
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