ic_agent 0.1.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 +7 -0
- data/.ruby-version +1 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Dockerfile +17 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +108 -0
- data/LICENSE.txt +21 -0
- data/README.md +217 -0
- data/Rakefile +4 -0
- data/ic_agent.gemspec +53 -0
- data/lib/ic_agent/agent.rb +176 -0
- data/lib/ic_agent/ast/assembler.rb +192 -0
- data/lib/ic_agent/ast/did_grammar.treetop +159 -0
- data/lib/ic_agent/ast/did_grammar_v1.treetop +111 -0
- data/lib/ic_agent/ast/nodes/named_nodes.rb +410 -0
- data/lib/ic_agent/ast/nodes/string_literal.rb +17 -0
- data/lib/ic_agent/ast/parser.rb +85 -0
- data/lib/ic_agent/ast/writer.rb +19 -0
- data/lib/ic_agent/candid.rb +1671 -0
- data/lib/ic_agent/canister.rb +270 -0
- data/lib/ic_agent/certificate.rb +55 -0
- data/lib/ic_agent/client.rb +47 -0
- data/lib/ic_agent/common/cycles_wallet.rb +275 -0
- data/lib/ic_agent/common/governance.rb +366 -0
- data/lib/ic_agent/common/ledger.rb +177 -0
- data/lib/ic_agent/common/management.rb +69 -0
- data/lib/ic_agent/identity.rb +125 -0
- data/lib/ic_agent/principal.rb +112 -0
- data/lib/ic_agent/system_state.rb +43 -0
- data/lib/ic_agent/utils.rb +71 -0
- data/lib/ic_agent/version.rb +5 -0
- data/lib/ic_agent.rb +37 -0
- data/sig/ic_agent.rbs +4 -0
- metadata +288 -0
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
require 'treetop'
|
|
2
|
+
|
|
3
|
+
module IcAgent
|
|
4
|
+
module Ast
|
|
5
|
+
module Nodes
|
|
6
|
+
class NamedNode < Treetop::Runtime::SyntaxNode
|
|
7
|
+
def title
|
|
8
|
+
:named_node
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def to_array
|
|
12
|
+
[title] + elements.map(&:to_array)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def to_s
|
|
16
|
+
"#{title.to_s.upcase} #{elements_to_s}"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def elements_to_s
|
|
20
|
+
elements.map(&:to_s).join("\n")
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class Instruction < NamedNode
|
|
25
|
+
def title
|
|
26
|
+
:instruction
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def to_s
|
|
30
|
+
elements_to_s
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
class Comment < NamedNode
|
|
35
|
+
def title
|
|
36
|
+
:comment
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def to_s
|
|
40
|
+
"# #{elements[0].to_s}"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
class DIDFile < NamedNode
|
|
45
|
+
def title
|
|
46
|
+
:did_file
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def to_s
|
|
50
|
+
elements_to_s
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
class TypeDeclaration < NamedNode
|
|
55
|
+
def title
|
|
56
|
+
:type_declaration
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def type_param_name
|
|
60
|
+
elements[0].text_value
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def type_param_content
|
|
64
|
+
elements[1].text_value.gsub("\n", '').gsub(';}', '}')
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def type_root_opt_code
|
|
68
|
+
elements[1].opt_code
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def type_child_items
|
|
72
|
+
if elements && elements[1] && elements[1].elements && elements[1].elements[0]
|
|
73
|
+
elements[1].elements[0].elements
|
|
74
|
+
else
|
|
75
|
+
[]
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def type_child_item_keys
|
|
80
|
+
names = []
|
|
81
|
+
type_child_items.each do |ele|
|
|
82
|
+
names << ele.elements[0].text_value.strip
|
|
83
|
+
end
|
|
84
|
+
names
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def type_child_item_values
|
|
88
|
+
values = []
|
|
89
|
+
type_child_items.each do |ele|
|
|
90
|
+
|
|
91
|
+
# get multi type value
|
|
92
|
+
replaced_hash = {}
|
|
93
|
+
modified_str = ele.text_value.gsub("\n", '').gsub(/record\s*{[^{}]*}/) do |match|
|
|
94
|
+
rad_id = rand(100000..999999)
|
|
95
|
+
type_name = "record_#{rad_id}"
|
|
96
|
+
replaced_hash[type_name] = match
|
|
97
|
+
type_name
|
|
98
|
+
end
|
|
99
|
+
modified_str = modified_str.gsub(/variant\s*{[^{}]*}/) do |match|
|
|
100
|
+
rad_id = rand(100000..999999)
|
|
101
|
+
type_name = "variant_#{rad_id}"
|
|
102
|
+
replaced_hash[type_name] = match
|
|
103
|
+
type_name
|
|
104
|
+
end
|
|
105
|
+
replaced_hash.each_key do |key|
|
|
106
|
+
item_arr = replaced_hash[key].strip.split(';')
|
|
107
|
+
item_arr.each do |item|
|
|
108
|
+
multi_item_arr = item.strip.split(':')
|
|
109
|
+
if multi_item_arr.size > 1
|
|
110
|
+
item_value_arr = multi_item_arr[1].strip.split(' ').collect { |v| v.strip.gsub(';', '') }
|
|
111
|
+
item_value_arr.delete('{')
|
|
112
|
+
item_value_arr.delete('}')
|
|
113
|
+
item_value_arr.delete('{}')
|
|
114
|
+
values << item_value_arr
|
|
115
|
+
else
|
|
116
|
+
values << []
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# get root type value
|
|
122
|
+
item_arr = modified_str.strip.split(':')
|
|
123
|
+
if item_arr.size > 1
|
|
124
|
+
item_value_arr = item_arr[1].strip.split(' ').collect { |v| v.strip.gsub(';', '') }
|
|
125
|
+
item_value_arr.delete('{')
|
|
126
|
+
item_value_arr.delete('}')
|
|
127
|
+
item_value_arr.delete('{}')
|
|
128
|
+
item_value_arr -= replaced_hash.keys
|
|
129
|
+
values << item_value_arr
|
|
130
|
+
else
|
|
131
|
+
values << []
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
values
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def type_child_refer_items
|
|
138
|
+
child_args = type_child_item_values.flatten - IcAgent::Candid::ALL_TYPES
|
|
139
|
+
child_args.uniq
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def to_s
|
|
143
|
+
text_value
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def to_obj
|
|
147
|
+
{
|
|
148
|
+
'type_param_name' => type_param_name,
|
|
149
|
+
'type_root_opt_code' => type_root_opt_code,
|
|
150
|
+
'type_child_item_keys' => type_child_item_keys,
|
|
151
|
+
'type_child_item_values' => type_child_item_values
|
|
152
|
+
}
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
class BaseType < NamedNode
|
|
157
|
+
def title
|
|
158
|
+
:base_type
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def to_s
|
|
162
|
+
elements_to_s
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
class BaseTypeSingle < NamedNode
|
|
167
|
+
def title
|
|
168
|
+
:base_type_single
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def to_s
|
|
172
|
+
elements_to_s
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def opt_code
|
|
176
|
+
'single'
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
class BaseTypeRecord < NamedNode
|
|
181
|
+
def title
|
|
182
|
+
:base_type_record
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def to_s
|
|
186
|
+
elements_to_s
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def opt_code
|
|
190
|
+
'record'
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
class BaseTypeKey < NamedNode
|
|
195
|
+
def title
|
|
196
|
+
:base_type_key
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def to_s
|
|
200
|
+
elements_to_s
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
class BaseTypeVariant < NamedNode
|
|
205
|
+
def title
|
|
206
|
+
:base_type_variant
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def to_s
|
|
210
|
+
elements_to_s
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def opt_code
|
|
214
|
+
'variant'
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
class BaseTypeFunc < NamedNode
|
|
219
|
+
def title
|
|
220
|
+
:base_type_func
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def to_s
|
|
224
|
+
elements_to_s
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def opt_code
|
|
228
|
+
'func'
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
class BaseTypeOpt < NamedNode
|
|
233
|
+
def title
|
|
234
|
+
:base_type_opt
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def to_s
|
|
238
|
+
elements_to_s
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
def opt_code
|
|
242
|
+
'opt'
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
class BaseTypeVec < NamedNode
|
|
247
|
+
def title
|
|
248
|
+
:base_type_vec
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
def to_s
|
|
252
|
+
elements_to_s
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def opt_code
|
|
256
|
+
'vec'
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
class BaseTypeOther < NamedNode
|
|
261
|
+
def title
|
|
262
|
+
:base_type_other
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def to_s
|
|
266
|
+
elements_to_s
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
def opt_code
|
|
270
|
+
text_value
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
class BaseTypeContent < NamedNode
|
|
275
|
+
def title
|
|
276
|
+
:base_type_content
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def to_s
|
|
280
|
+
elements_to_s
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
class BaseTypeChild < NamedNode
|
|
285
|
+
def title
|
|
286
|
+
:base_type_child
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
def to_s
|
|
290
|
+
elements_to_s
|
|
291
|
+
end
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
class TypeName < NamedNode
|
|
295
|
+
def title
|
|
296
|
+
:type_name
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def to_s
|
|
300
|
+
elements_to_s
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
class Service < NamedNode
|
|
305
|
+
def title
|
|
306
|
+
:ic_service
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
def to_s
|
|
310
|
+
elements_to_s
|
|
311
|
+
end
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
class IcServiceName < NamedNode
|
|
315
|
+
def title
|
|
316
|
+
:ic_service_name
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def to_s
|
|
320
|
+
"# #{elements[0].to_s}"
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
class IcServiceMethods < NamedNode
|
|
325
|
+
def title
|
|
326
|
+
:ic_service_methods
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
def value
|
|
330
|
+
elements.map { |update| update.value }
|
|
331
|
+
end
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
class IcServiceMethodName < NamedNode
|
|
335
|
+
def title
|
|
336
|
+
:ic_service_method_name
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
class IcServiceItem < NamedNode
|
|
341
|
+
def title
|
|
342
|
+
:ic_service_item
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
def to_s
|
|
346
|
+
elements_to_s
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
def to_obj
|
|
350
|
+
obj = {}
|
|
351
|
+
elements.each do |element|
|
|
352
|
+
obj[element.title.to_s] = element.text_value
|
|
353
|
+
end
|
|
354
|
+
obj
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
class IcServiceParam < NamedNode
|
|
359
|
+
def title
|
|
360
|
+
:ic_service_param
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
def to_s
|
|
364
|
+
"# #{elements[0].to_s}"
|
|
365
|
+
end
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
class IcServiceName < NamedNode
|
|
369
|
+
def title
|
|
370
|
+
:ic_service_name
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
def to_s
|
|
374
|
+
"# #{elements[0].to_s}"
|
|
375
|
+
end
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
class IcServiceMethodParams < NamedNode
|
|
379
|
+
def title
|
|
380
|
+
:ic_service_method_params
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
def to_s
|
|
384
|
+
elements_to_s
|
|
385
|
+
end
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
class IcServiceMethodReturn < NamedNode
|
|
389
|
+
def title
|
|
390
|
+
:ic_service_method_return
|
|
391
|
+
end
|
|
392
|
+
|
|
393
|
+
def to_s
|
|
394
|
+
elements_to_s
|
|
395
|
+
end
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
class IcServiceMethodQuery < NamedNode
|
|
399
|
+
def title
|
|
400
|
+
:ic_service_method_query
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
def to_s
|
|
404
|
+
elements_to_s
|
|
405
|
+
end
|
|
406
|
+
end
|
|
407
|
+
end
|
|
408
|
+
end
|
|
409
|
+
end
|
|
410
|
+
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
require 'treetop'
|
|
2
|
+
|
|
3
|
+
module IcAgent
|
|
4
|
+
module Ast
|
|
5
|
+
class Parser
|
|
6
|
+
attr_accessor :parser, :tree
|
|
7
|
+
|
|
8
|
+
def initialize
|
|
9
|
+
Treetop.load(File.expand_path(File.join(File.dirname(__FILE__), 'did_grammar.treetop')))
|
|
10
|
+
@parser = DIDGrammarParser.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def parse(data, return_type = :string)
|
|
14
|
+
tree = @parser.parse(data)
|
|
15
|
+
|
|
16
|
+
raise Exception, "Parse error at offset: #{@parser.index} #{@parser.failure_reason}" if tree.nil?
|
|
17
|
+
|
|
18
|
+
# this edits the tree in place
|
|
19
|
+
clean_tree(tree)
|
|
20
|
+
|
|
21
|
+
@tree = tree
|
|
22
|
+
tree
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def clean_tree(root_node)
|
|
26
|
+
return if root_node.elements.nil?
|
|
27
|
+
|
|
28
|
+
root_node.elements.delete_if { |node| node.class.name == 'Treetop::Runtime::SyntaxNode' }
|
|
29
|
+
root_node.elements.each { |node| self.clean_tree(node) }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def ic_service
|
|
33
|
+
tree.elements.each do |ele|
|
|
34
|
+
return ele if ele.title == :ic_service
|
|
35
|
+
end
|
|
36
|
+
nil
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def ic_types
|
|
40
|
+
type_arr = []
|
|
41
|
+
tree.elements.each do |ele|
|
|
42
|
+
type_arr << ele if ele.title == :type_declaration
|
|
43
|
+
end
|
|
44
|
+
type_arr
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def ic_types_obj
|
|
48
|
+
obj_arr = []
|
|
49
|
+
ic_types.each do |ic_type|
|
|
50
|
+
obj_arr << ic_type.to_obj
|
|
51
|
+
end
|
|
52
|
+
obj_arr
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def ic_service_methods
|
|
56
|
+
ic_service_tree = ic_service
|
|
57
|
+
unless ic_service_tree.empty?
|
|
58
|
+
ic_service_tree.elements.each do |ele|
|
|
59
|
+
return ele if ele.title == :ic_service_methods
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
nil
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def ic_type_name(ic_type)
|
|
66
|
+
ic_type.type_param_name
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def ic_type_names
|
|
70
|
+
names_arr = []
|
|
71
|
+
ic_types.each do |ic_type|
|
|
72
|
+
names_arr << ic_type_name(ic_type)
|
|
73
|
+
end
|
|
74
|
+
names_arr
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def ic_type_by_name(type_name)
|
|
78
|
+
ic_types.each do |ic_type|
|
|
79
|
+
return ic_type if type_name == ic_type_name(ic_type)
|
|
80
|
+
end
|
|
81
|
+
nil
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module IcAgent
|
|
2
|
+
module Ast
|
|
3
|
+
class Writer
|
|
4
|
+
def initialize(tree)
|
|
5
|
+
@tree = tree
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def write(return_type = :string)
|
|
9
|
+
if return_type == :tree
|
|
10
|
+
@tree
|
|
11
|
+
elsif return_type == :array
|
|
12
|
+
@tree.to_array
|
|
13
|
+
else
|
|
14
|
+
@tree.to_s
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|