inch 0.0.1 → 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.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/README.md +335 -3
- data/Rakefile +8 -0
- data/TODOS.md +12 -0
- data/bin/inch +17 -0
- data/inch.gemspec +7 -2
- data/lib/inch.rb +6 -1
- data/lib/inch/cli.rb +24 -0
- data/lib/inch/cli/arguments.rb +45 -0
- data/lib/inch/cli/command.rb +29 -0
- data/lib/inch/cli/command/base.rb +62 -0
- data/lib/inch/cli/command/base_list.rb +75 -0
- data/lib/inch/cli/command/base_object.rb +40 -0
- data/lib/inch/cli/command/console.rb +22 -0
- data/lib/inch/cli/command/inspect.rb +20 -0
- data/lib/inch/cli/command/list.rb +25 -0
- data/lib/inch/cli/command/options/base.rb +137 -0
- data/lib/inch/cli/command/options/base_list.rb +84 -0
- data/lib/inch/cli/command/options/base_object.rb +47 -0
- data/lib/inch/cli/command/options/console.rb +26 -0
- data/lib/inch/cli/command/options/inspect.rb +25 -0
- data/lib/inch/cli/command/options/list.rb +30 -0
- data/lib/inch/cli/command/options/show.rb +27 -0
- data/lib/inch/cli/command/options/stats.rb +20 -0
- data/lib/inch/cli/command/options/suggest.rb +61 -0
- data/lib/inch/cli/command/output/base.rb +32 -0
- data/lib/inch/cli/command/output/console.rb +45 -0
- data/lib/inch/cli/command/output/inspect.rb +129 -0
- data/lib/inch/cli/command/output/list.rb +87 -0
- data/lib/inch/cli/command/output/show.rb +79 -0
- data/lib/inch/cli/command/output/stats.rb +111 -0
- data/lib/inch/cli/command/output/suggest.rb +104 -0
- data/lib/inch/cli/command/show.rb +20 -0
- data/lib/inch/cli/command/stats.rb +20 -0
- data/lib/inch/cli/command/suggest.rb +104 -0
- data/lib/inch/cli/command_parser.rb +82 -0
- data/lib/inch/cli/sparkline_helper.rb +31 -0
- data/lib/inch/cli/trace_helper.rb +42 -0
- data/lib/inch/cli/yardopts_helper.rb +49 -0
- data/lib/inch/code_object.rb +8 -0
- data/lib/inch/code_object/docstring.rb +97 -0
- data/lib/inch/code_object/nodoc_helper.rb +84 -0
- data/lib/inch/code_object/proxy.rb +37 -0
- data/lib/inch/code_object/proxy/base.rb +194 -0
- data/lib/inch/code_object/proxy/class_object.rb +9 -0
- data/lib/inch/code_object/proxy/constant_object.rb +8 -0
- data/lib/inch/code_object/proxy/method_object.rb +118 -0
- data/lib/inch/code_object/proxy/method_parameter_object.rb +81 -0
- data/lib/inch/code_object/proxy/module_object.rb +8 -0
- data/lib/inch/code_object/proxy/namespace_object.rb +38 -0
- data/lib/inch/core_ext.rb +2 -0
- data/lib/inch/core_ext/string.rb +3 -0
- data/lib/inch/core_ext/yard.rb +4 -0
- data/lib/inch/evaluation.rb +35 -0
- data/lib/inch/evaluation/base.rb +60 -0
- data/lib/inch/evaluation/class_object.rb +6 -0
- data/lib/inch/evaluation/constant_object.rb +34 -0
- data/lib/inch/evaluation/file.rb +66 -0
- data/lib/inch/evaluation/method_object.rb +127 -0
- data/lib/inch/evaluation/module_object.rb +6 -0
- data/lib/inch/evaluation/namespace_object.rb +94 -0
- data/lib/inch/evaluation/role/base.rb +49 -0
- data/lib/inch/evaluation/role/constant.rb +43 -0
- data/lib/inch/evaluation/role/method.rb +60 -0
- data/lib/inch/evaluation/role/method_parameter.rb +46 -0
- data/lib/inch/evaluation/role/missing.rb +20 -0
- data/lib/inch/evaluation/role/namespace.rb +58 -0
- data/lib/inch/evaluation/role/object.rb +64 -0
- data/lib/inch/evaluation/score_range.rb +26 -0
- data/lib/inch/rake.rb +1 -0
- data/lib/inch/rake/suggest.rb +26 -0
- data/lib/inch/source_parser.rb +36 -0
- data/lib/inch/version.rb +1 -1
- data/test/fixtures/code_examples/lib/foo.rb +87 -0
- data/test/fixtures/readme/lib/foo.rb +17 -0
- data/test/fixtures/simple/README +25 -0
- data/test/fixtures/simple/lib/broken.rb +10 -0
- data/test/fixtures/simple/lib/foo.rb +214 -0
- data/test/fixtures/simple/lib/role_methods.rb +78 -0
- data/test/fixtures/simple/lib/role_namespaces.rb +68 -0
- data/test/fixtures/visibility/lib/foo.rb +18 -0
- data/test/fixtures/yardopts/.yardopts +1 -0
- data/test/fixtures/yardopts/foo/bar.rb +6 -0
- data/test/inch/cli/arguments_test.rb +70 -0
- data/test/inch/cli/command/console_test.rb +59 -0
- data/test/inch/cli/command/inspect_test.rb +59 -0
- data/test/inch/cli/command/list_test.rb +61 -0
- data/test/inch/cli/command/show_test.rb +59 -0
- data/test/inch/cli/command/stats_test.rb +57 -0
- data/test/inch/cli/command/suggest_test.rb +57 -0
- data/test/inch/cli/command_parser_test.rb +33 -0
- data/test/inch/cli/yardopts_helper_test.rb +84 -0
- data/test/inch/code_object/docstring_test.rb +204 -0
- data/test/inch/code_object/nodoc_helper_test.rb +38 -0
- data/test/inch/code_object/proxy_test.rb +188 -0
- data/test/inch/source_parser_test.rb +23 -0
- data/test/integration/stats_options_test.rb +34 -0
- data/test/integration/visibility_options_test.rb +79 -0
- data/test/test_helper.rb +21 -0
- metadata +184 -7
data/lib/inch/cli.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module Inch
|
2
|
+
module CLI
|
3
|
+
class << self
|
4
|
+
# Returns the columns of the terminal window
|
5
|
+
# (defaults to 80)
|
6
|
+
# @return [Fixnum]
|
7
|
+
def get_term_columns
|
8
|
+
str = `stty size`
|
9
|
+
rows_cols = str.split(' ').map(&:to_i)
|
10
|
+
rows_cols[1]
|
11
|
+
rescue
|
12
|
+
80
|
13
|
+
end
|
14
|
+
end
|
15
|
+
COLUMNS = get_term_columns
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
require_relative 'cli/arguments'
|
20
|
+
require_relative 'cli/sparkline_helper'
|
21
|
+
require_relative 'cli/trace_helper'
|
22
|
+
require_relative 'cli/yardopts_helper'
|
23
|
+
require_relative 'cli/command'
|
24
|
+
require_relative 'cli/command_parser'
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Inch
|
2
|
+
module CLI
|
3
|
+
class Arguments
|
4
|
+
attr_reader :files, :object_names, :switches
|
5
|
+
|
6
|
+
def initialize(args)
|
7
|
+
@files = []
|
8
|
+
@object_names = []
|
9
|
+
@switches = []
|
10
|
+
parse(args)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def parse(args)
|
16
|
+
if first_non_file = args.find_index { |e| !file_or_glob?(e) }
|
17
|
+
@files = args[0...first_non_file]
|
18
|
+
rest = args[first_non_file..-1]
|
19
|
+
if first_switch = rest.find_index { |e| switch?(e) }
|
20
|
+
@object_names = rest[0...first_switch]
|
21
|
+
@switches = rest[first_switch..-1]
|
22
|
+
else
|
23
|
+
# object_names only
|
24
|
+
@object_names = rest
|
25
|
+
end
|
26
|
+
else
|
27
|
+
# files only
|
28
|
+
@files = args
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def file_or_glob?(f)
|
33
|
+
if f =~ /[\*\{]/
|
34
|
+
true
|
35
|
+
else
|
36
|
+
File.file?(f) || File.directory?(f)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def switch?(f)
|
41
|
+
f =~ /^\-/
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative 'command/base'
|
2
|
+
require_relative 'command/base_list'
|
3
|
+
require_relative 'command/base_object'
|
4
|
+
|
5
|
+
require_relative 'command/console'
|
6
|
+
require_relative 'command/inspect'
|
7
|
+
require_relative 'command/list'
|
8
|
+
require_relative 'command/show'
|
9
|
+
require_relative 'command/stats'
|
10
|
+
require_relative 'command/suggest'
|
11
|
+
|
12
|
+
require_relative 'command/options/base'
|
13
|
+
require_relative 'command/options/base_list'
|
14
|
+
require_relative 'command/options/base_object'
|
15
|
+
|
16
|
+
require_relative 'command/options/console'
|
17
|
+
require_relative 'command/options/inspect'
|
18
|
+
require_relative 'command/options/list'
|
19
|
+
require_relative 'command/options/show'
|
20
|
+
require_relative 'command/options/stats'
|
21
|
+
require_relative 'command/options/suggest'
|
22
|
+
|
23
|
+
require_relative 'command/output/base'
|
24
|
+
require_relative 'command/output/console'
|
25
|
+
require_relative 'command/output/inspect'
|
26
|
+
require_relative 'command/output/list'
|
27
|
+
require_relative 'command/output/show'
|
28
|
+
require_relative 'command/output/stats'
|
29
|
+
require_relative 'command/output/suggest'
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Inch
|
2
|
+
module CLI
|
3
|
+
module Command
|
4
|
+
# Abstract base class for CLI utilities. Provides some helper methods for
|
5
|
+
# the option parser
|
6
|
+
#
|
7
|
+
# @abstract
|
8
|
+
# @note This was adapted from YARD.
|
9
|
+
# @see https://github.com/lsegal/yard/blob/master/lib/yard/cli/command.rb
|
10
|
+
class Base
|
11
|
+
include TraceHelper
|
12
|
+
|
13
|
+
attr_reader :source_parser
|
14
|
+
|
15
|
+
# Helper method to run the utility on an instance.
|
16
|
+
# @see #run
|
17
|
+
def self.run(*args)
|
18
|
+
command = new
|
19
|
+
command.run(*args)
|
20
|
+
command
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize
|
24
|
+
options_class = "Command::Options::#{self.class.to_s.split('::').last}"
|
25
|
+
@options = eval(options_class).new
|
26
|
+
@options.usage = usage
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns a description of the command
|
30
|
+
# @return [String]
|
31
|
+
def description
|
32
|
+
""
|
33
|
+
end
|
34
|
+
|
35
|
+
# Returns the name of the command by which it is referenced
|
36
|
+
# in the command list.
|
37
|
+
# @return [String]
|
38
|
+
def name
|
39
|
+
CommandParser.commands.each do |name, klass|
|
40
|
+
return name if klass == self.class
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns a description of the command's usage pattern
|
45
|
+
# @return [String]
|
46
|
+
def usage
|
47
|
+
"Usage: inch #{name} [options]"
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def run_source_parser(paths, excluded)
|
53
|
+
debug "Parsing:\n" \
|
54
|
+
" files: #{paths.inspect}\n" \
|
55
|
+
" excluded: #{excluded.inspect}"
|
56
|
+
|
57
|
+
@source_parser = SourceParser.run(paths, excluded)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Inch
|
2
|
+
module CLI
|
3
|
+
module Command
|
4
|
+
class BaseList < Base
|
5
|
+
attr_writer :objects
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
super
|
9
|
+
@ranges = Evaluation.new_score_ranges
|
10
|
+
end
|
11
|
+
|
12
|
+
# Prepares the list of objects and ranges, parsing arguments and
|
13
|
+
# running the source parser.
|
14
|
+
#
|
15
|
+
# @param [Array<String>] args the list of arguments.
|
16
|
+
# @return [void]
|
17
|
+
def prepare_list(*args)
|
18
|
+
@options.parse(args)
|
19
|
+
@options.verify
|
20
|
+
run_source_parser(@options.paths, @options.excluded)
|
21
|
+
filter_objects
|
22
|
+
assign_objects_to_ranges
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
# Assigns the objects returned by {#objects} to the score ranges in
|
28
|
+
# @ranges based on their score
|
29
|
+
#
|
30
|
+
def assign_objects_to_ranges
|
31
|
+
@ranges.each do |range|
|
32
|
+
list = objects.select { |o| range.range.include?(o.score) }
|
33
|
+
range.objects = sort_by_priority(list)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def filter_objects
|
38
|
+
if @options.namespaces == :only
|
39
|
+
self.objects = objects.select(&:namespace?)
|
40
|
+
end
|
41
|
+
if @options.namespaces == :none
|
42
|
+
self.objects = objects.reject(&:namespace?)
|
43
|
+
end
|
44
|
+
if @options.undocumented == :only
|
45
|
+
self.objects = objects.select(&:undocumented?)
|
46
|
+
end
|
47
|
+
if @options.undocumented == :none
|
48
|
+
self.objects = objects.reject(&:undocumented?)
|
49
|
+
end
|
50
|
+
if @options.depth
|
51
|
+
self.objects = objects.select { |o| o.depth <= @depth }
|
52
|
+
end
|
53
|
+
self.objects = objects.select do |o|
|
54
|
+
@options.visibility.include?(o.visibility)
|
55
|
+
end
|
56
|
+
if !@options.visibility.include?(:private)
|
57
|
+
self.objects = objects.reject do |o|
|
58
|
+
o.private_tag?
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def objects
|
64
|
+
@objects ||= sort_by_priority(source_parser.all_objects)
|
65
|
+
end
|
66
|
+
|
67
|
+
def sort_by_priority(objects)
|
68
|
+
objects.sort_by do |o|
|
69
|
+
[o.priority, o.score, o.path.size]
|
70
|
+
end.reverse
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Inch
|
2
|
+
module CLI
|
3
|
+
module Command
|
4
|
+
class BaseObject < Base
|
5
|
+
attr_accessor :object, :objects
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
super
|
9
|
+
@ranges = Evaluation.new_score_ranges
|
10
|
+
end
|
11
|
+
|
12
|
+
# Prepares the (list of) objects, parsing arguments and
|
13
|
+
# running the source parser.
|
14
|
+
#
|
15
|
+
# @param [Array<String>] args the list of arguments.
|
16
|
+
# @return [void]
|
17
|
+
def prepare_objects(*args)
|
18
|
+
@options.parse(args)
|
19
|
+
@options.verify
|
20
|
+
run_source_parser(@options.paths, @options.excluded)
|
21
|
+
|
22
|
+
self.objects = find_object_names(@options.object_names)
|
23
|
+
self.object = @objects.first
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def find_object_names(object_names)
|
29
|
+
object_names.map do |object_name|
|
30
|
+
if object = source_parser.find_object(object_name)
|
31
|
+
object
|
32
|
+
else
|
33
|
+
source_parser.find_objects(object_name)
|
34
|
+
end
|
35
|
+
end.flatten
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'pry'
|
2
|
+
|
3
|
+
module Inch
|
4
|
+
module CLI
|
5
|
+
module Command
|
6
|
+
class Console < BaseObject
|
7
|
+
def description
|
8
|
+
'Shows a console'
|
9
|
+
end
|
10
|
+
|
11
|
+
def usage
|
12
|
+
'Usage: inch console [paths] [OBJECT_NAME] [options]'
|
13
|
+
end
|
14
|
+
|
15
|
+
def run(*args)
|
16
|
+
prepare_objects(*args)
|
17
|
+
Output::Console.new(@options, @object, @objects, source_parser)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Inch
|
2
|
+
module CLI
|
3
|
+
module Command
|
4
|
+
class Inspect < BaseObject
|
5
|
+
def description
|
6
|
+
'Inspects an object'
|
7
|
+
end
|
8
|
+
|
9
|
+
def usage
|
10
|
+
'Usage: inch inspect [paths] OBJECT_NAME [[OBJECT_NAME2] ...] [options]'
|
11
|
+
end
|
12
|
+
|
13
|
+
def run(*args)
|
14
|
+
prepare_objects(*args)
|
15
|
+
Output::Inspect.new(@options, objects)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Inch
|
2
|
+
module CLI
|
3
|
+
module Command
|
4
|
+
class List < BaseList
|
5
|
+
def description
|
6
|
+
'Lists all objects with their results'
|
7
|
+
end
|
8
|
+
|
9
|
+
def usage
|
10
|
+
'Usage: inch list [paths] [options]'
|
11
|
+
end
|
12
|
+
|
13
|
+
# Runs the commandline utility, parsing arguments and displaying a
|
14
|
+
# list of objects
|
15
|
+
#
|
16
|
+
# @param [Array<String>] args the list of arguments.
|
17
|
+
# @return [void]
|
18
|
+
def run(*args)
|
19
|
+
prepare_list(*args)
|
20
|
+
Output::List.new(@options, objects, @ranges)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
module Inch
|
4
|
+
module CLI
|
5
|
+
module Command
|
6
|
+
module Options
|
7
|
+
# Abstract base class for CLI options. Provides some helper methods for
|
8
|
+
# the option parser
|
9
|
+
#
|
10
|
+
class Base
|
11
|
+
include TraceHelper
|
12
|
+
include YardoptsHelper
|
13
|
+
|
14
|
+
class << self
|
15
|
+
def attribute(name, default = nil)
|
16
|
+
define_method(name) do
|
17
|
+
instance_variable_get("@#{name}") || default
|
18
|
+
end
|
19
|
+
define_method("#{name}=") do |value|
|
20
|
+
instance_variable_set("@#{name}", value)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
attribute :usage, ""
|
26
|
+
attribute :paths, []
|
27
|
+
attribute :excluded, []
|
28
|
+
|
29
|
+
def parse(args)
|
30
|
+
opts = OptionParser.new
|
31
|
+
opts.banner = usage
|
32
|
+
|
33
|
+
descriptions.each do |text|
|
34
|
+
opts.separator " " + text
|
35
|
+
end
|
36
|
+
|
37
|
+
set_options(opts)
|
38
|
+
parse_options(opts, args)
|
39
|
+
end
|
40
|
+
|
41
|
+
def set_options(opts)
|
42
|
+
common_options(opts)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Override and fill with validations
|
46
|
+
def verify
|
47
|
+
end
|
48
|
+
|
49
|
+
protected
|
50
|
+
|
51
|
+
# Override and fill with an array of descriptions that will be
|
52
|
+
# shown via the help switch.
|
53
|
+
def descriptions
|
54
|
+
[]
|
55
|
+
end
|
56
|
+
|
57
|
+
def description_arrows
|
58
|
+
arrows = Output::Base::PRIORITY_ARROWS.join(' ')
|
59
|
+
"Arrows (#{arrows}) hint at the importance of the object " +
|
60
|
+
"being documented."
|
61
|
+
end
|
62
|
+
|
63
|
+
def description_grades
|
64
|
+
grades = Evaluation.new_score_ranges.map(&:grade)
|
65
|
+
"School grades (#{grades.join(', ')}) are assigned and " +
|
66
|
+
"displayed with each object."
|
67
|
+
end
|
68
|
+
|
69
|
+
DEFAULT_PATHS = ["{lib,app}/**/*.rb", "ext/**/*.c"]
|
70
|
+
|
71
|
+
# @yard_files is assigned by YardoptsHelper#parse_yardopts_options
|
72
|
+
def get_paths(args)
|
73
|
+
paths = @yard_files ? @yard_files : args.dup
|
74
|
+
if paths.empty?
|
75
|
+
DEFAULT_PATHS
|
76
|
+
else
|
77
|
+
paths
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Adds a set of common options to the tail of the OptionParser
|
82
|
+
#
|
83
|
+
# @param [OptionParser] opts the option parser object
|
84
|
+
# @return [void]
|
85
|
+
def common_options(opts)
|
86
|
+
opts.separator ""
|
87
|
+
opts.separator "Other options:"
|
88
|
+
opts.on("--[no-]color", "Run without color") do |v|
|
89
|
+
Term::ANSIColor::coloring = v
|
90
|
+
end
|
91
|
+
opts.on_tail('-v', '--version', 'Show version.') do
|
92
|
+
trace "inch #{Inch::VERSION}"
|
93
|
+
exit
|
94
|
+
end
|
95
|
+
opts.on_tail('-h', '--help', 'Show this help.') do
|
96
|
+
trace opts
|
97
|
+
exit
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def kill(msg = nil)
|
102
|
+
warn usage
|
103
|
+
warn msg.red unless msg.nil?
|
104
|
+
warn "Try `--help' for more information."
|
105
|
+
exit 1
|
106
|
+
end
|
107
|
+
|
108
|
+
# Parses the option and handles invalid switches
|
109
|
+
#
|
110
|
+
# @param [OptionParser] opts the option parser object
|
111
|
+
# @param [Array<String>] args the arguments passed from input. This
|
112
|
+
# array will be modified.
|
113
|
+
# @return [void]
|
114
|
+
def parse_options(opts, args)
|
115
|
+
reset
|
116
|
+
opts.parse!(args)
|
117
|
+
rescue OptionParser::ParseError => err
|
118
|
+
kill unrecognized_option(err)
|
119
|
+
end
|
120
|
+
|
121
|
+
def reset
|
122
|
+
# color is enabled by default, can be turned of by switch --no-color
|
123
|
+
Term::ANSIColor::coloring = true
|
124
|
+
end
|
125
|
+
|
126
|
+
# Callback when an unrecognize option is parsed
|
127
|
+
#
|
128
|
+
# @param [OptionParser::ParseError] err the exception raised by the
|
129
|
+
# option parser
|
130
|
+
def unrecognized_option(err)
|
131
|
+
trace "Unrecognized/#{err.message}".red
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|