bodhi-slam 0.2.3 → 0.2.5

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: 76c3a5ab9e27e73badc35dd7da2a78374025b7c5
4
- data.tar.gz: d714537140fe349bd7d5fea95440c7642a50bb00
3
+ metadata.gz: 4c3c82642a103662a2881ac8e07c236853d2e812
4
+ data.tar.gz: ac2ebf8f9226eb5395ace0a7a8d4da99a3159b24
5
5
  SHA512:
6
- metadata.gz: fa60f89fd153e8469bc28d798ed45c04a4be982f3e36d51dc59d43c8052138eae7c1b434ea472970dcbd4632aba869957eed9f2c1e39b6e169901ce8edec8b4f
7
- data.tar.gz: ba8b64e7a9c6fea5ea43de3dfd5e6314f075a6f549b3785bc9ba52f0a15b22d23a4548495d282ea55272a259cafd11b4095ac9967887062b5b61ee13f0e9f70e
6
+ metadata.gz: fcccae214b0272c9fed879dc74e49980521db7f8bc27fb5cda37350b63c795f40c852902b59c95e64788ab8edf8d8d97c8f7c1e95eb144d88857e75c83a0c472
7
+ data.tar.gz: 799f5e418a7ce569b70543002dd9dcbccc897c6658f088f2fc2622e530e75b2d708b6262445747fe37c1ba0d5393f8f04ad96ff1675b4f0acd40c12f4a1fe5bd
@@ -23,7 +23,11 @@ module Bodhi
23
23
  end
24
24
  end
25
25
  end
26
-
26
+
27
+ # Gets all Bodhi::Enumerations from a given +context+
28
+ # and adds them to the Bodhi::Enumeration cache
29
+ #
30
+ # Bodhi::Enumeration.find_all(context) # => [#<Bodhi::Enumeration:0x007fbff403e808>, #<Bodhi::Enumeration:0x007fbff403e808>, ...]
27
31
  def self.find_all(context)
28
32
  raise context.errors unless context.valid?
29
33
 
@@ -42,6 +46,9 @@ module Bodhi
42
46
  JSON.parse(result.body).collect{ |enum| Bodhi::Enumeration.new(enum) }
43
47
  end
44
48
 
49
+ # Returns a Hash of all Bodhi::Enumerations in the cache
50
+ #
51
+ # Bodhi::Enumerations.cache # => [#<Bodhi::Enumeration:0x007fbff403e808>, #<Bodhi::Enumeration:0x007fbff403e808>, ...]
45
52
  def self.cache
46
53
  @cache ||= Hash.new
47
54
  end
@@ -0,0 +1,10 @@
1
+ module Bodhi
2
+ class ApiErrors < StandardError
3
+ attr_reader :body, :status
4
+
5
+ def initialize(params={})
6
+ @body = params[:body]
7
+ @status = params[:status]
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,4 @@
1
+ module Bodhi
2
+ class ContextErrors < Bodhi::Errors
3
+ end
4
+ end
@@ -1,5 +1,5 @@
1
1
  module Bodhi
2
- class Errors < Exception
2
+ class Errors < StandardError
3
3
  include Enumerable
4
4
  attr_accessor :messages
5
5
 
@@ -9,22 +9,27 @@ module Bodhi
9
9
 
10
10
  # Adds the given +message+ to the errors hash under the +name+ key
11
11
  #
12
- # user.errors.add(:test, "has bad value")
13
- # user.errors.any? # => true
12
+ # user.errors.add(:test, "has bad value")
13
+ # user.errors.any? # => true
14
14
  def add(name, message)
15
15
  @messages.has_key?(name) ? @messages[name].push(message) : @messages[name] = [message]
16
16
  end
17
17
 
18
- # Clears all error messages
18
+ # Clears all current error messages
19
19
  #
20
- # user.errors.add(:name, "is wrong")
21
- # user.errors.clear # => nil
22
- # user.errors.any? # => false
20
+ # user.errors.add(:name, "is wrong")
21
+ # user.errors.any? # => true
22
+ # user.errors.clear # => nil
23
+ # user.errors.any? # => false
23
24
  def clear
24
25
  @messages.clear
25
26
  end
26
27
 
27
28
  # Returns an array of all error messages
29
+ #
30
+ # user.errors.add(:name, "is wrong")
31
+ # user.errors.add(:address, "is not valid")
32
+ # user.errors.full_messages # => ["name is wrong", "address is not valid"]
28
33
  def full_messages
29
34
  results = []
30
35
  @messages.each{ |key, values| values.each{ |value| results.push("#{key} #{value}") }}
@@ -41,16 +46,16 @@ module Bodhi
41
46
  # Yields the attribute and the error for that attribute. If the attribute
42
47
  # has more than one error message, yields once for each error message.
43
48
  #
44
- # user.errors.add(:test, "is required")
45
- # user.errors.each do |attribute, error|
46
- # # yields :test and "is required"
47
- # end
49
+ # user.errors.add(:test, "is required")
50
+ # user.errors.each do |attribute, error|
51
+ # # yields :test and "is required"
52
+ # end
48
53
  #
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
+ # user.errors.add(:foo, "is awesome!")
55
+ # user.errors.each do |attribute, error|
56
+ # # yields :test and "is required"
57
+ # # then yields :foo and "is awesome!"
58
+ # end
54
59
  def each
55
60
  @messages.each_key do |attribute|
56
61
  @messages[attribute].each{ |error| yield attribute, error }
@@ -82,6 +87,7 @@ module Bodhi
82
87
  #
83
88
  # user.errors.add(:name, "is required")
84
89
  # user.errors.size # => 1
90
+ #
85
91
  # user.errors.add(:name, "can not be blank")
86
92
  # user.errors.size # => 2
87
93
  def size
@@ -91,11 +97,13 @@ module Bodhi
91
97
 
92
98
  # Returns +true+ if no errors are present, +false+ otherwise.
93
99
  #
94
- # user.errors.add(:name, "test error")
95
- # user.errors.empty? # => false
100
+ # user.errors.add(:name, "test error")
101
+ # user.errors.empty? # => false
96
102
  def empty?
97
103
  size == 0
98
104
  end
99
105
  alias :blank? :empty?
100
106
  end
101
- end
107
+ end
108
+
109
+ Dir[File.dirname(__FILE__) + "/errors/*.rb"].each { |file| require file }
@@ -8,6 +8,11 @@ module Bodhi
8
8
  @generators = Hash.new
9
9
  end
10
10
 
11
+ # Returns a new randomly generated resource.
12
+ # Accepts an options hash to override specified values.
13
+ #
14
+ # Resource.factory.build # => #<Resource:0x007fbff403e808 @name="2-3lmwp^oef@245">
15
+ # Resource.factory.build(name: "test") # => #<Resource:0x007fbff403e808 @name="test">
11
16
  def build(*args)
12
17
  if args.last.is_a?(Hash)
13
18
  params = args.last.reduce({}) do |memo, (k, v)|
@@ -28,13 +33,23 @@ module Bodhi
28
33
  object
29
34
  end
30
35
 
36
+ # Returns an array of randomly generated resources
37
+ #
38
+ # Resource.factory.build_list(10) # => [#<Resource:0x007fbff403e808 @name="2-3lmwp^oef@245">, #<Resource:0x007fbff403e808 @name="p7:n#$903<u1">, ...]
39
+ # Resource.factory.build_list(10, name: "test") # => [#<Resource:0x007fbff403e808 @name="test">, #<Resource:0x007fbff403e808 @name="test">, ...]
31
40
  def build_list(size, *args)
32
41
  size.times.collect{ build(*args) }
33
42
  end
34
43
 
44
+ # Builds and saves a new resource to the given +context+
45
+ # Accepts an options hash to override specified values.
46
+ #
47
+ # context = Bodhi::Context.new
48
+ # Resource.factory.create(context) # => #<Resource:0x007fbff403e808 @name="2-3lmwp^oef@245">
49
+ # Resource.factory.create(context, name: "test") # => #<Resource:0x007fbff403e808 @name="test">
35
50
  def create(context, params={})
36
51
  if context.invalid?
37
- raise context.errors
52
+ raise context.errors, context.errors.to_a.to_s
38
53
  end
39
54
 
40
55
  object = build(params)
@@ -43,9 +58,14 @@ module Bodhi
43
58
  object
44
59
  end
45
60
 
61
+ # Builds and saves a list of resources to the given +context+
62
+ # Accepts an options hash to override specified values.
63
+ #
64
+ # Resource.factory.create_list(10, context) # => [#<Resource:0x007fbff403e808 @name="2-3lmwp^oef@245">, #<Resource:0x007fbff403e808 @name="p7:n#$903<u1">, ...]
65
+ # Resource.factory.create_list(10, context, name: "test") # => [#<Resource:0x007fbff403e808 @name="test">, #<Resource:0x007fbff403e808 @name="test">, ...]
46
66
  def create_list(size, context, params={})
47
67
  if context.invalid?
48
- raise context.errors
68
+ raise context.errors, context.errors.to_a.to_s
49
69
  end
50
70
 
51
71
  resources = build_list(size, params)
@@ -59,10 +79,7 @@ module Bodhi
59
79
  #puts "\033[33mResult Body\033[0m: \033[36m#{result.body}\033[0m"
60
80
 
61
81
  if result.status != 200
62
- errors = JSON.parse result.body
63
- errors.each{|error| error['status'] = result.status } if errors.is_a? Array
64
- errors["status"] = result.status if errors.is_a? Hash
65
- raise errors.to_s
82
+ raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
66
83
  end
67
84
 
68
85
  #puts "\033[33mRecords\033[0m: \033[36m#{records.map(&:attributes)}\033[0m"
@@ -70,6 +87,10 @@ module Bodhi
70
87
  resources
71
88
  end
72
89
 
90
+ # Adds a new generator to the class with the specified +name+ and +options+
91
+ #
92
+ # Resource.factory.add_generator("name", type: "String")
93
+ # Resource.factory.add_generator("test", type: "Integer", multi: true, required: true)
73
94
  def add_generator(name, options)
74
95
  case options[:type]
75
96
  when "String"
@@ -132,6 +153,13 @@ module Bodhi
132
153
  generator = lambda { {SecureRandom.hex => SecureRandom.hex} }
133
154
  end
134
155
 
156
+ when "Link"
157
+ if options[:multi]
158
+ generator = lambda { [*0..5].sample.times.collect{ Hash.new } }
159
+ else
160
+ generator = lambda { Hash.new }
161
+ end
162
+
135
163
  when "Enumerated"
136
164
  generator = lambda do
137
165
  ref = options[:ref].split('.')
@@ -7,8 +7,40 @@ module Bodhi
7
7
  module ClassMethods
8
8
  def factory; @factory; end
9
9
 
10
+ # Saves a batch of resources to the Bodhi Cloud in the given +context+
11
+ # Returns an array of JSON objects describing the results for each record in the batch
12
+ #
13
+ # context = Bodhi::Context.new
14
+ # list = Resource.factory.build_list(10)
15
+ # Resource.save_batch(context, list)
16
+ def save_batch(context, objects)
17
+ if context.invalid?
18
+ raise Bodhi::ContextErrors.new(context.errors.messages), context.errors.to_a.to_s
19
+ end
20
+
21
+ result = context.connection.post do |request|
22
+ request.url "/#{context.namespace}/resources/#{name}"
23
+ request.headers['Content-Type'] = 'application/json'
24
+ request.headers[context.credentials_header] = context.credentials
25
+ request.body = objects.to_json
26
+ end
27
+
28
+ if result.status != 200
29
+ raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
30
+ end
31
+
32
+ objects
33
+ end
34
+
35
+ # Returns a single resource from the Bodhi Cloud that matches the given +id+
36
+ #
37
+ # context = Bodhi::Context.new
38
+ # id = Resource.factory.create(context).sys_id
39
+ # obj = Resource.find(context, id)
10
40
  def find(context, id)
11
- raise context.errors unless context.valid?
41
+ if context.invalid?
42
+ raise Bodhi::ContextErrors.new(context.errors.messages), context.errors.to_a.to_s
43
+ end
12
44
 
13
45
  unless id.is_a? String
14
46
  raise ArgumentError.new("Expected 'id' to be a String. 'id' #=> #{id.class}")
@@ -20,18 +52,22 @@ module Bodhi
20
52
  end
21
53
 
22
54
  if result.status != 200
23
- errors = JSON.parse result.body
24
- errors.each{|error| error['status'] = result.status } if errors.is_a? Array
25
- errors["status"] = result.status if errors.is_a? Hash
26
- raise errors.to_s
55
+ raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
27
56
  end
28
57
 
29
58
  resource_attributes = JSON.parse(result.body)
30
59
  factory.build(context, resource_attributes)
31
60
  end
32
61
 
62
+ # Returns all records of the given resource from the Bodhi Cloud.
63
+ #
64
+ # context = Bodhi::Context.new
65
+ # Resource.find_all(context) # => [#<Resource:0x007fbff403e808>, #<Resource:0x007fbff403e808>, ...]
33
66
  def find_all(context)
34
- raise context.errors unless context.valid?
67
+ if context.invalid?
68
+ raise Bodhi::ContextErrors.new(context.errors.messages), context.errors.to_a.to_s
69
+ end
70
+
35
71
  page = 1
36
72
  records = []
37
73
 
@@ -42,10 +78,7 @@ module Bodhi
42
78
  end
43
79
 
44
80
  if result.status != 200
45
- errors = JSON.parse result.body
46
- errors.each{|error| error['status'] = result.status } if errors.is_a? Array
47
- errors["status"] = result.status if errors.is_a? Hash
48
- raise errors.to_s
81
+ raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
49
82
  end
50
83
 
51
84
  page += 1
@@ -55,8 +88,14 @@ module Bodhi
55
88
  records.flatten.collect{ |record| factory.build(record) }
56
89
  end
57
90
 
91
+ # Aggregates the given resource based on the supplied +pipeline+
92
+ #
93
+ # context = Bodhi::Context.new
94
+ # Resource.aggregate(context, "[{ $match: { property: { $gte: 20 }}}]")
58
95
  def aggregate(context, pipeline)
59
- raise context.errors unless context.valid?
96
+ if context.invalid?
97
+ raise Bodhi::ContextErrors.new(context.errors.messages), context.errors.to_a.to_s
98
+ end
60
99
 
61
100
  unless pipeline.is_a? String
62
101
  raise ArgumentError.new("Expected 'pipeline' to be a String. 'pipeline' #=> #{pipeline.class}")
@@ -68,17 +107,20 @@ module Bodhi
68
107
  end
69
108
 
70
109
  if result.status != 200
71
- errors = JSON.parse result.body
72
- errors.each{|error| error['status'] = result.status } if errors.is_a? Array
73
- errors["status"] = result.status if errors.is_a? Hash
74
- raise errors.to_s
110
+ raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
75
111
  end
76
112
 
77
113
  JSON.parse(result.body)
78
114
  end
79
115
 
116
+ # Returns all records for a resource which match the given +query+
117
+ #
118
+ # context = Bodhi::Context.new
119
+ # Resource.where(context, "{property: 'value'}")
80
120
  def where(context, query)
81
- raise context.errors unless context.valid?
121
+ if context.invalid?
122
+ raise Bodhi::ContextErrors.new(context.errors.messages), context.errors.to_a.to_s
123
+ end
82
124
 
83
125
  unless query.is_a? String
84
126
  raise ArgumentError.new("Expected 'query' to be a String. 'query' #=> #{query.class}")
@@ -90,18 +132,21 @@ module Bodhi
90
132
  end
91
133
 
92
134
  if result.status != 200
93
- errors = JSON.parse result.body
94
- errors.each{|error| error['status'] = result.status } if errors.is_a? Array
95
- errors["status"] = result.status if errors.is_a? Hash
96
- raise errors.to_s
135
+ raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
97
136
  end
98
137
 
99
138
  resources = JSON.parse(result.body)
100
139
  resources.map{ |attributes| factory.build(context, attributes) }
101
140
  end
102
141
 
142
+ # Deletes all records from a resource in the given +context+
143
+ #
144
+ # context = Bodhi::Context.new
145
+ # Resource.delete_all(context)
103
146
  def delete_all(context)
104
- raise context.errors unless context.valid?
147
+ if context.invalid?
148
+ raise Bodhi::ContextErrors.new(context.errors.messages), context.errors.to_a.to_s
149
+ end
105
150
 
106
151
  result = context.connection.delete do |request|
107
152
  request.url "/#{context.namespace}/resources/#{name}"
@@ -109,10 +154,7 @@ module Bodhi
109
154
  end
110
155
 
111
156
  if result.status != 204
112
- errors = JSON.parse result.body
113
- errors.each{|error| error['status'] = result.status } if errors.is_a? Array
114
- errors["status"] = result.status if errors.is_a? Hash
115
- raise errors.to_s
157
+ raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
116
158
  end
117
159
  end
118
160
  end
@@ -120,8 +162,8 @@ module Bodhi
120
162
  module InstanceMethods
121
163
  # Returns a Hash of the Objects form attributes
122
164
  #
123
- # s = SomeResource.build({foo:"test", bar:12345})
124
- # s.attributes # => { foo: "test", bar: 12345 }
165
+ # s = SomeResource.build({foo:"test", bar:12345})
166
+ # s.attributes # => { foo: "test", bar: 12345 }
125
167
  def attributes
126
168
  attributes = Hash.new
127
169
  self.instance_variables.each do |variable|
@@ -132,15 +174,20 @@ module Bodhi
132
174
  end
133
175
 
134
176
  # Returns all the Objects attributes as JSON.
135
- # Will convert any nested Objects to JSON if they respond to :to_json
177
+ # It converts any nested Objects to JSON if they respond to +to_json+
136
178
  #
137
- # s = SomeResource.build({foo:"test", bar:12345})
138
- # s.to_json # => { "foo":"test", "bar":12345 }
179
+ # s = SomeResource.build({foo:"test", bar:12345})
180
+ # s.to_json # => { "foo":"test", "bar":12345 }
139
181
  def to_json(base=nil)
140
182
  super if base
141
183
  attributes.to_json
142
184
  end
143
185
 
186
+ # Saves the resource to the Bodhi Cloud. Raises ArgumentError if record could not be saved.
187
+ #
188
+ # obj = Resouce.new
189
+ # obj.save!
190
+ # obj.persisted? # => true
144
191
  def save!
145
192
  result = bodhi_context.connection.post do |request|
146
193
  request.url "/#{bodhi_context.namespace}/resources/#{self.class}"
@@ -150,10 +197,7 @@ module Bodhi
150
197
  end
151
198
 
152
199
  if result.status != 201
153
- errors = JSON.parse result.body
154
- errors.each{|error| error['status'] = result.status } if errors.is_a? Array
155
- errors["status"] = result.status if errors.is_a? Hash
156
- raise errors.to_s
200
+ raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
157
201
  end
158
202
 
159
203
  if result.headers['location']
@@ -168,10 +212,7 @@ module Bodhi
168
212
  end
169
213
 
170
214
  if result.status != 204
171
- errors = JSON.parse result.body
172
- errors.each{|error| error['status'] = result.status } if errors.is_a? Array
173
- errors["status"] = result.status if errors.is_a? Hash
174
- raise errors.to_s
215
+ raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
175
216
  end
176
217
  end
177
218
 
@@ -184,10 +225,7 @@ module Bodhi
184
225
  end
185
226
 
186
227
  if result.status != 204
187
- errors = JSON.parse result.body
188
- errors.each{|error| error['status'] = result.status } if errors.is_a? Array
189
- errors["status"] = result.status if errors.is_a? Hash
190
- raise errors.to_s
228
+ raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
191
229
  end
192
230
  end
193
231
  end
@@ -52,6 +52,12 @@ module Bodhi
52
52
  end
53
53
  end
54
54
 
55
+ # Queries the Bodhi API for all types within the given +context+
56
+ # Returns an array of Bodhi::Type objects
57
+ #
58
+ # context = BodhiContext.new(valid_params)
59
+ # types = Bodhi::Type.find_all(context)
60
+ # types # => [#<Bodhi::Type:0x007fbff403e808 @name="MyType">, #<Bodhi::Type:0x007fbff403e808 @name="MyType2">, ...]
55
61
  def self.find_all(context)
56
62
  raise context.errors unless context.valid?
57
63
  page = 1
@@ -78,6 +84,16 @@ module Bodhi
78
84
  all_records.flatten.collect{ |type| Bodhi::Type.new(type) }
79
85
  end
80
86
 
87
+ # Dynamically defines a new Ruby class for the given +type+
88
+ # Class validations, factory, and helper methods will also be added
89
+ #
90
+ # type = Bodhi::Type.new({name: "TestType", properties: { foo:{ type:"String" }}})
91
+ # klass = Bodhi::Type.create_class_with(type)
92
+ # klass # => #<Class:0x007fbff403e808 @name="TestType">
93
+ #
94
+ # # Additional class methods
95
+ # klass.validations # => { foo: [#<TypeValidator:0x007fbff403e808 @type="String">] }
96
+ # klass.factory # => #<Bodhi::Factory:0x007fbff403e808 @klass="TestType", @generators=[]>
81
97
  def self.create_class_with(type)
82
98
  unless type.is_a? Bodhi::Type
83
99
  raise ArgumentError.new("Expected #{type.class} to be a Bodhi::Type")
@@ -12,16 +12,15 @@ module Bodhi
12
12
  # validates :tags, requried: true, multi: true
13
13
  # validates :name, required: true
14
14
  #
15
- # User.validations
16
- # # => {
17
- # # tags: [
18
- # # #<RequiredValidator:0x007fbff403e808 @options={}>,
19
- # # #<MultiValidator:0x007fbff403e808 @options={}>
20
- # # ],
21
- # # name: [
22
- # # #<RequiredValidator:0x007fbff403e808 @options={}>
23
- # # ]
24
- # # }
15
+ # User.validations # => {
16
+ # tags: [
17
+ # #<RequiredValidator:0x007fbff403e808 @options={}>,
18
+ # #<MultiValidator:0x007fbff403e808 @options={}>
19
+ # ],
20
+ # name: [
21
+ # #<RequiredValidator:0x007fbff403e808 @options={}>
22
+ # ]
23
+ # }
25
24
  def validators; @validators; end
26
25
 
27
26
  # Creates a new validation on the given +attribute+ using the supplied +options+
@@ -25,6 +25,8 @@ module Bodhi
25
25
  case @type
26
26
  when "GeoJSON"
27
27
  klass = Hash
28
+ when "Link"
29
+ klass = Hash
28
30
  when "DateTime"
29
31
  single_comparator = lambda do |item|
30
32
  begin
@@ -7,12 +7,14 @@ module Bodhi
7
7
  raise NotImplementedError, "Subclasses must implement a validate(record, attribute, value) method."
8
8
  end
9
9
 
10
- # Calls +underscore+ on the validation and returns it's class name as a symbol.
11
- # Namespaces and the trailing "_validation" text will be trimmed
10
+ # Calls +underscore+ on the validator and returns it's class name as a symbol.
11
+ # Namespaces and the trailing "_validator" text will be trimmed
12
12
  #
13
- # BaseValidation.to_sym # => :base
14
- # StringValidation.to_sym # => :string
15
- # NotBlankValidation.to_sym # => :not_blank
13
+ # type = Bodhi::TypeValidator.new("String")
14
+ # is_not_blank = Bodhi::IsNotBlankValidator.new(true)
15
+ #
16
+ # type.to_sym # => :type
17
+ # is_not_blank.to_sym # => :is_not_blank
16
18
  def to_sym
17
19
  underscore.
18
20
  gsub("bodhi/", "").
@@ -22,9 +24,11 @@ module Bodhi
22
24
 
23
25
  # Returns the validation's class name in snake_case.
24
26
  #
25
- # BaseValidation.underscore # => "bodhi/base_validation"
26
- # StringValidation.underscore # => "bodhi/string_validation"
27
- # NotBlankValidation.underscore # => "bodhi/not_blank_validation"
27
+ # type = Bodhi::TypeValidator.new("String")
28
+ # is_not_blank = Bodhi::IsNotBlankValidator.new(true)
29
+ #
30
+ # type.underscore # => "bodhi/type_validator"
31
+ # is_not_blank.underscore # => "bodhi/is_not_blank_validator"
28
32
  def underscore
29
33
  self.class.name.gsub(/::/, '/').
30
34
  gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
@@ -36,9 +40,11 @@ module Bodhi
36
40
  # Returns the validation as an options Hash.
37
41
  # The options hash is suitable to be used in the Bodhi::Validations.valdiates method
38
42
  #
39
- # StringValidation.to_options # => { string: true }
40
- # EmbeddedValidation.to_options # => { embedded: "ClassName" }
41
- # EnumeratedValidation.to_options # => { enumerated: "Country.name" }
43
+ # type = Bodhi::TypeValidator.new("String")
44
+ # is_not_blank = Bodhi::IsNotBlankValidator.new(true)
45
+ #
46
+ # type_validation.to_options # => { type: "String" }
47
+ # is_not_blank_validation.to_options # => { is_not_blank: true }
42
48
  def to_options
43
49
  raise NotImplementedError, "Subclasses must implement a to_options method."
44
50
  end
@@ -46,12 +52,11 @@ module Bodhi
46
52
  # Returns the validator class with the given +name+
47
53
  # Raises NameError if no validator class is found
48
54
  #
49
- # Bodhi::Validator.constantize("type") # => Bodhi::TypeValidator
50
- # Bodhi::Validator.constantize("multi") # => Bodhi::MutliValidator
51
- # Bodhi::Validator.constantize("required") # => Bodhi::RequriedValidator
55
+ # Bodhi::Validator.constantize("type") # => #<Bodhi::TypeValidator:0x007fbff403e808>
56
+ # Bodhi::Validator.constantize("is_not_blank") # => #<Bodhi::IsNotBlankValidator:0x007fbff403e808>
52
57
  def self.constantize(name)
53
58
  camelized_name = name.to_s.split('_').collect(&:capitalize).join
54
- full_name = "Bodhi::#{camelized_name}Validator"
59
+ full_name = "Bodhi::#{camelized_name}Validator"
55
60
  Object.const_get(full_name)
56
61
  end
57
62
  end
data/lib/bodhi-slam.rb CHANGED
@@ -13,17 +13,29 @@ require 'bodhi-slam/enumerations'
13
13
  require 'bodhi-slam/factory'
14
14
 
15
15
  class BodhiSlam
16
+ # Defines a context to interact with the Bodhi API
17
+ # Including a +server+, +namespace+, +username+, +password+ or +cookie+
18
+ #
19
+ # context = Bodhi::Context.new(server: "https://test.com", namespace: "MyNamespace", username: "MyUser", password: "MyPassword")
20
+ # context = Bodhi::Context.new(server: "https://test.com", namespace: "MyNamespace", username: "MyUser", cookie: "MyAuthCookie")
16
21
  def self.context(params, &block)
17
22
  bodhi_context = Bodhi::Context.new params
18
- raise bodhi_context.errors unless bodhi_context.valid?
19
23
 
20
- #puts "Switching context to: #{bodhi_context.attributes}"
24
+ if bodhi_context.invalid?
25
+ raise Bodhi::ContextErrors.new(bodhi_context.errors.messages), bodhi_context.errors.to_a.to_s
26
+ end
27
+
21
28
  yield bodhi_context
22
- #puts "Exiting context: #{bodhi_context.attributes}"
23
29
  end
24
-
30
+
31
+ # Dynamically creates Ruby Classes for each type in the given +context+
32
+ #
33
+ # context = Bodhi::Context.new(valid_params)
34
+ # BodhiSlam.analyze(context) # => [#<Class:0x007fbff403e808 @name="TestType">, #<Class:0x007fbff403e808 @name="TestType2">, ...]
25
35
  def self.analyze(context)
26
- raise context.errors unless context.valid?
36
+ if context.invalid?
37
+ raise Bodhi::ContextErrors.new(context.errors.messages), context.errors.to_a.to_s
38
+ end
27
39
 
28
40
  all_enums = Bodhi::Enumeration.find_all(context)
29
41
  all_types = Bodhi::Type.find_all(context)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bodhi-slam
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - willdavis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-01 00:00:00.000000000 Z
11
+ date: 2015-07-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: net-http-persistent
@@ -104,6 +104,8 @@ files:
104
104
  - lib/bodhi-slam/context.rb
105
105
  - lib/bodhi-slam/enumerations.rb
106
106
  - lib/bodhi-slam/errors.rb
107
+ - lib/bodhi-slam/errors/api.rb
108
+ - lib/bodhi-slam/errors/context.rb
107
109
  - lib/bodhi-slam/factory.rb
108
110
  - lib/bodhi-slam/resource.rb
109
111
  - lib/bodhi-slam/types.rb
@@ -140,8 +142,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
140
142
  version: '0'
141
143
  requirements: []
142
144
  rubyforge_project:
143
- rubygems_version: 2.4.5
145
+ rubygems_version: 2.2.2
144
146
  signing_key:
145
147
  specification_version: 4
146
- summary: Ruby bindings for the Bodhi API + factories for random data generation
148
+ summary: Ruby bindings for the Bodhi API & factories for random data generation
147
149
  test_files: []