extism 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/example.rb +11 -17
  3. data/lib/extism/version.rb +5 -5
  4. data/lib/extism.rb +267 -264
  5. metadata +6 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3b540fbbf71c7df6e1830473a374de243616af3fbed809b54e65d54b97521ca4
4
- data.tar.gz: 9c37464eb99dd16e7481e6ad1b1a46385b2b8c33861041ede0d055cbdaab2317
3
+ metadata.gz: 21688f8f388970bd00387e58e091cdb71eeef9e8f5bf864dd152229926752ee2
4
+ data.tar.gz: 180199c53864f904220ceba2a796ec0105960e9d0243f5d4293c8080bc72c342
5
5
  SHA512:
6
- metadata.gz: 541a4167c2985a8adecb5565d6c4fca794c87de64ccd10bbde410f22c752e9eaaf16686306ec280e9755deeafa47866b6bf26a098cb54199c6185ed6321fadfc
7
- data.tar.gz: f3711e03292689c31547d22bc099ec356e07fa7876698c8d00cc5d0ab4b54f0f76377bca5d34789e76766978b9bd620721d11639143fde06572ef07ec07b086f
6
+ metadata.gz: a7dc0b31d1ca8ce1d79edd7894cd178a35ea0e4b02ec9f70f09d3fd77c8fa55129f7660d3e5f557493757eb90437426479ef957e6359106b52694e42fb6a808f
7
+ data.tar.gz: 314c6f702820fe6f0e9efa08d02a745fcfdf2aa8b6492477dc77a31da7f3a07c28436339365ecb483ebca60093b91962dabf39e7f69d38f94e117f8f935ac4a2
data/example.rb CHANGED
@@ -1,17 +1,11 @@
1
- require "./lib/extism"
2
- require "json"
3
-
4
- # a Context provides a scope for plugins to be managed within. creating multiple contexts
5
- # is expected and groups plugins based on source/tenant/lifetime etc.
6
- # We recommend you use `Extism.with_context` unless you have a reason to keep your context around.
7
- # If you do you can create a context with `Extism#new`, example: `ctx = Extism.new`
8
- Extism.with_context do |ctx|
9
- manifest = {
10
- :wasm => [{ :path => "../wasm/code.wasm" }],
11
- }
12
-
13
- plugin = ctx.plugin(manifest)
14
- res = JSON.parse(plugin.call("count_vowels", ARGV[0] || "this is a test"))
15
-
16
- puts res["count"]
17
- end
1
+ require "./lib/extism"
2
+ require "json"
3
+
4
+ manifest = {
5
+ :wasm => [{ :path => "../wasm/code.wasm" }],
6
+ }
7
+
8
+ plugin = Extism::Plugin.new(manifest)
9
+ res = JSON.parse(plugin.call("count_vowels", ARGV[0] || "this is a test"))
10
+
11
+ puts res["count"]
@@ -1,5 +1,5 @@
1
- # frozen_string_literal: true
2
-
3
- module Extism
4
- VERSION = "0.3.0"
5
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Extism
4
+ VERSION = "0.4.0"
5
+ end
data/lib/extism.rb CHANGED
@@ -1,264 +1,267 @@
1
- require "ffi"
2
- require "json"
3
- require_relative "./extism/version"
4
-
5
- module Extism
6
- class Error < StandardError
7
- end
8
-
9
- # Return the version of Extism
10
- #
11
- # @return [String] The version string of the Extism runtime
12
- def self.extism_version
13
- C.extism_version
14
- end
15
-
16
- # Set log file and level, this is a global configuration
17
- # @param name [String] The path to the logfile
18
- # @param level [String] The log level. One of {"debug", "error", "info", "trace" }
19
- def self.set_log_file(name, level = nil)
20
- if level
21
- level = FFI::MemoryPointer::from_string(level)
22
- end
23
- C.extism_log_file(name, level)
24
- end
25
-
26
- $PLUGINS = {}
27
- $FREE_PLUGIN = proc { |id|
28
- x = $PLUGINS[id]
29
- if !x.nil?
30
- C.extism_plugin_free(x[:context].pointer, x[:plugin])
31
- $PLUGINS.delete(id)
32
- end
33
- }
34
-
35
- $CONTEXTS = {}
36
- $FREE_CONTEXT = proc { |id|
37
- x = $CONTEXTS[id]
38
- if !x.nil?
39
- C.extism_context_free($CONTEXTS[id])
40
- $CONTEXTS.delete(id)
41
- end
42
- }
43
-
44
- # A Context is needed to create plugins. The Context
45
- # is where your plugins live. Freeing the context
46
- # frees all of the plugins in its scope.
47
- #
48
- # @example Create and free a context
49
- # ctx = Extism::Context.new
50
- # plugin = ctx.plugin(my_manifest)
51
- # puts plugin.call("my_func", "my-input")
52
- # ctx.free # frees any plugins
53
- #
54
- # @example Use with_context to auto-free
55
- # Extism.with_context do |ctx|
56
- # plugin = ctx.plugin(my_manifest)
57
- # puts plugin.call("my_func", "my-input")
58
- # end # frees context after exiting this block
59
- #
60
- # @attr_reader pointer [FFI::Pointer] Pointer to the Extism context. *Used internally*.
61
- class Context
62
- attr_reader :pointer
63
-
64
- # Initialize a new context
65
- def initialize
66
- @pointer = C.extism_context_new()
67
- $CONTEXTS[self.object_id] = @pointer
68
- ObjectSpace.define_finalizer(self, $FREE_CONTEXT)
69
- end
70
-
71
- # Remove all registered plugins in this context
72
- # @return [void]
73
- def reset
74
- C.extism_context_reset(@pointer)
75
- end
76
-
77
- # Free the context, this should be called when it is no longer needed
78
- # @return [void]
79
- def free
80
- return if @pointer.nil?
81
-
82
- $CONTEXTS.delete(self.object_id)
83
- C.extism_context_free(@pointer)
84
- @pointer = nil
85
- end
86
-
87
- # Create a new plugin from a WASM module or JSON encoded manifest
88
- #
89
- # @param wasm [Hash, String] The manifest for the plugin. See https://extism.org/docs/concepts/manifest/.
90
- # @param wasi [Boolean] Enable WASI support
91
- # @param config [Hash] The plugin config
92
- # @return [Plugin]
93
- def plugin(wasm, wasi = false, config = nil)
94
- Plugin.new(self, wasm, wasi, config)
95
- end
96
- end
97
-
98
- # A context manager to create contexts and ensure that they get freed.
99
- #
100
- # @example Use with_context to auto-free
101
- # Extism.with_context do |ctx|
102
- # plugin = ctx.plugin(my_manifest)
103
- # puts plugin.call("my_func", "my-input")
104
- # end # frees context after exiting this block
105
- #
106
- # @yield [ctx] Yields the created Context
107
- # @return [Object] returns whatever your block returns
108
- def self.with_context(&block)
109
- ctx = Context.new
110
- begin
111
- x = block.call(ctx)
112
- return x
113
- ensure
114
- ctx.free
115
- end
116
- end
117
-
118
- # A CancelHandle can be used to cancel a running plugin from another thread
119
- class CancelHandle
120
- def initialize(handle)
121
- @handle = handle
122
- end
123
-
124
- # Cancel the plugin used to generate the handle
125
- def cancel
126
- return C.extism_plugin_cancel(@handle)
127
- end
128
- end
129
-
130
- # A Plugin represents an instance of your WASM program from the given manifest.
131
- class Plugin
132
- # Intialize a plugin
133
- #
134
- # @see Extism::Context#plugin
135
- # @param context [Context] The context to manager this plugin
136
- # @param wasm [Hash, String] The manifest or WASM binary. See https://extism.org/docs/concepts/manifest/.
137
- # @param wasi [Boolean] Enable WASI support
138
- # @param config [Hash] The plugin config
139
- def initialize(context, wasm, wasi = false, config = nil)
140
- @context = context
141
- if wasm.class == Hash
142
- wasm = JSON.generate(wasm)
143
- end
144
- code = FFI::MemoryPointer.new(:char, wasm.bytesize)
145
- code.put_bytes(0, wasm)
146
- @plugin = C.extism_plugin_new(context.pointer, code, wasm.bytesize, nil, 0, wasi)
147
- if @plugin < 0
148
- err = C.extism_error(@context.pointer, -1)
149
- if err&.empty?
150
- raise Error.new "extism_plugin_new failed"
151
- else
152
- raise Error.new err
153
- end
154
- end
155
- $PLUGINS[self.object_id] = { :plugin => @plugin, :context => context }
156
- ObjectSpace.define_finalizer(self, $FREE_PLUGIN)
157
- if config != nil and @plugin >= 0
158
- s = JSON.generate(config)
159
- ptr = FFI::MemoryPointer::from_string(s)
160
- C.extism_plugin_config(@context.pointer, @plugin, ptr, s.bytesize)
161
- end
162
- end
163
-
164
- # Update a plugin with new WASM module or manifest
165
- #
166
- # @param wasm [Hash, String] The manifest or WASM binary. See https://extism.org/docs/concepts/manifest/.
167
- # @param wasi [Boolean] Enable WASI support
168
- # @param config [Hash] The plugin config
169
- # @return [void]
170
- def update(wasm, wasi = false, config = nil)
171
- if wasm.class == Hash
172
- wasm = JSON.generate(wasm)
173
- end
174
- code = FFI::MemoryPointer.new(:char, wasm.bytesize)
175
- code.put_bytes(0, wasm)
176
- ok = C.extism_plugin_update(@context.pointer, @plugin, code, wasm.bytesize, nil, 0, wasi)
177
- if !ok
178
- err = C.extism_error(@context.pointer, @plugin)
179
- if err&.empty?
180
- raise Error.new "extism_plugin_update failed"
181
- else
182
- raise Error.new err
183
- end
184
- end
185
-
186
- if config != nil
187
- s = JSON.generate(config)
188
- ptr = FFI::MemoryPointer::from_string(s)
189
- C.extism_plugin_config(@context.pointer, @plugin, ptr, s.bytesize)
190
- end
191
- end
192
-
193
- # Check if a function exists
194
- #
195
- # @param name [String] The name of the function
196
- # @return [Boolean] Returns true if function exists
197
- def has_function?(name)
198
- C.extism_plugin_function_exists(@context.pointer, @plugin, name)
199
- end
200
-
201
- # Call a function by name
202
- #
203
- # @param name [String] The function name
204
- # @param data [String] The input data for the function
205
- # @return [String] The output from the function in String form
206
- def call(name, data, &block)
207
- # If no block was passed then use Pointer::read_string
208
- block ||= ->(buf, len) { buf.read_string(len) }
209
- input = FFI::MemoryPointer::from_string(data)
210
- rc = C.extism_plugin_call(@context.pointer, @plugin, name, input, data.bytesize)
211
- if rc != 0
212
- err = C.extism_error(@context.pointer, @plugin)
213
- if err&.empty?
214
- raise Error.new "extism_call failed"
215
- else
216
- raise Error.new err
217
- end
218
- end
219
- out_len = C.extism_plugin_output_length(@context.pointer, @plugin)
220
- buf = C.extism_plugin_output_data(@context.pointer, @plugin)
221
- block.call(buf, out_len)
222
- end
223
-
224
- # Free a plugin, this should be called when the plugin is no longer needed
225
- #
226
- # @return [void]
227
- def free
228
- return if @context.pointer.nil?
229
-
230
- $PLUGINS.delete(self.object_id)
231
- C.extism_plugin_free(@context.pointer, @plugin)
232
- @plugin = -1
233
- end
234
-
235
- # Get a CancelHandle for a plugin
236
- def cancel_handle
237
- return CancelHandle.new(C.extism_plugin_cancel_handle(@context.pointer, @plugin))
238
- end
239
- end
240
-
241
- private
242
-
243
- # Private module used to interface with the Extism runtime.
244
- # *Warning*: Do not use or rely on this directly.
245
- module C
246
- extend FFI::Library
247
- ffi_lib "extism"
248
- attach_function :extism_context_new, [], :pointer
249
- attach_function :extism_context_free, [:pointer], :void
250
- attach_function :extism_plugin_new, [:pointer, :pointer, :uint64, :pointer, :uint64, :bool], :int32
251
- attach_function :extism_plugin_update, [:pointer, :int32, :pointer, :uint64, :pointer, :uint64, :bool], :bool
252
- attach_function :extism_error, [:pointer, :int32], :string
253
- attach_function :extism_plugin_call, [:pointer, :int32, :string, :pointer, :uint64], :int32
254
- attach_function :extism_plugin_function_exists, [:pointer, :int32, :string], :bool
255
- attach_function :extism_plugin_output_length, [:pointer, :int32], :uint64
256
- attach_function :extism_plugin_output_data, [:pointer, :int32], :pointer
257
- attach_function :extism_log_file, [:string, :pointer], :void
258
- attach_function :extism_plugin_free, [:pointer, :int32], :void
259
- attach_function :extism_context_reset, [:pointer], :void
260
- attach_function :extism_version, [], :string
261
- attach_function :extism_plugin_cancel_handle, [:pointer, :int32], :pointer
262
- attach_function :extism_plugin_cancel, [:pointer], :bool
263
- end
264
- end
1
+ require "ffi"
2
+ require "json"
3
+ require_relative "./extism/version"
4
+
5
+ module Extism
6
+ class Error < StandardError
7
+ end
8
+
9
+ # Return the version of Extism
10
+ #
11
+ # @return [String] The version string of the Extism runtime
12
+ def self.extism_version
13
+ C.extism_version
14
+ end
15
+
16
+ # Set log file and level, this is a global configuration
17
+ # @param name [String] The path to the logfile
18
+ # @param level [String] The log level. One of {"debug", "error", "info", "trace" }
19
+ def self.set_log_file(name, level = nil)
20
+ if level
21
+ level = FFI::MemoryPointer::from_string(level)
22
+ end
23
+ C.extism_log_file(name, level)
24
+ end
25
+
26
+ $PLUGINS = {}
27
+ $FREE_PLUGIN = proc { |id|
28
+ x = $PLUGINS[id]
29
+ if !x.nil?
30
+ C.extism_plugin_free(x[:context].pointer, x[:plugin])
31
+ $PLUGINS.delete(id)
32
+ end
33
+ }
34
+
35
+ $CONTEXTS = {}
36
+ $FREE_CONTEXT = proc { |id|
37
+ x = $CONTEXTS[id]
38
+ if !x.nil?
39
+ C.extism_context_free($CONTEXTS[id])
40
+ $CONTEXTS.delete(id)
41
+ end
42
+ }
43
+
44
+ # A Context is needed to create plugins. The Context
45
+ # is where your plugins live. Freeing the context
46
+ # frees all of the plugins in its scope.
47
+ #
48
+ # @example Create and free a context
49
+ # ctx = Extism::Context.new
50
+ # plugin = ctx.plugin(my_manifest)
51
+ # puts plugin.call("my_func", "my-input")
52
+ # ctx.free # frees any plugins
53
+ #
54
+ # @example Use with_context to auto-free
55
+ # Extism.with_context do |ctx|
56
+ # plugin = ctx.plugin(my_manifest)
57
+ # puts plugin.call("my_func", "my-input")
58
+ # end # frees context after exiting this block
59
+ #
60
+ # @attr_reader pointer [FFI::Pointer] Pointer to the Extism context. *Used internally*.
61
+ class Context
62
+ attr_reader :pointer
63
+
64
+ # Initialize a new context
65
+ def initialize
66
+ @pointer = C.extism_context_new()
67
+ $CONTEXTS[self.object_id] = @pointer
68
+ ObjectSpace.define_finalizer(self, $FREE_CONTEXT)
69
+ end
70
+
71
+ # Remove all registered plugins in this context
72
+ # @return [void]
73
+ def reset
74
+ C.extism_context_reset(@pointer)
75
+ end
76
+
77
+ # Free the context, this should be called when it is no longer needed
78
+ # @return [void]
79
+ def free
80
+ return if @pointer.nil?
81
+
82
+ $CONTEXTS.delete(self.object_id)
83
+ C.extism_context_free(@pointer)
84
+ @pointer = nil
85
+ end
86
+
87
+ # Create a new plugin from a WASM module or JSON encoded manifest
88
+ #
89
+ # @see Plugin#new
90
+ # @param wasm [Hash, String] The manifest for the plugin. See https://extism.org/docs/concepts/manifest/.
91
+ # @param wasi [Boolean] Enable WASI support
92
+ # @param config [Hash] The plugin config
93
+ # @return [Plugin]
94
+ def plugin(wasm, wasi = false, config = nil)
95
+ Plugin.new(wasm, wasi, config, self)
96
+ end
97
+ end
98
+
99
+ # A context manager to create contexts and ensure that they get freed.
100
+ #
101
+ # @example Use with_context to auto-free
102
+ # Extism.with_context do |ctx|
103
+ # plugin = ctx.plugin(my_manifest)
104
+ # puts plugin.call("my_func", "my-input")
105
+ # end # frees context after exiting this block
106
+ #
107
+ # @yield [ctx] Yields the created Context
108
+ # @return [Object] returns whatever your block returns
109
+ def self.with_context(&block)
110
+ ctx = Context.new
111
+ begin
112
+ x = block.call(ctx)
113
+ return x
114
+ ensure
115
+ ctx.free
116
+ end
117
+ end
118
+
119
+ # A CancelHandle can be used to cancel a running plugin from another thread
120
+ class CancelHandle
121
+ def initialize(handle)
122
+ @handle = handle
123
+ end
124
+
125
+ # Cancel the plugin used to generate the handle
126
+ def cancel
127
+ return C.extism_plugin_cancel(@handle)
128
+ end
129
+ end
130
+
131
+ # A Plugin represents an instance of your WASM program from the given manifest.
132
+ class Plugin
133
+ # Intialize a plugin
134
+ #
135
+ # @param wasm [Hash, String] The manifest or WASM binary. See https://extism.org/docs/concepts/manifest/.
136
+ # @param wasi [Boolean] Enable WASI support
137
+ # @param config [Hash] The plugin config
138
+ # @param context [Context] The context to manager this plugin
139
+ def initialize(wasm, wasi = false, config = nil, context = nil)
140
+ if context.nil? then
141
+ context = Context.new
142
+ end
143
+ @context = context
144
+ if wasm.class == Hash
145
+ wasm = JSON.generate(wasm)
146
+ end
147
+ code = FFI::MemoryPointer.new(:char, wasm.bytesize)
148
+ code.put_bytes(0, wasm)
149
+ @plugin = C.extism_plugin_new(context.pointer, code, wasm.bytesize, nil, 0, wasi)
150
+ if @plugin < 0
151
+ err = C.extism_error(@context.pointer, -1)
152
+ if err&.empty?
153
+ raise Error.new "extism_plugin_new failed"
154
+ else
155
+ raise Error.new err
156
+ end
157
+ end
158
+ $PLUGINS[self.object_id] = { :plugin => @plugin, :context => context }
159
+ ObjectSpace.define_finalizer(self, $FREE_PLUGIN)
160
+ if config != nil and @plugin >= 0
161
+ s = JSON.generate(config)
162
+ ptr = FFI::MemoryPointer::from_string(s)
163
+ C.extism_plugin_config(@context.pointer, @plugin, ptr, s.bytesize)
164
+ end
165
+ end
166
+
167
+ # Update a plugin with new WASM module or manifest
168
+ #
169
+ # @param wasm [Hash, String] The manifest or WASM binary. See https://extism.org/docs/concepts/manifest/.
170
+ # @param wasi [Boolean] Enable WASI support
171
+ # @param config [Hash] The plugin config
172
+ # @return [void]
173
+ def update(wasm, wasi = false, config = nil)
174
+ if wasm.class == Hash
175
+ wasm = JSON.generate(wasm)
176
+ end
177
+ code = FFI::MemoryPointer.new(:char, wasm.bytesize)
178
+ code.put_bytes(0, wasm)
179
+ ok = C.extism_plugin_update(@context.pointer, @plugin, code, wasm.bytesize, nil, 0, wasi)
180
+ if !ok
181
+ err = C.extism_error(@context.pointer, @plugin)
182
+ if err&.empty?
183
+ raise Error.new "extism_plugin_update failed"
184
+ else
185
+ raise Error.new err
186
+ end
187
+ end
188
+
189
+ if config != nil
190
+ s = JSON.generate(config)
191
+ ptr = FFI::MemoryPointer::from_string(s)
192
+ C.extism_plugin_config(@context.pointer, @plugin, ptr, s.bytesize)
193
+ end
194
+ end
195
+
196
+ # Check if a function exists
197
+ #
198
+ # @param name [String] The name of the function
199
+ # @return [Boolean] Returns true if function exists
200
+ def has_function?(name)
201
+ C.extism_plugin_function_exists(@context.pointer, @plugin, name)
202
+ end
203
+
204
+ # Call a function by name
205
+ #
206
+ # @param name [String] The function name
207
+ # @param data [String] The input data for the function
208
+ # @return [String] The output from the function in String form
209
+ def call(name, data, &block)
210
+ # If no block was passed then use Pointer::read_string
211
+ block ||= ->(buf, len) { buf.read_string(len) }
212
+ input = FFI::MemoryPointer::from_string(data)
213
+ rc = C.extism_plugin_call(@context.pointer, @plugin, name, input, data.bytesize)
214
+ if rc != 0
215
+ err = C.extism_error(@context.pointer, @plugin)
216
+ if err&.empty?
217
+ raise Error.new "extism_call failed"
218
+ else
219
+ raise Error.new err
220
+ end
221
+ end
222
+ out_len = C.extism_plugin_output_length(@context.pointer, @plugin)
223
+ buf = C.extism_plugin_output_data(@context.pointer, @plugin)
224
+ block.call(buf, out_len)
225
+ end
226
+
227
+ # Free a plugin, this should be called when the plugin is no longer needed
228
+ #
229
+ # @return [void]
230
+ def free
231
+ return if @context.pointer.nil?
232
+
233
+ $PLUGINS.delete(self.object_id)
234
+ C.extism_plugin_free(@context.pointer, @plugin)
235
+ @plugin = -1
236
+ end
237
+
238
+ # Get a CancelHandle for a plugin
239
+ def cancel_handle
240
+ return CancelHandle.new(C.extism_plugin_cancel_handle(@context.pointer, @plugin))
241
+ end
242
+ end
243
+
244
+ private
245
+
246
+ # Private module used to interface with the Extism runtime.
247
+ # *Warning*: Do not use or rely on this directly.
248
+ module C
249
+ extend FFI::Library
250
+ ffi_lib "extism"
251
+ attach_function :extism_context_new, [], :pointer
252
+ attach_function :extism_context_free, [:pointer], :void
253
+ attach_function :extism_plugin_new, [:pointer, :pointer, :uint64, :pointer, :uint64, :bool], :int32
254
+ attach_function :extism_plugin_update, [:pointer, :int32, :pointer, :uint64, :pointer, :uint64, :bool], :bool
255
+ attach_function :extism_error, [:pointer, :int32], :string
256
+ attach_function :extism_plugin_call, [:pointer, :int32, :string, :pointer, :uint64], :int32
257
+ attach_function :extism_plugin_function_exists, [:pointer, :int32, :string], :bool
258
+ attach_function :extism_plugin_output_length, [:pointer, :int32], :uint64
259
+ attach_function :extism_plugin_output_data, [:pointer, :int32], :pointer
260
+ attach_function :extism_log_file, [:string, :pointer], :void
261
+ attach_function :extism_plugin_free, [:pointer, :int32], :void
262
+ attach_function :extism_context_reset, [:pointer], :void
263
+ attach_function :extism_version, [], :string
264
+ attach_function :extism_plugin_cancel_handle, [:pointer, :int32], :pointer
265
+ attach_function :extism_plugin_cancel, [:pointer], :bool
266
+ end
267
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: extism
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - zach
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-03-15 00:00:00.000000000 Z
11
+ date: 2023-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -48,7 +48,7 @@ metadata:
48
48
  homepage_uri: https://github.com/extism/extism
49
49
  source_code_uri: https://github.com/extism/extism
50
50
  changelog_uri: https://github.com/extism/extism
51
- post_install_message:
51
+ post_install_message:
52
52
  rdoc_options: []
53
53
  require_paths:
54
54
  - lib
@@ -63,8 +63,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
63
  - !ruby/object:Gem::Version
64
64
  version: '0'
65
65
  requirements: []
66
- rubygems_version: 3.1.6
67
- signing_key:
66
+ rubygems_version: 3.4.10
67
+ signing_key:
68
68
  specification_version: 4
69
69
  summary: Extism WASM SDK
70
70
  test_files: []