arrest 0.0.19 → 0.0.20
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/arrest.rb +1 -1
- data/lib/arrest/abstract_resource.rb +22 -13
- data/lib/arrest/attributes/attribute.rb +1 -1
- data/lib/arrest/attributes/belongs_to.rb +7 -7
- data/lib/arrest/attributes/has_attributes.rb +35 -15
- data/lib/arrest/attributes/has_many_sub_resource_attribute.rb +7 -0
- data/lib/arrest/handler.rb +18 -2
- data/lib/arrest/helper/has_many_collection.rb +2 -1
- data/lib/arrest/http_source.rb +1 -2
- data/lib/arrest/mem_source.rb +24 -18
- data/lib/arrest/root_resource.rb +9 -9
- data/lib/arrest/source.rb +1 -1
- data/lib/arrest/version.rb +1 -1
- data/test/models.rb +9 -5
- data/test/nested_resource.rb +8 -8
- data/test/unit.rb +66 -46
- metadata +22 -22
data/lib/arrest.rb
CHANGED
@@ -7,10 +7,10 @@ require "arrest/attributes/belongs_to"
|
|
7
7
|
require "arrest/attributes/has_attributes"
|
8
8
|
require "arrest/attributes/attribute"
|
9
9
|
require "arrest/attributes/nested_attribute"
|
10
|
-
require "arrest/attributes/polymorphic_attribute"
|
11
10
|
require "arrest/attributes/belongs_to_attribute"
|
12
11
|
require "arrest/attributes/has_many_attribute"
|
13
12
|
require "arrest/attributes/has_many_sub_resource_attribute"
|
13
|
+
require "arrest/attributes/polymorphic_attribute"
|
14
14
|
require "arrest/attributes/converter"
|
15
15
|
require "arrest/class_utils.rb"
|
16
16
|
require "arrest/string_utils.rb"
|
@@ -20,11 +20,11 @@ module Arrest
|
|
20
20
|
Arrest::Source::source
|
21
21
|
end
|
22
22
|
|
23
|
-
def body_root
|
23
|
+
def body_root(response)
|
24
24
|
if response == nil
|
25
25
|
raise Errors::DocumentNotFoundError
|
26
26
|
end
|
27
|
-
all = JSON.parse
|
27
|
+
all = JSON.parse(response)
|
28
28
|
body = all["result"]
|
29
29
|
if body == nil
|
30
30
|
raise Errors::DocumentNotFoundError
|
@@ -32,11 +32,18 @@ module Arrest
|
|
32
32
|
body
|
33
33
|
end
|
34
34
|
|
35
|
-
def build
|
36
|
-
self.new
|
35
|
+
def build(hash)
|
36
|
+
resource = self.new(hash, true)
|
37
|
+
|
38
|
+
# traverse fields for subresources and fill them in
|
39
|
+
self.all_fields.find_all{|f| f.is_a?(HasManySubResourceAttribute)}.each do |attr|
|
40
|
+
ids = AbstractResource::source.get_one("#{resource.resource_location}/#{attr.sub_resource_field_name}")
|
41
|
+
resource.send("#{attr.name}=", body_root(ids))
|
42
|
+
end
|
43
|
+
resource
|
37
44
|
end
|
38
45
|
|
39
|
-
def custom_resource_name
|
46
|
+
def custom_resource_name(new_name)
|
40
47
|
@custom_resource_name = new_name
|
41
48
|
end
|
42
49
|
|
@@ -64,7 +71,7 @@ module Arrest
|
|
64
71
|
|
65
72
|
url_part = method_name.to_s
|
66
73
|
|
67
|
-
hm_attr = create_has_many_attribute(sub_resource,
|
74
|
+
hm_attr = create_has_many_attribute(sub_resource, # e.g. 'team_ids' attribute for 'has_many :teams'
|
68
75
|
ids_field_name,
|
69
76
|
method_name,
|
70
77
|
clazz_name,
|
@@ -72,7 +79,7 @@ module Arrest
|
|
72
79
|
foreign_key)
|
73
80
|
add_attribute(hm_attr)
|
74
81
|
|
75
|
-
send :define_method, method_name do
|
82
|
+
send :define_method, method_name do # e.g. define 'teams' method for notation 'has_many :teams'
|
76
83
|
if @has_many_collections == nil
|
77
84
|
@has_many_collections = {}
|
78
85
|
end
|
@@ -112,6 +119,7 @@ module Arrest
|
|
112
119
|
clazz_name = clazz.to_s
|
113
120
|
end
|
114
121
|
end
|
122
|
+
|
115
123
|
send :define_method, method_name do
|
116
124
|
if @child_collections == nil
|
117
125
|
@child_collections = {}
|
@@ -130,7 +138,7 @@ module Arrest
|
|
130
138
|
end
|
131
139
|
|
132
140
|
|
133
|
-
def scope
|
141
|
+
def scope(name, &block)
|
134
142
|
if @scopes == nil
|
135
143
|
@scopes = []
|
136
144
|
end
|
@@ -150,8 +158,8 @@ module Arrest
|
|
150
158
|
|
151
159
|
attr_accessor :id
|
152
160
|
|
153
|
-
def initialize
|
154
|
-
initialize_has_attributes
|
161
|
+
def initialize(hash={}, from_json = false)
|
162
|
+
initialize_has_attributes(hash, from_json)
|
155
163
|
end
|
156
164
|
|
157
165
|
def save
|
@@ -160,9 +168,10 @@ module Arrest
|
|
160
168
|
|
161
169
|
success = !!AbstractResource::source.send(req_type, self)
|
162
170
|
|
163
|
-
if success
|
171
|
+
if success
|
172
|
+
# check for sub resources in case of n:m relationships
|
164
173
|
self.class.all_fields.find_all{|f| f.is_a?(HasManySubResourceAttribute)}.each do |attr|
|
165
|
-
ids = self.send(attr.name)
|
174
|
+
ids = self.send(attr.name) # get ids_field e.g. for team has_many :users get 'self.user_ids'
|
166
175
|
srifn = attr.sub_resource_field_name
|
167
176
|
result = !!AbstractResource::source.put_sub_resource(self, srifn, ids)
|
168
177
|
return false if !result
|
@@ -181,7 +190,7 @@ module Arrest
|
|
181
190
|
AbstractResource::source().delete self
|
182
191
|
true
|
183
192
|
end
|
184
|
-
|
193
|
+
|
185
194
|
# convenience method printing curl command
|
186
195
|
def curl
|
187
196
|
hs = ""
|
@@ -16,7 +16,7 @@ module Arrest
|
|
16
16
|
"#{name}_id"
|
17
17
|
end
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
def create_and_add_attribute(field_name, polymorphic, read_only, foreign_key, class_name)
|
21
21
|
if polymorphic
|
22
22
|
add_attribute(PolymorphicAttribute.new(field_name.to_sym, read_only))
|
@@ -24,14 +24,14 @@ module Arrest
|
|
24
24
|
add_attribute(BelongsToAttribute.new(field_name.to_sym, read_only, String, foreign_key, class_name))
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
def belongs_to(*args)
|
29
29
|
arg = args[0]
|
30
30
|
name = arg.to_s.downcase
|
31
31
|
class_name = StringUtils.classify(name)
|
32
32
|
foreign_key = "#{StringUtils.underscore(ClassUtils.simple_name(self))}_id"
|
33
33
|
params = args[1] unless args.length < 2
|
34
|
-
|
34
|
+
|
35
35
|
if params
|
36
36
|
read_only = params[:read_only] == true
|
37
37
|
polymorphic = params[:polymorphic] unless params[:polymorphic] == nil
|
@@ -42,13 +42,13 @@ module Arrest
|
|
42
42
|
field_name = create_field_name(name, params, polymorphic)
|
43
43
|
|
44
44
|
create_and_add_attribute(field_name, polymorphic, read_only, foreign_key, class_name)
|
45
|
-
|
45
|
+
|
46
46
|
send :define_method, name do
|
47
47
|
val = self.send(field_name)
|
48
48
|
if val == nil || val == ""
|
49
49
|
return nil
|
50
|
-
end
|
51
|
-
|
50
|
+
end
|
51
|
+
|
52
52
|
begin
|
53
53
|
if polymorphic
|
54
54
|
Arrest::Source.mod.const_get(polymorphic[val.type.to_sym]).find(val.id)
|
@@ -58,7 +58,7 @@ module Arrest
|
|
58
58
|
rescue Errors::DocumentNotFoundError => e
|
59
59
|
raise Errors::DocumentNotFoundError, "Couldnt find a #{class_name} with id #{val}"
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
end
|
63
63
|
end
|
64
64
|
end
|
@@ -3,22 +3,22 @@ module Arrest
|
|
3
3
|
module HasAttributes
|
4
4
|
attr_accessor :attribute_values
|
5
5
|
|
6
|
-
def initialize_has_attributes
|
6
|
+
def initialize_has_attributes(hash, from_json = false, &blk)
|
7
7
|
if block_given?
|
8
8
|
@stubbed = true
|
9
9
|
@load_blk = blk
|
10
10
|
else
|
11
11
|
@stubbed = false
|
12
12
|
end
|
13
|
-
init_from_hash
|
13
|
+
init_from_hash(hash, from_json)
|
14
14
|
end
|
15
15
|
|
16
|
-
def initialize
|
16
|
+
def initialize(hash = {}, from_json = false, &blk)
|
17
17
|
if block_given?
|
18
18
|
@stubbed = true
|
19
19
|
@load_blk = blk
|
20
20
|
else
|
21
|
-
init_from_hash
|
21
|
+
init_from_hash(hash, from_json)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -26,7 +26,7 @@ module Arrest
|
|
26
26
|
base.extend HasAttributesMethods
|
27
27
|
end
|
28
28
|
|
29
|
-
def init_from_hash
|
29
|
+
def init_from_hash(as_i={}, from_json = false)
|
30
30
|
@attribute_values = {} unless @attribute_values != nil
|
31
31
|
as = {}
|
32
32
|
as_i.each_pair do |k,v|
|
@@ -38,12 +38,26 @@ module Arrest
|
|
38
38
|
else
|
39
39
|
key = field.name
|
40
40
|
end
|
41
|
-
value = as[key]
|
41
|
+
value = as[key]
|
42
42
|
converted = field.from_hash(value)
|
43
43
|
self.send(field.name.to_s + '=', converted) unless converted == nil
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
+
def update_attributes attribute_hash
|
48
|
+
fields = self.class.all_fields
|
49
|
+
field_names = fields.map(&:name)
|
50
|
+
attribute_hash.each_pair do |k,v|
|
51
|
+
matching_fields = fields.find_all{|f| f.name.to_s == k.to_s}
|
52
|
+
field = matching_fields.first
|
53
|
+
if field
|
54
|
+
converted = field.from_hash(v)
|
55
|
+
self.send("#{k}=", converted)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
self.save
|
59
|
+
end
|
60
|
+
|
47
61
|
def load_from_stub
|
48
62
|
@load_blk.call
|
49
63
|
@stubbed = false
|
@@ -79,7 +93,7 @@ module Arrest
|
|
79
93
|
@fields = []
|
80
94
|
end
|
81
95
|
|
82
|
-
def attribute
|
96
|
+
def attribute(name, clazz, attribs = {})
|
83
97
|
read_only = !!attribs[:read_only]
|
84
98
|
add_attribute Attribute.new(name, read_only, clazz)
|
85
99
|
end
|
@@ -90,16 +104,22 @@ module Arrest
|
|
90
104
|
end
|
91
105
|
end
|
92
106
|
|
93
|
-
def add_attribute
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
107
|
+
def add_attribute(attribute)
|
108
|
+
@fields ||= []
|
109
|
+
if (attribute.is_a?(HasManySubResourceAttribute))
|
110
|
+
send :define_method, "#{attribute.name}=" do |v|
|
111
|
+
raise ArgumentError, 'Argument is not of Array type' unless v.is_a?(Array)
|
112
|
+
Arrest::debug "setter #{self.class.name} #{attribute.name} = #{v}"
|
113
|
+
self.attribute_values[attribute.name] = v
|
114
|
+
end
|
115
|
+
else
|
116
|
+
send :define_method, "#{attribute.name}=" do |v|
|
117
|
+
Arrest::debug "setter #{self.class.name} #{attribute.name} = #{v}"
|
118
|
+
self.attribute_values[attribute.name] = v
|
119
|
+
end
|
100
120
|
end
|
101
121
|
send :define_method, "#{attribute.name}" do
|
102
|
-
Arrest::debug "getter #{self.class.name} #{attribute.name}"
|
122
|
+
Arrest::debug "getter #{self.class.name} #{attribute.name}"
|
103
123
|
self.load_from_stub if @stubbed
|
104
124
|
self.attribute_values[attribute.name]
|
105
125
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module Arrest
|
2
2
|
class HasManySubResourceAttribute < HasManyAttribute
|
3
|
+
alias :super_from_hash :from_hash
|
4
|
+
|
3
5
|
def initialize(ids_field_name,
|
4
6
|
method_name,
|
5
7
|
clazz_name,
|
@@ -13,5 +15,10 @@ module Arrest
|
|
13
15
|
def sub_resource_field_name
|
14
16
|
@name
|
15
17
|
end
|
18
|
+
|
19
|
+
def from_hash(value)
|
20
|
+
return [] if value == nil
|
21
|
+
super_from_hash(value)
|
22
|
+
end
|
16
23
|
end
|
17
24
|
end
|
data/lib/arrest/handler.rb
CHANGED
@@ -7,7 +7,7 @@ module Arrest
|
|
7
7
|
CallLog = Struct.new(:request, :response)
|
8
8
|
|
9
9
|
# The classes in this module supply default behaviour
|
10
|
-
# for certain processing steps in the
|
10
|
+
# for certain processing steps in the consumption ot the
|
11
11
|
# rest api
|
12
12
|
module Handlers
|
13
13
|
|
@@ -21,7 +21,23 @@ module Arrest
|
|
21
21
|
|
22
22
|
# a converter to transform between the name of the field in
|
23
23
|
# the json object and the name of the field in ruby code.
|
24
|
-
# Default behaviour is
|
24
|
+
# Default behaviour is the identity, i.e. the very same string in
|
25
|
+
# JSON as in RUBY
|
26
|
+
class IdentityJSONKeyConverter
|
27
|
+
class << self
|
28
|
+
def key_from_json name
|
29
|
+
name.to_s
|
30
|
+
end
|
31
|
+
|
32
|
+
def key_to_json name
|
33
|
+
name.to_s
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# a converter to transform between the name of the field in
|
39
|
+
# the json object and the name of the field in ruby code.
|
40
|
+
# Special behaviour is that for an underscored name in ruby
|
25
41
|
# a camel cased version in json expected:
|
26
42
|
# ruby -> json
|
27
43
|
# started_at startedAt
|
@@ -1,12 +1,13 @@
|
|
1
1
|
module Arrest
|
2
2
|
class HasManyCollection #< BasicObject
|
3
|
-
def initialize
|
3
|
+
def initialize(parent, has_many_attribute)
|
4
4
|
@parent = parent
|
5
5
|
@clazz_name = (StringUtils.classify(has_many_attribute.clazz_name.to_s))
|
6
6
|
@url_part = has_many_attribute.url_part
|
7
7
|
@children = nil
|
8
8
|
@foreign_key_name = (StringUtils.underscore(@parent.class.name).gsub(/^.*\//, '') + '_id').to_sym
|
9
9
|
define_filters
|
10
|
+
@attribute = has_many_attribute
|
10
11
|
end
|
11
12
|
|
12
13
|
def build attributes = {}
|
data/lib/arrest/http_source.rb
CHANGED
@@ -70,8 +70,7 @@ module Arrest
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def put_sub_resource(rest_resource, sub_url, ids)
|
73
|
-
location = rest_resource.resource_location
|
74
|
-
#body = {sub_url => ids}.to_json
|
73
|
+
location = "#{rest_resource.resource_location}/#{sub_url}"
|
75
74
|
body = ids.to_json
|
76
75
|
|
77
76
|
internal_put(rest_resource, location, body)
|
data/lib/arrest/mem_source.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
module Arrest
|
2
|
-
|
2
|
+
|
3
3
|
Edge = Struct.new(:foreign_key, :name, :id, :tail)
|
4
|
-
|
4
|
+
|
5
5
|
class MemSource
|
6
6
|
|
7
7
|
attr_accessor :data
|
8
|
-
|
8
|
+
|
9
9
|
|
10
10
|
@@all_objects = {} # holds all objects of all types,
|
11
11
|
# each having a unique id
|
12
12
|
|
13
13
|
@@collections = {} # maps urls to collections of ids of objects
|
14
|
-
|
15
|
-
# For every has_many relation
|
14
|
+
|
15
|
+
# For every has_many relation
|
16
16
|
@@edge_matrix = {} # matrix of edges based on node ids for has_many and belongs_to relations
|
17
|
-
|
17
|
+
|
18
18
|
@@data = {}
|
19
19
|
|
20
20
|
def objects
|
@@ -32,7 +32,7 @@ module Arrest
|
|
32
32
|
def edge_matrix
|
33
33
|
@@edge_matrix
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
def edge_count
|
37
37
|
@@edge_matrix.values.inject(0){|sum, edges| sum + edges.length }
|
38
38
|
end
|
@@ -40,7 +40,7 @@ module Arrest
|
|
40
40
|
def node_count
|
41
41
|
@@edge_matrix.length
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
def initialize
|
45
45
|
@@all_objects = {} # holds all objects of all types,
|
46
46
|
|
@@ -100,7 +100,7 @@ module Arrest
|
|
100
100
|
def get_many(sub, filters = {})
|
101
101
|
Arrest::debug sub + (hash_to_query filters)
|
102
102
|
# filters are ignored by mem impl so far
|
103
|
-
|
103
|
+
|
104
104
|
id_list = parse_for_has_many_relations(sub)
|
105
105
|
if id_list.empty?
|
106
106
|
id_list = @@collections[sub] || []
|
@@ -126,7 +126,7 @@ module Arrest
|
|
126
126
|
end
|
127
127
|
wrap val.to_jhash.to_json, 1
|
128
128
|
end
|
129
|
-
|
129
|
+
|
130
130
|
def delete_all resource_path
|
131
131
|
id_list = Array.new(@@collections[resource_path] || [])
|
132
132
|
id_list.each do |base_id|
|
@@ -137,7 +137,7 @@ module Arrest
|
|
137
137
|
remove_edges(@@edge_matrix, base_id)
|
138
138
|
end
|
139
139
|
end
|
140
|
-
|
140
|
+
|
141
141
|
def collection_json values
|
142
142
|
single_jsons = values.map do |v|
|
143
143
|
v.to_jhash.to_json
|
@@ -173,12 +173,12 @@ module Arrest
|
|
173
173
|
out_edges = edge_matrix[id].find_all{|edge| edge.tail}
|
174
174
|
in_edges_to_delete = out_edges.map do |out_edge|
|
175
175
|
foreign_edges = edge_matrix[out_edge.id] # the edge set of the foreign node that this node points to
|
176
|
-
has_many_back_edges = foreign_edges.find_all do |for_edge|
|
176
|
+
has_many_back_edges = foreign_edges.find_all do |for_edge|
|
177
177
|
for_edge.id == id && for_edge.foreign_key == out_edge.foreign_key
|
178
178
|
end
|
179
179
|
[has_many_back_edges.first, out_edge.id] # first element may be nil
|
180
180
|
end
|
181
|
-
|
181
|
+
|
182
182
|
in_edges_to_delete.each do |tupel|
|
183
183
|
if tupel[0]
|
184
184
|
edge_matrix[tupel[1]].delete_if{|e| e.id == tupel[0].id && e.foreign_key == tupel[0].foreign_key}
|
@@ -200,7 +200,7 @@ module Arrest
|
|
200
200
|
|
201
201
|
def identify_and_store_edges(edge_matrix, rest_resource)
|
202
202
|
from_id = rest_resource.id
|
203
|
-
|
203
|
+
|
204
204
|
rest_resource.class.all_fields.each do |attr|
|
205
205
|
if attr.is_a?(Arrest::HasManyAttribute)
|
206
206
|
to_ids = rest_resource.send(attr.name) # -> foo_ids
|
@@ -225,7 +225,7 @@ module Arrest
|
|
225
225
|
return if hm_candidates.empty?
|
226
226
|
has_many_node = hm_candidates.first
|
227
227
|
url_part = has_many_node.url_part
|
228
|
-
|
228
|
+
|
229
229
|
edge_matrix[from_id] ||= Set.new()
|
230
230
|
edge_matrix[from_id].add(Edge.new(foreign_key, url_part, to_id, true))
|
231
231
|
edge_matrix[to_id] ||= Set.new()
|
@@ -235,13 +235,18 @@ module Arrest
|
|
235
235
|
end
|
236
236
|
end
|
237
237
|
|
238
|
+
def put_sub_resource(rest_resource, sub_url, ids)
|
239
|
+
location = "#{rest_resource.resource_location}/#{sub_url}"
|
240
|
+
body = ids.to_json
|
241
|
+
@@collections[location] = body
|
242
|
+
end
|
238
243
|
|
239
244
|
def put(rest_resource)
|
240
245
|
raise "To change an object it must have an id" unless rest_resource.respond_to?(:id) && rest_resource.id != nil
|
241
246
|
old = @@all_objects[rest_resource.id]
|
242
|
-
|
247
|
+
|
243
248
|
remove_outgoing_edges(@@edge_matrix, old.id)
|
244
|
-
|
249
|
+
|
245
250
|
rest_resource.class.all_fields.each do |f|
|
246
251
|
old.send("#{f.name}=", rest_resource.send(f.name))
|
247
252
|
end
|
@@ -252,8 +257,9 @@ module Arrest
|
|
252
257
|
end
|
253
258
|
|
254
259
|
|
260
|
+
|
255
261
|
def post(rest_resource)
|
256
|
-
|
262
|
+
|
257
263
|
Arrest::debug "post -> #{rest_resource.class.name} #{rest_resource.to_hash} #{rest_resource.class.all_fields.map(&:name)}"
|
258
264
|
raise "new object must have setter for id" unless rest_resource.respond_to?(:id=)
|
259
265
|
raise "new object must not have id" if rest_resource.respond_to?(:id) && rest_resource.id != nil
|
data/lib/arrest/root_resource.rb
CHANGED
@@ -7,7 +7,7 @@ module Arrest
|
|
7
7
|
"#{self.resource_name}"
|
8
8
|
end
|
9
9
|
|
10
|
-
def by_url
|
10
|
+
def by_url(url)
|
11
11
|
begin
|
12
12
|
body = body_root(source().get_many(url))
|
13
13
|
rescue Arrest::Errors::DocumentNotFoundError
|
@@ -20,9 +20,9 @@ module Arrest
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
def all
|
23
|
+
def all(filter={})
|
24
24
|
begin
|
25
|
-
body = body_root(source().get_many
|
25
|
+
body = body_root(source().get_many(self.resource_path, filter))
|
26
26
|
rescue Arrest::Errors::DocumentNotFoundError
|
27
27
|
Arrest::logger.info "DocumentNotFoundError for #{self.resource_path} gracefully returning []"
|
28
28
|
return []
|
@@ -40,10 +40,10 @@ module Arrest
|
|
40
40
|
Arrest::logger.info "DocumentNotFoundError for #{self.resource_path}"
|
41
41
|
raise Errors::DocumentNotFoundError.new
|
42
42
|
end
|
43
|
-
self.build
|
43
|
+
self.build(body)
|
44
44
|
end
|
45
45
|
|
46
|
-
def find
|
46
|
+
def find(id)
|
47
47
|
if id == nil || "" == id
|
48
48
|
Arrest::logger.info "DocumentNotFoundError: no id given"
|
49
49
|
raise Errors::DocumentNotFoundError.new
|
@@ -97,7 +97,7 @@ module Arrest
|
|
97
97
|
super(name)
|
98
98
|
if block_given?
|
99
99
|
send :define_singleton_method, name do
|
100
|
-
self.all.select &block
|
100
|
+
self.all.select &block
|
101
101
|
end
|
102
102
|
else
|
103
103
|
send :define_singleton_method, name do
|
@@ -122,8 +122,8 @@ module Arrest
|
|
122
122
|
end
|
123
123
|
n
|
124
124
|
end
|
125
|
-
|
126
|
-
|
125
|
+
|
126
|
+
|
127
127
|
def delete_all
|
128
128
|
source().delete_all(self.resource_path)
|
129
129
|
end
|
@@ -134,7 +134,7 @@ module Arrest
|
|
134
134
|
end
|
135
135
|
|
136
136
|
def resource_location
|
137
|
-
self.class.resource_path + '/' + self.id.to_s
|
137
|
+
self.class.resource_path + '/' + self.id.to_s
|
138
138
|
end
|
139
139
|
|
140
140
|
end
|
data/lib/arrest/source.rb
CHANGED
@@ -53,7 +53,7 @@ module Arrest
|
|
53
53
|
Source.mod = nil
|
54
54
|
Source.header_decorator = Handlers::HeaderDecorator
|
55
55
|
Source.debug = false
|
56
|
-
Source.json_key_converter = Handlers::
|
56
|
+
Source.json_key_converter = Handlers::IdentityJSONKeyConverter
|
57
57
|
Source.error_handler = Handlers::ErrorHandler
|
58
58
|
Source.call_logger = Handlers::CallLogger
|
59
59
|
Source.skip_validations = false
|
data/lib/arrest/version.rb
CHANGED
data/test/models.rb
CHANGED
@@ -18,7 +18,7 @@ class Animal < Arrest::RestChild
|
|
18
18
|
attribute :kind, String
|
19
19
|
attribute :age, Integer
|
20
20
|
attribute :male, Boolean
|
21
|
-
|
21
|
+
|
22
22
|
parent :zoo
|
23
23
|
|
24
24
|
scope :server_males_only
|
@@ -34,7 +34,7 @@ end
|
|
34
34
|
class SpecialZoo < Zoo
|
35
35
|
custom_resource_name :zoo3000
|
36
36
|
read_only_attributes({ :ro2 => String})
|
37
|
-
attributes({
|
37
|
+
attributes({
|
38
38
|
:is_magic => Boolean,
|
39
39
|
:opened_at => Time
|
40
40
|
})
|
@@ -113,8 +113,8 @@ class Comment < Arrest::RootResource
|
|
113
113
|
:comb => "CommentableB" }
|
114
114
|
end
|
115
115
|
class ExtendedComment < Comment
|
116
|
-
belongs_to :other_commentable,
|
117
|
-
:field_name => "special_commentable_ref",
|
116
|
+
belongs_to :other_commentable,
|
117
|
+
:field_name => "special_commentable_ref",
|
118
118
|
:polymorphic => { :comc => :CommentableC }
|
119
119
|
end
|
120
120
|
|
@@ -122,7 +122,7 @@ class DeleteMeAll < Arrest::RootResource
|
|
122
122
|
end
|
123
123
|
|
124
124
|
class Foo < Arrest::RootResource
|
125
|
-
has_many :bars#, :class_name => :Bar, :foreign_key => defaults to bar_id
|
125
|
+
has_many :bars#, :class_name => :Bar, :foreign_key => defaults to bar_id
|
126
126
|
has_many :other_bars, :class_name => :Bar, :foreign_key => :common_key
|
127
127
|
end
|
128
128
|
class Bar < Arrest::RootResource
|
@@ -130,3 +130,7 @@ class Bar < Arrest::RootResource
|
|
130
130
|
belongs_to :foo# foreign key defaults to class name, {:foreign_key => bar_id}
|
131
131
|
belongs_to :other_foo, {:class_name => Foo, :foreign_key => :common_key}#, :foreign_key => :other_foo_key
|
132
132
|
end
|
133
|
+
|
134
|
+
class BarWithHasManySubResource < Arrest::RootResource
|
135
|
+
has_many :foos, :sub_resource => true
|
136
|
+
end
|
data/test/nested_resource.rb
CHANGED
@@ -18,7 +18,7 @@ class NestedResourcesTest < Test::Unit::TestCase
|
|
18
18
|
input = {
|
19
19
|
:parent_name => 'parent',
|
20
20
|
:bool => false,
|
21
|
-
:nested_object => {
|
21
|
+
:nested_object => {
|
22
22
|
:name => 'iamnested',
|
23
23
|
:underscore_name => 'foo',
|
24
24
|
:bool => true
|
@@ -37,7 +37,7 @@ class NestedResourcesTest < Test::Unit::TestCase
|
|
37
37
|
input = {
|
38
38
|
:parent_name => 'parent',
|
39
39
|
:bool => false,
|
40
|
-
:nested_object => {
|
40
|
+
:nested_object => {
|
41
41
|
:name => 'iamnested',
|
42
42
|
:underscore_name => 'foo',
|
43
43
|
:bool => true
|
@@ -55,13 +55,13 @@ class NestedResourcesTest < Test::Unit::TestCase
|
|
55
55
|
:parent_name => 'parent',
|
56
56
|
:bool => false,
|
57
57
|
:nested_objects => [
|
58
|
-
{
|
58
|
+
{
|
59
59
|
:name => 'iamnested_one',
|
60
60
|
:bool => true
|
61
|
-
},{
|
61
|
+
},{
|
62
62
|
:name => 'iamnested_two',
|
63
63
|
:bool => false
|
64
|
-
}
|
64
|
+
}
|
65
65
|
]
|
66
66
|
}
|
67
67
|
|
@@ -71,14 +71,14 @@ class NestedResourcesTest < Test::Unit::TestCase
|
|
71
71
|
|
72
72
|
end
|
73
73
|
|
74
|
-
def
|
74
|
+
def test_belongs_to_to_hash
|
75
75
|
new_zoo = Zoo.new({:name => "Foo"})
|
76
76
|
new_zoo.save
|
77
77
|
|
78
78
|
input = {
|
79
79
|
:parent_name => 'parent',
|
80
80
|
:bool => false,
|
81
|
-
:nested_object => {
|
81
|
+
:nested_object => {
|
82
82
|
:name => 'iamnested',
|
83
83
|
:bool => true,
|
84
84
|
:zoo_id => new_zoo.id
|
@@ -105,7 +105,7 @@ class NestedResourcesTest < Test::Unit::TestCase
|
|
105
105
|
assert_not_nil c.id, "Persisted object should have id"
|
106
106
|
assert_equal "Foo", c.zoo_thing.name
|
107
107
|
assert_equal "Foo", c.zoo.name
|
108
|
-
|
108
|
+
|
109
109
|
|
110
110
|
assert_not_nil c.id, "Persisted zoo should have id"
|
111
111
|
c_reloaded = CustomNamedBelongsTo.all.first
|
data/test/unit.rb
CHANGED
@@ -22,7 +22,7 @@ class FirstTest < Test::Unit::TestCase
|
|
22
22
|
#assert_not_empty Arrest::RootResource.all_fields.select {|f| f.name == :id}, "RootResource should inherit id from AbstractResource"
|
23
23
|
#assert_not_empty Zoo.all_fields.select {|f| f.name == :id}, "Zoo should inherit id field from RootResource"
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
def test_create
|
27
27
|
zoo_count_before = Zoo.all.length
|
28
28
|
new_zoo = Zoo.new({:name => "Foo"})
|
@@ -85,7 +85,7 @@ class FirstTest < Test::Unit::TestCase
|
|
85
85
|
|
86
86
|
zoo_reloaded = Zoo.find(new_zoo.id)
|
87
87
|
assert_equal new_zoo.name, zoo_reloaded.name
|
88
|
-
|
88
|
+
|
89
89
|
zoo_reloaded.delete
|
90
90
|
assert_equal zoo_count_before, Zoo.all.length
|
91
91
|
end
|
@@ -115,7 +115,7 @@ class FirstTest < Test::Unit::TestCase
|
|
115
115
|
|
116
116
|
assert_equal new_zoo_name, zoo_reloaded.name
|
117
117
|
end
|
118
|
-
|
118
|
+
|
119
119
|
def test_child
|
120
120
|
new_zoo = Zoo.new({:name => "Foo"})
|
121
121
|
new_zoo.save
|
@@ -139,7 +139,7 @@ class FirstTest < Test::Unit::TestCase
|
|
139
139
|
assert_equal 1, zoo_reloaded.animals.length
|
140
140
|
assert_equal Animal, zoo_reloaded.animals.first.class
|
141
141
|
assert_equal 42, zoo_reloaded.animals.first.age
|
142
|
-
|
142
|
+
|
143
143
|
animal_reloaded = zoo_reloaded.animals.first
|
144
144
|
|
145
145
|
assert_equal new_zoo.id, animal_reloaded.zoo.id
|
@@ -203,18 +203,18 @@ class FirstTest < Test::Unit::TestCase
|
|
203
203
|
def test_read_only_attributes
|
204
204
|
now = Time.now
|
205
205
|
zoo = SpecialZoo.new({
|
206
|
-
:name => "Zoo",
|
207
|
-
:ro1 => "one",
|
208
|
-
:ro2 => "two",
|
206
|
+
:name => "Zoo",
|
207
|
+
:ro1 => "one",
|
208
|
+
:ro2 => "two",
|
209
209
|
:is_magic => true,
|
210
210
|
:opened_at => now
|
211
211
|
})
|
212
|
-
|
212
|
+
|
213
213
|
assert_equal "Zoo", zoo.name
|
214
214
|
assert_equal "one", zoo.ro1
|
215
215
|
assert_equal "two", zoo.ro2
|
216
216
|
assert_equal true, zoo.is_magic
|
217
|
-
|
217
|
+
|
218
218
|
hash = zoo.to_jhash
|
219
219
|
|
220
220
|
assert_nil hash[:ro1]
|
@@ -227,7 +227,7 @@ class FirstTest < Test::Unit::TestCase
|
|
227
227
|
def test_stub_delayed_load
|
228
228
|
new_zoo = Zoo.new({:name => "Foo"})
|
229
229
|
new_zoo.save
|
230
|
-
|
230
|
+
|
231
231
|
assert_not_nil new_zoo.id
|
232
232
|
|
233
233
|
stubbed = Zoo.stub(new_zoo.id)
|
@@ -241,14 +241,14 @@ class FirstTest < Test::Unit::TestCase
|
|
241
241
|
def test_stub_not_load_for_child_access
|
242
242
|
new_zoo = Zoo.new({:name => "Foo"})
|
243
243
|
new_zoo.save
|
244
|
-
|
244
|
+
|
245
245
|
assert_not_nil new_zoo.id
|
246
246
|
# this is where the magic hapens
|
247
247
|
stubbed = Zoo.stub(new_zoo.id)
|
248
248
|
|
249
249
|
new_animal = Animal.new new_zoo, {:kind => "foo", :age => 42}
|
250
250
|
new_animal.save
|
251
|
-
|
251
|
+
|
252
252
|
assert stubbed.stubbed?, "Zoo should be a stub, so not loaded yet"
|
253
253
|
|
254
254
|
animals = stubbed.animals
|
@@ -265,11 +265,11 @@ class FirstTest < Test::Unit::TestCase
|
|
265
265
|
def test_root_scope
|
266
266
|
assert_not_nil Zoo.server_scope
|
267
267
|
end
|
268
|
-
|
268
|
+
|
269
269
|
def test_child_scope
|
270
270
|
new_zoo = Zoo.new({:name => "Foo"})
|
271
271
|
new_zoo.save
|
272
|
-
|
272
|
+
|
273
273
|
assert_not_nil new_zoo.id
|
274
274
|
|
275
275
|
assert_not_nil new_zoo.animals.server_males_only
|
@@ -319,9 +319,9 @@ class FirstTest < Test::Unit::TestCase
|
|
319
319
|
p1 = ParentFilter.new({:afield => "ParentFoo"})
|
320
320
|
p1.save
|
321
321
|
|
322
|
-
c1 = ChildFilter.new(p1, :bfield => "Foo")
|
322
|
+
c1 = ChildFilter.new(p1, :bfield => "Foo")
|
323
323
|
c1.save
|
324
|
-
c2 = ChildFilter.new(p1, :bfield => "Bar")
|
324
|
+
c2 = ChildFilter.new(p1, :bfield => "Bar")
|
325
325
|
c2.save
|
326
326
|
|
327
327
|
reloaded_parent = ParentFilter.find(p1.id)
|
@@ -398,55 +398,55 @@ class FirstTest < Test::Unit::TestCase
|
|
398
398
|
t = TimeClass.new(:time => now)
|
399
399
|
assert_equal expected, t.to_jhash[:time], "This is the expected default format"
|
400
400
|
end
|
401
|
-
|
401
|
+
|
402
402
|
def test_polymorphic_belongs_to
|
403
403
|
coma = CommentableA.new()
|
404
404
|
coma.save
|
405
405
|
comb = CommentableB.new()
|
406
406
|
comb.save
|
407
|
-
|
407
|
+
|
408
408
|
c = Comment.new(:commentable_ref => { :id => coma.id, :type => "coma"})
|
409
409
|
result = c.commentable
|
410
410
|
assert_equal coma.id, c.commentable_ref.id
|
411
411
|
assert_equal result.class, CommentableA
|
412
|
-
|
412
|
+
|
413
413
|
c2 = Comment.new(:commentable_ref => { :id => comb.id, :type => "comb"})
|
414
414
|
result2 = c2.commentable
|
415
415
|
assert_equal comb.id, c2.commentable_ref.id
|
416
416
|
assert_equal result2.class, CommentableB
|
417
417
|
end
|
418
|
-
|
418
|
+
|
419
419
|
def test_polymorphic_belongs_to_extended
|
420
420
|
coma = CommentableA.new()
|
421
421
|
coma.save
|
422
422
|
comc = CommentableC.new()
|
423
423
|
comc.save
|
424
|
-
|
425
|
-
c = ExtendedComment.new({ :special_commentable_ref => { :id => comc.id, :type => "comc"},
|
424
|
+
|
425
|
+
c = ExtendedComment.new({ :special_commentable_ref => { :id => comc.id, :type => "comc"},
|
426
426
|
:commentable_ref => { :id => coma.id, :type => "coma" }})
|
427
427
|
assert_equal c.commentable.class, CommentableA
|
428
428
|
assert_equal c.other_commentable.class, CommentableC
|
429
|
-
|
429
|
+
|
430
430
|
c.save
|
431
431
|
c_reloaded = ExtendedComment.find(c.id)
|
432
432
|
assert_equal comc.id, c_reloaded.special_commentable_ref.id
|
433
433
|
assert_equal CommentableC, c_reloaded.other_commentable.class
|
434
434
|
assert_equal CommentableA, c_reloaded.commentable.class
|
435
435
|
end
|
436
|
-
|
436
|
+
|
437
437
|
def test_delete_all_root_resources
|
438
438
|
d1 = DeleteMeAll.new()
|
439
439
|
d1.save
|
440
440
|
d2 = DeleteMeAll.new()
|
441
441
|
d2.save
|
442
|
-
|
442
|
+
|
443
443
|
d1_rel = DeleteMeAll.find(d1.id)
|
444
444
|
assert_not_nil d1_rel
|
445
445
|
d2_rel = DeleteMeAll.find(d2.id)
|
446
446
|
assert_not_nil d2_rel
|
447
447
|
all = DeleteMeAll.all
|
448
448
|
assert_equal 2, all.length
|
449
|
-
|
449
|
+
|
450
450
|
DeleteMeAll.delete_all
|
451
451
|
all = DeleteMeAll.all
|
452
452
|
assert_equal [], all
|
@@ -460,7 +460,7 @@ class FirstTest < Test::Unit::TestCase
|
|
460
460
|
b1.save
|
461
461
|
assert_equal 2, Arrest::Source.source.edge_count
|
462
462
|
assert_equal 2, Arrest::Source.source.node_count
|
463
|
-
|
463
|
+
|
464
464
|
f2 = Foo.new()
|
465
465
|
f2.save
|
466
466
|
assert_equal 2, Arrest::Source.source.edge_count
|
@@ -470,7 +470,7 @@ class FirstTest < Test::Unit::TestCase
|
|
470
470
|
assert_equal 2, Arrest::Source.source.edge_count
|
471
471
|
assert_equal 3, Arrest::Source.source.node_count
|
472
472
|
end
|
473
|
-
|
473
|
+
|
474
474
|
def test_has_many_matrix_in_mem_source
|
475
475
|
f1 = Foo.new()
|
476
476
|
f1.save
|
@@ -481,33 +481,33 @@ class FirstTest < Test::Unit::TestCase
|
|
481
481
|
|
482
482
|
b1 = Bar.new({:foo_ids => [f1.id, f2.id], :foo_id => f3.id})
|
483
483
|
b1.save
|
484
|
-
|
484
|
+
|
485
485
|
assert_equal 2, b1.foos.length
|
486
|
-
|
486
|
+
|
487
487
|
b2 = Bar.new({:foo_ids => [f2.id, f3.id], :foo_id =>f1.id})
|
488
488
|
b2.save
|
489
|
-
|
489
|
+
|
490
490
|
f1.delete
|
491
|
-
|
491
|
+
|
492
492
|
b1_rel = Bar.find(b1.id)
|
493
493
|
assert_equal 1, b1_rel.foos.length
|
494
494
|
assert_equal f2.id, b1_rel.foos.first.id
|
495
|
-
|
496
|
-
|
495
|
+
|
496
|
+
|
497
497
|
f2.bar_ids=[b1.id]
|
498
498
|
f2.other_bar_ids=[b2.id]
|
499
499
|
f2.save
|
500
500
|
f2_rel = Foo.find(f2.id)
|
501
501
|
assert_equal 1, f2_rel.bars.length
|
502
502
|
assert_equal 1, f2_rel.other_bars.length
|
503
|
-
|
503
|
+
|
504
504
|
b2.delete
|
505
|
-
|
505
|
+
|
506
506
|
f2_rel = Foo.find(f2.id)
|
507
507
|
assert_equal 1, f2_rel.bars.length
|
508
508
|
assert_equal 0, f2_rel.other_bars.length
|
509
509
|
assert_equal b1.id, f2_rel.bars.first.id
|
510
|
-
|
510
|
+
|
511
511
|
end
|
512
512
|
|
513
513
|
def test_has_many_with_belongs_to
|
@@ -522,24 +522,23 @@ class FirstTest < Test::Unit::TestCase
|
|
522
522
|
b1.save
|
523
523
|
b2 = Bar.new({:other_foo_id => f2.id, :foo_id => f1.id})
|
524
524
|
b2.save
|
525
|
-
|
525
|
+
|
526
526
|
f1_rel = Foo.find(f1.id)
|
527
527
|
f2_rel = Foo.find(f2.id)
|
528
528
|
f3_rel = Foo.find(f3.id)
|
529
|
-
|
529
|
+
|
530
530
|
assert_equal 1, f1_rel.bars.length
|
531
531
|
assert_equal b1.id, f1_rel.other_bars.first.id
|
532
532
|
assert_equal b1.id, f3_rel.bars.first.id
|
533
533
|
|
534
534
|
assert_equal b2.id, f1_rel.bars.first.id
|
535
535
|
assert_equal b2.id, f2_rel.other_bars.first.id
|
536
|
-
|
536
|
+
|
537
537
|
#test update
|
538
538
|
b1.foo_id = f2.id
|
539
539
|
b1.save
|
540
|
-
|
541
|
-
|
542
|
-
|
540
|
+
|
541
|
+
|
543
542
|
f3_rel = Foo.find(f3.id)
|
544
543
|
assert f3_rel.bars.empty?
|
545
544
|
f2_rel = Foo.find(f2.id)
|
@@ -574,8 +573,8 @@ class FirstTest < Test::Unit::TestCase
|
|
574
573
|
|
575
574
|
assert_not_equal zoo1,zoo2, 'objects with different ids should not be equal'
|
576
575
|
|
577
|
-
assert_equal zoo1, zoo1, 'An object should be
|
578
|
-
|
576
|
+
assert_equal zoo1, zoo1, 'An object should be equal to itself'
|
577
|
+
|
579
578
|
assert_not_equal zoo1, nil, 'Anactual object should not equal nil'
|
580
579
|
|
581
580
|
zoo1_reloaded = Zoo.find(zoo1.id)
|
@@ -587,9 +586,30 @@ class FirstTest < Test::Unit::TestCase
|
|
587
586
|
foo.id = zoo1.id
|
588
587
|
|
589
588
|
assert_not_equal zoo1, foo, "Objects of different classes should not be euqal, even if they have the same id"
|
590
|
-
|
589
|
+
|
591
590
|
zoo1_reloaded.name = 'zoooooo'
|
592
591
|
assert_equal zoo1, zoo1_reloaded, "Objects of the same class with the same id should be equal even if they differ in attributes (same as in rails)"
|
593
592
|
end
|
593
|
+
|
594
|
+
def test_has_many_sub_resource_attr_setter
|
595
|
+
b = BarWithHasManySubResource.new()
|
596
|
+
b.save
|
597
|
+
|
598
|
+
assert_raise ArgumentError do
|
599
|
+
b.foo_ids = nil
|
600
|
+
end
|
601
|
+
|
602
|
+
assert_raise ArgumentError do
|
603
|
+
b.foo_ids = "Tralala"
|
604
|
+
end
|
605
|
+
|
606
|
+
b.foo_ids = []
|
607
|
+
end
|
608
|
+
|
609
|
+
def test_update_attribute
|
610
|
+
zoo1 = Zoo.new(:name => 'zoo1')
|
611
|
+
zoo1.update_attributes({:name => "updated"})
|
612
|
+
assert_equal "updated", zoo1.name
|
613
|
+
end
|
594
614
|
end
|
595
615
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arrest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.20
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-02-03 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
16
|
-
requirement: &
|
16
|
+
requirement: &2165537620 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2165537620
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: faraday
|
27
|
-
requirement: &
|
27
|
+
requirement: &2165536020 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - =
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.7.5
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2165536020
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: activemodel
|
38
|
-
requirement: &
|
38
|
+
requirement: &2165535100 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '3'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2165535100
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: bundler
|
49
|
-
requirement: &
|
49
|
+
requirement: &2165534560 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.0.0
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2165534560
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rake
|
60
|
-
requirement: &
|
60
|
+
requirement: &2165534160 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *2165534160
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rdoc
|
71
|
-
requirement: &
|
71
|
+
requirement: &2165533580 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *2165533580
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: rspec
|
82
|
-
requirement: &
|
82
|
+
requirement: &2165532960 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ~>
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '2'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *2165532960
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: rr
|
93
|
-
requirement: &
|
93
|
+
requirement: &2165532320 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *2165532320
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: simplecov
|
104
|
-
requirement: &
|
104
|
+
requirement: &2165531160 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *2165531160
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: rack
|
115
|
-
requirement: &
|
115
|
+
requirement: &2165530080 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ! '>='
|
@@ -120,7 +120,7 @@ dependencies:
|
|
120
120
|
version: '0'
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *2165530080
|
124
124
|
description: Consume a rest API in a AR like fashion
|
125
125
|
email:
|
126
126
|
- axel.tetzlaff@fortytools.com
|