spice 1.0.0.rc → 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.
Files changed (109) hide show
  1. data/.gitignore +2 -0
  2. data/Gemfile +0 -14
  3. data/README.md +1 -1
  4. data/Rakefile +1 -1
  5. data/TODO.md +2 -1
  6. data/lib/spice.rb +47 -72
  7. data/lib/spice/authentication.rb +23 -45
  8. data/lib/spice/base.rb +104 -0
  9. data/lib/spice/client.rb +8 -48
  10. data/lib/spice/config.rb +37 -19
  11. data/lib/spice/connection.rb +33 -117
  12. data/lib/spice/connection/clients.rb +26 -6
  13. data/lib/spice/connection/cookbooks.rb +19 -14
  14. data/lib/spice/connection/data_bags.rb +31 -20
  15. data/lib/spice/connection/environments.rb +6 -7
  16. data/lib/spice/connection/nodes.rb +23 -6
  17. data/lib/spice/connection/roles.rb +5 -5
  18. data/lib/spice/connection/search.rb +12 -12
  19. data/lib/spice/cookbook.rb +3 -29
  20. data/lib/spice/cookbook_version.rb +9 -61
  21. data/lib/spice/core_ext/array.rb +7 -0
  22. data/lib/spice/core_ext/enumerable.rb +11 -0
  23. data/lib/spice/core_ext/hash.rb +49 -0
  24. data/lib/spice/core_ext/mash.rb +219 -0
  25. data/lib/spice/data_bag.rb +3 -37
  26. data/lib/spice/data_bag_item.rb +7 -47
  27. data/lib/spice/environment.rb +12 -27
  28. data/lib/spice/error.rb +22 -10
  29. data/lib/spice/identity_map.rb +8 -0
  30. data/lib/spice/node.rb +13 -34
  31. data/lib/spice/request.rb +73 -11
  32. data/lib/spice/response/parse_json.rb +8 -3
  33. data/lib/spice/role.rb +8 -33
  34. data/lib/spice/version.rb +1 -1
  35. data/spec/fixtures/client.pem +27 -0
  36. data/spec/fixtures/clients/create.json +4 -0
  37. data/spec/fixtures/clients/index.json +5 -0
  38. data/spec/fixtures/clients/reregister.json +5 -0
  39. data/spec/fixtures/clients/show.json +8 -0
  40. data/spec/fixtures/clients/update.json +5 -0
  41. data/spec/fixtures/cookbook_versions/show.json +108 -0
  42. data/spec/fixtures/cookbook_versions/update.json +62 -0
  43. data/spec/fixtures/cookbooks/index-0.10.json +28 -0
  44. data/spec/fixtures/cookbooks/index-0.9.json +4 -0
  45. data/spec/fixtures/cookbooks/show-0.10.json +15 -0
  46. data/spec/fixtures/cookbooks/show-apache2-0.9.json +5 -0
  47. data/spec/fixtures/cookbooks/show-unicorn-0.9.json +5 -0
  48. data/spec/fixtures/data_bag_items/create.json +1 -0
  49. data/spec/fixtures/data_bag_items/show.json +4 -0
  50. data/spec/fixtures/data_bag_items/update.json +4 -0
  51. data/spec/fixtures/data_bags/create.json +3 -0
  52. data/spec/fixtures/data_bags/index.json +3 -0
  53. data/spec/fixtures/data_bags/show.json +3 -0
  54. data/spec/fixtures/environments/cookbook.json +15 -0
  55. data/spec/fixtures/environments/cookbooks.json +28 -0
  56. data/spec/fixtures/environments/create.json +1 -0
  57. data/spec/fixtures/environments/delete.json +8 -0
  58. data/spec/fixtures/environments/index.json +3 -0
  59. data/spec/fixtures/environments/show.json +8 -0
  60. data/spec/fixtures/environments/update.json +8 -0
  61. data/spec/fixtures/nodes/cookbooks.json +41 -0
  62. data/spec/fixtures/nodes/create.json +1 -0
  63. data/spec/fixtures/nodes/delete.json +17 -0
  64. data/spec/fixtures/nodes/index.json +3 -0
  65. data/spec/fixtures/nodes/show.json +17 -0
  66. data/spec/fixtures/nodes/update.json +13 -0
  67. data/spec/fixtures/roles/create.json +1 -0
  68. data/spec/fixtures/roles/delete.json +11 -0
  69. data/spec/fixtures/roles/index.json +3 -0
  70. data/spec/fixtures/roles/show.json +12 -0
  71. data/spec/fixtures/roles/update.json +11 -0
  72. data/spec/fixtures/search/client.json +1 -0
  73. data/spec/fixtures/search/data_bag.json +1 -0
  74. data/spec/fixtures/search/environment.json +1 -0
  75. data/spec/fixtures/search/node.json +1 -0
  76. data/spec/fixtures/search/role.json +1 -0
  77. data/spec/spec_helper.rb +5 -4
  78. data/spec/spice/base_spec.rb +34 -0
  79. data/spec/spice/client_spec.rb +0 -61
  80. data/spec/spice/config_spec.rb +14 -0
  81. data/spec/spice/connection/clients_spec.rb +82 -0
  82. data/spec/spice/connection/cookbooks_spec.rb +86 -0
  83. data/spec/spice/connection/data_bags_spec.rb +126 -0
  84. data/spec/spice/connection_spec.rb +63 -0
  85. data/spec/spice/cookbook_spec.rb +0 -61
  86. data/spec/spice/data_bag_item_spec.rb +7 -0
  87. data/spec/spice/data_bag_spec.rb +0 -160
  88. data/spec/spice/environment_spec.rb +0 -89
  89. data/spec/spice/node_spec.rb +0 -74
  90. data/spec/spice/role_spec.rb +0 -61
  91. data/spec/spice_spec.rb +8 -116
  92. data/spec/support/helpers.rb +58 -0
  93. data/spice.gemspec +13 -15
  94. metadata +227 -87
  95. data/.watchr +0 -22
  96. data/lib/spice/connection/authentication.rb +0 -47
  97. data/lib/spice/mock.rb +0 -46
  98. data/lib/spice/persistence.rb +0 -62
  99. data/spec/spice/chef_spec.rb +0 -52
  100. data/spec/spice/search_spec.rb +0 -2
  101. data/spec/support/chef_requests.rb +0 -0
  102. data/spec/support/client_requests.rb +0 -95
  103. data/spec/support/cookbook_requests.rb +0 -95
  104. data/spec/support/data_bag_item_requests.rb +0 -138
  105. data/spec/support/data_bag_requests.rb +0 -95
  106. data/spec/support/environment_requests.rb +0 -221
  107. data/spec/support/node_requests.rb +0 -138
  108. data/spec/support/respond_with_matcher.rb +0 -53
  109. data/spec/support/role_requests.rb +0 -95
data/.gitignore CHANGED
@@ -7,3 +7,5 @@ doc/**/*
7
7
  .yardoc/*
8
8
  Gemfile.lock
9
9
  fixture.rb
10
+ coverage
11
+ wiki
data/Gemfile CHANGED
@@ -2,20 +2,6 @@ source "http://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
- group :development, :test do
6
- gem 'rake'
7
- gem 'rspec', '>= 2.8.0'
8
- gem "webmock", ">= 1.7.10"
9
- gem "timecop", ">= 0.3.5"
10
- gem 'fakefs', '>= 0.3.2'
11
- gem 'guard', '>= 0.10.0'
12
- gem 'guard-rspec', '>= 0.6.0'
13
- gem 'guard-spork', '>= 0.5.1'
14
- gem 'spork', '>= 0.9.0.rc9'
15
- gem 'rb-fsevent', '>= 0.4.3.1'
16
- gem 'growl', '>= 1.0.3'
17
- end
18
-
19
5
  group :doc do
20
6
  gem 'yard'
21
7
  gem 'redcarpet'
data/README.md CHANGED
@@ -24,7 +24,7 @@ Explicitly setting a `host`, `port`, and `scheme` value has been removed in favo
24
24
 
25
25
  ### Hat tip
26
26
 
27
- Spice is very heavily inspired by the [Twitter gem](http://github.com/jnunemaker/twitter). Mad props to those folks.
27
+ The design and organization of Spice is very heavily inspired by the [Twitter gem](http://github.com/jnunemaker/twitter). Mad props to those folks.
28
28
 
29
29
  ## Contributing to spice
30
30
 
data/Rakefile CHANGED
@@ -18,11 +18,11 @@ task :spork do
18
18
  sh %{bundle exec spork}
19
19
  end
20
20
 
21
-
22
21
  Bundler.require(:doc)
23
22
  desc "Generate documentation"
24
23
  YARD::Rake::YardocTask.new do |t|
25
24
  t.files = [ 'lib/**/*.rb' ]
25
+ t.options = [ "--markup-provider=redcarpet", "--markup=markdown" ]
26
26
  end
27
27
 
28
28
  desc "Generate docs"
data/TODO.md CHANGED
@@ -1,2 +1,3 @@
1
1
  * Refactor classes that inherit from Spice::Chef to take config values
2
- * Add support for data bag item creation
2
+ * Add support for data bag item creation
3
+ * implement GET /cookbooks?num_versions=all
@@ -1,81 +1,56 @@
1
- require 'virtus'
2
- require 'aequitas'
3
- require 'active_model/callbacks'
4
- require 'active_support/core_ext/hash/deep_merge'
5
- require 'active_support/core_ext/hash/keys'
6
- require 'mixlib/authentication'
1
+ require 'spice/core_ext/mash'
7
2
 
8
3
  require 'spice/config'
9
- require 'spice/error'
10
- require 'spice/authentication'
11
-
12
- require 'spice/role'
13
- require 'spice/client'
14
- require 'spice/cookbook'
15
- require 'spice/cookbook_version'
16
- require 'spice/data_bag'
17
- require 'spice/data_bag_item'
18
- require 'spice/node'
19
- require 'spice/environment'
20
4
  require 'spice/connection'
21
5
 
22
- require 'spice/connection/clients'
23
- require 'spice/connection/cookbooks'
24
- require 'spice/connection/data_bags'
25
- require 'spice/connection/environments'
26
- require 'spice/connection/nodes'
27
- require 'spice/connection/roles'
28
- require 'spice/connection/search'
29
-
30
- require 'spice/version'
31
- require 'spice/mock'
32
-
33
6
  module Spice
34
- extend Config
35
- extend self
7
+ extend Spice::Config
36
8
 
37
- extend Spice::Connection::Clients
38
- extend Spice::Connection::Cookbooks
39
- extend Spice::Connection::DataBags
40
- extend Spice::Connection::Environments
41
- extend Spice::Connection::Nodes
42
- extend Spice::Connection::Roles
43
- extend Spice::Connection::Search
9
+ class << self
10
+ # Convience alias for Spice::Connection.new
11
+ #
12
+ # return [Spice::Connection]
13
+ def new(options=Mash.new)
14
+ Spice::Connection.new(options)
15
+ end # def new
44
16
 
45
- def connection
46
- @connection ||= Connection.new(
47
- :server_url => server_url,
48
- :client_name => client_name,
49
- :key_file => key_file
50
- )
51
- end
52
-
53
- def mock
54
- Spice::Mock.setup_mock_client
55
- end
56
-
57
- # def autoconfigure!(path=nil)
58
- # path ||= "~/.chef/"
59
- # knife = File.exist?("~/.chef/knife.rb") && File.expand_path(path + "~/.chef/knife.rb")
60
- # client = File.exist?("/etc/chef/client.rb") && File.expand_path("/etc/chef/client.rb")
61
- #
62
- # if knife
63
- # raw_config = IO.read(knife)
64
- # elsif
65
- # raw_config = IO.read(client)
66
- # end
67
- #
68
- # @values = {}
69
- # raw_config.each_line do |line|
70
- # if line =~ /^chef_server_url.*/
71
- # @values[:chef_server_url] = parse_line(line)
72
- # elsif line =~ /^node_name.*/
73
- # @values[:node_name] = parse_line(line)
74
- # elsif line =~ /^client_key.*/
75
- # @values[:client_key] = parse_line(line)
76
- # end
77
- # end
78
- # end
17
+ # Delegate methods to Spice::Connection
18
+ def method_missing(method, *args, &block)
19
+ return super unless new.respond_to?(method)
20
+ new.send(method, *args, &block)
21
+ end # def method_missing
22
+
23
+ def respond_to?(method, include_private=false)
24
+ new.respond_to?(method, include_private) || super(method, include_private)
25
+ end # def respond_to?
26
+
27
+ def mock
28
+ Spice.server_url = 'http://localhost:4000'
29
+ Spice.client_name = "testclient"
30
+ Spice.client_key = Spice.read_key_file(File.expand_path("../../spec/fixtures/client.pem", __FILE__))
31
+ Spice.chef_version = "0.10.10"
32
+ self
33
+ end # def mock
34
+
35
+ def read_key_file(key_file_path)
36
+
37
+ begin
38
+ raw_key = File.read(key_file_path).strip
39
+ rescue SystemCallError, IOError => e
40
+ raise IOError, "Unable to read #{key_file_path}"
41
+ end
42
+
43
+ begin_rsa = "-----BEGIN RSA PRIVATE KEY-----"
44
+ end_rsa = "-----END RSA PRIVATE KEY-----"
45
+
46
+ unless (raw_key =~ /\A#{begin_rsa}$/) && (raw_key =~ /^#{end_rsa}\Z/)
47
+ msg = "The file #{key_file} is not a properly formatted private key.\n"
48
+ msg << "It must contain '#{begin_rsa}' and '#{end_rsa}'"
49
+ raise ArgumentError, msg
50
+ end
51
+ return OpenSSL::PKey::RSA.new(raw_key)
52
+ end # def read_key_file
79
53
 
54
+ end # class << self
55
+ end # module Spice
80
56
 
81
- end
@@ -1,52 +1,30 @@
1
1
  require 'openssl'
2
+ # require 'mixlib/authentication'
2
3
  require 'mixlib/authentication/signedheaderauth'
3
4
 
4
5
  module Spice
5
- class Authentication
6
- attr_reader :key_file, :client_name, :key, :raw_key
6
+ module Authentication
7
7
 
8
- def initialize(client_name=nil, key_file=nil)
9
- @client_name, @key_file = client_name, key_file
10
- load_signing_key if sign_requests?
11
- end
12
-
13
- def sign_requests?
14
- !!key_file
15
- end
16
-
17
- def signature_headers(request_params={})
18
- request_params = request_params.dup
19
- request_params[:timestamp] = Time.now.utc.iso8601
20
- request_params[:user_id] = client_name
21
- host = request_params.delete(:host) || "localhost"
8
+ def signature_headers(method, path, json_body=nil)
9
+ uri = URI(server_url)
22
10
 
23
- sign_obj = Mixlib::Authentication::SignedHeaderAuth.signing_object(request_params)
24
- signed = sign_obj.sign(key).merge({:host => host})
25
- signed.inject({}){|memo, kv| memo["#{kv[0].to_s.upcase}"] = kv[1];memo}
11
+ params = {
12
+ :http_method => method,
13
+ :path => path,
14
+ :body => json_body || "",
15
+ :host => "#{uri.host}:#{uri.port}",
16
+ :timestamp => Time.now.utc.iso8601,
17
+ :user_id => client_name
18
+ }
19
+
20
+ signing_object = Mixlib::Authentication::SignedHeaderAuth.signing_object(params)
21
+ signed_headers = signing_object.sign(client_key)
22
+
26
23
  # Platform requires X-Chef-Version header
27
- version = { "X-Chef-Version" => Spice.chef_version }
28
- signed.merge!(version)
29
- end
30
-
31
- private
32
-
33
- def load_signing_key
34
- begin
35
- @raw_key = File.read(key_file).strip
36
- rescue SystemCallError, IOError => e
37
- raise IOError, "Unable to read #{key_file}"
38
- end
39
- assert_valid_key_format!(@raw_key)
40
- @key = OpenSSL::PKey::RSA.new(@raw_key)
41
- end
42
-
43
- def assert_valid_key_format!(raw_key)
44
- unless (raw_key =~ /\A-----BEGIN RSA PRIVATE KEY-----$/) &&
45
- (raw_key =~ /^-----END RSA PRIVATE KEY-----\Z/)
46
- msg = "The file #{key_file} does not contain a correctly formatted private key.\n"
47
- msg << "The key file should begin with '-----BEGIN RSA PRIVATE KEY-----' and end with '-----END RSA PRIVATE KEY-----'"
48
- raise ArgumentError, msg
49
- end
50
- end
51
- end
52
- end
24
+ signed_headers['X-Chef-Version'] = chef_version
25
+ # signed_headers['Content-Length'] = json_body.bytesize.to_s if json_body
26
+ signed_headers
27
+ end # def signature_headers
28
+
29
+ end # module Authentication
30
+ end # module Spice
@@ -0,0 +1,104 @@
1
+ require 'spice/identity_map'
2
+
3
+ module Spice
4
+ class Base
5
+ attr_accessor :attrs
6
+ alias :to_hash :attrs
7
+
8
+ @@identity_map = IdentityMap.new
9
+
10
+ def self.identity_map
11
+ @@identity_map
12
+ end # def self.identity_map
13
+
14
+ # Define methods that retrieve the value from an initialized instance variable Hash, using the attribute as a key
15
+ #
16
+ # @overload self.attr_reader(attr)
17
+ # @param attr [Symbol]
18
+ # @overload self.attr_reader(attrs)
19
+ # @param attrs [Array<Symbol>]
20
+ def self.attr_reader(*attrs)
21
+ attrs.each do |attribute|
22
+ class_eval do
23
+ define_method attribute do
24
+ @attrs[attribute.to_s]
25
+ end
26
+ define_method "#{attribute}=" do |value|
27
+ @attrs[attribute.to_s] = value
28
+ end
29
+ end
30
+ end
31
+ end # def self.attr_reader
32
+
33
+ def self.get(attrs=Mash.new)
34
+ @@identity_map[self] ||= {}
35
+ if attrs['name']
36
+ @@identity_map[self][attrs['name']] && @@identity_map[self][attrs['name']].update(attrs)
37
+ elsif attrs['id']
38
+ @@identity_map[self][attrs['id']] && @@identity_map[self][attrs['id']].update(attrs)
39
+ else
40
+ @@identity_map[self][Marshal.dump(attrs)]
41
+ end
42
+ end # def self.get
43
+
44
+ # Retrieve an object from the identity map or initialize a new object
45
+ def self.get_or_new(attrs=Mash.new)
46
+ self.get(attrs) || self.new(attrs)
47
+ end # def self.get_or_new
48
+
49
+ # Initializes a new object
50
+ #
51
+ # @param attrs [Hash]
52
+ # @return [Spice::Base]
53
+ def initialize(attrs=Mash.new)
54
+ self.class.attr_reader *attrs.keys
55
+ attrs.stringify_keys!
56
+ if attrs['name']
57
+ self.update(attrs)
58
+ @@identity_map[self.class] ||= {}
59
+ @@identity_map[self.class][attrs['name']] = self
60
+ elsif attrs['id']
61
+ self.update(attrs)
62
+ @@identity_map[self.class] ||= {}
63
+ @@identity_map[self.class][attrs['id']] = self
64
+ else
65
+ self.update(attrs)
66
+ @@identity_map[self.class] ||= {}
67
+ @@identity_map[self.class][Marshal.dump(attrs)] = self
68
+ end
69
+ end # def initialize
70
+
71
+ # Fetches an attribute of an object using hash notation
72
+ #
73
+ # @param method [String, Symbol] Message to send to the object
74
+ def [](method)
75
+ self.__send__(method.to_sym)
76
+ rescue NoMethodError
77
+ nil
78
+ end # def []
79
+
80
+ # Update the attributes of an object
81
+ #
82
+ # @param attrs [Hash]
83
+ # @return [Spice::Base]
84
+ def update(attrs)
85
+ @attrs = attrs
86
+ self
87
+ end # def update
88
+
89
+ # @return [Integer]
90
+ def id
91
+ @attrs['id']
92
+ end # def id
93
+
94
+ # @return [String]
95
+ def name
96
+ @attrs['name']
97
+ end # def name
98
+
99
+ def keys
100
+ @attrs.keys
101
+ end # def keys
102
+
103
+ end
104
+ end
@@ -1,55 +1,15 @@
1
- require 'spice/persistence'
1
+ require 'spice/base'
2
2
 
3
3
  module Spice
4
- class Client
5
- include Virtus
6
- include Aequitas
7
- include Spice::Persistence
8
- extend Spice::Persistence
4
+ class Client < Base
5
+ attr_reader :name, :public_key, :private_key, :_rev, :admin
9
6
 
10
- endpoint "clients"
11
-
12
- # @macro [attach] attribute
13
- # @attribute [rw]
14
- # @return [$2] the $1 attribute
15
- attribute :name, String
16
- attribute :public_key, String
17
- attribute :private_key, String
18
- attribute :_rev, String
19
- attribute :json_class, String, :default => "Chef::ApiClient"
20
- attribute :admin, Boolean, :default => false
21
- attribute :chef_type, String, :default => "client"
22
-
23
- validates_presence_of :name, :json_class, :chef_type
24
-
25
- after_create :wat
26
- def wat
27
- puts "WAT"
28
- end
29
-
30
- def do_post
31
- response = connection.post("/clients", :name => name)
32
- update_attributes(response.body)
33
- response = connection.get("/clients/#{name}")
34
- update_attributes(response.body)
35
- end
36
-
37
- def do_put
38
- response = connection.put("/clients/#{name}", attributes)
7
+ def initialize(attrs=Mash.new)
8
+ super
9
+ @attrs['json_class'] ||= "Chef::ApiClient"
10
+ @attrs['chef_type'] ||= 'client'
11
+ @attrs['admin'] ||= false
39
12
  end
40
13
 
41
- def self.get(name)
42
- connection.client(name)
43
- end
44
-
45
- # Check if the client exists on the Chef server
46
- def new_record?
47
- begin
48
- connection.get("/clients/#{name}")
49
- return false
50
- rescue Spice::Error::NotFound
51
- return true
52
- end
53
- end
54
14
  end
55
15
  end
@@ -1,12 +1,16 @@
1
+ require 'faraday'
2
+ require 'spice/response/parse_json'
3
+ require 'spice/response/client_error'
1
4
  require 'spice/version'
2
5
 
3
6
  module Spice
4
7
  module Config
8
+
5
9
  # The default Chef server URL
6
10
  DEFAULT_SERVER_URL = "http://localhost:4000"
7
11
 
8
12
  # The default Chef version (changing this will enable disable certain features)
9
- DEFAULT_CHEF_VERSION = "0.10.8"
13
+ DEFAULT_CHEF_VERSION = "0.10.10"
10
14
 
11
15
  # The default Spice User-Agent header
12
16
  DEFAULT_USER_AGENT = "Spice #{Spice::VERSION}"
@@ -14,17 +18,31 @@ module Spice
14
18
  # Default connection options
15
19
  DEFAULT_CONNECTION_OPTIONS = {}
16
20
 
21
+ # Default client name
22
+ DEFAULT_CLIENT_NAME = ""
23
+
24
+ # Default key file
25
+ DEFAULT_CLIENT_KEY = ""
26
+
17
27
  # An array of valid config options
28
+
18
29
  VALID_OPTIONS_KEYS = [
19
30
  :server_url,
20
31
  :client_name,
21
- :key_file,
22
- :raw_key,
32
+ :client_key,
23
33
  :chef_version,
24
34
  :user_agent,
25
- :connection_options
35
+ :connection_options,
36
+ :middleware
26
37
  ]
27
38
 
39
+ # Default middleware stack
40
+ DEFAULT_MIDDLEWARE = Proc.new do |builder|
41
+ builder.use Spice::Response::ParseJSON
42
+ builder.use Spice::Response::ClientError
43
+ builder.adapter Faraday.default_adapter
44
+ end
45
+
28
46
  VALID_OPTIONS_KEYS.each do |key|
29
47
  attr_accessor key
30
48
  end
@@ -32,40 +50,40 @@ module Spice
32
50
  # Reset all config options to default when the module is extended
33
51
  def self.extended(base)
34
52
  base.reset
35
- end
53
+ end # def self.extended
36
54
 
37
55
  # Convenience method to configure Spice in a block
38
56
  # @example Configuring spice
39
57
  # Spice.setup do |s|
40
58
  # s.server_url = "http://chef.example.com:4000"
41
59
  # s.client_name = "admin"
42
- # s.key_file = "/home/admin/.chef/admin.pem"
60
+ # s.client_key = Spice.read_key_file("/path/to/key_file.pem")
43
61
  # end
44
62
  # @yieldparam Spice
45
- # @yieldreturn Spice
46
-
63
+ # @yieldreturn Spice
47
64
  def setup
48
65
  yield self
49
66
  self
50
- end
67
+ end # def setup
51
68
 
52
69
  # Create an options hash from valid options keys
53
70
  def options
54
71
  options = {}
55
72
  VALID_OPTIONS_KEYS.each{|k| options[k] = send(k)}
56
73
  options
57
- end
74
+ end # def options
58
75
 
59
76
  # Reset all config options to their defaults
60
77
  def reset
61
- self.user_agent = DEFAULT_USER_AGENT
62
- self.server_url = DEFAULT_SERVER_URL
63
- self.chef_version = DEFAULT_CHEF_VERSION
64
- self.client_name = nil
65
- self.key_file = nil
66
- self.raw_key = nil
78
+ self.user_agent = DEFAULT_USER_AGENT
79
+ self.server_url = DEFAULT_SERVER_URL
80
+ self.chef_version = DEFAULT_CHEF_VERSION
81
+ self.client_name = DEFAULT_CLIENT_NAME
82
+ self.client_key = DEFAULT_CLIENT_KEY
67
83
  self.connection_options = DEFAULT_CONNECTION_OPTIONS
68
- end
84
+ self.middleware = DEFAULT_MIDDLEWARE
85
+ self
86
+ end # def reset
69
87
 
70
- end
71
- end
88
+ end # module Config
89
+ end # module Spice