ruby-lint 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (205) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +43 -29
  3. data/LICENSE +1 -1
  4. data/README.md +0 -1
  5. data/bin/ruby-lint +91 -3
  6. data/checksum/ruby-lint-1.1.0.gem.sha512 +1 -0
  7. data/doc/changelog.md +30 -0
  8. data/doc/code_analysis.md +13 -0
  9. data/doc/configuration.md +5 -24
  10. data/lib/ruby-lint.rb +7 -10
  11. data/lib/ruby-lint/analysis/argument_amount.rb +2 -0
  12. data/lib/ruby-lint/analysis/base.rb +12 -0
  13. data/lib/ruby-lint/analysis/pedantics.rb +2 -0
  14. data/lib/ruby-lint/analysis/shadowing_variables.rb +2 -0
  15. data/lib/ruby-lint/analysis/undefined_methods.rb +5 -2
  16. data/lib/ruby-lint/analysis/undefined_variables.rb +2 -0
  17. data/lib/ruby-lint/analysis/unused_variables.rb +2 -0
  18. data/lib/ruby-lint/analysis/useless_equality_checks.rb +2 -0
  19. data/lib/ruby-lint/ast/node.rb +0 -15
  20. data/lib/ruby-lint/command.rb +100 -0
  21. data/lib/ruby-lint/configuration.rb +35 -66
  22. data/lib/ruby-lint/constant_path.rb +7 -2
  23. data/lib/ruby-lint/definition/ruby_object.rb +20 -6
  24. data/lib/ruby-lint/definitions/core/argf.rb +3 -3
  25. data/lib/ruby-lint/definitions/gems/minitest.rb +792 -0
  26. data/lib/ruby-lint/file_list.rb +1 -1
  27. data/lib/ruby-lint/file_loader.rb +2 -20
  28. data/lib/ruby-lint/file_scanner.rb +11 -2
  29. data/lib/ruby-lint/method_evaluation.rb +21 -0
  30. data/lib/ruby-lint/presenter/base.rb +18 -0
  31. data/lib/ruby-lint/presenter/json.rb +3 -1
  32. data/lib/ruby-lint/presenter/syntastic.rb +3 -1
  33. data/lib/ruby-lint/presenter/text.rb +3 -1
  34. data/lib/ruby-lint/runner.rb +6 -63
  35. data/lib/ruby-lint/variable_predicates.rb +3 -3
  36. data/lib/ruby-lint/version.rb +1 -1
  37. data/lib/ruby-lint/virtual_machine.rb +4 -1
  38. data/ruby-lint.gemspec +13 -4
  39. metadata +12 -187
  40. data/.editorconfig +0 -15
  41. data/.gitignore +0 -6
  42. data/.ruby-version +0 -1
  43. data/.travis.yml +0 -19
  44. data/Gemfile +0 -15
  45. data/MANIFEST +0 -469
  46. data/Rakefile +0 -25
  47. data/benchmark/bootup.rb +0 -13
  48. data/benchmark/virtual_machine.rb +0 -17
  49. data/checksum/.gitkeep +0 -0
  50. data/doc/.gitkeep +0 -0
  51. data/doc/css/.gitkeep +0 -0
  52. data/doc/images/.gitkeep +0 -0
  53. data/gen/rails/constants.txt +0 -12
  54. data/gen/rails/requires.rb +0 -2
  55. data/gen/stdlib/constants.rb +0 -30
  56. data/gen/stdlib/constants.txt +0 -214
  57. data/gen/stdlib/requires.rb +0 -64
  58. data/lib/ruby-lint/benchmark/average.rb +0 -115
  59. data/lib/ruby-lint/cache.rb +0 -121
  60. data/lib/ruby-lint/cache_entry.rb +0 -44
  61. data/lib/ruby-lint/cli.rb +0 -4
  62. data/lib/ruby-lint/cli/analyze.rb +0 -209
  63. data/lib/ruby-lint/cli/base.rb +0 -103
  64. data/lib/ruby-lint/cli/cache.rb +0 -60
  65. data/lib/ruby-lint/default_names.rb +0 -19
  66. data/lib/ruby-lint/definitions/gems/.gitkeep +0 -0
  67. data/lib/ruby-lint/node_hash.rb +0 -105
  68. data/misc/stdlib.rb +0 -66
  69. data/profiling/virtual_machine.rb +0 -20
  70. data/ruby-lint.yml +0 -7
  71. data/spec/fixtures/associating.rb +0 -7
  72. data/spec/fixtures/complex/rails/basic_controller.rb +0 -9
  73. data/spec/fixtures/complex/rcap.rb +0 -67
  74. data/spec/fixtures/complex/slop.rb +0 -701
  75. data/spec/fixtures/config.yml +0 -8
  76. data/spec/fixtures/deeply/nested/file.rb +0 -1
  77. data/spec/fixtures/file_scanner/lib/example/recursive/source.rb +0 -6
  78. data/spec/fixtures/file_scanner/lib/example/recursive/target.rb +0 -8
  79. data/spec/fixtures/file_scanner/lib/example/user.rb +0 -6
  80. data/spec/fixtures/file_scanner/lib/ruby-lint/definition/constant_proxy.rb +0 -6
  81. data/spec/fixtures/file_scanner/lib/ruby-lint/global_scope.rb +0 -6
  82. data/spec/fixtures/file_scanner/lib/test-dashes/foo.rb +0 -4
  83. data/spec/fixtures/file_scanner/rails/app/models/example/user.rb +0 -6
  84. data/spec/fixtures/file_scanner/rails/app/models/user.rb +0 -4
  85. data/spec/fixtures/invalid.rb +0 -3
  86. data/spec/fixtures/invalid_2.rb +0 -3
  87. data/spec/fixtures/syntax_error.rb +0 -1
  88. data/spec/fixtures/uses_external.rb +0 -1
  89. data/spec/fixtures/uses_external_invalid.rb +0 -3
  90. data/spec/fixtures/uses_external_namespace.rb +0 -1
  91. data/spec/fixtures/valid.rb +0 -3
  92. data/spec/ruby-lint/analysis/argument_amount_spec.rb +0 -131
  93. data/spec/ruby-lint/analysis/base_spec.rb +0 -24
  94. data/spec/ruby-lint/analysis/pedantics_spec.rb +0 -63
  95. data/spec/ruby-lint/analysis/shadowing_variables_spec.rb +0 -85
  96. data/spec/ruby-lint/analysis/undefined_methods_spec.rb +0 -337
  97. data/spec/ruby-lint/analysis/undefined_variables_spec.rb +0 -138
  98. data/spec/ruby-lint/analysis/unused_variables_spec.rb +0 -270
  99. data/spec/ruby-lint/analysis/useless_equality_checks_spec.rb +0 -107
  100. data/spec/ruby-lint/ast/node_spec.rb +0 -39
  101. data/spec/ruby-lint/cache_entry_spec.rb +0 -25
  102. data/spec/ruby-lint/cache_spec.rb +0 -53
  103. data/spec/ruby-lint/cli/analyze_spec.rb +0 -52
  104. data/spec/ruby-lint/configuration_spec.rb +0 -126
  105. data/spec/ruby-lint/constant_loader_spec.rb +0 -79
  106. data/spec/ruby-lint/constant_path.rb +0 -63
  107. data/spec/ruby-lint/definition/constant_proxy_spec.rb +0 -85
  108. data/spec/ruby-lint/definition/dsl_spec.rb +0 -135
  109. data/spec/ruby-lint/definition/registry_spec.rb +0 -106
  110. data/spec/ruby-lint/definition/ruby_method_spec.rb +0 -106
  111. data/spec/ruby-lint/definition/ruby_object_spec.rb +0 -264
  112. data/spec/ruby-lint/definition_builder/primitive_spec.rb +0 -62
  113. data/spec/ruby-lint/definition_builder/ruby_class_spec.rb +0 -107
  114. data/spec/ruby-lint/definition_builder/ruby_method_spec.rb +0 -53
  115. data/spec/ruby-lint/definition_builder/ruby_module_spec.rb +0 -52
  116. data/spec/ruby-lint/definitions/argv_spec.rb +0 -18
  117. data/spec/ruby-lint/definitions/env_spec.rb +0 -13
  118. data/spec/ruby-lint/definitions/file_spec.rb +0 -17
  119. data/spec/ruby-lint/definitions/fixnum_spec.rb +0 -18
  120. data/spec/ruby-lint/definitions/io_spec.rb +0 -15
  121. data/spec/ruby-lint/definitions/kernel_spec.rb +0 -18
  122. data/spec/ruby-lint/definitions/range_spec.rb +0 -21
  123. data/spec/ruby-lint/definitions/string_spec.rb +0 -20
  124. data/spec/ruby-lint/docstring/mapping.rb +0 -27
  125. data/spec/ruby-lint/docstring/parser_spec.rb +0 -88
  126. data/spec/ruby-lint/extensions/string_spec.rb +0 -7
  127. data/spec/ruby-lint/file_list_spec.rb +0 -25
  128. data/spec/ruby-lint/file_loader_spec.rb +0 -69
  129. data/spec/ruby-lint/file_scanner_spec.rb +0 -84
  130. data/spec/ruby-lint/inspector_spec.rb +0 -224
  131. data/spec/ruby-lint/iterator_spec.rb +0 -151
  132. data/spec/ruby-lint/method_call/.gitkeep +0 -0
  133. data/spec/ruby-lint/nested_stack_spec.rb +0 -23
  134. data/spec/ruby-lint/node_hash_spec.rb +0 -56
  135. data/spec/ruby-lint/parser_spec.rb +0 -38
  136. data/spec/ruby-lint/presenter/json_spec.rb +0 -58
  137. data/spec/ruby-lint/presenter/syntastic_spec.rb +0 -49
  138. data/spec/ruby-lint/presenter/text_spec.rb +0 -49
  139. data/spec/ruby-lint/report/entry_spec.rb +0 -58
  140. data/spec/ruby-lint/report_spec.rb +0 -39
  141. data/spec/ruby-lint/runner_spec.rb +0 -74
  142. data/spec/ruby-lint/variable_predicates_spec.rb +0 -30
  143. data/spec/ruby-lint/virtual_machine/alias_spec.rb +0 -55
  144. data/spec/ruby-lint/virtual_machine/assignments/arrays_spec.rb +0 -87
  145. data/spec/ruby-lint/virtual_machine/assignments/assignment_arguments_spec.rb +0 -14
  146. data/spec/ruby-lint/virtual_machine/assignments/constants_spec.rb +0 -23
  147. data/spec/ruby-lint/virtual_machine/assignments/hashes_spec.rb +0 -52
  148. data/spec/ruby-lint/virtual_machine/assignments/optional_spec.rb +0 -41
  149. data/spec/ruby-lint/virtual_machine/assignments/range_spec.rb +0 -28
  150. data/spec/ruby-lint/virtual_machine/assignments/return_values_spec.rb +0 -78
  151. data/spec/ruby-lint/virtual_machine/assignments/variables_spec.rb +0 -130
  152. data/spec/ruby-lint/virtual_machine/associate_nodes_spec.rb +0 -61
  153. data/spec/ruby-lint/virtual_machine/autoloading_spec.rb +0 -18
  154. data/spec/ruby-lint/virtual_machine/blocks_spec.rb +0 -90
  155. data/spec/ruby-lint/virtual_machine/classes/class_methods_spec.rb +0 -21
  156. data/spec/ruby-lint/virtual_machine/classes/extending_spec.rb +0 -109
  157. data/spec/ruby-lint/virtual_machine/classes/redefining_spec.rb +0 -51
  158. data/spec/ruby-lint/virtual_machine/classes/sclass_spec.rb +0 -96
  159. data/spec/ruby-lint/virtual_machine/classes/scoping_spec.rb +0 -60
  160. data/spec/ruby-lint/virtual_machine/complex/rails_spec.rb +0 -21
  161. data/spec/ruby-lint/virtual_machine/complex/rcap_spec.rb +0 -15
  162. data/spec/ruby-lint/virtual_machine/complex/slop_spec.rb +0 -16
  163. data/spec/ruby-lint/virtual_machine/constants_spec.rb +0 -31
  164. data/spec/ruby-lint/virtual_machine/for_spec.rb +0 -16
  165. data/spec/ruby-lint/virtual_machine/freeze_spec.rb +0 -13
  166. data/spec/ruby-lint/virtual_machine/global_variables_spec.rb +0 -15
  167. data/spec/ruby-lint/virtual_machine/inherit_kernel_spec.rb +0 -15
  168. data/spec/ruby-lint/virtual_machine/interpolation_spec.rb +0 -12
  169. data/spec/ruby-lint/virtual_machine/location_spec.rb +0 -64
  170. data/spec/ruby-lint/virtual_machine/method_call_tracking_spec.rb +0 -57
  171. data/spec/ruby-lint/virtual_machine/methods/attr_spec.rb +0 -182
  172. data/spec/ruby-lint/virtual_machine/methods/calls_spec.rb +0 -25
  173. data/spec/ruby-lint/virtual_machine/methods/define_method_spec.rb +0 -41
  174. data/spec/ruby-lint/virtual_machine/methods/defining_spec.rb +0 -40
  175. data/spec/ruby-lint/virtual_machine/methods/docstrings_spec.rb +0 -80
  176. data/spec/ruby-lint/virtual_machine/methods/exporting_spec.rb +0 -19
  177. data/spec/ruby-lint/virtual_machine/methods/kernel_spec.rb +0 -25
  178. data/spec/ruby-lint/virtual_machine/methods/parameters_spec.rb +0 -89
  179. data/spec/ruby-lint/virtual_machine/methods/patching_spec.rb +0 -20
  180. data/spec/ruby-lint/virtual_machine/methods/scoping_spec.rb +0 -63
  181. data/spec/ruby-lint/virtual_machine/methods/square_bracket_spec.rb +0 -32
  182. data/spec/ruby-lint/virtual_machine/methods/visibility_spec.rb +0 -64
  183. data/spec/ruby-lint/virtual_machine/modules_spec.rb +0 -205
  184. data/spec/ruby-lint/virtual_machine/reference_amount_spec.rb +0 -81
  185. data/spec/ruby-lint/virtual_machine/self_spec.rb +0 -37
  186. data/spec/ruby-lint/virtual_machine/unused_spec.rb +0 -17
  187. data/spec/spec_helper.rb +0 -28
  188. data/spec/support/building.rb +0 -50
  189. data/spec/support/coveralls.rb +0 -5
  190. data/spec/support/definitions.rb +0 -39
  191. data/spec/support/fixtures.rb +0 -20
  192. data/spec/support/parsing.rb +0 -30
  193. data/spec/support/simplecov.rb +0 -18
  194. data/spec/support/versions.rb +0 -9
  195. data/task/build.rake +0 -4
  196. data/task/checksum.rake +0 -13
  197. data/task/coverage.rake +0 -6
  198. data/task/doc.rake +0 -16
  199. data/task/generate.rake +0 -77
  200. data/task/graphviz.rake +0 -12
  201. data/task/manifest.rake +0 -8
  202. data/task/tag.rake +0 -6
  203. data/task/test.rake +0 -4
  204. data/task/todo.rake +0 -6
  205. data/task/travis.rake +0 -8
@@ -1,60 +0,0 @@
1
- RubyLint::CLI.options.command :cache do
2
- banner 'Usage: ruby-lint cache [COMMAND] [OPTIONS]'
3
- description 'Manages ruby-lint cache files'
4
-
5
- separator <<-EOF.chomp
6
-
7
- About:
8
-
9
- This command can be used to view and manage cache entries created by
10
- ruby-lint. This command is mainly meant to be used for debugging purposes.
11
-
12
- Examples:
13
-
14
- Print a summary of the cache:
15
-
16
- $ ruby-lint cache
17
-
18
- Clear the cache:
19
-
20
- $ ruby-lint cache clear
21
- EOF
22
-
23
- separator RubyLint::CLI::OPTIONS_HEADER
24
-
25
- RubyLint::CLI.help_option(self)
26
-
27
- run do
28
- config = RubyLint::Configuration.load_from_file
29
- pattern = File.join(config.cache_directory, '*.cache')
30
- files = Dir.glob(pattern)
31
- size = files.map { |file| File.size(file) }.inject(:+).to_f
32
-
33
- size_kb = (size / 1024).round(2)
34
- size_mb = (size / 1024 / 1024).round(2)
35
-
36
- puts <<-EOF.strip
37
- Directory: #{config.cache_directory}
38
- Total files: #{files.length}
39
- Total size: #{size_kb} KB (#{size_mb} MB)
40
- EOF
41
- end
42
-
43
- command :clear do
44
- banner 'Usage: ruby-lint cache clear [OPTIONS]'
45
- description 'Removes all the cache files'
46
-
47
- separator RubyLint::CLI::OPTIONS_HEADER
48
-
49
- RubyLint::CLI.help_option(self)
50
-
51
- run do
52
- config = RubyLint::Configuration.load_from_file
53
- pattern = File.join(config.cache_directory, '*.cache')
54
-
55
- Dir.glob(pattern).each do |file|
56
- File.unlink(file)
57
- end
58
- end
59
- end
60
- end
@@ -1,19 +0,0 @@
1
- RubyLint::Configuration.register_names 'analysis' do |names|
2
- RubyLint::Analysis.constants.each do |const|
3
- next if const == :Base
4
-
5
- names[const.to_s.snake_case] = RubyLint::Analysis.const_get(const)
6
- end
7
- end
8
-
9
- RubyLint::Configuration.register_names 'presenters' do |names|
10
- RubyLint::Presenter.constants.each do |const|
11
- names[const.to_s.snake_case] = RubyLint::Presenter.const_get(const)
12
- end
13
- end
14
-
15
- RubyLint::Configuration.register_names 'levels' do |names|
16
- RubyLint::Report::DEFAULT_LEVELS.each do |level|
17
- names[level.to_s] = level
18
- end
19
- end
File without changes
@@ -1,105 +0,0 @@
1
- module RubyLint
2
- ##
3
- # The NodeHash class is used to store information about {RubyLint::AST::Node}
4
- # instances based on their SHA1 hashes. It's primarily used by
5
- # {RubyLint::Runner} to store nodes and their associated comments.
6
- #
7
- # @!attribute [r] hash
8
- # @return [Hash]
9
- #
10
- class NodeHash
11
- attr_reader :hash
12
-
13
- ##
14
- # Creates a new instance from a regular Hash.
15
- #
16
- # @param [Hash] hash
17
- # @return [RubyLint::NodeHash]
18
- #
19
- def self.from_hash(hash)
20
- converted = {}
21
-
22
- hash.each do |key, value|
23
- converted[key.sha1] = value
24
- end
25
-
26
- return new(converted)
27
- end
28
-
29
- ##
30
- # @param [Hash] hash
31
- #
32
- def initialize(hash = {})
33
- @hash = hash
34
- end
35
-
36
- ##
37
- # Returns the value associated with the given node.
38
- #
39
- # @param [RubyLint::AST::Node] node
40
- # @return [Mixed]
41
- #
42
- def [](node)
43
- return @hash[node.sha1]
44
- end
45
-
46
- ##
47
- # Checks if there's a value stored for the node.
48
- #
49
- # @param [RubyLint::AST::Node] node
50
- # @return [TrueClass|FalseClass]
51
- #
52
- def key?(node)
53
- return @hash.key?(node.sha1)
54
- end
55
-
56
- ##
57
- # Sets a value for the given node.
58
- #
59
- # @param [RubyLint::AST::Node] node
60
- # @param [Mixed] value
61
- #
62
- def []=(node, value)
63
- return @hash[node.sha1] = value
64
- end
65
-
66
- ##
67
- # @return [Array]
68
- #
69
- def keys
70
- return @hash.keys
71
- end
72
-
73
- ##
74
- # @return [Array]
75
- #
76
- def values
77
- return @hash.values
78
- end
79
-
80
- ##
81
- # @return [Array]
82
- #
83
- def to_a
84
- return @hash.to_a
85
- end
86
-
87
- ##
88
- # Merges the values of another NodeHash into the current one.
89
- #
90
- # @param [RubyLint::NodeHash] other
91
- #
92
- def merge!(other)
93
- @hash.merge!(other.hash)
94
- end
95
-
96
- ##
97
- # Merges a regular Hash into the current NodeHash.
98
- #
99
- # @param [Hash] hash
100
- #
101
- def merge_hash!(hash)
102
- merge!(self.class.from_hash(hash))
103
- end
104
- end # NodeHash
105
- end # RubyLint
@@ -1,66 +0,0 @@
1
- require 'abbrev'
2
- require 'base64'
3
- require 'benchmark'
4
- require 'cgi'
5
- require 'cmath'
6
- require 'complex'
7
- require 'csv'
8
- require 'date'
9
- require 'delegate'
10
- require 'digest'
11
- require 'drb'
12
- require 'e2mmap'
13
- require 'English'
14
- require 'erb'
15
- require 'expect'
16
- require 'fileutils'
17
- require 'find'
18
- require 'forwardable'
19
- require 'getoptlong'
20
- require 'gserver'
21
- require 'ipaddr'
22
- require 'irb'
23
- require 'json'
24
- require 'kconv'
25
- require 'logger'
26
- require 'mathn'
27
- require 'matrix'
28
- require 'mkmf'
29
- require 'monitor'
30
- require 'mutex_m'
31
- require 'observer'
32
- require 'open3'
33
- require 'openssl'
34
- require 'open-uri'
35
- require 'optparse'
36
- require 'ostruct'
37
- require 'pathname'
38
- require 'pp'
39
- require 'prettyprint'
40
- require 'prime'
41
- require 'profiler'
42
- require 'pstore'
43
- require 'psych'
44
- require 'rational'
45
- require 'rdoc'
46
- require 'resolv'
47
- require 'rss'
48
- require 'scanf'
49
- require 'securerandom'
50
- require 'set'
51
- require 'shellwords'
52
- require 'singleton'
53
- require 'socket'
54
- require 'stringio'
55
- require 'tempfile'
56
- require 'thread'
57
- require 'thwait'
58
- require 'timeout'
59
- require 'time'
60
- require 'tmpdir'
61
- require 'tsort'
62
- require 'uri'
63
- require 'weakref'
64
- require 'webrick'
65
- require 'xmlrpc'
66
- require 'yaml'
@@ -1,20 +0,0 @@
1
- require 'ruby-prof'
2
-
3
- require_relative '../lib/ruby-lint'
4
-
5
- parser = RubyLint::Parser.new
6
- file = File.expand_path('../../lib/ruby-lint/virtual_machine.rb', __FILE__)
7
- ast = parser.parse(File.read(file), file)
8
- amount = 1000
9
-
10
- result = RubyProf.profile do
11
- amount.times do
12
- RubyLint::VirtualMachine.new.run(ast)
13
- end
14
- end
15
-
16
- result.eliminate_methods!([/Integer#times/])
17
-
18
- printer = RubyProf::GraphHtmlPrinter.new(result)
19
-
20
- printer.print(STDOUT, :sort_method => :self_time)
@@ -1,7 +0,0 @@
1
- ---
2
- directories:
3
- - lib
4
-
5
- ignore_paths:
6
- - lib/ruby-lint/definitions
7
- - lib/ruby-lint/cli
@@ -1,7 +0,0 @@
1
- module RubyLint
2
- class GlobalScope
3
- def self.constant_proxy(name)
4
- return Definition::ConstantProxy.new(definitions, name)
5
- end
6
- end
7
- end
@@ -1,9 +0,0 @@
1
- class ApplicationController < ActionController::Base
2
- protect_from_forgery
3
-
4
- def login_required
5
- unless @user = User.where(id: session[:uid]).first
6
- redirect_to login_path
7
- end
8
- end
9
- end
@@ -1,67 +0,0 @@
1
- # RCAP is released under the BSD License.
2
- #
3
- # Copyright 2010 - 2013 AIMRED CC. All rights reserved.
4
- #
5
- # Redistribution and use in source and binary forms, with or without
6
- # modification, are permitted provided that the following conditions are met:
7
- #
8
- # 1. Redistributions of source code must retain the above copyright notice,
9
- # this list of conditions and the following disclaimer.
10
- #
11
- # 2. Redistributions in binary form must reproduce the above copyright notice,
12
- # this list of conditions and the following disclaimer in the documentation
13
- # and/or other materials provided with the distribution.
14
- #
15
- # THIS SOFTWARE IS PROVIDED BY AIMRED CC ``AS IS'' AND ANY EXPRESS OR IMPLIED
16
- # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
17
- # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
18
- # EVENT SHALL AIMRED CC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
19
- # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20
- # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
21
- # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
22
- # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
23
- # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
24
- # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
- #
26
- # The views and conclusions contained in the software and documentation are
27
- # those of the authors and should not be interpreted as representing official
28
- # policies, either expressed or implied, of AIMRED CC.
29
-
30
- module RCAP
31
- # The VM will raise an error if this class doesn't exist.
32
- module Base
33
- class Alert
34
- end
35
- end
36
-
37
- module CAP_1_2
38
-
39
- # An Alert object is valid if
40
- # * it has an identifier
41
- # * it has a sender
42
- # * it has a sent time
43
- # * it has a valid status value
44
- # * it has a valid messge type value
45
- # * it has a valid scope value
46
- # * all Info objects contained in infos are valid
47
- class Alert < RCAP::Base::Alert
48
-
49
- XMLNS = "urn:oasis:names:tc:emergency:cap:1.2"
50
- CAP_VERSION = "1.2"
51
-
52
- STATUS_DRAFT = "Draft"
53
- # Valid values for status
54
- VALID_STATUSES = [ STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST, STATUS_DRAFT ]
55
-
56
- # @return [String]
57
- def xmlns
58
- XMLNS
59
- end
60
-
61
- # @return [Class]
62
- def info_class
63
- Info
64
- end
65
- end
66
- end
67
- end
@@ -1,701 +0,0 @@
1
- # Copyright (c) 2012 Lee Jarvis
2
- #
3
- # Permission is hereby granted, free of charge, to any person obtaining
4
- # a copy of this software and associated documentation files (the
5
- # "Software"), to deal in the Software without restriction, including
6
- # without limitation the rights to use, copy, modify, merge, publish,
7
- # distribute, sublicense, and/or sell copies of the Software, and to
8
- # permit persons to whom the Software is furnished to do so, subject to
9
- # the following conditions:
10
- #
11
- # The above copyright notice and this permission notice shall be
12
- # included in all copies or substantial portions of the Software.
13
- #
14
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
-
22
- require 'slop/option'
23
- require 'slop/commands'
24
-
25
- class Slop
26
- include Enumerable
27
-
28
- VERSION = '3.4.5'
29
-
30
- # The main Error class, all Exception classes inherit from this class.
31
- class Error < StandardError; end
32
-
33
- # Raised when an option argument is expected but none are given.
34
- class MissingArgumentError < Error; end
35
-
36
- # Raised when an option is expected/required but not present.
37
- class MissingOptionError < Error; end
38
-
39
- # Raised when an argument does not match its intended match constraint.
40
- class InvalidArgumentError < Error; end
41
-
42
- # Raised when an invalid option is found and the strict flag is enabled.
43
- class InvalidOptionError < Error; end
44
-
45
- # Raised when an invalid command is found and the strict flag is enabled.
46
- class InvalidCommandError < Error; end
47
-
48
- # Returns a default Hash of configuration options this Slop instance uses.
49
- DEFAULT_OPTIONS = {
50
- :strict => false,
51
- :help => false,
52
- :banner => nil,
53
- :ignore_case => false,
54
- :autocreate => false,
55
- :arguments => false,
56
- :optional_arguments => false,
57
- :multiple_switches => true,
58
- :longest_flag => 0
59
- }
60
-
61
- class << self
62
-
63
- # items - The Array of items to extract options from (default: ARGV).
64
- # config - The Hash of configuration options to send to Slop.new().
65
- # block - An optional block used to add options.
66
- #
67
- # Examples:
68
- #
69
- # Slop.parse(ARGV, :help => true) do
70
- # on '-n', '--name', 'Your username', :argument => true
71
- # end
72
- #
73
- # Returns a new instance of Slop.
74
- def parse(items = ARGV, config = {}, &block)
75
- parse! items.dup, config, &block
76
- end
77
-
78
- # items - The Array of items to extract options from (default: ARGV).
79
- # config - The Hash of configuration options to send to Slop.new().
80
- # block - An optional block used to add options.
81
- #
82
- # Returns a new instance of Slop.
83
- def parse!(items = ARGV, config = {}, &block)
84
- config, items = items, ARGV if items.is_a?(Hash) && config.empty?
85
- slop = new config, &block
86
- slop.parse! items
87
- slop
88
- end
89
-
90
- # Build a Slop object from a option specification.
91
- #
92
- # This allows you to design your options via a simple String rather
93
- # than programatically. Do note though that with this method, you're
94
- # unable to pass any advanced options to the on() method when creating
95
- # options.
96
- #
97
- # string - The optspec String
98
- # config - A Hash of configuration options to pass to Slop.new
99
- #
100
- # Examples:
101
- #
102
- # opts = Slop.optspec(<<-SPEC)
103
- # ruby foo.rb [options]
104
- # ---
105
- # n,name= Your name
106
- # a,age= Your age
107
- # A,auth Sign in with auth
108
- # p,passcode= Your secret pass code
109
- # SPEC
110
- #
111
- # opts.fetch_option(:name).description #=> "Your name"
112
- #
113
- # Returns a new instance of Slop.
114
- def optspec(string, config = {})
115
- warn "[DEPRECATED] `Slop.optspec` is deprecated and will be removed in version 4"
116
- config[:banner], optspec = string.split(/^--+$/, 2) if string[/^--+$/]
117
- lines = optspec.split("\n").reject(&:empty?)
118
- opts = Slop.new(config)
119
-
120
- lines.each do |line|
121
- opt, description = line.split(' ', 2)
122
- short, long = opt.split(',').map { |s| s.sub(/\A--?/, '') }
123
- opt = opts.on(short, long, description)
124
-
125
- if long && long.end_with?('=')
126
- long.sub!(/\=$/, '')
127
- opt.config[:argument] = true
128
- end
129
- end
130
-
131
- opts
132
- end
133
-
134
- end
135
-
136
- # The Hash of configuration options for this Slop instance.
137
- attr_reader :config
138
-
139
- # The Array of Slop::Option objects tied to this Slop instance.
140
- attr_reader :options
141
-
142
- # The Hash of sub-commands for this Slop instance.
143
- attr_reader :commands
144
-
145
- # Create a new instance of Slop and optionally build options via a block.
146
- #
147
- # config - A Hash of configuration options.
148
- # block - An optional block used to specify options.
149
- def initialize(config = {}, &block)
150
- @config = DEFAULT_OPTIONS.merge(config)
151
- @options = []
152
- @commands = {}
153
- @trash = []
154
- @triggered_options = []
155
- @unknown_options = []
156
- @callbacks = {}
157
- @separators = {}
158
- @runner = nil
159
- @command = config.delete(:command)
160
-
161
- if block_given?
162
- block.arity == 1 ? yield(self) : instance_eval(&block)
163
- end
164
-
165
- if config[:help]
166
- on('-h', '--help', 'Display this help message.', :tail => true) do
167
- puts help
168
- exit
169
- end
170
- end
171
- end
172
-
173
- # Is strict mode enabled?
174
- #
175
- # Returns true if strict mode is enabled, false otherwise.
176
- def strict?
177
- config[:strict]
178
- end
179
-
180
- # Set the banner.
181
- #
182
- # banner - The String to set the banner.
183
- def banner=(banner)
184
- config[:banner] = banner
185
- end
186
-
187
- # Get or set the banner.
188
- #
189
- # banner - The String to set the banner.
190
- #
191
- # Returns the banner String.
192
- def banner(banner = nil)
193
- config[:banner] = banner if banner
194
- config[:banner]
195
- end
196
-
197
- # Set the description (used for commands).
198
- #
199
- # desc - The String to set the description.
200
- def description=(desc)
201
- config[:description] = desc
202
- end
203
-
204
- # Get or set the description (used for commands).
205
- #
206
- # desc - The String to set the description.
207
- #
208
- # Returns the description String.
209
- def description(desc = nil)
210
- config[:description] = desc if desc
211
- config[:description]
212
- end
213
-
214
- # Add a new command.
215
- #
216
- # command - The Symbol or String used to identify this command.
217
- # options - A Hash of configuration options (see Slop::new)
218
- #
219
- # Returns a new instance of Slop mapped to this command.
220
- def command(command, options = {}, &block)
221
- options = @config.merge(options)
222
- @commands[command.to_s] = Slop.new(options.merge(:command => command.to_s), &block)
223
- end
224
-
225
- # Parse a list of items, executing and gathering options along the way.
226
- #
227
- # items - The Array of items to extract options from (default: ARGV).
228
- # block - An optional block which when used will yield non options.
229
- #
230
- # Returns an Array of original items.
231
- def parse(items = ARGV, &block)
232
- parse! items.dup, &block
233
- items
234
- end
235
-
236
- # Parse a list of items, executing and gathering options along the way.
237
- # unlike parse() this method will remove any options and option arguments
238
- # from the original Array.
239
- #
240
- # items - The Array of items to extract options from (default: ARGV).
241
- # block - An optional block which when used will yield non options.
242
- #
243
- # Returns an Array of original items with options removed.
244
- def parse!(items = ARGV, &block)
245
- if items.empty? && @callbacks[:empty]
246
- @callbacks[:empty].each { |cb| cb.call(self) }
247
- return items
248
- end
249
-
250
- if cmd = @commands[items[0]]
251
- items.shift
252
- return cmd.parse! items
253
- end
254
-
255
- items.each_with_index do |item, index|
256
- @trash << index && break if item == '--'
257
- autocreate(items, index) if config[:autocreate]
258
- process_item(items, index, &block) unless @trash.include?(index)
259
- end
260
- items.reject!.with_index { |item, index| @trash.include?(index) }
261
-
262
- missing_options = options.select { |opt| opt.required? && opt.count < 1 }
263
- if missing_options.any?
264
- raise MissingOptionError,
265
- "Missing required option(s): #{missing_options.map(&:key).join(', ')}"
266
- end
267
-
268
- if @unknown_options.any?
269
- raise InvalidOptionError, "Unknown options #{@unknown_options.join(', ')}"
270
- end
271
-
272
- if @triggered_options.empty? && @callbacks[:no_options]
273
- @callbacks[:no_options].each { |cb| cb.call(self) }
274
- end
275
-
276
- if @runner.respond_to?(:call)
277
- @runner.call(self, items) unless config[:help] and present?(:help)
278
- end
279
-
280
- items
281
- end
282
-
283
- # Add an Option.
284
- #
285
- # objects - An Array with an optional Hash as the last element.
286
- #
287
- # Examples:
288
- #
289
- # on '-u', '--username=', 'Your username'
290
- # on :v, :verbose, 'Enable verbose mode'
291
- #
292
- # Returns the created instance of Slop::Option.
293
- def on(*objects, &block)
294
- option = build_option(objects, &block)
295
- original = options.find do |o|
296
- o.long and o.long == option.long or o.short and o.short == option.short
297
- end
298
- options.delete(original) if original
299
- options << option
300
- option
301
- end
302
- alias option on
303
- alias opt on
304
-
305
- # Fetch an options argument value.
306
- #
307
- # key - The Symbol or String option short or long flag.
308
- #
309
- # Returns the Object value for this option, or nil.
310
- def [](key)
311
- option = fetch_option(key)
312
- option.value if option
313
- end
314
- alias get []
315
-
316
- # Returns a new Hash with option flags as keys and option values as values.
317
- #
318
- # include_commands - If true, merge options from all sub-commands.
319
- def to_hash(include_commands = false)
320
- hash = Hash[options.map { |opt| [opt.key.to_sym, opt.value] }]
321
- if include_commands
322
- @commands.each { |cmd, opts| hash.merge!(cmd.to_sym => opts.to_hash) }
323
- end
324
- hash
325
- end
326
- alias to_h to_hash
327
-
328
- # Enumerable interface. Yields each Slop::Option.
329
- def each(&block)
330
- options.each(&block)
331
- end
332
-
333
- # Specify code to be executed when these options are parsed.
334
- #
335
- # callable - An object responding to a call method.
336
- #
337
- # yields - The instance of Slop parsing these options
338
- # An Array of unparsed arguments
339
- #
340
- # Example:
341
- #
342
- # Slop.parse do
343
- # on :v, :verbose
344
- #
345
- # run do |opts, args|
346
- # puts "Arguments: #{args.inspect}" if opts.verbose?
347
- # end
348
- # end
349
- def run(callable = nil, &block)
350
- @runner = callable || block
351
- unless @runner.respond_to?(:call)
352
- raise ArgumentError, "You must specify a callable object or a block to #run"
353
- end
354
- end
355
-
356
- # Check for an options presence.
357
- #
358
- # Examples:
359
- #
360
- # opts.parse %w( --foo )
361
- # opts.present?(:foo) #=> true
362
- # opts.present?(:bar) #=> false
363
- #
364
- # Returns true if all of the keys are present in the parsed arguments.
365
- def present?(*keys)
366
- keys.all? { |key| (opt = fetch_option(key)) && opt.count > 0 }
367
- end
368
-
369
- # Override this method so we can check if an option? method exists.
370
- #
371
- # Returns true if this option key exists in our list of options.
372
- def respond_to_missing?(method_name, include_private = false)
373
- options.any? { |o| o.key == method_name.to_s.chop } || super
374
- end
375
-
376
- # Fetch a list of options which were missing from the parsed list.
377
- #
378
- # Examples:
379
- #
380
- # opts = Slop.new do
381
- # on :n, :name=
382
- # on :p, :password=
383
- # end
384
- #
385
- # opts.parse %w[ --name Lee ]
386
- # opts.missing #=> ['password']
387
- #
388
- # Returns an Array of Strings representing missing options.
389
- def missing
390
- (options - @triggered_options).map(&:key)
391
- end
392
-
393
- # Fetch a Slop::Option object.
394
- #
395
- # key - The Symbol or String option key.
396
- #
397
- # Examples:
398
- #
399
- # opts.on(:foo, 'Something fooey', :argument => :optional)
400
- # opt = opts.fetch_option(:foo)
401
- # opt.class #=> Slop::Option
402
- # opt.accepts_optional_argument? #=> true
403
- #
404
- # Returns an Option or nil if none were found.
405
- def fetch_option(key)
406
- options.find { |option| [option.long, option.short].include?(clean(key)) }
407
- end
408
-
409
- # Fetch a Slop object associated with this command.
410
- #
411
- # command - The String or Symbol name of the command.
412
- #
413
- # Examples:
414
- #
415
- # opts.command :foo do
416
- # on :v, :verbose, 'Enable verbose mode'
417
- # end
418
- #
419
- # # ruby run.rb foo -v
420
- # opts.fetch_command(:foo).verbose? #=> true
421
- def fetch_command(command)
422
- @commands[command.to_s]
423
- end
424
-
425
- # Add a callback.
426
- #
427
- # label - The Symbol identifier to attach this callback.
428
- #
429
- # Returns nothing.
430
- def add_callback(label, &block)
431
- (@callbacks[label] ||= []) << block
432
- end
433
-
434
- # Add string separators between options.
435
- #
436
- # text - The String text to print.
437
- def separator(text)
438
- if @separators[options.size]
439
- @separators[options.size] << "\n#{text}"
440
- else
441
- @separators[options.size] = text
442
- end
443
- end
444
-
445
- # Print a handy Slop help string.
446
- #
447
- # Returns the banner followed by available option help strings.
448
- def to_s
449
- heads = options.reject(&:tail?)
450
- tails = (options - heads)
451
- opts = (heads + tails).select(&:help).map(&:to_s)
452
- optstr = opts.each_with_index.map { |o, i|
453
- (str = @separators[i + 1]) ? [o, str].join("\n") : o
454
- }.join("\n")
455
-
456
- if @commands.any?
457
- optstr << "\n" if !optstr.empty?
458
- optstr << "\nAvailable commands:\n\n"
459
- optstr << commands_to_help
460
- optstr << "\n\nSee `<command> --help` for more information on a specific command."
461
- end
462
-
463
- banner = config[:banner]
464
- if banner.nil?
465
- banner = "Usage: #{File.basename($0, '.*')}"
466
- banner << " #{@command}" if @command
467
- banner << " [command]" if @commands.any?
468
- banner << " [options]"
469
- end
470
- if banner
471
- "#{banner}\n#{@separators[0] ? "#{@separators[0]}\n" : ''}#{optstr}"
472
- else
473
- optstr
474
- end
475
- end
476
- alias help to_s
477
-
478
- private
479
-
480
- # Convenience method for present?(:option).
481
- #
482
- # Examples:
483
- #
484
- # opts.parse %( --verbose )
485
- # opts.verbose? #=> true
486
- # opts.other? #=> false
487
- #
488
- # Returns true if this option is present. If this method does not end
489
- # with a ? character it will instead call super().
490
- def method_missing(method, *args, &block)
491
- meth = method.to_s
492
- if meth.end_with?('?')
493
- meth.chop!
494
- present?(meth) || present?(meth.gsub('_', '-'))
495
- else
496
- super
497
- end
498
- end
499
-
500
- # Process a list item, figure out if it's an option, execute any
501
- # callbacks, assign any option arguments, and do some sanity checks.
502
- #
503
- # items - The Array of items to process.
504
- # index - The current Integer index of the item we want to process.
505
- # block - An optional block which when passed will yield non options.
506
- #
507
- # Returns nothing.
508
- def process_item(items, index, &block)
509
- return unless item = items[index]
510
- option, argument = extract_option(item) if item.start_with?('-')
511
-
512
- if option
513
- option.count += 1 unless item.start_with?('--no-')
514
- option.count += 1 if option.key[0, 3] == "no-"
515
- @trash << index
516
- @triggered_options << option
517
-
518
- if option.expects_argument?
519
- argument ||= items.at(index + 1)
520
-
521
- if !argument || argument =~ /\A--?[a-zA-Z][a-zA-Z0-9_-]*\z/
522
- raise MissingArgumentError, "#{option.key} expects an argument"
523
- end
524
-
525
- execute_option(option, argument, index, item)
526
- elsif option.accepts_optional_argument?
527
- argument ||= items.at(index + 1)
528
-
529
- if argument && argument =~ /\A([^\-?]|-\d)+/
530
- execute_option(option, argument, index, item)
531
- else
532
- option.call(nil)
533
- end
534
- elsif config[:multiple_switches] && argument
535
- execute_multiple_switches(option, argument, items, index)
536
- else
537
- option.value = option.count > 0
538
- option.call(nil)
539
- end
540
- else
541
- @unknown_options << item if strict? && item =~ /\A--?/
542
- block.call(item) if block && !@trash.include?(index)
543
- end
544
- end
545
-
546
- # Execute an option, firing off callbacks and assigning arguments.
547
- #
548
- # option - The Slop::Option object found by #process_item.
549
- # argument - The argument Object to assign to this option.
550
- # index - The current Integer index of the object we're processing.
551
- # item - The optional String item we're processing.
552
- #
553
- # Returns nothing.
554
- def execute_option(option, argument, index, item = nil)
555
- if !option
556
- if config[:multiple_switches] && strict?
557
- raise InvalidOptionError, "Unknown option -#{item}"
558
- end
559
- return
560
- end
561
-
562
- if argument
563
- unless item && item.end_with?("=#{argument}")
564
- @trash << index + 1 unless option.argument_in_value
565
- end
566
- option.value = argument
567
- else
568
- option.value = option.count > 0
569
- end
570
-
571
- if option.match? && !argument.match(option.config[:match])
572
- raise InvalidArgumentError, "#{argument} is an invalid argument"
573
- end
574
-
575
- option.call(option.value)
576
- end
577
-
578
- # Execute a `-abc` type option where a, b and c are all options. This
579
- # method is only executed if the multiple_switches argument is true.
580
- #
581
- # option - The first Option object.
582
- # argument - The argument to this option. (Split into multiple Options).
583
- # items - The Array of items currently being parsed.
584
- # index - The index of the current item being processed.
585
- #
586
- # Returns nothing.
587
- def execute_multiple_switches(option, argument, items, index)
588
- execute_option(option, nil, index)
589
- flags = argument.split('')
590
- flags.each do |key|
591
- next unless opt = fetch_option(key)
592
- opt.count += 1
593
- if (opt.expects_argument? || opt.accepts_optional_argument?) &&
594
- (flags[-1] == opt.key) && (val = items[index+1])
595
- execute_option(opt, val, index, key)
596
- else
597
- execute_option(opt, nil, index, key)
598
- end
599
- end
600
- end
601
-
602
- # Extract an option from a flag.
603
- #
604
- # flag - The flag key used to extract an option.
605
- #
606
- # Returns an Array of [option, argument].
607
- def extract_option(flag)
608
- option = fetch_option(flag)
609
- option ||= fetch_option(flag.downcase) if config[:ignore_case]
610
- option ||= fetch_option(flag.gsub(/([^-])-/, '\1_'))
611
-
612
- unless option
613
- case flag
614
- when /\A--?([^=]+)=(.+)\z/, /\A-([a-zA-Z])(.+)\z/, /\A--no-(.+)\z/
615
- option, argument = fetch_option($1), ($2 || false)
616
- option.argument_in_value = true if option
617
- end
618
- end
619
-
620
- [option, argument]
621
- end
622
-
623
- # Autocreate an option on the fly. See the :autocreate Slop config option.
624
- #
625
- # items - The Array of items we're parsing.
626
- # index - The current Integer index for the item we're processing.
627
- #
628
- # Returns nothing.
629
- def autocreate(items, index)
630
- flag = items[index]
631
- if !fetch_option(flag) && !@trash.include?(index)
632
- option = build_option(Array(flag))
633
- argument = items[index + 1]
634
- option.config[:argument] = (argument && argument !~ /\A--?/)
635
- option.config[:autocreated] = true
636
- options << option
637
- end
638
- end
639
-
640
- # Build an option from a list of objects.
641
- #
642
- # objects - An Array of objects used to build this option.
643
- #
644
- # Returns a new instance of Slop::Option.
645
- def build_option(objects, &block)
646
- config = {}
647
- config[:argument] = true if @config[:arguments]
648
- config[:optional_argument] = true if @config[:optional_arguments]
649
-
650
- if objects.last.is_a?(Hash)
651
- config.merge!(objects.pop)
652
- end
653
-
654
- short = extract_short_flag(objects, config)
655
- long = extract_long_flag(objects, config)
656
- desc = objects.shift if objects[0].respond_to?(:to_str)
657
-
658
- Option.new(self, short, long, desc, config, &block)
659
- end
660
-
661
- def extract_short_flag(objects, config)
662
- flag = objects[0].to_s
663
- if flag =~ /\A-?\w=?\z/
664
- config[:argument] ||= flag.end_with?('=')
665
- objects.shift
666
- flag.delete('-=')
667
- end
668
- end
669
-
670
- # Extract the long flag from an item.
671
- #
672
- # objects - The Array of objects passed from #build_option.
673
- # config - The Hash of configuration options built in #build_option.
674
- def extract_long_flag(objects, config)
675
- flag = objects.first.to_s
676
- if flag =~ /\A(?:--?)?[a-zA-Z0-9][a-zA-Z0-9_.-]+\=?\??\z/
677
- config[:argument] ||= true if flag.end_with?('=')
678
- config[:optional_argument] = true if flag.end_with?('=?')
679
- objects.shift
680
- clean(flag).sub(/\=\??\z/, '')
681
- end
682
- end
683
-
684
- # Remove any leading -- characters from a string.
685
- #
686
- # object - The Object we want to cast to a String and clean.
687
- #
688
- # Returns the newly cleaned String with leading -- characters removed.
689
- def clean(object)
690
- object.to_s.sub(/\A--?/, '')
691
- end
692
-
693
- def commands_to_help
694
- padding = 0
695
- @commands.each { |c, _| padding = c.size if c.size > padding }
696
- @commands.map do |cmd, opts|
697
- " #{cmd}#{' ' * (padding - cmd.size)} #{opts.description}"
698
- end.join("\n")
699
- end
700
-
701
- end