vagrant-plugins 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +6 -0
- data/README.md +8 -3
- data/lib/vagrant-plugins/command.rb +48 -2
- data/lib/vagrant-plugins/ui.rb +130 -43
- data/lib/vagrant-plugins/version.rb +1 -1
- metadata +2 -2
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
# v0.2.0
|
2
|
+
|
3
|
+
* Adds a verbose flag. Informs about plugin features such as "provides commands" or "action hook" etc.
|
4
|
+
* Adds a `--no-heads` flag. Swicth off the column descriptions.
|
5
|
+
* Revamped the internal UI component to use a nifty DSL to describe the column layout.
|
6
|
+
|
1
7
|
# v0.1.0
|
2
8
|
|
3
9
|
* simple list of all loaded plugin names
|
data/README.md
CHANGED
@@ -3,20 +3,23 @@ vagrant-plugins
|
|
3
3
|
|
4
4
|
A vagrant plugin to list active vagrant plugins.
|
5
5
|
|
6
|
+
Since *vagrant 1.1* (which is not yet released) you need to specify which plugins you want to load. You may either use the global `.vagrant.rc` file or the projects `Vagrantfile`.
|
7
|
+
This can get a bit confusing when having a lot of different configurations or projects.
|
6
8
|
|
9
|
+
This plugin aims to help you keeping track of which plugins are loaded in your project.
|
7
10
|
|
8
11
|
## Installation
|
9
12
|
|
10
13
|
If you use the gem version of Vagrant, use:
|
11
14
|
|
12
15
|
```bash
|
13
|
-
$ gem install vagrant-
|
16
|
+
$ gem install vagrant-plugins
|
14
17
|
```
|
15
18
|
|
16
19
|
otherwise, use:
|
17
20
|
|
18
21
|
```bash
|
19
|
-
$ vagrant gem install vagrant-
|
22
|
+
$ vagrant gem install vagrant-plugins
|
20
23
|
```
|
21
24
|
|
22
25
|
And add this line to your `.vagrantrc` or `Vagrantfile`:
|
@@ -28,9 +31,11 @@ Vagrant.require_plugin 'vagrant-plugins'
|
|
28
31
|
## Usage
|
29
32
|
|
30
33
|
```bash
|
31
|
-
$ vagrant plugins
|
34
|
+
$ vagrant plugins [-a|--all]
|
32
35
|
```
|
33
36
|
|
37
|
+
* `-a|--all` : Display *vagrant's* builtin plugins as well.
|
38
|
+
|
34
39
|
## Contributing
|
35
40
|
|
36
41
|
1. Fork it
|
@@ -12,6 +12,14 @@ module VagrantPlugininspection
|
|
12
12
|
opts.on("-a", "--all", "List builtin vagrant plugins as well.") do
|
13
13
|
options[:all] = true
|
14
14
|
end
|
15
|
+
|
16
|
+
opts.on("-H", "--no-head", "Do not print descriptive headings") do
|
17
|
+
options[:no_heads] = true
|
18
|
+
end
|
19
|
+
|
20
|
+
opts.on("-v", "--verbose", "Be verbose and display plugin features") do
|
21
|
+
options[:verbose] = true
|
22
|
+
end
|
15
23
|
end
|
16
24
|
|
17
25
|
argv = parse_options(opts)
|
@@ -29,14 +37,52 @@ module VagrantPlugininspection
|
|
29
37
|
|
30
38
|
plugins = Vagrant.plugin("1").registered.map { |plugin|
|
31
39
|
if options[:all] || !builtins.include?(plugin)
|
32
|
-
{
|
40
|
+
info = {
|
33
41
|
:name => plugin.name,
|
34
42
|
:description => plugin.description
|
35
43
|
}
|
44
|
+
|
45
|
+
info.merge!({
|
46
|
+
:hosts => !!plugin.data[:hosts],
|
47
|
+
:guests => !!plugin.data[:guests],
|
48
|
+
:provisioners => !!plugin.data[:provisioners],
|
49
|
+
:commands => !!plugin.data[:command],
|
50
|
+
:action_hooks => !!plugin.data[:action_hooks],
|
51
|
+
:configs => !!plugin.data[:config],
|
52
|
+
}) if options[:verbose]
|
53
|
+
|
54
|
+
# return the plugins info Hash
|
55
|
+
info
|
36
56
|
end
|
37
57
|
}.compact
|
38
58
|
|
39
|
-
|
59
|
+
if options[:verbose] && !options[:no_heads]
|
60
|
+
head = <<-EOS
|
61
|
+
+- hosts
|
62
|
+
|+- guests
|
63
|
+
||+- provisioners
|
64
|
+
|||+- commands
|
65
|
+
||||+- action_hooks
|
66
|
+
|||||+- configs
|
67
|
+
EOS
|
68
|
+
ui.info head, :prefix => false
|
69
|
+
end
|
70
|
+
|
71
|
+
ui.print_columns(plugins, :heads => !options[:no_heads]) do
|
72
|
+
if options[:verbose]
|
73
|
+
column :hosts, :name => '|'
|
74
|
+
column :guests, :name => '|'
|
75
|
+
column :provisioners, :name => '|'
|
76
|
+
column :commands, :name => '|'
|
77
|
+
column :action_hooks, :name => '|'
|
78
|
+
column :configs, :name => '|'
|
79
|
+
seperator "\t"
|
80
|
+
end
|
81
|
+
column :name
|
82
|
+
seperator "\t"
|
83
|
+
column :description
|
84
|
+
end
|
85
|
+
|
40
86
|
end
|
41
87
|
end
|
42
88
|
|
data/lib/vagrant-plugins/ui.rb
CHANGED
@@ -2,29 +2,9 @@ module VagrantPlugininspection
|
|
2
2
|
module UI
|
3
3
|
class Columnized < Vagrant::UI::Colored
|
4
4
|
|
5
|
-
|
6
|
-
defaults = { :new_line => true, :prefix => true }
|
7
|
-
opts = defaults.merge(opts || {})
|
8
|
-
super
|
9
|
-
end
|
10
|
-
|
11
|
-
def print_columns(data, opts=nil)
|
12
|
-
defaults = { :prefix => false }
|
13
|
-
opts = defaults.merge(opts ||= {})
|
14
|
-
|
15
|
-
columns = opts.delete(:column_order)
|
16
|
-
|
17
|
-
data = clean(data, opts)
|
18
|
-
size = sizes(data)
|
5
|
+
class LayoutError < StandardError; end
|
19
6
|
|
20
|
-
|
21
|
-
table_head << (table_head.gsub(/[^\t]/, '-')) + "\n"
|
22
|
-
table_body = data.map { |line| columnize_row(line, size, columns) }.join("\n")
|
23
|
-
|
24
|
-
say :info, table_head << table_body, opts
|
25
|
-
end
|
26
|
-
|
27
|
-
protected
|
7
|
+
class Layout
|
28
8
|
|
29
9
|
BOOL_MAP = {
|
30
10
|
true => '*',
|
@@ -32,32 +12,139 @@ module VagrantPlugininspection
|
|
32
12
|
nil => ''
|
33
13
|
}
|
34
14
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
15
|
+
# @param [Array] _optional_ Array with column names for a simple layout. Columns will be seperated by tab.
|
16
|
+
def initialize(simple=nil)
|
17
|
+
simple.each { |column|
|
18
|
+
self.column(column)
|
19
|
+
self.seperator("\t")
|
20
|
+
} if simple
|
21
|
+
|
22
|
+
@heads = Hash.new
|
23
|
+
@columns = Hash.new
|
24
|
+
@stack = Array.new
|
42
25
|
end
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
26
|
+
|
27
|
+
# Adds a column definition to the current position
|
28
|
+
def column(key, opts=nil)
|
29
|
+
defaults = { :name => key.to_s }
|
30
|
+
opts = defaults.merge(opts || {})
|
31
|
+
|
32
|
+
@heads[key] = opts[:name]
|
33
|
+
@columns[key] = opts
|
34
|
+
@stack << key
|
35
|
+
end
|
36
|
+
|
37
|
+
# Adds a seperator to the current position
|
38
|
+
def seperator(str)
|
39
|
+
@stack << str.to_s
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns an Array of columns formatted lines.
|
43
|
+
# Also includes column headers and horizonal header line.
|
44
|
+
# @return [Array] Returns an Array of formatted lines
|
45
|
+
def rows(data, opts=nil)
|
46
|
+
defaults = { :heads => true }
|
47
|
+
opts = defaults.merge(opts || {})
|
48
|
+
|
49
|
+
data = clean(data)
|
50
|
+
size = sizes(data)
|
51
|
+
|
52
|
+
rendered = Array.new
|
53
|
+
if opts.delete(:heads)
|
54
|
+
rendered << columnize_row(@heads, size)
|
55
|
+
rendered << horizontal_line(size)
|
56
|
+
end
|
57
|
+
rendered << data.map { |line| columnize_row(line, size) }
|
58
|
+
|
59
|
+
# return a flat Array with lines
|
60
|
+
rendered.flatten
|
61
|
+
end
|
62
|
+
|
63
|
+
protected
|
64
|
+
|
65
|
+
def column_name(key)
|
66
|
+
col = @heads[key]
|
67
|
+
(col || key).to_s
|
68
|
+
end
|
69
|
+
|
70
|
+
# translate boolean values using BOOL_MAP
|
71
|
+
# strips whitespace and newline
|
72
|
+
def clean(data)
|
73
|
+
data.map{|line|
|
74
|
+
Hash[line.map{ |col|
|
75
|
+
col[1] = BOOL_MAP[col[1]] || col[1].to_s.strip.gsub(/^\s+|\s+$/, '').gsub(/\n|\r/,' ')
|
76
|
+
col
|
77
|
+
}]
|
78
|
+
}
|
79
|
+
end
|
80
|
+
|
81
|
+
# determinate the size of each column
|
82
|
+
def sizes(data)
|
83
|
+
s = {}
|
84
|
+
data.each { |line|
|
85
|
+
line.each_pair { |key, value|
|
86
|
+
s[key] = [column_name(key).length, value.length, (s[key] || 0)].max
|
87
|
+
}
|
49
88
|
}
|
50
|
-
|
51
|
-
|
89
|
+
s
|
90
|
+
end
|
91
|
+
|
92
|
+
def columnize_row(row, sizes)
|
93
|
+
@stack.map { |piece|
|
94
|
+
if piece.is_a? String
|
95
|
+
piece
|
96
|
+
else
|
97
|
+
sprintf "%-#{sizes[piece]}s", row[piece]
|
98
|
+
end
|
99
|
+
}.join
|
100
|
+
end
|
101
|
+
|
102
|
+
def horizontal_line(sizes)
|
103
|
+
@stack.map { |piece|
|
104
|
+
if piece.is_a? String
|
105
|
+
piece
|
106
|
+
else
|
107
|
+
'-' * sizes[piece]
|
108
|
+
end
|
109
|
+
}.join
|
110
|
+
end
|
111
|
+
|
112
|
+
end # Layout
|
113
|
+
|
114
|
+
def print_columns(data, opts=nil, &block)
|
115
|
+
defaults = {}
|
116
|
+
opts = defaults.merge(opts ||= {})
|
117
|
+
layout = opts.delete(:layout)
|
118
|
+
columns = opts.delete(:columns)
|
119
|
+
|
120
|
+
layout ||= if block_given?
|
121
|
+
self.layout(&block)
|
122
|
+
elsif columns && !columns.empty?
|
123
|
+
Layout.new(columns)
|
124
|
+
else
|
125
|
+
raise LayoutError, "You need to pass a layout information, either as a block or array."
|
52
126
|
end
|
53
127
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
128
|
+
rendered = layout.rows(data, opts).map { |line|
|
129
|
+
format_message(:info, line, opts)
|
130
|
+
}.join("\n")
|
131
|
+
|
132
|
+
# force the prefix off, we'd allready handled that
|
133
|
+
opts[:prefix] = false
|
134
|
+
|
135
|
+
say :info, rendered, opts
|
136
|
+
end
|
137
|
+
|
138
|
+
protected
|
58
139
|
|
59
|
-
|
140
|
+
# helper to create us a Layout instance and prime using a given block
|
141
|
+
def layout(&block)
|
142
|
+
layout = Layout.new
|
143
|
+
layout.instance_eval(&block)
|
144
|
+
# return the layout descriptor
|
145
|
+
layout
|
60
146
|
end
|
61
|
-
|
147
|
+
|
148
|
+
end # Columnized
|
62
149
|
end
|
63
150
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-plugins
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
12
|
+
date: 2012-05-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: vagrant
|