knife-toruby 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: