tapioca 0.17.9 → 0.18.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.
- checksums.yaml +4 -4
- data/README.md +3 -2
- data/lib/tapioca/bundler_ext/auto_require_hook.rb +0 -3
- data/lib/tapioca/cli.rb +0 -2
- data/lib/tapioca/commands/abstract_dsl.rb +21 -2
- data/lib/tapioca/commands/abstract_gem.rb +20 -1
- data/lib/tapioca/commands/annotations.rb +7 -3
- data/lib/tapioca/commands/check_shims.rb +9 -2
- data/lib/tapioca/commands/command.rb +0 -1
- data/lib/tapioca/dsl/compiler.rb +17 -16
- data/lib/tapioca/dsl/compilers/aasm.rb +2 -6
- data/lib/tapioca/dsl/compilers/action_controller_helpers.rb +2 -6
- data/lib/tapioca/dsl/compilers/action_mailer.rb +1 -5
- data/lib/tapioca/dsl/compilers/action_text.rb +1 -5
- data/lib/tapioca/dsl/compilers/active_job.rb +1 -5
- data/lib/tapioca/dsl/compilers/active_model_attributes.rb +1 -5
- data/lib/tapioca/dsl/compilers/active_model_secure_password.rb +1 -5
- data/lib/tapioca/dsl/compilers/active_model_validations_confirmation.rb +1 -3
- data/lib/tapioca/dsl/compilers/active_record_associations.rb +1 -6
- data/lib/tapioca/dsl/compilers/active_record_columns.rb +8 -5
- data/lib/tapioca/dsl/compilers/active_record_delegated_types.rb +1 -4
- data/lib/tapioca/dsl/compilers/active_record_enum.rb +1 -5
- data/lib/tapioca/dsl/compilers/active_record_fixtures.rb +1 -5
- data/lib/tapioca/dsl/compilers/active_record_relations.rb +45 -87
- data/lib/tapioca/dsl/compilers/active_record_scope.rb +1 -2
- data/lib/tapioca/dsl/compilers/active_record_secure_token.rb +1 -4
- data/lib/tapioca/dsl/compilers/active_record_store.rb +1 -4
- data/lib/tapioca/dsl/compilers/active_record_typed_store.rb +1 -5
- data/lib/tapioca/dsl/compilers/active_resource.rb +1 -5
- data/lib/tapioca/dsl/compilers/active_storage.rb +2 -6
- data/lib/tapioca/dsl/compilers/active_support_concern.rb +6 -10
- data/lib/tapioca/dsl/compilers/active_support_current_attributes.rb +4 -19
- data/lib/tapioca/dsl/compilers/active_support_environment_inquirer.rb +60 -0
- data/lib/tapioca/dsl/compilers/active_support_time_ext.rb +1 -5
- data/lib/tapioca/dsl/compilers/config.rb +2 -6
- data/lib/tapioca/dsl/compilers/frozen_record.rb +1 -5
- data/lib/tapioca/dsl/compilers/graphql_input_object.rb +1 -5
- data/lib/tapioca/dsl/compilers/graphql_mutation.rb +1 -5
- data/lib/tapioca/dsl/compilers/identity_cache.rb +2 -6
- data/lib/tapioca/dsl/compilers/json_api_client_resource.rb +4 -18
- data/lib/tapioca/dsl/compilers/kredis.rb +1 -5
- data/lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb +2 -6
- data/lib/tapioca/dsl/compilers/protobuf.rb +2 -6
- data/lib/tapioca/dsl/compilers/rails_generators.rb +1 -5
- data/lib/tapioca/dsl/compilers/sidekiq_worker.rb +1 -5
- data/lib/tapioca/dsl/compilers/smart_properties.rb +1 -5
- data/lib/tapioca/dsl/compilers/state_machines.rb +2 -6
- data/lib/tapioca/dsl/compilers/url_helpers.rb +7 -10
- data/lib/tapioca/dsl/helpers/active_model_type_helper.rb +0 -2
- data/lib/tapioca/dsl/helpers/active_record_column_type_helper.rb +3 -6
- data/lib/tapioca/dsl/helpers/active_record_constants_helper.rb +0 -2
- data/lib/tapioca/dsl/helpers/graphql_type_helper.rb +18 -5
- data/lib/tapioca/dsl/pipeline.rb +25 -13
- data/lib/tapioca/executor.rb +0 -2
- data/lib/tapioca/gem/events.rb +15 -23
- data/lib/tapioca/gem/listeners/base.rb +0 -1
- data/lib/tapioca/gem/listeners/dynamic_mixins.rb +0 -2
- data/lib/tapioca/gem/listeners/foreign_constants.rb +0 -2
- data/lib/tapioca/gem/listeners/methods.rb +19 -9
- data/lib/tapioca/gem/listeners/mixins.rb +3 -5
- data/lib/tapioca/gem/listeners/remove_empty_payload_scopes.rb +0 -2
- data/lib/tapioca/gem/listeners/sorbet_enums.rb +0 -2
- data/lib/tapioca/gem/listeners/sorbet_helpers.rb +0 -2
- data/lib/tapioca/gem/listeners/sorbet_props.rb +0 -1
- data/lib/tapioca/gem/listeners/sorbet_required_ancestors.rb +0 -2
- data/lib/tapioca/gem/listeners/sorbet_signatures.rb +0 -2
- data/lib/tapioca/gem/listeners/sorbet_type_variables.rb +1 -3
- data/lib/tapioca/gem/listeners/source_location.rb +6 -7
- data/lib/tapioca/gem/listeners/subconstants.rb +0 -2
- data/lib/tapioca/gem/listeners/yard_doc.rb +0 -2
- data/lib/tapioca/gem/pipeline.rb +25 -21
- data/lib/tapioca/gemfile.rb +1 -3
- data/lib/tapioca/helpers/cli_helper.rb +0 -1
- data/lib/tapioca/helpers/config_helper.rb +5 -2
- data/lib/tapioca/helpers/env_helper.rb +0 -1
- data/lib/tapioca/helpers/gem_helper.rb +0 -2
- data/lib/tapioca/helpers/git_attributes.rb +0 -2
- data/lib/tapioca/helpers/package_url.rb +416 -0
- data/lib/tapioca/helpers/rbi_files_helper.rb +8 -2
- data/lib/tapioca/helpers/rbi_helper.rb +0 -3
- data/lib/tapioca/helpers/sorbet_helper.rb +0 -2
- data/lib/tapioca/helpers/test/content.rb +0 -1
- data/lib/tapioca/helpers/test/dsl_compiler.rb +0 -3
- data/lib/tapioca/helpers/test/isolation.rb +0 -6
- data/lib/tapioca/helpers/test/template.rb +1 -9
- data/lib/tapioca/internal.rb +1 -1
- data/lib/tapioca/loaders/dsl.rb +0 -4
- data/lib/tapioca/loaders/gem.rb +14 -6
- data/lib/tapioca/loaders/loader.rb +0 -1
- data/lib/tapioca/rbi_ext/model.rb +9 -4
- data/lib/tapioca/rbi_formatter.rb +0 -2
- data/lib/tapioca/repo_index.rb +1 -4
- data/lib/tapioca/runtime/dynamic_mixin_compiler.rb +6 -9
- data/lib/tapioca/runtime/generic_type_registry.rb +8 -12
- data/lib/tapioca/runtime/reflection.rb +25 -31
- data/lib/tapioca/runtime/trackers/autoload.rb +0 -3
- data/lib/tapioca/runtime/trackers/constant_definition.rb +30 -8
- data/lib/tapioca/runtime/trackers/method_definition.rb +4 -5
- data/lib/tapioca/runtime/trackers/mixin.rb +5 -8
- data/lib/tapioca/runtime/trackers/required_ancestor.rb +2 -4
- data/lib/tapioca/runtime/trackers/tracker.rb +1 -4
- data/lib/tapioca/runtime/trackers.rb +0 -4
- data/lib/tapioca/sorbet_ext/generic_name_patch.rb +1 -3
- data/lib/tapioca/static/requires_compiler.rb +1 -3
- data/lib/tapioca/static/symbol_loader.rb +0 -1
- data/lib/tapioca/static/symbol_table_parser.rb +0 -4
- data/lib/tapioca/version.rb +1 -1
- data/lib/tapioca.rb +0 -2
- metadata +18 -5
- data/lib/tapioca/helpers/source_uri.rb +0 -84
- data/lib/tapioca/runtime/attached_class_of_32.rb +0 -20
- data/lib/tapioca/runtime/attached_class_of_legacy.rb +0 -24
|
@@ -5,8 +5,6 @@ module Tapioca
|
|
|
5
5
|
module Gem
|
|
6
6
|
module Listeners
|
|
7
7
|
class Mixins < Base
|
|
8
|
-
extend T::Sig
|
|
9
|
-
|
|
10
8
|
include Runtime::Reflection
|
|
11
9
|
|
|
12
10
|
private
|
|
@@ -32,7 +30,7 @@ module Tapioca
|
|
|
32
30
|
add_mixins(node, constant, extends.reverse, Runtime::Trackers::Mixin::Type::Extend)
|
|
33
31
|
end
|
|
34
32
|
|
|
35
|
-
#: (RBI::Tree tree, Module constant, Array[Module] mods, Runtime::Trackers::Mixin::Type mixin_type) -> void
|
|
33
|
+
#: (RBI::Tree tree, T::Module[top] constant, Array[T::Module[top]] mods, Runtime::Trackers::Mixin::Type mixin_type) -> void
|
|
36
34
|
def add_mixins(tree, constant, mods, mixin_type)
|
|
37
35
|
mods
|
|
38
36
|
.select do |mod|
|
|
@@ -59,7 +57,7 @@ module Tapioca
|
|
|
59
57
|
end
|
|
60
58
|
end
|
|
61
59
|
|
|
62
|
-
#: (Module constant, Module mixin, Runtime::Trackers::Mixin::Type mixin_type) -> bool
|
|
60
|
+
#: (T::Module[top] constant, T::Module[top] mixin, Runtime::Trackers::Mixin::Type mixin_type) -> bool
|
|
63
61
|
def mixed_in_by_gem?(constant, mixin, mixin_type)
|
|
64
62
|
mixin_location = Runtime::Trackers::Mixin.mixin_location(mixin, mixin_type, constant)
|
|
65
63
|
|
|
@@ -75,7 +73,7 @@ module Tapioca
|
|
|
75
73
|
mixin_name.start_with?("T::") && !mixin_name.start_with?("T::Props")
|
|
76
74
|
end
|
|
77
75
|
|
|
78
|
-
#: (Module constant) -> Array[Module]
|
|
76
|
+
#: (T::Module[top] constant) -> Array[T::Module[top]]
|
|
79
77
|
def interesting_ancestors_of(constant)
|
|
80
78
|
inherited_ancestors = Set.new.compare_by_identity.merge(inherited_ancestors_of(constant))
|
|
81
79
|
|
|
@@ -5,8 +5,6 @@ module Tapioca
|
|
|
5
5
|
module Gem
|
|
6
6
|
module Listeners
|
|
7
7
|
class SorbetTypeVariables < Base
|
|
8
|
-
extend T::Sig
|
|
9
|
-
|
|
10
8
|
include Runtime::Reflection
|
|
11
9
|
|
|
12
10
|
private
|
|
@@ -24,7 +22,7 @@ module Tapioca
|
|
|
24
22
|
node << sclass if sclass.nodes.length > 1
|
|
25
23
|
end
|
|
26
24
|
|
|
27
|
-
#: (RBI::Tree tree, Module constant) -> void
|
|
25
|
+
#: (RBI::Tree tree, T::Module[top] constant) -> void
|
|
28
26
|
def compile_type_variable_declarations(tree, constant)
|
|
29
27
|
# Try to find the type variables defined on this constant, bail if we can't
|
|
30
28
|
type_variables = Runtime::GenericTypeRegistry.lookup_type_variables(constant)
|
|
@@ -5,8 +5,6 @@ module Tapioca
|
|
|
5
5
|
module Gem
|
|
6
6
|
module Listeners
|
|
7
7
|
class SourceLocation < Base
|
|
8
|
-
extend T::Sig
|
|
9
|
-
|
|
10
8
|
private
|
|
11
9
|
|
|
12
10
|
# @override
|
|
@@ -64,12 +62,13 @@ module Tapioca
|
|
|
64
62
|
# we can clear the gem version if the gem is the same one we are processing
|
|
65
63
|
version = "" if gem == @pipeline.gem
|
|
66
64
|
|
|
67
|
-
uri =
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
65
|
+
uri = Tapioca::Helpers::PackageURL.new(
|
|
66
|
+
type: "gem",
|
|
67
|
+
name: gem.name,
|
|
68
|
+
version: version,
|
|
69
|
+
subpath: "#{path}:#{line}",
|
|
72
70
|
)
|
|
71
|
+
|
|
73
72
|
node.comments << RBI::Comment.new("") if node.comments.any?
|
|
74
73
|
node.comments << RBI::Comment.new(uri.to_s)
|
|
75
74
|
rescue URI::InvalidComponentError, URI::InvalidURIError
|
data/lib/tapioca/gem/pipeline.rb
CHANGED
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
module Tapioca
|
|
5
5
|
module Gem
|
|
6
6
|
class Pipeline
|
|
7
|
-
extend T::Sig
|
|
8
7
|
include Runtime::Reflection
|
|
9
8
|
include RBIHelper
|
|
10
9
|
|
|
@@ -72,27 +71,34 @@ module Tapioca
|
|
|
72
71
|
@events << Gem::ConstantFound.new(symbol, constant)
|
|
73
72
|
end
|
|
74
73
|
|
|
75
|
-
#: (String symbol, Module constant) -> void
|
|
74
|
+
#: (String symbol, T::Module[top] constant) -> void
|
|
76
75
|
def push_foreign_constant(symbol, constant)
|
|
77
76
|
@events << Gem::ForeignConstantFound.new(symbol, constant)
|
|
78
77
|
end
|
|
79
78
|
|
|
80
|
-
#: (String symbol, Module constant, RBI::Const node) -> void
|
|
79
|
+
#: (String symbol, T::Module[top] constant, RBI::Const node) -> void
|
|
81
80
|
def push_const(symbol, constant, node)
|
|
82
81
|
@events << Gem::ConstNodeAdded.new(symbol, constant, node)
|
|
83
82
|
end
|
|
84
83
|
|
|
85
|
-
#: (String symbol, Module constant, RBI::Scope node) -> void
|
|
84
|
+
#: (String symbol, T::Module[top] constant, RBI::Scope node) -> void
|
|
86
85
|
def push_scope(symbol, constant, node)
|
|
87
86
|
@events << Gem::ScopeNodeAdded.new(symbol, constant, node)
|
|
88
87
|
end
|
|
89
88
|
|
|
90
|
-
#: (String symbol, Module constant, RBI::Scope node) -> void
|
|
89
|
+
#: (String symbol, T::Module[top] constant, RBI::Scope node) -> void
|
|
91
90
|
def push_foreign_scope(symbol, constant, node)
|
|
92
91
|
@events << Gem::ForeignScopeNodeAdded.new(symbol, constant, node)
|
|
93
92
|
end
|
|
94
93
|
|
|
95
|
-
#: (
|
|
94
|
+
#: (
|
|
95
|
+
#| String symbol,
|
|
96
|
+
#| T::Module[top] constant,
|
|
97
|
+
#| UnboundMethod method,
|
|
98
|
+
#| RBI::Method node,
|
|
99
|
+
#| untyped signature,
|
|
100
|
+
#| Array[[Symbol, String]] parameters
|
|
101
|
+
#| ) -> void
|
|
96
102
|
def push_method(symbol, constant, method, node, signature, parameters) # rubocop:disable Metrics/ParameterLists
|
|
97
103
|
@events << Gem::MethodNodeAdded.new(symbol, constant, method, node, signature, parameters)
|
|
98
104
|
end
|
|
@@ -133,8 +139,6 @@ module Tapioca
|
|
|
133
139
|
|
|
134
140
|
# The method defined in gem and has a source location
|
|
135
141
|
class MethodInGemWithLocation < MethodDefinitionLookupResult
|
|
136
|
-
extend T::Sig
|
|
137
|
-
|
|
138
142
|
#: Runtime::SourceLocation
|
|
139
143
|
attr_reader :location
|
|
140
144
|
|
|
@@ -145,7 +149,7 @@ module Tapioca
|
|
|
145
149
|
end
|
|
146
150
|
end
|
|
147
151
|
|
|
148
|
-
#: (Symbol method_name, Module owner) -> MethodDefinitionLookupResult
|
|
152
|
+
#: (Symbol method_name, T::Module[top] owner) -> MethodDefinitionLookupResult
|
|
149
153
|
def method_definition_in_gem(method_name, owner)
|
|
150
154
|
definitions = Tapioca::Runtime::Trackers::MethodDefinition.method_definitions_for(method_name, owner)
|
|
151
155
|
|
|
@@ -171,7 +175,7 @@ module Tapioca
|
|
|
171
175
|
|
|
172
176
|
# Helpers
|
|
173
177
|
|
|
174
|
-
#: (Module constant) -> String?
|
|
178
|
+
#: (T::Module[top] constant) -> String?
|
|
175
179
|
def name_of(constant)
|
|
176
180
|
name = name_of_proxy_target(constant, super(class_of(constant)))
|
|
177
181
|
return name if name
|
|
@@ -243,7 +247,7 @@ module Tapioca
|
|
|
243
247
|
|
|
244
248
|
# Compiling
|
|
245
249
|
|
|
246
|
-
#: (String symbol, Module constant) -> void
|
|
250
|
+
#: (String symbol, T::Module[top] constant) -> void
|
|
247
251
|
def compile_foreign_constant(symbol, constant)
|
|
248
252
|
return if skip_foreign_constant?(symbol, constant)
|
|
249
253
|
return if seen?(symbol)
|
|
@@ -269,7 +273,7 @@ module Tapioca
|
|
|
269
273
|
end
|
|
270
274
|
end
|
|
271
275
|
|
|
272
|
-
#: (String name, Module constant) -> void
|
|
276
|
+
#: (String name, T::Module[top] constant) -> void
|
|
273
277
|
def compile_alias(name, constant)
|
|
274
278
|
return if seen?(name)
|
|
275
279
|
|
|
@@ -324,7 +328,7 @@ module Tapioca
|
|
|
324
328
|
@root << node
|
|
325
329
|
end
|
|
326
330
|
|
|
327
|
-
#: (String name, Module constant) -> void
|
|
331
|
+
#: (String name, T::Module[top] constant) -> void
|
|
328
332
|
def compile_module(name, constant)
|
|
329
333
|
return if skip_module?(name, constant)
|
|
330
334
|
return if seen?(name)
|
|
@@ -335,7 +339,7 @@ module Tapioca
|
|
|
335
339
|
push_scope(name, constant, scope)
|
|
336
340
|
end
|
|
337
341
|
|
|
338
|
-
#: (String name, Module constant) -> RBI::Scope
|
|
342
|
+
#: (String name, T::Module[top] constant) -> RBI::Scope
|
|
339
343
|
def compile_scope(name, constant)
|
|
340
344
|
scope = if constant.is_a?(Class)
|
|
341
345
|
superclass = compile_superclass(constant)
|
|
@@ -418,7 +422,7 @@ module Tapioca
|
|
|
418
422
|
false
|
|
419
423
|
end
|
|
420
424
|
|
|
421
|
-
#: (String name, Module constant) -> bool
|
|
425
|
+
#: (String name, T::Module[top] constant) -> bool
|
|
422
426
|
def skip_alias?(name, constant)
|
|
423
427
|
return true if symbol_in_payload?(name)
|
|
424
428
|
return true unless constant_in_gem?(name)
|
|
@@ -436,12 +440,12 @@ module Tapioca
|
|
|
436
440
|
false
|
|
437
441
|
end
|
|
438
442
|
|
|
439
|
-
#: (String name, Module constant) -> bool
|
|
443
|
+
#: (String name, T::Module[top] constant) -> bool
|
|
440
444
|
def skip_foreign_constant?(name, constant)
|
|
441
445
|
Tapioca::TypeVariableModule === constant
|
|
442
446
|
end
|
|
443
447
|
|
|
444
|
-
#: (String name, Module constant) -> bool
|
|
448
|
+
#: (String name, T::Module[top] constant) -> bool
|
|
445
449
|
def skip_module?(name, constant)
|
|
446
450
|
return true unless defined_in_gem?(constant, strict: false)
|
|
447
451
|
return true if Tapioca::TypeVariableModule === constant
|
|
@@ -449,7 +453,7 @@ module Tapioca
|
|
|
449
453
|
false
|
|
450
454
|
end
|
|
451
455
|
|
|
452
|
-
#: (Module constant, ?strict: bool) -> bool
|
|
456
|
+
#: (T::Module[top] constant, ?strict: bool) -> bool
|
|
453
457
|
def defined_in_gem?(constant, strict: true)
|
|
454
458
|
files = get_file_candidates(constant)
|
|
455
459
|
.merge(Runtime::Trackers::ConstantDefinition.files_for(constant))
|
|
@@ -461,7 +465,7 @@ module Tapioca
|
|
|
461
465
|
end
|
|
462
466
|
end
|
|
463
467
|
|
|
464
|
-
#: (Module constant) -> Set[String]
|
|
468
|
+
#: (T::Module[top] constant) -> Set[String]
|
|
465
469
|
def get_file_candidates(constant)
|
|
466
470
|
file_candidates_for(constant)
|
|
467
471
|
rescue ArgumentError, NameError
|
|
@@ -492,7 +496,7 @@ module Tapioca
|
|
|
492
496
|
|
|
493
497
|
# Helpers
|
|
494
498
|
|
|
495
|
-
#: ((Module & T::Generic) constant) -> String
|
|
499
|
+
#: ((T::Module[top] & T::Generic) constant) -> String
|
|
496
500
|
def generic_name_of(constant)
|
|
497
501
|
type_name = T.must(constant.name)
|
|
498
502
|
return type_name if type_name =~ /\[.*\]$/
|
|
@@ -508,7 +512,7 @@ module Tapioca
|
|
|
508
512
|
"#{type_name}[#{type_variable_names}]"
|
|
509
513
|
end
|
|
510
514
|
|
|
511
|
-
#: (Module constant, String? class_name) -> String?
|
|
515
|
+
#: (T::Module[top] constant, String? class_name) -> String?
|
|
512
516
|
def name_of_proxy_target(constant, class_name)
|
|
513
517
|
return unless class_name == "ActiveSupport::Deprecation::DeprecatedConstantProxy"
|
|
514
518
|
|
data/lib/tapioca/gemfile.rb
CHANGED
|
@@ -64,7 +64,7 @@ module Tapioca
|
|
|
64
64
|
[dependencies, missing_specs]
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
-
#: -> [
|
|
67
|
+
#: -> [Enumerable[Spec], Array[String]]
|
|
68
68
|
def materialize_deps
|
|
69
69
|
deps = definition.locked_gems.dependencies.except(*@excluded_gems).values
|
|
70
70
|
resolve = definition.resolve
|
|
@@ -107,8 +107,6 @@ module Tapioca
|
|
|
107
107
|
include GemHelper
|
|
108
108
|
|
|
109
109
|
class << self
|
|
110
|
-
extend T::Sig
|
|
111
|
-
|
|
112
110
|
#: -> Hash[String, Gemfile::GemSpec]
|
|
113
111
|
def spec_lookup_by_file_path
|
|
114
112
|
@lookup ||= [*::Gem::Specification.default_stubs, *::Gem::Specification.stubs]
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
module Tapioca
|
|
5
5
|
# @requires_ancestor: Thor
|
|
6
6
|
module ConfigHelper
|
|
7
|
-
extend T::Sig
|
|
8
7
|
#: String
|
|
9
8
|
attr_reader :command_name
|
|
10
9
|
|
|
@@ -89,7 +88,11 @@ module Tapioca
|
|
|
89
88
|
@validating_config = false
|
|
90
89
|
end
|
|
91
90
|
|
|
92
|
-
#: (
|
|
91
|
+
#: (
|
|
92
|
+
#| Hash[Symbol, Thor::Option] command_options,
|
|
93
|
+
#| String config_key,
|
|
94
|
+
#| Hash[untyped, untyped] config_options
|
|
95
|
+
#| ) -> Array[ConfigError]
|
|
93
96
|
def validate_config_options(command_options, config_key, config_options)
|
|
94
97
|
config_options.filter_map do |config_option_key, config_option_value|
|
|
95
98
|
command_option = command_options[config_option_key.to_sym]
|