chef-api 0.9.0 → 0.10.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/lib/chef-api.rb +19 -20
  3. data/lib/chef-api/aclable.rb +35 -0
  4. data/lib/chef-api/authentication.rb +23 -25
  5. data/lib/chef-api/configurable.rb +14 -14
  6. data/lib/chef-api/connection.rb +69 -68
  7. data/lib/chef-api/defaults.rb +25 -24
  8. data/lib/chef-api/error_collection.rb +1 -1
  9. data/lib/chef-api/errors.rb +3 -3
  10. data/lib/chef-api/log.rb +7 -0
  11. data/lib/chef-api/multipart.rb +17 -17
  12. data/lib/chef-api/resource.rb +17 -15
  13. data/lib/chef-api/resources/base.rb +25 -23
  14. data/lib/chef-api/resources/client.rb +5 -3
  15. data/lib/chef-api/resources/collection_proxy.rb +4 -3
  16. data/lib/chef-api/resources/cookbook.rb +2 -2
  17. data/lib/chef-api/resources/cookbook_version.rb +1 -1
  18. data/lib/chef-api/resources/data_bag.rb +4 -4
  19. data/lib/chef-api/resources/data_bag_item.rb +2 -3
  20. data/lib/chef-api/resources/environment.rb +1 -1
  21. data/lib/chef-api/resources/group.rb +15 -0
  22. data/lib/chef-api/resources/node.rb +11 -8
  23. data/lib/chef-api/resources/organization.rb +2 -2
  24. data/lib/chef-api/resources/partial_search.rb +4 -4
  25. data/lib/chef-api/resources/principal.rb +1 -1
  26. data/lib/chef-api/resources/role.rb +2 -1
  27. data/lib/chef-api/resources/search.rb +6 -6
  28. data/lib/chef-api/resources/user.rb +5 -3
  29. data/lib/chef-api/util.rb +8 -8
  30. data/lib/chef-api/validator.rb +3 -3
  31. data/lib/chef-api/validators/base.rb +3 -3
  32. data/lib/chef-api/validators/required.rb +1 -1
  33. data/lib/chef-api/validators/type.rb +1 -1
  34. data/lib/chef-api/version.rb +1 -1
  35. data/templates/errors/abstract_method.erb +5 -0
  36. data/templates/errors/cannot_regenerate_key.erb +1 -0
  37. data/templates/errors/chef_api_error.erb +1 -0
  38. data/templates/errors/file_not_found.erb +1 -0
  39. data/templates/errors/http_bad_request.erb +3 -0
  40. data/templates/errors/http_forbidden_request.erb +3 -0
  41. data/templates/errors/http_gateway_timeout.erb +3 -0
  42. data/templates/errors/http_method_not_allowed.erb +3 -0
  43. data/templates/errors/http_not_acceptable.erb +3 -0
  44. data/templates/errors/http_not_found.erb +3 -0
  45. data/templates/errors/http_server_unavailable.erb +1 -0
  46. data/templates/errors/http_unauthorized_request.erb +3 -0
  47. data/templates/errors/insufficient_file_permissions.erb +1 -0
  48. data/templates/errors/invalid_resource.erb +1 -0
  49. data/templates/errors/invalid_validator.erb +1 -0
  50. data/templates/errors/missing_url_parameter.erb +1 -0
  51. data/templates/errors/not_a_directory.erb +1 -0
  52. data/templates/errors/resource_already_exists.erb +1 -0
  53. data/templates/errors/resource_not_found.erb +1 -0
  54. data/templates/errors/resource_not_mutable.erb +1 -0
  55. data/templates/errors/unknown_attribute.erb +1 -0
  56. metadata +44 -13
@@ -1,11 +1,11 @@
1
- require 'chef-api/version'
2
- require 'pathname'
3
- require 'json'
1
+ require_relative "version"
2
+ require "pathname" unless defined?(Pathname)
3
+ require "json" unless defined?(JSON)
4
4
 
5
5
  module ChefAPI
6
6
  module Defaults
7
7
  # Default API endpoint
8
- ENDPOINT = 'https://api.opscode.com/'.freeze
8
+ ENDPOINT = "https://api.opscode.com/".freeze
9
9
 
10
10
  # Default User Agent header string
11
11
  USER_AGENT = "ChefAPI Ruby Gem #{ChefAPI::VERSION}".freeze
@@ -37,7 +37,7 @@ module ChefAPI
37
37
  if result = chef_api_config_path
38
38
  Pathname(result).expand_path
39
39
  else
40
- Pathname('')
40
+ Pathname("")
41
41
  end
42
42
  end
43
43
 
@@ -46,8 +46,8 @@ module ChefAPI
46
46
  #
47
47
  # @return [String, nil] Path to config file, or nil
48
48
  def chef_api_config_path
49
- ENV['CHEF_API_CONFIG'] || if ENV.key?('HOME')
50
- '~/.chef-api'
49
+ ENV["CHEF_API_CONFIG"] || if ENV.key?("HOME")
50
+ "~/.chef-api"
51
51
  else
52
52
  nil
53
53
  end
@@ -70,7 +70,7 @@ module ChefAPI
70
70
  # @return [String] (default: +https://api.opscode.com/+)
71
71
  #
72
72
  def endpoint
73
- ENV['CHEF_API_ENDPOINT'] || config['CHEF_API_ENDPOINT'] || ENDPOINT
73
+ ENV["CHEF_API_ENDPOINT"] || config["CHEF_API_ENDPOINT"] || ENDPOINT
74
74
  end
75
75
 
76
76
  #
@@ -85,12 +85,12 @@ module ChefAPI
85
85
  # @return [true, false]
86
86
  #
87
87
  def flavor
88
- if ENV['CHEF_API_FLAVOR']
89
- ENV['CHEF_API_FLAVOR'].to_sym
90
- elsif config['CHEF_API_FLAVOR']
91
- config['CHEF_API_FLAVOR']
88
+ if ENV["CHEF_API_FLAVOR"]
89
+ ENV["CHEF_API_FLAVOR"].to_sym
90
+ elsif config["CHEF_API_FLAVOR"]
91
+ config["CHEF_API_FLAVOR"]
92
92
  else
93
- endpoint.include?('/organizations') ? :enterprise : :open_source
93
+ endpoint.include?("/organizations") ? :enterprise : :open_source
94
94
  end
95
95
  end
96
96
 
@@ -100,7 +100,7 @@ module ChefAPI
100
100
  # @return [String]
101
101
  #
102
102
  def user_agent
103
- ENV['CHEF_API_USER_AGENT'] || config['CHEF_API_USER_AGENT'] || USER_AGENT
103
+ ENV["CHEF_API_USER_AGENT"] || config["CHEF_API_USER_AGENT"] || USER_AGENT
104
104
  end
105
105
 
106
106
  #
@@ -111,7 +111,7 @@ module ChefAPI
111
111
  # @return [String, nil]
112
112
  #
113
113
  def client
114
- ENV['CHEF_API_CLIENT'] || config['CHEF_API_CLIENT']
114
+ ENV["CHEF_API_CLIENT"] || config["CHEF_API_CLIENT"]
115
115
  end
116
116
 
117
117
  #
@@ -122,15 +122,16 @@ module ChefAPI
122
122
  # @return [String, nil]
123
123
  #
124
124
  def key
125
- ENV['CHEF_API_KEY'] || config['CHEF_API_KEY']
125
+ ENV["CHEF_API_KEY"] || config["CHEF_API_KEY"]
126
126
  end
127
+
127
128
  #
128
129
  # The HTTP Proxy server address as a string
129
130
  #
130
131
  # @return [String, nil]
131
132
  #
132
133
  def proxy_address
133
- ENV['CHEF_API_PROXY_ADDRESS'] || config['CHEF_API_PROXY_ADDRESS']
134
+ ENV["CHEF_API_PROXY_ADDRESS"] || config["CHEF_API_PROXY_ADDRESS"]
134
135
  end
135
136
 
136
137
  #
@@ -139,7 +140,7 @@ module ChefAPI
139
140
  # @return [String, nil]
140
141
  #
141
142
  def proxy_password
142
- ENV['CHEF_API_PROXY_PASSWORD'] || config['CHEF_API_PROXY_PASSWORD']
143
+ ENV["CHEF_API_PROXY_PASSWORD"] || config["CHEF_API_PROXY_PASSWORD"]
143
144
  end
144
145
 
145
146
  #
@@ -148,7 +149,7 @@ module ChefAPI
148
149
  # @return [String, nil]
149
150
  #
150
151
  def proxy_port
151
- ENV['CHEF_API_PROXY_PORT'] || config['CHEF_API_PROXY_PORT']
152
+ ENV["CHEF_API_PROXY_PORT"] || config["CHEF_API_PROXY_PORT"]
152
153
  end
153
154
 
154
155
  #
@@ -157,7 +158,7 @@ module ChefAPI
157
158
  # @return [String, nil]
158
159
  #
159
160
  def proxy_username
160
- ENV['CHEF_API_PROXY_USERNAME'] || config['CHEF_API_PROXY_USERNAME']
161
+ ENV["CHEF_API_PROXY_USERNAME"] || config["CHEF_API_PROXY_USERNAME"]
161
162
  end
162
163
 
163
164
  #
@@ -166,7 +167,7 @@ module ChefAPI
166
167
  # @return [String, nil]
167
168
  #
168
169
  def ssl_pem_file
169
- ENV['CHEF_API_SSL_PEM_FILE'] || config['CHEF_API_SSL_PEM_FILE']
170
+ ENV["CHEF_API_SSL_PEM_FILE"] || config["CHEF_API_SSL_PEM_FILE"]
170
171
  end
171
172
 
172
173
  #
@@ -175,10 +176,10 @@ module ChefAPI
175
176
  # @return [true, false]
176
177
  #
177
178
  def ssl_verify
178
- if ENV['CHEF_API_SSL_VERIFY'].nil? && config['CHEF_API_SSL_VERIFY'].nil?
179
+ if ENV["CHEF_API_SSL_VERIFY"].nil? && config["CHEF_API_SSL_VERIFY"].nil?
179
180
  true
180
181
  else
181
- %w[t y].include?(ENV['CHEF_API_SSL_VERIFY'].downcase[0]) || config['CHEF_API_SSL_VERIFY']
182
+ %w{t y}.include?(ENV["CHEF_API_SSL_VERIFY"].downcase[0]) || config["CHEF_API_SSL_VERIFY"]
182
183
  end
183
184
  end
184
185
 
@@ -188,7 +189,7 @@ module ChefAPI
188
189
  # @return [Integer, nil]
189
190
  #
190
191
  def read_timeout
191
- timeout_from_env = ENV['CHEF_API_READ_TIMEOUT'] || config['CHEF_API_READ_TIMEOUT']
192
+ timeout_from_env = ENV["CHEF_API_READ_TIMEOUT"] || config["CHEF_API_READ_TIMEOUT"]
192
193
 
193
194
  Integer(timeout_from_env) unless timeout_from_env.nil?
194
195
  end
@@ -34,7 +34,7 @@ module ChefAPI
34
34
  # @return [Array<String>]
35
35
  #
36
36
  def full_messages
37
- self.map do |key, errors|
37
+ map do |key, errors|
38
38
  errors.map do |error|
39
39
  "`#{key}' #{error}"
40
40
  end
@@ -1,4 +1,4 @@
1
- require 'erb'
1
+ require "erb" unless defined?(Erb)
2
2
 
3
3
  module ChefAPI
4
4
  module Error
@@ -31,9 +31,9 @@ module ChefAPI
31
31
  private
32
32
 
33
33
  def template
34
- class_name = self.class.to_s.split('::').last
34
+ class_name = self.class.to_s.split("::").last
35
35
  filename = @filename || Util.underscore(class_name)
36
- ChefAPI.root.join('templates', 'errors', "#{filename}.erb")
36
+ ChefAPI.root.join("templates", "errors", "#{filename}.erb")
37
37
  end
38
38
  end
39
39
 
@@ -0,0 +1,7 @@
1
+ require "mixlib/log"
2
+
3
+ module ChefAPI
4
+ class Log
5
+ extend Mixlib::Log
6
+ end
7
+ end
@@ -1,9 +1,9 @@
1
- require 'cgi'
2
- require 'mime/types'
1
+ require "cgi" unless defined?(CGI)
2
+ require "mime/types" unless defined?(MIME::Types)
3
3
 
4
4
  module ChefAPI
5
5
  module Multipart
6
- BOUNDARY = '------ChefAPIMultipartBoundary'.freeze
6
+ BOUNDARY = "------ChefAPIMultipartBoundary".freeze
7
7
 
8
8
  class Body
9
9
  def initialize(params = {})
@@ -48,12 +48,12 @@ module ChefAPI
48
48
  # Read from IOs in order until `length` bytes have been received.
49
49
  def read(length = nil, outbuf = nil)
50
50
  got_result = false
51
- outbuf = outbuf ? outbuf.replace('') : ''
51
+ outbuf = outbuf ? outbuf.replace("") : ""
52
52
 
53
53
  while io = current_io
54
54
  if result = io.read(length)
55
55
  got_result ||= !result.nil?
56
- result.force_encoding('BINARY') if result.respond_to?(:force_encoding)
56
+ result.force_encoding("BINARY") if result.respond_to?(:force_encoding)
57
57
  outbuf << result
58
58
  length -= result.length if length
59
59
  break if length == 0
@@ -65,7 +65,7 @@ module ChefAPI
65
65
  end
66
66
 
67
67
  def rewind
68
- @ios.each { |io| io.rewind }
68
+ @ios.each(&:rewind)
69
69
  @index = 0
70
70
  end
71
71
 
@@ -99,9 +99,9 @@ module ChefAPI
99
99
  private
100
100
 
101
101
  def build(name, value)
102
- part = %|--#{BOUNDARY}\r\n|
103
- part << %|Content-Disposition: form-data; name="#{CGI.escape(name)}"\r\n\r\n|
104
- part << %|#{value}\r\n|
102
+ part = %{--#{BOUNDARY}\r\n}
103
+ part << %{Content-Disposition: form-data; name="#{CGI.escape(name)}"\r\n\r\n}
104
+ part << %{#{value}\r\n}
105
105
  part
106
106
  end
107
107
  end
@@ -132,14 +132,14 @@ module ChefAPI
132
132
 
133
133
  def build(name, file)
134
134
  filename = File.basename(file.path)
135
- mime_type = MIME::Types.type_for(filename)[0] || MIME::Types['application/octet-stream'][0]
136
-
137
- part = %|--#{BOUNDARY}\r\n|
138
- part << %|Content-Disposition: form-data; name="#{CGI.escape(name)}"; filename="#{filename}"\r\n|
139
- part << %|Content-Length: #{file.size}\r\n|
140
- part << %|Content-Type: #{mime_type.simplified}\r\n|
141
- part << %|Content-Transfer-Encoding: binary\r\n|
142
- part << %|\r\n|
135
+ mime_type = MIME::Types.type_for(filename)[0] || MIME::Types["application/octet-stream"][0]
136
+
137
+ part = %{--#{BOUNDARY}\r\n}
138
+ part << %{Content-Disposition: form-data; name="#{CGI.escape(name)}"; filename="#{filename}"\r\n}
139
+ part << %{Content-Length: #{file.size}\r\n}
140
+ part << %{Content-Type: #{mime_type.simplified}\r\n}
141
+ part << %{Content-Transfer-Encoding: binary\r\n}
142
+ part << %{\r\n}
143
143
  part
144
144
  end
145
145
  end
@@ -1,19 +1,21 @@
1
+ require_relative "aclable"
1
2
  module ChefAPI
2
3
  module Resource
3
- autoload :Base, 'chef-api/resources/base'
4
- autoload :Client, 'chef-api/resources/client'
5
- autoload :CollectionProxy, 'chef-api/resources/collection_proxy'
6
- autoload :Cookbook, 'chef-api/resources/cookbook'
7
- autoload :CookbookVersion, 'chef-api/resources/cookbook_version'
8
- autoload :DataBag, 'chef-api/resources/data_bag'
9
- autoload :DataBagItem, 'chef-api/resources/data_bag_item'
10
- autoload :Environment, 'chef-api/resources/environment'
11
- autoload :Node, 'chef-api/resources/node'
12
- autoload :Organization, 'chef-api/resources/organization'
13
- autoload :PartialSearch, 'chef-api/resources/partial_search'
14
- autoload :Principal, 'chef-api/resources/principal'
15
- autoload :Role, 'chef-api/resources/role'
16
- autoload :Search, 'chef-api/resources/search'
17
- autoload :User, 'chef-api/resources/user'
4
+ autoload :Base, "chef-api/resources/base"
5
+ autoload :Client, "chef-api/resources/client"
6
+ autoload :CollectionProxy, "chef-api/resources/collection_proxy"
7
+ autoload :Cookbook, "chef-api/resources/cookbook"
8
+ autoload :CookbookVersion, "chef-api/resources/cookbook_version"
9
+ autoload :DataBag, "chef-api/resources/data_bag"
10
+ autoload :DataBagItem, "chef-api/resources/data_bag_item"
11
+ autoload :Environment, "chef-api/resources/environment"
12
+ autoload :Group, "chef-api/resources/group"
13
+ autoload :Node, "chef-api/resources/node"
14
+ autoload :Organization, "chef-api/resources/organization"
15
+ autoload :PartialSearch, "chef-api/resources/partial_search"
16
+ autoload :Principal, "chef-api/resources/principal"
17
+ autoload :Role, "chef-api/resources/role"
18
+ autoload :Search, "chef-api/resources/search"
19
+ autoload :User, "chef-api/resources/user"
18
20
  end
19
21
  end
@@ -1,6 +1,8 @@
1
1
  module ChefAPI
2
2
  class Resource::Base
3
3
  class << self
4
+ require "cgi" unless defined?(CGI)
5
+
4
6
  # Including the Enumberable module gives us magic
5
7
  include Enumerable
6
8
 
@@ -13,7 +15,7 @@ module ChefAPI
13
15
  # the path to the file on disk
14
16
  #
15
17
  def from_file(path)
16
- raise Error::AbstractMethod.new(method: 'Resource::Base#from_file')
18
+ raise Error::AbstractMethod.new(method: "Resource::Base#from_file")
17
19
  end
18
20
 
19
21
  #
@@ -78,7 +80,7 @@ module ChefAPI
78
80
  # has_many :environments, class_name: 'Environment'
79
81
  #
80
82
  def has_many(method, options = {})
81
- class_name = options[:class_name] || "Resource::#{Util.camelize(method).sub(/s$/, '')}"
83
+ class_name = options[:class_name] || "Resource::#{Util.camelize(method).sub(/s$/, "")}"
82
84
  rest_endpoint = options[:rest_endpoint] || method
83
85
 
84
86
  class_eval <<-EOH, __FILE__, __LINE__ + 1
@@ -227,7 +229,7 @@ module ChefAPI
227
229
  # an array containing the list of resources that were deleted
228
230
  #
229
231
  def destroy_all(prefix = {})
230
- map { |resource| resource.destroy }
232
+ map(&:destroy)
231
233
  end
232
234
 
233
235
  #
@@ -404,8 +406,8 @@ module ChefAPI
404
406
  # an instance of the resource represented by this JSON
405
407
  #
406
408
  def from_json(response, prefix = {})
407
- response.delete('json_class')
408
- response.delete('chef_type')
409
+ response.delete("json_class")
410
+ response.delete("chef_type")
409
411
 
410
412
  new(response, prefix)
411
413
  end
@@ -432,7 +434,7 @@ module ChefAPI
432
434
  # @return [String]
433
435
  #
434
436
  def inspect
435
- "#{classname}(#{schema.attributes.keys.join(', ')})"
437
+ "#{classname}(#{schema.attributes.keys.join(", ")})"
436
438
  end
437
439
 
438
440
  #
@@ -444,7 +446,7 @@ module ChefAPI
444
446
  # @return [String]
445
447
  #
446
448
  def classname
447
- name.split('::')[1..-1].join('::')
449
+ name.split("::")[1..-1].join("::")
448
450
  end
449
451
 
450
452
  #
@@ -456,7 +458,7 @@ module ChefAPI
456
458
  # @return [String]
457
459
  #
458
460
  def type
459
- Util.underscore(name.split('::').last).gsub('_', ' ')
461
+ Util.underscore(name.split("::").last).gsub("_", " ")
460
462
  end
461
463
 
462
464
  #
@@ -482,7 +484,7 @@ module ChefAPI
482
484
  # the path to the resource
483
485
  #
484
486
  def resource_path(id, prefix = {})
485
- [expanded_collection_path(prefix), id].join('/')
487
+ [expanded_collection_path(prefix), id].join("/")
486
488
  end
487
489
 
488
490
  #
@@ -505,15 +507,15 @@ module ChefAPI
505
507
  #
506
508
  def expanded_collection_path(prefix = {})
507
509
  collection_path.gsub(/:\w+/) do |param|
508
- key = param.delete(':')
510
+ key = param.delete(":")
509
511
  value = prefix[key] || prefix[key.to_sym]
510
512
 
511
513
  if value.nil?
512
514
  raise Error::MissingURLParameter.new(param: key)
513
515
  end
514
516
 
515
- URI.escape(value)
516
- end.sub(/^\//, '') # Remove leading slash
517
+ CGI.escape(value)
518
+ end.sub(%r{^/}, "") # Remove leading slash
517
519
  end
518
520
 
519
521
  #
@@ -522,7 +524,7 @@ module ChefAPI
522
524
  # @return [ChefAPI::Connection]
523
525
  #
524
526
  def connection
525
- Thread.current['chefapi.connection'] || ChefAPI.connection
527
+ Thread.current["chefapi.connection"] || ChefAPI.connection
526
528
  end
527
529
  end
528
530
 
@@ -620,7 +622,7 @@ module ChefAPI
620
622
  # true if the attribute exists, false otherwise
621
623
  #
622
624
  def attribute?(key)
623
- _attributes.has_key?(key.to_sym)
625
+ _attributes.key?(key.to_sym)
624
626
  end
625
627
 
626
628
  #
@@ -633,12 +635,12 @@ module ChefAPI
633
635
  #
634
636
  def protected?
635
637
  @protected ||= self.class.protected_resources.any? do |thing|
636
- if thing.is_a?(Proc)
637
- thing.call(self)
638
- else
639
- id == thing
640
- end
641
- end
638
+ if thing.is_a?(Proc)
639
+ thing.call(self)
640
+ else
641
+ id == thing
642
+ end
643
+ end
642
644
  end
643
645
 
644
646
  #
@@ -775,7 +777,7 @@ module ChefAPI
775
777
  #
776
778
  def validate!
777
779
  unless valid?
778
- sentence = errors.full_messages.join(', ')
780
+ sentence = errors.full_messages.join(", ")
779
781
  raise Error::InvalidResource.new(errors: sentence)
780
782
  end
781
783
 
@@ -896,7 +898,7 @@ module ChefAPI
896
898
  # @return [Boolean]
897
899
  #
898
900
  def ignore_attribute?(key)
899
- @schema.ignored_attributes.has_key?(key.to_sym)
901
+ @schema.ignored_attributes.key?(key.to_sym)
900
902
  end
901
903
 
902
904
  #
@@ -954,7 +956,7 @@ module ChefAPI
954
956
  end
955
957
  end
956
958
 
957
- "#<#{self.class.classname} #{attrs.join(', ')}>"
959
+ "#<#{self.class.classname} #{attrs.join(", ")}>"
958
960
  end
959
961
  end
960
962
  end