colorcode_convert_rgb 0.1.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.
Files changed (158) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +7 -0
  3. data/Gemfile.lock +23 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +40 -0
  6. data/Rakefile +10 -0
  7. data/bin/console +14 -0
  8. data/bin/setup +8 -0
  9. data/colorcode_convert_rgb.gemspec +30 -0
  10. data/exe/colorcode_convert_rgb +4 -0
  11. data/lib/colorcode_convert_rgb.rb +7 -0
  12. data/lib/colorcode_convert_rgb/cli.rb +13 -0
  13. data/lib/colorcode_convert_rgb/version.rb +3 -0
  14. data/vendor/bundle/ruby/2.5.0/bin/colorcode_convert_rgb +27 -0
  15. data/vendor/bundle/ruby/2.5.0/bin/rake +27 -0
  16. data/vendor/bundle/ruby/2.5.0/bin/thor +27 -0
  17. data/vendor/bundle/ruby/2.5.0/cache/minitest-5.14.2.gem +0 -0
  18. data/vendor/bundle/ruby/2.5.0/cache/rake-12.3.3.gem +0 -0
  19. data/vendor/bundle/ruby/2.5.0/cache/thor-1.0.1.gem +0 -0
  20. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/.autotest +34 -0
  21. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/History.rdoc +1397 -0
  22. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/Manifest.txt +27 -0
  23. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/README.rdoc +764 -0
  24. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/Rakefile +74 -0
  25. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/design_rationale.rb +52 -0
  26. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/hoe/minitest.rb +32 -0
  27. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest.rb +1056 -0
  28. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/assertions.rb +807 -0
  29. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/autorun.rb +13 -0
  30. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/benchmark.rb +455 -0
  31. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/expectations.rb +303 -0
  32. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/hell.rb +11 -0
  33. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/mock.rb +240 -0
  34. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/parallel.rb +70 -0
  35. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/pride.rb +4 -0
  36. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/pride_plugin.rb +142 -0
  37. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/spec.rb +342 -0
  38. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/test.rb +220 -0
  39. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/unit.rb +45 -0
  40. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/test/minitest/metametameta.rb +136 -0
  41. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/test/minitest/test_minitest_assertions.rb +1575 -0
  42. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/test/minitest/test_minitest_benchmark.rb +137 -0
  43. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/test/minitest/test_minitest_mock.rb +872 -0
  44. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/test/minitest/test_minitest_reporter.rb +299 -0
  45. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/test/minitest/test_minitest_spec.rb +1061 -0
  46. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/test/minitest/test_minitest_test.rb +1084 -0
  47. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/CONTRIBUTING.rdoc +43 -0
  48. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/Gemfile +3 -0
  49. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/History.rdoc +2344 -0
  50. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/MIT-LICENSE +21 -0
  51. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/README.rdoc +156 -0
  52. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/Rakefile +41 -0
  53. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/azure-pipelines.yml +11 -0
  54. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/bin/bundle +105 -0
  55. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/bin/console +7 -0
  56. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/bin/rake +29 -0
  57. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/bin/rdoc +29 -0
  58. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/bin/rubocop +29 -0
  59. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/bin/setup +6 -0
  60. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/command_line_usage.rdoc +158 -0
  61. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/example/Rakefile1 +38 -0
  62. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/example/Rakefile2 +35 -0
  63. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/example/a.c +6 -0
  64. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/example/b.c +6 -0
  65. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/example/main.c +11 -0
  66. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/glossary.rdoc +42 -0
  67. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/jamis.rb +592 -0
  68. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/proto_rake.rdoc +127 -0
  69. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/rake.1 +156 -0
  70. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/rakefile.rdoc +622 -0
  71. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/rational.rdoc +151 -0
  72. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/exe/rake +27 -0
  73. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake.rb +71 -0
  74. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/application.rb +824 -0
  75. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/backtrace.rb +24 -0
  76. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/clean.rb +78 -0
  77. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/cloneable.rb +17 -0
  78. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/cpu_counter.rb +107 -0
  79. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/default_loader.rb +15 -0
  80. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/dsl_definition.rb +195 -0
  81. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/early_time.rb +22 -0
  82. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/ext/core.rb +26 -0
  83. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/ext/string.rb +176 -0
  84. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/file_creation_task.rb +25 -0
  85. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/file_list.rb +435 -0
  86. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/file_task.rb +54 -0
  87. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/file_utils.rb +137 -0
  88. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/file_utils_ext.rb +145 -0
  89. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/invocation_chain.rb +57 -0
  90. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/invocation_exception_mixin.rb +17 -0
  91. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/late_time.rb +18 -0
  92. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/linked_list.rb +112 -0
  93. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/loaders/makefile.rb +54 -0
  94. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/multi_task.rb +14 -0
  95. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/name_space.rb +38 -0
  96. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/packagetask.rb +207 -0
  97. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/phony.rb +16 -0
  98. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/private_reader.rb +21 -0
  99. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/promise.rb +100 -0
  100. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/pseudo_status.rb +30 -0
  101. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/rake_module.rb +67 -0
  102. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/rake_test_loader.rb +27 -0
  103. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/rule_recursion_overflow_error.rb +20 -0
  104. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/scope.rb +43 -0
  105. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/task.rb +413 -0
  106. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/task_argument_error.rb +8 -0
  107. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/task_arguments.rb +109 -0
  108. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/task_manager.rb +324 -0
  109. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/tasklib.rb +12 -0
  110. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/testtask.rb +224 -0
  111. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/thread_history_display.rb +49 -0
  112. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/thread_pool.rb +163 -0
  113. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/trace_output.rb +23 -0
  114. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/version.rb +10 -0
  115. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/win32.rb +51 -0
  116. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/rake.gemspec +42 -0
  117. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/.document +5 -0
  118. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/CHANGELOG.md +220 -0
  119. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/CONTRIBUTING.md +15 -0
  120. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/LICENSE.md +20 -0
  121. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/README.md +51 -0
  122. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/bin/thor +6 -0
  123. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor.rb +517 -0
  124. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/actions.rb +336 -0
  125. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/actions/create_file.rb +104 -0
  126. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/actions/create_link.rb +61 -0
  127. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/actions/directory.rb +108 -0
  128. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/actions/empty_directory.rb +143 -0
  129. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/actions/file_manipulation.rb +373 -0
  130. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/actions/inject_into_file.rb +120 -0
  131. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/base.rb +699 -0
  132. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/command.rb +142 -0
  133. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/core_ext/hash_with_indifferent_access.rb +97 -0
  134. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/error.rb +110 -0
  135. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/group.rb +281 -0
  136. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/invocation.rb +178 -0
  137. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/line_editor.rb +17 -0
  138. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/line_editor/basic.rb +37 -0
  139. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/line_editor/readline.rb +88 -0
  140. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/nested_context.rb +29 -0
  141. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/parser.rb +4 -0
  142. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/parser/argument.rb +70 -0
  143. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/parser/arguments.rb +175 -0
  144. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/parser/option.rb +159 -0
  145. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/parser/options.rb +236 -0
  146. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/rake_compat.rb +72 -0
  147. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/runner.rb +325 -0
  148. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/shell.rb +81 -0
  149. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/shell/basic.rb +491 -0
  150. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/shell/color.rb +153 -0
  151. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/shell/html.rb +126 -0
  152. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/util.rb +284 -0
  153. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/version.rb +3 -0
  154. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/thor.gemspec +28 -0
  155. data/vendor/bundle/ruby/2.5.0/specifications/minitest-5.14.2.gemspec +38 -0
  156. data/vendor/bundle/ruby/2.5.0/specifications/rake-12.3.3.gemspec +43 -0
  157. data/vendor/bundle/ruby/2.5.0/specifications/thor-1.0.1.gemspec +34 -0
  158. metadata +214 -0
@@ -0,0 +1,178 @@
1
+ class Thor
2
+ module Invocation
3
+ def self.included(base) #:nodoc:
4
+ super(base)
5
+ base.extend ClassMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ # This method is responsible for receiving a name and find the proper
10
+ # class and command for it. The key is an optional parameter which is
11
+ # available only in class methods invocations (i.e. in Thor::Group).
12
+ def prepare_for_invocation(key, name) #:nodoc:
13
+ case name
14
+ when Symbol, String
15
+ Thor::Util.find_class_and_command_by_namespace(name.to_s, !key)
16
+ else
17
+ name
18
+ end
19
+ end
20
+ end
21
+
22
+ # Make initializer aware of invocations and the initialization args.
23
+ def initialize(args = [], options = {}, config = {}, &block) #:nodoc:
24
+ @_invocations = config[:invocations] || Hash.new { |h, k| h[k] = [] }
25
+ @_initializer = [args, options, config]
26
+ super
27
+ end
28
+
29
+ # Make the current command chain accessible with in a Thor-(sub)command
30
+ def current_command_chain
31
+ @_invocations.values.flatten.map(&:to_sym)
32
+ end
33
+
34
+ # Receives a name and invokes it. The name can be a string (either "command" or
35
+ # "namespace:command"), a Thor::Command, a Class or a Thor instance. If the
36
+ # command cannot be guessed by name, it can also be supplied as second argument.
37
+ #
38
+ # You can also supply the arguments, options and configuration values for
39
+ # the command to be invoked, if none is given, the same values used to
40
+ # initialize the invoker are used to initialize the invoked.
41
+ #
42
+ # When no name is given, it will invoke the default command of the current class.
43
+ #
44
+ # ==== Examples
45
+ #
46
+ # class A < Thor
47
+ # def foo
48
+ # invoke :bar
49
+ # invoke "b:hello", ["Erik"]
50
+ # end
51
+ #
52
+ # def bar
53
+ # invoke "b:hello", ["Erik"]
54
+ # end
55
+ # end
56
+ #
57
+ # class B < Thor
58
+ # def hello(name)
59
+ # puts "hello #{name}"
60
+ # end
61
+ # end
62
+ #
63
+ # You can notice that the method "foo" above invokes two commands: "bar",
64
+ # which belongs to the same class and "hello" which belongs to the class B.
65
+ #
66
+ # By using an invocation system you ensure that a command is invoked only once.
67
+ # In the example above, invoking "foo" will invoke "b:hello" just once, even
68
+ # if it's invoked later by "bar" method.
69
+ #
70
+ # When class A invokes class B, all arguments used on A initialization are
71
+ # supplied to B. This allows lazy parse of options. Let's suppose you have
72
+ # some rspec commands:
73
+ #
74
+ # class Rspec < Thor::Group
75
+ # class_option :mock_framework, :type => :string, :default => :rr
76
+ #
77
+ # def invoke_mock_framework
78
+ # invoke "rspec:#{options[:mock_framework]}"
79
+ # end
80
+ # end
81
+ #
82
+ # As you noticed, it invokes the given mock framework, which might have its
83
+ # own options:
84
+ #
85
+ # class Rspec::RR < Thor::Group
86
+ # class_option :style, :type => :string, :default => :mock
87
+ # end
88
+ #
89
+ # Since it's not rspec concern to parse mock framework options, when RR
90
+ # is invoked all options are parsed again, so RR can extract only the options
91
+ # that it's going to use.
92
+ #
93
+ # If you want Rspec::RR to be initialized with its own set of options, you
94
+ # have to do that explicitly:
95
+ #
96
+ # invoke "rspec:rr", [], :style => :foo
97
+ #
98
+ # Besides giving an instance, you can also give a class to invoke:
99
+ #
100
+ # invoke Rspec::RR, [], :style => :foo
101
+ #
102
+ def invoke(name = nil, *args)
103
+ if name.nil?
104
+ warn "[Thor] Calling invoke() without argument is deprecated. Please use invoke_all instead.\n#{caller.join("\n")}"
105
+ return invoke_all
106
+ end
107
+
108
+ args.unshift(nil) if args.first.is_a?(Array) || args.first.nil?
109
+ command, args, opts, config = args
110
+
111
+ klass, command = _retrieve_class_and_command(name, command)
112
+ raise "Missing Thor class for invoke #{name}" unless klass
113
+ raise "Expected Thor class, got #{klass}" unless klass <= Thor::Base
114
+
115
+ args, opts, config = _parse_initialization_options(args, opts, config)
116
+ klass.send(:dispatch, command, args, opts, config) do |instance|
117
+ instance.parent_options = options
118
+ end
119
+ end
120
+
121
+ # Invoke the given command if the given args.
122
+ def invoke_command(command, *args) #:nodoc:
123
+ current = @_invocations[self.class]
124
+
125
+ unless current.include?(command.name)
126
+ current << command.name
127
+ command.run(self, *args)
128
+ end
129
+ end
130
+ alias_method :invoke_task, :invoke_command
131
+
132
+ # Invoke all commands for the current instance.
133
+ def invoke_all #:nodoc:
134
+ self.class.all_commands.map { |_, command| invoke_command(command) }
135
+ end
136
+
137
+ # Invokes using shell padding.
138
+ def invoke_with_padding(*args)
139
+ with_padding { invoke(*args) }
140
+ end
141
+
142
+ protected
143
+
144
+ # Configuration values that are shared between invocations.
145
+ def _shared_configuration #:nodoc:
146
+ {:invocations => @_invocations}
147
+ end
148
+
149
+ # This method simply retrieves the class and command to be invoked.
150
+ # If the name is nil or the given name is a command in the current class,
151
+ # use the given name and return self as class. Otherwise, call
152
+ # prepare_for_invocation in the current class.
153
+ def _retrieve_class_and_command(name, sent_command = nil) #:nodoc:
154
+ if name.nil?
155
+ [self.class, nil]
156
+ elsif self.class.all_commands[name.to_s]
157
+ [self.class, name.to_s]
158
+ else
159
+ klass, command = self.class.prepare_for_invocation(nil, name)
160
+ [klass, command || sent_command]
161
+ end
162
+ end
163
+ alias_method :_retrieve_class_and_task, :_retrieve_class_and_command
164
+
165
+ # Initialize klass using values stored in the @_initializer.
166
+ def _parse_initialization_options(args, opts, config) #:nodoc:
167
+ stored_args, stored_opts, stored_config = @_initializer
168
+
169
+ args ||= stored_args.dup
170
+ opts ||= stored_opts.dup
171
+
172
+ config ||= {}
173
+ config = stored_config.merge(_shared_configuration).merge!(config)
174
+
175
+ [args, opts, config]
176
+ end
177
+ end
178
+ end
@@ -0,0 +1,17 @@
1
+ require_relative "line_editor/basic"
2
+ require_relative "line_editor/readline"
3
+
4
+ class Thor
5
+ module LineEditor
6
+ def self.readline(prompt, options = {})
7
+ best_available.new(prompt, options).readline
8
+ end
9
+
10
+ def self.best_available
11
+ [
12
+ Thor::LineEditor::Readline,
13
+ Thor::LineEditor::Basic
14
+ ].detect(&:available?)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,37 @@
1
+ class Thor
2
+ module LineEditor
3
+ class Basic
4
+ attr_reader :prompt, :options
5
+
6
+ def self.available?
7
+ true
8
+ end
9
+
10
+ def initialize(prompt, options)
11
+ @prompt = prompt
12
+ @options = options
13
+ end
14
+
15
+ def readline
16
+ $stdout.print(prompt)
17
+ get_input
18
+ end
19
+
20
+ private
21
+
22
+ def get_input
23
+ if echo?
24
+ $stdin.gets
25
+ else
26
+ # Lazy-load io/console since it is gem-ified as of 2.3
27
+ require "io/console"
28
+ $stdin.noecho(&:gets)
29
+ end
30
+ end
31
+
32
+ def echo?
33
+ options.fetch(:echo, true)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,88 @@
1
+ class Thor
2
+ module LineEditor
3
+ class Readline < Basic
4
+ def self.available?
5
+ begin
6
+ require "readline"
7
+ rescue LoadError
8
+ end
9
+
10
+ Object.const_defined?(:Readline)
11
+ end
12
+
13
+ def readline
14
+ if echo?
15
+ ::Readline.completion_append_character = nil
16
+ # rb-readline does not allow Readline.completion_proc= to receive nil.
17
+ if complete = completion_proc
18
+ ::Readline.completion_proc = complete
19
+ end
20
+ ::Readline.readline(prompt, add_to_history?)
21
+ else
22
+ super
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def add_to_history?
29
+ options.fetch(:add_to_history, true)
30
+ end
31
+
32
+ def completion_proc
33
+ if use_path_completion?
34
+ proc { |text| PathCompletion.new(text).matches }
35
+ elsif completion_options.any?
36
+ proc do |text|
37
+ completion_options.select { |option| option.start_with?(text) }
38
+ end
39
+ end
40
+ end
41
+
42
+ def completion_options
43
+ options.fetch(:limited_to, [])
44
+ end
45
+
46
+ def use_path_completion?
47
+ options.fetch(:path, false)
48
+ end
49
+
50
+ class PathCompletion
51
+ attr_reader :text
52
+ private :text
53
+
54
+ def initialize(text)
55
+ @text = text
56
+ end
57
+
58
+ def matches
59
+ relative_matches
60
+ end
61
+
62
+ private
63
+
64
+ def relative_matches
65
+ absolute_matches.map { |path| path.sub(base_path, "") }
66
+ end
67
+
68
+ def absolute_matches
69
+ Dir[glob_pattern].map do |path|
70
+ if File.directory?(path)
71
+ "#{path}/"
72
+ else
73
+ path
74
+ end
75
+ end
76
+ end
77
+
78
+ def glob_pattern
79
+ "#{base_path}#{text}*"
80
+ end
81
+
82
+ def base_path
83
+ "#{Dir.pwd}/"
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,29 @@
1
+ class Thor
2
+ class NestedContext
3
+ def initialize
4
+ @depth = 0
5
+ end
6
+
7
+ def enter
8
+ push
9
+
10
+ yield
11
+ ensure
12
+ pop
13
+ end
14
+
15
+ def entered?
16
+ @depth > 0
17
+ end
18
+
19
+ private
20
+
21
+ def push
22
+ @depth += 1
23
+ end
24
+
25
+ def pop
26
+ @depth -= 1
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,4 @@
1
+ require_relative "parser/argument"
2
+ require_relative "parser/arguments"
3
+ require_relative "parser/option"
4
+ require_relative "parser/options"
@@ -0,0 +1,70 @@
1
+ class Thor
2
+ class Argument #:nodoc:
3
+ VALID_TYPES = [:numeric, :hash, :array, :string]
4
+
5
+ attr_reader :name, :description, :enum, :required, :type, :default, :banner
6
+ alias_method :human_name, :name
7
+
8
+ def initialize(name, options = {})
9
+ class_name = self.class.name.split("::").last
10
+
11
+ type = options[:type]
12
+
13
+ raise ArgumentError, "#{class_name} name can't be nil." if name.nil?
14
+ raise ArgumentError, "Type :#{type} is not valid for #{class_name.downcase}s." if type && !valid_type?(type)
15
+
16
+ @name = name.to_s
17
+ @description = options[:desc]
18
+ @required = options.key?(:required) ? options[:required] : true
19
+ @type = (type || :string).to_sym
20
+ @default = options[:default]
21
+ @banner = options[:banner] || default_banner
22
+ @enum = options[:enum]
23
+
24
+ validate! # Trigger specific validations
25
+ end
26
+
27
+ def usage
28
+ required? ? banner : "[#{banner}]"
29
+ end
30
+
31
+ def required?
32
+ required
33
+ end
34
+
35
+ def show_default?
36
+ case default
37
+ when Array, String, Hash
38
+ !default.empty?
39
+ else
40
+ default
41
+ end
42
+ end
43
+
44
+ protected
45
+
46
+ def validate!
47
+ raise ArgumentError, "An argument cannot be required and have default value." if required? && !default.nil?
48
+ raise ArgumentError, "An argument cannot have an enum other than an array." if @enum && !@enum.is_a?(Array)
49
+ end
50
+
51
+ def valid_type?(type)
52
+ self.class::VALID_TYPES.include?(type.to_sym)
53
+ end
54
+
55
+ def default_banner
56
+ case type
57
+ when :boolean
58
+ nil
59
+ when :string, :default
60
+ human_name.upcase
61
+ when :numeric
62
+ "N"
63
+ when :hash
64
+ "key:value"
65
+ when :array
66
+ "one two three"
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,175 @@
1
+ class Thor
2
+ class Arguments #:nodoc: # rubocop:disable ClassLength
3
+ NUMERIC = /[-+]?(\d*\.\d+|\d+)/
4
+
5
+ # Receives an array of args and returns two arrays, one with arguments
6
+ # and one with switches.
7
+ #
8
+ def self.split(args)
9
+ arguments = []
10
+
11
+ args.each do |item|
12
+ break if item.is_a?(String) && item =~ /^-/
13
+ arguments << item
14
+ end
15
+
16
+ [arguments, args[Range.new(arguments.size, -1)]]
17
+ end
18
+
19
+ def self.parse(*args)
20
+ to_parse = args.pop
21
+ new(*args).parse(to_parse)
22
+ end
23
+
24
+ # Takes an array of Thor::Argument objects.
25
+ #
26
+ def initialize(arguments = [])
27
+ @assigns = {}
28
+ @non_assigned_required = []
29
+ @switches = arguments
30
+
31
+ arguments.each do |argument|
32
+ if !argument.default.nil?
33
+ @assigns[argument.human_name] = argument.default
34
+ elsif argument.required?
35
+ @non_assigned_required << argument
36
+ end
37
+ end
38
+ end
39
+
40
+ def parse(args)
41
+ @pile = args.dup
42
+
43
+ @switches.each do |argument|
44
+ break unless peek
45
+ @non_assigned_required.delete(argument)
46
+ @assigns[argument.human_name] = send(:"parse_#{argument.type}", argument.human_name)
47
+ end
48
+
49
+ check_requirement!
50
+ @assigns
51
+ end
52
+
53
+ def remaining
54
+ @pile
55
+ end
56
+
57
+ private
58
+
59
+ def no_or_skip?(arg)
60
+ arg =~ /^--(no|skip)-([-\w]+)$/
61
+ $2
62
+ end
63
+
64
+ def last?
65
+ @pile.empty?
66
+ end
67
+
68
+ def peek
69
+ @pile.first
70
+ end
71
+
72
+ def shift
73
+ @pile.shift
74
+ end
75
+
76
+ def unshift(arg)
77
+ if arg.is_a?(Array)
78
+ @pile = arg + @pile
79
+ else
80
+ @pile.unshift(arg)
81
+ end
82
+ end
83
+
84
+ def current_is_value?
85
+ peek && peek.to_s !~ /^-{1,2}\S+/
86
+ end
87
+
88
+ # Runs through the argument array getting strings that contains ":" and
89
+ # mark it as a hash:
90
+ #
91
+ # [ "name:string", "age:integer" ]
92
+ #
93
+ # Becomes:
94
+ #
95
+ # { "name" => "string", "age" => "integer" }
96
+ #
97
+ def parse_hash(name)
98
+ return shift if peek.is_a?(Hash)
99
+ hash = {}
100
+
101
+ while current_is_value? && peek.include?(":")
102
+ key, value = shift.split(":", 2)
103
+ raise MalformattedArgumentError, "You can't specify '#{key}' more than once in option '#{name}'; got #{key}:#{hash[key]} and #{key}:#{value}" if hash.include? key
104
+ hash[key] = value
105
+ end
106
+ hash
107
+ end
108
+
109
+ # Runs through the argument array getting all strings until no string is
110
+ # found or a switch is found.
111
+ #
112
+ # ["a", "b", "c"]
113
+ #
114
+ # And returns it as an array:
115
+ #
116
+ # ["a", "b", "c"]
117
+ #
118
+ def parse_array(name)
119
+ return shift if peek.is_a?(Array)
120
+ array = []
121
+ array << shift while current_is_value?
122
+ array
123
+ end
124
+
125
+ # Check if the peek is numeric format and return a Float or Integer.
126
+ # Check if the peek is included in enum if enum is provided.
127
+ # Otherwise raises an error.
128
+ #
129
+ def parse_numeric(name)
130
+ return shift if peek.is_a?(Numeric)
131
+
132
+ unless peek =~ NUMERIC && $& == peek
133
+ raise MalformattedArgumentError, "Expected numeric value for '#{name}'; got #{peek.inspect}"
134
+ end
135
+
136
+ value = $&.index(".") ? shift.to_f : shift.to_i
137
+ if @switches.is_a?(Hash) && switch = @switches[name]
138
+ if switch.enum && !switch.enum.include?(value)
139
+ raise MalformattedArgumentError, "Expected '#{name}' to be one of #{switch.enum.join(', ')}; got #{value}"
140
+ end
141
+ end
142
+ value
143
+ end
144
+
145
+ # Parse string:
146
+ # for --string-arg, just return the current value in the pile
147
+ # for --no-string-arg, nil
148
+ # Check if the peek is included in enum if enum is provided. Otherwise raises an error.
149
+ #
150
+ def parse_string(name)
151
+ if no_or_skip?(name)
152
+ nil
153
+ else
154
+ value = shift
155
+ if @switches.is_a?(Hash) && switch = @switches[name]
156
+ if switch.enum && !switch.enum.include?(value)
157
+ raise MalformattedArgumentError, "Expected '#{name}' to be one of #{switch.enum.join(', ')}; got #{value}"
158
+ end
159
+ end
160
+ value
161
+ end
162
+ end
163
+
164
+ # Raises an error if @non_assigned_required array is not empty.
165
+ #
166
+ def check_requirement!
167
+ return if @non_assigned_required.empty?
168
+ names = @non_assigned_required.map do |o|
169
+ o.respond_to?(:switch_name) ? o.switch_name : o.human_name
170
+ end.join("', '")
171
+ class_name = self.class.name.split("::").last.downcase
172
+ raise RequiredArgumentMissingError, "No value provided for required #{class_name} '#{names}'"
173
+ end
174
+ end
175
+ end