vagrant-wizard 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -5
- data/README.md +44 -20
- data/lib/vagrant-wizard.rb +59 -6
- data/lib/vagrant-wizard/commands/wizard.rb +14 -104
- data/lib/vagrant-wizard/config.rb +11 -11
- data/lib/vagrant-wizard/inputs/confirm.rb +2 -0
- data/lib/vagrant-wizard/inputs/password.rb +2 -0
- data/lib/vagrant-wizard/inputs/prompt.rb +2 -0
- data/lib/vagrant-wizard/inputs/select.rb +2 -0
- data/lib/vagrant-wizard/plugin.rb +0 -1
- data/lib/vagrant-wizard/prompt-display.rb +225 -0
- data/lib/vagrant-wizard/prompt-parser.rb +1 -1
- data/lib/vagrant-wizard/version.rb +3 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c183815a69a812fc4d310b0e52541bfe78ac6941a5e54602dafcb8c14377b41
|
4
|
+
data.tar.gz: c45e43ba46124236729f44cd5bbebd336a054ad1f574f73aff40758779aafae9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 97ef469ce8de5218e80286a5f9d4f6f4db2cc60a155549fc50cbb8739c274fee16c109060b1dee25cf94be83078624cb0cc115e3c9cb18b9c9f5216c51c92169
|
7
|
+
data.tar.gz: d4799435b5f6a1b388754ba9ffed8ad1e1f1bb65b27e108d98e1cd4e407796405131e47b10d5bcf31bac6f1ad46c79ab79d793059e055e68ffc8f571da75c156
|
data/Gemfile.lock
CHANGED
@@ -28,7 +28,8 @@ GIT
|
|
28
28
|
PATH
|
29
29
|
remote: .
|
30
30
|
specs:
|
31
|
-
vagrant-wizard (0.
|
31
|
+
vagrant-wizard (0.2.15)
|
32
|
+
tty-prompt (~> 0.19.0)
|
32
33
|
|
33
34
|
GEM
|
34
35
|
remote: https://rubygems.org/
|
@@ -78,7 +79,6 @@ GEM
|
|
78
79
|
pastel (0.7.3)
|
79
80
|
equatable (~> 0.6)
|
80
81
|
tty-color (~> 0.5)
|
81
|
-
rake (10.5.0)
|
82
82
|
rb-fsevent (0.10.3)
|
83
83
|
rb-inotify (0.10.0)
|
84
84
|
ffi (~> 1.0)
|
@@ -132,9 +132,6 @@ PLATFORMS
|
|
132
132
|
x64-mingw32
|
133
133
|
|
134
134
|
DEPENDENCIES
|
135
|
-
bundler (~> 1.17)
|
136
|
-
rake (~> 10)
|
137
|
-
tty-prompt
|
138
135
|
vagrant!
|
139
136
|
vagrant-wizard!
|
140
137
|
|
data/README.md
CHANGED
@@ -4,14 +4,14 @@ Vagrant plugin to easily generate configuration files.
|
|
4
4
|
## Overview
|
5
5
|
Vagrant Wizard allows users to generate YAML configuration files for their
|
6
6
|
Vagrant environments using a predefined set of prompts described in a
|
7
|
-
**
|
7
|
+
**config.wizard.yml** file.
|
8
8
|
|
9
9
|
## Usage
|
10
|
-
By default, prompts are defined in **
|
10
|
+
By default, prompts are defined in **config.wizard.yml** and determine which
|
11
11
|
information is requested from the user. The path to this file can be changed
|
12
12
|
in your vagrantfile.
|
13
13
|
|
14
|
-
An example **
|
14
|
+
An example **config.wizard.yml** for a MEAN localdev environment might be:
|
15
15
|
|
16
16
|
---
|
17
17
|
prompts:
|
@@ -50,10 +50,10 @@ If the user passed the ``--advanced`` flag they will also be prompted
|
|
50
50
|
to select the amount of memory to allow the virtual machine to use.
|
51
51
|
|
52
52
|
Upon completing the prompts, a new YAML file is created containing the values
|
53
|
-
entered by the user. By default, this file is named **
|
53
|
+
entered by the user. By default, this file is named **config.yml**.
|
54
54
|
|
55
55
|
### Prompts
|
56
|
-
The **
|
56
|
+
The **config.wizard.yml** file has only a ``prompts`` key which contains
|
57
57
|
a list of prompt definitions. Each prompt can accept the following fields:
|
58
58
|
|
59
59
|
|Field |Description |
|
@@ -101,21 +101,20 @@ correspond to one of the ``value``s specified in the ``choices`` field.
|
|
101
101
|
### Default Configuration
|
102
102
|
Occasionally there will be a need to store values in a configuration file that
|
103
103
|
do not actually require user input. These configurations can be specified in
|
104
|
-
**
|
104
|
+
**config.defaults.yml**, and will automatically be passed to any
|
105
105
|
configuration file that gets generated using Vagrant Wizard.
|
106
106
|
|
107
|
-
If the configuration provided by **
|
108
|
-
|
109
|
-
|
110
|
-
**vagrant-wizard.default.yml**.
|
107
|
+
If the configuration provided by **config.defaults.yml** conflicts with the
|
108
|
+
configuration specified by the user, the configuration specified by the user
|
109
|
+
will overwrite the configuration specified in **config.defaults.yml**.
|
111
110
|
|
112
111
|
### Presets
|
113
112
|
Preset configurations can be created and stored in the **wizard-presets**
|
114
113
|
directory. A preset is a YAML file whose filename ends in *.preset.yml* and
|
115
114
|
which contains a list of key/value pairs which can be automatically used to
|
116
|
-
answer prompts specified in **
|
115
|
+
answer prompts specified in **config.wizard.yml**.
|
117
116
|
|
118
|
-
For example, a preset for the example **
|
117
|
+
For example, a preset for the example **config.wizard.yml** file above might
|
119
118
|
be named ``node-10.preset.yml`` and look like this:
|
120
119
|
|
121
120
|
meta:
|
@@ -136,11 +135,36 @@ vagrantfile.
|
|
136
135
|
|
137
136
|
The following configuration options are available:
|
138
137
|
|
139
|
-
|Config |Description |Default
|
140
|
-
|
141
|
-
|``
|
142
|
-
|``defaults_path`` |Path to
|
143
|
-
|``
|
144
|
-
|``presets_dir_path``|Path to presets directory |``./wizard-presets``
|
145
|
-
|``prompt_overwrite``|Whether or not to prompt for confirmation before overwriting config file|``true``
|
146
|
-
|``prompt_presets`` |Whether or not to prompt for preset selection |``true``
|
138
|
+
|Config |Description |Default |
|
139
|
+
|--------------------|------------------------------------------------------------------------|-------------------------|
|
140
|
+
|``wizard_path`` |Path to Vagrant Wizard config file |``./config.wizard.yml`` |
|
141
|
+
|``defaults_path`` |Path to configuration defaults file |``./config.defaults.yml``|
|
142
|
+
|``config_path`` |Path to output configuration file |``./config.yml`` |
|
143
|
+
|``presets_dir_path``|Path to presets directory |``./wizard-presets`` |
|
144
|
+
|``prompt_overwrite``|Whether or not to prompt for confirmation before overwriting config file|``true`` |
|
145
|
+
|``prompt_presets`` |Whether or not to prompt for preset selection |``true`` |
|
146
|
+
|
147
|
+
You may find yourself in an interesting predicament when trying to run
|
148
|
+
``vagrant wizard`` for the first time. The ``wizard`` command requires
|
149
|
+
configuration information from your Vagrantfile to function, but your
|
150
|
+
Vagrantfile may not function without a configuration file present.
|
151
|
+
|
152
|
+
In these cases, you can use Vagrant Wizard's ``API`` object in your Vagrantfile
|
153
|
+
to force the wizard to appear if a configuration file does not already exist:
|
154
|
+
|
155
|
+
# Top of vagrantfile
|
156
|
+
settings = nil
|
157
|
+
if Vagrant.has_plugin?('vagrant-wizard')
|
158
|
+
require 'vagrant-wizard'
|
159
|
+
settings = (VagrantWizard::API.new).require_config
|
160
|
+
end
|
161
|
+
# Optionally attempt to load ./config.yml manually here if 'vagrant-wizard' is not installed.
|
162
|
+
# ...
|
163
|
+
if settings == nil
|
164
|
+
puts "No configuration file found at ./config.yml"
|
165
|
+
exit
|
166
|
+
end
|
167
|
+
# Proceed with regular Vagrant configuration
|
168
|
+
Vagrant.require_version ">= 2.1.2"
|
169
|
+
Vagrant.configure("2") do |config|
|
170
|
+
...
|
data/lib/vagrant-wizard.rb
CHANGED
@@ -1,8 +1,61 @@
|
|
1
|
+
require 'tty-prompt'
|
2
|
+
|
1
3
|
module VagrantWizard
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
require_relative 'vagrant-wizard/version'
|
5
|
+
require_relative 'vagrant-wizard/plugin'
|
6
|
+
require_relative 'vagrant-wizard/config'
|
7
|
+
require_relative 'vagrant-wizard/prompt-display'
|
8
|
+
|
9
|
+
class API
|
10
|
+
attr_accessor :config_path
|
11
|
+
attr_accessor :defaults_path
|
12
|
+
attr_accessor :wizard_path
|
13
|
+
attr_accessor :presets_dir_path
|
14
|
+
attr_accessor :prompt_presets
|
15
|
+
attr_accessor :prompt_overwrite
|
16
|
+
attr_accessor :advanced
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@config_path = './config.yml'
|
20
|
+
@defaults_path = './config.defaults.yml'
|
21
|
+
@wizard_path = './config.wizard.yml'
|
22
|
+
@presets_dir_path = './wizard-presets'
|
23
|
+
@prompt_presets = true
|
24
|
+
@prompt_overwrite = true
|
25
|
+
@advanced = false
|
26
|
+
end
|
27
|
+
|
28
|
+
def require_config
|
29
|
+
if File.exist?(@config_path)
|
30
|
+
return YAML.load_file(@config_path)
|
31
|
+
end
|
32
|
+
|
33
|
+
puts "You do not have a configuration file set up for this Vagrant environment."
|
34
|
+
|
35
|
+
confirmationString = 'Would you like to create a configuration file using Vagrant Wizard?'
|
36
|
+
confirmation = TTY::Prompt.new
|
37
|
+
|
38
|
+
if (confirmation.yes?(confirmationString))
|
39
|
+
promptDisplay = PromptDisplay.new
|
40
|
+
|
41
|
+
promptDisplay.wizard_path = @wizard_path
|
42
|
+
promptDisplay.defaults_path = @defaults_path
|
43
|
+
promptDisplay.presets_dir_path = @presets_dir_path
|
44
|
+
promptDisplay.config_path = @config_path
|
45
|
+
promptDisplay.prompt_presets = @prompt_presets
|
46
|
+
promptDisplay.prompt_overwrite = @prompt_overwrite
|
47
|
+
promptDisplay.advanced = @advanced
|
48
|
+
|
49
|
+
promptDisplay.display
|
50
|
+
|
51
|
+
# User has been prompted, check again for config file.
|
52
|
+
if File.exist?(@config_path)
|
53
|
+
return YAML.load_file(@config_path)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
return nil
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
8
61
|
end
|
@@ -1,8 +1,11 @@
|
|
1
1
|
require 'vagrant'
|
2
2
|
require 'tty-prompt'
|
3
3
|
|
4
|
-
require 'vagrant-wizard'
|
5
|
-
require '
|
4
|
+
require 'vagrant-wizard'
|
5
|
+
require 'vagrant-wizard/loader'
|
6
|
+
require 'vagrant-wizard/prompt-parser'
|
7
|
+
|
8
|
+
require 'yaml'
|
6
9
|
|
7
10
|
module VagrantWizard
|
8
11
|
module Commands
|
@@ -22,110 +25,17 @@ module VagrantWizard
|
|
22
25
|
end
|
23
26
|
|
24
27
|
def execute
|
25
|
-
|
26
|
-
if (loader.data == nil)
|
27
|
-
puts "Wizard config file cannot be found!"
|
28
|
-
return
|
29
|
-
end
|
30
|
-
|
31
|
-
defaultData = Hash.new
|
32
|
-
if (File.exist?(@config.defaults_path))
|
33
|
-
defaultData = YAML.load(File.read(@config.defaults_path))
|
34
|
-
end
|
35
|
-
|
36
|
-
presets = Hash.new
|
37
|
-
presets['(None)'] = {}
|
38
|
-
preset = nil;
|
39
|
-
if (@config.prompt_presets == true && Dir.exist?(@config.presets_dir_path))
|
40
|
-
presetPrompt = TTY::Prompt.new
|
41
|
-
showPresets = presetPrompt.yes?("Select from a preset configuration?")
|
42
|
-
if (showPresets == true)
|
43
|
-
presetFilesYml = Dir["#{@config.presets_dir_path}/*.preset.yml"]
|
44
|
-
presetFilesYaml = Dir["#{@config.presets_dir_path}/*.preset.yaml"]
|
45
|
-
presetFiles = presetFilesYml + presetFilesYaml
|
46
|
-
|
47
|
-
presetFiles.each do |presetFile|
|
48
|
-
presetData = YAML.load(File.read(presetFile))
|
49
|
-
# Skip preset definitions that do not have a meta section
|
50
|
-
if (presetData == false || !presetData.key?('meta'))
|
51
|
-
next
|
52
|
-
end
|
53
|
-
presets[presetData['meta']['name']] = presetData['config']
|
54
|
-
end
|
55
|
-
|
56
|
-
presetChoice = TTY::Prompt.new
|
57
|
-
preset = presetChoice.select('Select a preset', presets)
|
58
|
-
end
|
59
|
-
end
|
28
|
+
promptDisplay = PromptDisplay.new
|
60
29
|
|
61
|
-
|
30
|
+
promptDisplay.wizard_path = @config.wizard_path
|
31
|
+
promptDisplay.defaults_path = @config.defaults_path
|
32
|
+
promptDisplay.presets_dir_path = @config.presets_dir_path
|
33
|
+
promptDisplay.config_path = @config.config_path
|
34
|
+
promptDisplay.prompt_presets = @config.prompt_presets
|
35
|
+
promptDisplay.prompt_overwrite = @config.prompt_overwrite
|
36
|
+
promptDisplay.advanced = @advanced
|
62
37
|
|
63
|
-
|
64
|
-
presetData = nil
|
65
|
-
if (preset != nil)
|
66
|
-
preset.each do |preset|
|
67
|
-
if (!preset.key?('key') || !preset.key?('value'))
|
68
|
-
next
|
69
|
-
end
|
70
|
-
if (preset['key'] == prompt['key'])
|
71
|
-
presetData = preset['value']
|
72
|
-
break
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
output = nil
|
78
|
-
if (presetData != nil)
|
79
|
-
key = prompt['key']
|
80
|
-
output = presetData
|
81
|
-
else
|
82
|
-
parser = PromptParser.new(prompt)
|
83
|
-
parser.advanced = @advanced
|
84
|
-
parser.prompt()
|
85
|
-
key = parser.key
|
86
|
-
output = parser.output
|
87
|
-
end
|
88
|
-
|
89
|
-
keyParts = key.split('|');
|
90
|
-
keyName = keyParts[-1];
|
91
|
-
currentHash = outputData
|
92
|
-
keyParts[0..-2].each do |keyPart|
|
93
|
-
if !currentHash.key?(keyPart)
|
94
|
-
currentHash[keyPart] = Hash.new
|
95
|
-
end
|
96
|
-
currentHash = currentHash[keyPart]
|
97
|
-
end
|
98
|
-
currentHash[keyName] = output
|
99
|
-
end
|
100
|
-
|
101
|
-
def merge_recursively(a, b)
|
102
|
-
a.merge!(b) do |key, a_item, b_item|
|
103
|
-
if a_item.is_a?(Hash)
|
104
|
-
merge_recursively(a_item, b_item)
|
105
|
-
else
|
106
|
-
b_item
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
outputData = merge_recursively(defaultData, outputData)
|
112
|
-
|
113
|
-
outputYaml = outputData.to_yaml
|
114
|
-
canOverwrite = true
|
115
|
-
if File.exist?(@config.output_path)
|
116
|
-
if @config.prompt_overwrite == true
|
117
|
-
confirmation = TTY::Prompt.new
|
118
|
-
canOverwrite = confirmation.yes?("Overwrite your existing configuration?")
|
119
|
-
else
|
120
|
-
canOverwrite = true
|
121
|
-
end
|
122
|
-
end
|
123
|
-
if canOverwrite == true
|
124
|
-
File.open(@config.output_path, "w") do |file|
|
125
|
-
file.write outputYaml
|
126
|
-
end
|
127
|
-
end
|
128
|
-
0
|
38
|
+
promptDisplay.display
|
129
39
|
end
|
130
40
|
end
|
131
41
|
end
|
@@ -2,29 +2,29 @@ require 'vagrant'
|
|
2
2
|
|
3
3
|
module VagrantWizard
|
4
4
|
class Config < Vagrant.plugin('2', :config)
|
5
|
-
attr_accessor :
|
5
|
+
attr_accessor :wizard_path
|
6
6
|
attr_accessor :defaults_path
|
7
|
-
attr_accessor :
|
7
|
+
attr_accessor :config_path
|
8
8
|
attr_accessor :prompt_presets
|
9
9
|
attr_accessor :presets_dir_path
|
10
10
|
attr_accessor :prompt_overwrite
|
11
11
|
|
12
12
|
def initialize
|
13
|
-
@
|
13
|
+
@wizard_path = UNSET_VALUE
|
14
14
|
@defaults_path = UNSET_VALUE
|
15
|
-
@
|
15
|
+
@config_path = UNSET_VALUE
|
16
16
|
@prompt_presets = UNSET_VALUE
|
17
17
|
@presets_dir_path = UNSET_VALUE
|
18
|
-
@
|
18
|
+
@prompt_overwrite = UNSET_VALUE
|
19
19
|
end
|
20
20
|
|
21
21
|
def finalize!
|
22
|
-
@
|
23
|
-
@defaults_path = './
|
24
|
-
@
|
25
|
-
@prompt_presets = true
|
26
|
-
@presets_dir_path = './wizard-presets'
|
27
|
-
@prompt_overwrite = true
|
22
|
+
@wizard_path = './config.wizard.yml' if @wizard_path == UNSET_VALUE
|
23
|
+
@defaults_path = './config.defaults.yml' if @defaults_path == UNSET_VALUE
|
24
|
+
@config_path = './config.yml' if @config_path == UNSET_VALUE
|
25
|
+
@prompt_presets = true if @prompt_presets == UNSET_VALUE
|
26
|
+
@presets_dir_path = './wizard-presets' if @presets_dir_path == UNSET_VALUE
|
27
|
+
@prompt_overwrite = true if @prompt_overwrite == UNSET_VALUE
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
@@ -0,0 +1,225 @@
|
|
1
|
+
require 'tty-prompt'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
require 'vagrant-wizard'
|
5
|
+
require 'vagrant-wizard/prompt-parser'
|
6
|
+
|
7
|
+
module VagrantWizard
|
8
|
+
|
9
|
+
class PromptDisplay
|
10
|
+
attr_accessor :defaults_path
|
11
|
+
attr_accessor :wizard_path
|
12
|
+
attr_accessor :config_path
|
13
|
+
attr_accessor :prompt_presets
|
14
|
+
attr_accessor :presets_dir_path
|
15
|
+
attr_accessor :prompt_overwrite
|
16
|
+
attr_accessor :advanced
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@defaults_path = nil
|
20
|
+
@wizard_path = nil
|
21
|
+
@config_path = nil
|
22
|
+
@prompt_presets = true
|
23
|
+
@presets_dir_path = nil
|
24
|
+
@prompt_overwrite = true
|
25
|
+
@advanced = false
|
26
|
+
end
|
27
|
+
|
28
|
+
def display
|
29
|
+
config = load_config_file
|
30
|
+
if config == nil
|
31
|
+
puts "Error: Wizard configuration file does not exist at `#{@wizard_path}`"
|
32
|
+
return
|
33
|
+
end
|
34
|
+
preset = nil
|
35
|
+
if @prompt_presets
|
36
|
+
preset = show_presets_prompt
|
37
|
+
end
|
38
|
+
results = Hash.new
|
39
|
+
config['prompts'].each do |prompt|
|
40
|
+
result = display_prompt(prompt, preset)
|
41
|
+
results = insert_prompt_output(result, results)
|
42
|
+
end
|
43
|
+
defaults = load_default_config
|
44
|
+
if defaults != nil
|
45
|
+
results = merge_recursively(defaults, results)
|
46
|
+
end
|
47
|
+
|
48
|
+
output_results(results)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
# Loads the wizard configuration file and returns a hash of its data.
|
54
|
+
#
|
55
|
+
# If file does not exist, nil is returned.
|
56
|
+
def load_config_file
|
57
|
+
if File.exist?(@wizard_path)
|
58
|
+
return YAML.load_file(@wizard_path)
|
59
|
+
end
|
60
|
+
return nil
|
61
|
+
end
|
62
|
+
|
63
|
+
# Loads the default configuration file and returns a hash of its data.
|
64
|
+
#
|
65
|
+
# If file does not exist, nil is returned.
|
66
|
+
def load_default_config
|
67
|
+
if (File.exist?(@defaults_path))
|
68
|
+
return YAML.load_file(@defaults_path)
|
69
|
+
end
|
70
|
+
return nil
|
71
|
+
end
|
72
|
+
|
73
|
+
# Displays the presets prompt
|
74
|
+
#
|
75
|
+
# If the specified presets path does not exist, no prompt is shown and nil
|
76
|
+
# is returned.
|
77
|
+
#
|
78
|
+
# If the user declines to select a preset, nil is returned.
|
79
|
+
def show_presets_prompt
|
80
|
+
# Short-circuit if presets path is not specified or does not exist
|
81
|
+
if @presets_dir_path == nil || !Dir.exist?(@presets_dir_path)
|
82
|
+
return nil
|
83
|
+
end
|
84
|
+
|
85
|
+
# Ask user if they want to select a preset
|
86
|
+
confirmationString = "Select a configuration preset?"
|
87
|
+
confirmationPrompt = TTY::Prompt.new
|
88
|
+
|
89
|
+
if confirmationPrompt.yes?(confirmationString)
|
90
|
+
presets = get_presets(true)
|
91
|
+
presetSelectionString = "Select a preset"
|
92
|
+
presetSelectionPrompt = TTY::Prompt.new
|
93
|
+
return presetSelectionPrompt.select(presetSelectionString, presets)
|
94
|
+
end
|
95
|
+
|
96
|
+
return nil
|
97
|
+
end
|
98
|
+
|
99
|
+
# Gets a hash of available presets.
|
100
|
+
#
|
101
|
+
# Optionally includes a '(None)' option.
|
102
|
+
def get_presets(includeNone = false)
|
103
|
+
presets = Hash.new
|
104
|
+
|
105
|
+
# Add '(None)' entry if requested.
|
106
|
+
if includeNone == true
|
107
|
+
presets['(None)'] = {}
|
108
|
+
end
|
109
|
+
|
110
|
+
# Short-circuit if presets path is not specified or does not exist.
|
111
|
+
if @presets_dir_path == nil || !Dir.exist?(@presets_dir_path)
|
112
|
+
return presets
|
113
|
+
end
|
114
|
+
|
115
|
+
# Get all *.preset.yml and *.preset.yaml files in presets dir
|
116
|
+
presetFilesYml = Dir["#{@presets_dir_path}/*.preset.yml"]
|
117
|
+
presetFilesYaml = Dir["#{@presets_dir_path}/*.preset.yaml"]
|
118
|
+
presetFiles = presetFilesYml + presetFilesYaml
|
119
|
+
|
120
|
+
# Iterate each preset file
|
121
|
+
presetFiles.each do |presetFile|
|
122
|
+
presetData = YAML.load_file(presetFile)
|
123
|
+
# Skip this preset if YAML load failed or if data is missing.
|
124
|
+
if (presetData == false || !presetData.key?('meta'))
|
125
|
+
next
|
126
|
+
end
|
127
|
+
if (!presetData['meta'].key?('name') || !presetData.key?('config'))
|
128
|
+
next
|
129
|
+
end
|
130
|
+
# Add this preset
|
131
|
+
presets[presetData['meta']['name']] = presetData['config']
|
132
|
+
end
|
133
|
+
|
134
|
+
return presets
|
135
|
+
end
|
136
|
+
|
137
|
+
# Displays a single prompt and returns the result.
|
138
|
+
def display_prompt(prompt, preset = nil)
|
139
|
+
presetData = nil
|
140
|
+
if (preset != nil)
|
141
|
+
# Fetch preset data if it exists.
|
142
|
+
preset.each do |preset|
|
143
|
+
if (preset_has_key(preset, prompt['key']))
|
144
|
+
presetData = preset['value']
|
145
|
+
break
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
# Return preset data if it exists.
|
151
|
+
if (presetData != nil)
|
152
|
+
return { 'key' => prompt['key'], 'value' => presetData }
|
153
|
+
end
|
154
|
+
|
155
|
+
promptParser = PromptParser.new(prompt)
|
156
|
+
promptParser.advanced = @advanced
|
157
|
+
promptParser.prompt()
|
158
|
+
|
159
|
+
return { 'key' => promptParser.key, 'value' => promptParser.output }
|
160
|
+
end
|
161
|
+
|
162
|
+
# Determines if the given preset has the given key
|
163
|
+
def preset_has_key(preset, key)
|
164
|
+
if (!preset.key?('key'))
|
165
|
+
return false
|
166
|
+
end
|
167
|
+
return preset['key'] == key
|
168
|
+
end
|
169
|
+
|
170
|
+
# Inserts prompt result into a hash of output and returns the result.
|
171
|
+
def insert_prompt_output(new_output, existing_output)
|
172
|
+
key = new_output['key']
|
173
|
+
keyParts = key.split('|')
|
174
|
+
keyName = keyParts[-1]
|
175
|
+
currentHash = existing_output
|
176
|
+
|
177
|
+
keyParts[0..-2].each do |keyPart|
|
178
|
+
# Create new key if it does not exist.
|
179
|
+
if !currentHash.key?(keyPart)
|
180
|
+
currentHash[keyPart] = Hash.new
|
181
|
+
end
|
182
|
+
# Reset current hash
|
183
|
+
currentHash = currentHash[keyPart]
|
184
|
+
end
|
185
|
+
currentHash[keyName] = new_output['value']
|
186
|
+
|
187
|
+
return existing_output
|
188
|
+
end
|
189
|
+
|
190
|
+
# Merges two hashes recursively, with B taking precedence over A.
|
191
|
+
def merge_recursively(a, b)
|
192
|
+
a.merge!(b) do |key, a_item, b_item|
|
193
|
+
if a_item.is_a?(Hash)
|
194
|
+
merge_recursively(a_item, b_item)
|
195
|
+
else
|
196
|
+
b_item
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
# Output results
|
202
|
+
def output_results(results)
|
203
|
+
shouldWrite = true
|
204
|
+
if File.exist?(@config_path)
|
205
|
+
if @prompt_overwrite == true
|
206
|
+
confirmation = TTY::Prompt.new
|
207
|
+
confirmationString = 'Overwrite existing configuration file?'
|
208
|
+
shouldWrite = confirmation.yes?(confirmationString)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
if shouldWrite == true
|
213
|
+
File.open(@config_path, 'w') do |file|
|
214
|
+
file.write results.to_yaml
|
215
|
+
puts "Output configuration to `#{@config_path}`"
|
216
|
+
return
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
puts "Output discarded"
|
221
|
+
end
|
222
|
+
|
223
|
+
end
|
224
|
+
|
225
|
+
end
|
@@ -15,7 +15,7 @@ class VagrantWizard::PromptParser
|
|
15
15
|
promptQuestion = @prompt['prompt']
|
16
16
|
|
17
17
|
begin
|
18
|
-
|
18
|
+
require "vagrant-wizard/inputs/#{promptType}"
|
19
19
|
rescue LoadError
|
20
20
|
puts "Unable to process input type '#{promptType}'"
|
21
21
|
if @prompt.key?('default')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-wizard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joe D'Amore
|
@@ -78,6 +78,7 @@ files:
|
|
78
78
|
- lib/vagrant-wizard/inputs/select.rb
|
79
79
|
- lib/vagrant-wizard/loader.rb
|
80
80
|
- lib/vagrant-wizard/plugin.rb
|
81
|
+
- lib/vagrant-wizard/prompt-display.rb
|
81
82
|
- lib/vagrant-wizard/prompt-parser.rb
|
82
83
|
- lib/vagrant-wizard/version.rb
|
83
84
|
- vagrant-wizard.gemspec
|