active_remote 7.0.0 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/{ruby.yml → main.yml} +15 -6
- data/.rubocop.yml +2 -27
- data/.standard.yml +2 -0
- data/CHANGES.md +190 -53
- data/README.md +6 -5
- data/Rakefile +2 -5
- data/active_remote.gemspec +17 -20
- data/lib/active_remote/association.rb +3 -3
- data/lib/active_remote/base.rb +12 -12
- data/lib/active_remote/dirty.rb +2 -2
- data/lib/active_remote/dsl.rb +14 -14
- data/lib/active_remote/integration.rb +7 -7
- data/lib/active_remote/persistence.rb +7 -7
- data/lib/active_remote/query_attributes.rb +3 -3
- data/lib/active_remote/rpc.rb +2 -3
- data/lib/active_remote/rpc_adapters/protobuf_adapter.rb +2 -2
- data/lib/active_remote/search.rb +25 -8
- data/lib/active_remote/serializers/protobuf.rb +10 -9
- data/lib/active_remote/validations.rb +2 -2
- data/lib/active_remote/version.rb +1 -1
- data/spec/lib/active_remote/association_spec.rb +25 -25
- data/spec/lib/active_remote/dirty_spec.rb +8 -8
- data/spec/lib/active_remote/dsl_spec.rb +7 -7
- data/spec/lib/active_remote/errors_spec.rb +2 -2
- data/spec/lib/active_remote/integration_spec.rb +2 -2
- data/spec/lib/active_remote/persistence_spec.rb +34 -34
- data/spec/lib/active_remote/primary_key_spec.rb +2 -2
- data/spec/lib/active_remote/rpc_adapters/protobuf_adapter_spec.rb +1 -1
- data/spec/lib/active_remote/rpc_spec.rb +13 -15
- data/spec/lib/active_remote/scope_keys_spec.rb +2 -2
- data/spec/lib/active_remote/search_spec.rb +31 -4
- data/spec/lib/active_remote/serialization_spec.rb +2 -2
- data/spec/lib/active_remote/serializers/protobuf_spec.rb +7 -7
- data/spec/lib/active_remote/validations_spec.rb +1 -1
- data/spec/support/models/author.rb +3 -3
- data/spec/support/models/category.rb +3 -3
- data/spec/support/models/default_author.rb +3 -3
- data/spec/support/models/post.rb +4 -4
- data/spec/support/protobuf/author.pb.rb +5 -11
- data/spec/support/protobuf/category.pb.rb +5 -11
- data/spec/support/protobuf/error.pb.rb +1 -6
- data/spec/support/protobuf/post.pb.rb +6 -12
- data/spec/support/protobuf/serializer.pb.rb +1 -8
- data/spec/support/protobuf/tag.pb.rb +5 -11
- metadata +29 -80
- data/.travis.yml +0 -5
@@ -9,7 +9,7 @@ module ActiveRemote
|
|
9
9
|
# versioning is off. Accepts any of the symbols in <tt>Time::DATE_FORMATS</tt>.
|
10
10
|
#
|
11
11
|
# This is +:usec+, by default.
|
12
|
-
class_attribute :cache_timestamp_format, :
|
12
|
+
class_attribute :cache_timestamp_format, instance_writer: false, default: :usec
|
13
13
|
|
14
14
|
##
|
15
15
|
# :singleton-method:
|
@@ -17,7 +17,7 @@ module ActiveRemote
|
|
17
17
|
# by a changing version in the #cache_version method.
|
18
18
|
#
|
19
19
|
# This is +false+, by default until Rails 6.0.
|
20
|
-
class_attribute :cache_versioning, :
|
20
|
+
class_attribute :cache_versioning, instance_writer: false, default: false
|
21
21
|
end
|
22
22
|
|
23
23
|
# Returns a +String+, which Action Pack uses for constructing a URL to this
|
@@ -60,10 +60,10 @@ module ActiveRemote
|
|
60
60
|
# Person.find(5).cache_key # => "people/5-20071224150000" (updated_at available)
|
61
61
|
#
|
62
62
|
def cache_key
|
63
|
-
|
64
|
-
|
63
|
+
if new_record?
|
64
|
+
|
65
65
|
"#{model_name.cache_key}/new"
|
66
|
-
|
66
|
+
elsif ::ActiveRemote.config.default_cache_key_updated_at? && (respond_to?(:[]) && (timestamp = self["updated_at"]))
|
67
67
|
timestamp = timestamp.utc.to_fs(self.class.cache_timestamp_format)
|
68
68
|
"#{model_name.cache_key}/#{send(primary_key)}-#{timestamp}"
|
69
69
|
else
|
@@ -123,8 +123,8 @@ module ActiveRemote
|
|
123
123
|
else
|
124
124
|
define_method :to_param do
|
125
125
|
if (default = super()) &&
|
126
|
-
|
127
|
-
|
126
|
+
(result = send(method_name).to_s).present? &&
|
127
|
+
(param = result.squish.parameterize.truncate(20, separator: /-/, omission: "")).present?
|
128
128
|
"#{default}-#{param}"
|
129
129
|
else
|
130
130
|
default
|
@@ -28,7 +28,7 @@ module ActiveRemote
|
|
28
28
|
# The newly created record is returned if it was successfully saved or not.
|
29
29
|
#
|
30
30
|
def create(attributes)
|
31
|
-
remote =
|
31
|
+
remote = new(attributes)
|
32
32
|
remote.save
|
33
33
|
remote
|
34
34
|
end
|
@@ -40,7 +40,7 @@ module ActiveRemote
|
|
40
40
|
# an ActiveRemote::RemoteRecordNotSaved exception.
|
41
41
|
#
|
42
42
|
def create!(attributes)
|
43
|
-
remote =
|
43
|
+
remote = new(attributes)
|
44
44
|
remote.save!
|
45
45
|
remote
|
46
46
|
end
|
@@ -49,8 +49,8 @@ module ActiveRemote
|
|
49
49
|
# when retrieving records that already exist, so @new_record is set to false.
|
50
50
|
#
|
51
51
|
def instantiate(new_attributes = {}, options = {})
|
52
|
-
attributes =
|
53
|
-
new_object =
|
52
|
+
attributes = build_from_rpc(new_attributes)
|
53
|
+
new_object = allocate.init_with(attributes)
|
54
54
|
new_object.readonly! if options[:readonly]
|
55
55
|
|
56
56
|
new_object
|
@@ -220,8 +220,8 @@ module ActiveRemote
|
|
220
220
|
raise ReadOnlyRemoteRecord if readonly?
|
221
221
|
|
222
222
|
name = name.to_s
|
223
|
-
send("#{name}=", value)
|
224
|
-
save(:
|
223
|
+
send(:"#{name}=", value)
|
224
|
+
save(validate: false)
|
225
225
|
end
|
226
226
|
|
227
227
|
# Updates the attributes of the remote record from the passed-in hash and
|
@@ -244,7 +244,7 @@ module ActiveRemote
|
|
244
244
|
end
|
245
245
|
alias_method :update!, :update_attributes!
|
246
246
|
|
247
|
-
|
247
|
+
private
|
248
248
|
|
249
249
|
# Handles creating a remote object and serializing it's attributes and
|
250
250
|
# errors from the response.
|
@@ -25,14 +25,14 @@ module ActiveRemote
|
|
25
25
|
value = self[attr_name]
|
26
26
|
|
27
27
|
case value
|
28
|
-
when true
|
29
|
-
when false, nil
|
28
|
+
when true then true
|
29
|
+
when false, nil then false
|
30
30
|
else
|
31
31
|
value.present?
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
|
35
|
+
private
|
36
36
|
|
37
37
|
def attribute?(attribute_name)
|
38
38
|
query_attribute(attribute_name)
|
data/lib/active_remote/rpc.rb
CHANGED
@@ -11,13 +11,12 @@ module ActiveRemote
|
|
11
11
|
|
12
12
|
module ClassMethods
|
13
13
|
# Builds an attribute hash that be assigned directly
|
14
|
-
# to an object from an
|
14
|
+
# to an object from an RPC response
|
15
15
|
def build_from_rpc(values)
|
16
16
|
values = values.stringify_keys
|
17
17
|
|
18
|
-
attribute_names.
|
18
|
+
attribute_names.each_with_object(_default_attributes.deep_dup) do |name, attributes|
|
19
19
|
attributes.write_from_database(name, values[name])
|
20
|
-
attributes
|
21
20
|
end
|
22
21
|
end
|
23
22
|
|
@@ -8,7 +8,7 @@ module ActiveRemote
|
|
8
8
|
attr_reader :service_class
|
9
9
|
attr_accessor :endpoints
|
10
10
|
|
11
|
-
delegate :client, :
|
11
|
+
delegate :client, to: :service_class
|
12
12
|
|
13
13
|
##
|
14
14
|
# Constructor!
|
@@ -41,7 +41,7 @@ module ActiveRemote
|
|
41
41
|
response
|
42
42
|
end
|
43
43
|
|
44
|
-
|
44
|
+
private
|
45
45
|
|
46
46
|
# Return a protobuf request object for the given rpc request.
|
47
47
|
#
|
data/lib/active_remote/search.rb
CHANGED
@@ -25,12 +25,29 @@ module ActiveRemote
|
|
25
25
|
# Tag.find(Generic::Remote::TagRequest.new(:guid => 'foo'))
|
26
26
|
#
|
27
27
|
def find(args)
|
28
|
-
remote =
|
28
|
+
remote = search(args).first
|
29
29
|
raise RemoteRecordNotFound, self if remote.nil?
|
30
30
|
|
31
31
|
remote
|
32
32
|
end
|
33
33
|
|
34
|
+
# Tries to load the first record; if it fails, returns nil.
|
35
|
+
#
|
36
|
+
# ====Examples
|
37
|
+
#
|
38
|
+
# # A single hash
|
39
|
+
# Tag.find_by(:guid => 'foo')
|
40
|
+
#
|
41
|
+
# # Active remote object
|
42
|
+
# Tag.find_by(Tag.new(:guid => 'foo'))
|
43
|
+
#
|
44
|
+
# # Protobuf object
|
45
|
+
# Tag.find_by(Generic::Remote::TagRequest.new(:guid => 'foo'))
|
46
|
+
#
|
47
|
+
def find_by(args)
|
48
|
+
search(args).first
|
49
|
+
end
|
50
|
+
|
34
51
|
# Tries to load the first record; if it fails, then create is called
|
35
52
|
# with the same arguments.
|
36
53
|
#
|
@@ -43,8 +60,8 @@ module ActiveRemote
|
|
43
60
|
# Tag.first_or_create(Generic::Remote::TagRequest.new(:name => 'foo'))
|
44
61
|
#
|
45
62
|
def first_or_create(attributes)
|
46
|
-
remote =
|
47
|
-
remote ||=
|
63
|
+
remote = search(attributes).first
|
64
|
+
remote ||= create(attributes)
|
48
65
|
remote
|
49
66
|
end
|
50
67
|
|
@@ -52,8 +69,8 @@ module ActiveRemote
|
|
52
69
|
# with the same arguments.
|
53
70
|
#
|
54
71
|
def first_or_create!(attributes)
|
55
|
-
remote =
|
56
|
-
remote ||=
|
72
|
+
remote = search(attributes).first
|
73
|
+
remote ||= create!(attributes)
|
57
74
|
remote
|
58
75
|
end
|
59
76
|
|
@@ -69,8 +86,8 @@ module ActiveRemote
|
|
69
86
|
# Tag.first_or_initialize(Generic::Remote::TagRequest.new(:name => 'foo'))
|
70
87
|
#
|
71
88
|
def first_or_initialize(attributes)
|
72
|
-
remote =
|
73
|
-
remote ||=
|
89
|
+
remote = search(attributes).first
|
90
|
+
remote ||= new(attributes)
|
74
91
|
remote
|
75
92
|
end
|
76
93
|
|
@@ -117,7 +134,7 @@ module ActiveRemote
|
|
117
134
|
#
|
118
135
|
def reload
|
119
136
|
fresh_object = self.class.find(scope_key_hash)
|
120
|
-
@attributes = fresh_object.instance_variable_get(
|
137
|
+
@attributes = fresh_object.instance_variable_get(:@attributes)
|
121
138
|
self
|
122
139
|
end
|
123
140
|
end
|
@@ -50,7 +50,7 @@ module ActiveRemote
|
|
50
50
|
# Class methods
|
51
51
|
#
|
52
52
|
def self.from_attributes(message_class, attributes)
|
53
|
-
fields =
|
53
|
+
fields = new(message_class, attributes)
|
54
54
|
fields.from_attributes
|
55
55
|
end
|
56
56
|
|
@@ -58,12 +58,11 @@ module ActiveRemote
|
|
58
58
|
# Instance methods
|
59
59
|
#
|
60
60
|
def from_attributes
|
61
|
-
attributes.
|
61
|
+
attributes.each_with_object({}) do |(key, value), hash|
|
62
62
|
field = message_class.get_field(key, true) # Check extension fields, too
|
63
63
|
value = Field.from_attribute(field, value) if field
|
64
64
|
|
65
65
|
hash[key] = value
|
66
|
-
hash
|
67
66
|
end
|
68
67
|
end
|
69
68
|
end
|
@@ -83,7 +82,7 @@ module ActiveRemote
|
|
83
82
|
# Class methods
|
84
83
|
#
|
85
84
|
def self.from_attribute(field, value)
|
86
|
-
field =
|
85
|
+
field = new(field, value)
|
87
86
|
field.from_attribute
|
88
87
|
end
|
89
88
|
|
@@ -91,19 +90,21 @@ module ActiveRemote
|
|
91
90
|
# Instance methods
|
92
91
|
#
|
93
92
|
def from_attribute
|
94
|
-
|
95
|
-
|
93
|
+
if field.repeated_message?
|
94
|
+
|
96
95
|
repeated_message_value
|
97
|
-
|
96
|
+
elsif field.message?
|
97
|
+
|
98
98
|
message_value
|
99
|
-
|
99
|
+
elsif field.repeated?
|
100
|
+
|
100
101
|
repeated_value.map { |value| cast(value) }
|
101
102
|
else
|
102
103
|
cast_value
|
103
104
|
end
|
104
105
|
end
|
105
106
|
|
106
|
-
|
107
|
+
private
|
107
108
|
|
108
109
|
def cast(value)
|
109
110
|
type.cast(value)
|
@@ -45,13 +45,13 @@ module ActiveRemote
|
|
45
45
|
#
|
46
46
|
def valid?(context = nil)
|
47
47
|
context ||= (new_record? ? :create : :update)
|
48
|
-
output = super
|
48
|
+
output = super
|
49
49
|
errors.empty? && output
|
50
50
|
end
|
51
51
|
|
52
52
|
alias_method :validate, :valid?
|
53
53
|
|
54
|
-
|
54
|
+
protected
|
55
55
|
|
56
56
|
def raise_validation_error
|
57
57
|
fail ActiveRemote::RemoteRecordInvalid, self
|
@@ -9,18 +9,18 @@ describe ActiveRemote::Association do
|
|
9
9
|
let(:author_guid) { "AUT-123" }
|
10
10
|
let(:user_guid) { "USR-123" }
|
11
11
|
let(:default_category_guid) { "CAT-123" }
|
12
|
-
subject { Post.new(:
|
12
|
+
subject { Post.new(author_guid: author_guid, user_guid: user_guid) }
|
13
13
|
|
14
14
|
it { is_expected.to respond_to(:author) }
|
15
15
|
it { is_expected.to respond_to(:author=) }
|
16
16
|
|
17
17
|
it "searches the associated model for a single record" do
|
18
|
-
expect(Author).to receive(:search).with({:
|
18
|
+
expect(Author).to receive(:search).with({guid: subject.author_guid}).and_return(records)
|
19
19
|
expect(subject.author).to eq record
|
20
20
|
end
|
21
21
|
|
22
22
|
it "memoizes the result record" do
|
23
|
-
expect(Author).to receive(:search).once.with({:
|
23
|
+
expect(Author).to receive(:search).once.with({guid: subject.author_guid}).and_return(records)
|
24
24
|
3.times { expect(subject.author).to eq record }
|
25
25
|
end
|
26
26
|
|
@@ -34,7 +34,7 @@ describe ActiveRemote::Association do
|
|
34
34
|
|
35
35
|
context "when the search is empty" do
|
36
36
|
it "returns a nil" do
|
37
|
-
expect(Author).to receive(:search).with({:
|
37
|
+
expect(Author).to receive(:search).with({guid: subject.author_guid}).and_return([])
|
38
38
|
expect(subject.author).to be_nil
|
39
39
|
end
|
40
40
|
end
|
@@ -43,7 +43,7 @@ describe ActiveRemote::Association do
|
|
43
43
|
it { is_expected.to respond_to(:user) }
|
44
44
|
|
45
45
|
it "searches the associated model for multiple records" do
|
46
|
-
expect(Author).to receive(:search).with({:
|
46
|
+
expect(Author).to receive(:search).with({guid: subject.author_guid, user_guid: subject.user_guid}).and_return(records)
|
47
47
|
expect(subject.user).to eq(record)
|
48
48
|
end
|
49
49
|
|
@@ -68,16 +68,16 @@ describe ActiveRemote::Association do
|
|
68
68
|
context "specific association with class name" do
|
69
69
|
let(:author_guid) { "AUT-456" }
|
70
70
|
|
71
|
-
subject { Post.new(:
|
71
|
+
subject { Post.new(author_guid: author_guid) }
|
72
72
|
it { is_expected.to respond_to(:coauthor) }
|
73
73
|
|
74
74
|
it "searches the associated model for a single record" do
|
75
|
-
expect(Author).to receive(:search).with({:
|
75
|
+
expect(Author).to receive(:search).with({guid: subject.author_guid}).and_return(records)
|
76
76
|
expect(subject.coauthor).to eq record
|
77
77
|
end
|
78
78
|
|
79
79
|
it "creates a setter method" do
|
80
|
-
author = Author.new(:
|
80
|
+
author = Author.new(guid: author_guid)
|
81
81
|
subject.coauthor = author
|
82
82
|
expect(subject.coauthor).to eq(author)
|
83
83
|
end
|
@@ -86,11 +86,11 @@ describe ActiveRemote::Association do
|
|
86
86
|
context "specific association with class name and foreign_key" do
|
87
87
|
let(:author_guid) { "AUT-456" }
|
88
88
|
|
89
|
-
subject { Post.new(:
|
89
|
+
subject { Post.new(bestseller_guid: author_guid) }
|
90
90
|
it { is_expected.to respond_to(:bestseller) }
|
91
91
|
|
92
92
|
it "searches the associated model for a single record" do
|
93
|
-
expect(Author).to receive(:search).with({:
|
93
|
+
expect(Author).to receive(:search).with({guid: subject.bestseller_guid}).and_return(records)
|
94
94
|
expect(subject.bestseller).to eq record
|
95
95
|
end
|
96
96
|
end
|
@@ -101,18 +101,18 @@ describe ActiveRemote::Association do
|
|
101
101
|
let(:guid) { "AUT-123" }
|
102
102
|
let(:user_guid) { "USR-123" }
|
103
103
|
|
104
|
-
subject { Author.new(:
|
104
|
+
subject { Author.new(guid: guid, user_guid: user_guid) }
|
105
105
|
|
106
106
|
it { is_expected.to respond_to(:posts) }
|
107
107
|
it { is_expected.to respond_to(:posts=) }
|
108
108
|
|
109
109
|
it "searches the associated model for all associated records" do
|
110
|
-
expect(Post).to receive(:search).with({:
|
110
|
+
expect(Post).to receive(:search).with({author_guid: subject.guid}).and_return(records)
|
111
111
|
expect(subject.posts).to eq records
|
112
112
|
end
|
113
113
|
|
114
114
|
it "memoizes the result record" do
|
115
|
-
expect(Post).to receive(:search).once.with({:
|
115
|
+
expect(Post).to receive(:search).once.with({author_guid: subject.guid}).and_return(records)
|
116
116
|
3.times { expect(subject.posts).to eq records }
|
117
117
|
end
|
118
118
|
|
@@ -126,7 +126,7 @@ describe ActiveRemote::Association do
|
|
126
126
|
|
127
127
|
context "when the search is empty" do
|
128
128
|
it "returns the empty set" do
|
129
|
-
expect(Post).to receive(:search).with({:
|
129
|
+
expect(Post).to receive(:search).with({author_guid: subject.guid}).and_return([])
|
130
130
|
expect(subject.posts).to be_empty
|
131
131
|
end
|
132
132
|
end
|
@@ -135,7 +135,7 @@ describe ActiveRemote::Association do
|
|
135
135
|
it { is_expected.to respond_to(:flagged_posts) }
|
136
136
|
|
137
137
|
it "searches the associated model for a single record" do
|
138
|
-
expect(Post).to receive(:search).with({:
|
138
|
+
expect(Post).to receive(:search).with({author_guid: subject.guid}).and_return([])
|
139
139
|
expect(subject.flagged_posts).to be_empty
|
140
140
|
end
|
141
141
|
end
|
@@ -144,7 +144,7 @@ describe ActiveRemote::Association do
|
|
144
144
|
it { is_expected.to respond_to(:bestseller_posts) }
|
145
145
|
|
146
146
|
it "searches the associated model for multiple record" do
|
147
|
-
expect(Post).to receive(:search).with({:
|
147
|
+
expect(Post).to receive(:search).with({bestseller_guid: subject.guid}).and_return(records)
|
148
148
|
expect(subject.bestseller_posts).to eq(records)
|
149
149
|
end
|
150
150
|
end
|
@@ -153,7 +153,7 @@ describe ActiveRemote::Association do
|
|
153
153
|
it { is_expected.to respond_to(:user_posts) }
|
154
154
|
|
155
155
|
it "searches the associated model for multiple records" do
|
156
|
-
expect(Post).to receive(:search).with({:
|
156
|
+
expect(Post).to receive(:search).with({author_guid: subject.guid, user_guid: subject.user_guid}).and_return(records)
|
157
157
|
expect(subject.user_posts).to eq(records)
|
158
158
|
end
|
159
159
|
|
@@ -180,8 +180,8 @@ describe ActiveRemote::Association do
|
|
180
180
|
let(:user_guid) { "USR-123" }
|
181
181
|
let(:category_attributes) {
|
182
182
|
{
|
183
|
-
:
|
184
|
-
:
|
183
|
+
guid: guid,
|
184
|
+
user_guid: user_guid
|
185
185
|
}
|
186
186
|
}
|
187
187
|
|
@@ -191,12 +191,12 @@ describe ActiveRemote::Association do
|
|
191
191
|
it { is_expected.to respond_to(:author=) }
|
192
192
|
|
193
193
|
it "searches the associated model for all associated records" do
|
194
|
-
expect(Author).to receive(:search).with({:
|
194
|
+
expect(Author).to receive(:search).with({category_guid: subject.guid}).and_return(records)
|
195
195
|
expect(subject.author).to eq record
|
196
196
|
end
|
197
197
|
|
198
198
|
it "memoizes the result record" do
|
199
|
-
expect(Author).to receive(:search).once.with({:
|
199
|
+
expect(Author).to receive(:search).once.with({category_guid: subject.guid}).and_return(records)
|
200
200
|
3.times { expect(subject.author).to eq record }
|
201
201
|
end
|
202
202
|
|
@@ -210,7 +210,7 @@ describe ActiveRemote::Association do
|
|
210
210
|
|
211
211
|
context "when the search is empty" do
|
212
212
|
it "returns a nil value" do
|
213
|
-
expect(Author).to receive(:search).with({:
|
213
|
+
expect(Author).to receive(:search).with({category_guid: subject.guid}).and_return([])
|
214
214
|
expect(subject.author).to be_nil
|
215
215
|
end
|
216
216
|
end
|
@@ -219,7 +219,7 @@ describe ActiveRemote::Association do
|
|
219
219
|
it { is_expected.to respond_to(:senior_author) }
|
220
220
|
|
221
221
|
it "searches the associated model for a single record" do
|
222
|
-
expect(Author).to receive(:search).with({:
|
222
|
+
expect(Author).to receive(:search).with({category_guid: subject.guid}).and_return(records)
|
223
223
|
expect(subject.senior_author).to eq record
|
224
224
|
end
|
225
225
|
|
@@ -232,7 +232,7 @@ describe ActiveRemote::Association do
|
|
232
232
|
it { is_expected.to respond_to(:primary_editor) }
|
233
233
|
|
234
234
|
it "searches the associated model for a single record" do
|
235
|
-
expect(Author).to receive(:search).with({:
|
235
|
+
expect(Author).to receive(:search).with({editor_guid: subject.guid}).and_return(records)
|
236
236
|
expect(subject.primary_editor).to eq record
|
237
237
|
end
|
238
238
|
end
|
@@ -241,7 +241,7 @@ describe ActiveRemote::Association do
|
|
241
241
|
it { is_expected.to respond_to(:chief_editor) }
|
242
242
|
|
243
243
|
it "searches the associated model for multiple records" do
|
244
|
-
expect(Author).to receive(:search).with({:
|
244
|
+
expect(Author).to receive(:search).with({chief_editor_guid: subject.guid, user_guid: subject.user_guid}).and_return(records)
|
245
245
|
expect(subject.chief_editor).to eq(record)
|
246
246
|
end
|
247
247
|
|
@@ -2,7 +2,7 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe ActiveRemote::Dirty do
|
4
4
|
context "when writing attributes through the setter" do
|
5
|
-
subject { Post.new(:
|
5
|
+
subject { Post.new(name: "foo") }
|
6
6
|
|
7
7
|
before do
|
8
8
|
subject.changes_applied
|
@@ -23,7 +23,7 @@ describe ActiveRemote::Dirty do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
context "when writing attributes directly" do
|
26
|
-
subject { Post.new(:
|
26
|
+
subject { Post.new(name: "foo") }
|
27
27
|
|
28
28
|
before do
|
29
29
|
subject.changes_applied
|
@@ -44,10 +44,10 @@ describe ActiveRemote::Dirty do
|
|
44
44
|
end
|
45
45
|
|
46
46
|
describe "#reload" do
|
47
|
-
subject { Post.new(:
|
47
|
+
subject { Post.new(name: "foo") }
|
48
48
|
|
49
49
|
before do
|
50
|
-
allow(Post).to receive(:find).and_return(Post.new(:
|
50
|
+
allow(Post).to receive(:find).and_return(Post.new(name: "foo"))
|
51
51
|
subject.reload
|
52
52
|
end
|
53
53
|
|
@@ -55,10 +55,10 @@ describe ActiveRemote::Dirty do
|
|
55
55
|
end
|
56
56
|
|
57
57
|
describe "#remote" do
|
58
|
-
let(:post) { Post.new(:
|
58
|
+
let(:post) { Post.new(name: "foo") }
|
59
59
|
|
60
60
|
it "clears changes information" do
|
61
|
-
allow(post).to receive(:remote_call).and_return(::Generic::Remote::Post.new(:
|
61
|
+
allow(post).to receive(:remote_call).and_return(::Generic::Remote::Post.new(name: "foo"))
|
62
62
|
expect { post.remote(:reload) }.to change { post.changed? }.to(false)
|
63
63
|
end
|
64
64
|
end
|
@@ -66,7 +66,7 @@ describe ActiveRemote::Dirty do
|
|
66
66
|
describe "#save" do
|
67
67
|
let!(:changes) { subject.changes }
|
68
68
|
|
69
|
-
subject { Post.new(:
|
69
|
+
subject { Post.new(name: "foo") }
|
70
70
|
|
71
71
|
before do
|
72
72
|
allow(subject).to receive(:create_or_update).and_return(true)
|
@@ -80,7 +80,7 @@ describe ActiveRemote::Dirty do
|
|
80
80
|
describe "#save!" do
|
81
81
|
let!(:changes) { subject.changes }
|
82
82
|
|
83
|
-
subject { Post.new(:
|
83
|
+
subject { Post.new(name: "foo") }
|
84
84
|
|
85
85
|
before do
|
86
86
|
allow(subject).to receive(:save).and_return(true)
|
@@ -24,19 +24,19 @@ describe ActiveRemote::DSL do
|
|
24
24
|
describe ".endpoints" do
|
25
25
|
it "has default values" do
|
26
26
|
expect(Tag.endpoints).to eq(
|
27
|
-
:
|
28
|
-
:
|
29
|
-
:
|
30
|
-
:
|
31
|
-
:
|
27
|
+
create: :create,
|
28
|
+
delete: :delete,
|
29
|
+
destroy: :destroy,
|
30
|
+
search: :search,
|
31
|
+
update: :update
|
32
32
|
)
|
33
33
|
end
|
34
34
|
|
35
35
|
context "given a new value for an endpoint" do
|
36
|
-
after { Tag.endpoints(:
|
36
|
+
after { Tag.endpoints(create: :create) }
|
37
37
|
|
38
38
|
it "overwrites default values" do
|
39
|
-
Tag.endpoints(:
|
39
|
+
Tag.endpoints(create: :register)
|
40
40
|
expect(Tag.endpoints[:create]).to eq(:register)
|
41
41
|
end
|
42
42
|
end
|
@@ -4,8 +4,8 @@ describe ::ActiveRemote::RemoteRecordNotSaved do
|
|
4
4
|
let(:record) { ::Tag.new }
|
5
5
|
|
6
6
|
before do
|
7
|
-
record.errors.add(:base, :invalid, :
|
8
|
-
record.errors.add(:base, :invalid, :
|
7
|
+
record.errors.add(:base, :invalid, message: "Some error one!")
|
8
|
+
record.errors.add(:base, :invalid, message: "Some error two!")
|
9
9
|
end
|
10
10
|
|
11
11
|
context "when an active remote record is used" do
|
@@ -2,7 +2,7 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe ::ActiveRemote::Integration do
|
4
4
|
let(:guid) { "GUID-derp" }
|
5
|
-
let(:tag) { ::Tag.new(:
|
5
|
+
let(:tag) { ::Tag.new(guid: guid) }
|
6
6
|
|
7
7
|
subject { tag }
|
8
8
|
|
@@ -46,7 +46,7 @@ describe ::ActiveRemote::Integration do
|
|
46
46
|
end
|
47
47
|
|
48
48
|
describe "#cache_key_with_version" do
|
49
|
-
let(:tag) { ::Tag.new(:
|
49
|
+
let(:tag) { ::Tag.new(guid: guid, updated_at: ::DateTime.current) }
|
50
50
|
|
51
51
|
specify { expect(subject).to respond_to(:cache_key_with_version) }
|
52
52
|
|