command_tree 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/command_tree/command.rb +33 -0
- data/lib/command_tree/group.rb +31 -0
- data/lib/command_tree/text_menu.rb +53 -0
- data/lib/command_tree/tree.rb +23 -39
- data/lib/command_tree/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 05ab09a1469a4d3a4ffc2df192457f327cca0a2e3e984bcd554dae62b9e81019
|
4
|
+
data.tar.gz: 760f177dcc67462b17931ff4617142165d35539a82a15f5aeecc772824adb073
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d6b22a9224d94d7756ac716c3b24e1ca6954ea3d7d2db003658429858d0c5f20034803754c609abd14013bd85924fb5c5ba09609961c40a32a1027aa1842675
|
7
|
+
data.tar.gz: '058775d799989ee2d609791937770105569891f979811e2b678f87fd70cdbdfea6f55394e699ebdd911baa9126337cf387739bb54a0995315ec545a4d237698c'
|
data/Gemfile.lock
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
module CommandTree
|
2
|
+
# A command class
|
3
|
+
class Command
|
4
|
+
attr_reader :name, :desc, :prefix, :block
|
5
|
+
|
6
|
+
def initialize(prefix, name, options = {}, &block)
|
7
|
+
@prefix = prefix
|
8
|
+
@name = name
|
9
|
+
@desc = options[:desc]
|
10
|
+
@block = block
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute
|
14
|
+
print_banner
|
15
|
+
block.call
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def print_banner
|
21
|
+
puts pretty_name if name
|
22
|
+
puts pretty_description if desc
|
23
|
+
end
|
24
|
+
|
25
|
+
def pretty_name
|
26
|
+
name.light_magenta.bold if name
|
27
|
+
end
|
28
|
+
|
29
|
+
def pretty_description
|
30
|
+
desc.to_s.light_black if desc
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module CommandTree
|
2
|
+
# A group of commands
|
3
|
+
class Group
|
4
|
+
attr_reader :name, :desc, :prefix
|
5
|
+
|
6
|
+
def initialize(prefix, name, options = {})
|
7
|
+
@prefix = prefix
|
8
|
+
@name = name
|
9
|
+
@desc = options[:desc]
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute
|
13
|
+
print_banner
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def print_banner
|
19
|
+
puts pretty_name if name
|
20
|
+
puts pretty_description if desc
|
21
|
+
end
|
22
|
+
|
23
|
+
def pretty_name
|
24
|
+
name.light_magenta.bold if name
|
25
|
+
end
|
26
|
+
|
27
|
+
def pretty_description
|
28
|
+
desc.to_s.light_black if desc
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'colorize'
|
2
|
+
require 'colorized_string'
|
3
|
+
|
4
|
+
module CommandTree
|
5
|
+
# responsible for showing the menu in terminal
|
6
|
+
class TextMenu
|
7
|
+
def initialize(item_width)
|
8
|
+
@item_width = item_width
|
9
|
+
@items = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def render
|
13
|
+
_, screen_width = IO.console.winsize
|
14
|
+
items_per_row = screen_width / item_width
|
15
|
+
|
16
|
+
names = items.dup.map! { |item| item_name(item) }
|
17
|
+
descs = items.dup.map! { |item| item_desc(item) }
|
18
|
+
|
19
|
+
until names.empty?
|
20
|
+
puts names.shift(items_per_row).join
|
21
|
+
puts descs.shift(items_per_row).join
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def add(item)
|
26
|
+
items << item
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_reader :items, :item_width
|
32
|
+
|
33
|
+
def item_name(item)
|
34
|
+
prefix = item.prefix
|
35
|
+
arrow = ' → '
|
36
|
+
|
37
|
+
name_width = item_width - prefix.length - arrow.length
|
38
|
+
name = (item.is_a?(Group) ? '+' : '') + item.name
|
39
|
+
name = name.ljust(name_width)
|
40
|
+
|
41
|
+
colored_name = item.is_a?(Group) ? name.light_magenta.bold : name.cyan
|
42
|
+
|
43
|
+
(prefix.green + arrow.light_black + colored_name)
|
44
|
+
end
|
45
|
+
|
46
|
+
def item_desc(item)
|
47
|
+
desc = item.desc.to_s
|
48
|
+
|
49
|
+
return (desc[0...item_width - 3] + '...').light_black if desc.length >= item_width
|
50
|
+
return desc.ljust(item_width).light_black
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/command_tree/tree.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
require 'io/console'
|
2
|
-
|
3
|
-
|
2
|
+
|
3
|
+
require_relative 'group'
|
4
|
+
require_relative 'command'
|
5
|
+
require_relative 'text_menu'
|
4
6
|
|
5
7
|
module CommandTree
|
6
8
|
# A tree of commands and associated keys for every node
|
7
9
|
class Tree
|
8
10
|
def initialize
|
9
|
-
@calls = { '' =>
|
11
|
+
@calls = { '' => nil }
|
10
12
|
end
|
11
13
|
|
12
14
|
# register a `path` to a `name` with a block of code if
|
@@ -14,10 +16,14 @@ module CommandTree
|
|
14
16
|
# supported:
|
15
17
|
# desc: a description of the item, as a help text for the user
|
16
18
|
def register(path, name, options = {}, &block)
|
19
|
+
path = path.to_s
|
20
|
+
name = name.to_s
|
21
|
+
prefix = path[-1]
|
22
|
+
|
17
23
|
insure_path(path, name, options)
|
18
24
|
return unless block_given?
|
19
25
|
|
20
|
-
calls[path] =
|
26
|
+
calls[path] = Command.new(prefix, name, options, &block)
|
21
27
|
end
|
22
28
|
|
23
29
|
# define a group of commands (subtree)
|
@@ -41,7 +47,7 @@ module CommandTree
|
|
41
47
|
def merge(subtree, prefix, name, options = {})
|
42
48
|
register(prefix, name, options)
|
43
49
|
subtree.calls.each do |key, command|
|
44
|
-
next
|
50
|
+
next unless command
|
45
51
|
|
46
52
|
calls["#{prefix}#{key}"] = command
|
47
53
|
end
|
@@ -57,25 +63,16 @@ module CommandTree
|
|
57
63
|
return if path.empty?
|
58
64
|
|
59
65
|
insure_path(path[0...-1], name, options)
|
60
|
-
calls[path] =
|
66
|
+
calls[path] = Group.new(path[-1], name, options) unless calls[path]
|
61
67
|
end
|
62
68
|
|
63
69
|
def execute_path(path)
|
64
70
|
return puts "#{path} couldn't be found..." unless calls.key?(path)
|
65
71
|
|
66
72
|
node = calls[path]
|
67
|
-
|
68
|
-
key.start_with?(path) && key.length == (path.length + 1)
|
69
|
-
end
|
70
|
-
children.sort!
|
71
|
-
|
72
|
-
puts "#{node[:name]}:".light_magenta.bold if node.key?(:name)
|
73
|
-
|
74
|
-
description = node.dig(:options, :desc)
|
75
|
-
puts description.to_s.light_black if description
|
76
|
-
|
77
|
-
node[:block].call if node.key?(:block)
|
73
|
+
node.execute if node
|
78
74
|
|
75
|
+
children = get_children(path)
|
79
76
|
return if children.empty?
|
80
77
|
|
81
78
|
print_children(children)
|
@@ -83,34 +80,21 @@ module CommandTree
|
|
83
80
|
execute_path(path + choice)
|
84
81
|
end
|
85
82
|
|
83
|
+
def get_children(path)
|
84
|
+
calls.keys.select do |key|
|
85
|
+
key.start_with?(path) && key.length == (path.length + 1)
|
86
|
+
end.sort
|
87
|
+
end
|
88
|
+
|
86
89
|
def print_children(children)
|
87
|
-
|
90
|
+
menu = TextMenu.new(40)
|
88
91
|
|
89
92
|
children.each do |child|
|
90
|
-
|
91
|
-
|
92
|
-
output = child[-1].green
|
93
|
-
output << ' → '.light_black
|
94
|
-
|
95
|
-
output << if child_node.key?(:block)
|
96
|
-
" #{child_node[:name].ljust(40)}".cyan
|
97
|
-
else
|
98
|
-
"+#{child_node[:name].ljust(40)}".light_magenta.bold
|
99
|
-
end
|
100
|
-
|
101
|
-
table_content << output
|
93
|
+
menu.add calls[child]
|
102
94
|
end
|
103
95
|
|
104
|
-
|
96
|
+
menu.render
|
105
97
|
print "\n"
|
106
98
|
end
|
107
|
-
|
108
|
-
def table(items, item_width)
|
109
|
-
_, screen_width = IO.console.winsize
|
110
|
-
items_per_row = screen_width / item_width
|
111
|
-
items_dup = items.dup
|
112
|
-
|
113
|
-
puts items_dup.shift(items_per_row).join until items_dup.empty?
|
114
|
-
end
|
115
99
|
end
|
116
100
|
end
|
data/lib/command_tree/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: command_tree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Emad Elsaid
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-09-
|
11
|
+
date: 2018-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -86,6 +86,9 @@ files:
|
|
86
86
|
- bin/setup
|
87
87
|
- command_tree.gemspec
|
88
88
|
- lib/command_tree.rb
|
89
|
+
- lib/command_tree/command.rb
|
90
|
+
- lib/command_tree/group.rb
|
91
|
+
- lib/command_tree/text_menu.rb
|
89
92
|
- lib/command_tree/tree.rb
|
90
93
|
- lib/command_tree/version.rb
|
91
94
|
homepage: https://www.github.com/emad-elsaid/command_tree
|