bodhi-slam 0.0.5 → 0.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 74f006a6012ceaab5f918a7b6832a832d1dbf9b4
4
- data.tar.gz: fe5a4a8bdc2c6e803ef560f892fa60a56ab3b79b
3
+ metadata.gz: 9ca91de0d49a0aa3ff8e084024cdc6114444814e
4
+ data.tar.gz: a7d550040d2b4e705ab10c7a0a6a8929aff7b967
5
5
  SHA512:
6
- metadata.gz: 8ca2122a8f1ae97c087033e60d81befc12b3c90f2e7e34595e75cd1907e805192dde8c5eaf870738aa29db56b9c18939cd82eeae7c73193d879e194dab525b7a
7
- data.tar.gz: 9db6d4a31a8893620aded4fb57dcc44b5589c5ae3e283b8d3bc34dd9a1b91bcaf84226998e05aa3d6db47afe7e230953a27020098ec74896b9238e8aa98f23f3
6
+ metadata.gz: 8e9231701b099974ee34f0708740e3882743677861153b82a0c996e218b9be6b66fbb638248af82a204abc1b2ffd7bbaa1a8b7055c78b62dc208203f2d8fe058
7
+ data.tar.gz: a4cc9b671833cf91bb0524d5bc4bd608a33d276f8f7aaa5e93eb00c86f853595675bfd366380704bb59f80a195829358458e7e9a482924d1aed6c7d6fc7be420
@@ -1,4 +1,5 @@
1
1
  require "faraday"
2
+ require 'net/http/persistent'
2
3
  require "factory_girl"
3
4
  require "json"
4
5
  require "time"
@@ -6,10 +7,13 @@ require "time"
6
7
  require 'bodhi-slam/context'
7
8
  require 'bodhi-slam/errors'
8
9
  require 'bodhi-slam/resource'
10
+ require 'bodhi-slam/types'
11
+ require 'bodhi-slam/validations'
12
+ require 'bodhi-slam/enumerations'
9
13
 
10
14
  class BodhiSlam
11
15
  def self.context(params, &block)
12
- bodhi_context = BodhiContext.new params
16
+ bodhi_context = Bodhi::Context.new params
13
17
  raise bodhi_context.errors unless bodhi_context.valid?
14
18
 
15
19
  #puts "Switching context to: #{bodhi_context.attributes}"
@@ -19,116 +23,16 @@ class BodhiSlam
19
23
 
20
24
  def self.analyze(context)
21
25
  raise context.errors unless context.valid?
22
-
23
- #Get the types for this namespace
24
- result = context.connection.get do |request|
25
- request.url "/#{context.namespace}/types"
26
- request.headers[context.credentials_header] = context.credentials
27
- end
28
-
29
- if result.status != 200
30
- errors = JSON.parse result.body
31
- errors.each{|error| error['status'] = result.status } if errors.is_a? Array
32
- errors["status"] = result.status if errors.is_a? Hash
33
- raise errors.to_s
34
- end
35
- types = JSON.parse(result.body)
36
-
37
- #Get the enumerations for this namespace
38
- result = context.connection.get do |request|
39
- request.url "/#{context.namespace}/enums"
40
- request.headers[context.credentials_header] = context.credentials
41
- end
42
-
43
- if result.status != 200
44
- errors = JSON.parse result.body
45
- errors.each{|error| error['status'] = result.status } if errors.is_a? Array
46
- errors["status"] = result.status if errors.is_a? Hash
47
- raise errors.to_s
48
- end
49
- enumerations = JSON.parse(result.body)
50
-
51
- embedded_types = types.select{ |type| type["embedded"] }
52
- normal_types = types.select{ |type| !type["embedded"] }
53
-
54
- embedded_types.each{ |type| create_type(type, enumerations) }
55
- normal_types.each{ |type| create_type(type, enumerations) }
56
26
 
57
- #Party!
58
- end
59
-
60
- # - Create a BodhiResource from the given type definition and enumerations
61
- def self.create_type(type, enumerations)
62
- if type["package"] != "system"
63
- properties = type["properties"].keys.collect{ |key| key.to_sym }
64
- klass = Object.const_set(type["name"], Class.new {
65
- include BodhiResource
66
- attr_accessor *properties
67
- })
68
- klass.define_singleton_method(:find) do |id, context|
69
- result = context.connection.get do |request|
70
- request.url "/#{context.namespace}/resources/#{klass.name}/#{id}"
71
- request.headers[context.credentials_header] = context.credentials
72
- end
73
-
74
- if result.status != 200
75
- errors = JSON.parse result.body
76
- errors.each{|error| error['status'] = result.status } if errors.is_a? Array
77
- errors["status"] = result.status if errors.is_a? Hash
78
- raise errors.to_s
79
- end
27
+ all_types = Bodhi::Type.find_all(context)
28
+ all_enums = Bodhi::Enumeration.find_all(context)
29
+ klasses = all_types.collect{ |type| Bodhi::Type.create_class_with(type) }
80
30
 
81
- object_hash = JSON.parse(result.body)
82
- object_hash["bodhi_context"] = context
83
- return FactoryGirl.build(klass.name, object_hash)
84
- end
31
+ embedded_types = all_types.select{ |type| type.embedded }
32
+ normal_types = all_types.select{ |type| !type.embedded }
85
33
 
86
- create_factory(klass.name, type["properties"], enumerations) unless FactoryGirl.factories.registered?(klass.name)
87
- puts "Created Class & Factory for: #{klass.name}"
88
- end
89
- end
90
-
91
- # - Create a Factory with the given name, properties, and available enumerations
92
- def self.create_factory(name, properties, enumerations)
93
- FactoryGirl.define do
94
- factory name.to_sym do
95
- properties.each_pair do |k,v|
96
- unless v["system"]
97
-
98
- case v["type"]
99
- when "GeoJSON"
100
- send(k) { {type: "Point", coordinates: [10,20]} } if v["multi"].nil?
101
- send(k) { [*0..5].sample.times.collect{ {type: "Point", coordinates: [10,20]} } } if v["multi"]
102
- when "Boolean"
103
- send(k) { [true, false].sample } if v["multi"].nil?
104
- send(k) { [*0..5].sample.times.collect{ [true, false].sample } } if v["multi"]
105
- when "Enumerated"
106
- enum = enumerations.select{ |enumeration| enumeration["name"] == v["ref"].split('.')[0] }[0]
107
- send(k) { enum["values"].sample[v["ref"].split('.')[1]] } if v["multi"].nil?
108
- send(k) { [*0..5].sample.times.collect{ enum["values"].sample[v["ref"].split('.')[1]] } } if v["multi"]
109
- when "Object"
110
- send(k) { {"foo" => SecureRandom.hex} } if v["multi"].nil?
111
- send(k) { [*0..5].sample.times.collect{ {"foo" => SecureRandom.hex} } } if v["multi"]
112
- when "String"
113
- send(k) { SecureRandom.hex } if v["multi"].nil?
114
- send(k) { [*0..5].sample.times.collect{ SecureRandom.hex } } if v["multi"]
115
- when "DateTime"
116
- send(k) { Time.at(rand * Time.now.to_i).iso8601 } if v["multi"].nil?
117
- send(k) { [*0..5].sample.times.collect{ Time.at(rand * Time.now.to_i).iso8601 } } if v["multi"]
118
- when "Integer"
119
- send(k) { SecureRandom.random_number(100) } if v["multi"].nil?
120
- send(k) { [*0..5].sample.times.collect{ SecureRandom.random_number(100) } } if v["multi"]
121
- when "Real"
122
- send(k) { SecureRandom.random_number } if v["multi"].nil?
123
- send(k) { [*0..5].sample.times.collect{ SecureRandom.random_number } } if v["multi"]
124
- else # Its an embedded type
125
- send(k) { FactoryGirl.build(v["type"]).attributes } if v["multi"].nil?
126
- send(k) { [*0..5].sample.times.collect{ FactoryGirl.build(v["type"]).attributes } } if v["multi"]
127
- end
128
-
129
- end
130
- end
131
- end
132
- end
34
+ embedded_factories = embedded_types.each{ |type| Bodhi::Type.create_factory_with(type) }
35
+ normal_factories = normal_types.each{ |type| Bodhi::Type.create_factory_with(type) }
36
+ klasses
133
37
  end
134
38
  end
@@ -1,59 +1,45 @@
1
- class BodhiContext
2
- attr_reader :errors, :connection, :server, :namespace,
3
- :credentials, :credentials_type, :credentials_header
1
+ require 'bodhi-slam/validations'
4
2
 
5
- def initialize(params)
6
- params.symbolize_keys!
3
+ module Bodhi
4
+ class Context
5
+ include Bodhi::Validations
6
+ attr_reader :connection, :server, :namespace,
7
+ :credentials, :credentials_type, :credentials_header
7
8
 
8
- @connection = Faraday.new(url: params[:server]) do |faraday|
9
- faraday.request :url_encoded # form-encode POST params
10
- #faraday.response :logger # log requests to STDOUT
11
- faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
12
- end
13
- @server = params[:server]
14
- @namespace = params[:namespace]
15
-
16
- if params[:cookie]
17
- @credentials = params[:cookie]
18
- @credentials_header = "Cookie"
19
- @credentials_type = "HTTP_COOKIE"
20
- else
21
- @credentials = @connection.basic_auth params[:username], params[:password]
22
- @credentials_header = "Authorization"
23
- @credentials_type = "HTTP_BASIC"
24
- end
9
+ validates :server, required: true, is_not_blank: true, url: true
10
+ validates :namespace, required: true, is_not_blank: true
25
11
 
26
- @errors = Bodhi::Errors.new
27
- end
28
-
29
- def attributes
30
- attributes = Hash.new
31
- self.instance_variables.each do |variable|
32
- attribute_name = variable.to_s.delete('@').to_sym
33
- attributes[attribute_name] = send(attribute_name)
34
- end
35
- attributes
36
- end
37
-
38
- # - Runs all the specified validations and returns true if no errors were added otherwise false.
39
- def valid?
40
- errors.add(:server, "must be present") if server.nil?
41
- errors.add(:server, "must be a string") unless server.is_a? String
12
+ def initialize(params)
13
+ params.symbolize_keys!
42
14
 
43
- errors.add(:namespace, "must be present") if namespace.nil?
44
- errors.add(:namespace, "must be a string") unless namespace.is_a? String
15
+ @connection = Faraday.new(url: params[:server]) do |faraday|
16
+ faraday.request :url_encoded # form-encode POST params
17
+ #faraday.response :logger # log requests to STDOUT
18
+ #faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
19
+ faraday.adapter :net_http_persistent
20
+ end
21
+ @server = params[:server]
22
+ @namespace = params[:namespace]
45
23
 
46
- return !errors.messages.any?
47
- end
24
+ if params[:cookie]
25
+ @credentials = params[:cookie]
26
+ @credentials_header = "Cookie"
27
+ @credentials_type = "HTTP_COOKIE"
28
+ else
29
+ @credentials = @connection.basic_auth params[:username], params[:password]
30
+ @credentials_header = "Authorization"
31
+ @credentials_type = "HTTP_BASIC"
32
+ end
33
+ end
48
34
 
49
- # - Performs the opposite of valid?. Returns true if errors were added, false otherwise.
50
- def invalid?
51
- errors.add(:server, "must be present") if server.nil?
52
- errors.add(:server, "must be a string") unless server.is_a? String
53
-
54
- errors.add(:namespace, "must be present") if namespace.nil?
55
- errors.add(:namespace, "must be a string") unless namespace.is_a? String
56
-
57
- return errors.messages.any?
35
+ def attributes
36
+ attributes = Hash.new
37
+ self.instance_variables.each do |variable|
38
+ attribute_name = variable.to_s.delete('@').to_sym
39
+ attributes[attribute_name] = send(attribute_name)
40
+ end
41
+ attributes
42
+ end
43
+
58
44
  end
59
45
  end
@@ -0,0 +1,35 @@
1
+ module Bodhi
2
+ class Enumeration
3
+ attr_reader :name, :values
4
+
5
+ def initialize(params={})
6
+ params.symbolize_keys!
7
+
8
+ @name = params[:name]
9
+ @values = params[:values]
10
+ self.class.cache[@name.to_sym] = self
11
+ end
12
+
13
+ def self.find_all(context)
14
+ raise context.errors unless context.valid?
15
+
16
+ result = context.connection.get do |request|
17
+ request.url "/#{context.namespace}/enums"
18
+ request.headers[context.credentials_header] = context.credentials
19
+ end
20
+
21
+ if result.status != 200
22
+ errors = JSON.parse result.body
23
+ errors.each{|error| error['status'] = result.status } if errors.is_a? Array
24
+ errors["status"] = result.status if errors.is_a? Hash
25
+ raise errors.to_s
26
+ end
27
+
28
+ JSON.parse(result.body).collect{ |enum| Bodhi::Enumeration.new(enum) }
29
+ end
30
+
31
+ def self.cache
32
+ @cache ||= Hash.new
33
+ end
34
+ end
35
+ end
@@ -1,24 +1,101 @@
1
1
  module Bodhi
2
2
  class Errors < Exception
3
+ include Enumerable
3
4
  attr_accessor :messages
4
5
 
5
6
  def initialize(errors={})
6
7
  @messages = errors
7
8
  end
8
-
9
- def add(symbol, msg)
10
- @messages[symbol] = [] unless @messages.has_key?(symbol)
11
- @messages[symbol].push(msg)
9
+
10
+ # Adds the given +message+ to the errors hash under the +name+ key
11
+ #
12
+ # user.errors.add(:test, "has bad value")
13
+ # user.errors.any? # => true
14
+ def add(name, message)
15
+ @messages.has_key?(name) ? @messages[name].push(message) : @messages[name] = [message]
12
16
  end
13
17
 
18
+ # Clears all error messages
19
+ #
20
+ # user.errors.add(:name, "is wrong")
21
+ # user.errors.clear # => nil
22
+ # user.errors.any? # => false
14
23
  def clear
15
24
  @messages.clear
16
25
  end
17
26
 
27
+ # Returns an array of all error messages
18
28
  def full_messages
19
29
  results = []
20
30
  @messages.each{ |key, values| values.each{ |value| results.push("#{key} #{value}") }}
21
31
  results
22
32
  end
33
+ alias :to_a :full_messages
34
+
35
+ # Converts the messages hash to json
36
+ def to_json
37
+ @messages.to_json
38
+ end
39
+
40
+ # Iterates through each error key, value pair in the error messages hash.
41
+ # Yields the attribute and the error for that attribute. If the attribute
42
+ # has more than one error message, yields once for each error message.
43
+ #
44
+ # user.errors.add(:test, "is required")
45
+ # user.errors.each do |attribute, error|
46
+ # # yields :test and "is required"
47
+ # end
48
+ #
49
+ # user.errors.add(:foo, "is awesome!")
50
+ # user.errors.each do |attribute, error|
51
+ # # yields :test and "is required"
52
+ # # then yields :foo and "is awesome!"
53
+ # end
54
+ def each
55
+ @messages.each_key do |attribute|
56
+ @messages[attribute].each{ |error| yield attribute, error }
57
+ end
58
+ end
59
+
60
+ # Returns +true+ if the error messages include an error for the given key
61
+ # +attribute+, +false+ otherwise.
62
+ #
63
+ # user.errors.messages # => {:name=>["is required"]}
64
+ # user.errors.include?(:name) # => true
65
+ # user.errors.include?(:foo) # => false
66
+ def include?(attribute)
67
+ !@messages[attribute].nil?
68
+ end
69
+ alias :has_key? :include?
70
+ alias :key? :include?
71
+
72
+ # When passed a symbol or a name of a method, returns an array of errors
73
+ # for the method.
74
+ #
75
+ # user.errors[:name] # => ["is required"]
76
+ # user.errors['name'] # => ["is required"]
77
+ def [](attribute)
78
+ @messages[attribute.to_sym]
79
+ end
80
+
81
+ # Returns the number of error messages.
82
+ #
83
+ # user.errors.add(:name, "is required")
84
+ # user.errors.size # => 1
85
+ # user.errors.add(:name, "can not be blank")
86
+ # user.errors.size # => 2
87
+ def size
88
+ full_messages.size
89
+ end
90
+ alias :count :size
91
+
92
+ # Returns +true+ if no errors are present, +false+ otherwise.
93
+ #
94
+ # user.errors.add(:name, "test error")
95
+ # user.errors.empty? # => false
96
+ def empty?
97
+ size == 0
98
+ end
99
+ alias :blank? :empty?
23
100
  end
24
101
  end
@@ -1,75 +1,212 @@
1
- module BodhiResource
2
- SYSTEM_ATTRIBUTES = [:bodhi_context, :sys_created_at, :sys_version, :sys_modified_at, :sys_modified_by,
3
- :sys_namespace, :sys_created_by, :sys_type_version, :sys_id]
4
- attr_accessor *SYSTEM_ATTRIBUTES
5
-
6
- # - Returns a Hash of the Objects form attributes
7
- def attributes
8
- attributes = Hash.new
9
- self.instance_variables.each do |variable|
10
- attribute_name = variable.to_s.delete('@').to_sym
11
- attributes[attribute_name] = send(attribute_name) unless SYSTEM_ATTRIBUTES.include?(attribute_name)
1
+ module Bodhi
2
+ module Resource
3
+ SYSTEM_ATTRIBUTES = [:bodhi_context, :sys_created_at, :sys_version, :sys_modified_at, :sys_modified_by,
4
+ :sys_namespace, :sys_created_by, :sys_type_version, :sys_id]
5
+ attr_accessor *SYSTEM_ATTRIBUTES
6
+
7
+ module ClassMethods
8
+ def build(context, params={})
9
+ params.merge!({bodhi_context: context})
10
+ FactoryGirl.build(name, params)
11
+ end
12
+
13
+ def build_list(context, amount, params={})
14
+ params.merge!({bodhi_context: context})
15
+ FactoryGirl.build_list(name, amount, params)
16
+ end
17
+
18
+ def create(context, params={})
19
+ params.merge!({bodhi_context: context})
20
+ FactoryGirl.create(name, params)
21
+ end
22
+
23
+ def create_list(context, amount, params={})
24
+ params.merge!({bodhi_context: context})
25
+ records = FactoryGirl.build_list(name, amount, params)
26
+ result = context.connection.post do |request|
27
+ request.url "/#{context.namespace}/resources/#{name}"
28
+ request.headers['Content-Type'] = 'application/json'
29
+ request.headers[context.credentials_header] = context.credentials
30
+ request.body = records.to_json
31
+ end
32
+
33
+ #puts "\033[33mResult Body\033[0m: \033[36m#{result.body}\033[0m"
34
+
35
+ if result.status != 200
36
+ errors = JSON.parse result.body
37
+ errors.each{|error| error['status'] = result.status } if errors.is_a? Array
38
+ errors["status"] = result.status if errors.is_a? Hash
39
+ raise errors.to_s
40
+ end
41
+
42
+ #puts "\033[33mRecords\033[0m: \033[36m#{records.map(&:attributes)}\033[0m"
43
+
44
+ records
45
+ end
46
+
47
+ def find(context, id)
48
+ raise context.errors unless context.valid?
49
+
50
+ unless id.is_a? String
51
+ raise ArgumentError.new("Expected 'id' to be a String. 'id' #=> #{id.class}")
52
+ end
53
+
54
+ result = context.connection.get do |request|
55
+ request.url "/#{context.namespace}/resources/#{name}/#{id}"
56
+ request.headers[context.credentials_header] = context.credentials
57
+ end
58
+
59
+ if result.status != 200
60
+ errors = JSON.parse result.body
61
+ errors.each{|error| error['status'] = result.status } if errors.is_a? Array
62
+ errors["status"] = result.status if errors.is_a? Hash
63
+ raise errors.to_s
64
+ end
65
+
66
+ resource_attributes = JSON.parse(result.body)
67
+ self.build(context, resource_attributes)
68
+ end
69
+
70
+ def aggregate(context, pipeline)
71
+ raise context.errors unless context.valid?
72
+
73
+ unless pipeline.is_a? String
74
+ raise ArgumentError.new("Expected 'pipeline' to be a String. 'pipeline' #=> #{pipeline.class}")
75
+ end
76
+
77
+ result = context.connection.get do |request|
78
+ request.url "/#{context.namespace}/resources/#{name}/aggregate?pipeline=#{pipeline}"
79
+ request.headers[context.credentials_header] = context.credentials
80
+ end
81
+
82
+ if result.status != 200
83
+ errors = JSON.parse result.body
84
+ errors.each{|error| error['status'] = result.status } if errors.is_a? Array
85
+ errors["status"] = result.status if errors.is_a? Hash
86
+ raise errors.to_s
87
+ end
88
+
89
+ JSON.parse(result.body)
90
+ end
91
+
92
+ def where(context, query)
93
+ raise context.errors unless context.valid?
94
+
95
+ unless query.is_a? String
96
+ raise ArgumentError.new("Expected 'query' to be a String. 'query' #=> #{query.class}")
97
+ end
98
+
99
+ result = context.connection.get do |request|
100
+ request.url "/#{context.namespace}/resources/#{name}?where=#{query}"
101
+ request.headers[context.credentials_header] = context.credentials
102
+ end
103
+
104
+ if result.status != 200
105
+ errors = JSON.parse result.body
106
+ errors.each{|error| error['status'] = result.status } if errors.is_a? Array
107
+ errors["status"] = result.status if errors.is_a? Hash
108
+ raise errors.to_s
109
+ end
110
+
111
+ resources = JSON.parse(result.body)
112
+ resources.map{ |attributes| self.build(context, attributes) }
113
+ end
114
+
115
+ def delete_all(context)
116
+ raise context.errors unless context.valid?
117
+
118
+ result = context.connection.delete do |request|
119
+ request.url "/#{context.namespace}/resources/#{name}"
120
+ request.headers[context.credentials_header] = context.credentials
121
+ end
122
+
123
+ if result.status != 204
124
+ errors = JSON.parse result.body
125
+ errors.each{|error| error['status'] = result.status } if errors.is_a? Array
126
+ errors["status"] = result.status if errors.is_a? Hash
127
+ raise errors.to_s
128
+ end
129
+ end
12
130
  end
13
- attributes
14
- end
131
+
132
+ module InstanceMethods
133
+ # Returns a Hash of the Objects form attributes
134
+ #
135
+ # s = SomeResource.build({foo:"test", bar:12345})
136
+ # s.attributes # => { foo: "test", bar: 12345 }
137
+ def attributes
138
+ attributes = Hash.new
139
+ self.instance_variables.each do |variable|
140
+ attribute_name = variable.to_s.delete('@').to_sym
141
+ attributes[attribute_name] = send(attribute_name) unless SYSTEM_ATTRIBUTES.include?(attribute_name)
142
+ end
143
+ attributes
144
+ end
15
145
 
16
- # - Converts all the Objects attributes to JSON
17
- def to_json
18
- attributes = Hash.new
19
- self.instance_variables.each do |variable|
20
- attribute_name = variable.to_s.delete('@').to_sym
21
- attributes[attribute_name] = send(attribute_name)
22
- end
23
- attributes.to_json
24
- end
146
+ # Returns all the Objects attributes as JSON.
147
+ # Will convert any nested Objects to JSON if they respond to :to_json
148
+ #
149
+ # s = SomeResource.build({foo:"test", bar:12345})
150
+ # s.to_json # => { "foo":"test", "bar":12345 }
151
+ def to_json(base=nil)
152
+ super if base
153
+ attributes.to_json
154
+ end
25
155
 
26
- def save!
27
- result = bodhi_context.connection.post do |request|
28
- request.url "/#{bodhi_context.namespace}/resources/#{self.class}"
29
- request.headers['Content-Type'] = 'application/json'
30
- request.headers[bodhi_context.credentials_header] = bodhi_context.credentials
31
- request.body = attributes.to_json
32
- end
156
+ def save!
157
+ result = bodhi_context.connection.post do |request|
158
+ request.url "/#{bodhi_context.namespace}/resources/#{self.class}"
159
+ request.headers['Content-Type'] = 'application/json'
160
+ request.headers[bodhi_context.credentials_header] = bodhi_context.credentials
161
+ request.body = attributes.to_json
162
+ end
33
163
 
34
- if result.status != 201
35
- errors = JSON.parse result.body
36
- errors.each{|error| error['status'] = result.status } if errors.is_a? Array
37
- errors["status"] = result.status if errors.is_a? Hash
38
- raise errors.to_s
39
- end
164
+ if result.status != 201
165
+ errors = JSON.parse result.body
166
+ errors.each{|error| error['status'] = result.status } if errors.is_a? Array
167
+ errors["status"] = result.status if errors.is_a? Hash
168
+ raise errors.to_s
169
+ end
170
+
171
+ if result.headers['location']
172
+ @sys_id = result.headers['location'].match(/(?<id>[a-zA-Z0-9]{24})/)[:id]
173
+ end
174
+ end
175
+
176
+ def delete!
177
+ result = bodhi_context.connection.delete do |request|
178
+ request.url "/#{bodhi_context.namespace}/resources/#{self.class}/#{sys_id}"
179
+ request.headers[bodhi_context.credentials_header] = bodhi_context.credentials
180
+ end
40
181
 
41
- if result.headers['location']
42
- @sys_id = result.headers['location'].match(/(?<id>[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})/)[:id]
43
- end
44
- end
182
+ if result.status != 204
183
+ errors = JSON.parse result.body
184
+ errors.each{|error| error['status'] = result.status } if errors.is_a? Array
185
+ errors["status"] = result.status if errors.is_a? Hash
186
+ raise errors.to_s
187
+ end
188
+ end
45
189
 
46
- def delete!
47
- result = bodhi_context.connection.delete do |request|
48
- request.url "/#{bodhi_context.namespace}/resources/#{self.class}/#{sys_id}"
49
- request.headers[bodhi_context.credentials_header] = bodhi_context.credentials
50
- end
190
+ def patch!(params)
191
+ result = bodhi_context.connection.patch do |request|
192
+ request.url "/#{bodhi_context.namespace}/resources/#{self.class}/#{sys_id}"
193
+ request.headers['Content-Type'] = 'application/json'
194
+ request.headers[bodhi_context.credentials_header] = bodhi_context.credentials
195
+ request.body = params
196
+ end
51
197
 
52
- if result.status != 204
53
- errors = JSON.parse result.body
54
- errors.each{|error| error['status'] = result.status } if errors.is_a? Array
55
- errors["status"] = result.status if errors.is_a? Hash
56
- raise errors.to_s
198
+ if result.status != 204
199
+ errors = JSON.parse result.body
200
+ errors.each{|error| error['status'] = result.status } if errors.is_a? Array
201
+ errors["status"] = result.status if errors.is_a? Hash
202
+ raise errors.to_s
203
+ end
204
+ end
57
205
  end
58
- end
59
206
 
60
- def patch!(params)
61
- result = bodhi_context.connection.patch do |request|
62
- request.url "/#{bodhi_context.namespace}/resources/#{self.class}/#{sys_id}"
63
- request.headers['Content-Type'] = 'application/json'
64
- request.headers[bodhi_context.credentials_header] = bodhi_context.credentials
65
- request.body = params
207
+ def self.included(base)
208
+ base.extend(ClassMethods)
209
+ base.include(InstanceMethods, Bodhi::Validations)
66
210
  end
67
-
68
- if result.status != 204
69
- errors = JSON.parse result.body
70
- errors.each{|error| error['status'] = result.status } if errors.is_a? Array
71
- errors["status"] = result.status if errors.is_a? Hash
72
- raise errors.to_s
73
- end
74
- end
211
+ end
75
212
  end