openc3 6.2.0 → 6.3.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.
@@ -14,202 +14,26 @@
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 2025, OpenC3, Inc.
18
18
  # All Rights Reserved
19
19
  #
20
20
  # This file may also be used under the terms of a commercial license
21
21
  # if purchased from OpenC3, Inc.
22
22
 
23
- require 'irb'
24
23
  require 'irb/ruby-lex'
25
- require 'stringio'
26
-
27
- # Clear the $VERBOSE global since we're overriding methods
28
- old_verbose = $VERBOSE; $VERBOSE = nil
29
- class RubyLex
30
- attr_accessor :indent
31
- attr_accessor :line_no
32
- attr_accessor :exp_line_no
33
- attr_accessor :tokens
34
- attr_accessor :code_block_open
35
- attr_accessor :ltype
36
- attr_accessor :line
37
- attr_accessor :continue
38
-
39
- def reinitialize
40
- @line_no = 1
41
- @prompt = nil
42
- initialize_input()
43
- end
44
- end
45
- $VERBOSE = old_verbose
24
+ require 'prism'
46
25
 
47
26
  class RubyLexUtils
48
- # Regular expression to detect blank lines
49
- BLANK_LINE_REGEX = /^\s*$/
50
- # Regular expression to detect lines containing only 'else'
51
- LONELY_ELSE_REGEX = /^\s*else\s*$/
52
-
53
- KEY_KEYWORDS = [
54
- 'class'.freeze,
55
- 'module'.freeze,
56
- 'def'.freeze,
57
- 'undef'.freeze,
58
- 'begin'.freeze,
59
- 'rescue'.freeze,
60
- 'ensure'.freeze,
61
- 'end'.freeze,
62
- 'if'.freeze,
63
- 'unless'.freeze,
64
- 'then'.freeze,
65
- 'elsif'.freeze,
66
- 'else'.freeze,
67
- 'case'.freeze,
68
- 'when'.freeze,
69
- 'while'.freeze,
70
- 'until'.freeze,
71
- 'for'.freeze,
72
- 'break'.freeze,
73
- 'next'.freeze,
74
- 'redo'.freeze,
75
- 'retry'.freeze,
76
- 'in'.freeze,
77
- 'do'.freeze,
78
- 'return'.freeze,
79
- 'alias'.freeze
80
- ]
81
-
82
- # Create a new RubyLex and StringIO to hold the text to operate on
83
- def initialize
84
- # Taken from https://github.com/ruby/ruby/blob/master/test/irb/test_ruby_lex.rb#L827
85
- IRB.init_config(nil)
86
- IRB.conf[:VERBOSE] = false
87
- # IRB.setup doesn't work because the command line options are passed
88
- # and it doesn't recognize --warnings when we run rspec (see spec.rake)
89
- # IRB.setup(__FILE__)
90
- workspace = IRB::WorkSpace.new(binding)
91
- @context = IRB::Context.new(nil, workspace)
92
-
93
- @lex = RubyLex.new
94
- @lex_io = StringIO.new('')
95
- end
96
-
97
- def ripper_lex_without_warning(code)
98
- RubyLex.ripper_lex_without_warning(code)
99
- end
100
-
101
- # @param text [String]
102
- # @return [Boolean] Whether the text contains the 'begin' keyword
103
- def contains_begin?(text)
104
- @lex.reinitialize
105
- @lex_io.string = text
106
- @lex.set_input(@lex_io, context: @context)
107
- tokens = ripper_lex_without_warning(text)
108
- tokens.each do |token|
109
- if token[1] == :on_kw and token[2] == 'begin'
110
- return true
111
- end
112
- end
113
- return false
114
- end
115
-
116
- # @param text [String]
117
- # @return [Boolean] Whether the text contains the 'end' keyword
118
- def contains_end?(text)
119
- @lex.reinitialize
120
- @lex_io.string = text
121
- @lex.set_input(@lex_io, context: @context)
122
- tokens = ripper_lex_without_warning(text)
123
- tokens.each do |token|
124
- if token[1] == :on_kw and token[2] == 'end'
125
- return true
126
- end
127
- end
128
- return false
129
- end
130
-
131
- # @param text [String]
132
- # @return [Boolean] Whether the text contains a Ruby keyword
133
- def contains_keyword?(text)
134
- @lex.reinitialize
135
- @lex_io.string = text
136
- @lex.set_input(@lex_io, context: @context)
137
- tokens = ripper_lex_without_warning(text)
138
- tokens.each do |token|
139
- if token[1] == :on_kw
140
- if KEY_KEYWORDS.include?(token[2])
141
- return true
142
- end
143
- elsif token[1] == :on_lbrace and !token[3].allbits?(Ripper::EXPR_BEG | Ripper::EXPR_LABEL)
144
- return true
145
- end
146
- end
147
- return false
148
- end
149
-
150
- # @param text [String]
151
- # @return [Boolean] Whether the text contains a keyword which starts a block.
152
- # i.e. 'do', '{', or 'begin'
153
- def contains_block_beginning?(text)
154
- @lex.reinitialize
155
- @lex_io.string = text
156
- @lex.set_input(@lex_io, context: @context)
157
- tokens = ripper_lex_without_warning(text)
158
- tokens.each do |token|
159
- if token[1] == :on_kw
160
- if token[2] == 'begin' || token[2] == 'do'
161
- return true
162
- end
163
- elsif token[1] == :on_lbrace
164
- return true
165
- end
166
- end
167
- return false
168
- end
27
+ OPENING_DELIMITER_TYPES = %i(PARENTHESIS_LEFT BRACKET_LEFT BRACE_LEFT BRACKET_LEFT_ARRAY)
28
+ CLOSING_DELIMITER_TYPES = %i(PARENTHESIS_RIGHT BRACKET_RIGHT BRACE_RIGHT BRACKET_RIGHT_ARRAY)
169
29
 
170
- def continue_block?(text)
171
- @lex.reinitialize
172
- @lex_io.string = text
173
- @lex.set_input(@lex_io, context: @context)
174
- tokens = RubyLex.ripper_lex_without_warning(text)
175
- index = tokens.length - 1
176
- while index > 0
177
- token = tokens[index]
178
- return true if token[1] == :on_kw and token[2] == "do"
179
- index -= 1
180
- end
181
- return false
182
- end
183
-
184
- # @param text [String]
185
- # @param progress_dialog [OpenC3::ProgressDialog] If this is set, the overall
186
- # progress will be set as the processing progresses
187
- # @return [String] The text with all comments removed
188
- def remove_comments(text, progress_dialog = nil)
189
- @lex.reinitialize
190
- @lex_io.string = text
191
- @lex.set_input(@lex_io, context: @context)
192
- comments_removed = ""
193
- token_count = 0
194
- progress = 0.0
195
- tokens = ripper_lex_without_warning(text)
196
- tokens.each do |token|
197
- token_count += 1
198
- if token[1] != :on_comment
199
- comments_removed << token[2]
200
- else
201
- newline_count = token[2].count("\n")
202
- comments_removed << ("\n" * newline_count)
203
- end
204
- if progress_dialog and token_count % 10000 == 0
205
- progress += 0.01
206
- progress = 0.0 if progress >= 0.99
207
- progress_dialog.set_overall_progress(progress)
208
- end
209
- end
210
-
211
- return comments_removed
212
- end
30
+ UNINSTRUMENTABLE_KEYWORDS = %i(
31
+ KEYWORD_CLASS KEYWORD_MODULE KEYWORD_DEF KEYWORD_UNDEF KEYWORD_BEGIN KEYWORD_RESCUE
32
+ KEYWORD_ENSURE KEYWORD_END KEYWORD_IF KEYWORD_UNLESS
33
+ KEYWORD_THEN KEYWORD_ELSIF KEYWORD_ELSE KEYWORD_CASE KEYWORD_WHEN
34
+ KEYWORD_WHILE KEYWORD_UNTIL KEYWORD_FOR KEYWORD_BREAK KEYWORD_NEXT
35
+ KEYWORD_REDO KEYWORD_RETRY KEYWORD_IN KEYWORD_DO KEYWORD_RETURN KEYWORD_ALIAS
36
+ )
213
37
 
214
38
  # Yields each lexed segment and if the segment is instrumentable
215
39
  #
@@ -219,113 +43,124 @@ class RubyLexUtils
219
43
  # @yieldparam inside_begin [Integer] The level of indentation
220
44
  # @yieldparam line_no [Integer] The current line number
221
45
  def each_lexed_segment(text)
222
- inside_begin = false
223
- lex = RubyLex.new
224
- lex_io = StringIO.new(text)
225
- lex.set_input(lex_io, context: @context)
226
- lex.line = ''
227
46
  line = ''
228
- indent = 0
229
- continue_indent = nil
230
47
  begin_indent = nil
231
- previous_line_indent = 0
48
+ inside_begin = false
49
+ string_begin = false
50
+ orig_line_no = nil
51
+ line_no = nil
52
+ rescue_line_no = nil
53
+ waiting_on_newline = false
54
+ waiting_on_close = 0
55
+ prev_token = nil
56
+ instrumentable = true
57
+ tokens = Prism.lex(text).value
58
+ # See: https://github.com/ruby/prism/blob/main/lib/prism/parse_result.rb
59
+ # for what is returned by Prism.lex
60
+ # We process the tokens in pairs to recreate spacing and handle string assignments
61
+ tokens.each_cons(2) do |(token, lex_state), (next_token, _next_lex_state)|
62
+ # pp token # Uncomment for debugging
63
+ # Ignore embedded documentation must be at column 0 and looks like:
64
+ =begin
65
+ This is a comment
66
+ And so is this
67
+ =end
68
+ if token.type == :EMBDOC_BEGIN or token.type == :EMBDOC_LINE or token.type == :EMBDOC_END
69
+ prev_token = token
70
+ next
71
+ end
232
72
 
233
- while lexed = lex.lex(@context)
234
- lex.line_no += lexed.count("\n")
235
- lex.line.concat lexed
236
- line.concat lexed
73
+ # Recreate the spaces at the beginning of a line
74
+ # This has to come before we add the token.value to the line
75
+ if prev_token.nil?
76
+ line += ' ' * token.location.start_column
77
+ # If the previous token is STRING_CONTENT it is probably string interpolation so ignore it
78
+ # Otherwise if the previous token has changed lines we're on a newline so add space
79
+ elsif prev_token.type != :STRING_CONTENT and prev_token.location.end_line - prev_token.location.start_line > 0
80
+ line += ' ' * token.location.start_column
81
+ end
82
+ prev_token = token
237
83
 
238
- if continue_indent
239
- indent = previous_line_indent + lex.indent
84
+ # Comments require tacking on a newline but are otherwise ignored
85
+ if token.type == :COMMENT
86
+ line += "\n"
87
+ waiting_on_newline = false
240
88
  else
241
- indent += lex.indent
242
- lex.indent = 0
89
+ line += token.value
243
90
  end
244
91
 
245
- if inside_begin and indent < begin_indent
246
- begin_indent = nil
247
- inside_begin = false
92
+ if UNINSTRUMENTABLE_KEYWORDS.include?(token.type)
93
+ instrumentable = false
248
94
  end
249
95
 
250
- # Uncomment the following to help with debugging
251
- #puts
252
- #puts '*' * 80
253
- #puts lex.line
254
- #puts "lexed = #{lexed.chomp}, indent (of next line) = #{indent}, actual lex.indent = #{lex.indent}, continue = #{lex.continue}, ltype = #{lex.ltype.inspect}, code_block_open = #{lex.code_block_open}, continue_indent = #{continue_indent.inspect}, begin_indent = #{begin_indent.inspect}"
255
-
256
- # These lines put multiple lines together that are really one line
257
- if lex.continue or lex.ltype
258
- if not continue_block?(lexed)
259
- # Set the indent we should stop at
260
- unless continue_indent
261
- if (indent - previous_line_indent) > 1
262
- continue_indent = indent - 1
263
- else
264
- continue_indent = previous_line_indent
265
- end
266
- end
267
- next
268
- end
269
- elsif continue_indent
270
- if indent > continue_indent
271
- # Still have more content
272
- next
273
- else
274
- # Ready to yield this combined line
275
- yield line, !contains_keyword?(line), inside_begin, lex.exp_line_no
276
- line = ''
277
- lex.exp_line_no = lex.line_no
278
- # puts "clear line 1"
279
- lex.line = ''
280
- previous_line_indent = indent
281
- continue_indent = nil
282
- next
96
+ # We're processing tokens in pairs so we need to check if we're at the end
97
+ # of the file and process the last line
98
+ if next_token.type == :EOF
99
+ if !line.empty?
100
+ yield line, instrumentable, inside_begin, orig_line_no
283
101
  end
102
+ break
284
103
  end
285
- previous_line_indent = indent
286
- continue_indent = nil
287
104
 
288
- # Detect the beginning and end of begin blocks so we can not catch exceptions there
289
- if contains_begin?(line)
290
- if contains_end?(line)
291
- # Assume the user is being fancy with a single line begin; end;
292
- # Ignore
293
- else
294
- inside_begin = true
295
- begin_indent = indent unless begin_indent # Don't restart for nested begins
105
+ # Recreate spaces between tokens rather than trying to figure out
106
+ # which tokens require spacing before and after
107
+ if token.location.start_line == next_token.location.start_line
108
+ spaces = next_token.location.start_column - token.location.end_column
109
+ line += ' ' * spaces
110
+ end
111
+ line_no ||= token.location.start_line
112
+ # Keep track of the original line number because the line number can change
113
+ # when we're putting together multiline structures like strings, arrays, hashes, etc.
114
+ orig_line_no ||= line_no
115
+
116
+ case token.type
117
+ when :BRACE_LEFT
118
+ # BRACE is a special case because it can be used for hashes and blocks
119
+ if lex_state != (Ripper::EXPR_BEG | Ripper::EXPR_LABEL)
120
+ instrumentable = false
121
+ end
122
+ waiting_on_close += 1
123
+ when :STRING_BEGIN
124
+ # Mark when a string begins to allow for processing string interpolation tokens
125
+ string_begin = true
126
+ line_no = token.location.start_line
127
+ when :STRING_END
128
+ string_begin = false
129
+ next
130
+ when :KEYWORD_BEGIN
131
+ inside_begin = true
132
+ begin_indent = token.location.start_column unless begin_indent # Don't restart for nested begins
133
+ when :KEYWORD_RESCUE
134
+ rescue_line_no = token.location.start_line
135
+ when :KEYWORD_END
136
+ # Assume the begin and end are aligned
137
+ # Otherwise we have to count any keywords that can close with END
138
+ if token.location.start_line == rescue_line_no || token.location.start_column == begin_indent
139
+ inside_begin = false
296
140
  end
141
+ when *OPENING_DELIMITER_TYPES
142
+ waiting_on_close += 1
143
+ when *CLOSING_DELIMITER_TYPES
144
+ waiting_on_close -= 1
145
+ waiting_on_newline = true
146
+ when :NEWLINE, :IGNORED_NEWLINE
147
+ waiting_on_newline = false
148
+ # If the next token is a STRING_BEGIN then hold off processing the newline
149
+ # because it's going to be a string assignment
150
+ next if next_token.type == :STRING_BEGIN
297
151
  end
298
152
 
299
- # The following code does not care about indent
153
+ # Don't process the line yet if we're waiting for additional tokens
154
+ next if string_begin or waiting_on_newline or waiting_on_close > 0
300
155
 
301
- loop do # loop to allow restarting for nested conditions
302
- # Yield blank lines and lonely else lines before the actual line
303
- while (index = line.index("\n"))
304
- one_line = line[0..index]
305
- if BLANK_LINE_REGEX.match?(one_line)
306
- yield one_line, true, inside_begin, lex.exp_line_no
307
- lex.exp_line_no += 1
308
- line = line[(index + 1)..-1]
309
- elsif LONELY_ELSE_REGEX.match?(one_line)
310
- yield one_line, false, inside_begin, lex.exp_line_no
311
- lex.exp_line_no += 1
312
- line = line[(index + 1)..-1]
313
- else
314
- break
315
- end
316
- end
317
-
318
- if contains_keyword?(line)
319
- yield line, false, inside_begin, lex.exp_line_no
320
- elsif !line.empty?
321
- yield line, true, inside_begin, lex.exp_line_no
322
- end
156
+ # This is where we process the line and yield it
157
+ if line_no != token.location.start_line or line_no != token.location.end_line
158
+ yield line, instrumentable, inside_begin, orig_line_no
323
159
  line = ''
324
- lex.exp_line_no = lex.line_no
325
- # puts "clear line 2"
326
- lex.line = ''
327
- break
328
- end # loop do
329
- end # while lexed
330
- end # def each_lexed_segment
160
+ instrumentable = true
161
+ orig_line_no = nil
162
+ line_no = nil
163
+ end
164
+ end
165
+ end
331
166
  end
@@ -26,13 +26,17 @@ module OpenC3
26
26
  # Matches ScriptRunner.vue const TEMP_FOLDER
27
27
  TEMP_FOLDER = '__TEMP__'
28
28
 
29
- def self.all(scope, path_matchers, target: nil, include_temp: false)
29
+ def self.all(scope, path_matchers, target: nil)
30
30
  target = target.upcase if target
31
31
 
32
+ include_temp = true
32
33
  bucket = Bucket.getClient()
33
34
  if target
34
35
  prefix = "#{scope}/targets/#{target}/"
35
36
  modified_prefix = "#{scope}/targets_modified/#{target}/"
37
+ if target != TEMP_FOLDER
38
+ include_temp = false
39
+ end
36
40
  else
37
41
  prefix = "#{scope}/targets/"
38
42
  modified_prefix = "#{scope}/targets_modified/"
@@ -42,7 +46,7 @@ module OpenC3
42
46
 
43
47
  # Add in local targets_modified if present
44
48
  if ENV['OPENC3_LOCAL_MODE']
45
- local_modified = OpenC3::LocalMode.local_target_files(scope: scope, path_matchers: path_matchers, include_temp: include_temp)
49
+ local_modified = OpenC3::LocalMode.local_target_files(scope: scope, target: target, path_matchers: path_matchers, include_temp: include_temp)
46
50
  local_modified.each do |filename|
47
51
  if include_temp and filename.include?(TEMP_FOLDER)
48
52
  temp << filename
@@ -1,14 +1,14 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- OPENC3_VERSION = '6.2.0'
3
+ OPENC3_VERSION = '6.3.0'
4
4
  module OpenC3
5
5
  module Version
6
6
  MAJOR = '6'
7
- MINOR = '2'
7
+ MINOR = '3'
8
8
  PATCH = '0'
9
9
  OTHER = ''
10
- BUILD = '980820e02309298877cba83d612bd6705f305f1b'
10
+ BUILD = '52f29bf512b463d226b93d18f31aa71936d472b2'
11
11
  end
12
- VERSION = '6.2.0'
13
- GEM_VERSION = '6.2.0'
12
+ VERSION = '6.3.0'
13
+ GEM_VERSION = '6.3.0'
14
14
  end
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "<%= tool_name %>",
3
- "version": "6.2.0",
3
+ "version": "6.3.0",
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": "6.2.0",
26
+ "@openc3/js-common": "6.3.0",
27
27
  "rxjs": "~7.8.0",
28
28
  "single-spa": "^5.9.5",
29
29
  "single-spa-angular": "^9.2.0",
@@ -16,7 +16,7 @@
16
16
  "@emotion/react": "^11.13.3",
17
17
  "@emotion/styled": "^11.11.0",
18
18
  "@mui/material": "^6.1.1",
19
- "@openc3/js-common": "6.2.0",
19
+ "@openc3/js-common": "6.3.0",
20
20
  "react": "^18.2.0",
21
21
  "react-dom": "^18.2.0",
22
22
  "single-spa-react": "^5.1.4"
@@ -12,7 +12,7 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "@astrouxds/astro-web-components": "^7.24.0",
15
- "@openc3/js-common": "6.2.0",
15
+ "@openc3/js-common": "6.3.0",
16
16
  "@smui/button": "^7.0.0",
17
17
  "@smui/common": "^7.0.0",
18
18
  "@smui/card": "^7.0.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "<%= tool_name %>",
3
- "version": "6.2.0",
3
+ "version": "6.3.0",
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": "6.2.0",
15
- "@openc3/vue-common": "6.2.0",
14
+ "@openc3/js-common": "6.3.0",
15
+ "@openc3/vue-common": "6.3.0",
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": "6.2.0",
3
+ "version": "6.3.0",
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": "6.2.0",
11
+ "@openc3/vue-common": "6.3.0",
12
12
  "vuetify": "^3.7.1"
13
13
  },
14
14
  "devDependencies": {
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openc3
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.2.0
4
+ version: 6.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Melton
8
8
  - Jason Thomas
9
- autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2025-03-01 00:00:00.000000000 Z
11
+ date: 1980-01-02 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bundler
@@ -39,20 +38,6 @@ dependencies:
39
38
  - - "~>"
40
39
  - !ruby/object:Gem::Version
41
40
  version: '0.22'
42
- - !ruby/object:Gem::Dependency
43
- name: irb
44
- requirement: !ruby/object:Gem::Requirement
45
- requirements:
46
- - - '='
47
- - !ruby/object:Gem::Version
48
- version: 1.6.2
49
- type: :runtime
50
- prerelease: false
51
- version_requirements: !ruby/object:Gem::Requirement
52
- requirements:
53
- - - '='
54
- - !ruby/object:Gem::Version
55
- version: 1.6.2
56
41
  - !ruby/object:Gem::Dependency
57
42
  name: json
58
43
  requirement: !ruby/object:Gem::Requirement
@@ -95,6 +80,20 @@ dependencies:
95
80
  - - "~>"
96
81
  - !ruby/object:Gem::Version
97
82
  version: '1.14'
83
+ - !ruby/object:Gem::Dependency
84
+ name: prism
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.3.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.3.0
98
97
  - !ruby/object:Gem::Dependency
99
98
  name: psych
100
99
  requirement: !ruby/object:Gem::Requirement
@@ -777,16 +776,16 @@ email:
777
776
  - ryan@openc3.com
778
777
  - jason@openc3.com
779
778
  executables:
779
+ - cstol_converter
780
780
  - openc3cli
781
781
  - rubysloc
782
- - cstol_converter
783
782
  extensions:
784
783
  - ext/openc3/ext/array/extconf.rb
785
784
  - ext/openc3/ext/buffered_file/extconf.rb
786
785
  - ext/openc3/ext/burst_protocol/extconf.rb
787
786
  - ext/openc3/ext/config_parser/extconf.rb
788
- - ext/openc3/ext/openc3_io/extconf.rb
789
787
  - ext/openc3/ext/crc/extconf.rb
788
+ - ext/openc3/ext/openc3_io/extconf.rb
790
789
  - ext/openc3/ext/packet/extconf.rb
791
790
  - ext/openc3/ext/platform/extconf.rb
792
791
  - ext/openc3/ext/polynomial_conversion/extconf.rb
@@ -794,7 +793,6 @@ extensions:
794
793
  - ext/openc3/ext/string/extconf.rb
795
794
  - ext/openc3/ext/tabbed_plots_config/extconf.rb
796
795
  - ext/openc3/ext/telemetry/extconf.rb
797
- - ext/mkrf_conf.rb
798
796
  extra_rdoc_files: []
799
797
  files:
800
798
  - Gemfile
@@ -837,7 +835,6 @@ files:
837
835
  - data/config/tool.yaml
838
836
  - data/config/unknown.yaml
839
837
  - data/config/widgets.yaml
840
- - ext/mkrf_conf.rb
841
838
  - ext/openc3/ext/array/array.c
842
839
  - ext/openc3/ext/array/extconf.rb
843
840
  - ext/openc3/ext/buffered_file/buffered_file.c
@@ -1009,6 +1006,7 @@ files:
1009
1006
  - lib/openc3/migrations/20241208080000_no_critical_cmd.rb
1010
1007
  - lib/openc3/migrations/20241208080001_no_trigger_group.rb
1011
1008
  - lib/openc3/migrations/20250108060000_news_feed.rb
1009
+ - lib/openc3/migrations/20250402000000_periodic_only_default.rb
1012
1010
  - lib/openc3/models/activity_model.rb
1013
1011
  - lib/openc3/models/auth_model.rb
1014
1012
  - lib/openc3/models/cvt_model.rb
@@ -1286,8 +1284,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1286
1284
  - !ruby/object:Gem::Version
1287
1285
  version: '0'
1288
1286
  requirements: []
1289
- rubygems_version: 3.3.14
1290
- signing_key:
1287
+ rubygems_version: 3.6.7
1291
1288
  specification_version: 4
1292
1289
  summary: OpenC3
1293
1290
  test_files: []