bodhi-slam 0.6.1 → 0.7.1
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/associations.rb +157 -0
- data/lib/bodhi-slam/factory.rb +12 -5
- data/lib/bodhi-slam/properties.rb +2 -0
- data/lib/bodhi-slam/queries.rb +10 -14
- data/lib/bodhi-slam/resource.rb +1 -1
- data/lib/bodhi-slam/validators/type.rb +1 -14
- data/lib/bodhi-slam.rb +3 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 142c61ba57d9623f1875dc7ad3ef1802a4c26c55
|
4
|
+
data.tar.gz: 4bc85952eebd17b260acab63647829f44773ec87
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6144923d080241629cf3c137b89094bc5402df06289ec93ebe01ceba94059af8f8dd8e4d3745a4759500f4da9a57f7a2a3a2119c90ca1a65572da89aabe7f869
|
7
|
+
data.tar.gz: 6a71e114c72b1b31bae451a26e1c797cdb70e175c5cb91432c3531fcf69c5ac185aa981ff1cf6b93b0027f8e976e00c9b2dd91689b008d5885438ce229d9e5ad
|
@@ -0,0 +1,157 @@
|
|
1
|
+
module Bodhi
|
2
|
+
module Associations
|
3
|
+
module ClassMethods
|
4
|
+
def associations; @associations; end
|
5
|
+
|
6
|
+
def has_one(association_name, options={})
|
7
|
+
options = Bodhi::Support.symbolize_keys(options)
|
8
|
+
define_association(:has_one, association_name, options)
|
9
|
+
|
10
|
+
# Define a new helper method to get the association
|
11
|
+
define_method(association_name) do
|
12
|
+
association = self.class.associations[association_name.to_sym]
|
13
|
+
query = Bodhi::Query.new(association[:class_name]).from(self.bodhi_context)
|
14
|
+
|
15
|
+
if association[:through]
|
16
|
+
through_query = Bodhi::Query.new(association[:through][:class_name]).from(self.bodhi_context)
|
17
|
+
through_query.where(association[:through][:foreign_key].to_sym => self.send(association[:primary_key]))
|
18
|
+
through_query.select(association[:through][:primary_key])
|
19
|
+
|
20
|
+
puts through_query.url
|
21
|
+
|
22
|
+
instance_id = through_query.first.send(association[:through][:primary_key])
|
23
|
+
query.where(association[:foreign_key].to_sym => instance_id)
|
24
|
+
else
|
25
|
+
instance_id = self.send(association[:primary_key])
|
26
|
+
query.where(association[:foreign_key].to_sym => instance_id)
|
27
|
+
end
|
28
|
+
|
29
|
+
query.and(association[:query])
|
30
|
+
|
31
|
+
puts query.url
|
32
|
+
|
33
|
+
query.first
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def has_many(association_name, options={})
|
38
|
+
options = Bodhi::Support.symbolize_keys(options)
|
39
|
+
define_association(:has_many, association_name, options)
|
40
|
+
|
41
|
+
# Define a new helper method to get the association
|
42
|
+
define_method(association_name) do
|
43
|
+
|
44
|
+
# Get the value from the instance object's source_key. Default is :sys_id
|
45
|
+
association = self.class.associations[association_name.to_sym]
|
46
|
+
query = Bodhi::Query.new(association[:class_name]).from(self.bodhi_context)
|
47
|
+
|
48
|
+
if association[:through]
|
49
|
+
through_query = Bodhi::Query.new(association[:through][:class_name]).from(self.bodhi_context)
|
50
|
+
through_query.where(association[:through][:foreign_key].to_sym => self.send(association[:primary_key]))
|
51
|
+
through_query.select(association[:through][:primary_key])
|
52
|
+
|
53
|
+
puts through_query.url
|
54
|
+
|
55
|
+
method_chain = association[:through][:primary_key].split('.')
|
56
|
+
if method_chain.size == 1
|
57
|
+
instance_ids = through_query.all.map{ |item| item.send(association[:through][:primary_key]) }
|
58
|
+
else
|
59
|
+
instance_ids = through_query.all.map do |item|
|
60
|
+
method_chain.reduce(item){ |memo, method| memo.send(method) }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
query.where(association[:foreign_key].to_sym => { "$in" => instance_ids })
|
65
|
+
else
|
66
|
+
instance_id = self.send(association[:primary_key])
|
67
|
+
if instance_id.is_a?(Array)
|
68
|
+
query.where(association[:foreign_key].to_sym => { "$in" => instance_id })
|
69
|
+
else
|
70
|
+
query.where(association[:foreign_key].to_sym => instance_id)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
query.and(association[:query])
|
75
|
+
puts query.url
|
76
|
+
query.all
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def belongs_to(association_name, options={})
|
81
|
+
options = Bodhi::Support.symbolize_keys(options)
|
82
|
+
define_association(:belongs_to, association_name, options)
|
83
|
+
|
84
|
+
# Define a new helper method to get the association
|
85
|
+
define_method(association_name) do
|
86
|
+
|
87
|
+
# Get the value from the instance object's source_key. Default is :sys_id
|
88
|
+
association = self.class.associations[association_name.to_sym]
|
89
|
+
instance_id = self.send(association[:primary_key])
|
90
|
+
|
91
|
+
# Define & call the query. Returns a single Object or nil
|
92
|
+
query = Bodhi::Query.new(association[:class_name]).from(self.bodhi_context)
|
93
|
+
query.where(association[:foreign_key].to_sym => instance_id)
|
94
|
+
query.and(association[:query])
|
95
|
+
|
96
|
+
puts query.url
|
97
|
+
query.first
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
private
|
102
|
+
def define_association(type, name, options)
|
103
|
+
options.merge!(association_type: type)
|
104
|
+
|
105
|
+
if options[:class_name].nil?
|
106
|
+
options[:class_name] = Bodhi::Support.camelize(name.to_s)
|
107
|
+
end
|
108
|
+
|
109
|
+
if options[:through].is_a?(String)
|
110
|
+
case options[:association_type]
|
111
|
+
when :has_one
|
112
|
+
options[:through] = {
|
113
|
+
class_name: Bodhi::Support.camelize(options[:through]),
|
114
|
+
foreign_key: Bodhi::Support.underscore(self.name)+"_id",
|
115
|
+
primary_key: "sys_id"
|
116
|
+
}
|
117
|
+
options[:foreign_key] = Bodhi::Support.underscore(options[:through][:class_name])+"_id"
|
118
|
+
when :has_many
|
119
|
+
options[:through] = {
|
120
|
+
class_name: Bodhi::Support.camelize(options[:through]),
|
121
|
+
foreign_key: Bodhi::Support.underscore(self.name)+"_id",
|
122
|
+
primary_key: Bodhi::Support.underscore(options[:class_name])+"_id"
|
123
|
+
}
|
124
|
+
options[:foreign_key] = "sys_id"
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
case type
|
129
|
+
when :belongs_to
|
130
|
+
if options[:foreign_key].nil?
|
131
|
+
options[:foreign_key] = "sys_id"
|
132
|
+
end
|
133
|
+
|
134
|
+
if options[:primary_key].nil?
|
135
|
+
options[:primary_key] = Bodhi::Support.underscore(options[:class_name])+"_id"
|
136
|
+
end
|
137
|
+
else
|
138
|
+
if options[:foreign_key].nil?
|
139
|
+
options[:foreign_key] = Bodhi::Support.underscore(self.name)+"_id"
|
140
|
+
end
|
141
|
+
|
142
|
+
if options[:primary_key].nil?
|
143
|
+
options[:primary_key] = "sys_id"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
options[:query].nil? ? options[:query] = Hash.new : options[:query]
|
148
|
+
@associations[name.to_sym] = options
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def self.included(base)
|
153
|
+
base.extend(ClassMethods)
|
154
|
+
base.instance_variable_set(:@associations, Hash.new)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
data/lib/bodhi-slam/factory.rb
CHANGED
@@ -76,8 +76,17 @@ module Bodhi
|
|
76
76
|
# Resource.factory.add_generator("name", type: "String")
|
77
77
|
# Resource.factory.add_generator("test", type: "Integer", multi: true, required: true)
|
78
78
|
def add_generator(name, options)
|
79
|
+
if options.is_a?(Proc)
|
80
|
+
@generators[name.to_sym] = options
|
81
|
+
else
|
82
|
+
@generators[name.to_sym] = build_default_generator(options)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
def build_default_generator(options)
|
79
88
|
options = options.reduce({}) do |memo, (k, v)|
|
80
|
-
memo.merge({ k.to_s
|
89
|
+
memo.merge({ Bodhi::Support.underscore(k.to_s).to_sym => v})
|
81
90
|
end
|
82
91
|
|
83
92
|
case options[:type]
|
@@ -129,9 +138,9 @@ module Bodhi
|
|
129
138
|
|
130
139
|
when "DateTime"
|
131
140
|
if options[:multi]
|
132
|
-
generator = lambda { [*0..5].sample.times.collect{ Time.at(rand * Time.now.to_i)
|
141
|
+
generator = lambda { [*0..5].sample.times.collect{ Time.at(rand * Time.now.to_i) } }
|
133
142
|
else
|
134
|
-
generator = lambda { Time.at(rand * Time.now.to_i)
|
143
|
+
generator = lambda { Time.at(rand * Time.now.to_i) }
|
135
144
|
end
|
136
145
|
|
137
146
|
when "Integer"
|
@@ -230,8 +239,6 @@ module Bodhi
|
|
230
239
|
end
|
231
240
|
end
|
232
241
|
end
|
233
|
-
|
234
|
-
@generators[name.to_sym] = generator
|
235
242
|
end
|
236
243
|
|
237
244
|
end
|
@@ -62,6 +62,8 @@ module Bodhi
|
|
62
62
|
attributes[property] = value.attributes.delete_if { |k, v| v.nil? }
|
63
63
|
elsif value.is_a?(Array) && value.first.respond_to?(:attributes)
|
64
64
|
attributes[property] = value.map(&:attributes).collect{ |item| item.delete_if { |k, v| v.nil? } }
|
65
|
+
elsif value.is_a?(Time)
|
66
|
+
attributes[property] = value.iso8601
|
65
67
|
else
|
66
68
|
attributes[property] = value
|
67
69
|
end
|
data/lib/bodhi-slam/queries.rb
CHANGED
@@ -5,7 +5,7 @@ module Bodhi
|
|
5
5
|
def initialize(klass, controller="resources")
|
6
6
|
@controller = controller
|
7
7
|
@klass = Object.const_get(klass.to_s)
|
8
|
-
@criteria =
|
8
|
+
@criteria = {}
|
9
9
|
@fields = []
|
10
10
|
@paging = {}
|
11
11
|
@sorting = {}
|
@@ -13,7 +13,7 @@ module Bodhi
|
|
13
13
|
|
14
14
|
def clear!
|
15
15
|
@context = nil
|
16
|
-
@criteria
|
16
|
+
@criteria = {}
|
17
17
|
@fields.clear
|
18
18
|
@paging.clear
|
19
19
|
@sorting.clear
|
@@ -31,14 +31,8 @@ module Bodhi
|
|
31
31
|
end
|
32
32
|
params = []
|
33
33
|
|
34
|
-
unless criteria.empty?
|
35
|
-
|
36
|
-
where_string = "{$and:[#{criteria.join(',')}]}"
|
37
|
-
else
|
38
|
-
where_string = criteria.join
|
39
|
-
end
|
40
|
-
|
41
|
-
params << "where=#{where_string}"
|
34
|
+
unless criteria.keys.empty?
|
35
|
+
params << "where=#{criteria.to_json}"
|
42
36
|
end
|
43
37
|
|
44
38
|
unless fields.empty?
|
@@ -150,12 +144,14 @@ module Bodhi
|
|
150
144
|
end
|
151
145
|
|
152
146
|
def where(query)
|
153
|
-
|
154
|
-
|
147
|
+
if query.is_a?(String)
|
148
|
+
json = JSON.parse(query)
|
149
|
+
query = Bodhi::Support.symbolize_keys(json)
|
150
|
+
else
|
151
|
+
query = Bodhi::Support.symbolize_keys(query)
|
155
152
|
end
|
156
153
|
|
157
|
-
@criteria
|
158
|
-
@criteria.uniq!
|
154
|
+
@criteria.merge!(query)
|
159
155
|
self
|
160
156
|
end
|
161
157
|
alias :and :where
|
data/lib/bodhi-slam/resource.rb
CHANGED
@@ -339,7 +339,7 @@ module Bodhi
|
|
339
339
|
|
340
340
|
def self.included(base)
|
341
341
|
base.extend(ClassMethods)
|
342
|
-
base.include(InstanceMethods, Bodhi::
|
342
|
+
base.include(InstanceMethods, Bodhi::Properties, Bodhi::Associations, Bodhi::Validations, Bodhi::Indexes, Bodhi::Factories)
|
343
343
|
base.instance_variable_set(:@embedded, false)
|
344
344
|
end
|
345
345
|
end
|
@@ -28,20 +28,7 @@ module Bodhi
|
|
28
28
|
when "Link"
|
29
29
|
klass = Hash
|
30
30
|
when "DateTime"
|
31
|
-
|
32
|
-
begin
|
33
|
-
DateTime.iso8601(item)
|
34
|
-
rescue
|
35
|
-
false
|
36
|
-
end
|
37
|
-
end
|
38
|
-
array_comparator = lambda do |items|
|
39
|
-
begin
|
40
|
-
items.collect{ |item| DateTime.iso8601(item) }
|
41
|
-
rescue
|
42
|
-
false
|
43
|
-
end
|
44
|
-
end
|
31
|
+
klass = Time
|
45
32
|
when "Object"
|
46
33
|
klass = Hash
|
47
34
|
single_message = "must be a JSON object"
|
data/lib/bodhi-slam.rb
CHANGED
@@ -13,6 +13,7 @@ require 'bodhi-slam/context'
|
|
13
13
|
|
14
14
|
require 'bodhi-slam/properties'
|
15
15
|
require 'bodhi-slam/indexes'
|
16
|
+
require 'bodhi-slam/associations'
|
16
17
|
|
17
18
|
require 'bodhi-slam/batches'
|
18
19
|
require 'bodhi-slam/enumerations'
|
@@ -49,9 +50,9 @@ class BodhiSlam
|
|
49
50
|
enumerations = Bodhi::Enumeration.find_all(context)
|
50
51
|
|
51
52
|
if options[:include].is_a? Array
|
52
|
-
types = Bodhi::Type.where(
|
53
|
+
types = Bodhi::Type.where(name: { "$in" => options[:include].map(&:to_s) }).from(context).all
|
53
54
|
elsif options[:except].is_a? Array
|
54
|
-
types = Bodhi::Type.where(
|
55
|
+
types = Bodhi::Type.where(name: { "$nin" => options[:except].map(&:to_s) }).from(context).all
|
55
56
|
else
|
56
57
|
types = Bodhi::Type.find_all(context)
|
57
58
|
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.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- willdavis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -143,6 +143,7 @@ extensions: []
|
|
143
143
|
extra_rdoc_files: []
|
144
144
|
files:
|
145
145
|
- lib/bodhi-slam.rb
|
146
|
+
- lib/bodhi-slam/associations.rb
|
146
147
|
- lib/bodhi-slam/batches.rb
|
147
148
|
- lib/bodhi-slam/batches/resource.rb
|
148
149
|
- lib/bodhi-slam/context.rb
|