bodhi-slam 0.2.5 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/bodhi-slam.rb +7 -4
- data/lib/bodhi-slam/batches.rb +19 -0
- data/lib/bodhi-slam/batches/resource.rb +49 -0
- data/lib/bodhi-slam/factory.rb +3 -13
- data/lib/bodhi-slam/resource.rb +9 -18
- data/lib/bodhi-slam/types.rb +102 -12
- data/lib/bodhi-slam/users.rb +139 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 918cd6ede8d2d5cd62621b10fa6c80db870ef708
|
4
|
+
data.tar.gz: 26cbbadd0c463339016f7b60d4e87993373aaf5a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d8e3134e705a6aeafe8fbea15831e1e3aefe5dca26e466c6484420531e5da67bb7436761c1c80db6077441cc8b3437726ad1d99250ec8fab3b72f055590b197
|
7
|
+
data.tar.gz: 3db2df8a8b36503709c1c9589a574977024d19b2bb8ac78eb9780001e592269d1be7f8c197867514d50644220fad3d5a89d35fc77a547b1d08d0dad1b00b9658
|
data/lib/bodhi-slam.rb
CHANGED
@@ -4,13 +4,16 @@ require "json"
|
|
4
4
|
require "time"
|
5
5
|
require "SecureRandom"
|
6
6
|
|
7
|
-
require 'bodhi-slam/context'
|
8
|
-
require 'bodhi-slam/errors'
|
9
|
-
require 'bodhi-slam/resource'
|
10
|
-
require 'bodhi-slam/types'
|
11
7
|
require 'bodhi-slam/validations'
|
8
|
+
require 'bodhi-slam/errors'
|
9
|
+
|
10
|
+
require 'bodhi-slam/batches'
|
11
|
+
require 'bodhi-slam/context'
|
12
12
|
require 'bodhi-slam/enumerations'
|
13
13
|
require 'bodhi-slam/factory'
|
14
|
+
require 'bodhi-slam/resource'
|
15
|
+
require 'bodhi-slam/types'
|
16
|
+
require 'bodhi-slam/users'
|
14
17
|
|
15
18
|
class BodhiSlam
|
16
19
|
# Defines a context to interact with the Bodhi API
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Bodhi
|
2
|
+
class Batch
|
3
|
+
attr_accessor :records
|
4
|
+
attr_reader :created, :failed
|
5
|
+
|
6
|
+
def initialize(records=[])
|
7
|
+
@records = records
|
8
|
+
@created = []
|
9
|
+
@failed = []
|
10
|
+
end
|
11
|
+
|
12
|
+
# Saves the batch of records to the Bodhi cloud.
|
13
|
+
def save!(context)
|
14
|
+
raise NotImplementedError, "Subclasses must implement a save!(context) method."
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
Dir[File.dirname(__FILE__) + "/batches/*.rb"].each { |file| require file }
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Bodhi
|
2
|
+
class ResourceBatch < Batch
|
3
|
+
include Bodhi::Validations
|
4
|
+
|
5
|
+
attr_accessor :type
|
6
|
+
|
7
|
+
validates :type, type: "String", required: true, is_not_blank: true
|
8
|
+
validates :records, type: "Bodhi::Resource", required: true, multi: true
|
9
|
+
|
10
|
+
def initialize(type, resources=[])
|
11
|
+
super(resources)
|
12
|
+
@type = type
|
13
|
+
end
|
14
|
+
|
15
|
+
# Saves all records in the batch to the cloud
|
16
|
+
# and populates the +created+ and +failed+ arrays with the results
|
17
|
+
def save!(context)
|
18
|
+
if context.invalid?
|
19
|
+
raise Bodhi::ContextErrors.new(context.errors.messages), context.errors.to_a.to_s
|
20
|
+
end
|
21
|
+
|
22
|
+
records.each{ |record| record.validate! }
|
23
|
+
|
24
|
+
response = context.connection.post do |request|
|
25
|
+
request.url "/#{context.namespace}/resources/#{type}"
|
26
|
+
request.headers['Content-Type'] = 'application/json'
|
27
|
+
request.headers[context.credentials_header] = context.credentials
|
28
|
+
request.body = records.to_json
|
29
|
+
end
|
30
|
+
|
31
|
+
if response.status != 200
|
32
|
+
raise Bodhi::ApiErrors.new(body: response.body, status: response.status), "status: #{response.status}, body: #{response.body}"
|
33
|
+
end
|
34
|
+
|
35
|
+
# Parse the result body and update records with their sys_id
|
36
|
+
response_body = JSON.parse(response.body)
|
37
|
+
results = response_body.zip(records)
|
38
|
+
results.each do |response, record|
|
39
|
+
if response["location"]
|
40
|
+
record.sys_id = response["location"].match(/(?<id>[a-zA-Z0-9]{24})/)[:id]
|
41
|
+
@created.push record
|
42
|
+
else
|
43
|
+
@failed.push record
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/bodhi-slam/factory.rb
CHANGED
@@ -69,21 +69,11 @@ module Bodhi
|
|
69
69
|
end
|
70
70
|
|
71
71
|
resources = build_list(size, params)
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
request.headers[context.credentials_header] = context.credentials
|
76
|
-
request.body = resources.to_json
|
72
|
+
resources.each do |resource|
|
73
|
+
resource.bodhi_context = context
|
74
|
+
resource.save!
|
77
75
|
end
|
78
76
|
|
79
|
-
#puts "\033[33mResult Body\033[0m: \033[36m#{result.body}\033[0m"
|
80
|
-
|
81
|
-
if result.status != 200
|
82
|
-
raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
|
83
|
-
end
|
84
|
-
|
85
|
-
#puts "\033[33mRecords\033[0m: \033[36m#{records.map(&:attributes)}\033[0m"
|
86
|
-
|
87
77
|
resources
|
88
78
|
end
|
89
79
|
|
data/lib/bodhi-slam/resource.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
module Bodhi
|
2
2
|
module Resource
|
3
|
-
SYSTEM_ATTRIBUTES = [:
|
3
|
+
SYSTEM_ATTRIBUTES = [:sys_created_at, :sys_version, :sys_modified_at, :sys_modified_by,
|
4
4
|
:sys_namespace, :sys_created_by, :sys_type_version, :sys_id, :sys_embeddedType]
|
5
|
+
SUPPORT_ATTRIBUTES = [:bodhi_context, :errors]
|
5
6
|
attr_accessor *SYSTEM_ATTRIBUTES
|
7
|
+
attr_accessor *SUPPORT_ATTRIBUTES
|
6
8
|
|
7
9
|
module ClassMethods
|
8
10
|
def factory; @factory; end
|
@@ -14,22 +16,9 @@ module Bodhi
|
|
14
16
|
# list = Resource.factory.build_list(10)
|
15
17
|
# Resource.save_batch(context, list)
|
16
18
|
def save_batch(context, objects)
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
19
|
+
batch = Bodhi::ResourceBatch.new(name, objects)
|
20
|
+
batch.save!(context)
|
21
|
+
batch
|
33
22
|
end
|
34
23
|
|
35
24
|
# Returns a single resource from the Bodhi Cloud that matches the given +id+
|
@@ -168,7 +157,9 @@ module Bodhi
|
|
168
157
|
attributes = Hash.new
|
169
158
|
self.instance_variables.each do |variable|
|
170
159
|
attribute_name = variable.to_s.delete('@').to_sym
|
171
|
-
|
160
|
+
unless SYSTEM_ATTRIBUTES.include?(attribute_name) || SUPPORT_ATTRIBUTES.include?(attribute_name)
|
161
|
+
attributes[attribute_name] = send(attribute_name)
|
162
|
+
end
|
172
163
|
end
|
173
164
|
attributes
|
174
165
|
end
|
data/lib/bodhi-slam/types.rb
CHANGED
@@ -2,18 +2,31 @@ module Bodhi
|
|
2
2
|
class Type
|
3
3
|
include Bodhi::Validations
|
4
4
|
|
5
|
-
|
5
|
+
SYSTEM_ATTRIBUTES = [:sys_created_at, :sys_version, :sys_modified_at, :sys_modified_by,
|
6
6
|
:sys_namespace, :sys_created_by, :sys_type_version, :sys_id, :sys_embeddedType]
|
7
|
-
|
7
|
+
ATTRIBUTES = [:name, :namespace, :package, :embedded, :properties, :version]
|
8
8
|
|
9
|
-
attr_accessor *
|
10
|
-
attr_reader *
|
9
|
+
attr_accessor *ATTRIBUTES
|
10
|
+
attr_reader *SYSTEM_ATTRIBUTES
|
11
11
|
attr_reader :validations
|
12
|
+
attr_accessor :bodhi_context
|
12
13
|
|
13
14
|
validates :name, required: true, is_not_blank: true
|
14
15
|
validates :namespace, required: true
|
15
16
|
validates :properties, required: true
|
16
17
|
|
18
|
+
# Returns a factory for the Bodhi::Type class
|
19
|
+
def self.factory
|
20
|
+
@factory ||= Bodhi::Factory.new(Bodhi::Type).tap do |factory|
|
21
|
+
factory.add_generator(:name, type: "String", required: true, is_not_blank: true)
|
22
|
+
factory.add_generator(:namespace, type: "String", required: true)
|
23
|
+
factory.add_generator(:properties, type: "Object", required: true)
|
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
|
29
|
+
|
17
30
|
def initialize(params={})
|
18
31
|
# same as symbolize_keys!
|
19
32
|
params = params.reduce({}) do |memo, (k, v)|
|
@@ -21,7 +34,7 @@ module Bodhi
|
|
21
34
|
end
|
22
35
|
|
23
36
|
# set attributes
|
24
|
-
|
37
|
+
ATTRIBUTES.each do |attribute|
|
25
38
|
send("#{attribute}=", params[attribute])
|
26
39
|
end
|
27
40
|
|
@@ -52,8 +65,84 @@ module Bodhi
|
|
52
65
|
end
|
53
66
|
end
|
54
67
|
|
55
|
-
#
|
56
|
-
#
|
68
|
+
# Returns a Hash of the Objects form attributes
|
69
|
+
#
|
70
|
+
# s = SomeResource.factory.build({foo:"test", bar:12345})
|
71
|
+
# s.attributes # => { foo: "test", bar: 12345 }
|
72
|
+
def attributes
|
73
|
+
result = Hash.new
|
74
|
+
ATTRIBUTES.each do |attribute|
|
75
|
+
result[attribute] = send(attribute)
|
76
|
+
end
|
77
|
+
result
|
78
|
+
end
|
79
|
+
|
80
|
+
# Returns all the Objects attributes as JSON.
|
81
|
+
# It converts any nested Objects to JSON if they respond to +to_json+
|
82
|
+
#
|
83
|
+
# s = SomeResource.factory.build({foo:"test", bar:12345})
|
84
|
+
# s.to_json # => "{ 'foo':'test', 'bar':12345 }"
|
85
|
+
def to_json(base=nil)
|
86
|
+
super if base
|
87
|
+
attributes.to_json
|
88
|
+
end
|
89
|
+
|
90
|
+
# Saves the resource to the Bodhi Cloud. Raises ArgumentError if record could not be saved.
|
91
|
+
#
|
92
|
+
# obj = Resouce.new
|
93
|
+
# obj.save!
|
94
|
+
# obj.persisted? # => true
|
95
|
+
def save!
|
96
|
+
result = bodhi_context.connection.post do |request|
|
97
|
+
request.url "/#{bodhi_context.namespace}/types"
|
98
|
+
request.headers['Content-Type'] = 'application/json'
|
99
|
+
request.headers[bodhi_context.credentials_header] = bodhi_context.credentials
|
100
|
+
request.body = attributes.to_json
|
101
|
+
end
|
102
|
+
|
103
|
+
if result.status != 201
|
104
|
+
raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def delete!
|
109
|
+
result = bodhi_context.connection.delete do |request|
|
110
|
+
request.url "/#{bodhi_context.namespace}/types/#{name}"
|
111
|
+
request.headers[bodhi_context.credentials_header] = bodhi_context.credentials
|
112
|
+
end
|
113
|
+
|
114
|
+
if result.status != 204
|
115
|
+
raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# Queries the Bodhi API for the given +type_name+ and
|
120
|
+
# returns a Bodhi::Type
|
121
|
+
#
|
122
|
+
# context = BodhiContext.new(valid_params)
|
123
|
+
# type = Bodhi::Type.find(context, "MyTypeName")
|
124
|
+
# type # => #<Bodhi::Type:0x007fbff403e808 @name="MyTypeName">
|
125
|
+
def self.find(context, type_name)
|
126
|
+
if context.invalid?
|
127
|
+
raise context.errors, context.errors.to_a.to_s
|
128
|
+
end
|
129
|
+
|
130
|
+
result = context.connection.get do |request|
|
131
|
+
request.url "/#{context.namespace}/types/#{type_name}"
|
132
|
+
request.headers[context.credentials_header] = context.credentials
|
133
|
+
end
|
134
|
+
|
135
|
+
if result.status != 200
|
136
|
+
raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
|
137
|
+
end
|
138
|
+
|
139
|
+
type = Bodhi::Type.new(result)
|
140
|
+
type.bodhi_context = context
|
141
|
+
type
|
142
|
+
end
|
143
|
+
|
144
|
+
# Queries the Bodhi API for all types within the given +context+ and
|
145
|
+
# returns an array of Bodhi::Type objects
|
57
146
|
#
|
58
147
|
# context = BodhiContext.new(valid_params)
|
59
148
|
# types = Bodhi::Type.find_all(context)
|
@@ -70,10 +159,7 @@ module Bodhi
|
|
70
159
|
end
|
71
160
|
|
72
161
|
if result.status != 200
|
73
|
-
|
74
|
-
errors.each{|error| error['status'] = result.status } if errors.is_a? Array
|
75
|
-
errors["status"] = result.status if errors.is_a? Hash
|
76
|
-
raise errors.to_s
|
162
|
+
raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
|
77
163
|
end
|
78
164
|
|
79
165
|
page += 1
|
@@ -81,7 +167,11 @@ module Bodhi
|
|
81
167
|
all_records << records
|
82
168
|
end while records.size == 100
|
83
169
|
|
84
|
-
all_records.flatten.collect
|
170
|
+
all_records.flatten.collect do |type|
|
171
|
+
record = Bodhi::Type.new(type)
|
172
|
+
record.bodhi_context = context
|
173
|
+
record
|
174
|
+
end
|
85
175
|
end
|
86
176
|
|
87
177
|
# Dynamically defines a new Ruby class for the given +type+
|
@@ -0,0 +1,139 @@
|
|
1
|
+
module Bodhi
|
2
|
+
class User
|
3
|
+
include Bodhi::Validations
|
4
|
+
|
5
|
+
ATTRIBUTES = [:username, :password, :profiles, :email, :firstName, :lastName, :phone]
|
6
|
+
attr_accessor *ATTRIBUTES
|
7
|
+
attr_accessor :bodhi_context
|
8
|
+
|
9
|
+
validates :username, type: "String", required: true, is_not_blank: true
|
10
|
+
validates :password, type: "String", required: true, is_not_blank: true
|
11
|
+
validates :profiles, type: "String", required: true, multi: true
|
12
|
+
validates :email, type: "String", is_email: true
|
13
|
+
validates :firstName, type: "String"
|
14
|
+
validates :lastName, type: "String"
|
15
|
+
validates :phone, type: "String"
|
16
|
+
|
17
|
+
def initialize(params={})
|
18
|
+
# same as symbolize_keys!
|
19
|
+
params = params.reduce({}) do |memo, (k, v)|
|
20
|
+
memo.merge({ k.to_sym => v})
|
21
|
+
end
|
22
|
+
|
23
|
+
# set attributes
|
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
|
92
|
+
|
93
|
+
# Queries the Bodhi API for the given +user_name+ and
|
94
|
+
# returns a Bodhi::User
|
95
|
+
#
|
96
|
+
# context = BodhiContext.new(valid_params)
|
97
|
+
# user = Bodhi::User.find(context, "User1")
|
98
|
+
# user # => #<Bodhi::User:0x007fbff403e808 @username="User1">
|
99
|
+
def self.find(context, user_name)
|
100
|
+
if context.invalid?
|
101
|
+
raise context.errors, context.errors.to_a.to_s
|
102
|
+
end
|
103
|
+
|
104
|
+
result = context.connection.get do |request|
|
105
|
+
request.url "/#{context.namespace}/users/#{user_name}"
|
106
|
+
request.headers[context.credentials_header] = context.credentials
|
107
|
+
end
|
108
|
+
|
109
|
+
if result.status != 200
|
110
|
+
raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
|
111
|
+
end
|
112
|
+
|
113
|
+
user = Bodhi::User.new(result)
|
114
|
+
user.bodhi_context = context
|
115
|
+
user
|
116
|
+
end
|
117
|
+
|
118
|
+
# Queries the Bodhi API for the users account info
|
119
|
+
#
|
120
|
+
# context = BodhiContext.new(valid_params)
|
121
|
+
# user_properties = Bodhi::User.find_me(context)
|
122
|
+
def self.find_me(context)
|
123
|
+
if context.invalid?
|
124
|
+
raise context.errors, context.errors.to_a.to_s
|
125
|
+
end
|
126
|
+
|
127
|
+
result = context.connection.get do |request|
|
128
|
+
request.url "/me"
|
129
|
+
request.headers[context.credentials_header] = context.credentials
|
130
|
+
end
|
131
|
+
|
132
|
+
if result.status != 200
|
133
|
+
raise Bodhi::ApiErrors.new(body: result.body, status: result.status), "status: #{result.status}, body: #{result.body}"
|
134
|
+
end
|
135
|
+
|
136
|
+
result
|
137
|
+
end
|
138
|
+
end
|
139
|
+
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.3.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-07-
|
11
|
+
date: 2015-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-http-persistent
|
@@ -101,6 +101,8 @@ extensions: []
|
|
101
101
|
extra_rdoc_files: []
|
102
102
|
files:
|
103
103
|
- lib/bodhi-slam.rb
|
104
|
+
- lib/bodhi-slam/batches.rb
|
105
|
+
- lib/bodhi-slam/batches/resource.rb
|
104
106
|
- lib/bodhi-slam/context.rb
|
105
107
|
- lib/bodhi-slam/enumerations.rb
|
106
108
|
- lib/bodhi-slam/errors.rb
|
@@ -109,6 +111,7 @@ files:
|
|
109
111
|
- lib/bodhi-slam/factory.rb
|
110
112
|
- lib/bodhi-slam/resource.rb
|
111
113
|
- lib/bodhi-slam/types.rb
|
114
|
+
- lib/bodhi-slam/users.rb
|
112
115
|
- lib/bodhi-slam/validations.rb
|
113
116
|
- lib/bodhi-slam/validators.rb
|
114
117
|
- lib/bodhi-slam/validators/blank.rb
|