ridley 1.2.6 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 66fa18198fe4d78a634471ef130b70993c6f43d4
4
- data.tar.gz: f3239d671df40092749c36fda2c18969c8305161
3
+ metadata.gz: 29775148101ee7b5606bf8147c419def65765b13
4
+ data.tar.gz: fe10a06b4db60f71fb8832d4b59d62a83c2e6c17
5
5
  SHA512:
6
- metadata.gz: 7c4af448f66cfc6c9928a046eb45bfec8fa9dea14bdb35d6fe6400a0ced7d7592d9063db6a5e91cbf665f1022fab1ee21a81d4c582a7dcddb5baf8012f544975
7
- data.tar.gz: 9d632f851f012f1f955762319afb6a80e76e95a549283513fd3498c78e550426543bcdcd54d8ecff4fb6c426e0c2073d123a4ff34f755717094f9307d1d5d232
6
+ metadata.gz: ba1cc8948844efbc746b227791f349210494ff9a4c9a21ebbc8a722eccf09fb8e7b9c4f203eee3cab2ad8161b74e94f34a673ad673e4d58b33ed06e520648d2e
7
+ data.tar.gz: b62e6e914f5696c5806dd1f0befe0713ffed69d95bc5cd6e88c7942ecb53fb0ac68672117dffeb5431d85cd96c3f60c462ab165a50658aeec199a02d1a86576d
data/.travis.yml CHANGED
@@ -4,7 +4,6 @@ env:
4
4
  - TEST_SUITE=unit
5
5
  - TEST_SUITE=acceptance
6
6
  rvm:
7
- - 1.9.2
8
7
  - 1.9.3
9
8
  - 2.0.0
10
9
  - jruby-19mode
data/README.md CHANGED
@@ -40,6 +40,55 @@ Ridley exposes a number of functions that return resources which you can use to
40
40
 
41
41
  For more information scroll down to the Manipulating Chef Resources section of this README.
42
42
 
43
+ You can also tell Ridley to read the values from your Chef config (knife.rb):
44
+
45
+ ```ruby
46
+ ridley = Ridley.from_chef_config('/path/to/knife.rb')
47
+ ridley.role.all #=> [
48
+ #<Ridley::RoleObject chef_id:motherbrain_srv ...>,
49
+ #<Ridley::RoleObject chef_id:motherbrain_proxy ...>
50
+ ]
51
+ ```
52
+
53
+ The mapping between Chef Config values and Ridley values is:
54
+
55
+ <table>
56
+ <thead>
57
+ <tr>
58
+ <th>Ridley</th>
59
+ <th>Chef</th>
60
+ </tr>
61
+ </thead>
62
+ <tbody>
63
+ <tr>
64
+ <td>validator_client</td>
65
+ <td>validation_client_name</td>
66
+ </tr>
67
+ <tr>
68
+ <td>validator_path</td>
69
+ <td>validation_key</td>
70
+ </tr>
71
+ <tr>
72
+ <td>client_name</td>
73
+ <td>node_name</td>
74
+ </tr>
75
+ <tr>
76
+ <td>server_url</td>
77
+ <td>chef_server_url</td>
78
+ </tr>
79
+ </tbody>
80
+ </table>
81
+
82
+ Additionally, you can leave the path blank and Ridley will perform a "knife.rb search" the same way Chef does:
83
+
84
+ ```ruby
85
+ ridley = Ridley.from_chef_config
86
+ ridley.role.all #=> [
87
+ #<Ridley::RoleObject chef_id:motherbrain_srv ...>,
88
+ #<Ridley::RoleObject chef_id:motherbrain_proxy ...>
89
+ ]
90
+ ```
91
+
43
92
  If you don't want to instantiate and manage a connection object you can use `Ridley.open` to open a connection, do some work, and it will be closed for you after the block executes.
44
93
 
45
94
  Ridley.open(server_url: "https://api.opscode.com", ...) do |r|
data/lib/ridley.rb CHANGED
@@ -27,6 +27,26 @@ module Ridley
27
27
  Client.new(*args)
28
28
  end
29
29
 
30
+ # Create a new Ridley connection from the Chef config (knife.rb)
31
+ #
32
+ # @param [#to_s] filepath
33
+ # the path to the Chef Config
34
+ #
35
+ # @param [hash] options
36
+ # list of options to pass to the Ridley connection (@see {Ridley::Client#new})
37
+ #
38
+ # @return [Ridley::Client]
39
+ def from_chef_config(filepath = nil, options = {})
40
+ config = Ridley::Chef::Config.new(filepath).to_hash
41
+
42
+ config[:validator_client] = config.delete(:validation_client_name)
43
+ config[:validator_path] = config.delete(:validation_key)
44
+ config[:client_name] = config.delete(:node_name)
45
+ config[:server_url] = config.delete(:chef_server_url)
46
+
47
+ Client.new(config.merge(options))
48
+ end
49
+
30
50
  def open(*args, &block)
31
51
  Client.open(*args, &block)
32
52
  end
data/lib/ridley/chef.rb CHANGED
@@ -3,6 +3,7 @@ module Ridley
3
3
  # site, and Chef Cookbooks
4
4
  module Chef
5
5
  require_relative 'chef/cookbook'
6
+ require_relative 'chef/config'
6
7
  require_relative 'chef/chefignore'
7
8
  require_relative 'chef/digester'
8
9
  end
@@ -0,0 +1,86 @@
1
+ require 'buff/config/ruby'
2
+ require 'socket'
3
+
4
+ module Ridley::Chef
5
+ class Config < Buff::Config::Ruby
6
+ class << self
7
+ # Return the most sensible path to the Chef configuration file. This can
8
+ # be configured by setting a value for the 'RIDLEY_CHEF_CONFIG' environment
9
+ # variable.
10
+ #
11
+ # @return [String, nil]
12
+ def location
13
+ possibles = []
14
+
15
+ possibles << ENV['RIDLEY_CHEF_CONFIG'] if ENV['RIDLEY_CHEF_CONFIG']
16
+ possibles << File.join(ENV['KNIFE_HOME'], 'knife.rb') if ENV['KNIFE_HOME']
17
+ possibles << File.join(working_dir, 'knife.rb') if working_dir
18
+
19
+ # Ascending search for .chef directory siblings
20
+ Pathname.new(working_dir).ascend do |file|
21
+ sibling_chef = File.join(file, '.chef')
22
+ possibles << File.join(sibling_chef, 'knife.rb')
23
+ end if working_dir
24
+
25
+ possibles << File.join(ENV['HOME'], '.chef', 'knife.rb') if ENV['HOME']
26
+ possibles.compact!
27
+
28
+ location = possibles.find { |loc| File.exists?(File.expand_path(loc)) }
29
+
30
+ File.expand_path(location) unless location.nil?
31
+ end
32
+
33
+ private
34
+
35
+ # The current working directory
36
+ #
37
+ # @return [String]
38
+ def working_dir
39
+ ENV['PWD'] || Dir.pwd
40
+ end
41
+ end
42
+
43
+ set_assignment_mode :carefree
44
+
45
+ attribute :node_name,
46
+ default: Socket.gethostname
47
+ attribute :chef_server_url,
48
+ default: 'http://localhost:4000'
49
+ attribute :client_key,
50
+ default: platform_specific_path('/etc/chef/client.pem')
51
+ attribute :validation_key,
52
+ default: platform_specific_path('/etc/chef/validation.pem')
53
+ attribute :validation_client_name,
54
+ default: 'chef-validator'
55
+
56
+ attribute :cookbook_copyright,
57
+ default: 'YOUR_NAME'
58
+ attribute :cookbook_email,
59
+ default: 'YOUR_EMAIL'
60
+ attribute :cookbook_license,
61
+ default: 'reserved'
62
+
63
+ attribute :knife,
64
+ default: {}
65
+
66
+ # Prior to Chef 11, the cache implementation was based on
67
+ # moneta and configured via cache_options[:path]. Knife configs
68
+ # generated with Chef 11 will have `syntax_check_cache_path`, but older
69
+ # configs will have `cache_options[:path]`. `cache_options` is marked
70
+ # deprecated in chef/config.rb but doesn't currently trigger a warning.
71
+ # See also: CHEF-3715
72
+ attribute :syntax_check_cache_path,
73
+ default: Dir.mktmpdir
74
+ attribute :cache_options,
75
+ default: { path: defined?(syntax_check_cache_path) ? syntax_check_cache_path : Dir.mktmpdir }
76
+
77
+ # Create a new Chef Config object.
78
+ #
79
+ # @param [#to_s] path
80
+ # the path to the configuration file
81
+ # @param [Hash] options
82
+ def initialize(path, options = {})
83
+ super(path || self.class.location, options)
84
+ end
85
+ end
86
+ end
data/lib/ridley/client.rb CHANGED
@@ -199,7 +199,7 @@ module Ridley
199
199
  # Perform a search the Chef Server
200
200
  #
201
201
  # @param [#to_sym, #to_s] index
202
- # @param [#to_s] query_string
202
+ # @param [#to_s] query
203
203
  #
204
204
  # @option options [String] :sort
205
205
  # a sort string such as 'name DESC'
@@ -208,7 +208,7 @@ module Ridley
208
208
  # @option options [Integer] :start
209
209
  # the result number to start from
210
210
  #
211
- # @return [Hash]
211
+ # @return [Array<ChefObject>, Hash]
212
212
  def search(index, query = nil, options = {})
213
213
  @resources_registry[:search_resource].run(index, query, @resources_registry, options)
214
214
  end
@@ -216,8 +216,8 @@ module Ridley
216
216
  # Return the array of all possible search indexes for the including connection
217
217
  #
218
218
  # @example
219
- # conn = Ridley.new(...)
220
- # conn.search_indexes =>
219
+ # ridley = Ridley.new(...)
220
+ # ridley.search_indexes #=>
221
221
  # [:client, :environment, :node, :role, :"ridley-two", :"ridley-one"]
222
222
  #
223
223
  # @return [Array<Symbol, String>]
@@ -225,6 +225,35 @@ module Ridley
225
225
  @resources_registry[:search_resource].indexes
226
226
  end
227
227
 
228
+ # Perform a partial search the Chef Server. Partial objects or a smaller hash will be returned resulting
229
+ # in a faster response for larger response sets. Specify the attributes you want returned with the
230
+ # attributes parameter.
231
+ #
232
+ # @param [#to_sym, #to_s] index
233
+ # @param [#to_s] query
234
+ # @param [Array] attributes
235
+ # an array of strings in dotted hash notation representing the attributes to return
236
+ #
237
+ # @option options [String] :sort
238
+ # a sort string such as 'name DESC'
239
+ # @option options [Integer] :rows
240
+ # how many rows to return
241
+ # @option options [Integer] :start
242
+ # the result number to start from
243
+ #
244
+ # @example
245
+ # ridley = Ridley.new(...)
246
+ # ridley.partial_search(:node, "chef_environment:RESET", [ 'ipaddress', 'some.application.setting' ]) #=>
247
+ # [
248
+ # #<Ridley::NodeObject: chef_id:"reset.riotgames.com" normal:
249
+ # { "ipaddress" => "192.168.1.1", "some" => { "application" => { "setting" => "value" } } } ...>
250
+ # ]
251
+ #
252
+ # @return [Array<ChefObject>, Hash]
253
+ def partial_search(index, query = nil, attributes = [], options = {})
254
+ @resources_registry[:search_resource].partial(index, query, Array(attributes), @resources_registry, options)
255
+ end
256
+
228
257
  # The encrypted data bag secret for this connection.
229
258
  #
230
259
  # @raise [Ridley::Errors::EncryptedDataBagSecretNotFound]
@@ -156,7 +156,7 @@ module Ridley
156
156
 
157
157
  local.flush
158
158
 
159
- FileUtils.cp(local.path, destination)
159
+ FileUtils.mv(local.path, destination)
160
160
  rescue OpenURI::HTTPError => ex
161
161
  abort(ex)
162
162
  ensure
@@ -47,10 +47,10 @@ module Ridley
47
47
  end
48
48
 
49
49
  HostConnector::Response.new(host).tap do |response|
50
- command_uploaders << command_uploader = CommandUploader.new(connection)
51
- command = get_command(command, command_uploader)
52
-
53
50
  begin
51
+ command_uploaders << command_uploader = CommandUploader.new(connection)
52
+ command = get_command(command, command_uploader)
53
+
54
54
  log.info "Running WinRM Command: '#{command}' on: '#{host}' as: '#{user}'"
55
55
 
56
56
  defer {
@@ -1,7 +1,5 @@
1
1
  module Ridley
2
2
  class CookbookResource < Ridley::Resource
3
- task_class TaskThread
4
-
5
3
  set_resource_path "cookbooks"
6
4
  represented_by Ridley::CookbookObject
7
5
 
@@ -20,12 +20,42 @@ module Ridley
20
20
  end
21
21
  end
22
22
 
23
+ # Builds and returns a query parameter string for the search API
24
+ #
25
+ # @param [String] query_string
26
+ #
27
+ # @option options [String] :sort
28
+ # a sort string such as 'name DESC'
29
+ # @option options [Integer] :rows
30
+ # how many rows to return
31
+ # @option options [Integer] :start
32
+ # the result number to start from
33
+ #
34
+ # @example
35
+ # build_param_string("*:*", rows: 5) #=> "?q=*:*&rows=5"
36
+ #
37
+ # @return [String]
38
+ def build_param_string(query_string, options = {})
39
+ query = build_query(query_string, options)
40
+ param = "?q=#{escape(query[:q])}"
41
+ param += "&sort=#{escape(query[:sort])}" if query[:sort]
42
+ param += "&start=#{escape(query[:start])}" if query[:start]
43
+ param += "&rows=#{escape(query[:rows])}" if query[:rows]
44
+ param
45
+ end
46
+
23
47
  # @param [#to_s] index
24
48
  #
25
49
  # @return [String]
26
50
  def query_uri(index)
27
51
  "#{resource_path}/#{index}"
28
52
  end
53
+
54
+ private
55
+
56
+ def escape(str)
57
+ str && URI.escape(str.to_s)
58
+ end
29
59
  end
30
60
 
31
61
  set_resource_path "search"
@@ -79,20 +109,76 @@ module Ridley
79
109
  def run(index, query_string, resources_registry, options = {})
80
110
  query_uri = self.class.query_uri(index)
81
111
  query = self.class.build_query(query_string, options)
82
- response = request(:get, query_uri, query)
83
-
84
- case index.to_sym
85
- when :node
86
- response[:rows].collect { |row| Ridley::NodeObject.new(resources_registry[:node_resource], row) }
87
- when :role
88
- response[:rows].collect { |row| Ridley::RoleObject.new(resources_registry[:role_resource], row) }
89
- when :client
90
- response[:rows].collect { |row| Ridley::ClientObject.new(resources_registry[:client_resource], row) }
91
- when :environment
92
- response[:rows].collect { |row| Ridley::EnvironmentObject.new(resources_registry[:environment_resource], row) }
93
- else
94
- response[:rows]
112
+
113
+ handle_response(index, resources_registry, request(:get, query_uri, query))
114
+ end
115
+
116
+ # Perform a partial search on the Chef server
117
+ #
118
+ # @param [#to_sym, #to_s] index
119
+ # @param [#to_s] query_string
120
+ # @param [Array] attributes
121
+ # an array of strings in dotted hash notation representing the attributes to return
122
+ #
123
+ # @option options [String] :sort
124
+ # a sort string such as 'name DESC'
125
+ # @option options [Integer] :rows
126
+ # how many rows to return
127
+ # @option options [Integer] :start
128
+ # the result number to start from
129
+ #
130
+ # @return [Array<ChefObject>, Hash]
131
+ def partial(index, query_string, attributes, resources_registry, options = {})
132
+ query_uri = self.class.query_uri(index)
133
+ param_string = self.class.build_param_string(query_string, options)
134
+
135
+ chef_id = chef_id_for_index(index)
136
+
137
+ body = Hash.new.tap do |body|
138
+ body[chef_id] = [ chef_id ] if chef_id
139
+ attributes.collect { |attr| body[attr] = attr.split('.') }
95
140
  end
141
+
142
+ handle_partial(index, resources_registry, request(:post, "#{query_uri}#{param_string}", JSON.generate(body)))
96
143
  end
144
+
145
+ private
146
+
147
+ def chef_id_for_index(index)
148
+ chef_id = index.to_sym == :node ? Ridley::NodeObject.chef_id : nil
149
+ end
150
+
151
+ def handle_partial(index, registry, response)
152
+ chef_id = chef_id_for_index(index)
153
+
154
+ case index.to_sym
155
+ when :node
156
+ response[:rows].collect do |item|
157
+ attributes = Hash.new
158
+ item[:data].each do |key, value|
159
+ next if key.to_s == chef_id.to_s
160
+ attributes.deep_merge!(Hash.from_dotted_path(key, value))
161
+ end
162
+ registry[:node_resource].new(name: item[:data][chef_id], normal: attributes)
163
+ end
164
+ else
165
+ response[:rows]
166
+ end
167
+ end
168
+
169
+ def handle_response(index, registry, response)
170
+ case index.to_sym
171
+ when :node
172
+ response[:rows].collect { |row| NodeObject.new(registry[:node_resource], row) }
173
+ when :role
174
+ response[:rows].collect { |row| RoleObject.new(registry[:role_resource], row) }
175
+ when :client
176
+ response[:rows].collect { |row| ClientObject.new(registry[:client_resource], row) }
177
+ when :environment
178
+ response[:rows].collect { |row| EnvironmentObject.new(registry[:environment_resource], row) }
179
+ else
180
+ response[:rows]
181
+ end
182
+ end
97
183
  end
98
184
  end
@@ -1,3 +1,3 @@
1
1
  module Ridley
2
- VERSION = "1.2.6"
2
+ VERSION = "1.3.0"
3
3
  end
data/ridley.gemspec CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
19
19
 
20
20
  s.add_dependency 'addressable'
21
21
  s.add_dependency 'varia_model', '~> 0.1'
22
+ s.add_dependency 'buff-config', '~> 0.2'
22
23
  s.add_dependency 'buff-extensions', '~> 0.3'
23
24
  s.add_dependency 'buff-shell_out', '~> 0.1'
24
25
  s.add_dependency 'celluloid', '~> 0.14.0'
@@ -34,5 +35,5 @@ Gem::Specification.new do |s|
34
35
  s.add_dependency 'solve', '>= 0.4.4'
35
36
  s.add_dependency 'winrm', '~> 1.1.0'
36
37
 
37
- s.add_development_dependency "buff-ruby_engine", "~> 0.1"
38
+ s.add_development_dependency 'buff-ruby_engine', '~> 0.1'
38
39
  end
@@ -49,6 +49,44 @@ describe Ridley::SearchResource do
49
49
  end
50
50
  end
51
51
 
52
+ describe "::build_param_string" do
53
+ let(:query) { "*:*" }
54
+ let(:options) { Hash.new }
55
+
56
+ subject { described_class.build_param_string(query, options) }
57
+
58
+ it "returns a string containing the query string" do
59
+ expect(subject).to eq("?q=#{query}")
60
+ end
61
+
62
+ context "when the :start option is given" do
63
+ let(:start) { 10 }
64
+ let(:options) { { start: start } }
65
+
66
+ it "contains the start query param" do
67
+ expect(subject).to eq("?q=#{query}&start=#{start}")
68
+ end
69
+ end
70
+
71
+ context "when the :sort option is given" do
72
+ let(:sort) { "DESC" }
73
+ let(:options) { { sort: sort } }
74
+
75
+ it "contains the sort query param" do
76
+ expect(subject).to eq("?q=#{query}&sort=#{sort}")
77
+ end
78
+ end
79
+
80
+ context "when the :rows option is given" do
81
+ let(:rows) { 20 }
82
+ let(:options) { { rows: rows } }
83
+
84
+ it "contains the rows query param" do
85
+ expect(subject).to eq("?q=#{query}&rows=#{rows}")
86
+ end
87
+ end
88
+ end
89
+
52
90
  describe "::query_uri" do
53
91
  it "returns a URI path containing the search resource path and index" do
54
92
  subject.query_uri(:nodes).should eql("search/nodes")
@@ -14,5 +14,103 @@ describe Ridley do
14
14
  subject.new(config).should eql(client)
15
15
  end
16
16
  end
17
+
18
+ describe "from_chef_config" do
19
+ let(:chef_config) do
20
+ %(
21
+ node_name "username"
22
+ client_key "username.pem"
23
+ validation_client_name "validator"
24
+ validation_key "validator.pem"
25
+ chef_server_url "https://api.opscode.com"
26
+ cache_options(:path => "~/.chef/checksums")
27
+ syntax_check_cache_path "/foo/bar"
28
+ )
29
+ end
30
+
31
+ let(:client) { double('client') }
32
+ let(:path) { tmp_path.join('config.rb').to_s }
33
+
34
+ before do
35
+ Ridley::Client.stub(:new).and_return(client)
36
+ File.open(path, 'w') { |f| f.write(chef_config) }
37
+ end
38
+
39
+ it "creates a Ridley connection from the Chef config" do
40
+ Ridley::Client.should_receive(:new).with({
41
+ client_key: 'username.pem',
42
+ client_name: 'username',
43
+ validator_client: 'validator',
44
+ validator_path: 'validator.pem',
45
+ server_url: 'https://api.opscode.com',
46
+
47
+ cookbook_copyright: 'YOUR_NAME',
48
+ cookbook_email: 'YOUR_EMAIL',
49
+ cookbook_license: 'reserved',
50
+
51
+ knife: {},
52
+
53
+ syntax_check_cache_path: "/foo/bar",
54
+ cache_options: { path: "~/.chef/checksums" },
55
+ }).and_return(nil)
56
+
57
+ subject.from_chef_config(path)
58
+ end
59
+
60
+ it "allows the user to override attributes" do
61
+ Ridley::Client.should_receive(:new).with({
62
+ client_key: 'bacon.pem',
63
+ client_name: 'bacon',
64
+ validator_client: 'validator',
65
+ validator_path: 'validator.pem',
66
+ server_url: 'https://api.opscode.com',
67
+
68
+ cookbook_copyright: 'YOUR_NAME',
69
+ cookbook_email: 'YOUR_EMAIL',
70
+ cookbook_license: 'reserved',
71
+
72
+ knife: {},
73
+
74
+ syntax_check_cache_path: "/foo/bar",
75
+ cache_options: { path: "~/.chef/checksums" },
76
+ })
77
+
78
+ subject.from_chef_config(path, client_key: 'bacon.pem', client_name: 'bacon')
79
+ end
80
+
81
+ context "when the config location isn't explicitly specified" do
82
+ before do
83
+ dot_chef = tmp_path.join('.chef')
84
+ knife_rb = dot_chef.join('knife.rb')
85
+
86
+ FileUtils.mkdir_p(dot_chef)
87
+ File.open(knife_rb, 'w') { |f| f.write(chef_config) }
88
+ end
89
+
90
+ it "does a knife.rb search" do
91
+ Ridley::Client.should_receive(:new).with({
92
+ client_key: 'username.pem',
93
+ client_name: 'username',
94
+ validator_client: 'validator',
95
+ validator_path: 'validator.pem',
96
+ server_url: 'https://api.opscode.com',
97
+
98
+ cookbook_copyright: 'YOUR_NAME',
99
+ cookbook_email: 'YOUR_EMAIL',
100
+ cookbook_license: 'reserved',
101
+
102
+ knife: {},
103
+
104
+ syntax_check_cache_path: "/foo/bar",
105
+ cache_options: { path: "~/.chef/checksums" },
106
+ }).and_return(nil)
107
+
108
+ Dir.chdir(tmp_path) do
109
+ ENV['PWD'] = Dir.pwd
110
+ subject.from_chef_config
111
+ end
112
+ end
113
+ end
114
+ end
17
115
  end
18
116
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ridley
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.6
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jamie Winsor
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-05 00:00:00.000000000 Z
12
+ date: 2013-07-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: addressable
@@ -39,6 +39,20 @@ dependencies:
39
39
  - - ~>
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0.1'
42
+ - !ruby/object:Gem::Dependency
43
+ name: buff-config
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ~>
47
+ - !ruby/object:Gem::Version
48
+ version: '0.2'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: '0.2'
42
56
  - !ruby/object:Gem::Dependency
43
57
  name: buff-extensions
44
58
  requirement: !ruby/object:Gem::Requirement
@@ -273,6 +287,7 @@ files:
273
287
  - lib/ridley/bootstrap_context/windows.rb
274
288
  - lib/ridley/chef.rb
275
289
  - lib/ridley/chef/chefignore.rb
290
+ - lib/ridley/chef/config.rb
276
291
  - lib/ridley/chef/cookbook.rb
277
292
  - lib/ridley/chef/cookbook/metadata.rb
278
293
  - lib/ridley/chef/cookbook/syntax_check.rb
@@ -418,7 +433,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
418
433
  version: '0'
419
434
  requirements: []
420
435
  rubyforge_project:
421
- rubygems_version: 2.0.7
436
+ rubygems_version: 2.0.3
422
437
  signing_key:
423
438
  specification_version: 4
424
439
  summary: A reliable Chef API client with a clean syntax