restforce-db 3.4.0 → 3.5.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/lib/restforce/db/accumulator.rb +1 -1
- data/lib/restforce/db/cleaner.rb +50 -7
- data/lib/restforce/db/instances/active_record.rb +13 -0
- data/lib/restforce/db/instances/base.rb +2 -0
- data/lib/restforce/db/synchronizer.rb +3 -4
- data/lib/restforce/db/version.rb +1 -1
- data/test/cassettes/Restforce_DB_Cleaner/_run/given_a_synchronized_Salesforce_record/when_the_record_does_not_meet_the_mapping_conditions/drops_the_synchronized_database_record.yml +76 -38
- data/test/lib/restforce/db/instances/active_record_test.rb +8 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a09f48ae39e990498c4277c8c538ddefa6299c64
|
4
|
+
data.tar.gz: f908032e59d2f1fc53177e396e6d3166f5643b6d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7264171810bbe421b589db829948ebf027487958ebdf4d2b29db5ce18842e0bb1c05c16b2d1567522e916f8d85041a892a507e23661f77b4bbb83d5eac66df9c
|
7
|
+
data.tar.gz: 4a19e74fb51bf354a950c9c012995bf3b2b65053d9a7636fe147141587d9b78d2c4be1600db7ab2aaa17e405fdf0b73aabb88eac6518c2613a1ffac77301d654
|
data/lib/restforce/db/cleaner.rb
CHANGED
@@ -7,11 +7,6 @@ module Restforce
|
|
7
7
|
# for a specific mapping.
|
8
8
|
class Cleaner < Task
|
9
9
|
|
10
|
-
# Salesforce can take a few minutes to register record deletion. This
|
11
|
-
# buffer gives us a window of time (in seconds) to look back and see
|
12
|
-
# records which may not have been visible in previous runs.
|
13
|
-
DELETION_READ_BUFFER = 3 * 60
|
14
|
-
|
15
10
|
# Public: Run the database culling loop for this mapping.
|
16
11
|
#
|
17
12
|
# Returns nothing.
|
@@ -29,6 +24,11 @@ module Restforce
|
|
29
24
|
deleted_salesforce_ids + invalid_salesforce_ids
|
30
25
|
end
|
31
26
|
|
27
|
+
# Salesforce can take a few minutes to register record deletion. This
|
28
|
+
# buffer gives us a window of time (in seconds) to look back and see
|
29
|
+
# records which may not have been visible in previous runs.
|
30
|
+
DELETION_READ_BUFFER = 3 * 60
|
31
|
+
|
32
32
|
# Internal: Get the IDs of records which have been removed from Salesforce
|
33
33
|
# for this mapping within the DELETION_BUFFER for this run.
|
34
34
|
#
|
@@ -36,7 +36,7 @@ module Restforce
|
|
36
36
|
def deleted_salesforce_ids
|
37
37
|
return [] unless @runner.after
|
38
38
|
|
39
|
-
response =
|
39
|
+
response = DB.client.get_deleted_between(
|
40
40
|
@mapping.salesforce_model,
|
41
41
|
@runner.after - DELETION_READ_BUFFER,
|
42
42
|
@runner.before,
|
@@ -62,7 +62,50 @@ module Restforce
|
|
62
62
|
valid_ids = valid_salesforce_ids
|
63
63
|
all_ids = all_salesforce_ids
|
64
64
|
|
65
|
-
all_ids - valid_ids
|
65
|
+
invalid_ids = all_ids - valid_ids
|
66
|
+
DB.logger.debug "(REPORTED INVALID) #{@mapping.salesforce_model} #{invalid_ids.inspect}" if invalid_ids.any?
|
67
|
+
|
68
|
+
invalid_ids = confirmed_invalid_salesforce_ids(invalid_ids)
|
69
|
+
DB.logger.debug "(CONFIRMED INVALID) #{@mapping.salesforce_model} #{invalid_ids.inspect}" if invalid_ids.any?
|
70
|
+
|
71
|
+
invalid_ids
|
72
|
+
end
|
73
|
+
|
74
|
+
# In order to ensure that we don't generate any SOQL queries which are too
|
75
|
+
# long to send across the wire to Salesforce, we need to batch IDs for our
|
76
|
+
# queries. For a conservative cap of 8,000 characters per GET query, at 27
|
77
|
+
# encoded characters per supplied ID (18 characters and 3 three-character
|
78
|
+
# entities), 250 IDs gives us a buffer of around 1250 spare characters to
|
79
|
+
# work with for the rest of the URL and query string.
|
80
|
+
#
|
81
|
+
# In practice, there should rarely/never be this many invalidated records
|
82
|
+
# at once during a single worker run.
|
83
|
+
MAXIMUM_IDS_PER_QUERY = 250
|
84
|
+
|
85
|
+
# Internal: Get the IDs of records which have been proposed as invalid and
|
86
|
+
# do not in fact appear in response to a time-insensitive query with the
|
87
|
+
# requisite conditions applied.
|
88
|
+
#
|
89
|
+
# NOTE: This double-check step is necessary to prevent an inaccurate
|
90
|
+
# Salesforce server clock from sending records back in time and forcing
|
91
|
+
# them to show up in a query running after-the-fact.
|
92
|
+
#
|
93
|
+
# proposed_invalid_ids - An Array of String Salesforce IDs to test against
|
94
|
+
# the Salesforce server.
|
95
|
+
#
|
96
|
+
# Returns an Array of IDs.
|
97
|
+
def confirmed_invalid_salesforce_ids(proposed_invalid_ids)
|
98
|
+
proposed_invalid_ids.each_slice(MAXIMUM_IDS_PER_QUERY).inject([]) do |invalid_ids, ids|
|
99
|
+
# Get a subset of the proposed list of IDs that corresponds to
|
100
|
+
# records which are still valid for any parallel mapping.
|
101
|
+
valid_ids = parallel_mappings.flat_map do |mapping|
|
102
|
+
mapping.salesforce_record_type.all(
|
103
|
+
conditions: "Id in ('#{ids.join("','")}')",
|
104
|
+
).map(&:id)
|
105
|
+
end
|
106
|
+
|
107
|
+
invalid_ids + (ids - valid_ids)
|
108
|
+
end
|
66
109
|
end
|
67
110
|
|
68
111
|
# Internal: Get the IDs of all recently-modified Salesforce records
|
@@ -27,6 +27,19 @@ module Restforce
|
|
27
27
|
"#{@record_type}::#{@record.id}"
|
28
28
|
end
|
29
29
|
|
30
|
+
# Public: Update the instance with the passed attributes.
|
31
|
+
#
|
32
|
+
# attributes - A Hash mapping attribute names to values.
|
33
|
+
#
|
34
|
+
# Returns self.
|
35
|
+
# Raises if the update fails for any reason.
|
36
|
+
def update!(attributes)
|
37
|
+
record.assign_attributes(attributes)
|
38
|
+
return self unless record.changed?
|
39
|
+
|
40
|
+
super attributes
|
41
|
+
end
|
42
|
+
|
30
43
|
# Public: Get the time of the last update to this record.
|
31
44
|
#
|
32
45
|
# Returns a Time-compatible object.
|
@@ -24,11 +24,10 @@ module Restforce
|
|
24
24
|
next unless salesforce_model == @mapping.salesforce_model
|
25
25
|
|
26
26
|
database_instance = @mapping.database_record_type.find(id)
|
27
|
-
|
27
|
+
next unless database_instance && up_to_date?(database_instance, accumulator)
|
28
28
|
|
29
|
-
|
30
|
-
next unless up_to_date?(
|
31
|
-
next unless up_to_date?(salesforce_instance, accumulator)
|
29
|
+
salesforce_instance = @mapping.salesforce_record_type.find(id)
|
30
|
+
next unless salesforce_instance && up_to_date?(salesforce_instance, accumulator)
|
32
31
|
|
33
32
|
update(database_instance, accumulator)
|
34
33
|
update(salesforce_instance, accumulator)
|
data/lib/restforce/db/version.rb
CHANGED
@@ -21,10 +21,10 @@ http_interactions:
|
|
21
21
|
message: OK
|
22
22
|
headers:
|
23
23
|
Date:
|
24
|
-
-
|
24
|
+
- Mon, 10 Aug 2015 23:12:14 GMT
|
25
25
|
Set-Cookie:
|
26
|
-
- BrowserId=
|
27
|
-
|
26
|
+
- BrowserId=Pg-Z5TJfRuCW_RRgxG0QFA;Path=/;Domain=.salesforce.com;Expires=Fri,
|
27
|
+
09-Oct-2015 23:12:14 GMT
|
28
28
|
Expires:
|
29
29
|
- Thu, 01 Jan 1970 00:00:00 GMT
|
30
30
|
Pragma:
|
@@ -37,9 +37,9 @@ http_interactions:
|
|
37
37
|
- chunked
|
38
38
|
body:
|
39
39
|
encoding: ASCII-8BIT
|
40
|
-
string: '{"id":"https://login.salesforce.com/id/00D1a000000H3O9EAK/0051a000000UGT8AAO","issued_at":"
|
40
|
+
string: '{"id":"https://login.salesforce.com/id/00D1a000000H3O9EAK/0051a000000UGT8AAO","issued_at":"1439248334477","token_type":"Bearer","instance_url":"https://<host>","signature":"e4cOS0HElwf+ao+4hWid5SJeb94IV5IF4TkST5zoKEE=","access_token":"00D1a000000H3O9!AQ4AQOZyg3C2dr3XwY4i4F6ogWYIBdVRdnC5SyknsMY0h.CF2FS2DMP0opJyeJ5DzTPkrmxhtvtezkCw3bLk3Rrrdr_znuim"}'
|
41
41
|
http_version:
|
42
|
-
recorded_at:
|
42
|
+
recorded_at: Mon, 10 Aug 2015 23:12:15 GMT
|
43
43
|
- request:
|
44
44
|
method: post
|
45
45
|
uri: https://<host>/services/data/<api_version>/sobjects/CustomObject__c
|
@@ -53,7 +53,7 @@ http_interactions:
|
|
53
53
|
Content-Type:
|
54
54
|
- application/json
|
55
55
|
Authorization:
|
56
|
-
- OAuth 00D1a000000H3O9!
|
56
|
+
- OAuth 00D1a000000H3O9!AQ4AQOZyg3C2dr3XwY4i4F6ogWYIBdVRdnC5SyknsMY0h.CF2FS2DMP0opJyeJ5DzTPkrmxhtvtezkCw3bLk3Rrrdr_znuim
|
57
57
|
Accept-Encoding:
|
58
58
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
59
59
|
Accept:
|
@@ -64,25 +64,25 @@ http_interactions:
|
|
64
64
|
message: Created
|
65
65
|
headers:
|
66
66
|
Date:
|
67
|
-
-
|
67
|
+
- Mon, 10 Aug 2015 23:12:14 GMT
|
68
68
|
Set-Cookie:
|
69
|
-
- BrowserId=
|
70
|
-
|
69
|
+
- BrowserId=DbP3fP37Ta6T3kwByVNhXg;Path=/;Domain=.salesforce.com;Expires=Fri,
|
70
|
+
09-Oct-2015 23:12:14 GMT
|
71
71
|
Expires:
|
72
72
|
- Thu, 01 Jan 1970 00:00:00 GMT
|
73
73
|
Sforce-Limit-Info:
|
74
74
|
- api-usage=1/15000
|
75
75
|
Location:
|
76
|
-
- "/services/data/<api_version>/sobjects/CustomObject__c/
|
76
|
+
- "/services/data/<api_version>/sobjects/CustomObject__c/a001a000004fPl6AAE"
|
77
77
|
Content-Type:
|
78
78
|
- application/json;charset=UTF-8
|
79
79
|
Transfer-Encoding:
|
80
80
|
- chunked
|
81
81
|
body:
|
82
82
|
encoding: ASCII-8BIT
|
83
|
-
string: '{"id":"
|
83
|
+
string: '{"id":"a001a000004fPl6AAE","success":true,"errors":[]}'
|
84
84
|
http_version:
|
85
|
-
recorded_at:
|
85
|
+
recorded_at: Mon, 10 Aug 2015 23:12:15 GMT
|
86
86
|
- request:
|
87
87
|
method: get
|
88
88
|
uri: https://<host>/services/data/<api_version>/sobjects/CustomObject__c/describe
|
@@ -93,7 +93,7 @@ http_interactions:
|
|
93
93
|
User-Agent:
|
94
94
|
- Faraday v0.9.1
|
95
95
|
Authorization:
|
96
|
-
- OAuth 00D1a000000H3O9!
|
96
|
+
- OAuth 00D1a000000H3O9!AQ4AQOZyg3C2dr3XwY4i4F6ogWYIBdVRdnC5SyknsMY0h.CF2FS2DMP0opJyeJ5DzTPkrmxhtvtezkCw3bLk3Rrrdr_znuim
|
97
97
|
Accept-Encoding:
|
98
98
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
99
99
|
Accept:
|
@@ -104,14 +104,14 @@ http_interactions:
|
|
104
104
|
message: OK
|
105
105
|
headers:
|
106
106
|
Date:
|
107
|
-
-
|
107
|
+
- Mon, 10 Aug 2015 23:12:15 GMT
|
108
108
|
Set-Cookie:
|
109
|
-
- BrowserId=
|
110
|
-
|
109
|
+
- BrowserId=bYS82CrPQfGm5hUwmYw_eA;Path=/;Domain=.salesforce.com;Expires=Fri,
|
110
|
+
09-Oct-2015 23:12:15 GMT
|
111
111
|
Expires:
|
112
112
|
- Thu, 01 Jan 1970 00:00:00 GMT
|
113
113
|
Sforce-Limit-Info:
|
114
|
-
- api-usage=
|
114
|
+
- api-usage=1/15000
|
115
115
|
Org.eclipse.jetty.server.include.etag:
|
116
116
|
- aa7ee96f
|
117
117
|
Last-Modified:
|
@@ -135,7 +135,7 @@ http_interactions:
|
|
135
135
|
Modstamp","length":0,"name":"SystemModstamp","nameField":false,"namePointing":false,"nillable":false,"permissionable":false,"picklistValues":[],"precision":0,"referenceTo":[],"relationshipName":null,"relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"xsd:dateTime","sortable":true,"type":"datetime","unique":false,"updateable":false,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":765,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":true,"custom":true,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":false,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"externalId":false,"filterable":true,"groupable":true,"htmlFormatted":false,"idLookup":false,"inlineHelpText":null,"label":"Example
|
136
136
|
Field","length":255,"name":"Example_Field__c","nameField":false,"namePointing":false,"nillable":true,"permissionable":true,"picklistValues":[],"precision":0,"referenceTo":[],"relationshipName":null,"relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"xsd:string","sortable":true,"type":"string","unique":false,"updateable":true,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":18,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":true,"custom":true,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":false,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"externalId":false,"filterable":true,"groupable":true,"htmlFormatted":false,"idLookup":false,"inlineHelpText":null,"label":"Friend","length":18,"name":"Friend__c","nameField":false,"namePointing":false,"nillable":true,"permissionable":true,"picklistValues":[],"precision":0,"referenceTo":["Contact"],"relationshipName":"Friend__r","relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"tns:ID","sortable":true,"type":"reference","unique":false,"updateable":true,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":0,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":true,"custom":true,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":true,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"externalId":false,"filterable":true,"groupable":true,"htmlFormatted":false,"idLookup":false,"inlineHelpText":null,"label":"Visible","length":0,"name":"Visible__c","nameField":false,"namePointing":false,"nillable":false,"permissionable":true,"picklistValues":[],"precision":0,"referenceTo":[],"relationshipName":null,"relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"xsd:boolean","sortable":true,"type":"boolean","unique":false,"updateable":true,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":108,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":true,"custom":true,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":false,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"externalId":true,"filterable":true,"groupable":true,"htmlFormatted":false,"idLookup":true,"inlineHelpText":null,"label":"SynchronizationID","length":36,"name":"SynchronizationId__c","nameField":false,"namePointing":false,"nillable":true,"permissionable":true,"picklistValues":[],"precision":0,"referenceTo":[],"relationshipName":null,"relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"xsd:string","sortable":true,"type":"string","unique":false,"updateable":true,"writeRequiresMasterRead":false}],"keyPrefix":"a00","label":"CustomObject","labelPlural":"CustomObjects","layoutable":true,"listviewable":null,"lookupLayoutable":null,"mergeable":false,"name":"CustomObject__c","queryable":true,"recordTypeInfos":[{"available":true,"defaultRecordTypeMapping":true,"name":"Master","recordTypeId":"012000000000000AAA","urls":{"layout":"/services/data/<api_version>/sobjects/CustomObject__c/describe/layouts/012000000000000AAA"}}],"replicateable":true,"retrieveable":true,"searchLayoutable":true,"searchable":true,"triggerable":true,"undeletable":true,"updateable":true,"urls":{"uiEditTemplate":"https://<host>/{ID}/e","sobject":"/services/data/<api_version>/sobjects/CustomObject__c","quickActions":"/services/data/<api_version>/sobjects/CustomObject__c/quickActions","uiDetailTemplate":"https://<host>/{ID}","describe":"/services/data/<api_version>/sobjects/CustomObject__c/describe","rowTemplate":"/services/data/<api_version>/sobjects/CustomObject__c/{ID}","layouts":"/services/data/<api_version>/sobjects/CustomObject__c/describe/layouts","compactLayouts":"/services/data/<api_version>/sobjects/CustomObject__c/describe/compactLayouts","uiNewRecord":"https://<host>/a00/e"}}'
|
137
137
|
http_version:
|
138
|
-
recorded_at:
|
138
|
+
recorded_at: Mon, 10 Aug 2015 23:12:16 GMT
|
139
139
|
- request:
|
140
140
|
method: get
|
141
141
|
uri: https://<host>/services/data/<api_version>/query?q=select%20Id,%20SynchronizationId__c,%20SystemModstamp,%20LastModifiedById,%20Name,%20Example_Field__c%20from%20CustomObject__c%20where%20Name%20!=%20%27Are%20you%20going%20to%20Scarborough%20Fair?%27
|
@@ -146,7 +146,7 @@ http_interactions:
|
|
146
146
|
User-Agent:
|
147
147
|
- Faraday v0.9.1
|
148
148
|
Authorization:
|
149
|
-
- OAuth 00D1a000000H3O9!
|
149
|
+
- OAuth 00D1a000000H3O9!AQ4AQOZyg3C2dr3XwY4i4F6ogWYIBdVRdnC5SyknsMY0h.CF2FS2DMP0opJyeJ5DzTPkrmxhtvtezkCw3bLk3Rrrdr_znuim
|
150
150
|
Accept-Encoding:
|
151
151
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
152
152
|
Accept:
|
@@ -157,14 +157,14 @@ http_interactions:
|
|
157
157
|
message: OK
|
158
158
|
headers:
|
159
159
|
Date:
|
160
|
-
-
|
160
|
+
- Mon, 10 Aug 2015 23:12:16 GMT
|
161
161
|
Set-Cookie:
|
162
|
-
- BrowserId=
|
163
|
-
|
162
|
+
- BrowserId=calRGewTRle9zQ4W8ms3ig;Path=/;Domain=.salesforce.com;Expires=Fri,
|
163
|
+
09-Oct-2015 23:12:16 GMT
|
164
164
|
Expires:
|
165
165
|
- Thu, 01 Jan 1970 00:00:00 GMT
|
166
166
|
Sforce-Limit-Info:
|
167
|
-
- api-usage=
|
167
|
+
- api-usage=1/15000
|
168
168
|
Content-Type:
|
169
169
|
- application/json;charset=UTF-8
|
170
170
|
Transfer-Encoding:
|
@@ -173,7 +173,7 @@ http_interactions:
|
|
173
173
|
encoding: ASCII-8BIT
|
174
174
|
string: '{"totalSize":0,"done":true,"records":[]}'
|
175
175
|
http_version:
|
176
|
-
recorded_at:
|
176
|
+
recorded_at: Mon, 10 Aug 2015 23:12:16 GMT
|
177
177
|
- request:
|
178
178
|
method: get
|
179
179
|
uri: https://<host>/services/data/<api_version>/query?q=select%20Id,%20SynchronizationId__c,%20SystemModstamp,%20LastModifiedById,%20Name,%20Example_Field__c%20from%20CustomObject__c
|
@@ -184,7 +184,7 @@ http_interactions:
|
|
184
184
|
User-Agent:
|
185
185
|
- Faraday v0.9.1
|
186
186
|
Authorization:
|
187
|
-
- OAuth 00D1a000000H3O9!
|
187
|
+
- OAuth 00D1a000000H3O9!AQ4AQOZyg3C2dr3XwY4i4F6ogWYIBdVRdnC5SyknsMY0h.CF2FS2DMP0opJyeJ5DzTPkrmxhtvtezkCw3bLk3Rrrdr_znuim
|
188
188
|
Accept-Encoding:
|
189
189
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
190
190
|
Accept:
|
@@ -195,28 +195,66 @@ http_interactions:
|
|
195
195
|
message: OK
|
196
196
|
headers:
|
197
197
|
Date:
|
198
|
-
-
|
198
|
+
- Mon, 10 Aug 2015 23:12:16 GMT
|
199
199
|
Set-Cookie:
|
200
|
-
- BrowserId=
|
201
|
-
|
200
|
+
- BrowserId=AH6hZ-SPQEWVReahwb188g;Path=/;Domain=.salesforce.com;Expires=Fri,
|
201
|
+
09-Oct-2015 23:12:16 GMT
|
202
202
|
Expires:
|
203
203
|
- Thu, 01 Jan 1970 00:00:00 GMT
|
204
204
|
Sforce-Limit-Info:
|
205
|
-
- api-usage=
|
205
|
+
- api-usage=1/15000
|
206
206
|
Content-Type:
|
207
207
|
- application/json;charset=UTF-8
|
208
208
|
Transfer-Encoding:
|
209
209
|
- chunked
|
210
210
|
body:
|
211
211
|
encoding: ASCII-8BIT
|
212
|
-
string: '{"totalSize":1,"done":true,"records":[{"attributes":{"type":"CustomObject__c","url":"/services/data/<api_version>/sobjects/CustomObject__c/
|
212
|
+
string: '{"totalSize":1,"done":true,"records":[{"attributes":{"type":"CustomObject__c","url":"/services/data/<api_version>/sobjects/CustomObject__c/a001a000004fPl6AAE"},"Id":"a001a000004fPl6AAE","SynchronizationId__c":null,"SystemModstamp":"2015-08-10T23:12:14.000+0000","LastModifiedById":"0051a000000UGT8AAO","Name":"Are
|
213
213
|
you going to Scarborough Fair?","Example_Field__c":"Parsley, Sage, Rosemary,
|
214
214
|
and Thyme."}]}'
|
215
215
|
http_version:
|
216
|
-
recorded_at:
|
216
|
+
recorded_at: Mon, 10 Aug 2015 23:12:16 GMT
|
217
|
+
- request:
|
218
|
+
method: get
|
219
|
+
uri: https://<host>/services/data/<api_version>/query?q=select%20Id,%20SynchronizationId__c,%20SystemModstamp,%20LastModifiedById,%20Name,%20Example_Field__c%20from%20CustomObject__c%20where%20Id%20in%20(%27a001a000004fPl6AAE%27)%20and%20Name%20!=%20%27Are%20you%20going%20to%20Scarborough%20Fair?%27
|
220
|
+
body:
|
221
|
+
encoding: US-ASCII
|
222
|
+
string: ''
|
223
|
+
headers:
|
224
|
+
User-Agent:
|
225
|
+
- Faraday v0.9.1
|
226
|
+
Authorization:
|
227
|
+
- OAuth 00D1a000000H3O9!AQ4AQOZyg3C2dr3XwY4i4F6ogWYIBdVRdnC5SyknsMY0h.CF2FS2DMP0opJyeJ5DzTPkrmxhtvtezkCw3bLk3Rrrdr_znuim
|
228
|
+
Accept-Encoding:
|
229
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
230
|
+
Accept:
|
231
|
+
- "*/*"
|
232
|
+
response:
|
233
|
+
status:
|
234
|
+
code: 200
|
235
|
+
message: OK
|
236
|
+
headers:
|
237
|
+
Date:
|
238
|
+
- Mon, 10 Aug 2015 23:12:16 GMT
|
239
|
+
Set-Cookie:
|
240
|
+
- BrowserId=GJp8r-GMS9-JZT24SfJ-Uw;Path=/;Domain=.salesforce.com;Expires=Fri,
|
241
|
+
09-Oct-2015 23:12:16 GMT
|
242
|
+
Expires:
|
243
|
+
- Thu, 01 Jan 1970 00:00:00 GMT
|
244
|
+
Sforce-Limit-Info:
|
245
|
+
- api-usage=1/15000
|
246
|
+
Content-Type:
|
247
|
+
- application/json;charset=UTF-8
|
248
|
+
Transfer-Encoding:
|
249
|
+
- chunked
|
250
|
+
body:
|
251
|
+
encoding: ASCII-8BIT
|
252
|
+
string: '{"totalSize":0,"done":true,"records":[]}'
|
253
|
+
http_version:
|
254
|
+
recorded_at: Mon, 10 Aug 2015 23:12:17 GMT
|
217
255
|
- request:
|
218
256
|
method: delete
|
219
|
-
uri: https://<host>/services/data/<api_version>/sobjects/CustomObject__c/
|
257
|
+
uri: https://<host>/services/data/<api_version>/sobjects/CustomObject__c/a001a000004fPl6AAE
|
220
258
|
body:
|
221
259
|
encoding: US-ASCII
|
222
260
|
string: ''
|
@@ -224,7 +262,7 @@ http_interactions:
|
|
224
262
|
User-Agent:
|
225
263
|
- Faraday v0.9.1
|
226
264
|
Authorization:
|
227
|
-
- OAuth 00D1a000000H3O9!
|
265
|
+
- OAuth 00D1a000000H3O9!AQ4AQOZyg3C2dr3XwY4i4F6ogWYIBdVRdnC5SyknsMY0h.CF2FS2DMP0opJyeJ5DzTPkrmxhtvtezkCw3bLk3Rrrdr_znuim
|
228
266
|
Accept-Encoding:
|
229
267
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
230
268
|
Accept:
|
@@ -235,17 +273,17 @@ http_interactions:
|
|
235
273
|
message: No Content
|
236
274
|
headers:
|
237
275
|
Date:
|
238
|
-
-
|
276
|
+
- Mon, 10 Aug 2015 23:12:16 GMT
|
239
277
|
Set-Cookie:
|
240
|
-
- BrowserId=
|
241
|
-
|
278
|
+
- BrowserId=FT_S2vowR0y2vled5dSwlA;Path=/;Domain=.salesforce.com;Expires=Fri,
|
279
|
+
09-Oct-2015 23:12:16 GMT
|
242
280
|
Expires:
|
243
281
|
- Thu, 01 Jan 1970 00:00:00 GMT
|
244
282
|
Sforce-Limit-Info:
|
245
|
-
- api-usage=
|
283
|
+
- api-usage=1/15000
|
246
284
|
body:
|
247
285
|
encoding: UTF-8
|
248
286
|
string: ''
|
249
287
|
http_version:
|
250
|
-
recorded_at:
|
288
|
+
recorded_at: Mon, 10 Aug 2015 23:12:18 GMT
|
251
289
|
recorded_with: VCR 2.9.3
|
@@ -56,6 +56,14 @@ describe Restforce::DB::Instances::ActiveRecord do
|
|
56
56
|
it "bumps the record's synchronized_at timestamp" do
|
57
57
|
expect(record.reload.synchronized_at).to_not_be_nil
|
58
58
|
end
|
59
|
+
|
60
|
+
describe "when the passed attributes match the current values" do
|
61
|
+
let(:text) { record.example }
|
62
|
+
|
63
|
+
it "does not bump the record's synchronized_at timestamp" do
|
64
|
+
expect(record.reload.synchronized_at).to_be_nil
|
65
|
+
end
|
66
|
+
end
|
59
67
|
end
|
60
68
|
|
61
69
|
describe "#updated_internally?" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: restforce-db
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Horner
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|