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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ee8e7505de18b6cf573e524c2135a729927aeca6
4
- data.tar.gz: 4bed76ffe1d0ec614ac598e26e511c165879fc78
3
+ metadata.gz: 1c5993ea9d0d226f890560dade6d177de9d092b9
4
+ data.tar.gz: 556662ade80ed31ddbc494897844935c3bdde05f
5
5
  SHA512:
6
- metadata.gz: 5cfbb4bf8ff1c79f15455be0d7da775a94a18a90a49a6db6c1a27dca2bb923ee28f559679c0e60989ec31ac90fe12a01e7486d71c0095062437897361c89896e
7
- data.tar.gz: b8cbcc6ab512c39edcce0a0d0869bca6aece9c89cc60e446eb49655d6fe21dc9e5f22be34aa1be798d89bdaea9ff096abab708320f4e052d8186fc36d1bf0250
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/command"
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/ui"
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
@@ -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
- msg = [
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 != arguments.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 "Required Parameter: #{missing_flags.first.banner}"
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 "Parameter has no value: #{flag.banner}"
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
@@ -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 help
43
- prefix = name ? "#{name}:" : ""
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
- subcommands.each do |sub_cmd|
57
- command_list << ["#{prefix}#{sub_cmd.name}", sub_cmd.description]
58
- end
54
+ def top_level?
55
+ prefix == ""
56
+ end
59
57
 
60
- Dracula::UI.print_table(command_list, :indent => 2)
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
@@ -1,3 +1,3 @@
1
1
  class Dracula
2
- VERSION = "0.2.2".freeze
2
+ VERSION = "0.3.0".freeze
3
3
  end
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.2.2
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-22 00:00:00.000000000 Z
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