puppetfile_editor 0.2.0 → 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/CHANGELOG.md +30 -0
- data/bin/pfile +16 -14
- data/lib/puppetfile_editor/cli.rb +36 -19
- data/lib/puppetfile_editor/module.rb +26 -22
- data/lib/puppetfile_editor/puppetfile.rb +32 -14
- data/lib/puppetfile_editor/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0dd06f4116c562fe9db2c70ee918c1a178cffb2c
|
4
|
+
data.tar.gz: 51ef0ec280c7fbcbb2a225528579471b1451f05b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 227795078fcb7cc4b46ba31a482aec3cfd488a92c36f8c26bc4f0e7d06e9b133854c41d37dfca389ef9410fe8f09fc247655ee4ae951a68b0ec370ad0cbda84a
|
7
|
+
data.tar.gz: 8e982d0e9ac8dab8851de23d0056f0a67c4741a8dec1b7ff6eecd53e43f2baef092399a44854b42a10b970683675e05f2961de67b83302dd9cd81dcdf40e6694
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# Changelog
|
2
|
+
All notable changes to this project will be documented in this file.
|
3
|
+
|
4
|
+
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
5
|
+
and this project adheres to [Semantic Versioning](http://semver.org/).
|
6
|
+
|
7
|
+
## [0.3.0] - 2017-09-27
|
8
|
+
### Added
|
9
|
+
- Puppetfile can be instantiated using provided contents.
|
10
|
+
- `Puppetfile#compare_with` method.
|
11
|
+
|
12
|
+
### Changed
|
13
|
+
- Removed named parameters from `Puppetfile#initialize` to support older Rubies.
|
14
|
+
- Moved all IO to `Puppetfile::CLI`.
|
15
|
+
|
16
|
+
### Fixed
|
17
|
+
- Proper status for `kept at ...` messages.
|
18
|
+
- Return earlier on `:matched` status so that no re-ordering of parameters can occur.
|
19
|
+
- Various CLI logic issues.
|
20
|
+
|
21
|
+
### Removed
|
22
|
+
- No more old_hashes support.
|
23
|
+
|
24
|
+
## [0.2.0] - 2017-09-25
|
25
|
+
### Added
|
26
|
+
- Merge function.
|
27
|
+
|
28
|
+
## [0.1.0] - 2017-09-20 [YANKED]
|
29
|
+
### Added
|
30
|
+
- Initial release.
|
data/bin/pfile
CHANGED
@@ -8,14 +8,7 @@ filename = File.basename(__FILE__)
|
|
8
8
|
# Display help if no arguments are specified
|
9
9
|
ARGV.push('-h') if ARGV.empty?
|
10
10
|
|
11
|
-
options = { puppetfile: 'Puppetfile' }
|
12
|
-
OptionParser.new do |parser|
|
13
|
-
parser.banner = "Usage: #{filename} [options] [command] [command options]"
|
14
|
-
parser.on('-v', '--[no-]verbose', 'Run verbosely') { |v| options[:verbose] = v }
|
15
|
-
parser.on('-f', '--filename PUPPETFILE', 'Path to your Puppetfile.') do |puppetfile|
|
16
|
-
options[:puppetfile] = puppetfile
|
17
|
-
end
|
18
|
-
end.order!
|
11
|
+
options = { puppetfile: './Puppetfile' }
|
19
12
|
|
20
13
|
subcommands = {
|
21
14
|
'edit' => OptionParser.new do |parser|
|
@@ -24,12 +17,7 @@ subcommands = {
|
|
24
17
|
options[:name] = setting
|
25
18
|
end
|
26
19
|
parser.on('-u', '--update PARAM=VALUE', 'What to update') do |setting|
|
27
|
-
|
28
|
-
options[:param], options[:value] = match[1], match[2]
|
29
|
-
else
|
30
|
-
warn 'Version must match PARAM=VALUE pattern'
|
31
|
-
exit 1
|
32
|
-
end
|
20
|
+
options[:version] = setting
|
33
21
|
end
|
34
22
|
end,
|
35
23
|
'format' => OptionParser.new do |parser|
|
@@ -69,6 +57,20 @@ subcommands = {
|
|
69
57
|
end,
|
70
58
|
}
|
71
59
|
|
60
|
+
OptionParser.new do |parser|
|
61
|
+
parser.banner = "Usage: #{filename} [options] [command] [command options]"
|
62
|
+
parser.separator ''
|
63
|
+
parser.separator ' Supported commands:'
|
64
|
+
subcommands.keys.each do |command|
|
65
|
+
parser.separator " * #{command}"
|
66
|
+
end
|
67
|
+
parser.separator ''
|
68
|
+
parser.separator ' Supported global options:'
|
69
|
+
parser.on('-p', '--puppetfile PUPPETFILE', 'Path to your Puppetfile.') do |puppetfile|
|
70
|
+
options[:puppetfile] = puppetfile
|
71
|
+
end
|
72
|
+
end.order!
|
73
|
+
|
72
74
|
command = ARGV.shift
|
73
75
|
subcommands[command].order!
|
74
76
|
|
@@ -4,23 +4,32 @@ module PuppetfileEditor
|
|
4
4
|
# CLI methods
|
5
5
|
class CLI
|
6
6
|
def initialize(pfile_path)
|
7
|
-
@pfile = PuppetfileEditor::Puppetfile.new(
|
7
|
+
@pfile = PuppetfileEditor::Puppetfile.new(pfile_path)
|
8
8
|
@logger = PuppetfileEditor::Logging.new
|
9
9
|
begin
|
10
10
|
@pfile.load
|
11
11
|
rescue IOError, NoMethodError => e
|
12
|
-
|
12
|
+
@logger.log_and_exit(e.message)
|
13
|
+
rescue StandardError => e
|
14
|
+
@logger.log_and_exit(e.message)
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
16
18
|
def edit(opts)
|
17
19
|
opts[:value] = :latest if opts[:value] == 'latest'
|
18
|
-
@
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
@logger.log_and_exit('Please specify module name') unless opts[:name].is_a?(String)
|
21
|
+
@logger.log_and_exit('Please specify version') unless opts[:version].is_a?(String)
|
22
|
+
if (match = opts[:version].match(/^(\w+)=([^=]+)$/))
|
23
|
+
param = match[1]
|
24
|
+
value = match[2]
|
25
|
+
else
|
26
|
+
@logger.log_and_exit('Version must match PARAM=VALUE pattern')
|
27
|
+
end
|
28
|
+
begin
|
29
|
+
@pfile.update_module(opts[:name], param, value)
|
30
|
+
rescue StandardError => e
|
31
|
+
@logger.log_and_exit(e.message)
|
32
|
+
end
|
24
33
|
@pfile.dump
|
25
34
|
end
|
26
35
|
|
@@ -49,8 +58,12 @@ module PuppetfileEditor
|
|
49
58
|
end
|
50
59
|
|
51
60
|
def merge(opts)
|
52
|
-
@pfdata = PuppetfileEditor::Puppetfile.new(
|
53
|
-
|
61
|
+
@pfdata = PuppetfileEditor::Puppetfile.new(nil, true)
|
62
|
+
begin
|
63
|
+
@pfdata.load
|
64
|
+
rescue SyntaxError
|
65
|
+
@logger.log_and_exit('Format error.')
|
66
|
+
end
|
54
67
|
new_mod_types = @pfdata.modules.values.group_by(&:type)
|
55
68
|
new_mod_types.each do |mod_type, mods|
|
56
69
|
puts "\n #{@pfile.module_sections[mod_type]}\n\n"
|
@@ -61,14 +74,11 @@ module PuppetfileEditor
|
|
61
74
|
indent = mods.map(&:name).max_by(&:length).length
|
62
75
|
mods.each do |mod|
|
63
76
|
if @pfile.modules.key? mod.name
|
64
|
-
|
65
|
-
|
66
|
-
@logger.module_log(mod.name, indent, @pfile.modules[mod.name].message, @pfile.modules[mod.name].status)
|
67
|
-
rescue StandardError => e
|
68
|
-
@logger.module_log(mod.name, indent, e.message, @pfile.modules[mod.name].status)
|
69
|
-
end
|
77
|
+
@pfile.modules[mod.name].merge_with(mod, opts[:force])
|
78
|
+
@logger.mod_message(@pfile.modules[mod.name], indent)
|
70
79
|
else
|
71
|
-
|
80
|
+
mod.set_message('does not exist in source Puppetfile', :not_found)
|
81
|
+
@logger.mod_message(mod, indent)
|
72
82
|
end
|
73
83
|
end
|
74
84
|
end
|
@@ -94,6 +104,7 @@ module PuppetfileEditor
|
|
94
104
|
not_found: "[ \e[31;1mx\e[0m ]",
|
95
105
|
type_mismatched: "[ \e[31;1mx\e[0m ]",
|
96
106
|
wont_upgrade: "[ \e[33;1m!\e[0m ]",
|
107
|
+
warn: "[ \e[31;1m!!\e[0m ]",
|
97
108
|
undef: '',
|
98
109
|
}
|
99
110
|
end
|
@@ -107,8 +118,14 @@ module PuppetfileEditor
|
|
107
118
|
puts "#{status} #{message}"
|
108
119
|
end
|
109
120
|
|
110
|
-
def
|
111
|
-
log(
|
121
|
+
def log_and_exit(message)
|
122
|
+
log(message, :warn)
|
123
|
+
exit 1
|
112
124
|
end
|
125
|
+
|
126
|
+
def mod_message(mod, indent)
|
127
|
+
log("#{mod.name.ljust(indent)} => #{mod.message}", mod.status)
|
128
|
+
end
|
129
|
+
|
113
130
|
end
|
114
131
|
end
|
@@ -31,43 +31,45 @@ module PuppetfileEditor
|
|
31
31
|
def set(param, newvalue, force = false)
|
32
32
|
case @type
|
33
33
|
when :hg, :git
|
34
|
-
if
|
34
|
+
if !force && (@params.key?(:branch) || @params.key?(:ref))
|
35
|
+
set_message("kept at (#{full_version})", :wont_upgrade)
|
36
|
+
elsif !%w[branch tag ref].include? param
|
37
|
+
set_message("only 'branch', 'tag', and 'ref' are supported for '#{@type}' modules.", :unsupported)
|
38
|
+
else
|
39
|
+
set_message("updated (#{full_version} to #{param}: #{newvalue}", :updated)
|
35
40
|
@params.delete :branch
|
36
41
|
@params.delete :tag
|
37
42
|
@params.delete :ref
|
38
43
|
@params[param.to_sym] = newvalue
|
39
44
|
calculate_indent
|
40
|
-
else
|
41
|
-
raise StandardError, "Only 'branch', 'tag', and 'ref' are supported for '#{@type}' modules."
|
42
45
|
end
|
43
46
|
when :forge
|
44
47
|
if param == 'version'
|
45
48
|
@params[:version] = newvalue
|
49
|
+
set_message("successfully set #{param} to #{newvalue} for #{@name}.", :updated)
|
46
50
|
else
|
47
|
-
|
51
|
+
set_message("only 'version' is supported for forge modules.", :unsupported)
|
48
52
|
end
|
49
53
|
else
|
50
|
-
|
54
|
+
set_message("editing params for '#{@type}' modules is not supported.", :unsupported)
|
51
55
|
end
|
52
56
|
end
|
53
57
|
|
54
58
|
def merge_with(mod, force = false)
|
55
59
|
unless mod.type == @type
|
56
|
-
@
|
57
|
-
raise(StandardError, "type mismatch ('#{@type}' vs '#{mod.type}')")
|
60
|
+
set_message("type mismatch ('#{@type}' vs '#{mod.type}')", :type_mismatched)
|
58
61
|
end
|
59
62
|
case @type
|
60
63
|
when :hg, :git
|
61
64
|
new = mod.params.reject { |param, _| param.eql? @type }
|
62
65
|
if !force && new.keys == [:tag] && (@params.key?(:branch) || @params.key?(:ref))
|
63
|
-
|
66
|
+
set_message("kept at #{full_version}", :wont_upgrade)
|
64
67
|
end
|
65
68
|
if full_version == mod.full_version
|
66
|
-
|
67
|
-
|
69
|
+
set_message("versions match (#{full_version})", :matched)
|
70
|
+
return
|
68
71
|
else
|
69
|
-
|
70
|
-
@status = :updated
|
72
|
+
set_message("updated (#{full_version} to #{mod.full_version})", :updated)
|
71
73
|
end
|
72
74
|
@params.delete_if { |param, _| [:branch, :tag, :ref].include? param }
|
73
75
|
@params.merge!(new)
|
@@ -75,25 +77,22 @@ module PuppetfileEditor
|
|
75
77
|
when :forge
|
76
78
|
unless force
|
77
79
|
if mod.params.nil? or mod.params.is_a? Symbol
|
78
|
-
|
79
|
-
raise(StandardError, "won't upgrade to #{mod.full_version}")
|
80
|
+
set_message("won't upgrade to #{mod.full_version}", :wont_upgrade)
|
80
81
|
end
|
81
82
|
end
|
82
83
|
if full_version == mod.full_version
|
83
|
-
|
84
|
-
|
84
|
+
set_message("versions match (#{full_version})", :matched)
|
85
|
+
return
|
85
86
|
else
|
86
|
-
|
87
|
-
@status = :updated
|
87
|
+
set_message("updated (#{full_version} to #{mod.full_version})", :updated)
|
88
88
|
end
|
89
89
|
@params = mod.params
|
90
90
|
else
|
91
|
-
|
92
|
-
raise(StandardError, 'only git, forge, and hg modules are supported for merging')
|
91
|
+
set_message('only git, forge, and hg modules are supported for merging', :skipped)
|
93
92
|
end
|
94
93
|
end
|
95
94
|
|
96
|
-
def dump
|
95
|
+
def dump
|
97
96
|
output = []
|
98
97
|
case @type
|
99
98
|
when :hg, :git
|
@@ -104,7 +103,7 @@ module PuppetfileEditor
|
|
104
103
|
else
|
105
104
|
"'#{param_value}'"
|
106
105
|
end
|
107
|
-
param =
|
106
|
+
param = "#{param_name}:".ljust(@indent)
|
108
107
|
output.push " #{param} #{value}"
|
109
108
|
end
|
110
109
|
when :local
|
@@ -136,6 +135,11 @@ module PuppetfileEditor
|
|
136
135
|
end
|
137
136
|
end
|
138
137
|
|
138
|
+
def set_message(message, status)
|
139
|
+
@message = message
|
140
|
+
@status = status
|
141
|
+
end
|
142
|
+
|
139
143
|
private
|
140
144
|
|
141
145
|
def parse_title(title)
|
@@ -14,10 +14,10 @@ module PuppetfileEditor
|
|
14
14
|
attr_reader :module_sections
|
15
15
|
|
16
16
|
# @param [String] path path to Puppetfile
|
17
|
-
def initialize(path
|
17
|
+
def initialize(path = 'Puppetfile', from_stdin = false, contents = nil)
|
18
18
|
@puppetfile_path = path
|
19
19
|
@from_stdin = from_stdin
|
20
|
-
@
|
20
|
+
@contents = contents
|
21
21
|
@modules = {}
|
22
22
|
@loaded = false
|
23
23
|
@forge = nil
|
@@ -34,9 +34,10 @@ module PuppetfileEditor
|
|
34
34
|
def load
|
35
35
|
puppetfile_contents = if @from_stdin
|
36
36
|
$stdin.gets(nil).chomp
|
37
|
+
elsif @contents
|
38
|
+
@contents
|
37
39
|
else
|
38
|
-
raise(IOError, "
|
39
|
-
|
40
|
+
raise(IOError, "'#{@puppetfile_path}' is missing or unreadable") unless File.readable?(@puppetfile_path)
|
40
41
|
File.read @puppetfile_path
|
41
42
|
end
|
42
43
|
|
@@ -57,7 +58,7 @@ module PuppetfileEditor
|
|
57
58
|
next unless module_list.any?
|
58
59
|
contents.push "# #{module_comment}"
|
59
60
|
module_list.values.sort_by(&:name).each do |mod|
|
60
|
-
contents.push mod.dump
|
61
|
+
contents.push mod.dump
|
61
62
|
end
|
62
63
|
contents.push ''
|
63
64
|
end
|
@@ -69,18 +70,35 @@ module PuppetfileEditor
|
|
69
70
|
File.write(@puppetfile_path, generate_puppetfile) if @loaded
|
70
71
|
end
|
71
72
|
|
72
|
-
def update_module(name, param, value
|
73
|
+
def update_module(name, param, value)
|
73
74
|
if @modules.key? name
|
74
|
-
|
75
|
-
@modules[name].set(param, value)
|
76
|
-
puts "Successfully set #{param} to #{value} for #{name}." if verbose
|
77
|
-
rescue StandardError => e
|
78
|
-
warn e.message
|
79
|
-
exit 1
|
80
|
-
end
|
75
|
+
@modules[name].set(param, value)
|
81
76
|
else
|
82
|
-
|
77
|
+
raise StandardError, "Module #{name} does not exist in your Puppetfile"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def compare_with(pf)
|
82
|
+
diff = {}
|
83
|
+
pf.modules.each do |mod_name, mod|
|
84
|
+
next unless [:git, :hg, :forge].include? mod.type
|
85
|
+
version_key = @type == :forge ? :version : :tag
|
86
|
+
|
87
|
+
unless @modules.key? mod_name
|
88
|
+
if mod.params.key?(version_key)
|
89
|
+
diff[mod_name] = { new: mod.params[version_key] }
|
90
|
+
end
|
91
|
+
next
|
92
|
+
end
|
93
|
+
|
94
|
+
local_mod = @modules[mod_name]
|
95
|
+
|
96
|
+
next unless mod.type == local_mod.type
|
97
|
+
next unless mod.params.key?(version_key) && local_mod.params.key?(version_key)
|
98
|
+
next if mod.params[version_key] == local_mod.params[version_key]
|
99
|
+
diff[mod_name] = { old: local_mod.params[version_key], new: mod.params[version_key] }
|
83
100
|
end
|
101
|
+
diff
|
84
102
|
end
|
85
103
|
|
86
104
|
# @param [String] name Module name
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppetfile_editor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eugene Piven
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -61,6 +61,7 @@ executables:
|
|
61
61
|
extensions: []
|
62
62
|
extra_rdoc_files: []
|
63
63
|
files:
|
64
|
+
- CHANGELOG.md
|
64
65
|
- README.md
|
65
66
|
- bin/pfile
|
66
67
|
- lib/puppetfile_editor.rb
|