knife-toruby 1.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 785a119b8151d582da7d8c5918f4b2bed6bccf83
4
+ data.tar.gz: b4ed2aa9fdd6f6e626f0b0f2d3da8f973ffe51b8
5
+ SHA512:
6
+ metadata.gz: ff11082f25d3f875a0f714333b502a1638c14fa23b571627d3c15e7d52ac775a88bc43150ce97b2f8e3460df85830e41cb9f48b48c48dba319e2c657fd1a9154
7
+ data.tar.gz: 1a2cd3fa020423a387e82b57896eb91f5b3060cb09fd1e510f2f224ef5f62ead4ce3db8025a452b83c83464037d0e46fc11bcf763c9d1910fc116580d8372d79
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in knife-toruby.gemspec
4
+ gemspec
@@ -0,0 +1,33 @@
1
+ Knife To Ruby
2
+ =============
3
+
4
+ A [Chef]() Knife plugin to print Chef objects (Role/Environment) in ruby code,
5
+
6
+ name "role_name"
7
+
8
+ description "my description"
9
+
10
+ default_attributes({
11
+ "a" => "b"
12
+ })
13
+
14
+ override_attributes({
15
+ "a" => "b"
16
+ })
17
+
18
+ run_list("recipe[cookbook_a]", "recipe[cookbook_b]")
19
+
20
+ Should be equivalent to `knife show role -Fj` but for ruby.
21
+
22
+ Check the [change log](CHANGELOG.md) to see what has changed.
23
+
24
+ Installation
25
+ ------------
26
+
27
+ /opt/chef/embedded/gem install knife-toruby
28
+
29
+ Chef Objects Supported
30
+ ----------------------
31
+
32
+ * Role
33
+ * Environment
@@ -0,0 +1,191 @@
1
+ # coding: UTF-8
2
+ require 'octokit'
3
+
4
+ VERSION_WITH_NAME_REGEX = /version\s*'\d+\.\d+\.\d+'/
5
+ VERSION_REGEX = /\d+\.\d+\.\d+/
6
+
7
+ REPO = "bbaugher/knife-toruby"
8
+
9
+ task :release do
10
+ version = plugin_version
11
+
12
+ # Update change log
13
+ puts "Updating change log ..."
14
+ update_change_log version
15
+ puts "Change log updated!"
16
+
17
+ # Share the plugin
18
+ deploy
19
+
20
+ # Tag the release
21
+ puts "Tagging the #{version} release ..."
22
+ run_command "git tag -a #{version} -m 'Released #{version}'"
23
+ run_command "git push origin #{version}"
24
+ puts "Release tagged!"
25
+
26
+ # Bump version
27
+ versions = version.split "."
28
+ versions[1] = versions[1].to_i + 1
29
+
30
+ # Reset bug number if available
31
+ if versions.size == 3
32
+ versions[2] = 0
33
+ end
34
+
35
+ new_version = versions.join "."
36
+
37
+ puts "Updating version from #{version} to #{new_version} ..."
38
+ update_plugin_version new_version
39
+ puts "Version updated!"
40
+
41
+ # Commit the updated VERSION file
42
+ puts "Commiting the new version ..."
43
+ run_command "git add VERSION"
44
+ run_command "git commit -m 'Released #{version} and bumped version to #{new_version}'"
45
+ run_command "git push origin HEAD"
46
+ puts "Version commited!"
47
+ end
48
+
49
+ task :build_change_log do
50
+ closed_milestones = Octokit.milestones REPO, {:state => "closed"}
51
+
52
+ version_to_milestone = Hash.new
53
+ versions = Array.new
54
+
55
+ closed_milestones.each do |milestone|
56
+ version = Gem::Version.new(milestone.title)
57
+ version_to_milestone.store version, milestone
58
+ versions.push version
59
+ end
60
+
61
+ versions = versions.sort.reverse
62
+
63
+ change_log = File.open('CHANGELOG.md', 'w')
64
+
65
+ begin
66
+ change_log.write "Change Log\n"
67
+ change_log.write "==========\n"
68
+ change_log.write "\n"
69
+
70
+ versions.each do |version|
71
+ milestone = version_to_milestone[version]
72
+ change_log.write generate_milestone_markdown(milestone)
73
+ change_log.write "\n"
74
+ end
75
+ ensure
76
+ change_log.close
77
+ end
78
+ end
79
+
80
+ def plugin_version
81
+ IO.read("VERSION")
82
+ end
83
+
84
+ def build_gem
85
+ puts "Building the gem ..."
86
+ run_command "gem build knife-toruby.gemspec"
87
+ puts "Gem built!"
88
+ end
89
+
90
+ def deploy
91
+ begin
92
+ build_gem
93
+
94
+ puts "Publishing the gem ..."
95
+ run_command "gem push knife-toruby*.gem"
96
+ puts "Gem published!"
97
+ ensure
98
+ system "rm -f knife-toruby*.gem"
99
+ end
100
+ end
101
+
102
+ def update_plugin_version version
103
+ File.open("VERSION", 'w') { |file| file.write(version) }
104
+ end
105
+
106
+ def update_change_log version
107
+ change_log_lines = IO.read(File.join(File.dirname(__FILE__), 'CHANGELOG.md')).split("\n")
108
+
109
+ change_log = File.open('CHANGELOG.md', 'w')
110
+
111
+ begin
112
+
113
+ # Keep change log title
114
+ change_log.write change_log_lines.shift
115
+ change_log.write "\n"
116
+ change_log.write change_log_lines.shift
117
+ change_log.write "\n"
118
+ change_log.write "\n"
119
+
120
+ # Write new milestone info
121
+ change_log.write generate_milestone_markdown(milestone(version))
122
+
123
+ # Add previous change log info
124
+ change_log_lines.each do |line|
125
+ change_log.write line
126
+ change_log.write "\n"
127
+ end
128
+
129
+ ensure
130
+ change_log.close
131
+ end
132
+
133
+ run_command "git add CHANGELOG.md"
134
+ run_command "git commit -m 'Added #{version} to change log'"
135
+ run_command "git push origin HEAD"
136
+ end
137
+
138
+ def generate_milestone_markdown milestone
139
+ strings = Array.new
140
+
141
+ title = "[#{milestone.title}](https://github.com/#{REPO}/issues?milestone=#{milestone.number}&state=closed)"
142
+
143
+ strings.push "#{title}"
144
+ strings.push "-" * title.length
145
+ strings.push ""
146
+
147
+ issues = Octokit.issues REPO, {:milestone => milestone.number, :state => "closed"}
148
+
149
+ issues.each do |issue|
150
+ strings.push " * [#{issue_type issue}] [Issue-#{issue.number}](https://github.com/#{REPO}/issues/#{issue.number}) : #{issue.title}"
151
+ end
152
+
153
+ strings.push ""
154
+
155
+ strings.join "\n"
156
+ end
157
+
158
+ def milestone version
159
+ closedMilestones = Octokit.milestones REPO, {:state => "closed"}
160
+
161
+ closedMilestones.each do |milestone|
162
+ if milestone["title"] == version
163
+ return milestone
164
+ end
165
+ end
166
+
167
+ openMilestones = Octokit.milestones REPO
168
+
169
+ openMilestones.each do |milestone|
170
+ if milestone["title"] == version
171
+ return milestone
172
+ end
173
+ end
174
+
175
+ raise "Unable to find milestone with title [#{version}]"
176
+ end
177
+
178
+ def issue_type issue
179
+ labels = Array.new
180
+ issue.labels.each do |label|
181
+ labels.push label.name.capitalize
182
+ end
183
+ labels.join "/"
184
+ end
185
+
186
+ def run_command command
187
+ output = `#{command}`
188
+ unless $?.success?
189
+ raise "Command : [#{command}] failed.\nOutput : \n#{output}"
190
+ end
191
+ end
@@ -0,0 +1,30 @@
1
+ require 'chef/knife'
2
+ require 'chef/ruby_compat'
3
+
4
+ class Chef
5
+ class Knife
6
+ # Captialization has to be this way to make toruby one word in the command
7
+ class EnvironmentToruby < Chef::Knife
8
+
9
+ banner "knife environment toruby ENVIRONMENT [options]"
10
+
11
+ def run
12
+
13
+ #Get Arguments
14
+ if @name_args.size != 1
15
+ ui.info("Please specify an environment name")
16
+ show_usage
17
+ exit 1
18
+ end
19
+
20
+ env_name = @name_args.first
21
+
22
+ env = Chef::Environment.load(env_name)
23
+
24
+ output(Chef::RubyCompat.to_ruby(env))
25
+
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ require 'chef/knife'
2
+ require 'chef/ruby_compat'
3
+
4
+ class Chef
5
+ class Knife
6
+ # Captialization has to be this way to make toruby one word in the command
7
+ class RoleToruby < Chef::Knife
8
+
9
+ banner "knife role toruby ROLE [options]"
10
+
11
+ def run
12
+
13
+ #Get Arguments
14
+ if @name_args.size != 1
15
+ ui.info("Please specify a role name")
16
+ show_usage
17
+ exit 1
18
+ end
19
+
20
+ role_name = @name_args.first
21
+
22
+ role = Chef::Role.load(role_name)
23
+
24
+ output(Chef::RubyCompat.to_ruby(role))
25
+
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,149 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2012 Opscode, Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require 'chef/role'
19
+ require 'chef/environment'
20
+ require 'stringio'
21
+ require "awesome_print"
22
+
23
+ # Wrapper class for interacting with Ruby.
24
+
25
+ class Chef
26
+ class RubyCompat
27
+
28
+ def self.to_ruby(data)
29
+
30
+ case data
31
+ when Chef::Role
32
+ role_to_ruby(data)
33
+ when Chef::Environment
34
+ environment_to_ruby(data)
35
+ else
36
+ raise ArgumentError, "[#{data.class.name}] is not supported by ruby format"
37
+ end
38
+
39
+ end
40
+
41
+ private
42
+
43
+ def self.role_to_ruby(role)
44
+ ruby = RubyIO.new
45
+
46
+ # Name
47
+ ruby.write_method("name", role.name)
48
+ ruby.new_line
49
+
50
+ # Description
51
+ ruby.write_method("description", role.description)
52
+ ruby.new_line
53
+
54
+ # Default Attributes
55
+ ruby.write_method("default_attributes", role.default_attributes)
56
+ ruby.new_line
57
+
58
+ # Override Attributes
59
+ ruby.write_method("override_attributes", role.override_attributes)
60
+ ruby.new_line
61
+
62
+ # Run list
63
+ if role.env_run_lists.size <= 1
64
+ ruby.write_method("run_list", *role.run_list.map{|val| val.to_s})
65
+ else
66
+ ruby.write_method("env_run_lists", Hash[role.env_run_lists.map{|k, v| [k, v.map{|val| val.to_s}]}])
67
+ end
68
+ ruby.new_line
69
+
70
+ ruby.string
71
+ end
72
+
73
+ def self.environment_to_ruby(environment)
74
+ ruby = RubyIO.new
75
+
76
+ # Name
77
+ ruby.write_method("name", environment.name)
78
+ ruby.new_line
79
+
80
+ # Description
81
+ ruby.write_method("description", environment.description)
82
+ ruby.new_line
83
+
84
+ # Cookbook versions
85
+ environment.cookbook_versions.each do |cookbook, version_constraint|
86
+ ruby.write_method("cookbook", cookbook, version_constraint)
87
+ end
88
+ ruby.new_line
89
+
90
+ # Default Attributes
91
+ ruby.write_method("default_attributes", environment.default_attributes)
92
+ ruby.new_line
93
+
94
+ # Override Attributes
95
+ ruby.write_method("override_attributes", environment.override_attributes)
96
+ ruby.new_line
97
+
98
+ ruby.string
99
+ end
100
+
101
+ class RubyIO
102
+
103
+ @@inspector =AwesomePrint::Inspector.new :plain => true, :indent => 2, :index => false
104
+
105
+ def initialize
106
+ @out = StringIO.new
107
+ end
108
+
109
+ def write_method(method_name, *args)
110
+ write method_name
111
+ write("(")
112
+
113
+ arg_values = args.map do |arg|
114
+ if arg.is_a? String
115
+ arg.inspect
116
+ elsif arg.is_a? Hash
117
+ format(arg)
118
+ else
119
+ raise "Object type [#{arg.class.name}] is not supported"
120
+ end
121
+ end
122
+
123
+ write(arg_values.join(", "))
124
+
125
+ write(")")
126
+
127
+ new_line
128
+ end
129
+
130
+ def new_line
131
+ write "\n"
132
+ end
133
+
134
+ def write(string)
135
+ @out.write string
136
+ end
137
+
138
+ def string
139
+ @out.string
140
+ end
141
+
142
+ def format(obj)
143
+ @@inspector.awesome obj
144
+ end
145
+
146
+ end
147
+
148
+ end
149
+ end
metadata ADDED
@@ -0,0 +1,149 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: knife-toruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Bryan Baugher
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: chef
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '11.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '11.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: awesome_print
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.6'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '0.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-core
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 2.99.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 2.99.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec-expectations
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 2.99.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 2.99.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec-mocks
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 2.99.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 2.99.0
111
+ description: 'A Chef Knife plugin to convert Chef objects to ruby '
112
+ email:
113
+ - bryan.baugher@cerner.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - lib/chef/knife/environment_toruby.rb
119
+ - lib/chef/knife/role_toruby.rb
120
+ - lib/chef/ruby_compat.rb
121
+ - Gemfile
122
+ - Rakefile
123
+ - README.md
124
+ homepage: https://github.com/bbaugher/knife-toruby
125
+ licenses:
126
+ - MIT
127
+ metadata: {}
128
+ post_install_message:
129
+ rdoc_options: []
130
+ require_paths:
131
+ - lib
132
+ required_ruby_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - '>='
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ requirements: []
143
+ rubyforge_project:
144
+ rubygems_version: 2.0.14
145
+ signing_key:
146
+ specification_version: 4
147
+ summary: A Chef Knife plugin to convert Chef objects to ruby
148
+ test_files: []
149
+ has_rdoc: