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.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/README.md +33 -0
- data/Rakefile +191 -0
- data/lib/chef/knife/environment_toruby.rb +30 -0
- data/lib/chef/knife/role_toruby.rb +30 -0
- data/lib/chef/ruby_compat.rb +149 -0
- metadata +149 -0
checksums.yaml
ADDED
@@ -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
data/README.md
ADDED
@@ -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
|
data/Rakefile
ADDED
@@ -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:
|