dracula 0.2.2 → 0.3.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/lib/dracula.rb +5 -2
- data/lib/dracula/command.rb +20 -31
- data/lib/dracula/command_help.rb +56 -0
- data/lib/dracula/namespace.rb +16 -17
- data/lib/dracula/namespace_help.rb +63 -0
- data/lib/dracula/ui.rb +20 -0
- data/lib/dracula/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c5993ea9d0d226f890560dade6d177de9d092b9
|
4
|
+
data.tar.gz: 556662ade80ed31ddbc494897844935c3bdde05f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32cffd934ccb445cc3e2c9580b6e920ad4471c6ee59fc23bbf87b1fdb1683427d64af4683f5f5ee451e4b3ab193755ba556b889c0f68917b77864c0ed97dceb0
|
7
|
+
data.tar.gz: 4c139824b3e88d2ec83885f045ac7b87051924c2942ffd00f6719040f4c6b9945bd70732c8b16d19ee08ced69e06284cbd6284ddfa33f42bf317426f9cfda483
|
data/lib/dracula.rb
CHANGED
@@ -2,10 +2,12 @@ require "dracula/version"
|
|
2
2
|
require "optparse"
|
3
3
|
|
4
4
|
class Dracula
|
5
|
-
require "dracula/
|
5
|
+
require "dracula/ui"
|
6
6
|
require "dracula/flag"
|
7
|
+
require "dracula/command"
|
8
|
+
require "dracula/command_help"
|
7
9
|
require "dracula/namespace"
|
8
|
-
require "dracula/
|
10
|
+
require "dracula/namespace_help"
|
9
11
|
|
10
12
|
class << self
|
11
13
|
def program_name(name = nil)
|
@@ -59,6 +61,7 @@ class Dracula
|
|
59
61
|
def register(name, description, klass)
|
60
62
|
klass.namespace.name = name
|
61
63
|
klass.namespace.description = description
|
64
|
+
klass.namespace.parent = namespace
|
62
65
|
|
63
66
|
namespace.add_subcommand(klass.namespace)
|
64
67
|
end
|
data/lib/dracula/command.rb
CHANGED
@@ -18,6 +18,14 @@ class Dracula
|
|
18
18
|
@options = options || []
|
19
19
|
end
|
20
20
|
|
21
|
+
def prefix
|
22
|
+
@klass.namespace.prefix
|
23
|
+
end
|
24
|
+
|
25
|
+
def full_name
|
26
|
+
"#{prefix}#{name}"
|
27
|
+
end
|
28
|
+
|
21
29
|
def name
|
22
30
|
desc.name
|
23
31
|
end
|
@@ -26,41 +34,22 @@ class Dracula
|
|
26
34
|
@klass.instance_method(@method_name).parameters.select { |p| p[0] == :req }.map { |p| p[1].to_s.upcase }
|
27
35
|
end
|
28
36
|
|
29
|
-
def banner
|
30
|
-
namespace = @klass.namespace.name ? "#{@klass.namespace.name}:" : ""
|
31
|
-
args = arguments.count > 0 ? " #{arguments.join(" ")}" : ""
|
32
|
-
|
33
|
-
"#{namespace}#{desc.name}#{args}"
|
34
|
-
end
|
35
|
-
|
36
37
|
def help
|
37
|
-
|
38
|
-
"Usage: #{Dracula.program_name} #{banner}",
|
39
|
-
"",
|
40
|
-
"#{desc.description}",
|
41
|
-
""
|
42
|
-
]
|
43
|
-
|
44
|
-
if options.size > 0
|
45
|
-
msg << "Flags:"
|
46
|
-
|
47
|
-
options.each { |option| msg << " #{option.banner}" }
|
48
|
-
|
49
|
-
msg << ""
|
50
|
-
end
|
51
|
-
|
52
|
-
unless long_desc.nil?
|
53
|
-
msg << long_desc
|
54
|
-
end
|
55
|
-
|
56
|
-
puts msg.join("\n")
|
38
|
+
CommandHelp.new(self).show
|
57
39
|
end
|
58
40
|
|
59
41
|
def run(params)
|
60
42
|
args = params.take_while { |p| p[0] != "-" }
|
61
43
|
|
62
|
-
if args.count
|
63
|
-
puts "Missing arguments"
|
44
|
+
if args.count < arguments.count
|
45
|
+
puts Dracula::UI.error("Missing arguments")
|
46
|
+
puts ""
|
47
|
+
help
|
48
|
+
exit(1)
|
49
|
+
end
|
50
|
+
|
51
|
+
if args.count > arguments.count
|
52
|
+
puts Dracula::UI.error("Too many arguments")
|
64
53
|
puts ""
|
65
54
|
help
|
66
55
|
exit(1)
|
@@ -71,7 +60,7 @@ class Dracula
|
|
71
60
|
missing_flags = missing_required_flags(parsed_flags)
|
72
61
|
|
73
62
|
unless missing_flags.empty?
|
74
|
-
puts "
|
63
|
+
puts Dracula::UI.error("Missing required Parameter: #{missing_flags.first.banner}")
|
75
64
|
puts ""
|
76
65
|
help
|
77
66
|
exit(1)
|
@@ -81,7 +70,7 @@ class Dracula
|
|
81
70
|
rescue OptionParser::MissingArgument => ex
|
82
71
|
flag = flags.find { |f| "--#{f.name}" == ex.args.first }
|
83
72
|
|
84
|
-
puts "
|
73
|
+
puts Dracula::UI.error("Missing flag parameter: #{flag.banner}")
|
85
74
|
puts ""
|
86
75
|
help
|
87
76
|
exit(1)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
class Dracula
|
2
|
+
class CommandHelp
|
3
|
+
|
4
|
+
def initialize(command)
|
5
|
+
@command = command
|
6
|
+
end
|
7
|
+
|
8
|
+
def show
|
9
|
+
show_usage
|
10
|
+
show_desc
|
11
|
+
show_flags if @command.flags.any?
|
12
|
+
show_long_desc if @command.long_desc
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def banner
|
18
|
+
args = if @command.arguments.count > 0
|
19
|
+
" #{@command.arguments.map { |a| Dracula::UI.bold("[#{a}]") }.join(" ")}"
|
20
|
+
else
|
21
|
+
""
|
22
|
+
end
|
23
|
+
|
24
|
+
flags_banner = if @command.flags.count > 0
|
25
|
+
" " + Dracula::UI.bold("[FLAGS]")
|
26
|
+
else
|
27
|
+
""
|
28
|
+
end
|
29
|
+
|
30
|
+
"#{@command.full_name}#{args}#{flags_banner}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def show_usage
|
34
|
+
puts "Usage: #{Dracula.program_name} #{banner}"
|
35
|
+
puts ""
|
36
|
+
end
|
37
|
+
|
38
|
+
def show_desc
|
39
|
+
puts @command.desc.description.capitalize
|
40
|
+
puts ""
|
41
|
+
end
|
42
|
+
|
43
|
+
def show_flags
|
44
|
+
puts Dracula::UI.bold("Flags:")
|
45
|
+
|
46
|
+
@command.flags.each { |flag| puts " #{flag.banner}" }
|
47
|
+
|
48
|
+
puts ""
|
49
|
+
end
|
50
|
+
|
51
|
+
def show_long_desc
|
52
|
+
puts @command.long_desc
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
data/lib/dracula/namespace.rb
CHANGED
@@ -5,11 +5,13 @@ class Dracula
|
|
5
5
|
attr_accessor :description
|
6
6
|
attr_accessor :commands
|
7
7
|
attr_accessor :subcommands
|
8
|
+
attr_accessor :parent
|
8
9
|
|
9
10
|
def initialize(klass)
|
10
11
|
@klass = klass
|
11
12
|
@commands = []
|
12
13
|
@subcommands = []
|
14
|
+
@parent = []
|
13
15
|
end
|
14
16
|
|
15
17
|
def dispatch(route, params, action = :run)
|
@@ -22,7 +24,10 @@ class Dracula
|
|
22
24
|
if handler
|
23
25
|
action == :run ? handler.run(params) : handler.help
|
24
26
|
else
|
27
|
+
puts Dracula::UI.error("Command not found")
|
28
|
+
puts ""
|
25
29
|
help
|
30
|
+
exit(1)
|
26
31
|
end
|
27
32
|
else
|
28
33
|
handler = subcommands.find { |c| c.name == route[0] }
|
@@ -30,7 +35,10 @@ class Dracula
|
|
30
35
|
if handler
|
31
36
|
handler.dispatch(route[1..-1], params, action)
|
32
37
|
else
|
38
|
+
puts Dracula::UI.error("Command not found #{prefix}#{Dracula::UI.danger(route.join(":"))}")
|
39
|
+
puts ""
|
33
40
|
help
|
41
|
+
exit(1)
|
34
42
|
end
|
35
43
|
end
|
36
44
|
end
|
@@ -39,25 +47,16 @@ class Dracula
|
|
39
47
|
help
|
40
48
|
end
|
41
49
|
|
42
|
-
def
|
43
|
-
|
44
|
-
|
45
|
-
puts "Usage: #{Dracula.program_name} #{prefix}<command>"
|
46
|
-
puts ""
|
47
|
-
puts (description || "Help topics, type #{Dracula.program_name} help TOPIC for more details:")
|
48
|
-
puts ""
|
49
|
-
|
50
|
-
command_list = []
|
51
|
-
|
52
|
-
commands.each do |cmd|
|
53
|
-
command_list << ["#{prefix}#{cmd.desc.name}", cmd.desc.description]
|
54
|
-
end
|
50
|
+
def prefix
|
51
|
+
name ? "#{parent.prefix}#{name}:" : ""
|
52
|
+
end
|
55
53
|
|
56
|
-
|
57
|
-
|
58
|
-
|
54
|
+
def top_level?
|
55
|
+
prefix == ""
|
56
|
+
end
|
59
57
|
|
60
|
-
|
58
|
+
def help
|
59
|
+
NamespaceHelp.new(self).show
|
61
60
|
end
|
62
61
|
|
63
62
|
def add_command(command)
|
@@ -0,0 +1,63 @@
|
|
1
|
+
class Dracula
|
2
|
+
class NamespaceHelp
|
3
|
+
|
4
|
+
attr_reader :namespace
|
5
|
+
|
6
|
+
def initialize(namespace)
|
7
|
+
@namespace = namespace
|
8
|
+
end
|
9
|
+
|
10
|
+
def show
|
11
|
+
show_usage
|
12
|
+
show_desc if namespace.description
|
13
|
+
show_commands
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def show_usage
|
19
|
+
puts "Usage: #{Dracula.program_name} #{Dracula::UI.bold "#{namespace.prefix}[command]"}\n"
|
20
|
+
puts ""
|
21
|
+
end
|
22
|
+
|
23
|
+
def show_desc
|
24
|
+
puts namespace.description.capitalize
|
25
|
+
puts ""
|
26
|
+
end
|
27
|
+
|
28
|
+
def show_commands
|
29
|
+
puts "Command list, type #{Dracula::UI.bold(Dracula.program_name.to_s + " help #{namespace.prefix}[command]")} for more details:"
|
30
|
+
puts ""
|
31
|
+
|
32
|
+
banners = []
|
33
|
+
|
34
|
+
banners += command_banners(namespace)
|
35
|
+
banners << ["", ""] # empty line
|
36
|
+
|
37
|
+
if namespace.top_level?
|
38
|
+
banners += short_subcommand_banners(namespace)
|
39
|
+
banners << ["", ""] # empty line
|
40
|
+
else
|
41
|
+
namespace.subcommands.each do |sub_cmd|
|
42
|
+
banners += command_banners(sub_cmd)
|
43
|
+
banners << ["", ""] # empty line
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
Dracula::UI.print_table(banners, :indent => 2)
|
48
|
+
end
|
49
|
+
|
50
|
+
def short_subcommand_banners(namespace)
|
51
|
+
namespace.subcommands.map do |sub_cmd|
|
52
|
+
[Dracula::UI.bold("#{namespace.prefix}#{sub_cmd.name}"), sub_cmd.description.capitalize]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def command_banners(namespace)
|
57
|
+
namespace.commands.map do |cmd|
|
58
|
+
[Dracula::UI.bold("#{namespace.prefix}#{cmd.desc.name}"), cmd.desc.description.capitalize]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
data/lib/dracula/ui.rb
CHANGED
@@ -1,6 +1,26 @@
|
|
1
1
|
class Dracula
|
2
2
|
class UI
|
3
3
|
|
4
|
+
def self.bold(str)
|
5
|
+
if $stdout.tty? # colorize only if output is terminal
|
6
|
+
"\e[34m#{str}\e[0m"
|
7
|
+
else
|
8
|
+
str
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.danger(str)
|
13
|
+
if $stdout.tty? # colorize only if output is terminal
|
14
|
+
"\e[31m#{str}\e[0m"
|
15
|
+
else
|
16
|
+
str
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.error(str)
|
21
|
+
danger("[ERROR] ") + str.to_s
|
22
|
+
end
|
23
|
+
|
4
24
|
# Prints a table. Shamelesly copied from thor.
|
5
25
|
#
|
6
26
|
# ==== Parameters
|
data/lib/dracula/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dracula
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor Šarčević
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -71,8 +71,10 @@ files:
|
|
71
71
|
- dracula.gemspec
|
72
72
|
- lib/dracula.rb
|
73
73
|
- lib/dracula/command.rb
|
74
|
+
- lib/dracula/command_help.rb
|
74
75
|
- lib/dracula/flag.rb
|
75
76
|
- lib/dracula/namespace.rb
|
77
|
+
- lib/dracula/namespace_help.rb
|
76
78
|
- lib/dracula/ui.rb
|
77
79
|
- lib/dracula/version.rb
|
78
80
|
homepage: https://github.com/renderedtext/dracula
|