autoc 2.0.0 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +17 -1
- data/lib/autoc/composite.rb +44 -35
- data/lib/autoc/cstring.rb +1 -1
- data/lib/autoc/function.rb +22 -9
- data/lib/autoc/hash_map.rb +1 -0
- data/lib/autoc/hash_set.rb +3 -2
- data/lib/autoc/hashers.rb +1 -1
- data/lib/autoc/list.rb +1 -0
- data/lib/autoc/module.rb +10 -6
- data/lib/autoc/ranges.rb +2 -4
- data/lib/autoc/record.rb +5 -5
- data/lib/autoc/scaffold/1test_composite_value_vector.rb +17 -0
- data/lib/autoc/scaffold/composite_value.rb +21 -0
- data/lib/autoc/scaffold/generic_value.rb +1 -1
- data/lib/autoc/scaffold/glass_record.rb +7 -0
- data/lib/autoc/scaffold/project.rb +2 -2
- data/lib/autoc/scaffold/test_record_record.rb +21 -0
- data/lib/autoc/scaffold/tests.rb +4 -4
- data/lib/autoc/std.rb +0 -1
- data/lib/autoc/vector.rb +1 -0
- data/lib/autoc.rb +1 -1
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e1800467846d30e1b98d5f124f250ef87f9adf1aab5f319f7593dcd8a6d4e8ea
|
4
|
+
data.tar.gz: de7e6b5457c9bf747df18b86b5c06d05b065c11d13649709f2f02b7eb4eedb11
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 476a8dac04a57b7e313232b904f73297a4e5d76a0919423535f356c29fa4b48690941d04f75f79a623bac23076c2ec56f4d2f20d0d72ecfbb24ad24eb9f3b06c
|
7
|
+
data.tar.gz: e449fbe1e182aa541bc7bc861e4f653c5b7b23b0eb7f99dfbb769e7c44e6ef210df0e4ad8e1c2799ed99121ed0b71411c280a28ae8183a7a369fa60908132a9a
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
# 2.0.2
|
2
|
+
|
3
|
+
- Introduce private visibility specifier for functions.
|
4
|
+
|
5
|
+
- Fix missing constraint checks in custom constructors.
|
6
|
+
|
7
|
+
- Documentation tags streamlining.
|
8
|
+
|
9
|
+
# 2.0.1
|
10
|
+
|
11
|
+
- Introduce switch for incremental module generation mode.
|
12
|
+
|
13
|
+
- Fix Record setter function type mismatch bug.
|
14
|
+
|
15
|
+
- Fix project structure conformance issue in CMake project scaffolder.
|
16
|
+
|
1
17
|
# 2.0.0
|
2
18
|
|
3
|
-
A complete package overhaul.
|
19
|
+
- A complete package overhaul.
|
data/lib/autoc/composite.rb
CHANGED
@@ -18,7 +18,7 @@ module AutoC
|
|
18
18
|
# @abstract
|
19
19
|
class Composite < Type
|
20
20
|
|
21
|
-
PRIVATE =
|
21
|
+
PRIVATE = "\n/** @private */\n"
|
22
22
|
|
23
23
|
include STD
|
24
24
|
|
@@ -67,6 +67,10 @@ module AutoC
|
|
67
67
|
|
68
68
|
def public? = @visibility == :public
|
69
69
|
|
70
|
+
def private? = @visibility == :private
|
71
|
+
|
72
|
+
def internal? = @visibility == :internal
|
73
|
+
|
70
74
|
def respond_to_missing?(meth, include_private = false) = @methods.has_key?(meth) ? true : super
|
71
75
|
|
72
76
|
def type_tag = signature
|
@@ -95,40 +99,41 @@ module AutoC
|
|
95
99
|
|
96
100
|
self.hasher = Hasher.instance # Default cycle-xor hasher
|
97
101
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
102
|
+
module Decorator
|
103
|
+
# Pluggable CamelCase identifier decorator
|
104
|
+
CAMEL_CASE = -> (type, symbol, abbreviate: false, **kws) {
|
105
|
+
id = symbol.to_s.sub(/[!?]$/, '') # Strip trailing !?
|
106
|
+
_ = # Check for leading underscore
|
107
|
+
if /^(_+)(.*)/ =~ id
|
108
|
+
id = Regexp.last_match(2) # Chop leading underscore
|
109
|
+
true
|
110
|
+
else
|
111
|
+
false
|
112
|
+
end
|
113
|
+
id = id[0] if abbreviate
|
114
|
+
# Convert _separated_names to the CamelCase
|
115
|
+
id = type.prefix + id.split('_').collect{ |s| s[0].upcase << s[1..-1] }.join
|
116
|
+
# Carry over the method name's leading underscore only if the prefix is not in turn underscored
|
117
|
+
_ && !type.prefix.start_with?('_') ? Regexp.last_match(1) + id : id
|
118
|
+
}
|
119
|
+
# Pluggable _snake_case identifier decorator
|
120
|
+
SNAKE_CASE = -> (type, symbol, abbreviate: false, **kws) {
|
121
|
+
id = symbol.to_s.sub(/[!?]$/, '') # Strip trailing !?
|
122
|
+
# Check for leading underscore
|
123
|
+
_ =
|
124
|
+
if /^(_+)(.*)/ =~ id
|
125
|
+
id = Regexp.last_match(2)
|
126
|
+
true
|
127
|
+
else
|
128
|
+
false
|
129
|
+
end
|
130
|
+
id = abbreviate ? "#{type.prefix}#{id[0]}" : "#{type.prefix}_#{id}"
|
131
|
+
# Carry over the method name's leading underscore only if the prefix is not in turn underscored
|
132
|
+
_ && !type.prefix.start_with?('_') ? Regexp.last_match(1) + id : id
|
133
|
+
}
|
134
|
+
end # Decorator
|
135
|
+
|
136
|
+
self.decorator = Decorator::CAMEL_CASE
|
132
137
|
|
133
138
|
private
|
134
139
|
|
@@ -148,6 +153,8 @@ module AutoC
|
|
148
153
|
|
149
154
|
# Create a new type-bound function (aka method)
|
150
155
|
def method(result, name, parameters, inline: false, visibility: nil, constraint: true, instance: name, **kws)
|
156
|
+
name = name.to_sym
|
157
|
+
instance = instance.to_sym
|
151
158
|
method = method_class.new(
|
152
159
|
self,
|
153
160
|
result,
|
@@ -292,6 +299,8 @@ module AutoC
|
|
292
299
|
#{@header}
|
293
300
|
*/
|
294
301
|
}
|
302
|
+
else
|
303
|
+
stream << Composite::PRIVATE
|
295
304
|
end
|
296
305
|
end
|
297
306
|
|
data/lib/autoc/cstring.rb
CHANGED
@@ -76,7 +76,7 @@ module AutoC
|
|
76
76
|
|
77
77
|
def configure
|
78
78
|
super
|
79
|
-
method(:void, :create, { target: lvalue, source: const_rvalue }, instance: :custom_create).configure do
|
79
|
+
method(:void, :create, { target: lvalue, source: const_rvalue }, instance: :custom_create, constraint:-> { custom_constructible? }).configure do
|
80
80
|
header %{
|
81
81
|
@brief Create string
|
82
82
|
|
data/lib/autoc/function.rb
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
require 'autoc/type'
|
5
5
|
require 'autoc/module'
|
6
6
|
require 'autoc/primitive'
|
7
|
+
require 'autoc/composite'
|
7
8
|
|
8
9
|
|
9
10
|
module AutoC
|
@@ -134,15 +135,19 @@ module AutoC
|
|
134
135
|
|
135
136
|
def public? = @visibility == :public
|
136
137
|
|
138
|
+
def private? = @visibility == :private
|
139
|
+
|
140
|
+
def internal? = @visibility == :internal
|
141
|
+
|
137
142
|
def abstract? = @abstract == true
|
138
143
|
|
139
144
|
def variadic? = @variadic == true
|
140
145
|
|
141
146
|
def live? = (@constraint.is_a?(Proc) ? @constraint.() : @constraint) == true
|
142
147
|
|
143
|
-
def signature = '%s(%s)' % [result
|
148
|
+
def signature = '%s(%s)' % [result, (parameters.to_a.collect(&:signature) << (variadic? ? '...' : nil)).compact.join(',')]
|
144
149
|
|
145
|
-
def prototype = '%s %s(%s)' % [result
|
150
|
+
def prototype = '%s %s(%s)' % [result, name, (parameters.to_a.collect(&:declaration) << (variadic? ? '...' : nil)).compact.join(',')]
|
146
151
|
|
147
152
|
def definition = '%s {%s}' % [prototype, @code]
|
148
153
|
|
@@ -183,16 +188,20 @@ module AutoC
|
|
183
188
|
|
184
189
|
# Render the commentary block preceding the function declaration, both inline or external
|
185
190
|
def render_function_header(stream)
|
186
|
-
|
187
|
-
|
188
|
-
|
191
|
+
if public?
|
192
|
+
stream << %{
|
193
|
+
/* #{@header} */
|
194
|
+
} unless @header.nil?
|
195
|
+
else
|
196
|
+
stream << Composite::PRIVATE
|
197
|
+
end
|
189
198
|
end
|
190
199
|
|
191
200
|
# Render full function declaration statement including the commentary block
|
192
201
|
# For inline functions this also renders a function body effectively making this also a function definition
|
193
202
|
# The declaration comes into either public interface of forward declaration block depending on the function's visibility status
|
194
203
|
def render_function_declaration(stream)
|
195
|
-
render_function_header(stream)
|
204
|
+
render_function_header(stream) if @render_interface
|
196
205
|
render_declaration_specifier(stream)
|
197
206
|
if inline?
|
198
207
|
render_function_definition(stream)
|
@@ -211,18 +220,22 @@ module AutoC
|
|
211
220
|
end
|
212
221
|
|
213
222
|
# Render function's public interface
|
214
|
-
#
|
223
|
+
# Render non-internal function declarations
|
224
|
+
# @render_interface is used internally to distinguish header-time rendering from source-time rendering
|
215
225
|
def render_interface(stream)
|
216
|
-
|
226
|
+
@render_interface = true
|
227
|
+
render_function_declaration(stream) if live? && (public? || private?)
|
217
228
|
end
|
218
229
|
|
219
230
|
# Render function's interface for non-public functions which should not appear in the public interface
|
220
231
|
def render_forward_declarations(stream)
|
221
|
-
|
232
|
+
@render_interface = false
|
233
|
+
render_function_declaration(stream) if live? && !(public? || private?)
|
222
234
|
end
|
223
235
|
|
224
236
|
# Render non-inline function definition regardless of function's visibility status
|
225
237
|
def render_implementation(stream)
|
238
|
+
@render_interface = false
|
226
239
|
render_function_definition(stream) if live? && !inline?
|
227
240
|
end
|
228
241
|
|
data/lib/autoc/hash_map.rb
CHANGED
data/lib/autoc/hash_set.rb
CHANGED
data/lib/autoc/hashers.rb
CHANGED
@@ -55,7 +55,7 @@ module AutoC
|
|
55
55
|
#if defined(__cplusplus)
|
56
56
|
extern "C" void _autoc_hasher_randomize_seed(void);
|
57
57
|
#elif defined(__GNUC__) || defined(__clang__)
|
58
|
-
void _autoc_hasher_randomize_seed(void)
|
58
|
+
void _autoc_hasher_randomize_seed(void) __attribute__((__constructor__));
|
59
59
|
#elif defined(__POCC__)
|
60
60
|
#pragma startup _autoc_hasher_randomize_seed
|
61
61
|
#elif defined(_MSC_VER) || defined(__POCC__)
|
data/lib/autoc/list.rb
CHANGED
data/lib/autoc/module.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
|
4
|
-
require 'set'
|
5
4
|
require 'digest'
|
6
5
|
|
7
6
|
require 'autoc'
|
@@ -51,7 +50,12 @@ module AutoC
|
|
51
50
|
|
52
51
|
attr_accessor :source_threshold
|
53
52
|
|
54
|
-
def
|
53
|
+
def stateful? = @stateful == true
|
54
|
+
|
55
|
+
def initialize(name, stateful: true)
|
56
|
+
@name = name
|
57
|
+
@stateful = stateful
|
58
|
+
end
|
55
59
|
|
56
60
|
def header = @header ||= Header.new(self)
|
57
61
|
|
@@ -63,7 +67,7 @@ module AutoC
|
|
63
67
|
distribute_entities
|
64
68
|
header.render
|
65
69
|
sources.each(&:render)
|
66
|
-
State.new(self).collect.write
|
70
|
+
State.new(self).collect.write if stateful?
|
67
71
|
self
|
68
72
|
end
|
69
73
|
|
@@ -86,8 +90,8 @@ module AutoC
|
|
86
90
|
end
|
87
91
|
end
|
88
92
|
|
89
|
-
def self.render(name, &code)
|
90
|
-
m = self.new(name)
|
93
|
+
def self.render(name, **, &code)
|
94
|
+
m = self.new(name, **)
|
91
95
|
yield(m) if block_given?
|
92
96
|
m.render
|
93
97
|
end
|
@@ -114,7 +118,7 @@ module AutoC
|
|
114
118
|
end
|
115
119
|
|
116
120
|
def read
|
117
|
-
if File.exist?(file_name)
|
121
|
+
if self.module.stateful? && File.exist?(file_name)
|
118
122
|
# It's OK not to have this file but if it exists it must have proper contents
|
119
123
|
io = File.open(file_name, 'rt', chomp: true)
|
120
124
|
begin
|
data/lib/autoc/ranges.rb
CHANGED
@@ -25,7 +25,7 @@ module AutoC
|
|
25
25
|
def to_value = @v ||= Value.new(self)
|
26
26
|
|
27
27
|
def initialize(iterable, visibility:)
|
28
|
-
super(iterable.identifier(:range, abbreviate:
|
28
|
+
super(iterable.identifier(:range, abbreviate: internal?), visibility:)
|
29
29
|
dependencies << (@iterable = iterable) << INFO
|
30
30
|
end
|
31
31
|
|
@@ -62,7 +62,7 @@ module AutoC
|
|
62
62
|
|
63
63
|
def configure
|
64
64
|
super
|
65
|
-
method(:void, :create, { range: lvalue, iterable: iterable.const_rvalue }, instance: :custom_create).configure do
|
65
|
+
method(:void, :create, { range: lvalue, iterable: iterable.const_rvalue }, instance: :custom_create, constraint:-> { custom_constructible? }).configure do
|
66
66
|
header %{
|
67
67
|
@brief Create a new range for the specified iterable
|
68
68
|
|
@@ -440,8 +440,6 @@ module AutoC
|
|
440
440
|
*/
|
441
441
|
}
|
442
442
|
end
|
443
|
-
else
|
444
|
-
stream << PRIVATE
|
445
443
|
end
|
446
444
|
if public?
|
447
445
|
stream << %{
|
data/lib/autoc/record.rb
CHANGED
@@ -131,7 +131,7 @@ module AutoC
|
|
131
131
|
args[formal] = value
|
132
132
|
docs << "@param[in] #{formal} `#{name}` field initializer of type @ref #{type}"
|
133
133
|
end
|
134
|
-
method(:void, :create_set, args, instance: :custom_create).configure do
|
134
|
+
method(:void, :create_set, args, instance: :custom_create, constraint:-> { custom_constructible? }).configure do
|
135
135
|
_code = 'assert(target);'
|
136
136
|
params.each do |field, parameter|
|
137
137
|
_code += parameter.value.type.copy.("target->#{field}", parameter) + ';'
|
@@ -217,17 +217,17 @@ module AutoC
|
|
217
217
|
@since 2.0
|
218
218
|
}
|
219
219
|
end
|
220
|
-
method(:void, "set_#{name}", { target: rvalue,
|
220
|
+
method(:void, "set_#{name}", { target: rvalue, value: type.const_rvalue } ).configure do
|
221
221
|
code %{
|
222
222
|
assert(target);
|
223
223
|
#{type.destroy.("target->#{name}") if type.destructible?};
|
224
|
-
#{type.copy.("target->#{name}",
|
224
|
+
#{type.copy.("target->#{name}", value)};
|
225
225
|
}
|
226
226
|
header %{
|
227
227
|
@brief Set value of field #{name}
|
228
228
|
|
229
229
|
@param[in] target record to modify
|
230
|
-
@param[in]
|
230
|
+
@param[in] value value to initalize field #{name} with
|
231
231
|
|
232
232
|
This function sets the field #{name} to contain a copy of specified value.
|
233
233
|
|
@@ -239,7 +239,7 @@ module AutoC
|
|
239
239
|
end
|
240
240
|
end
|
241
241
|
end
|
242
|
-
|
242
|
+
end
|
243
243
|
|
244
244
|
end # Record
|
245
245
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
|
4
|
+
require 'autoc/std'
|
5
|
+
require 'autoc/module'
|
6
|
+
require 'autoc/primitive'
|
7
|
+
|
8
|
+
|
9
|
+
class CompositeValue < AutoC::STD::Primitive
|
10
|
+
|
11
|
+
def orderable? = false
|
12
|
+
|
13
|
+
def render_interface(stream)
|
14
|
+
stream << %{
|
15
|
+
typedef struct {
|
16
|
+
int a;
|
17
|
+
char b;
|
18
|
+
} #{self};
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
@@ -35,7 +35,7 @@ private
|
|
35
35
|
|
36
36
|
def configure
|
37
37
|
super
|
38
|
-
method(:void, :set, { target: lvalue, value: :int.const_rvalue }, instance: :custom_create).configure do
|
38
|
+
method(:void, :set, { target: lvalue, value: :int.const_rvalue }, instance: :custom_create, constraint:-> { custom_constructible? }).configure do
|
39
39
|
code %{
|
40
40
|
#{default_create.(target)};
|
41
41
|
*target->value = value;
|
@@ -19,10 +19,10 @@ end
|
|
19
19
|
###
|
20
20
|
def cmakelists_txt(project)
|
21
21
|
<<END
|
22
|
-
project(#{project})
|
23
|
-
|
24
22
|
cmake_minimum_required(VERSION 3.15)
|
25
23
|
|
24
|
+
project(#{project})
|
25
|
+
|
26
26
|
set(AUTOC_MODULE_NAME _${PROJECT_NAME})
|
27
27
|
set(AUTOC_MODULE_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.rb)
|
28
28
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'autoc/record'
|
2
|
+
|
3
|
+
require_relative 'glass_record'
|
4
|
+
|
5
|
+
t = type_test(AutoC::Record, :RecordRecord, { r: GlassRecord }) do
|
6
|
+
|
7
|
+
###
|
8
|
+
|
9
|
+
setup %{
|
10
|
+
#{self} t;
|
11
|
+
#{default_create.(:t)};
|
12
|
+
}
|
13
|
+
|
14
|
+
cleanup %{
|
15
|
+
#{destroy.(:t) if destructible?};
|
16
|
+
}
|
17
|
+
|
18
|
+
test :create_empty, %{
|
19
|
+
}
|
20
|
+
|
21
|
+
end
|
data/lib/autoc/scaffold/tests.rb
CHANGED
@@ -29,7 +29,7 @@ def type_test(cls, *opts, **kws, &code)
|
|
29
29
|
t = Class.new(cls) do
|
30
30
|
attr_reader :tests
|
31
31
|
def initialize(*args, **kws)
|
32
|
-
super
|
32
|
+
super(*args, visibility: :public, **kws)
|
33
33
|
@tests = []
|
34
34
|
@test_names = []
|
35
35
|
dependencies << $common
|
@@ -160,17 +160,17 @@ $tests = []
|
|
160
160
|
|
161
161
|
require 'autoc/composite'
|
162
162
|
|
163
|
-
#AutoC::Composite.decorator = AutoC::Composite::
|
163
|
+
#AutoC::Composite.decorator = AutoC::Composite::Decorator::SNAKE_CASE
|
164
164
|
|
165
165
|
require_relative 'generic_value'
|
166
166
|
|
167
|
-
Value = GenericValue.new(:Value)
|
167
|
+
Value = GenericValue.new(:Value, visibility: :public)
|
168
168
|
|
169
169
|
Dir[File.join(File.dirname(__FILE__), 'test_*.rb')].each { |t| require t }
|
170
170
|
|
171
171
|
require 'autoc/cmake'
|
172
172
|
|
173
|
-
x = AutoC::Module.render(:tests) do |m|
|
173
|
+
x = AutoC::Module.render(:tests, stateful: false) do |m|
|
174
174
|
m << $suite
|
175
175
|
m.source_threshold = 100*1024 # Split module code into a set of TUs with ~100 Kb in size
|
176
176
|
$tests.each { |t| $suite.dependencies << t }
|
data/lib/autoc/std.rb
CHANGED
data/lib/autoc/vector.rb
CHANGED
data/lib/autoc.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: autoc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oleg A. Khlybov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |2
|
14
14
|
The package contains a functionality related to the C source code generation,
|
@@ -43,8 +43,11 @@ files:
|
|
43
43
|
- lib/autoc/ranges.rb
|
44
44
|
- lib/autoc/record.rb
|
45
45
|
- lib/autoc/scaffold.rb
|
46
|
+
- lib/autoc/scaffold/1test_composite_value_vector.rb
|
47
|
+
- lib/autoc/scaffold/composite_value.rb
|
46
48
|
- lib/autoc/scaffold/docs.rb
|
47
49
|
- lib/autoc/scaffold/generic_value.rb
|
50
|
+
- lib/autoc/scaffold/glass_record.rb
|
48
51
|
- lib/autoc/scaffold/project.rb
|
49
52
|
- lib/autoc/scaffold/test_cstring.rb
|
50
53
|
- lib/autoc/scaffold/test_cstring_hash_set.rb
|
@@ -52,6 +55,7 @@ files:
|
|
52
55
|
- lib/autoc/scaffold/test_int_hash_set.rb
|
53
56
|
- lib/autoc/scaffold/test_int_list.rb
|
54
57
|
- lib/autoc/scaffold/test_int_vector.rb
|
58
|
+
- lib/autoc/scaffold/test_record_record.rb
|
55
59
|
- lib/autoc/scaffold/test_v2v_hash_map.rb
|
56
60
|
- lib/autoc/scaffold/test_value_hash_set.rb
|
57
61
|
- lib/autoc/scaffold/test_value_vector.rb
|
@@ -81,7 +85,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
85
|
- !ruby/object:Gem::Version
|
82
86
|
version: '0'
|
83
87
|
requirements: []
|
84
|
-
rubygems_version: 3.4.
|
88
|
+
rubygems_version: 3.4.10
|
85
89
|
signing_key:
|
86
90
|
specification_version: 4
|
87
91
|
summary: C source code generation package
|