openc3 7.2.0 → 7.2.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.
- checksums.yaml +4 -4
- data/bin/openc3cli +11 -23
- data/data/config/interface_modifiers.yaml +15 -0
- data/data/config/target.yaml +17 -0
- data/data/config/widgets.yaml +28 -1
- data/lib/openc3/accessors/binary_accessor.rb +4 -0
- data/lib/openc3/api/cmd_api.rb +5 -1
- data/lib/openc3/api/limits_api.rb +72 -0
- data/lib/openc3/microservices/decom_common.rb +15 -4
- data/lib/openc3/microservices/decom_microservice.rb +6 -1
- data/lib/openc3/microservices/interface_microservice.rb +25 -11
- data/lib/openc3/microservices/queue_microservice.rb +4 -2
- data/lib/openc3/migrations/20260701000000_updated_at_to_int.rb +55 -0
- data/lib/openc3/models/cvt_model.rb +2 -2
- data/lib/openc3/models/db_sharded_model.rb +2 -2
- data/lib/openc3/models/interface_model.rb +16 -10
- data/lib/openc3/models/interface_status_model.rb +2 -2
- data/lib/openc3/models/metric_model.rb +2 -2
- data/lib/openc3/models/microservice_status_model.rb +2 -2
- data/lib/openc3/models/model.rb +2 -6
- data/lib/openc3/models/plugin_model.rb +15 -14
- data/lib/openc3/models/python_package_model.rb +3 -1
- data/lib/openc3/models/reingest_job_model.rb +1 -1
- data/lib/openc3/models/script_status_model.rb +73 -38
- data/lib/openc3/models/target_model.rb +13 -0
- data/lib/openc3/operators/operator.rb +15 -5
- data/lib/openc3/packets/commands.rb +3 -3
- data/lib/openc3/packets/limits.rb +23 -0
- data/lib/openc3/packets/packet.rb +5 -3
- data/lib/openc3/packets/packet_config.rb +5 -1
- data/lib/openc3/packets/structure.rb +14 -10
- data/lib/openc3/script/limits.rb +1 -1
- data/lib/openc3/script/suite_runner.rb +43 -9
- data/lib/openc3/script/web_socket_api.rb +1 -1
- data/lib/openc3/system/target.rb +4 -1
- data/lib/openc3/tools/table_manager/table_config.rb +4 -1
- data/lib/openc3/top_level.rb +1 -1
- data/lib/openc3/topics/limits_event_topic.rb +62 -3
- data/lib/openc3/topics/telemetry_decom_topic.rb +2 -2
- data/lib/openc3/utilities/cli_generator.rb +5 -1
- data/lib/openc3/utilities/env_helper.rb +13 -1
- data/lib/openc3/utilities/pypi_url.rb +39 -0
- data/lib/openc3/utilities/reingest_job.rb +1 -1
- data/lib/openc3/utilities/running_script.rb +17 -12
- data/lib/openc3/utilities/script.rb +14 -3
- data/lib/openc3/utilities/store_autoload.rb +39 -1
- data/lib/openc3/utilities/store_queued.rb +5 -1
- data/lib/openc3/version.rb +5 -5
- data/lib/openc3.rb +6 -1
- data/templates/tool_angular/package.json +2 -2
- data/templates/tool_react/package.json +1 -1
- data/templates/tool_svelte/package.json +1 -1
- data/templates/tool_vue/package.json +3 -3
- data/templates/widget/package.json +2 -2
- metadata +3 -1
|
@@ -39,9 +39,15 @@ module OpenC3
|
|
|
39
39
|
case event[:type]
|
|
40
40
|
when :LIMITS_CHANGE
|
|
41
41
|
# The current_limits hash keeps only the current limits state of items
|
|
42
|
-
# It is used by the API to determine the overall limits state
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
# It is used by the API to determine the overall limits state.
|
|
43
|
+
# When the event originates from a stored packet in a non-PROCESS mode
|
|
44
|
+
# (LOG or DISABLE), skip updating current_limits so that historical
|
|
45
|
+
# data does not affect the real-time overall limits state or the
|
|
46
|
+
# out_of_limits API response.
|
|
47
|
+
unless event[:suppress_stored]
|
|
48
|
+
field = "#{event[:target_name]}__#{event[:packet_name]}__#{event[:item_name]}"
|
|
49
|
+
Store.hset("#{scope}__current_limits", field, event[:new_limits_state])
|
|
50
|
+
end
|
|
45
51
|
|
|
46
52
|
when :LIMITS_SETTINGS
|
|
47
53
|
# Limits updated in limits_api.rb to avoid circular reference to TargetModel
|
|
@@ -79,6 +85,19 @@ module OpenC3
|
|
|
79
85
|
limits_settings['enabled'] = event[:enabled]
|
|
80
86
|
Store.hset("#{scope}__current_limits_settings", field, JSON.generate(limits_settings, allow_nan: true))
|
|
81
87
|
|
|
88
|
+
when :LIMITS_STATE_COLOR
|
|
89
|
+
# Persist the state color so it survives a decom microservice restart (applied by sync_system)
|
|
90
|
+
field = "#{event[:target_name]}__#{event[:packet_name]}__#{event[:item_name]}"
|
|
91
|
+
limits_settings = Store.hget("#{scope}__current_limits_settings", field)
|
|
92
|
+
if limits_settings
|
|
93
|
+
limits_settings = JSON.parse(limits_settings, allow_nan: true, create_additions: true)
|
|
94
|
+
else
|
|
95
|
+
limits_settings = {}
|
|
96
|
+
end
|
|
97
|
+
limits_settings['state_colors'] ||= {}
|
|
98
|
+
limits_settings['state_colors'][event[:state_name].to_s] = event[:color].to_s
|
|
99
|
+
Store.hset("#{scope}__current_limits_settings", field, JSON.generate(limits_settings, allow_nan: true))
|
|
100
|
+
|
|
82
101
|
when :LIMITS_SET
|
|
83
102
|
sets = sets(scope: scope)
|
|
84
103
|
raise "Set '#{event[:set]}' does not exist!" unless sets.key?(event[:set])
|
|
@@ -173,6 +192,28 @@ module OpenC3
|
|
|
173
192
|
end
|
|
174
193
|
end
|
|
175
194
|
|
|
195
|
+
# Removes a limits set from the limits_sets hash and from the
|
|
196
|
+
# current_limits_settings of every item. Note that the set is not removed
|
|
197
|
+
# from the TargetModel packet definitions; that is cleaned up on the next
|
|
198
|
+
# plugin install. Running microservices will continue to hold the set in
|
|
199
|
+
# memory until they restart and resync from current_limits_settings.
|
|
200
|
+
def self.delete_set(set_name, scope:)
|
|
201
|
+
set_name = set_name.to_s
|
|
202
|
+
limits_settings = Store.hgetall("#{scope}__current_limits_settings")
|
|
203
|
+
# Collect all changed items and write them back in a single hmset to
|
|
204
|
+
# avoid a Redis round trip per item (this hash can be large)
|
|
205
|
+
updates = {}
|
|
206
|
+
limits_settings.each do |item, settings|
|
|
207
|
+
settings = JSON.parse(settings, allow_nan: true, create_additions: true)
|
|
208
|
+
if settings.key?(set_name)
|
|
209
|
+
settings.delete(set_name)
|
|
210
|
+
updates[item] = JSON.generate(settings, allow_nan: true)
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
Store.hmset("#{scope}__current_limits_settings", *updates.flatten) unless updates.empty?
|
|
214
|
+
Store.hdel("#{scope}__limits_sets", set_name)
|
|
215
|
+
end
|
|
216
|
+
|
|
176
217
|
# Update the local System based on overall state
|
|
177
218
|
def self.sync_system(scope:)
|
|
178
219
|
all_limits_settings = Store.hgetall("#{scope}__current_limits_settings")
|
|
@@ -188,6 +229,12 @@ module OpenC3
|
|
|
188
229
|
persistence = limits_settings['persistence_setting']
|
|
189
230
|
limits_settings.each do |limits_set, settings|
|
|
190
231
|
next unless Hash === settings
|
|
232
|
+
if limits_set == 'state_colors'
|
|
233
|
+
settings.each do |state_name, color|
|
|
234
|
+
System.limits.set_state_color(target_name, packet_name, item_name, state_name, color)
|
|
235
|
+
end
|
|
236
|
+
next
|
|
237
|
+
end
|
|
191
238
|
System.limits.set(target_name, packet_name, item_name, settings['red_low'], settings['yellow_low'], settings['yellow_high'], settings['red_high'], settings['green_low'], settings['green_high'], limits_set.to_s.intern, persistence, enabled)
|
|
192
239
|
end
|
|
193
240
|
if not enabled.nil?
|
|
@@ -242,6 +289,18 @@ module OpenC3
|
|
|
242
289
|
end
|
|
243
290
|
end
|
|
244
291
|
|
|
292
|
+
when 'LIMITS_STATE_COLOR'
|
|
293
|
+
target_name = event['target_name']
|
|
294
|
+
packet_name = event['packet_name']
|
|
295
|
+
item_name = event['item_name']
|
|
296
|
+
target = telemetry[target_name]
|
|
297
|
+
if target
|
|
298
|
+
packet = target[packet_name]
|
|
299
|
+
if packet
|
|
300
|
+
System.limits.set_state_color(target_name, packet_name, item_name, event['state_name'], event['color'])
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
|
|
245
304
|
when 'LIMITS_SET'
|
|
246
305
|
System.limits_set = event['set']
|
|
247
306
|
end
|
|
@@ -20,7 +20,7 @@ require 'openc3/utilities/open_telemetry'
|
|
|
20
20
|
|
|
21
21
|
module OpenC3
|
|
22
22
|
class TelemetryDecomTopic < Topic
|
|
23
|
-
def self.write_packet(packet, id: nil, scope:)
|
|
23
|
+
def self.write_packet(packet, id: nil, include_limits_states: true, scope:)
|
|
24
24
|
OpenC3.in_span("write_packet") do
|
|
25
25
|
# Need to build a JSON hash of the decommutated data
|
|
26
26
|
# Support "downward typing"
|
|
@@ -29,7 +29,7 @@ module OpenC3
|
|
|
29
29
|
# If nothing - item does not exist - nil
|
|
30
30
|
# __ as separators ITEM1, ITEM1__C, ITEM1__F
|
|
31
31
|
|
|
32
|
-
json_hash = CvtModel.build_json_from_packet(packet)
|
|
32
|
+
json_hash = CvtModel.build_json_from_packet(packet, include_limits_states: include_limits_states)
|
|
33
33
|
# Convert to JSON-safe types once and reuse for both topic write and CVT set
|
|
34
34
|
json_safe_hash = json_hash.as_json
|
|
35
35
|
json_data = JSON.generate(json_safe_hash, allow_nan: true)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# encoding:
|
|
1
|
+
# encoding: utf-8
|
|
2
2
|
|
|
3
3
|
# Copyright 2026 OpenC3, Inc.
|
|
4
4
|
# All Rights Reserved.
|
|
@@ -478,6 +478,10 @@ RUBY
|
|
|
478
478
|
VARIABLE #{target_name.downcase}_target_name #{target_name}
|
|
479
479
|
|
|
480
480
|
TARGET #{target_name} <%= #{target_name.downcase}_target_name %>
|
|
481
|
+
# Decom tlm and cmd data in the time-series database is kept forever by default.
|
|
482
|
+
# Uncomment to enforce a 30 day retention time. See https://docs.openc3.com/docs/configuration/plugins
|
|
483
|
+
# CMD_DECOM_RETAIN_TIME 30d
|
|
484
|
+
# TLM_DECOM_RETAIN_TIME 30d
|
|
481
485
|
#{interface_line}
|
|
482
486
|
MAP_TARGET <%= #{target_name.downcase}_target_name %>
|
|
483
487
|
DOC
|
|
@@ -1,4 +1,16 @@
|
|
|
1
|
-
#
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2026 OpenC3, Inc.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
#
|
|
6
|
+
# This program is distributed in the hope that it will be useful,
|
|
7
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
8
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
9
|
+
# See LICENSE.md for more details.
|
|
10
|
+
#
|
|
11
|
+
# This file may also be used under the terms of a commercial license
|
|
12
|
+
# if purchased from OpenC3, Inc.
|
|
13
|
+
|
|
2
14
|
class EnvHelper
|
|
3
15
|
def self.enabled?(key)
|
|
4
16
|
['true', '1', 'yes', 'on'].include?(ENV[key].to_s.downcase)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2026 OpenC3, Inc.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
#
|
|
6
|
+
# This program is distributed in the hope that it will be useful,
|
|
7
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
8
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
9
|
+
# See LICENSE.md for more details.
|
|
10
|
+
#
|
|
11
|
+
# This file may also be used under the terms of a commercial license
|
|
12
|
+
# if purchased from OpenC3, Inc.
|
|
13
|
+
|
|
14
|
+
require 'uri'
|
|
15
|
+
require 'openc3/utilities/logger'
|
|
16
|
+
|
|
17
|
+
module OpenC3
|
|
18
|
+
class PypiUrl
|
|
19
|
+
DEFAULT = 'https://pypi.org/simple'
|
|
20
|
+
|
|
21
|
+
# Validate that a resolved pypi_url is an http(s) URL before it is handed to
|
|
22
|
+
# pip. The value can come from a user-writable setting or ENV, so a malformed
|
|
23
|
+
# or non-http value is rejected and replaced with the default rather than
|
|
24
|
+
# passed through to pip.
|
|
25
|
+
#
|
|
26
|
+
# @param pypi_url [String] the resolved pypi index url to validate
|
|
27
|
+
# @return [String] the original url if valid, otherwise DEFAULT
|
|
28
|
+
def self.validate(pypi_url)
|
|
29
|
+
uri = URI.parse(pypi_url)
|
|
30
|
+
unless uri.is_a?(URI::HTTP) && !uri.host.to_s.empty?
|
|
31
|
+
raise URI::InvalidURIError, "not an http(s) URL"
|
|
32
|
+
end
|
|
33
|
+
pypi_url
|
|
34
|
+
rescue URI::InvalidURIError => e
|
|
35
|
+
Logger.error("Invalid pypi_url '#{pypi_url}' (#{e.message}); falling back to #{DEFAULT}")
|
|
36
|
+
DEFAULT
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -513,10 +513,10 @@ class RunningScript
|
|
|
513
513
|
errors: nil, # array of errors that occurred during the script run
|
|
514
514
|
pid: nil, # pid of the script process - set by the script itself when it starts
|
|
515
515
|
script_engine: script_engine, # script engine filename
|
|
516
|
-
updated_at: nil, # Set by create/update
|
|
516
|
+
updated_at: nil, # Set by create/update
|
|
517
517
|
scope: scope # Scope of the script
|
|
518
518
|
)
|
|
519
|
-
script_status.create(
|
|
519
|
+
script_status.create()
|
|
520
520
|
|
|
521
521
|
# Set proper secrets for running script
|
|
522
522
|
process.environment['SECRET_KEY_BASE'] = nil
|
|
@@ -827,17 +827,22 @@ class RunningScript
|
|
|
827
827
|
|
|
828
828
|
def run
|
|
829
829
|
if @script_status.suite_runner
|
|
830
|
-
|
|
831
|
-
|
|
830
|
+
# Normalize the received hash through the shared helper so options/method
|
|
831
|
+
# defaults and validation match what openc3cli and the GUI construct.
|
|
832
|
+
sr = OpenC3::SuiteRunner.build_options(
|
|
833
|
+
suite: @script_status.suite_runner['suite'],
|
|
834
|
+
group: @script_status.suite_runner['group'],
|
|
835
|
+
script: @script_status.suite_runner['script'],
|
|
836
|
+
method: @script_status.suite_runner['method'],
|
|
837
|
+
options: @script_status.suite_runner['options'],
|
|
838
|
+
)
|
|
839
|
+
parse_options(sr['options'])
|
|
840
|
+
if sr['script']
|
|
841
|
+
run_text("OpenC3::SuiteRunner.start(#{sr['suite']}, #{sr['group']}, '#{sr['script']}')", initial_filename: "SCRIPTRUNNER")
|
|
842
|
+
elsif sr['group']
|
|
843
|
+
run_text("OpenC3::SuiteRunner.#{sr['method']}(#{sr['suite']}, #{sr['group']})", initial_filename: "SCRIPTRUNNER")
|
|
832
844
|
else
|
|
833
|
-
|
|
834
|
-
end
|
|
835
|
-
if @script_status.suite_runner['script']
|
|
836
|
-
run_text("OpenC3::SuiteRunner.start(#{@script_status.suite_runner['suite']}, #{@script_status.suite_runner['group']}, '#{@script_status.suite_runner['script']}')", initial_filename: "SCRIPTRUNNER")
|
|
837
|
-
elsif script_status.suite_runner['group']
|
|
838
|
-
run_text("OpenC3::SuiteRunner.#{@script_status.suite_runner['method']}(#{@script_status.suite_runner['suite']}, #{@script_status.suite_runner['group']})", initial_filename: "SCRIPTRUNNER")
|
|
839
|
-
else
|
|
840
|
-
run_text("OpenC3::SuiteRunner.#{@script_status.suite_runner['method']}(#{@script_status.suite_runner['suite']})", initial_filename: "SCRIPTRUNNER")
|
|
845
|
+
run_text("OpenC3::SuiteRunner.#{sr['method']}(#{sr['suite']})", initial_filename: "SCRIPTRUNNER")
|
|
841
846
|
end
|
|
842
847
|
else
|
|
843
848
|
if not @script_engine and (@script_status.start_line_no != 1 or !@script_status.end_line_no.nil?)
|
|
@@ -139,16 +139,23 @@ class Script < OpenC3::TargetFile
|
|
|
139
139
|
process.io.stdout = stdout
|
|
140
140
|
process.io.stderr = stderr
|
|
141
141
|
process.start
|
|
142
|
-
|
|
142
|
+
begin
|
|
143
|
+
process.poll_for_exit(10) # wait for max 10s
|
|
144
|
+
rescue ChildProcess::TimeoutError
|
|
145
|
+
process.stop
|
|
146
|
+
stderr_results = "Suite analysis timed out - possible infinite loop in script\n"
|
|
147
|
+
success = false
|
|
148
|
+
end
|
|
143
149
|
stdout.rewind
|
|
144
150
|
stdout_results = stdout.read
|
|
145
151
|
stdout.close
|
|
146
152
|
stdout.unlink
|
|
147
153
|
stderr.rewind
|
|
148
|
-
stderr_results
|
|
154
|
+
stderr_results ||= ""
|
|
155
|
+
stderr_results += stderr.read
|
|
149
156
|
stderr.close
|
|
150
157
|
stderr.unlink
|
|
151
|
-
success = process.exit_code == 0
|
|
158
|
+
success = process.exit_code == 0 if success
|
|
152
159
|
else
|
|
153
160
|
require temp.path
|
|
154
161
|
stdout_results = OpenC3::SuiteRunner.build_suites.as_json().to_json(allow_nan: true)
|
|
@@ -203,6 +210,10 @@ class Script < OpenC3::TargetFile
|
|
|
203
210
|
line_no = nil,
|
|
204
211
|
end_line_no = nil
|
|
205
212
|
)
|
|
213
|
+
# Verify the script exists before spawning a run. Without this check a run
|
|
214
|
+
# is started and the missing file only surfaces as a runtime error inside
|
|
215
|
+
# the spawned process. Returning nil lets the caller return a 404.
|
|
216
|
+
return nil unless Script.body(scope, name)
|
|
206
217
|
RunningScript.spawn(scope, name, suite_runner, disconnect, environment, user_full_name, username, line_no, end_line_no)
|
|
207
218
|
end
|
|
208
219
|
|
|
@@ -123,8 +123,46 @@ module OpenC3
|
|
|
123
123
|
@redis_pool = StoreConnectionPool.new(size: pool_size) { build_redis() }
|
|
124
124
|
end
|
|
125
125
|
|
|
126
|
+
# cap/base for the equal-jitter reconnect backoff (seconds)
|
|
127
|
+
REDIS_BACKOFF_CAP = 5.0
|
|
128
|
+
REDIS_BACKOFF_BASE = 0.625
|
|
129
|
+
|
|
126
130
|
def build_redis
|
|
127
|
-
|
|
131
|
+
# reconnect_attempts retries the connection a few times with equal-jitter
|
|
132
|
+
# backoff so a transient network blip is handled inside the client instead
|
|
133
|
+
# of immediately surfacing a connection error to callers. The jitter
|
|
134
|
+
# de-syncs many clients retrying the same blip to avoid a thundering herd
|
|
135
|
+
# on recovery.
|
|
136
|
+
#
|
|
137
|
+
# This mirrors the Python store's Retry(EqualJitterBackoff(cap: 5, base:
|
|
138
|
+
# 0.625), 3): per-retry backoff tops out at 5s on the final (3rd) retry
|
|
139
|
+
# (~0.6-1.25s, ~1.25-2.5s, ~2.5-5s). redis-rb takes a fixed Array of delays
|
|
140
|
+
# (no per-failure backoff callable), so we sample the jittered delays once
|
|
141
|
+
# per connection here.
|
|
142
|
+
# Connection, read, and write timeouts are left as the default: 1s
|
|
143
|
+
return Redis.new(
|
|
144
|
+
url: @redis_url,
|
|
145
|
+
username: @redis_username,
|
|
146
|
+
password: @redis_key,
|
|
147
|
+
reconnect_attempts: reconnect_backoff_delays()
|
|
148
|
+
)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Equal-jitter backoff delays for 3 retries, matching Python's
|
|
152
|
+
# EqualJitterBackoff. Each retry's delay is randomized within the upper half
|
|
153
|
+
# of an exponentially-growing ceiling.
|
|
154
|
+
def reconnect_backoff_delays
|
|
155
|
+
(1..3).map do |failures|
|
|
156
|
+
# ceiling = exponential growth (base doubles each retry), clamped to cap.
|
|
157
|
+
# For base=0.625, cap=5: failures 1,2,3 -> 1.25, 2.5, 5.0 seconds.
|
|
158
|
+
# temp = half the ceiling: the guaranteed minimum wait for this retry.
|
|
159
|
+
temp = [REDIS_BACKOFF_CAP, REDIS_BACKOFF_BASE * (2 ** failures)].min / 2.0
|
|
160
|
+
# Final delay = fixed half (temp) + random half (rand*temp, in [0, temp)),
|
|
161
|
+
# i.e. a value uniformly in [temp, 2*temp) = [ceiling/2, ceiling).
|
|
162
|
+
# The fixed half keeps a sane floor; the random half de-syncs clients so
|
|
163
|
+
# they don't all reconnect in lockstep (thundering herd) after a blip.
|
|
164
|
+
temp + rand * temp
|
|
165
|
+
end
|
|
128
166
|
end
|
|
129
167
|
|
|
130
168
|
###########################################################################
|
|
@@ -103,7 +103,11 @@ module OpenC3
|
|
|
103
103
|
OpenC3.kill_thread(self, @update_thread) if @update_thread
|
|
104
104
|
@update_thread = nil
|
|
105
105
|
# Drain the queue before shutdown
|
|
106
|
-
|
|
106
|
+
begin
|
|
107
|
+
process_queue()
|
|
108
|
+
rescue
|
|
109
|
+
# Best effort - Redis may already be unavailable during shutdown
|
|
110
|
+
end
|
|
107
111
|
end
|
|
108
112
|
|
|
109
113
|
MessageStruct = Struct.new(:message, :args, :kwargs, :block)
|
data/lib/openc3/version.rb
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# encoding: ascii-8bit
|
|
2
2
|
|
|
3
|
-
OPENC3_VERSION = '7.2.
|
|
3
|
+
OPENC3_VERSION = '7.2.1'
|
|
4
4
|
module OpenC3
|
|
5
5
|
module Version
|
|
6
6
|
MAJOR = '7'
|
|
7
7
|
MINOR = '2'
|
|
8
|
-
PATCH = '
|
|
8
|
+
PATCH = '1'
|
|
9
9
|
OTHER = ''
|
|
10
|
-
BUILD = '
|
|
10
|
+
BUILD = 'c0b096796e3070340b34bc4368c21f3972ede7a4'
|
|
11
11
|
end
|
|
12
|
-
VERSION = '7.2.
|
|
13
|
-
GEM_VERSION = '7.2.
|
|
12
|
+
VERSION = '7.2.1'
|
|
13
|
+
GEM_VERSION = '7.2.1'
|
|
14
14
|
end
|
data/lib/openc3.rb
CHANGED
|
@@ -19,7 +19,12 @@ require 'resolv-replace'
|
|
|
19
19
|
# Set default encodings
|
|
20
20
|
saved_verbose = $VERBOSE; $VERBOSE = nil
|
|
21
21
|
Encoding.default_external = Encoding::ASCII_8BIT
|
|
22
|
-
Encoding.default_internal =
|
|
22
|
+
# NOTE: Do NOT set Encoding.default_internal = ASCII_8BIT. Doing so makes every
|
|
23
|
+
# read that specifies an encoding (e.g. File.read(path, encoding: 'UTF-8'))
|
|
24
|
+
# transcode into ASCII-8BIT, which raises Encoding::UndefinedConversionError on
|
|
25
|
+
# any non-ASCII byte. On Ruby 3.4 this breaks bootsnap's compile cache (it reads
|
|
26
|
+
# source as UTF-8 to work around Ruby bug #22023) for any file containing
|
|
27
|
+
# non-ASCII characters, including stdlib files like 'matrix'. Leave it nil.
|
|
23
28
|
$VERBOSE = saved_verbose
|
|
24
29
|
|
|
25
30
|
# Add OpenC3 bin folder to PATH
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "<%= tool_name %>",
|
|
3
|
-
"version": "7.2.
|
|
3
|
+
"version": "7.2.1",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"ng": "ng",
|
|
6
6
|
"start": "ng serve",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"@angular/platform-browser-dynamic": "^18.2.6",
|
|
24
24
|
"@angular/router": "^18.2.6",
|
|
25
25
|
"@astrouxds/astro-web-components": "^7.24.0",
|
|
26
|
-
"@openc3/js-common": "7.2.
|
|
26
|
+
"@openc3/js-common": "7.2.1",
|
|
27
27
|
"rxjs": "~7.8.0",
|
|
28
28
|
"single-spa": "^5.9.5",
|
|
29
29
|
"single-spa-angular": "^9.2.0",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "<%= tool_name %>",
|
|
3
|
-
"version": "7.2.
|
|
3
|
+
"version": "7.2.1",
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@astrouxds/astro-web-components": "^7.24.0",
|
|
14
|
-
"@openc3/js-common": "7.2.
|
|
15
|
-
"@openc3/vue-common": "7.2.
|
|
14
|
+
"@openc3/js-common": "7.2.1",
|
|
15
|
+
"@openc3/vue-common": "7.2.1",
|
|
16
16
|
"axios": "^1.7.7",
|
|
17
17
|
"date-fns": "^4.1.0",
|
|
18
18
|
"lodash": "^4.17.21",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "<%= widget_name %>",
|
|
3
|
-
"version": "7.2.
|
|
3
|
+
"version": "7.2.1",
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"@astrouxds/astro-web-components": "^7.24.0",
|
|
11
|
-
"@openc3/vue-common": "7.2.
|
|
11
|
+
"@openc3/vue-common": "7.2.1",
|
|
12
12
|
"vuetify": "^3.7.1"
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
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: 7.2.
|
|
4
|
+
version: 7.2.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ryan Melton
|
|
@@ -1106,6 +1106,7 @@ files:
|
|
|
1106
1106
|
- lib/openc3/migrations/20250402000000_periodic_only_default.rb
|
|
1107
1107
|
- lib/openc3/migrations/20260203000000_remove_store_id.rb
|
|
1108
1108
|
- lib/openc3/migrations/20260204000000_remove_decom_reducer.rb
|
|
1109
|
+
- lib/openc3/migrations/20260701000000_updated_at_to_int.rb
|
|
1109
1110
|
- lib/openc3/models/activity_model.rb
|
|
1110
1111
|
- lib/openc3/models/auth_model.rb
|
|
1111
1112
|
- lib/openc3/models/cvt_model.rb
|
|
@@ -1259,6 +1260,7 @@ files:
|
|
|
1259
1260
|
- lib/openc3/utilities/migration.rb
|
|
1260
1261
|
- lib/openc3/utilities/open_telemetry.rb
|
|
1261
1262
|
- lib/openc3/utilities/process_manager.rb
|
|
1263
|
+
- lib/openc3/utilities/pypi_url.rb
|
|
1262
1264
|
- lib/openc3/utilities/python_proxy.rb
|
|
1263
1265
|
- lib/openc3/utilities/quaternion.rb
|
|
1264
1266
|
- lib/openc3/utilities/questdb_client.rb
|