katakata_irb 0.1.5 → 0.1.6
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/Gemfile.lock +1 -1
- data/lib/katakata_irb/scope.rb +9 -1
- data/lib/katakata_irb/type_simulator.rb +50 -35
- data/lib/katakata_irb/types.rb +31 -6
- data/lib/katakata_irb/version.rb +1 -1
- data/sig/katakata_irb.rbs +4 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: df817c7e7806e6ea21aa82e14a694130b0db5dd68c74ea84790b90ad3b895fb7
|
4
|
+
data.tar.gz: 9faa1d72b27f35bccc5b4d2dcc5c9f50b4dd9946ba5d63374d3083e933e62c38
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9bec77d0fd1f9484278541e48a964c683ef2546b8a5b107e731d7979b634c4c8fb9ce2b68261603fc5f4ad8eb83cfb3018e11881a2ecd4096d268e7be0e97405
|
7
|
+
data.tar.gz: b6520a88ad8644423f24e7c02e783bf1cb388b3a00d2c16151b97e08598f1fd80f55f8346562d00c9d2ec0e2b619d4f4db23eeba5834c39b9ebfc72ce765cbdb
|
data/Gemfile.lock
CHANGED
data/lib/katakata_irb/scope.rb
CHANGED
@@ -87,7 +87,7 @@ module KatakataIrb
|
|
87
87
|
end
|
88
88
|
|
89
89
|
class Scope < BaseScope
|
90
|
-
attr_reader :parent, :jump_branches, :mergeable_changes, :level
|
90
|
+
attr_reader :parent, :jump_branches, :mergeable_changes, :level, :lvars
|
91
91
|
|
92
92
|
def self.from_binding(binding) = new(BaseScope.new(binding, binding.eval('self')))
|
93
93
|
|
@@ -101,6 +101,7 @@ module KatakataIrb
|
|
101
101
|
@passthrough = passthrough
|
102
102
|
@terminated = false
|
103
103
|
@jump_branches = []
|
104
|
+
@lvars = Set.new
|
104
105
|
@mergeable_changes = @changes = table.transform_values { [level, _1] }
|
105
106
|
end
|
106
107
|
|
@@ -156,6 +157,7 @@ module KatakataIrb
|
|
156
157
|
|
157
158
|
def []=(name, value)
|
158
159
|
variable_level = level_of(name) || level
|
160
|
+
@lvars << name if level == variable_level && BaseScope.type_by_name(name) == :lvar
|
159
161
|
@changes[name] = [variable_level, value]
|
160
162
|
end
|
161
163
|
|
@@ -197,12 +199,17 @@ module KatakataIrb
|
|
197
199
|
update scope
|
198
200
|
end
|
199
201
|
|
202
|
+
def touch_lvars(lvars)
|
203
|
+
lvars.each { self[_1] = self[_1] || KatakataIrb::Types::NIL }
|
204
|
+
end
|
205
|
+
|
200
206
|
def run_branches(*blocks)
|
201
207
|
results = []
|
202
208
|
branches = []
|
203
209
|
blocks.each do |block|
|
204
210
|
scope = Scope.new self, passthrough: true
|
205
211
|
result = block.call scope
|
212
|
+
touch_lvars scope.lvars if scope.level == level
|
206
213
|
next if scope.terminated?
|
207
214
|
results << result
|
208
215
|
branches << scope.mergeable_changes
|
@@ -222,6 +229,7 @@ module KatakataIrb
|
|
222
229
|
|
223
230
|
def update(child_scope)
|
224
231
|
current_level = level
|
232
|
+
touch_lvars child_scope.lvars if child_scope.level == current_level
|
225
233
|
child_scope.mergeable_changes.each do |name, (level, value)|
|
226
234
|
self[name] = value if level <= current_level
|
227
235
|
end
|
@@ -70,7 +70,7 @@ class KatakataIrb::TypeSimulator
|
|
70
70
|
else
|
71
71
|
current_self_types = scope.self_type.types
|
72
72
|
self_types = current_self_types.map do |type|
|
73
|
-
if (
|
73
|
+
if type.is_a?(KatakataIrb::Types::SingletonType) && type.module_or_class.is_a?(Class)
|
74
74
|
KatakataIrb::Types::InstanceType.new type.module_or_class
|
75
75
|
else
|
76
76
|
type
|
@@ -129,10 +129,10 @@ class KatakataIrb::TypeSimulator
|
|
129
129
|
in [:array, [:args_add_star,] => star]
|
130
130
|
args, kwargs = retrieve_method_args star
|
131
131
|
types = args.flat_map do |elem|
|
132
|
-
if elem
|
132
|
+
if elem.is_a? KatakataIrb::Types::Splat
|
133
133
|
splat = simulate_evaluate elem.item, scope
|
134
|
-
|
135
|
-
|
134
|
+
array_elem, non_array = partition_to_array splat.nonnillable, :to_a
|
135
|
+
KatakataIrb::Types::UnionType[*array_elem, *non_array]
|
136
136
|
else
|
137
137
|
simulate_evaluate elem, scope
|
138
138
|
end
|
@@ -173,10 +173,10 @@ class KatakataIrb::TypeSimulator
|
|
173
173
|
values << simulate_evaluate(value, scope)
|
174
174
|
in [:assoc_splat, value]
|
175
175
|
hash = simulate_evaluate value, scope
|
176
|
-
unless (
|
176
|
+
unless hash.is_a?(KatakataIrb::Types::InstanceType) && hash.klass == Hash
|
177
177
|
hash = simulate_call hash, :to_hash, [], nil, nil
|
178
178
|
end
|
179
|
-
if (
|
179
|
+
if hash.is_a?(KatakataIrb::Types::InstanceType) && hash.klass == Hash
|
180
180
|
keys << hash.params[:K] if hash.params[:K]
|
181
181
|
values << hash.params[:V] if hash.params[:V]
|
182
182
|
end
|
@@ -192,7 +192,7 @@ class KatakataIrb::TypeSimulator
|
|
192
192
|
statements.map { simulate_evaluate _1, scope }.last
|
193
193
|
in [:const_path_ref, receiver, [:@const, name,]]
|
194
194
|
r = simulate_evaluate receiver, scope
|
195
|
-
(
|
195
|
+
r.is_a?(KatakataIrb::Types::SingletonType) ? KatakataIrb::BaseScope.type_of { r.module_or_class.const_get name } : KatakataIrb::Types::NIL
|
196
196
|
in [:__var_ref_or_call, [type, name, pos]]
|
197
197
|
sexp = scope.has?(name) ? [:var_ref, [type, name, pos]] : [:vcall, [:@ident, name, pos]]
|
198
198
|
simulate_evaluate sexp, scope
|
@@ -221,7 +221,7 @@ class KatakataIrb::TypeSimulator
|
|
221
221
|
receiver_type = simulate_evaluate receiver, scope if receiver
|
222
222
|
args, kwargs, _block = retrieve_method_args args
|
223
223
|
args_type = args.map do |arg|
|
224
|
-
if arg
|
224
|
+
if arg.is_a? KatakataIrb::Types::Splat
|
225
225
|
simulate_evaluate arg.item, scope
|
226
226
|
nil # TODO: splat
|
227
227
|
else
|
@@ -242,7 +242,7 @@ class KatakataIrb::TypeSimulator
|
|
242
242
|
receiver_type = receiver ? simulate_evaluate(receiver, scope) : scope.self_type
|
243
243
|
evaluate_method = lambda do |scope|
|
244
244
|
args_type = args.map do |arg|
|
245
|
-
if arg
|
245
|
+
if arg.is_a? KatakataIrb::Types::Splat
|
246
246
|
simulate_evaluate arg.item, scope
|
247
247
|
nil # TODO: splat
|
248
248
|
else
|
@@ -342,7 +342,7 @@ class KatakataIrb::TypeSimulator
|
|
342
342
|
simulate_evaluate receiver, scope
|
343
343
|
args, kwargs, _block = retrieve_method_args key
|
344
344
|
args.each do |arg|
|
345
|
-
item = (
|
345
|
+
item = arg.is_a?(KatakataIrb::Types::Splat) ? arg.item : arg
|
346
346
|
simulate_evaluate item, scope
|
347
347
|
end
|
348
348
|
kwargs_type kwargs, scope
|
@@ -435,7 +435,7 @@ class KatakataIrb::TypeSimulator
|
|
435
435
|
in [:super, args]
|
436
436
|
args, kwargs, _block = retrieve_method_args args
|
437
437
|
args.each do |arg|
|
438
|
-
item = (
|
438
|
+
item = arg.is_a?(KatakataIrb::Types::Splat) ? arg.item : arg
|
439
439
|
simulate_evaluate item, scope
|
440
440
|
end
|
441
441
|
kwargs_type kwargs, scope
|
@@ -460,7 +460,7 @@ class KatakataIrb::TypeSimulator
|
|
460
460
|
error_class_stmts = [*stmts, stmt]
|
461
461
|
end
|
462
462
|
error_classes = (error_class_stmts || []).flat_map { simulate_evaluate _1, s }.uniq
|
463
|
-
error_types = error_classes.filter_map { KatakataIrb::Types::InstanceType.new _1.module_or_class if _1
|
463
|
+
error_types = error_classes.filter_map { KatakataIrb::Types::InstanceType.new _1.module_or_class if _1.is_a?(KatakataIrb::Types::SingletonType) }
|
464
464
|
error_types << KatakataIrb::Types::InstanceType.new(StandardError) if error_types.empty?
|
465
465
|
s[error_var] = KatakataIrb::Types::UnionType[*error_types]
|
466
466
|
end
|
@@ -486,7 +486,7 @@ class KatakataIrb::TypeSimulator
|
|
486
486
|
result
|
487
487
|
in [:sclass, klass_stmt, body_stmt]
|
488
488
|
klass_types = simulate_evaluate(klass_stmt, scope).types.filter_map do |type|
|
489
|
-
KatakataIrb::Types::SingletonType.new type.klass if type
|
489
|
+
KatakataIrb::Types::SingletonType.new type.klass if type.is_a? KatakataIrb::Types::InstanceType
|
490
490
|
end
|
491
491
|
klass_types = [KatakataIrb::Types::CLASS] if klass_types.empty?
|
492
492
|
sclass_scope = KatakataIrb::Scope.new(scope, { KatakataIrb::Scope::SELF => KatakataIrb::Types::UnionType[*klass_types], KatakataIrb::Scope::BREAK_RESULT => nil, KatakataIrb::Scope::NEXT_RESULT => nil, KatakataIrb::Scope::RETURN_RESULT => nil }, trace_cvar: false, trace_ivar: false, trace_lvar: false)
|
@@ -497,7 +497,7 @@ class KatakataIrb::TypeSimulator
|
|
497
497
|
klass_types = simulate_evaluate(klass_stmt, scope).types
|
498
498
|
klass_types += simulate_evaluate(superclass_stmt, scope).types if superclass_stmt
|
499
499
|
klass_types = klass_types.select do |type|
|
500
|
-
(
|
500
|
+
type.is_a?(KatakataIrb::Types::SingletonType) && type.module_or_class.is_a?(Class)
|
501
501
|
end
|
502
502
|
klass_types << KatakataIrb::Types::CLASS if klass_types.empty?
|
503
503
|
klass_scope = KatakataIrb::Scope.new(scope, { KatakataIrb::Scope::SELF => KatakataIrb::Types::UnionType[*klass_types], KatakataIrb::Scope::BREAK_RESULT => nil, KatakataIrb::Scope::NEXT_RESULT => nil, KatakataIrb::Scope::RETURN_RESULT => nil }, trace_cvar: false, trace_ivar: false, trace_lvar: false)
|
@@ -571,6 +571,9 @@ class KatakataIrb::TypeSimulator
|
|
571
571
|
simulate_evaluate a, scope
|
572
572
|
simulate_evaluate b, scope
|
573
573
|
KatakataIrb::Types::STRING
|
574
|
+
in [:defined, expression]
|
575
|
+
scope.conditional { simulate_evaluate expression, _1 }
|
576
|
+
KatakataIrb::Types::UnionType[KatakataIrb::Types::STRING, KatakataIrb::Types::NIL]
|
574
577
|
else
|
575
578
|
KatakataIrb.log_puts
|
576
579
|
KatakataIrb.log_puts :NOMATCH
|
@@ -597,7 +600,7 @@ class KatakataIrb::TypeSimulator
|
|
597
600
|
in [:binary, lpattern, :'=>', [:var_field, [:@ident, name,]] => rpattern]
|
598
601
|
if lpattern in [:var_ref, [:@const, _const_name,]]
|
599
602
|
const_value = simulate_evaluate lpattern, scope
|
600
|
-
if (
|
603
|
+
if const_value.is_a?(KatakataIrb::Types::SingletonType) && const_value.module_or_class.is_a?(Class)
|
601
604
|
scope[name] = KatakataIrb::Types::InstanceType.new const_value.module_or_class
|
602
605
|
else
|
603
606
|
scope[name] = KatakataIrb::Types::OBJECT
|
@@ -609,7 +612,7 @@ class KatakataIrb::TypeSimulator
|
|
609
612
|
end
|
610
613
|
in [:aryptn, _unknown, items, splat, post_items]
|
611
614
|
# TODO: deconstruct keys
|
612
|
-
array_types = types.select { (
|
615
|
+
array_types = types.select { _1.is_a?(KatakataIrb::Types::InstanceType) && _1.klass == Array }
|
613
616
|
elem = KatakataIrb::Types::UnionType[*array_types.filter_map { _1.params[:Elem] }]
|
614
617
|
items&.each do |item|
|
615
618
|
match_pattern elem, item, scope
|
@@ -623,7 +626,7 @@ class KatakataIrb::TypeSimulator
|
|
623
626
|
end
|
624
627
|
in [:hshptn, _unknown, items, splat]
|
625
628
|
# TODO: deconstruct keys
|
626
|
-
hash_types = types.select { (
|
629
|
+
hash_types = types.select { _1.is_a?(KatakataIrb::Types::InstanceType) && _1.klass == Hash }
|
627
630
|
key_type = KatakataIrb::Types::UnionType[*hash_types.filter_map { _1.params[:K] }]
|
628
631
|
value_type = KatakataIrb::Types::UnionType[*hash_types.filter_map { _1.params[:V] }]
|
629
632
|
items&.each do |key_pattern, value_pattern|
|
@@ -652,7 +655,7 @@ class KatakataIrb::TypeSimulator
|
|
652
655
|
def evaluate_mrhs(sexp, scope)
|
653
656
|
args, kwargs, = retrieve_method_args sexp
|
654
657
|
values = args.filter_map do |t|
|
655
|
-
if t
|
658
|
+
if t.is_a? KatakataIrb::Types::Splat
|
656
659
|
simulate_evaluate t.item, scope
|
657
660
|
# TODO
|
658
661
|
nil
|
@@ -679,17 +682,31 @@ class KatakataIrb::TypeSimulator
|
|
679
682
|
[values, kw]
|
680
683
|
end
|
681
684
|
|
682
|
-
def
|
683
|
-
|
684
|
-
|
685
|
-
|
685
|
+
def sized_splat(value, method, size)
|
686
|
+
array_elem, non_array = partition_to_array value, method
|
687
|
+
values = [KatakataIrb::Types::UnionType[*array_elem, *non_array]]
|
688
|
+
values += [array_elem] * (size - 1) if array_elem && size >= 1
|
689
|
+
values
|
686
690
|
end
|
687
691
|
|
688
|
-
def
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
+
def partition_to_array(value, method)
|
693
|
+
arrays, non_arrays = value.types.partition { _1.is_a?(KatakataIrb::Types::InstanceType) && _1.klass == Array }
|
694
|
+
non_arrays.select! do |type|
|
695
|
+
to_array_result = simulate_call type, method, [], nil, nil, name_match: false
|
696
|
+
if to_array_result.is_a?(KatakataIrb::Types::InstanceType) && to_array_result.klass == Array
|
697
|
+
arrays << to_array_result
|
698
|
+
false
|
699
|
+
else
|
700
|
+
true
|
701
|
+
end
|
692
702
|
end
|
703
|
+
array_elem = arrays.empty? ? nil : KatakataIrb::Types::UnionType[*arrays.map { _1.params[:Elem] || KatakataIrb::Types::OBJECT }]
|
704
|
+
non_array = non_arrays.empty? ? nil : KatakataIrb::Types::UnionType[*non_arrays]
|
705
|
+
[array_elem, non_array]
|
706
|
+
end
|
707
|
+
|
708
|
+
def evaluate_massign(sexp, values, scope)
|
709
|
+
values = sized_splat values, :to_ary, sexp.size unless values.is_a? Array
|
693
710
|
|
694
711
|
rest_index = sexp.find_index { _1 in [:rest_param, ]}
|
695
712
|
if rest_index
|
@@ -729,12 +746,12 @@ class KatakataIrb::TypeSimulator
|
|
729
746
|
keys = []
|
730
747
|
values = []
|
731
748
|
kwargs.each do |kv|
|
732
|
-
if kv
|
749
|
+
if kv.is_a? KatakataIrb::Types::Splat
|
733
750
|
hash = simulate_evaluate kv.item, scope
|
734
|
-
unless (
|
751
|
+
unless hash.is_a?(KatakataIrb::Types::InstanceType) && hash.klass == Hash
|
735
752
|
hash = simulate_call hash, :to_hash, [], nil, nil
|
736
753
|
end
|
737
|
-
if (
|
754
|
+
if hash.is_a?(KatakataIrb::Types::InstanceType) && hash.klass == Hash
|
738
755
|
keys << hash.params[:K] if hash.params[:K]
|
739
756
|
values << hash.params[:V] if hash.params[:V]
|
740
757
|
end
|
@@ -822,6 +839,8 @@ class KatakataIrb::TypeSimulator
|
|
822
839
|
[args, [], nil]
|
823
840
|
in [:arg_paren, args]
|
824
841
|
args ? retrieve_method_args(args) : [[], [], nil]
|
842
|
+
in [[:command | :command_call, ] => command_arg] # method(a b, c), method(a.b c, d)
|
843
|
+
[[command_arg], [], nil]
|
825
844
|
else
|
826
845
|
[[], [], nil]
|
827
846
|
end
|
@@ -901,11 +920,7 @@ class KatakataIrb::TypeSimulator
|
|
901
920
|
values = values.dup
|
902
921
|
params => [:params, pre_required, optional, rest, post_required, _keywords, keyrest, block]
|
903
922
|
size = (pre_required&.size || 0) + (optional&.size || 0) + (post_required&.size || 0) + (rest ? 1 : 0)
|
904
|
-
if values.size == 1 && size >= 2
|
905
|
-
value = values.first
|
906
|
-
array_value = to_array value, :to_ary if value
|
907
|
-
values = [array_value.params[:Elem] || KatakataIrb::Types::OBJECT] * size if array_value
|
908
|
-
end
|
923
|
+
values = sized_splat values.first, :to_ary, size if values.size == 1 && size >= 2
|
909
924
|
pre_values = values.shift pre_required.size if pre_required
|
910
925
|
post_values = values.pop post_required.size if post_required
|
911
926
|
opt_values = values.shift optional.size if optional
|
@@ -955,7 +970,7 @@ class KatakataIrb::TypeSimulator
|
|
955
970
|
name.match?(/\A_[1-9]\z/) ? name[1..].to_i : 0
|
956
971
|
else
|
957
972
|
sexp.filter_map do |s|
|
958
|
-
max_numbered_params s if s
|
973
|
+
max_numbered_params s if s.is_a? Array
|
959
974
|
end.max || 0
|
960
975
|
end
|
961
976
|
end
|
data/lib/katakata_irb/types.rb
CHANGED
@@ -4,9 +4,16 @@ require 'rbs/cli'
|
|
4
4
|
module KatakataIrb; end
|
5
5
|
module KatakataIrb::Types
|
6
6
|
def self.rbs_builder
|
7
|
-
@rbs_builder ||=
|
8
|
-
|
9
|
-
|
7
|
+
@rbs_builder ||= load_rbs_builder
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.load_rbs_builder
|
11
|
+
loader = RBS::CLI::LibraryOptions.new.loader
|
12
|
+
loader.add path: Pathname('sig')
|
13
|
+
RBS::DefinitionBuilder.new env: RBS::Environment.from_loader(loader).resolve_type_names
|
14
|
+
rescue => e
|
15
|
+
puts "\nKatakataIRB failed to initialize RBS::DefinitionBuild\n#{e}"
|
16
|
+
Object.new
|
10
17
|
end
|
11
18
|
|
12
19
|
Splat = Struct.new :item
|
@@ -24,7 +31,7 @@ module KatakataIrb::Types
|
|
24
31
|
next unless name
|
25
32
|
type_name = RBS::TypeName(name).absolute!
|
26
33
|
definition = (singleton ? rbs_builder.build_singleton(type_name) : rbs_builder.build_instance(type_name)) rescue nil
|
27
|
-
method = definition
|
34
|
+
method = definition.methods[method_name] if definition
|
28
35
|
return method if method
|
29
36
|
end
|
30
37
|
nil
|
@@ -170,6 +177,9 @@ module KatakataIrb::Types
|
|
170
177
|
def types() = [self]
|
171
178
|
def nillable?() = false
|
172
179
|
def nonnillable() = self
|
180
|
+
def inspect
|
181
|
+
"#{module_or_class}.itself"
|
182
|
+
end
|
173
183
|
end
|
174
184
|
|
175
185
|
class InstanceType
|
@@ -185,6 +195,19 @@ module KatakataIrb::Types
|
|
185
195
|
def types() = [self]
|
186
196
|
def nillable?() = (@klass == NilClass)
|
187
197
|
def nonnillable() = self
|
198
|
+
def inspect
|
199
|
+
case klass
|
200
|
+
when NilClass
|
201
|
+
'nil'
|
202
|
+
when TrueClass
|
203
|
+
'true'
|
204
|
+
when FalseClass
|
205
|
+
'false'
|
206
|
+
else
|
207
|
+
params_string = "[#{params.map { "#{_1}: #{_2.inspect}" }.join(', ')}]" unless params.empty?
|
208
|
+
"#{klass.name}#{params_string}"
|
209
|
+
end
|
210
|
+
end
|
188
211
|
end
|
189
212
|
|
190
213
|
class ProcType
|
@@ -201,6 +224,7 @@ module KatakataIrb::Types
|
|
201
224
|
def types() = [self]
|
202
225
|
def nillable?() = (@klass == NilClass)
|
203
226
|
def nonnillable() = self
|
227
|
+
def inspect() = 'Proc'
|
204
228
|
end
|
205
229
|
|
206
230
|
NIL = InstanceType.new NilClass
|
@@ -276,6 +300,7 @@ module KatakataIrb::Types
|
|
276
300
|
def methods() = @types.flat_map(&:methods).uniq
|
277
301
|
def all_methods() = @types.flat_map(&:all_methods).uniq
|
278
302
|
def constants() = @types.flat_map(&:constants).uniq
|
303
|
+
def inspect() = @types.map(&:inspect).join(' | ')
|
279
304
|
end
|
280
305
|
|
281
306
|
BOOLEAN = UnionType[TRUE, FALSE]
|
@@ -284,9 +309,9 @@ module KatakataIrb::Types
|
|
284
309
|
case return_type
|
285
310
|
when RBS::Types::Bases::Self
|
286
311
|
self_type
|
287
|
-
when RBS::Types::Bases::
|
312
|
+
when RBS::Types::Bases::Bottom, RBS::Types::Bases::Nil
|
288
313
|
NIL
|
289
|
-
when RBS::Types::Bases::Any
|
314
|
+
when RBS::Types::Bases::Any, RBS::Types::Bases::Void
|
290
315
|
OBJECT
|
291
316
|
when RBS::Types::Bases::Class
|
292
317
|
self_type.transform do |type|
|
data/lib/katakata_irb/version.rb
CHANGED
data/sig/katakata_irb.rbs
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
module KatakataIrb
|
2
2
|
VERSION: String
|
3
|
-
|
3
|
+
module Completor
|
4
|
+
def self.analyze: (code: String, binding?: Binding) -> Array[Symbol | Object | String | true | false]?
|
5
|
+
def self.setup: () -> void
|
6
|
+
end
|
4
7
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: katakata_irb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- tompng
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-04-
|
11
|
+
date: 2023-04-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: irb
|