arli 0.7.0 → 0.8.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/Gemfile +0 -2
- data/README.md +149 -48
- data/arli.gemspec +1 -3
- data/docs/arli-in-action.png +0 -0
- data/docs/arlifile.png +0 -0
- data/exe/arli +5 -1
- data/lib/arli.rb +2 -2
- data/lib/arli/actions.rb +6 -1
- data/lib/arli/actions/action.rb +57 -37
- data/lib/arli/actions/dir_name.rb +18 -16
- data/lib/arli/actions/git_repo.rb +8 -8
- data/lib/arli/actions/move_to_library_path.rb +54 -0
- data/lib/arli/actions/{zip_file.rb → unzip_file.rb} +14 -10
- data/lib/arli/arli_file.rb +52 -32
- data/lib/arli/cli/app.rb +11 -4
- data/lib/arli/cli/command_finder.rb +14 -11
- data/lib/arli/cli/parser.rb +70 -29
- data/lib/arli/cli/parser_factory.rb +105 -50
- data/lib/arli/cli/runner.rb +8 -4
- data/lib/arli/commands.rb +1 -0
- data/lib/arli/commands/base.rb +11 -6
- data/lib/arli/commands/bundle.rb +43 -0
- data/lib/arli/commands/install.rb +56 -13
- data/lib/arli/commands/search.rb +82 -27
- data/lib/arli/configuration.rb +37 -18
- data/lib/arli/errors.rb +6 -0
- data/lib/arli/library.rb +4 -46
- data/lib/arli/library/installer.rb +71 -0
- data/lib/arli/library/proxy.rb +79 -0
- data/lib/arli/lock/file.rb +65 -0
- data/lib/arli/lock/formats.rb +4 -0
- data/lib/arli/lock/formats/base.rb +26 -0
- data/lib/arli/lock/formats/cmake.rb +24 -0
- data/lib/arli/lock/formats/json.rb +25 -0
- data/lib/arli/lock/formats/text.rb +13 -0
- data/lib/arli/lock/formats/yaml.rb +14 -0
- data/lib/arli/output.rb +94 -11
- data/lib/arli/version.rb +1 -1
- metadata +17 -35
- data/docs/arli-full.png +0 -0
- data/lib/arli/installer.rb +0 -52
@@ -10,9 +10,13 @@ module Arli
|
|
10
10
|
# This action renames invalid library folders based on the
|
11
11
|
# source files found inside.
|
12
12
|
class DirName < Action
|
13
|
+
|
14
|
+
description 'Auto-detects the canonical library folder name'
|
15
|
+
|
13
16
|
attr_accessor :sources, :headers
|
14
17
|
|
15
|
-
def
|
18
|
+
def execute
|
19
|
+
|
16
20
|
find_source_files
|
17
21
|
|
18
22
|
# so "dir" is the 'Adafruit_Unified_Sensor'
|
@@ -20,29 +24,27 @@ module Arli
|
|
20
24
|
# rename the folder
|
21
25
|
|
22
26
|
if headers.include?(dir) || sources.include?(dir)
|
23
|
-
|
27
|
+
set_canonical_dir!(dir)
|
24
28
|
else
|
25
|
-
|
26
|
-
canonical_dir =
|
29
|
+
candidate =
|
27
30
|
if_only_one(headers) ||
|
28
31
|
if_only_one(sources) ||
|
29
32
|
if_header_a_substring(headers)
|
30
33
|
|
31
|
-
|
32
|
-
library.canonical_dir = canonical_dir
|
33
|
-
mv(dir, library.canonical_dir)
|
34
|
-
print_target_dir(canonical_dir)
|
35
|
-
else
|
36
|
-
library.canonical_dir = dir
|
37
|
-
print_target_dir(dir)
|
38
|
-
end
|
34
|
+
set_canonical_dir!(candidate)
|
39
35
|
end
|
40
|
-
|
41
|
-
|
42
36
|
end
|
43
37
|
|
44
|
-
|
45
|
-
|
38
|
+
private
|
39
|
+
|
40
|
+
def set_canonical_dir!(canonical_dir)
|
41
|
+
if canonical_dir && canonical_dir != dir
|
42
|
+
mv(dir, canonical_dir)
|
43
|
+
library.canonical_dir = canonical_dir
|
44
|
+
else
|
45
|
+
library.canonical_dir = dir
|
46
|
+
end
|
47
|
+
print_target_dir(library.canonical_dir, 'installed to')
|
46
48
|
end
|
47
49
|
|
48
50
|
def if_header_a_substring(files)
|
@@ -2,13 +2,13 @@ require_relative 'action'
|
|
2
2
|
module Arli
|
3
3
|
module Actions
|
4
4
|
class GitRepo < Action
|
5
|
+
description 'Fetches or updates remote git repositories'
|
6
|
+
check_command 'git --version'
|
7
|
+
check_pattern 'git version'
|
5
8
|
|
6
|
-
def
|
7
|
-
|
8
|
-
|
9
|
-
rescue Exception => e
|
10
|
-
fuck
|
11
|
-
raise e
|
9
|
+
def execute
|
10
|
+
run_system_command(git_clone_command)
|
11
|
+
print_action_success('cloned', "cloned from #{library.url}")
|
12
12
|
end
|
13
13
|
|
14
14
|
def git_update_command
|
@@ -22,7 +22,7 @@ module Arli
|
|
22
22
|
protected
|
23
23
|
|
24
24
|
# @param <String> *args — list of arguments or a single string
|
25
|
-
def
|
25
|
+
def run_system_command(*args)
|
26
26
|
cmd = args.join(' ')
|
27
27
|
raise 'No command to run was given' unless cmd
|
28
28
|
info("\n" + cmd.green) if Arli.debug?
|
@@ -31,7 +31,7 @@ module Arli
|
|
31
31
|
info("\n" + e.red) if e && Arli.debug?
|
32
32
|
rescue Exception => e
|
33
33
|
error "Error running [#{args.join(' ')}]\n" +
|
34
|
-
|
34
|
+
"Current folder is [#{Dir.pwd.yellow}]", e
|
35
35
|
raise e
|
36
36
|
end
|
37
37
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require_relative 'action'
|
2
|
+
|
3
|
+
module Arli
|
4
|
+
module Actions
|
5
|
+
class MoveToLibraryPath < Action
|
6
|
+
description 'Moves the downloaded library to the proper path, optionally creating a backup'
|
7
|
+
|
8
|
+
def execute
|
9
|
+
Dir.chdir(config.runtime.pwd) do
|
10
|
+
|
11
|
+
handle_preexisting_folder(path) if exists?
|
12
|
+
|
13
|
+
if Dir.exist?(temp_path) && !Dir.exist?(path)
|
14
|
+
FileUtils.mkdir_p(File.dirname(path))
|
15
|
+
___ "current: #{Dir.pwd.yellow}\ntemp_path: #{temp_path.yellow}\nlibrary_path: #{path.yellow}\n" if debug?
|
16
|
+
mv(temp_path, path)
|
17
|
+
elsif Dir.exist?(path)
|
18
|
+
raise ::Arli::Errors::InstallerError,
|
19
|
+
"Directory #{path} was not expected to still be there!"
|
20
|
+
elsif !Dir.exist?(temp_path)
|
21
|
+
raise ::Arli::Errors::InstallerError,
|
22
|
+
"Directory #{temp_path} was expected to exist!"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def handle_preexisting_folder(to)
|
30
|
+
if Dir.exist?(to)
|
31
|
+
if abort?
|
32
|
+
raise ::Arli::Errors::LibraryAlreadyExists, "Directory #{to} already exists"
|
33
|
+
elsif backup?
|
34
|
+
backup!(to)
|
35
|
+
elsif overwrite?
|
36
|
+
FileUtils.rm_rf(to)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def backup!(p)
|
42
|
+
if Dir.exist?(p)
|
43
|
+
backup_path = "#{p}.arli-backup-#{Time.now.strftime('%Y%m%d%H%M%S')}"
|
44
|
+
FileUtils.mv(p, backup_path)
|
45
|
+
print_target_dir(backup_path, 'backed up')
|
46
|
+
if verbose?
|
47
|
+
___ "\nNOTE: path #{p.blue} has been backed up to #{backup_path.bold.green}\n"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -1,24 +1,28 @@
|
|
1
|
-
require 'archive/zip'
|
2
1
|
require_relative 'action'
|
3
2
|
|
4
3
|
module Arli
|
5
4
|
module Actions
|
6
|
-
class
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
class UnzipFile < Action
|
6
|
+
description 'Downloads and unzip remote ZIP archives'
|
7
|
+
check_command 'unzip -h'
|
8
|
+
check_pattern 'extract files to pipe'
|
9
|
+
|
10
|
+
def execute
|
11
|
+
return if library.url.nil?
|
12
|
+
return if library.url !~ /\.zip$/i
|
13
|
+
|
10
14
|
download!
|
15
|
+
|
11
16
|
if File.exist?(zip_archive)
|
12
|
-
FileUtils.rm_rf(
|
17
|
+
FileUtils.rm_rf(top_dir_inside_zip) if top_dir_inside_zip
|
13
18
|
unzip(zip_archive, '.')
|
14
|
-
FileUtils.move(
|
19
|
+
FileUtils.move(top_dir_inside_zip, dir) if Dir.exist?(top_dir_inside_zip)
|
15
20
|
end
|
16
21
|
rescue Exception => e
|
17
22
|
fuck
|
18
|
-
puts
|
19
23
|
raise(e)
|
20
24
|
ensure
|
21
|
-
delete_zip!
|
25
|
+
delete_zip! rescue nil
|
22
26
|
end
|
23
27
|
|
24
28
|
private
|
@@ -36,7 +40,7 @@ module Arli
|
|
36
40
|
end
|
37
41
|
|
38
42
|
# list the contents of the archive and grab the top level folder
|
39
|
-
def
|
43
|
+
def top_dir_inside_zip
|
40
44
|
@zip_folder ||= `unzip -Z1 #{zip_archive} | awk 'BEGIN{FS="/"}{print $1}' | uniq | tail -1`.chomp
|
41
45
|
end
|
42
46
|
|
data/lib/arli/arli_file.rb
CHANGED
@@ -2,6 +2,7 @@ require 'arli'
|
|
2
2
|
require 'yaml'
|
3
3
|
require 'forwardable'
|
4
4
|
require 'arduino/library'
|
5
|
+
require 'hashie/mash'
|
5
6
|
|
6
7
|
module Arli
|
7
8
|
class ArliFile
|
@@ -13,58 +14,77 @@ module Arli
|
|
13
14
|
def_delegators :@dependencies, *(Array.new.methods - Object.methods)
|
14
15
|
|
15
16
|
attr_accessor :dependencies,
|
16
|
-
:
|
17
|
-
:
|
18
|
-
:library_path
|
17
|
+
:parsed_data,
|
18
|
+
:arlifile_path
|
19
19
|
|
20
20
|
def initialize(config: Arli.config, libraries: [])
|
21
|
-
self.
|
22
|
-
|
23
|
-
|
24
|
-
if libraries && !libraries.empty?
|
25
|
-
self.dependencies = libraries.map{ |lib| make_lib(lib) }
|
26
|
-
else
|
27
|
-
self.file = "#{config.arlifile.path}/#{config.arlifile.name}"
|
28
|
-
unless file && File.exist?(file)
|
29
|
-
raise(Arli::Errors::ArliFileNotFound,
|
30
|
-
"Arlifile could not be found at\n#{file.bold.yellow}")
|
31
|
-
end
|
32
|
-
self.dependencies = parse_file
|
33
|
-
end
|
21
|
+
self.arlifile_path = "#{config.arlifile.path}/#{config.arlifile.name}"
|
22
|
+
self.dependencies = read_dependencies(libraries)
|
23
|
+
Arli.config.libraries.temp_dir ||= Dir.mktmpdir
|
34
24
|
end
|
35
25
|
|
36
|
-
|
37
|
-
Dir.chdir(library_path) do
|
38
|
-
yield if block_given?
|
39
|
-
end
|
40
|
-
end
|
26
|
+
alias libraries dependencies
|
41
27
|
|
42
|
-
def
|
43
|
-
|
28
|
+
def install
|
29
|
+
each_in_temp_path do |lib|
|
30
|
+
lib.install
|
31
|
+
end
|
44
32
|
end
|
45
33
|
|
46
34
|
private
|
47
35
|
|
48
|
-
def
|
49
|
-
|
50
|
-
file_hash['dependencies'].map { |lib| make_lib(lib) }
|
36
|
+
def within_temp_path(&block)
|
37
|
+
within_path(Arli.config.libraries.temp_dir, &block)
|
51
38
|
end
|
52
39
|
|
53
|
-
def
|
54
|
-
|
40
|
+
def each_in_temp_path(&block)
|
41
|
+
within_temp_path do
|
42
|
+
dependencies.each(&block)
|
43
|
+
end
|
55
44
|
end
|
56
45
|
|
46
|
+
|
57
47
|
def library_model(lib)
|
48
|
+
return lib if lib.is_a?(::Arduino::Library::Model)
|
49
|
+
|
58
50
|
::Arduino::Library::Model.from(lib).tap do |model|
|
59
51
|
if model.nil?
|
60
52
|
lib_output = (lib && lib['name']) ? lib['name'] : lib.inspect
|
61
53
|
raise Arli::Errors::LibraryNotFound, 'Error: '.bold.red +
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
54
|
+
"Library #{lib_output.yellow} ".red + "was not found.\n\n".red +
|
55
|
+
%Q[ HINT: run #{"arli search 'name: /#{lib_output}/'".green}\n] +
|
56
|
+
%Q[ to find the exact name of the library you are trying\n] +
|
57
|
+
%Q[ to install. Alternatively, provide a url: field.\n]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def make_lib(lib)
|
63
|
+
::Arli::Library::Proxy.new(library_model(lib))
|
64
|
+
end
|
65
|
+
|
66
|
+
def within_path(p, &_block)
|
67
|
+
FileUtils.mkpath(p) unless Dir.exist?(p)
|
68
|
+
Dir.chdir(p) do
|
69
|
+
yield if block_given?
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def read_dependencies(libraries)
|
74
|
+
if libraries && !libraries.empty?
|
75
|
+
libraries.map { |lib| make_lib(lib) }
|
76
|
+
else
|
77
|
+
unless arlifile_path && File.exist?(arlifile_path)
|
78
|
+
raise(Arli::Errors::ArliFileNotFound,
|
79
|
+
"Arlifile could not be found at\n#{arlifile_path.bold.yellow}")
|
66
80
|
end
|
81
|
+
parse_yaml_file
|
67
82
|
end
|
68
83
|
end
|
84
|
+
|
85
|
+
def parse_yaml_file
|
86
|
+
self.parsed_data = Hashie::Mash.new(::YAML.load(::File.read(self.arlifile_path)))
|
87
|
+
parsed_data.dependencies.map { |lib| make_lib(lib) }
|
88
|
+
end
|
69
89
|
end
|
70
90
|
end
|
data/lib/arli/cli/app.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'forwardable'
|
2
2
|
require 'optparse'
|
3
3
|
require 'colored2'
|
4
|
-
|
4
|
+
require 'tmpdir'
|
5
5
|
require_relative 'parser'
|
6
6
|
require_relative 'command_finder'
|
7
7
|
require_relative 'parser_factory'
|
@@ -17,9 +17,11 @@ module Arli
|
|
17
17
|
attr_accessor :argv, :config, :command
|
18
18
|
|
19
19
|
def initialize(argv, config: Arli.config)
|
20
|
-
self.argv
|
21
|
-
self.config
|
22
|
-
self.config.runtime.argv
|
20
|
+
self.argv = argv
|
21
|
+
self.config = config
|
22
|
+
self.config.runtime.argv = argv
|
23
|
+
self.config.runtime.pwd = ::Dir.pwd
|
24
|
+
Arli.config.libraries.temp_dir = ::Dir.mktmpdir
|
23
25
|
end
|
24
26
|
|
25
27
|
def start
|
@@ -47,8 +49,13 @@ module Arli
|
|
47
49
|
report_exception(e, 'Invalid flags or options')
|
48
50
|
rescue Arli::Errors::InvalidCommandError => e
|
49
51
|
report_exception(e, 'Unknown command')
|
52
|
+
rescue Arli::Errors::InvalidSyntaxError => e
|
53
|
+
report_exception(e, 'Incorrect command usage')
|
50
54
|
rescue Exception => e
|
51
55
|
report_exception(e)
|
56
|
+
ensure
|
57
|
+
d = Arli.config.libraries.temp_dir
|
58
|
+
FileUtils.rm_rf(d) if Dir.exist?(d) rescue nil
|
52
59
|
end
|
53
60
|
|
54
61
|
def parse_global_flags
|
@@ -36,11 +36,19 @@ module Arli
|
|
36
36
|
self
|
37
37
|
end
|
38
38
|
|
39
|
+
def detect_command
|
40
|
+
return nil unless non_flag_argument?
|
41
|
+
cmd = argv.shift.to_sym
|
42
|
+
if factory.valid_command?(cmd)
|
43
|
+
cmd
|
44
|
+
else
|
45
|
+
raise_invalid_arli_command!(cmd)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
39
49
|
def parse_command_arguments!(cmd)
|
40
50
|
parser = factory.command_parser(cmd)
|
41
|
-
if parser
|
42
|
-
factory.parse_argv(parser, argv)
|
43
|
-
end
|
51
|
+
factory.parse_argv(parser, argv) if parser
|
44
52
|
end
|
45
53
|
|
46
54
|
def instantiate_command
|
@@ -53,14 +61,9 @@ module Arli
|
|
53
61
|
end
|
54
62
|
end
|
55
63
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
if factory.valid_command?(cmd)
|
60
|
-
cmd
|
61
|
-
else
|
62
|
-
raise_invalid_arli_command!(cmd)
|
63
|
-
end
|
64
|
+
|
65
|
+
def non_flag_argument?
|
66
|
+
argv.first && argv.first !~ /^-.*$/
|
64
67
|
end
|
65
68
|
|
66
69
|
def factory
|
data/lib/arli/cli/parser.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
require 'arli/configuration'
|
2
|
+
require 'colored2'
|
3
|
+
require 'optionparser'
|
2
4
|
|
3
5
|
module Arli
|
4
6
|
module CLI
|
5
|
-
class Parser < OptionParser
|
7
|
+
class Parser < ::OptionParser
|
6
8
|
|
7
9
|
attr_accessor :output_lines,
|
8
10
|
:command,
|
@@ -21,38 +23,51 @@ module Arli
|
|
21
23
|
end
|
22
24
|
|
23
25
|
def option_install
|
24
|
-
option_library_name
|
25
26
|
option_lib_home
|
26
|
-
option_dependency_file
|
27
27
|
option_if_exists
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
30
|
+
def option_bundle
|
31
|
+
option_lib_home
|
32
|
+
option_arlifile_path
|
33
|
+
option_arlifile_lock_format
|
34
|
+
option_if_exists
|
35
|
+
end
|
36
|
+
|
37
|
+
def option_arlifile_path
|
31
38
|
on('-a', '--arli-path PATH',
|
32
|
-
'
|
39
|
+
'An alternate folder with the ' + 'Arlifile'.green + ' file.',
|
33
40
|
"Defaults to the current directory.\n\n") do |v|
|
34
41
|
config.arlifile.path = v
|
35
42
|
end
|
36
43
|
end
|
37
44
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
45
|
+
SUPPORTED_FORMATS = %w[cmake text json yaml]
|
46
|
+
|
47
|
+
def option_arlifile_lock_format
|
48
|
+
on('-f', '--format FMT',
|
49
|
+
"Arli writes an #{'Arlifile.lock'.green} with resolved info.",
|
50
|
+
"The default format is #{'text'.bold.yellow}. Use -f to set it",
|
51
|
+
"to one of: #{SUPPORTED_FORMATS.join(', ').bold.yellow}\n\n") do |v|
|
52
|
+
if SUPPORTED_FORMATS.include?(v.downcase)
|
53
|
+
config.arlifile.lock_format = v.downcase.to_sym
|
54
|
+
else
|
55
|
+
raise ::OptionParser::InvalidOption,
|
56
|
+
"#{v.yellow} is not a supported lock file format"
|
57
|
+
end
|
43
58
|
end
|
44
59
|
end
|
45
60
|
|
46
61
|
def option_lib_home
|
47
|
-
on('-l', '--
|
48
|
-
'
|
49
|
-
"Defaults to #{
|
62
|
+
on('-l', '--lib-path PATH',
|
63
|
+
'Destination: typically your Arduino libraries folder',
|
64
|
+
"Defaults to #{'~/Documents/Arduino/Libraries'.green}\n\n") do |v|
|
50
65
|
config.libraries.path = v
|
51
66
|
end
|
52
67
|
end
|
53
68
|
|
54
69
|
def option_search
|
55
|
-
on('-d', '--database
|
70
|
+
on('-d', '--database URL',
|
56
71
|
'a JSON(.gz) file path or a URL of the library database.',
|
57
72
|
'Defaults to the Arduino-maintained database.') do |v|
|
58
73
|
config.database.path = v
|
@@ -72,10 +87,10 @@ module Arli
|
|
72
87
|
'Alternatively you can either ' + 'abort'.bold.blue + ' or ' + 'backup'.bold.blue
|
73
88
|
) do |v|
|
74
89
|
if v == 'abort'
|
75
|
-
config.
|
76
|
-
config.
|
90
|
+
config.if_exists.abort = true
|
91
|
+
config.if_exists.overwrite = false
|
77
92
|
elsif v == 'backup'
|
78
|
-
config.
|
93
|
+
config.if_exists.backup = true
|
79
94
|
end
|
80
95
|
end
|
81
96
|
sep ' '
|
@@ -87,13 +102,7 @@ module Arli
|
|
87
102
|
on('-h', '--help', 'prints this help') do
|
88
103
|
::Arli.config.help = true
|
89
104
|
|
90
|
-
command_hash =
|
91
|
-
|
92
|
-
if command_hash && command_hash[:description]
|
93
|
-
output 'Description:'
|
94
|
-
output ' ' + command_hash[:description]
|
95
|
-
output ''
|
96
|
-
end
|
105
|
+
command_hash = output_command_description(command_name)
|
97
106
|
|
98
107
|
output_help
|
99
108
|
output_command_help if commands
|
@@ -106,9 +115,14 @@ module Arli
|
|
106
115
|
end
|
107
116
|
end
|
108
117
|
|
118
|
+
def header(string)
|
119
|
+
output "#{string.bold.magenta}:"
|
120
|
+
output
|
121
|
+
end
|
122
|
+
|
109
123
|
def output_examples(examples)
|
110
|
-
|
111
|
-
indent = '
|
124
|
+
header 'Examples'
|
125
|
+
indent = ' '
|
112
126
|
examples.each do |example|
|
113
127
|
output
|
114
128
|
output indent + '# ' + example[:desc]
|
@@ -131,9 +145,10 @@ module Arli
|
|
131
145
|
|
132
146
|
def command_help
|
133
147
|
|
134
|
-
|
148
|
+
header 'Available Commands'
|
149
|
+
subtext = ''
|
135
150
|
factory.command_parsers.each_pair do |command, config|
|
136
|
-
subtext << %Q/#{sprintf(' %-12s', command.to_s).green} — #{sprintf('%s', config[:
|
151
|
+
subtext << %Q/#{sprintf(' %-12s', command.to_s).green} — #{sprintf('%s', config[:sentence]).blue}\n/
|
137
152
|
end
|
138
153
|
subtext << <<-EOS
|
139
154
|
|
@@ -156,6 +171,10 @@ See #{Arli::Configuration::ARLI_COMMAND.blue + ' command '.green + '--help'.yell
|
|
156
171
|
end
|
157
172
|
|
158
173
|
def common_help_options
|
174
|
+
on('-C', '--no-color',
|
175
|
+
'Disable any color output.') do |*|
|
176
|
+
Colored2.disable! # if $stdout.tty?
|
177
|
+
end
|
159
178
|
on('-D', '--debug',
|
160
179
|
'Print debugging info.') do |v|
|
161
180
|
config.debug = true
|
@@ -164,6 +183,10 @@ See #{Arli::Configuration::ARLI_COMMAND.blue + ' command '.green + '--help'.yell
|
|
164
183
|
'Print exception stack traces.') do |v|
|
165
184
|
config.trace = v
|
166
185
|
end
|
186
|
+
# on('-n', '--dry-run',
|
187
|
+
# 'Only print actions, but do not do them.') do |v|
|
188
|
+
# config.trace = v
|
189
|
+
# end
|
167
190
|
on('-v', '--verbose',
|
168
191
|
'Print more information.') do |v|
|
169
192
|
config.verbose = true
|
@@ -181,7 +204,25 @@ See #{Arli::Configuration::ARLI_COMMAND.blue + ' command '.green + '--help'.yell
|
|
181
204
|
|
182
205
|
def print_version_copyright
|
183
206
|
output << Arli::Configuration::ARLI_COMMAND.bold.yellow + ' (' + Arli::VERSION.bold.green + ')' +
|
184
|
-
|
207
|
+
' © 2017 Konstantin Gredeskoul, MIT License.'.dark unless Arli.config.quiet
|
208
|
+
end
|
209
|
+
|
210
|
+
def output_command_description(command_name)
|
211
|
+
command_hash = factory.command_parsers[command_name]
|
212
|
+
indent = ' '
|
213
|
+
|
214
|
+
if command_hash
|
215
|
+
if command_hash.description
|
216
|
+
header 'Description'
|
217
|
+
if command_hash.sentence
|
218
|
+
output indent + command_hash.sentence.bold
|
219
|
+
output ''
|
220
|
+
end
|
221
|
+
output indent + Array(command_hash[:description]).map(&:dark).join('').gsub(/\n/, "\n#{indent}")
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
command_hash
|
185
226
|
end
|
186
227
|
end
|
187
228
|
end
|