toys-core 0.12.2 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +22 -0
- data/LICENSE.md +1 -1
- data/README.md +4 -1
- data/docs/guide.md +1 -1
- data/lib/toys/acceptor.rb +10 -1
- data/lib/toys/arg_parser.rb +1 -0
- data/lib/toys/cli.rb +127 -107
- data/lib/toys/compat.rb +54 -3
- data/lib/toys/completion.rb +15 -5
- data/lib/toys/context.rb +22 -20
- data/lib/toys/core.rb +6 -2
- data/lib/toys/dsl/base.rb +2 -0
- data/lib/toys/dsl/flag.rb +23 -17
- data/lib/toys/dsl/flag_group.rb +11 -7
- data/lib/toys/dsl/positional_arg.rb +23 -13
- data/lib/toys/dsl/tool.rb +10 -6
- data/lib/toys/errors.rb +63 -8
- data/lib/toys/flag.rb +660 -651
- data/lib/toys/flag_group.rb +19 -6
- data/lib/toys/input_file.rb +9 -3
- data/lib/toys/loader.rb +129 -115
- data/lib/toys/middleware.rb +45 -21
- data/lib/toys/mixin.rb +8 -6
- data/lib/toys/positional_arg.rb +18 -17
- data/lib/toys/settings.rb +81 -67
- data/lib/toys/source_info.rb +33 -24
- data/lib/toys/standard_middleware/add_verbosity_flags.rb +2 -0
- data/lib/toys/standard_middleware/apply_config.rb +1 -0
- data/lib/toys/standard_middleware/handle_usage_errors.rb +1 -0
- data/lib/toys/standard_middleware/set_default_descriptions.rb +1 -0
- data/lib/toys/standard_middleware/show_help.rb +2 -0
- data/lib/toys/standard_middleware/show_root_version.rb +2 -0
- data/lib/toys/standard_mixins/bundler.rb +22 -14
- data/lib/toys/standard_mixins/exec.rb +31 -20
- data/lib/toys/standard_mixins/fileutils.rb +3 -1
- data/lib/toys/standard_mixins/gems.rb +21 -17
- data/lib/toys/standard_mixins/git_cache.rb +5 -7
- data/lib/toys/standard_mixins/highline.rb +8 -8
- data/lib/toys/standard_mixins/terminal.rb +5 -5
- data/lib/toys/standard_mixins/xdg.rb +5 -5
- data/lib/toys/template.rb +9 -7
- data/lib/toys/tool_definition.rb +209 -202
- data/lib/toys/utils/completion_engine.rb +7 -2
- data/lib/toys/utils/exec.rb +158 -127
- data/lib/toys/utils/gems.rb +81 -57
- data/lib/toys/utils/git_cache.rb +674 -45
- data/lib/toys/utils/help_text.rb +27 -3
- data/lib/toys/utils/terminal.rb +10 -2
- data/lib/toys/wrappable_string.rb +9 -2
- data/lib/toys-core.rb +14 -5
- metadata +4 -4
data/lib/toys/flag_group.rb
CHANGED
@@ -56,6 +56,7 @@ module Toys
|
|
56
56
|
# Create a flag group.
|
57
57
|
# This argument list is subject to change. Use {Toys::FlagGroup.create}
|
58
58
|
# instead for a more stable interface.
|
59
|
+
#
|
59
60
|
# @private
|
60
61
|
#
|
61
62
|
def initialize(name, desc, long_desc)
|
@@ -168,12 +169,16 @@ module Toys
|
|
168
169
|
self
|
169
170
|
end
|
170
171
|
|
171
|
-
##
|
172
|
+
##
|
173
|
+
# @private
|
174
|
+
#
|
172
175
|
def <<(flag)
|
173
176
|
flags << flag
|
174
177
|
end
|
175
178
|
|
176
|
-
##
|
179
|
+
##
|
180
|
+
# @private
|
181
|
+
#
|
177
182
|
def validation_errors(_seen)
|
178
183
|
[]
|
179
184
|
end
|
@@ -183,7 +188,9 @@ module Toys
|
|
183
188
|
# A FlagGroup containing all required flags
|
184
189
|
#
|
185
190
|
class Required < Base
|
186
|
-
##
|
191
|
+
##
|
192
|
+
# @private
|
193
|
+
#
|
187
194
|
def validation_errors(seen)
|
188
195
|
results = []
|
189
196
|
flags.each do |flag|
|
@@ -206,7 +213,9 @@ module Toys
|
|
206
213
|
# A FlagGroup in which exactly one flag must be set
|
207
214
|
#
|
208
215
|
class ExactlyOne < Base
|
209
|
-
##
|
216
|
+
##
|
217
|
+
# @private
|
218
|
+
#
|
210
219
|
def validation_errors(seen)
|
211
220
|
seen_names = []
|
212
221
|
flags.each do |flag|
|
@@ -229,7 +238,9 @@ module Toys
|
|
229
238
|
# A FlagGroup in which at most one flag must be set
|
230
239
|
#
|
231
240
|
class AtMostOne < Base
|
232
|
-
##
|
241
|
+
##
|
242
|
+
# @private
|
243
|
+
#
|
233
244
|
def validation_errors(seen)
|
234
245
|
seen_names = []
|
235
246
|
flags.each do |flag|
|
@@ -249,7 +260,9 @@ module Toys
|
|
249
260
|
# A FlagGroup in which at least one flag must be set
|
250
261
|
#
|
251
262
|
class AtLeastOne < Base
|
252
|
-
##
|
263
|
+
##
|
264
|
+
# @private
|
265
|
+
#
|
253
266
|
def validation_errors(seen)
|
254
267
|
flags.each do |flag|
|
255
268
|
return [] if seen.include?(flag.key)
|
data/lib/toys/input_file.rb
CHANGED
@@ -5,12 +5,16 @@
|
|
5
5
|
# is parsed, a module is created under this parent for that file's constants.
|
6
6
|
#
|
7
7
|
module Toys::InputFile # rubocop:disable Style/ClassAndModuleChildren
|
8
|
-
##
|
8
|
+
##
|
9
|
+
# @private
|
10
|
+
#
|
9
11
|
def self.__binding
|
10
12
|
binding
|
11
13
|
end
|
12
14
|
|
13
|
-
##
|
15
|
+
##
|
16
|
+
# @private
|
17
|
+
#
|
14
18
|
def self.evaluate(tool_class, words, priority, remaining_words, source, loader)
|
15
19
|
namespace = ::Module.new
|
16
20
|
namespace.module_eval do
|
@@ -33,7 +37,9 @@ module Toys::InputFile # rubocop:disable Style/ClassAndModuleChildren
|
|
33
37
|
end
|
34
38
|
end
|
35
39
|
|
36
|
-
##
|
40
|
+
##
|
41
|
+
# @private
|
42
|
+
#
|
37
43
|
def self.build_eval_string(module_name, string)
|
38
44
|
index = string.index(/^\s*[^#\s]/)
|
39
45
|
return nil if index.nil?
|
data/lib/toys/loader.rb
CHANGED
@@ -8,9 +8,6 @@ module Toys
|
|
8
8
|
# appropriate tool given a set of command line arguments.
|
9
9
|
#
|
10
10
|
class Loader
|
11
|
-
# @private
|
12
|
-
BASE_PRIORITY = -999_999
|
13
|
-
|
14
11
|
##
|
15
12
|
# Create a Loader
|
16
13
|
#
|
@@ -44,19 +41,17 @@ module Toys
|
|
44
41
|
# @param template_lookup [Toys::ModuleLookup] A lookup for
|
45
42
|
# well-known template classes. Defaults to an empty lookup.
|
46
43
|
#
|
47
|
-
def initialize(
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
git_cache: nil
|
59
|
-
)
|
44
|
+
def initialize(index_file_name: nil,
|
45
|
+
preload_dir_name: nil,
|
46
|
+
preload_file_name: nil,
|
47
|
+
data_dir_name: nil,
|
48
|
+
lib_dir_name: nil,
|
49
|
+
middleware_stack: [],
|
50
|
+
extra_delimiters: "",
|
51
|
+
mixin_lookup: nil,
|
52
|
+
middleware_lookup: nil,
|
53
|
+
template_lookup: nil,
|
54
|
+
git_cache: nil)
|
60
55
|
if index_file_name && ::File.extname(index_file_name) != ".rb"
|
61
56
|
raise ::ArgumentError, "Illegal index file name #{index_file_name.inspect}"
|
62
57
|
end
|
@@ -74,12 +69,12 @@ module Toys
|
|
74
69
|
@tool_data = {}
|
75
70
|
@roots_by_priority = {}
|
76
71
|
@max_priority = @min_priority = 0
|
77
|
-
@stop_priority =
|
72
|
+
@stop_priority = -999_999
|
78
73
|
@min_loaded_priority = 999_999
|
79
74
|
@middleware_stack = Middleware.stack(middleware_stack)
|
80
75
|
@delimiter_handler = DelimiterHandler.new(extra_delimiters)
|
81
76
|
@git_cache = git_cache
|
82
|
-
get_tool([],
|
77
|
+
get_tool([], -999_999)
|
83
78
|
end
|
84
79
|
|
85
80
|
##
|
@@ -213,7 +208,7 @@ module Toys
|
|
213
208
|
@mutex.synchronize do
|
214
209
|
raise "Cannot add a git source after tool loading has started" if @loading_started
|
215
210
|
priority = high_priority ? (@max_priority += 1) : (@min_priority -= 1)
|
216
|
-
path = git_cache.
|
211
|
+
path = git_cache.get(git_remote, path: git_path, commit: git_commit, update: update)
|
217
212
|
source = SourceInfo.create_git_root(git_remote, git_path, git_commit, path, priority,
|
218
213
|
context_directory: context_directory,
|
219
214
|
data_dir_name: @data_dir_name,
|
@@ -453,7 +448,7 @@ module Toys
|
|
453
448
|
#
|
454
449
|
def load_git(parent_source, git_remote, git_path, git_commit, words, remaining_words, priority,
|
455
450
|
update: false)
|
456
|
-
path = git_cache.
|
451
|
+
path = git_cache.get(git_remote, path: git_path, commit: git_commit, update: update)
|
457
452
|
source = parent_source.git_child(git_remote, git_path, git_commit, path)
|
458
453
|
@mutex.synchronize do
|
459
454
|
load_validated_path(source, words, remaining_words, priority)
|
@@ -499,6 +494,120 @@ module Toys
|
|
499
494
|
end
|
500
495
|
end
|
501
496
|
|
497
|
+
##
|
498
|
+
# Tool data
|
499
|
+
#
|
500
|
+
# @private
|
501
|
+
#
|
502
|
+
class ToolData
|
503
|
+
##
|
504
|
+
# @private
|
505
|
+
#
|
506
|
+
def initialize(words)
|
507
|
+
@words = validate_words(words)
|
508
|
+
@definitions = {}
|
509
|
+
@top_priority = @active_priority = nil
|
510
|
+
@mutex = ::Monitor.new
|
511
|
+
end
|
512
|
+
|
513
|
+
##
|
514
|
+
# @private
|
515
|
+
#
|
516
|
+
def cur_definition
|
517
|
+
@mutex.synchronize { active_definition || top_definition }
|
518
|
+
end
|
519
|
+
|
520
|
+
##
|
521
|
+
# @private
|
522
|
+
#
|
523
|
+
def empty?
|
524
|
+
@definitions.empty?
|
525
|
+
end
|
526
|
+
|
527
|
+
##
|
528
|
+
# @private
|
529
|
+
#
|
530
|
+
def get_tool(priority, loader, tool_class = nil)
|
531
|
+
@mutex.synchronize do
|
532
|
+
if @top_priority.nil? || @top_priority < priority
|
533
|
+
@top_priority = priority
|
534
|
+
end
|
535
|
+
if tool_class && @definitions.include?(priority)
|
536
|
+
raise ToolDefinitionError, "Tool already defined for #{@words.inspect}"
|
537
|
+
end
|
538
|
+
@definitions[priority] ||= loader.build_tool(@words, priority, tool_class)
|
539
|
+
end
|
540
|
+
end
|
541
|
+
|
542
|
+
##
|
543
|
+
# @private
|
544
|
+
#
|
545
|
+
def activate_tool(priority, loader)
|
546
|
+
@mutex.synchronize do
|
547
|
+
return active_definition if @active_priority == priority
|
548
|
+
return nil if @active_priority && @active_priority > priority
|
549
|
+
@active_priority = priority
|
550
|
+
get_tool(priority, loader)
|
551
|
+
end
|
552
|
+
end
|
553
|
+
|
554
|
+
private
|
555
|
+
|
556
|
+
def validate_words(words)
|
557
|
+
words.each do |word|
|
558
|
+
if /[[:cntrl:] #"$&'()*;<>\[\\\]\^`{|}]/.match(word)
|
559
|
+
raise ToolDefinitionError, "Illegal characters in name #{word.inspect}"
|
560
|
+
end
|
561
|
+
end
|
562
|
+
end
|
563
|
+
|
564
|
+
def top_definition
|
565
|
+
@top_priority ? @definitions[@top_priority] : nil
|
566
|
+
end
|
567
|
+
|
568
|
+
def active_definition
|
569
|
+
@active_priority ? @definitions[@active_priority] : nil
|
570
|
+
end
|
571
|
+
end
|
572
|
+
|
573
|
+
##
|
574
|
+
# An object that handles name delimiting.
|
575
|
+
#
|
576
|
+
# @private
|
577
|
+
#
|
578
|
+
class DelimiterHandler
|
579
|
+
##
|
580
|
+
# @private
|
581
|
+
#
|
582
|
+
def initialize(extra_delimiters)
|
583
|
+
unless %r{^[[:space:]./:]*$}.match?(extra_delimiters)
|
584
|
+
raise ::ArgumentError, "Illegal delimiters in #{extra_delimiters.inspect}"
|
585
|
+
end
|
586
|
+
chars = ::Regexp.escape(extra_delimiters.chars.uniq.join)
|
587
|
+
@delimiters = ::Regexp.new("[[:space:]#{chars}]")
|
588
|
+
end
|
589
|
+
|
590
|
+
##
|
591
|
+
# @private
|
592
|
+
#
|
593
|
+
def split_path(str)
|
594
|
+
str.split(@delimiters)
|
595
|
+
end
|
596
|
+
|
597
|
+
##
|
598
|
+
# @private
|
599
|
+
#
|
600
|
+
def find_orig_prefix(args)
|
601
|
+
first_split = (args.first || "").split(@delimiters)
|
602
|
+
if first_split.size > 1
|
603
|
+
args = first_split + args.slice(1..-1)
|
604
|
+
return [first_split, args]
|
605
|
+
end
|
606
|
+
orig_prefix = args.take_while { |arg| !arg.start_with?("-") }
|
607
|
+
[orig_prefix, args]
|
608
|
+
end
|
609
|
+
end
|
610
|
+
|
502
611
|
private
|
503
612
|
|
504
613
|
def all_cur_definitions
|
@@ -648,100 +757,5 @@ module Toys
|
|
648
757
|
index += 1
|
649
758
|
end
|
650
759
|
end
|
651
|
-
|
652
|
-
##
|
653
|
-
# Tool data
|
654
|
-
#
|
655
|
-
# @private
|
656
|
-
#
|
657
|
-
class ToolData
|
658
|
-
# @private
|
659
|
-
def initialize(words)
|
660
|
-
@words = validate_words(words)
|
661
|
-
@definitions = {}
|
662
|
-
@top_priority = @active_priority = nil
|
663
|
-
@mutex = ::Monitor.new
|
664
|
-
end
|
665
|
-
|
666
|
-
# @private
|
667
|
-
def cur_definition
|
668
|
-
@mutex.synchronize { active_definition || top_definition }
|
669
|
-
end
|
670
|
-
|
671
|
-
# @private
|
672
|
-
def empty?
|
673
|
-
@definitions.empty?
|
674
|
-
end
|
675
|
-
|
676
|
-
# @private
|
677
|
-
def get_tool(priority, loader, tool_class = nil)
|
678
|
-
@mutex.synchronize do
|
679
|
-
if @top_priority.nil? || @top_priority < priority
|
680
|
-
@top_priority = priority
|
681
|
-
end
|
682
|
-
if tool_class && @definitions.include?(priority)
|
683
|
-
raise ToolDefinitionError, "Tool already defined for #{@words.inspect}"
|
684
|
-
end
|
685
|
-
@definitions[priority] ||= loader.build_tool(@words, priority, tool_class)
|
686
|
-
end
|
687
|
-
end
|
688
|
-
|
689
|
-
# @private
|
690
|
-
def activate_tool(priority, loader)
|
691
|
-
@mutex.synchronize do
|
692
|
-
return active_definition if @active_priority == priority
|
693
|
-
return nil if @active_priority && @active_priority > priority
|
694
|
-
@active_priority = priority
|
695
|
-
get_tool(priority, loader)
|
696
|
-
end
|
697
|
-
end
|
698
|
-
|
699
|
-
private
|
700
|
-
|
701
|
-
def validate_words(words)
|
702
|
-
words.each do |word|
|
703
|
-
if /[[:cntrl:] #"$&'()*;<>\[\\\]\^`{|}]/.match(word)
|
704
|
-
raise ToolDefinitionError, "Illegal characters in name #{word.inspect}"
|
705
|
-
end
|
706
|
-
end
|
707
|
-
end
|
708
|
-
|
709
|
-
def top_definition
|
710
|
-
@top_priority ? @definitions[@top_priority] : nil
|
711
|
-
end
|
712
|
-
|
713
|
-
def active_definition
|
714
|
-
@active_priority ? @definitions[@active_priority] : nil
|
715
|
-
end
|
716
|
-
end
|
717
|
-
|
718
|
-
##
|
719
|
-
# An object that handles name delimiting.
|
720
|
-
#
|
721
|
-
# @private
|
722
|
-
#
|
723
|
-
class DelimiterHandler
|
724
|
-
def initialize(extra_delimiters)
|
725
|
-
unless %r{^[[:space:]./:]*$}.match?(extra_delimiters)
|
726
|
-
raise ::ArgumentError, "Illegal delimiters in #{extra_delimiters.inspect}"
|
727
|
-
end
|
728
|
-
chars = ::Regexp.escape(extra_delimiters.chars.uniq.join)
|
729
|
-
@delimiters = ::Regexp.new("[[:space:]#{chars}]")
|
730
|
-
end
|
731
|
-
|
732
|
-
def split_path(str)
|
733
|
-
str.split(@delimiters)
|
734
|
-
end
|
735
|
-
|
736
|
-
def find_orig_prefix(args)
|
737
|
-
first_split = (args.first || "").split(@delimiters)
|
738
|
-
if first_split.size > 1
|
739
|
-
args = first_split + args.slice(1..-1)
|
740
|
-
return [first_split, args]
|
741
|
-
end
|
742
|
-
orig_prefix = args.take_while { |arg| !arg.start_with?("-") }
|
743
|
-
[orig_prefix, args]
|
744
|
-
end
|
745
|
-
end
|
746
760
|
end
|
747
761
|
end
|
data/lib/toys/middleware.rb
CHANGED
@@ -140,7 +140,9 @@ module Toys
|
|
140
140
|
end
|
141
141
|
end
|
142
142
|
|
143
|
-
##
|
143
|
+
##
|
144
|
+
# @private
|
145
|
+
#
|
144
146
|
def spec_from_array(array)
|
145
147
|
middleware = array.first
|
146
148
|
if !middleware.is_a?(::String) && !middleware.is_a?(::Symbol) && !middleware.is_a?(::Class)
|
@@ -238,16 +240,12 @@ module Toys
|
|
238
240
|
#
|
239
241
|
attr_reader :block
|
240
242
|
|
241
|
-
##
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
@block = block
|
248
|
-
end
|
249
|
-
|
250
|
-
## @private
|
243
|
+
##
|
244
|
+
# Equality check
|
245
|
+
#
|
246
|
+
# @param other [Object]
|
247
|
+
# @return [Boolean]
|
248
|
+
#
|
251
249
|
def ==(other)
|
252
250
|
other.is_a?(Spec) &&
|
253
251
|
object.eql?(other.object) &&
|
@@ -258,10 +256,25 @@ module Toys
|
|
258
256
|
end
|
259
257
|
alias eql? ==
|
260
258
|
|
261
|
-
##
|
259
|
+
##
|
260
|
+
# Return the hash code
|
261
|
+
#
|
262
|
+
# @return [Integer]
|
263
|
+
#
|
262
264
|
def hash
|
263
265
|
[object, name, args, kwargs, block].hash
|
264
266
|
end
|
267
|
+
|
268
|
+
##
|
269
|
+
# @private
|
270
|
+
#
|
271
|
+
def initialize(object, name, args, kwargs, block)
|
272
|
+
@object = object
|
273
|
+
@name = name
|
274
|
+
@args = args
|
275
|
+
@kwargs = kwargs
|
276
|
+
@block = block
|
277
|
+
end
|
265
278
|
end
|
266
279
|
|
267
280
|
##
|
@@ -319,14 +332,12 @@ module Toys
|
|
319
332
|
(@pre_specs + @default_specs + @post_specs).map { |spec| spec.build(middleware_lookup) }
|
320
333
|
end
|
321
334
|
|
322
|
-
##
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
## @private
|
335
|
+
##
|
336
|
+
# Equality check
|
337
|
+
#
|
338
|
+
# @param other [Object]
|
339
|
+
# @return [Boolean]
|
340
|
+
#
|
330
341
|
def ==(other)
|
331
342
|
other.is_a?(Stack) &&
|
332
343
|
pre_specs.eql?(other.pre_specs) &&
|
@@ -335,10 +346,23 @@ module Toys
|
|
335
346
|
end
|
336
347
|
alias eql? ==
|
337
348
|
|
338
|
-
##
|
349
|
+
##
|
350
|
+
# Return the hash code
|
351
|
+
#
|
352
|
+
# @return [Integer]
|
353
|
+
#
|
339
354
|
def hash
|
340
355
|
[@pre_specs, @default_specs, @post_specs].hash
|
341
356
|
end
|
357
|
+
|
358
|
+
##
|
359
|
+
# @private
|
360
|
+
#
|
361
|
+
def initialize(default_specs: nil, pre_specs: nil, post_specs: nil)
|
362
|
+
@pre_specs = pre_specs || []
|
363
|
+
@post_specs = post_specs || []
|
364
|
+
@default_specs = default_specs || []
|
365
|
+
end
|
342
366
|
end
|
343
367
|
end
|
344
368
|
end
|
data/lib/toys/mixin.rb
CHANGED
@@ -92,12 +92,6 @@ module Toys
|
|
92
92
|
mixin_mod
|
93
93
|
end
|
94
94
|
|
95
|
-
## @private
|
96
|
-
def self.included(mod)
|
97
|
-
return if mod.respond_to?(:on_initialize)
|
98
|
-
mod.extend(ModuleMethods)
|
99
|
-
end
|
100
|
-
|
101
95
|
##
|
102
96
|
# Methods that will be added to a mixin module object.
|
103
97
|
#
|
@@ -148,5 +142,13 @@ module Toys
|
|
148
142
|
#
|
149
143
|
attr_accessor :inclusion
|
150
144
|
end
|
145
|
+
|
146
|
+
##
|
147
|
+
# @private
|
148
|
+
#
|
149
|
+
def self.included(mod)
|
150
|
+
return if mod.respond_to?(:on_initialize)
|
151
|
+
mod.extend(ModuleMethods)
|
152
|
+
end
|
151
153
|
end
|
152
154
|
end
|
data/lib/toys/positional_arg.rb
CHANGED
@@ -5,23 +5,6 @@ module Toys
|
|
5
5
|
# Representation of a formal positional argument
|
6
6
|
#
|
7
7
|
class PositionalArg
|
8
|
-
##
|
9
|
-
# Create a PositionalArg definition.
|
10
|
-
# This argument list is subject to change. Use {Toys::PositionalArg.create}
|
11
|
-
# instead for a more stable interface.
|
12
|
-
# @private
|
13
|
-
#
|
14
|
-
def initialize(key, type, acceptor, default, completion, desc, long_desc, display_name)
|
15
|
-
@key = key
|
16
|
-
@type = type
|
17
|
-
@acceptor = Acceptor.create(acceptor)
|
18
|
-
@default = default
|
19
|
-
@completion = Completion.create(completion, **{})
|
20
|
-
@desc = WrappableString.make(desc)
|
21
|
-
@long_desc = WrappableString.make_array(long_desc)
|
22
|
-
@display_name = display_name || key.to_s.tr("-", "_").gsub(/\W/, "").upcase
|
23
|
-
end
|
24
|
-
|
25
8
|
##
|
26
9
|
# Create a PositionalArg definition.
|
27
10
|
#
|
@@ -159,5 +142,23 @@ module Toys
|
|
159
142
|
@long_desc.concat(WrappableString.make_array(long_desc))
|
160
143
|
self
|
161
144
|
end
|
145
|
+
|
146
|
+
##
|
147
|
+
# Create a PositionalArg definition.
|
148
|
+
# This argument list is subject to change. Use {Toys::PositionalArg.create}
|
149
|
+
# instead for a more stable interface.
|
150
|
+
#
|
151
|
+
# @private
|
152
|
+
#
|
153
|
+
def initialize(key, type, acceptor, default, completion, desc, long_desc, display_name)
|
154
|
+
@key = key
|
155
|
+
@type = type
|
156
|
+
@acceptor = Acceptor.create(acceptor)
|
157
|
+
@default = default
|
158
|
+
@completion = Completion.create(completion, **{})
|
159
|
+
@desc = WrappableString.make(desc)
|
160
|
+
@long_desc = WrappableString.make_array(long_desc)
|
161
|
+
@display_name = display_name || key.to_s.tr("-", "_").gsub(/\W/, "").upcase
|
162
|
+
end
|
162
163
|
end
|
163
164
|
end
|