active_remote 2.0.2 → 2.1.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/active_remote/base.rb +4 -0
- data/lib/active_remote/bulk.rb +8 -12
- data/lib/active_remote/persistence.rb +20 -10
- data/lib/active_remote/primary_key.rb +37 -0
- data/lib/active_remote/rpc.rb +94 -43
- data/lib/active_remote/rpc_adapters/protobuf_adapter.rb +56 -0
- data/lib/active_remote/scope_keys.rb +66 -0
- data/lib/active_remote/search.rb +9 -6
- data/lib/active_remote/serialization.rb +42 -16
- data/lib/active_remote/serializers/json.rb +1 -1
- data/lib/active_remote/version.rb +1 -1
- data/spec/lib/active_remote/bulk_spec.rb +8 -20
- data/spec/lib/active_remote/dirty_spec.rb +6 -12
- data/spec/lib/active_remote/persistence_spec.rb +62 -56
- data/spec/lib/active_remote/primary_key_spec.rb +35 -0
- data/spec/lib/active_remote/rpc_spec.rb +3 -3
- data/spec/lib/active_remote/scope_keys_spec.rb +42 -0
- data/spec/lib/active_remote/search_spec.rb +19 -16
- data/spec/lib/active_remote/serialization_spec.rb +15 -47
- data/spec/lib/active_remote/serializers/json_spec.rb +1 -1
- data/spec/support/models/tag.rb +1 -0
- metadata +11 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0dd96c99847eae8cf17cec819377a356b0c9fe51
|
4
|
+
data.tar.gz: 97353c96fb186aaa0c509b882bb860389656c2c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ad36c87d5dd76cd1663e82f43b92dde4b9780b60033f2cc59ee9d925ad0a87d67b375ed840755e03791a6c7136c47641d94ef5cf611ab6f3e0cfc82725c872c6
|
7
|
+
data.tar.gz: 432cd9f0811511f39d4f82e4ffb074dc0511e244efb2d0575cc3f99f8945f3bc1f8a5e5a45869d72fb13704f6d05bcf0f26c4365010b3d2ca34e427f5ca3d1fb
|
data/lib/active_remote/base.rb
CHANGED
@@ -9,8 +9,10 @@ require 'active_remote/dirty'
|
|
9
9
|
require 'active_remote/dsl'
|
10
10
|
require 'active_remote/integration'
|
11
11
|
require 'active_remote/persistence'
|
12
|
+
require 'active_remote/primary_key'
|
12
13
|
require 'active_remote/publication'
|
13
14
|
require 'active_remote/rpc'
|
15
|
+
require 'active_remote/scope_keys'
|
14
16
|
require 'active_remote/search'
|
15
17
|
require 'active_remote/serialization'
|
16
18
|
|
@@ -26,8 +28,10 @@ module ActiveRemote
|
|
26
28
|
include DSL
|
27
29
|
include Integration
|
28
30
|
include Persistence
|
31
|
+
include PrimaryKey
|
29
32
|
include Publication
|
30
33
|
include RPC
|
34
|
+
include ScopeKeys
|
31
35
|
include Search
|
32
36
|
include Serialization
|
33
37
|
|
data/lib/active_remote/bulk.rb
CHANGED
@@ -32,9 +32,8 @@ module ActiveRemote
|
|
32
32
|
# Tag.create_all(Generic::Remote::Tags.new(:records => [ Generic::Remote::Tag.new(:name => 'foo') ])
|
33
33
|
#
|
34
34
|
def create_all(*records)
|
35
|
-
|
36
|
-
|
37
|
-
remote.serialize_records
|
35
|
+
response = rpc.execute(:create_all, parse_records(records))
|
36
|
+
serialize_records(response.records) if response.respond_to?(:records)
|
38
37
|
end
|
39
38
|
|
40
39
|
# Delete multiple records at the same time. Returns a collection of active
|
@@ -59,9 +58,8 @@ module ActiveRemote
|
|
59
58
|
# Tag.delete_all(Generic::Remote::Tags.new(:records => [ Generic::Remote::Tag.new(:guid => 'foo') ])
|
60
59
|
#
|
61
60
|
def delete_all(*records)
|
62
|
-
|
63
|
-
|
64
|
-
remote.serialize_records
|
61
|
+
response = rpc.execute(:delete_all, parse_records(records))
|
62
|
+
serialize_records(response.records) if response.respond_to?(:records)
|
65
63
|
end
|
66
64
|
|
67
65
|
# Destroy multiple records at the same time. Returns a collection of active
|
@@ -86,9 +84,8 @@ module ActiveRemote
|
|
86
84
|
# Tag.destroy_all(Generic::Remote::Tags.new(:records => [ Generic::Remote::Tag.new(:guid => 'foo') ])
|
87
85
|
#
|
88
86
|
def destroy_all(*records)
|
89
|
-
|
90
|
-
|
91
|
-
remote.serialize_records
|
87
|
+
response = rpc.execute(:destroy_all, parse_records(records))
|
88
|
+
serialize_records(response.records) if response.respond_to?(:records)
|
92
89
|
end
|
93
90
|
|
94
91
|
# Parse given records to get them ready to be built into a request.
|
@@ -135,9 +132,8 @@ module ActiveRemote
|
|
135
132
|
# Tag.update_all(Generic::Remote::Tags.new(:records => [ Generic::Remote::Tag.new(:guid => 'foo', :name => 'baz') ])
|
136
133
|
#
|
137
134
|
def update_all(*records)
|
138
|
-
|
139
|
-
|
140
|
-
remote.serialize_records
|
135
|
+
response = rpc.execute(:update_all, parse_records(records))
|
136
|
+
serialize_records(response.records) if response.respond_to?(:records)
|
141
137
|
end
|
142
138
|
end
|
143
139
|
end
|
@@ -76,7 +76,10 @@ module ActiveRemote
|
|
76
76
|
#
|
77
77
|
def delete
|
78
78
|
raise ReadOnlyRemoteRecord if readonly?
|
79
|
-
execute(:delete,
|
79
|
+
response = rpc.execute(:delete, scope_key_hash)
|
80
|
+
|
81
|
+
# TODO: add errors here so success? actually does something...
|
82
|
+
# add_errors(response)
|
80
83
|
|
81
84
|
return success? ? freeze : false
|
82
85
|
end
|
@@ -99,7 +102,10 @@ module ActiveRemote
|
|
99
102
|
#
|
100
103
|
def destroy
|
101
104
|
raise ReadOnlyRemoteRecord if readonly?
|
102
|
-
execute(:destroy,
|
105
|
+
response = execute(:destroy, scope_key_hash)
|
106
|
+
|
107
|
+
# TODO: add errors here so success? actually does something...
|
108
|
+
# add_errors(response)
|
103
109
|
|
104
110
|
return success? ? freeze : false
|
105
111
|
end
|
@@ -128,6 +134,10 @@ module ActiveRemote
|
|
128
134
|
assign_attributes(record)
|
129
135
|
end
|
130
136
|
|
137
|
+
# TODO: figure out how to safely run after_find/search callbacks here
|
138
|
+
# currently, several functions use this code path, so an alternate path
|
139
|
+
# may need to be added
|
140
|
+
|
131
141
|
run_callbacks :initialize
|
132
142
|
|
133
143
|
@new_record = false
|
@@ -221,12 +231,12 @@ module ActiveRemote
|
|
221
231
|
run_callbacks :create do
|
222
232
|
# Use the getter here so we get the type casting.
|
223
233
|
new_attributes = attributes
|
224
|
-
new_attributes.delete(
|
234
|
+
new_attributes.delete(primary_key.to_s)
|
225
235
|
|
226
|
-
execute(:create, new_attributes)
|
236
|
+
response = rpc.execute(:create, new_attributes)
|
227
237
|
|
228
|
-
assign_attributes(
|
229
|
-
|
238
|
+
assign_attributes(response.to_hash)
|
239
|
+
add_errors(response)
|
230
240
|
|
231
241
|
@new_record = has_errors?
|
232
242
|
success?
|
@@ -251,12 +261,12 @@ module ActiveRemote
|
|
251
261
|
# Use the getter here so we get the type casting.
|
252
262
|
updated_attributes = attributes
|
253
263
|
updated_attributes.slice!(*attribute_names)
|
254
|
-
updated_attributes.merge!(
|
264
|
+
updated_attributes.merge!(scope_key_hash)
|
255
265
|
|
256
|
-
execute(:update, updated_attributes)
|
266
|
+
response = rpc.execute(:update, updated_attributes)
|
257
267
|
|
258
|
-
assign_attributes(
|
259
|
-
|
268
|
+
assign_attributes(response.to_hash)
|
269
|
+
add_errors(response)
|
260
270
|
|
261
271
|
success?
|
262
272
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module ActiveRemote
|
2
|
+
module PrimaryKey
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
module ClassMethods
|
6
|
+
|
7
|
+
##
|
8
|
+
# The default_primary_key is used to define what attribute is used
|
9
|
+
# as a primary key for your global code base. If you use a primary
|
10
|
+
# key other than this, you'll want to set it using the primary_key
|
11
|
+
# method listed below
|
12
|
+
#
|
13
|
+
def default_primary_key
|
14
|
+
:guid
|
15
|
+
end
|
16
|
+
|
17
|
+
##
|
18
|
+
# In the event that you use a different primary key than the default
|
19
|
+
# primary key listed above (like :uuid, or :id), you'll use this method
|
20
|
+
# to change that primary key. This will be used when making remote
|
21
|
+
# calls to persist or refresh data.
|
22
|
+
#
|
23
|
+
def primary_key(value = nil)
|
24
|
+
@primary_key = value if value
|
25
|
+
@primary_key || default_primary_key
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Instance level access to either the default primary key, or whatever
|
31
|
+
# you configured the class level primary key to be.
|
32
|
+
#
|
33
|
+
def primary_key
|
34
|
+
self.class.primary_key
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/active_remote/rpc.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'active_remote/rpc_adapters/protobuf_adapter'
|
1
2
|
require 'active_remote/serializers/protobuf'
|
2
3
|
|
3
4
|
module ActiveRemote
|
@@ -5,68 +6,118 @@ module ActiveRemote
|
|
5
6
|
extend ActiveSupport::Concern
|
6
7
|
|
7
8
|
included do
|
8
|
-
include
|
9
|
+
include Embedded
|
9
10
|
end
|
10
11
|
|
11
|
-
|
12
|
+
# TODO: Deprecate this pattern of executing RPC calls
|
13
|
+
#
|
14
|
+
module Embedded
|
15
|
+
extend ActiveSupport::Concern
|
12
16
|
|
13
|
-
|
14
|
-
|
15
|
-
def remote_call(rpc_method, request_args)
|
16
|
-
remote = self.new
|
17
|
-
remote.execute(rpc_method, request_args)
|
18
|
-
remote.last_response
|
17
|
+
included do
|
18
|
+
include Serializers::Protobuf
|
19
19
|
end
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
module ClassMethods
|
22
|
+
# Return a protobuf request object for the given rpc request.
|
23
|
+
#
|
24
|
+
# TODO: Add deprecation warning
|
25
|
+
#
|
26
|
+
def request(rpc_method, request_args)
|
27
|
+
return request_args unless request_args.is_a?(Hash)
|
28
|
+
|
29
|
+
message_class = request_type(rpc_method)
|
30
|
+
fields = fields_from_attributes(message_class, request_args)
|
31
|
+
message_class.new(fields)
|
32
|
+
end
|
25
33
|
|
26
|
-
|
27
|
-
|
28
|
-
|
34
|
+
# Return the class applicable to the request for the given rpc method.
|
35
|
+
#
|
36
|
+
# TODO: Add deprecation warning
|
37
|
+
#
|
38
|
+
def request_type(rpc_method)
|
39
|
+
service_class.rpcs[rpc_method].request_type
|
40
|
+
end
|
29
41
|
end
|
30
42
|
|
31
|
-
#
|
43
|
+
# Invoke an RPC call to the service for the given rpc method.
|
32
44
|
#
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
45
|
+
# TODO: Add deprecation warning
|
46
|
+
#
|
47
|
+
def execute(rpc_method, request_args)
|
48
|
+
@last_request = request(rpc_method, request_args)
|
37
49
|
|
38
|
-
|
39
|
-
#
|
40
|
-
def execute(rpc_method, request_args)
|
41
|
-
@last_request = request(rpc_method, request_args)
|
50
|
+
_service_class.client.__send__(rpc_method, @last_request) do |c|
|
42
51
|
|
43
|
-
|
52
|
+
# In the event of service failure, raise the error.
|
53
|
+
c.on_failure do |error|
|
54
|
+
raise ActiveRemoteError, error.message
|
55
|
+
end
|
44
56
|
|
45
|
-
|
46
|
-
|
47
|
-
|
57
|
+
# In the event of service success, assign the response.
|
58
|
+
c.on_success do |response|
|
59
|
+
@last_response = response
|
60
|
+
end
|
48
61
|
end
|
49
62
|
|
50
|
-
|
51
|
-
c.on_success do |response|
|
52
|
-
@last_response = response
|
53
|
-
end
|
63
|
+
@last_response
|
54
64
|
end
|
55
|
-
end
|
56
65
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
66
|
+
|
67
|
+
# Execute an RPC call to the remote service and return the raw response.
|
68
|
+
#
|
69
|
+
# TODO: Add deprecation warning
|
70
|
+
#
|
71
|
+
def remote_call(rpc_method, request_args)
|
72
|
+
rpc.execute(rpc_method, request_args)
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
# Return a protobuf request object for the given rpc call.
|
78
|
+
#
|
79
|
+
# TODO: Add deprecation warning
|
80
|
+
#
|
81
|
+
def request(rpc_method, attributes)
|
82
|
+
self.class.request(rpc_method, attributes)
|
83
|
+
end
|
62
84
|
end
|
63
85
|
|
64
|
-
|
86
|
+
module ClassMethods
|
65
87
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
88
|
+
# Execute an RPC call to the remote service and return the raw response.
|
89
|
+
#
|
90
|
+
def remote_call(rpc_method, request_args)
|
91
|
+
rpc.execute(rpc_method, request_args)
|
92
|
+
end
|
93
|
+
|
94
|
+
def rpc
|
95
|
+
@rpc ||= rpc_adapter.new(service_class)
|
96
|
+
end
|
97
|
+
|
98
|
+
def rpc_adapter
|
99
|
+
# TODO: Make this pluggable
|
100
|
+
#
|
101
|
+
# raise(AdapterNotSpecified, "configuration does not specify adapter") unless adapter.present?
|
102
|
+
#
|
103
|
+
# path_to_adapter = "active_remote/rpc_adapters/#{adapter}_adapter"
|
104
|
+
#
|
105
|
+
# begin
|
106
|
+
# require path_to_adapter
|
107
|
+
# rescue Gem::LoadError => e
|
108
|
+
# raise Gem::LoadError, "Specified '#{adapter]}' for RPC adapter, but the gem is not loaded. Add `gem '#{e.name}'` to your Gemfile (and ensure its version is at the minimum required by ActiveRemote)."
|
109
|
+
# rescue LoadError => e
|
110
|
+
# raise LoadError, "Could not load '#{path_to_adapter}'. Make sure that the adapter is valid. If you use an adapter other than 'protobuf' add the necessary adapter gem to the Gemfile.", e.backtrace
|
111
|
+
# end
|
112
|
+
#
|
113
|
+
# path_to_adapter.classify.constantize
|
114
|
+
|
115
|
+
RPCAdapters::ProtobufAdapter
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def rpc
|
120
|
+
self.class.rpc
|
70
121
|
end
|
71
122
|
end
|
72
123
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'active_remote/serializers/protobuf'
|
2
|
+
|
3
|
+
module ActiveRemote
|
4
|
+
module RPCAdapters
|
5
|
+
class ProtobufAdapter
|
6
|
+
include Serializers::Protobuf
|
7
|
+
|
8
|
+
attr_reader :last_request, :last_response, :service_class
|
9
|
+
|
10
|
+
##
|
11
|
+
# Constructor!
|
12
|
+
#
|
13
|
+
def initialize(service_class)
|
14
|
+
@service_class = service_class
|
15
|
+
end
|
16
|
+
|
17
|
+
# Invoke an RPC call to the service for the given rpc method.
|
18
|
+
#
|
19
|
+
def execute(rpc_method, request_args)
|
20
|
+
@last_request = request(rpc_method, request_args)
|
21
|
+
|
22
|
+
service_class.client.__send__(rpc_method, @last_request) do |c|
|
23
|
+
# In the event of service failure, raise the error.
|
24
|
+
c.on_failure do |error|
|
25
|
+
raise ActiveRemoteError, error.message
|
26
|
+
end
|
27
|
+
|
28
|
+
# In the event of service success, assign the response.
|
29
|
+
c.on_success do |response|
|
30
|
+
@last_response = response
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
@last_response
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
# Return a protobuf request object for the given rpc request.
|
40
|
+
#
|
41
|
+
def request(rpc_method, request_args)
|
42
|
+
return request_args unless request_args.is_a?(Hash)
|
43
|
+
|
44
|
+
message_class = request_type(rpc_method)
|
45
|
+
fields = fields_from_attributes(message_class, request_args)
|
46
|
+
message_class.new(fields)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Return the class applicable to the request for the given rpc method.
|
50
|
+
#
|
51
|
+
def request_type(rpc_method)
|
52
|
+
service_class.rpcs[rpc_method].request_type
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module ActiveRemote
|
2
|
+
module ScopeKeys
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
include PrimaryKey
|
7
|
+
|
8
|
+
class_attribute :_scope_keys
|
9
|
+
self._scope_keys = []
|
10
|
+
end
|
11
|
+
|
12
|
+
module ClassMethods
|
13
|
+
|
14
|
+
##
|
15
|
+
# Allows you to define, at a class level, what keys should be
|
16
|
+
# used as identifiers when making remote calls. For instance,
|
17
|
+
#
|
18
|
+
# class Tag < ActiveRemote::Base
|
19
|
+
# scope_key :user_guid
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# When #scope_keys is called on Tag, it will return the primary
|
23
|
+
# key in addition to :user_guid as the scope keys.
|
24
|
+
#
|
25
|
+
def scope_key(*keys)
|
26
|
+
self._scope_keys += keys.map(&:to_s)
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Used to define what keys are required when making remote
|
31
|
+
# persistence or refresh calls.
|
32
|
+
#
|
33
|
+
def scope_keys
|
34
|
+
[ primary_key.to_s ] + _scope_keys
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
# Instance level access to the scope key of the current class
|
40
|
+
#
|
41
|
+
def scope_keys
|
42
|
+
@scope_keys ||= self.class.scope_keys
|
43
|
+
end
|
44
|
+
|
45
|
+
##
|
46
|
+
# Instance level hash of scope keys and their corresponding
|
47
|
+
# values. For instance,
|
48
|
+
#
|
49
|
+
# class Tag < ActiveRemote::Base
|
50
|
+
# scope_key :user_guid
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# would return this hash:
|
54
|
+
#
|
55
|
+
# {
|
56
|
+
# :guid => tag[:guid],
|
57
|
+
# :user_guid => tag[:user_guid]
|
58
|
+
# }
|
59
|
+
#
|
60
|
+
# This hash is used when accessing or modifying a remote object
|
61
|
+
# like when calling #update in the persistence module, for example.
|
62
|
+
def scope_key_hash
|
63
|
+
attributes.slice(*scope_keys)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/active_remote/search.rb
CHANGED
@@ -91,9 +91,12 @@ module ActiveRemote
|
|
91
91
|
def search(args)
|
92
92
|
args = _active_remote_search_args(args)
|
93
93
|
|
94
|
-
|
95
|
-
|
96
|
-
|
94
|
+
response = rpc.execute(:search, args)
|
95
|
+
|
96
|
+
if response.respond_to?(:records)
|
97
|
+
records = serialize_records(response.records)
|
98
|
+
records.each { |record| record.run_callbacks :search }
|
99
|
+
end
|
97
100
|
end
|
98
101
|
|
99
102
|
# :noapi:
|
@@ -116,16 +119,16 @@ module ActiveRemote
|
|
116
119
|
#
|
117
120
|
def _active_remote_search(args)
|
118
121
|
run_callbacks :search do
|
119
|
-
execute(:search, args)
|
122
|
+
rpc.execute(:search, args)
|
120
123
|
end
|
121
124
|
end
|
122
125
|
|
123
126
|
# Reload this record from the remote service.
|
124
127
|
#
|
125
128
|
def reload
|
126
|
-
|
129
|
+
response = self.class.find(scope_key_hash)
|
127
130
|
|
128
|
-
fresh_object = self.class.
|
131
|
+
fresh_object = self.class.instantiate(response.to_hash)
|
129
132
|
@attributes.update(fresh_object.instance_variable_get('@attributes'))
|
130
133
|
end
|
131
134
|
end
|
@@ -8,34 +8,60 @@ module ActiveRemote
|
|
8
8
|
include Serializers::JSON
|
9
9
|
end
|
10
10
|
|
11
|
+
module ClassMethods
|
12
|
+
# Serialize the given records into Active Remote objects.
|
13
|
+
#
|
14
|
+
# ====Examples
|
15
|
+
#
|
16
|
+
# records = [ Generic::Remote::TagRequest.new(:name => 'foo') ]
|
17
|
+
#
|
18
|
+
# Tag.serialize_records(records) # => [ Tag#{:name => 'foo'} ]
|
19
|
+
#
|
20
|
+
def serialize_records(records)
|
21
|
+
records.map { |record| instantiate(record.to_hash) }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
11
25
|
# Examine the given response and add any errors to our internal errors
|
12
|
-
# list.
|
26
|
+
# list.
|
13
27
|
#
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
28
|
+
# ====Examples
|
29
|
+
#
|
30
|
+
# response = remote_call(:action_that_returns_errors, { :stuff => 'foo' })
|
31
|
+
#
|
32
|
+
# add_errors(response.errors)
|
33
|
+
#
|
34
|
+
def add_errors(errors)
|
35
|
+
errors.each do |error|
|
18
36
|
if error.respond_to?(:message)
|
19
|
-
errors.add(error.field, error.message)
|
37
|
+
self.errors.add(error.field, error.message)
|
20
38
|
elsif error.respond_to?(:messages)
|
21
39
|
error.messages.each do |message|
|
22
|
-
errors.add(error.field, message)
|
40
|
+
self.errors.add(error.field, message)
|
23
41
|
end
|
24
42
|
end
|
25
43
|
end
|
26
44
|
end
|
27
45
|
|
28
|
-
#
|
29
|
-
# Remote objects.
|
46
|
+
# DEPRECATED – Use :add_errors instead
|
30
47
|
#
|
31
|
-
def
|
32
|
-
|
48
|
+
def add_errors_from_response(response = nil)
|
49
|
+
warn 'DEPRECATED :add_errors_from_response is deprecated and will be removed in Active Remote 3.0. Use :add_errors instead'
|
33
50
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
51
|
+
response ||= last_response
|
52
|
+
|
53
|
+
add_errors(response.errors) if response.respond_to?(:errors)
|
54
|
+
end
|
55
|
+
|
56
|
+
# DEPRECATED – Use the class-level :serialize_errors instead
|
57
|
+
#
|
58
|
+
def serialize_records(records = nil)
|
59
|
+
warn 'DEPRECATED Calling :serialize_records on an instance is deprecated and will be removed in Active Remote 3.0. Use the class-level :serialize_records instead'
|
60
|
+
|
61
|
+
records ||= last_response.records if last_response.respond_to?(:records)
|
62
|
+
return if records.nil?
|
63
|
+
|
64
|
+
self.class.serialize_records(records)
|
39
65
|
end
|
40
66
|
end
|
41
67
|
end
|
@@ -5,37 +5,28 @@ describe ActiveRemote::Bulk do
|
|
5
5
|
let(:serialized_records) { double(:serialized_records) }
|
6
6
|
|
7
7
|
describe ".create_all" do
|
8
|
-
before {
|
9
|
-
Tag.stub(:parse_records).and_return(records)
|
10
|
-
Tag.any_instance.stub(:serialize_records).and_return(serialized_records)
|
11
|
-
}
|
8
|
+
before { Tag.better_stub(:parse_records).and_return(records) }
|
12
9
|
|
13
10
|
it "creates remote records" do
|
14
|
-
Tag.
|
11
|
+
Tag.rpc.better_receive(:execute).with(:create_all, records)
|
15
12
|
Tag.create_all(records)
|
16
13
|
end
|
17
14
|
end
|
18
15
|
|
19
16
|
describe ".delete_all" do
|
20
|
-
before {
|
21
|
-
Tag.stub(:parse_records).and_return(records)
|
22
|
-
Tag.any_instance.stub(:serialize_records).and_return(serialized_records)
|
23
|
-
}
|
17
|
+
before { Tag.better_stub(:parse_records).and_return(records) }
|
24
18
|
|
25
19
|
it "deletes remote records" do
|
26
|
-
Tag.
|
20
|
+
Tag.rpc.better_receive(:execute).with(:delete_all, records)
|
27
21
|
Tag.delete_all(records)
|
28
22
|
end
|
29
23
|
end
|
30
24
|
|
31
25
|
describe ".destroy_all" do
|
32
|
-
before {
|
33
|
-
Tag.stub(:parse_records).and_return(records)
|
34
|
-
Tag.any_instance.stub(:serialize_records).and_return(serialized_records)
|
35
|
-
}
|
26
|
+
before { Tag.better_stub(:parse_records).and_return(records) }
|
36
27
|
|
37
28
|
it "destroys remote records" do
|
38
|
-
Tag.
|
29
|
+
Tag.rpc.better_receive(:execute).with(:destroy_all, records)
|
39
30
|
Tag.destroy_all(records)
|
40
31
|
end
|
41
32
|
end
|
@@ -78,13 +69,10 @@ describe ActiveRemote::Bulk do
|
|
78
69
|
end
|
79
70
|
|
80
71
|
describe ".update_all" do
|
81
|
-
before {
|
82
|
-
Tag.stub(:parse_records).and_return(records)
|
83
|
-
Tag.any_instance.stub(:serialize_records).and_return(serialized_records)
|
84
|
-
}
|
72
|
+
before { Tag.stub(:parse_records).and_return(records) }
|
85
73
|
|
86
74
|
it "updates remote records" do
|
87
|
-
Tag.
|
75
|
+
Tag.rpc.better_receive(:execute).with(:update_all, records)
|
88
76
|
Tag.update_all(records)
|
89
77
|
end
|
90
78
|
end
|
@@ -47,8 +47,7 @@ describe ActiveRemote::Dirty do
|
|
47
47
|
subject { Post.new(:name => 'foo') }
|
48
48
|
|
49
49
|
before {
|
50
|
-
|
51
|
-
subject.stub(:execute)
|
50
|
+
Post.stub(:find).and_return({})
|
52
51
|
subject.reload
|
53
52
|
}
|
54
53
|
|
@@ -83,23 +82,18 @@ describe ActiveRemote::Dirty do
|
|
83
82
|
its(:changes) { should be_empty }
|
84
83
|
end
|
85
84
|
|
86
|
-
describe "#
|
85
|
+
describe "#instantiate" do
|
87
86
|
let(:post) { Post.new }
|
88
87
|
let(:record) { ::Generic::Remote::Post.new(:name => 'foo') }
|
89
|
-
let(:response) { double(:response, :records => [ record ]) }
|
90
|
-
|
91
|
-
before {
|
92
|
-
post.stub(:last_response).and_return(response)
|
93
|
-
}
|
94
88
|
|
95
89
|
it "clears previous changes" do
|
96
|
-
|
97
|
-
|
90
|
+
new_record = post.instantiate(record.to_hash)
|
91
|
+
new_record.previous_changes.should be_nil
|
98
92
|
end
|
99
93
|
|
100
94
|
it "clears changes" do
|
101
|
-
|
102
|
-
|
95
|
+
new_record = post.instantiate(record.to_hash)
|
96
|
+
new_record.changes.should be_empty
|
103
97
|
end
|
104
98
|
end
|
105
99
|
end
|
@@ -1,20 +1,22 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ActiveRemote::Persistence do
|
4
|
+
let(:rpc) { Tag.new }
|
5
|
+
|
4
6
|
subject { Tag.new }
|
5
7
|
|
6
|
-
before {
|
8
|
+
before {
|
9
|
+
rpc.better_stub(:execute).and_return(HashWithIndifferentAccess.new)
|
10
|
+
Tag.better_stub(:rpc).and_return(rpc)
|
11
|
+
}
|
12
|
+
after { Tag.unstub(:rpc) }
|
7
13
|
|
8
14
|
describe ".create" do
|
9
|
-
before { Tag.any_instance.stub(:execute) }
|
10
|
-
after { Tag.any_instance.unstub(:execute) }
|
11
|
-
|
12
15
|
it "runs create callbacks" do
|
13
16
|
Tag.any_instance.should_receive(:after_create_callback)
|
14
17
|
Tag.create(:name => 'foo')
|
15
18
|
end
|
16
19
|
|
17
|
-
|
18
20
|
it "initializes and saves a new record" do
|
19
21
|
Tag.any_instance.should_receive(:save)
|
20
22
|
Tag.create(:name => 'foo')
|
@@ -27,9 +29,6 @@ describe ActiveRemote::Persistence do
|
|
27
29
|
end
|
28
30
|
|
29
31
|
describe ".create!" do
|
30
|
-
before { Tag.any_instance.stub(:execute) }
|
31
|
-
after { Tag.any_instance.unstub(:execute) }
|
32
|
-
|
33
32
|
it "initializes and saves a new record" do
|
34
33
|
Tag.any_instance.should_receive(:save!)
|
35
34
|
Tag.create!(:name => 'foo')
|
@@ -45,11 +44,8 @@ describe ActiveRemote::Persistence do
|
|
45
44
|
end
|
46
45
|
|
47
46
|
describe "#delete" do
|
48
|
-
before { subject.stub(:execute) }
|
49
|
-
after { subject.unstub(:execute) }
|
50
|
-
|
51
47
|
it "deletes a remote record" do
|
52
|
-
|
48
|
+
rpc.should_receive(:execute).with(:delete, subject.scope_key_hash)
|
53
49
|
subject.delete
|
54
50
|
end
|
55
51
|
|
@@ -60,31 +56,35 @@ describe ActiveRemote::Persistence do
|
|
60
56
|
end
|
61
57
|
end
|
62
58
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
59
|
+
# TODO: This spec passes, but the implementation does not actually work.
|
60
|
+
# Uncomment it once the implementation is correct.
|
61
|
+
#
|
62
|
+
# context "when the record has errors" do
|
63
|
+
# before { subject.stub(:has_errors?).and_return(true) }
|
64
|
+
#
|
65
|
+
# it "returns false" do
|
66
|
+
# subject.delete.should be_false
|
67
|
+
# end
|
68
|
+
# end
|
70
69
|
end
|
71
70
|
|
72
71
|
describe "#delete!" do
|
73
|
-
before { subject.stub(:execute) }
|
74
|
-
after { subject.unstub(:execute) }
|
75
|
-
|
76
72
|
it "deletes a remote record" do
|
77
|
-
|
73
|
+
rpc.should_receive(:execute).with(:delete, subject.scope_key_hash)
|
78
74
|
subject.delete!
|
79
75
|
end
|
80
76
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
77
|
+
# FIXME: This spec tests that excute raises an execption, not that an
|
78
|
+
# exception is raised when an error is returned (as it should).
|
79
|
+
# Uncomment it once the implementation is correct.
|
80
|
+
#
|
81
|
+
# context "when an error occurs" do
|
82
|
+
# before { rpc.stub(:execute).and_raise(ActiveRemote::ActiveRemoteError) }
|
83
|
+
#
|
84
|
+
# it "raises an exception" do
|
85
|
+
# expect { subject.delete! }.to raise_error(ActiveRemote::ActiveRemoteError)
|
86
|
+
# end
|
87
|
+
# end
|
88
88
|
end
|
89
89
|
|
90
90
|
describe "#destroy" do
|
@@ -92,7 +92,7 @@ describe ActiveRemote::Persistence do
|
|
92
92
|
after { subject.unstub(:execute) }
|
93
93
|
|
94
94
|
it "destroys a remote record" do
|
95
|
-
subject.should_receive(:execute).with(:destroy, subject.
|
95
|
+
subject.should_receive(:execute).with(:destroy, subject.scope_key_hash)
|
96
96
|
subject.destroy
|
97
97
|
end
|
98
98
|
|
@@ -103,31 +103,35 @@ describe ActiveRemote::Persistence do
|
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
106
|
+
# TODO: This spec passes, but the implementation does not actually work.
|
107
|
+
# Uncomment it once the implementation is correct.
|
108
|
+
#
|
109
|
+
# context "when the record has errors" do
|
110
|
+
# before { subject.stub(:has_errors?).and_return(true) }
|
111
|
+
#
|
112
|
+
# it "returns false" do
|
113
|
+
# subject.destroy.should be_false
|
114
|
+
# end
|
115
|
+
# end
|
113
116
|
end
|
114
117
|
|
115
118
|
describe "#destroy!" do
|
116
|
-
before { subject.stub(:execute) }
|
117
|
-
after { subject.unstub(:execute) }
|
118
|
-
|
119
119
|
it "destroys a remote record" do
|
120
120
|
subject.should_receive(:execute).with(:destroy, subject.attributes.slice("guid"))
|
121
121
|
subject.destroy!
|
122
122
|
end
|
123
123
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
124
|
+
# FIXME: This spec tests that excute raises an execption, not that an
|
125
|
+
# exception is raised when an error is returned (as it should).
|
126
|
+
# Uncomment it once the implementation is correct.
|
127
|
+
#
|
128
|
+
# context "when an error occurs" do
|
129
|
+
# before { subject.stub(:execute).and_raise(ActiveRemote::ActiveRemoteError) }
|
130
|
+
#
|
131
|
+
# it "raises an exception" do
|
132
|
+
# expect { subject.destroy! }.to raise_error(ActiveRemote::ActiveRemoteError)
|
133
|
+
# end
|
134
|
+
# end
|
131
135
|
end
|
132
136
|
|
133
137
|
describe "#readonly?" do
|
@@ -188,9 +192,6 @@ describe ActiveRemote::Persistence do
|
|
188
192
|
end
|
189
193
|
|
190
194
|
describe "#save" do
|
191
|
-
before { subject.stub(:execute) }
|
192
|
-
after { subject.unstub(:execute) }
|
193
|
-
|
194
195
|
it "runs save callbacks" do
|
195
196
|
subject.should_receive(:run_callbacks).with(:save)
|
196
197
|
subject.save
|
@@ -201,7 +202,7 @@ describe ActiveRemote::Persistence do
|
|
201
202
|
|
202
203
|
it "creates the record" do
|
203
204
|
expected_attributes = subject.attributes.reject { |key, value| key == "guid" }
|
204
|
-
|
205
|
+
rpc.should_receive(:execute).with(:create, expected_attributes)
|
205
206
|
subject.save
|
206
207
|
end
|
207
208
|
end
|
@@ -212,7 +213,7 @@ describe ActiveRemote::Persistence do
|
|
212
213
|
subject { Tag.allocate.instantiate(attributes) }
|
213
214
|
|
214
215
|
it "updates the record" do
|
215
|
-
|
216
|
+
rpc.should_receive(:execute).with(:update, attributes)
|
216
217
|
subject.save
|
217
218
|
end
|
218
219
|
end
|
@@ -277,16 +278,21 @@ describe ActiveRemote::Persistence do
|
|
277
278
|
|
278
279
|
describe "#update_attributes" do
|
279
280
|
let(:attributes) { HashWithIndifferentAccess.new(:name => 'bar') }
|
281
|
+
let(:tag) { Tag.allocate.instantiate({:guid => "123"}) }
|
280
282
|
|
281
|
-
before { Tag.
|
282
|
-
after { Tag.
|
283
|
+
before { Tag.rpc.stub(:execute).and_return(HashWithIndifferentAccess.new) }
|
284
|
+
after { Tag.rpc.unstub(:execute) }
|
283
285
|
|
284
286
|
it "runs update callbacks" do
|
285
|
-
tag = Tag.allocate.instantiate({:guid => "123"})
|
286
287
|
tag.should_receive(:after_update_callback)
|
287
288
|
tag.update_attributes({})
|
288
289
|
end
|
289
290
|
|
291
|
+
it "updates a remote record" do
|
292
|
+
Tag.rpc.should_receive(:execute).with(:update, tag.scope_key_hash)
|
293
|
+
tag.update_attributes({})
|
294
|
+
end
|
295
|
+
|
290
296
|
before { subject.stub(:save) }
|
291
297
|
after { subject.unstub(:save) }
|
292
298
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActiveRemote::PrimaryKey do
|
4
|
+
let(:tag) { Tag.new(:id => '1234', :guid => 'TAG-123', :user_guid => 'USR-123') }
|
5
|
+
|
6
|
+
after { Tag.instance_variable_set :@primary_key, nil }
|
7
|
+
|
8
|
+
describe ".default_primary_key" do
|
9
|
+
it 'returns array of :guid' do
|
10
|
+
Tag.default_primary_key.should eq(:guid)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "primary_key" do
|
15
|
+
context "when no arguments are passed" do
|
16
|
+
it "returns default primary key" do
|
17
|
+
Tag.primary_key.should eq(:guid)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "when arguments are passed" do
|
22
|
+
let(:specified_primary_key) { :name }
|
23
|
+
|
24
|
+
it "returns the given primary key" do
|
25
|
+
Tag.primary_key(specified_primary_key).should eq(specified_primary_key)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#primary_key" do
|
31
|
+
it "returns the primary key for the class" do
|
32
|
+
Tag.new.primary_key.should eq Tag.primary_key
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -7,15 +7,15 @@ describe ActiveRemote::RPC do
|
|
7
7
|
let(:args) { double(:args) }
|
8
8
|
let(:response) { double(:response) }
|
9
9
|
|
10
|
-
before { Tag.
|
10
|
+
before { Tag.rpc.stub(:execute) }
|
11
11
|
|
12
12
|
it "calls the given RPC method" do
|
13
|
-
Tag.
|
13
|
+
Tag.rpc.should_receive(:execute).with(:remote_method, args)
|
14
14
|
Tag.remote_call(:remote_method, args)
|
15
15
|
end
|
16
16
|
|
17
17
|
it "returns the response" do
|
18
|
-
Tag.
|
18
|
+
Tag.rpc.stub(:execute).and_return(response)
|
19
19
|
Tag.remote_call(:remote_method, args).should eq response
|
20
20
|
end
|
21
21
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActiveRemote::ScopeKeys do
|
4
|
+
let(:key) { :user_guid }
|
5
|
+
let(:_scope_keys) { [ 'user_guid' ] }
|
6
|
+
let(:scope_keys) { [ 'guid' ] + _scope_keys }
|
7
|
+
let(:tag) { Tag.new(tag_hash) }
|
8
|
+
let(:tag_hash) { { :guid => 'TAG-123', :user_guid => 'USR-123', :name => 'teh tag' } }
|
9
|
+
|
10
|
+
describe ".scope_key" do
|
11
|
+
after { Tag._scope_keys = [] }
|
12
|
+
|
13
|
+
it 'adds scope_key to _scope_keys' do
|
14
|
+
Tag.scope_key(key)
|
15
|
+
Tag._scope_keys.should eq(_scope_keys)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe ".scope_keys" do
|
20
|
+
before { Tag.better_stub(:_scope_keys).and_return(_scope_keys) }
|
21
|
+
|
22
|
+
it "combines primary key with _scope_keys" do
|
23
|
+
Tag.scope_keys.should eq(['guid'] + _scope_keys)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#scope_keys" do
|
28
|
+
it "returns the scope keys for the class" do
|
29
|
+
Tag.new.scope_keys.should eq Tag.scope_keys
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "#scope_key_hash" do
|
34
|
+
let(:scope_key_hash) { { 'guid' => 'TAG-123', 'user_guid' => 'USR-123' } }
|
35
|
+
|
36
|
+
before { tag.better_stub(:scope_keys).and_return(scope_keys) }
|
37
|
+
|
38
|
+
it "returns a attribute hash of scope_keys" do
|
39
|
+
tag.scope_key_hash.should eq(scope_key_hash)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -1,6 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ActiveRemote::Search do
|
4
|
+
let(:records) { [ Generic::Remote::Tag.new ] }
|
5
|
+
let(:response) { Generic::Remote::Tags.new(:records => records) }
|
6
|
+
let(:rpc) { double(:rpc) }
|
7
|
+
|
4
8
|
describe ".find" do
|
5
9
|
let(:args) { Hash.new }
|
6
10
|
let(:record) { double(:record) }
|
@@ -33,23 +37,20 @@ describe ActiveRemote::Search do
|
|
33
37
|
end
|
34
38
|
|
35
39
|
describe ".search" do
|
40
|
+
let(:serialized_records) { [ Tag.new ] }
|
41
|
+
|
36
42
|
context "given args that respond to :to_hash" do
|
37
43
|
let(:args) { Hash.new }
|
38
44
|
|
39
|
-
before {
|
40
|
-
Tag.any_instance.stub(:_active_remote_search)
|
41
|
-
}
|
45
|
+
before { Tag.rpc.stub(:execute).and_return(response) }
|
42
46
|
|
43
47
|
it "searches with the given args" do
|
44
|
-
Tag.
|
48
|
+
Tag.rpc.should_receive(:execute).with(:search, args)
|
45
49
|
Tag.search(args)
|
46
50
|
end
|
47
51
|
|
48
52
|
it "returns records" do
|
49
|
-
|
50
|
-
|
51
|
-
Tag.any_instance.stub(:serialize_records).and_return(records)
|
52
|
-
Tag.search(args).should eq records
|
53
|
+
Tag.search(args).should eq serialized_records
|
53
54
|
end
|
54
55
|
end
|
55
56
|
|
@@ -67,30 +68,32 @@ describe ActiveRemote::Search do
|
|
67
68
|
|
68
69
|
subject { Tag.new }
|
69
70
|
|
71
|
+
before {
|
72
|
+
rpc.stub(:execute).and_return(response)
|
73
|
+
Tag.better_stub(:rpc).and_return(rpc)
|
74
|
+
}
|
75
|
+
|
70
76
|
it "runs callbacks" do
|
71
77
|
subject.should_receive(:run_callbacks).with(:search)
|
72
78
|
subject._active_remote_search(args)
|
73
79
|
end
|
74
80
|
|
75
81
|
it "executes the search" do
|
76
|
-
|
82
|
+
rpc.should_receive(:execute).with(:search, args)
|
77
83
|
subject._active_remote_search(args)
|
78
84
|
end
|
79
85
|
end
|
80
86
|
|
81
87
|
describe "#reload" do
|
82
|
-
let(:args) {
|
83
|
-
let(:attributes) { HashWithIndifferentAccess.new(:guid => 'foo', :name => 'bar', :updated_at => nil) }
|
88
|
+
let(:args) { attributes.slice('guid', 'user_guid') }
|
89
|
+
let(:attributes) { HashWithIndifferentAccess.new(:guid => 'foo', :name => 'bar', :updated_at => nil, :user_guid => 'baz') }
|
84
90
|
|
85
91
|
subject { Tag.new(args) }
|
86
92
|
|
87
|
-
before {
|
88
|
-
subject.stub(:_active_remote_search)
|
89
|
-
subject.stub(:last_response).and_return(attributes)
|
90
|
-
}
|
93
|
+
before { Tag.better_stub(:find).and_return(attributes) }
|
91
94
|
|
92
95
|
it "reloads the record" do
|
93
|
-
|
96
|
+
Tag.better_receive(:find).with(subject.scope_key_hash)
|
94
97
|
subject.reload
|
95
98
|
end
|
96
99
|
|
@@ -1,64 +1,32 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ActiveRemote::Serialization do
|
4
|
-
describe "
|
5
|
-
let(:
|
6
|
-
let(:response) {
|
7
|
-
tag = Generic::Remote::Tag.new
|
8
|
-
tag.errors << error
|
9
|
-
tag
|
10
|
-
}
|
4
|
+
describe ".serialize_records" do
|
5
|
+
let(:records) { [ { :foo => 'bar' } ] }
|
11
6
|
|
12
7
|
subject { Tag.new }
|
13
8
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
subject.errors[:name].should =~ ['Boom!']
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
context "when the response doesn't respond to errors" do
|
22
|
-
let(:response) { Generic::Remote::Tag.new }
|
23
|
-
|
24
|
-
it "doesn't add errors" do
|
25
|
-
subject.add_errors_from_response(response)
|
26
|
-
subject.errors.empty?.should be_true
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
context "when no response is given" do
|
31
|
-
before { subject.stub(:last_response).and_return(response) }
|
32
|
-
|
33
|
-
it "uses the last response" do
|
34
|
-
subject.add_errors_from_response
|
35
|
-
subject.errors[:name].should =~ ['Boom!']
|
9
|
+
it "serializes records into active remote objects" do
|
10
|
+
Tag.serialize_records(records).each do |record|
|
11
|
+
record.should be_a Tag
|
36
12
|
end
|
37
13
|
end
|
38
14
|
end
|
39
15
|
|
40
|
-
describe "#
|
41
|
-
let(:
|
42
|
-
|
16
|
+
describe "#add_errors" do
|
17
|
+
let(:error) { Generic::Error.new(:field => 'name', :message => 'Boom!') }
|
18
|
+
let(:response) {
|
19
|
+
tag = Generic::Remote::Tag.new
|
20
|
+
tag.errors << error
|
21
|
+
tag
|
43
22
|
}
|
44
|
-
let(:records) { [ { :foo => 'bar' } ] }
|
45
23
|
|
46
24
|
subject { Tag.new }
|
47
25
|
|
48
|
-
context "when the
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
it "serializes records into active remote objects" do
|
53
|
-
subject.serialize_records.each do |record|
|
54
|
-
record.should be_a Tag
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
context "when the last response doesn't respond to records" do
|
60
|
-
it "returns nil" do
|
61
|
-
subject.serialize_records.should be_nil
|
26
|
+
context "when the response has errors" do
|
27
|
+
it "adds the errors to the active remote object" do
|
28
|
+
subject.add_errors(response.errors)
|
29
|
+
subject.errors[:name].should =~ ['Boom!']
|
62
30
|
end
|
63
31
|
end
|
64
32
|
end
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe ActiveRemote::Serializers::JSON do
|
4
4
|
describe "#as_json" do
|
5
|
-
let(:attributes) { { :guid => 'foo', :name => 'bar', :updated_at => nil } }
|
5
|
+
let(:attributes) { { :guid => 'foo', :name => 'bar', :updated_at => nil, :user_guid => 'baz' } }
|
6
6
|
let(:serializable_attributes) { { "tag" => attributes.stringify_keys } }
|
7
7
|
|
8
8
|
subject { Tag.new(attributes) }
|
data/spec/support/models/tag.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_remote
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.1.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Hutchison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active_attr
|
@@ -181,9 +181,12 @@ files:
|
|
181
181
|
- lib/active_remote/errors.rb
|
182
182
|
- lib/active_remote/integration.rb
|
183
183
|
- lib/active_remote/persistence.rb
|
184
|
+
- lib/active_remote/primary_key.rb
|
184
185
|
- lib/active_remote/publication.rb
|
185
186
|
- lib/active_remote/railtie.rb
|
186
187
|
- lib/active_remote/rpc.rb
|
188
|
+
- lib/active_remote/rpc_adapters/protobuf_adapter.rb
|
189
|
+
- lib/active_remote/scope_keys.rb
|
187
190
|
- lib/active_remote/search.rb
|
188
191
|
- lib/active_remote/serialization.rb
|
189
192
|
- lib/active_remote/serializers/json.rb
|
@@ -197,8 +200,10 @@ files:
|
|
197
200
|
- spec/lib/active_remote/dsl_spec.rb
|
198
201
|
- spec/lib/active_remote/integration_spec.rb
|
199
202
|
- spec/lib/active_remote/persistence_spec.rb
|
203
|
+
- spec/lib/active_remote/primary_key_spec.rb
|
200
204
|
- spec/lib/active_remote/publication_spec.rb
|
201
205
|
- spec/lib/active_remote/rpc_spec.rb
|
206
|
+
- spec/lib/active_remote/scope_keys_spec.rb
|
202
207
|
- spec/lib/active_remote/search_spec.rb
|
203
208
|
- spec/lib/active_remote/serialization_spec.rb
|
204
209
|
- spec/lib/active_remote/serializers/json_spec.rb
|
@@ -238,9 +243,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
238
243
|
version: '0'
|
239
244
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
240
245
|
requirements:
|
241
|
-
- - "
|
246
|
+
- - ">"
|
242
247
|
- !ruby/object:Gem::Version
|
243
|
-
version:
|
248
|
+
version: 1.3.1
|
244
249
|
requirements: []
|
245
250
|
rubyforge_project:
|
246
251
|
rubygems_version: 2.2.1
|
@@ -256,8 +261,10 @@ test_files:
|
|
256
261
|
- spec/lib/active_remote/dsl_spec.rb
|
257
262
|
- spec/lib/active_remote/integration_spec.rb
|
258
263
|
- spec/lib/active_remote/persistence_spec.rb
|
264
|
+
- spec/lib/active_remote/primary_key_spec.rb
|
259
265
|
- spec/lib/active_remote/publication_spec.rb
|
260
266
|
- spec/lib/active_remote/rpc_spec.rb
|
267
|
+
- spec/lib/active_remote/scope_keys_spec.rb
|
261
268
|
- spec/lib/active_remote/search_spec.rb
|
262
269
|
- spec/lib/active_remote/serialization_spec.rb
|
263
270
|
- spec/lib/active_remote/serializers/json_spec.rb
|