bodhi-slam 0.4.1 → 0.5.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 +4 -4
- data/lib/bodhi-slam.rb +5 -0
- data/lib/bodhi-slam/errors/api.rb +5 -0
- data/lib/bodhi-slam/factory.rb +14 -0
- data/lib/bodhi-slam/indexes.rb +20 -0
- data/lib/bodhi-slam/profiles.rb +25 -61
- data/lib/bodhi-slam/properties.rb +84 -0
- data/lib/bodhi-slam/resource.rb +38 -51
- data/lib/bodhi-slam/support.rb +23 -0
- data/lib/bodhi-slam/types.rb +37 -57
- data/lib/bodhi-slam/types/index.rb +11 -0
- data/lib/bodhi-slam/users.rb +41 -77
- data/lib/bodhi-slam/validators.rb +5 -12
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98cf6623880d11b702a150492d82187dd4cba869
|
4
|
+
data.tar.gz: f9f949910898bac2ac07517e412aa5825ba29d72
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: badc323a3402c4ae09b67aeb19e431857204f28b940ee24beacf58fd8284627f606ef3cd73f6d9e6d9f3f32f6a5df2a1264f72c65ed6742b3112539a67b02bee
|
7
|
+
data.tar.gz: 4b911fde1096640d8620f1ace4237b08c921db7284f3d2166f021efebe41e580fe53136a7f9aaf96066330b9128dbe19df61e1fb1e416aa8848c13ef4d555ddd
|
data/lib/bodhi-slam.rb
CHANGED
@@ -8,10 +8,15 @@ require "SecureRandom"
|
|
8
8
|
require 'regexp-examples'
|
9
9
|
require 'active_model'
|
10
10
|
|
11
|
+
require 'bodhi-slam/support'
|
12
|
+
|
11
13
|
require 'bodhi-slam/validations'
|
12
14
|
require 'bodhi-slam/errors'
|
13
15
|
require 'bodhi-slam/context'
|
14
16
|
|
17
|
+
require 'bodhi-slam/properties'
|
18
|
+
require 'bodhi-slam/indexes'
|
19
|
+
|
15
20
|
require 'bodhi-slam/batches'
|
16
21
|
require 'bodhi-slam/enumerations'
|
17
22
|
require 'bodhi-slam/factory'
|
data/lib/bodhi-slam/factory.rb
CHANGED
@@ -1,4 +1,18 @@
|
|
1
1
|
module Bodhi
|
2
|
+
module Factories
|
3
|
+
module ClassMethods
|
4
|
+
def factory; @factory; end
|
5
|
+
def generates(name, options)
|
6
|
+
@factory.add_generator(name.to_sym, options)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.included(base)
|
11
|
+
base.extend(ClassMethods)
|
12
|
+
base.instance_variable_set(:@factory, Bodhi::Factory.new(base))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
2
16
|
class Factory
|
3
17
|
attr_reader :klass
|
4
18
|
attr_accessor :generators
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Bodhi
|
2
|
+
module Indexes
|
3
|
+
module ClassMethods
|
4
|
+
def indexes; @indexes; end
|
5
|
+
def index(keys, options={})
|
6
|
+
# symbolize the option keys
|
7
|
+
options = options.reduce({}) do |memo, (k, v)|
|
8
|
+
memo.merge({ k.to_sym => v})
|
9
|
+
end
|
10
|
+
|
11
|
+
@indexes << Bodhi::TypeIndex.new(keys: keys.map(&:to_s), options: options)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.included(base)
|
16
|
+
base.extend(ClassMethods)
|
17
|
+
base.instance_variable_set(:@indexes, Array.new)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/bodhi-slam/profiles.rb
CHANGED
@@ -1,47 +1,44 @@
|
|
1
1
|
module Bodhi
|
2
2
|
class Profile
|
3
|
+
include Bodhi::Factories
|
4
|
+
include Bodhi::Properties
|
3
5
|
include Bodhi::Validations
|
4
6
|
|
5
|
-
ATTRIBUTES = [:name, :namespace, :dml, :subspace, :parent]
|
6
|
-
attr_accessor *ATTRIBUTES
|
7
7
|
attr_accessor :bodhi_context
|
8
8
|
|
9
|
+
property :name, :namespace, :dml, :subspace, :parent
|
10
|
+
|
9
11
|
validates :name, type: "String", required: true, is_not_blank: true
|
10
12
|
validates :namespace, type: "String", required: true
|
11
13
|
validates :dml, type: "Object", required: true
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
generates :name, type: "String", required: true, is_not_blank: true
|
16
|
+
generates :namespace, type: "String", required: true
|
17
|
+
generates :dml, type: "Object", required: true
|
18
|
+
|
19
|
+
# Queries the Bodhi API for the given +user_name+ and
|
20
|
+
# returns a Bodhi::Profile
|
21
|
+
#
|
22
|
+
# context = BodhiContext.new(valid_params)
|
23
|
+
# profile = Bodhi::Profile.find(context, "Profile1")
|
24
|
+
# profile # => #<Bodhi::Profile:0x007fbff403e808 @name="Profile1">
|
25
|
+
def self.find(context, profile_name)
|
26
|
+
if context.invalid?
|
27
|
+
raise Bodhi::ContextErrors.new(context.errors.messages), context.errors.to_a.to_s
|
17
28
|
end
|
18
29
|
|
19
|
-
|
20
|
-
|
21
|
-
|
30
|
+
result = context.connection.get do |request|
|
31
|
+
request.url "/#{context.namespace}/profiles/#{profile_name}"
|
32
|
+
request.headers[context.credentials_header] = context.credentials
|
22
33
|
end
|
23
|
-
end
|
24
34
|
|
25
|
-
|
26
|
-
|
27
|
-
# s = SomeResource.factory.build({foo:"test", bar:12345})
|
28
|
-
# s.attributes # => { foo: "test", bar: 12345 }
|
29
|
-
def attributes
|
30
|
-
result = Hash.new
|
31
|
-
ATTRIBUTES.each do |attribute|
|
32
|
-
result[attribute] = send(attribute)
|
35
|
+
if result.status != 200
|
36
|
+
raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
|
33
37
|
end
|
34
|
-
result
|
35
|
-
end
|
36
38
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
# s = SomeResource.factory.build({foo:"test", bar:12345})
|
41
|
-
# s.to_json # => "{ 'foo':'test', 'bar':12345 }"
|
42
|
-
def to_json(base=nil)
|
43
|
-
super if base
|
44
|
-
attributes.to_json
|
39
|
+
profile = Bodhi::Profile.new(result.body)
|
40
|
+
profile.bodhi_context = context
|
41
|
+
profile
|
45
42
|
end
|
46
43
|
|
47
44
|
# Saves the resource to the Bodhi Cloud. Raises ArgumentError if record could not be saved.
|
@@ -73,38 +70,5 @@ module Bodhi
|
|
73
70
|
end
|
74
71
|
end
|
75
72
|
|
76
|
-
# Returns a factory for the Bodhi::User class
|
77
|
-
def self.factory
|
78
|
-
@factory ||= Bodhi::Factory.new(Bodhi::Profile).tap do |factory|
|
79
|
-
factory.add_generator(:name, type: "String", required: true, is_not_blank: true)
|
80
|
-
factory.add_generator(:namespace, type: "String", required: true)
|
81
|
-
factory.add_generator(:dml, type: "Object", required: true)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
# Queries the Bodhi API for the given +user_name+ and
|
86
|
-
# returns a Bodhi::Profile
|
87
|
-
#
|
88
|
-
# context = BodhiContext.new(valid_params)
|
89
|
-
# profile = Bodhi::Profile.find(context, "Profile1")
|
90
|
-
# profile # => #<Bodhi::Profile:0x007fbff403e808 @name="Profile1">
|
91
|
-
def self.find(context, profile_name)
|
92
|
-
if context.invalid?
|
93
|
-
raise Bodhi::ContextErrors.new(context.errors.messages), context.errors.to_a.to_s
|
94
|
-
end
|
95
|
-
|
96
|
-
result = context.connection.get do |request|
|
97
|
-
request.url "/#{context.namespace}/profiles/#{profile_name}"
|
98
|
-
request.headers[context.credentials_header] = context.credentials
|
99
|
-
end
|
100
|
-
|
101
|
-
if result.status != 200
|
102
|
-
raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
|
103
|
-
end
|
104
|
-
|
105
|
-
profile = Bodhi::Profile.new(result.body)
|
106
|
-
profile.bodhi_context = context
|
107
|
-
profile
|
108
|
-
end
|
109
73
|
end
|
110
74
|
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Bodhi
|
2
|
+
module Properties
|
3
|
+
|
4
|
+
SYSTEM_PROPERTIES = [:sys_created_at, :sys_version, :sys_modified_at, :sys_modified_by,
|
5
|
+
:sys_namespace, :sys_created_by, :sys_type_version, :sys_id, :sys_embeddedType]
|
6
|
+
attr_accessor *SYSTEM_PROPERTIES
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def properties; @properties; end
|
10
|
+
def property(*names)
|
11
|
+
attr_accessor *names.map(&:to_sym)
|
12
|
+
@properties << names.map(&:to_sym)
|
13
|
+
@properties.flatten!
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module InstanceMethods
|
18
|
+
def id; @sys_id; end
|
19
|
+
def persisted?; !@sys_id.nil?; end
|
20
|
+
def new_record?; @sys_id.nil?; end
|
21
|
+
|
22
|
+
# Initializes a new instance of the class. Accepts a parameter Hash for mass assignment.
|
23
|
+
# If a parameter does not exist for the class, an UndefinedMethod error is raised.
|
24
|
+
#
|
25
|
+
# klass = Class.new do
|
26
|
+
# include Bodhi::Properties
|
27
|
+
# property :name, :email
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# object = klass.new(name: "Bob", email: "some@email.com")
|
31
|
+
# object.name #=> "Bob"
|
32
|
+
# object.email #=> "some@email.com"
|
33
|
+
def initialize(params={})
|
34
|
+
params.each do |param_key, param_value|
|
35
|
+
send("#{param_key}=", param_value)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Returns a Hash of the class properties and their values.
|
40
|
+
#
|
41
|
+
# object = SomeResource.new(foo:"test", bar:12345)
|
42
|
+
# object.attributes # => { foo: "test", bar: 12345 }
|
43
|
+
def attributes
|
44
|
+
attributes = Hash.new
|
45
|
+
self.class.properties.each do |property|
|
46
|
+
attributes[property] = send(property)
|
47
|
+
end
|
48
|
+
|
49
|
+
attributes.delete_if { |k, v| v.nil? }
|
50
|
+
attributes
|
51
|
+
end
|
52
|
+
|
53
|
+
# Updates the resource with the given attributes Hash
|
54
|
+
#
|
55
|
+
# s = SomeResource.factory.build(foo:"test", bar:12345)
|
56
|
+
# s.attributes # => { foo: "test", bar: 12345 }
|
57
|
+
# s.update_attributes(bar: 10)
|
58
|
+
# s.attributes # => { foo: "test", bar: 10 }
|
59
|
+
def update_attributes(params)
|
60
|
+
params.each do |param_key, param_value|
|
61
|
+
send("#{param_key}=", param_value)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Returns all the classes properties as JSON.
|
66
|
+
# It converts any nested objects to JSON if they respond to +to_json+
|
67
|
+
#
|
68
|
+
# resource = SomeResource.new(foo:"test", bar:12345)
|
69
|
+
# embedded_resources = AnotherResource.new( test: resource )
|
70
|
+
#
|
71
|
+
# resource.to_json # => "{ 'foo':'test', 'bar':12345 }"
|
72
|
+
# embedded_resources.to_json # => "{ 'test': { 'foo':'test', 'bar':12345 } }"
|
73
|
+
def to_json(base=nil)
|
74
|
+
attributes.to_json
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.included(base)
|
79
|
+
base.extend(ClassMethods)
|
80
|
+
base.include(InstanceMethods)
|
81
|
+
base.instance_variable_set(:@properties, Array.new)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
data/lib/bodhi-slam/resource.rb
CHANGED
@@ -1,14 +1,44 @@
|
|
1
1
|
module Bodhi
|
2
2
|
module Resource
|
3
3
|
|
4
|
-
|
5
|
-
:sys_namespace, :sys_created_by, :sys_type_version, :sys_id, :sys_embeddedType]
|
6
|
-
SUPPORT_ATTRIBUTES = [:bodhi_context, :errors]
|
7
|
-
attr_accessor *SYSTEM_ATTRIBUTES
|
8
|
-
attr_accessor *SUPPORT_ATTRIBUTES
|
4
|
+
attr_accessor :bodhi_context
|
9
5
|
|
10
6
|
module ClassMethods
|
11
|
-
|
7
|
+
|
8
|
+
def embedded(bool); @embedded = bool; end
|
9
|
+
def is_embedded?; @embedded; end
|
10
|
+
|
11
|
+
# Defines the given +name+ and +options+ as a form attribute for the class.
|
12
|
+
# The +name+ is set as a property, and validations & factory generators are added based on the supplied +options+
|
13
|
+
#
|
14
|
+
# class User
|
15
|
+
# include Bodhi::Resource
|
16
|
+
#
|
17
|
+
# field :first_name, type: "String", required: true, is_not_blank: true
|
18
|
+
# field :last_name, type: "String", required: true, is_not_blank: true
|
19
|
+
# field :email, type: "String", required: true, is_not_blank: true, is_email: true
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# object = User.new(first_name: "John", last_name: "Smith", email: "jsmith@email.com")
|
23
|
+
# object.to_json #=> { "first_name": "John", "last_name": "Smith", "email": "jsmith@email.com" }
|
24
|
+
def field(name, options)
|
25
|
+
property(name.to_sym)
|
26
|
+
validates(name.to_sym, options)
|
27
|
+
generates(name.to_sym, options)
|
28
|
+
end
|
29
|
+
|
30
|
+
def build_type
|
31
|
+
# reduce the properties array into a Hash.
|
32
|
+
# lookup the validators for each property and add them as options for the property
|
33
|
+
type_properties = self.properties.reduce({}) do |result, property|
|
34
|
+
options = self.validators[property].map(&:to_options).reduce({}) do |options_result, options_hash|
|
35
|
+
options_result.merge(options_hash)
|
36
|
+
end
|
37
|
+
result.merge({ property => options})
|
38
|
+
end
|
39
|
+
|
40
|
+
Bodhi::Type.new(name: self.name, properties: type_properties, indexes: self.indexes, embedded: self.is_embedded?)
|
41
|
+
end
|
12
42
|
|
13
43
|
# Saves a batch of resources to the Bodhi Cloud in the given +context+
|
14
44
|
# Returns an array of JSON objects describing the results for each record in the batch
|
@@ -182,9 +212,6 @@ module Bodhi
|
|
182
212
|
end
|
183
213
|
|
184
214
|
module InstanceMethods
|
185
|
-
def id; @sys_id; end
|
186
|
-
def persisted?; !@sys_id.nil?; end
|
187
|
-
def new_record?; @sys_id.nil?; end
|
188
215
|
|
189
216
|
def initialize(params={})
|
190
217
|
params.each do |param_key, param_value|
|
@@ -207,46 +234,6 @@ module Bodhi
|
|
207
234
|
end
|
208
235
|
end
|
209
236
|
|
210
|
-
# Returns a Hash of the Objects form attributes
|
211
|
-
#
|
212
|
-
# s = SomeResource.build({foo:"test", bar:12345})
|
213
|
-
# s.attributes # => { foo: "test", bar: 12345 }
|
214
|
-
def attributes
|
215
|
-
attributes = Hash.new
|
216
|
-
self.instance_variables.each do |variable|
|
217
|
-
attribute_name = variable.to_s.delete('@').to_sym
|
218
|
-
unless SYSTEM_ATTRIBUTES.include?(attribute_name) || SUPPORT_ATTRIBUTES.include?(attribute_name)
|
219
|
-
attributes[attribute_name] = send(attribute_name)
|
220
|
-
end
|
221
|
-
end
|
222
|
-
attributes
|
223
|
-
end
|
224
|
-
|
225
|
-
# Updates the resource with the given attributes Hash
|
226
|
-
#
|
227
|
-
# s = SomeResource.factory.build(foo:"test", bar:12345)
|
228
|
-
# s.attributes # => { foo: "test", bar: 12345 }
|
229
|
-
# s.update_attributes(foo:"12345", bar:10)
|
230
|
-
# s.attributes # => { foo: "12345", bar: 10 }
|
231
|
-
def update_attributes(params)
|
232
|
-
self.instance_variables.each do |variable|
|
233
|
-
attribute_name = variable.to_s.delete('@').to_sym
|
234
|
-
unless SYSTEM_ATTRIBUTES.include?(attribute_name) || SUPPORT_ATTRIBUTES.include?(attribute_name)
|
235
|
-
send("#{attribute_name}=", params[attribute_name])
|
236
|
-
end
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
# Returns all the Objects attributes as JSON.
|
241
|
-
# It converts any nested Objects to JSON if they respond to +to_json+
|
242
|
-
#
|
243
|
-
# s = SomeResource.build({foo:"test", bar:12345})
|
244
|
-
# s.to_json # => { "foo":"test", "bar":12345 }
|
245
|
-
def to_json(base=nil)
|
246
|
-
super if base
|
247
|
-
attributes.to_json
|
248
|
-
end
|
249
|
-
|
250
237
|
# Saves the resource to the Bodhi Cloud. Returns true if record was saved
|
251
238
|
#
|
252
239
|
# obj = Resource.new
|
@@ -355,8 +342,8 @@ module Bodhi
|
|
355
342
|
|
356
343
|
def self.included(base)
|
357
344
|
base.extend(ClassMethods)
|
358
|
-
base.include(InstanceMethods, Bodhi::Validations, ActiveModel::Model)
|
359
|
-
base.instance_variable_set(:@
|
345
|
+
base.include(InstanceMethods, Bodhi::Validations, Bodhi::Properties, Bodhi::Indexes, Bodhi::Factories, ActiveModel::Model)
|
346
|
+
base.instance_variable_set(:@embedded, false)
|
360
347
|
end
|
361
348
|
end
|
362
349
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Bodhi
|
2
|
+
class Support
|
3
|
+
def self.underscore(string)
|
4
|
+
string.gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
5
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
6
|
+
tr("-", "_").
|
7
|
+
downcase
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.uncapitalize(string)
|
11
|
+
string[0, 1].downcase + string[1..-1]
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.camelize(string)
|
15
|
+
underscore(string).split('_').collect(&:capitalize).join
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.reverse_camelize(string)
|
19
|
+
result = underscore(string).split('_').collect(&:capitalize).join
|
20
|
+
uncapitalize(result)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/bodhi-slam/types.rb
CHANGED
@@ -1,41 +1,42 @@
|
|
1
1
|
module Bodhi
|
2
2
|
class Type
|
3
|
+
include Bodhi::Factories
|
4
|
+
include Bodhi::Properties
|
3
5
|
include Bodhi::Validations
|
4
6
|
|
5
|
-
SYSTEM_ATTRIBUTES = [:sys_created_at, :sys_version, :sys_modified_at, :sys_modified_by,
|
6
|
-
:sys_namespace, :sys_created_by, :sys_type_version, :sys_id, :sys_embeddedType]
|
7
|
-
ATTRIBUTES = [:name, :namespace, :package, :embedded, :properties, :version, :extends]
|
8
|
-
|
9
|
-
attr_accessor *ATTRIBUTES
|
10
|
-
attr_reader *SYSTEM_ATTRIBUTES
|
11
7
|
attr_accessor :bodhi_context
|
12
8
|
|
9
|
+
property :name, :storage_name, :namespace,
|
10
|
+
:package, :embedded, :properties, :version,
|
11
|
+
:extends, :indexes, :hidden, :events, :documentation,
|
12
|
+
:metadata, :encapsulated
|
13
|
+
|
13
14
|
validates :name, required: true, is_not_blank: true
|
14
|
-
validates :namespace, required: true
|
15
15
|
validates :properties, required: true
|
16
|
+
validates :indexes, type: "Bodhi::TypeIndex", multi: true
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
factory.add_generator(:package, type: "String")
|
25
|
-
factory.add_generator(:embedded, type: "Boolean")
|
26
|
-
factory.add_generator(:version, type: "String")
|
27
|
-
end
|
28
|
-
end
|
18
|
+
generates :extends, type: "String", matches: "[a-zA-Z_-]{10,20}"
|
19
|
+
generates :name, type: "String", required: true, is_not_blank: true
|
20
|
+
generates :namespace, type: "String", required: true
|
21
|
+
generates :properties, type: "Object", required: true
|
22
|
+
generates :package, type: "String"
|
23
|
+
generates :embedded, type: "Boolean"
|
24
|
+
generates :version, type: "String"
|
29
25
|
|
30
26
|
def initialize(params={})
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
27
|
+
params.each do |param_key, param_value|
|
28
|
+
if param_key.to_sym == :indexes
|
29
|
+
# check if the param_value is already an Array of Bodhi::TypeIndex objects
|
30
|
+
if param_value.is_a?(Array) && param_value.first.is_a?(Bodhi::TypeIndex)
|
31
|
+
send("#{param_key}=", param_value)
|
32
|
+
else
|
33
|
+
# the param_value is a raw json object and needs to be turned into an array of Bodhi::TypeIndex objects
|
34
|
+
values = param_value.map{ |index| Bodhi::TypeIndex.new(index) }
|
35
|
+
send("#{param_key}=", values)
|
36
|
+
end
|
37
|
+
else
|
38
|
+
send("#{param_key}=", param_value)
|
39
|
+
end
|
39
40
|
end
|
40
41
|
|
41
42
|
# Format type name to be compatible with Ruby Constants
|
@@ -44,29 +45,6 @@ module Bodhi
|
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
47
|
-
# Returns a Hash of the Objects form attributes
|
48
|
-
#
|
49
|
-
# s = SomeResource.factory.build({foo:"test", bar:12345})
|
50
|
-
# s.attributes # => { foo: "test", bar: 12345 }
|
51
|
-
def attributes
|
52
|
-
result = Hash.new
|
53
|
-
ATTRIBUTES.each do |attribute|
|
54
|
-
result[attribute] = send(attribute)
|
55
|
-
end
|
56
|
-
result.delete_if { |k, v| v.nil? }
|
57
|
-
result
|
58
|
-
end
|
59
|
-
|
60
|
-
# Returns all the Objects attributes as JSON.
|
61
|
-
# It converts any nested Objects to JSON if they respond to +to_json+
|
62
|
-
#
|
63
|
-
# s = SomeResource.factory.build({foo:"test", bar:12345})
|
64
|
-
# s.to_json # => "{ 'foo':'test', 'bar':12345 }"
|
65
|
-
def to_json(base=nil)
|
66
|
-
super if base
|
67
|
-
attributes.to_json
|
68
|
-
end
|
69
|
-
|
70
48
|
# Saves the resource to the Bodhi Cloud. Raises ArgumentError if record could not be saved.
|
71
49
|
#
|
72
50
|
# obj = Resouce.new
|
@@ -83,6 +61,10 @@ module Bodhi
|
|
83
61
|
if result.status != 201
|
84
62
|
raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
|
85
63
|
end
|
64
|
+
|
65
|
+
if result.headers['location']
|
66
|
+
@sys_id = result.headers['location'].match(/types\/(?<name>[a-zA-Z0-9]+)/)[:name]
|
67
|
+
end
|
86
68
|
end
|
87
69
|
|
88
70
|
def delete!
|
@@ -170,19 +152,17 @@ module Bodhi
|
|
170
152
|
raise ArgumentError.new("Expected #{type.class} to be a Bodhi::Type")
|
171
153
|
end
|
172
154
|
|
173
|
-
klass = Object.const_set(type.name, Class.new {
|
174
|
-
include Bodhi::Resource
|
175
|
-
attr_accessor *type.properties.keys
|
176
|
-
})
|
155
|
+
klass = Object.const_set(type.name, Class.new { include Bodhi::Resource })
|
177
156
|
|
178
157
|
type.properties.each_pair do |attr_name, attr_properties|
|
179
158
|
attr_properties.delete_if{ |key, value| ["system", "trim", "unique", "default", "isCurrentUser", "toLower"].include?(key) }
|
180
|
-
klass.
|
181
|
-
klass.factory.add_generator(attr_name.to_sym, attr_properties)
|
159
|
+
klass.field(attr_name, attr_properties)
|
182
160
|
end
|
183
161
|
|
184
162
|
klass
|
185
163
|
end
|
186
164
|
|
187
165
|
end
|
188
|
-
end
|
166
|
+
end
|
167
|
+
|
168
|
+
Dir[File.dirname(__FILE__) + "/types/*.rb"].each { |file| require file }
|
data/lib/bodhi-slam/users.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
module Bodhi
|
2
2
|
class User
|
3
|
+
include Bodhi::Factories
|
4
|
+
include Bodhi::Properties
|
3
5
|
include Bodhi::Validations
|
4
6
|
|
5
|
-
ATTRIBUTES = [:username, :password, :profiles, :email, :firstName, :lastName, :phone]
|
6
|
-
attr_accessor *ATTRIBUTES
|
7
7
|
attr_accessor :bodhi_context
|
8
8
|
|
9
|
+
property :username, :password, :profiles, :authorizations, :email, :firstName, :lastName, :phone, :usertype, :namespace
|
10
|
+
|
9
11
|
validates :username, type: "String", required: true, is_not_blank: true
|
10
12
|
validates :password, type: "String", required: true, is_not_blank: true
|
11
13
|
validates :profiles, type: "String", required: true, multi: true
|
@@ -14,81 +16,13 @@ module Bodhi
|
|
14
16
|
validates :lastName, type: "String"
|
15
17
|
validates :phone, type: "String"
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
ATTRIBUTES.each do |attribute|
|
25
|
-
send("#{attribute}=", params[attribute])
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
# Returns a Hash of the Objects form attributes
|
30
|
-
#
|
31
|
-
# s = SomeResource.factory.build({foo:"test", bar:12345})
|
32
|
-
# s.attributes # => { foo: "test", bar: 12345 }
|
33
|
-
def attributes
|
34
|
-
result = Hash.new
|
35
|
-
ATTRIBUTES.each do |attribute|
|
36
|
-
result[attribute] = send(attribute)
|
37
|
-
end
|
38
|
-
result
|
39
|
-
end
|
40
|
-
|
41
|
-
# Returns all the Objects attributes as JSON.
|
42
|
-
# It converts any nested Objects to JSON if they respond to +to_json+
|
43
|
-
#
|
44
|
-
# s = SomeResource.factory.build({foo:"test", bar:12345})
|
45
|
-
# s.to_json # => "{ 'foo':'test', 'bar':12345 }"
|
46
|
-
def to_json(base=nil)
|
47
|
-
super if base
|
48
|
-
attributes.to_json
|
49
|
-
end
|
50
|
-
|
51
|
-
# Saves the resource to the Bodhi Cloud. Raises ArgumentError if record could not be saved.
|
52
|
-
#
|
53
|
-
# obj = Resouce.new
|
54
|
-
# obj.save!
|
55
|
-
# obj.persisted? # => true
|
56
|
-
def save!
|
57
|
-
result = bodhi_context.connection.post do |request|
|
58
|
-
request.url "/#{bodhi_context.namespace}/users"
|
59
|
-
request.headers['Content-Type'] = 'application/json'
|
60
|
-
request.headers[bodhi_context.credentials_header] = bodhi_context.credentials
|
61
|
-
request.body = attributes.to_json
|
62
|
-
end
|
63
|
-
|
64
|
-
if result.status != 201
|
65
|
-
raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def delete!
|
70
|
-
result = bodhi_context.connection.delete do |request|
|
71
|
-
request.url "/#{bodhi_context.namespace}/users/#{username}"
|
72
|
-
request.headers[bodhi_context.credentials_header] = bodhi_context.credentials
|
73
|
-
end
|
74
|
-
|
75
|
-
if result.status != 204
|
76
|
-
raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
# Returns a factory for the Bodhi::User class
|
81
|
-
def self.factory
|
82
|
-
@factory ||= Bodhi::Factory.new(Bodhi::User).tap do |factory|
|
83
|
-
factory.add_generator(:username, type: "String", required: true, is_not_blank: true)
|
84
|
-
factory.add_generator(:password, type: "String", required: true, is_not_blank: true)
|
85
|
-
factory.add_generator(:profiles, type: "String", required: true, multi: true)
|
86
|
-
factory.add_generator(:email, type: "String", is_email: true)
|
87
|
-
factory.add_generator(:firstName, type: "String")
|
88
|
-
factory.add_generator(:lastName, type: "String")
|
89
|
-
factory.add_generator(:phone, type: "String")
|
90
|
-
end
|
91
|
-
end
|
19
|
+
generates :username, type: "String", required: true, is_not_blank: true
|
20
|
+
generates :password, type: "String", required: true, is_not_blank: true
|
21
|
+
generates :profiles, type: "String", required: true, multi: true
|
22
|
+
generates :email, type: "String", is_email: true
|
23
|
+
generates :firstName, type: "String"
|
24
|
+
generates :lastName, type: "String"
|
25
|
+
generates :phone, type: "String"
|
92
26
|
|
93
27
|
# Queries the Bodhi API for the given +user_name+ and
|
94
28
|
# returns a Bodhi::User
|
@@ -135,5 +69,35 @@ module Bodhi
|
|
135
69
|
|
136
70
|
result.body
|
137
71
|
end
|
72
|
+
|
73
|
+
# Saves the resource to the Bodhi Cloud. Raises ArgumentError if record could not be saved.
|
74
|
+
#
|
75
|
+
# obj = Resouce.new
|
76
|
+
# obj.save!
|
77
|
+
# obj.persisted? # => true
|
78
|
+
def save!
|
79
|
+
result = bodhi_context.connection.post do |request|
|
80
|
+
request.url "/#{bodhi_context.namespace}/users"
|
81
|
+
request.headers['Content-Type'] = 'application/json'
|
82
|
+
request.headers[bodhi_context.credentials_header] = bodhi_context.credentials
|
83
|
+
request.body = attributes.to_json
|
84
|
+
end
|
85
|
+
|
86
|
+
if result.status != 201
|
87
|
+
raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def delete!
|
92
|
+
result = bodhi_context.connection.delete do |request|
|
93
|
+
request.url "/#{bodhi_context.namespace}/users/#{username}"
|
94
|
+
request.headers[bodhi_context.credentials_header] = bodhi_context.credentials
|
95
|
+
end
|
96
|
+
|
97
|
+
if result.status != 204
|
98
|
+
raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
138
102
|
end
|
139
103
|
end
|
@@ -16,10 +16,8 @@ module Bodhi
|
|
16
16
|
# type.to_sym # => :type
|
17
17
|
# is_not_blank.to_sym # => :is_not_blank
|
18
18
|
def to_sym
|
19
|
-
underscore.
|
20
|
-
|
21
|
-
gsub("_validator", "").
|
22
|
-
to_sym
|
19
|
+
name = self.underscore.gsub("bodhi::", "").gsub("_validator", "")
|
20
|
+
Bodhi::Support.reverse_camelize(name).to_sym
|
23
21
|
end
|
24
22
|
|
25
23
|
# Returns the validation's class name in snake_case.
|
@@ -30,11 +28,7 @@ module Bodhi
|
|
30
28
|
# type.underscore # => "bodhi/type_validator"
|
31
29
|
# is_not_blank.underscore # => "bodhi/is_not_blank_validator"
|
32
30
|
def underscore
|
33
|
-
self.class.name
|
34
|
-
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
35
|
-
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
36
|
-
tr("-", "_").
|
37
|
-
downcase
|
31
|
+
Bodhi::Support.underscore(self.class.name)
|
38
32
|
end
|
39
33
|
|
40
34
|
# Returns the validation as an options Hash.
|
@@ -55,9 +49,8 @@ module Bodhi
|
|
55
49
|
# Bodhi::Validator.constantize("type") # => #<Bodhi::TypeValidator:0x007fbff403e808>
|
56
50
|
# Bodhi::Validator.constantize("is_not_blank") # => #<Bodhi::IsNotBlankValidator:0x007fbff403e808>
|
57
51
|
def self.constantize(name)
|
58
|
-
camelized_name = name.to_s
|
59
|
-
|
60
|
-
Object.const_get(full_name)
|
52
|
+
camelized_name = Bodhi::Support.camelize(name.to_s)
|
53
|
+
Object.const_get("Bodhi::#{camelized_name}Validator")
|
61
54
|
end
|
62
55
|
end
|
63
56
|
end
|
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.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- willdavis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -165,10 +165,14 @@ files:
|
|
165
165
|
- lib/bodhi-slam/errors/api.rb
|
166
166
|
- lib/bodhi-slam/errors/context.rb
|
167
167
|
- lib/bodhi-slam/factory.rb
|
168
|
+
- lib/bodhi-slam/indexes.rb
|
168
169
|
- lib/bodhi-slam/profiles.rb
|
170
|
+
- lib/bodhi-slam/properties.rb
|
169
171
|
- lib/bodhi-slam/queries.rb
|
170
172
|
- lib/bodhi-slam/resource.rb
|
173
|
+
- lib/bodhi-slam/support.rb
|
171
174
|
- lib/bodhi-slam/types.rb
|
175
|
+
- lib/bodhi-slam/types/index.rb
|
172
176
|
- lib/bodhi-slam/users.rb
|
173
177
|
- lib/bodhi-slam/validations.rb
|
174
178
|
- lib/bodhi-slam/validators.rb
|