restforce-db 3.4.0 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d8a211ef8c000ea0d937a3a834aa54ba7c535161
4
- data.tar.gz: a5c4889b4640d94fa9759d11bb4a32036ac60f6c
3
+ metadata.gz: a09f48ae39e990498c4277c8c538ddefa6299c64
4
+ data.tar.gz: f908032e59d2f1fc53177e396e6d3166f5643b6d
5
5
  SHA512:
6
- metadata.gz: d37096768b104f436c00a4a0945d61c0918a3bf2bd67ce3310d30ebb2b4d45e9761d3b5384fab1cb0fd447da06e31b9ff4c689da8947816d2cac4b11a8d88984
7
- data.tar.gz: 9c206305857025aafeb0d93ec9e46366513a9da37e9eefab6a70b38058cf8ae4dfac24b4495d296be1c7820bee4f5c440dbab0354ae484852d82f8bbfec09620
6
+ metadata.gz: 7264171810bbe421b589db829948ebf027487958ebdf4d2b29db5ce18842e0bb1c05c16b2d1567522e916f8d85041a892a507e23661f77b4bbb83d5eac66df9c
7
+ data.tar.gz: 4a19e74fb51bf354a950c9c012995bf3b2b65053d9a7636fe147141587d9b78d2c4be1600db7ab2aaa17e405fdf0b73aabb88eac6518c2613a1ffac77301d654
@@ -26,7 +26,7 @@ module Restforce
26
26
  #
27
27
  # Returns a Hash.
28
28
  def attributes
29
- sort.reverse.inject({}) do |final, (_, changeset)|
29
+ @attributes ||= sort.reverse.inject({}) do |final, (_, changeset)|
30
30
  changeset.merge(final)
31
31
  end
32
32
  end
@@ -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 = Restforce::DB.client.get_deleted_between(
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.
@@ -28,6 +28,8 @@ module Restforce
28
28
  # Returns self.
29
29
  # Raises if the update fails for any reason.
30
30
  def update!(attributes)
31
+ return self if attributes.empty?
32
+
31
33
  record.update!(attributes)
32
34
  after_sync
33
35
  end
@@ -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
- salesforce_instance = @mapping.salesforce_record_type.find(id)
27
+ next unless database_instance && up_to_date?(database_instance, accumulator)
28
28
 
29
- next unless database_instance && salesforce_instance
30
- next unless up_to_date?(database_instance, accumulator)
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)
@@ -3,7 +3,7 @@ module Restforce
3
3
  # :nodoc:
4
4
  module DB
5
5
 
6
- VERSION = "3.4.0"
6
+ VERSION = "3.5.0"
7
7
 
8
8
  end
9
9
 
@@ -21,10 +21,10 @@ http_interactions:
21
21
  message: OK
22
22
  headers:
23
23
  Date:
24
- - Tue, 30 Jun 2015 21:55:32 GMT
24
+ - Mon, 10 Aug 2015 23:12:14 GMT
25
25
  Set-Cookie:
26
- - BrowserId=Y2SJeKuFTfiO2KtyZOaptw;Path=/;Domain=.salesforce.com;Expires=Sat,
27
- 29-Aug-2015 21:55:32 GMT
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":"1435701332803","token_type":"Bearer","instance_url":"https://<host>","signature":"Yc6LTL9u007ayCIy24S6mdU3tB+Q0Vyz3gaNFdH6x+U=","access_token":"00D1a000000H3O9!AQ4AQCuQcUjpJEq9lrBhPkqOA0H54X35lOGdjXK_f7u4TlJkBXW4P6Yb_svq0CVrLupjKXzW7Zx3KIj4GLQzCtt5g5Eot9U9"}'
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: Tue, 30 Jun 2015 21:55:32 GMT
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!AQ4AQCuQcUjpJEq9lrBhPkqOA0H54X35lOGdjXK_f7u4TlJkBXW4P6Yb_svq0CVrLupjKXzW7Zx3KIj4GLQzCtt5g5Eot9U9
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
- - Tue, 30 Jun 2015 21:55:33 GMT
67
+ - Mon, 10 Aug 2015 23:12:14 GMT
68
68
  Set-Cookie:
69
- - BrowserId=wN3HaF8WTJenosnVMKrkVA;Path=/;Domain=.salesforce.com;Expires=Sat,
70
- 29-Aug-2015 21:55:33 GMT
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/a001a00000306RbAAI"
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":"a001a00000306RbAAI","success":true,"errors":[]}'
83
+ string: '{"id":"a001a000004fPl6AAE","success":true,"errors":[]}'
84
84
  http_version:
85
- recorded_at: Tue, 30 Jun 2015 21:55:34 GMT
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!AQ4AQCuQcUjpJEq9lrBhPkqOA0H54X35lOGdjXK_f7u4TlJkBXW4P6Yb_svq0CVrLupjKXzW7Zx3KIj4GLQzCtt5g5Eot9U9
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
- - Tue, 30 Jun 2015 21:55:35 GMT
107
+ - Mon, 10 Aug 2015 23:12:15 GMT
108
108
  Set-Cookie:
109
- - BrowserId=bb5LcubLSu-cqFVoMA4yEw;Path=/;Domain=.salesforce.com;Expires=Sat,
110
- 29-Aug-2015 21:55:35 GMT
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=3/15000
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: Tue, 30 Jun 2015 21:55:35 GMT
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!AQ4AQCuQcUjpJEq9lrBhPkqOA0H54X35lOGdjXK_f7u4TlJkBXW4P6Yb_svq0CVrLupjKXzW7Zx3KIj4GLQzCtt5g5Eot9U9
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
- - Tue, 30 Jun 2015 21:55:36 GMT
160
+ - Mon, 10 Aug 2015 23:12:16 GMT
161
161
  Set-Cookie:
162
- - BrowserId=8pHtB1AMS62zQJtGv5OyyQ;Path=/;Domain=.salesforce.com;Expires=Sat,
163
- 29-Aug-2015 21:55:36 GMT
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=2/15000
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: Tue, 30 Jun 2015 21:55:36 GMT
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!AQ4AQCuQcUjpJEq9lrBhPkqOA0H54X35lOGdjXK_f7u4TlJkBXW4P6Yb_svq0CVrLupjKXzW7Zx3KIj4GLQzCtt5g5Eot9U9
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
- - Tue, 30 Jun 2015 21:55:37 GMT
198
+ - Mon, 10 Aug 2015 23:12:16 GMT
199
199
  Set-Cookie:
200
- - BrowserId=pOzD91n-T7C866-TqM4oMA;Path=/;Domain=.salesforce.com;Expires=Sat,
201
- 29-Aug-2015 21:55:37 GMT
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=3/15000
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/a001a00000306RbAAI"},"Id":"a001a00000306RbAAI","SynchronizationId__c":null,"SystemModstamp":"2015-06-30T21:55:34.000+0000","LastModifiedById":"0051a000000UGT8AAO","Name":"Are
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: Tue, 30 Jun 2015 21:55:37 GMT
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/a001a00000306RbAAI
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!AQ4AQCuQcUjpJEq9lrBhPkqOA0H54X35lOGdjXK_f7u4TlJkBXW4P6Yb_svq0CVrLupjKXzW7Zx3KIj4GLQzCtt5g5Eot9U9
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
- - Tue, 30 Jun 2015 21:55:38 GMT
276
+ - Mon, 10 Aug 2015 23:12:16 GMT
239
277
  Set-Cookie:
240
- - BrowserId=RJv0qyNVQOejPs9Rtp2vKA;Path=/;Domain=.salesforce.com;Expires=Sat,
241
- 29-Aug-2015 21:55:38 GMT
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=3/15000
283
+ - api-usage=1/15000
246
284
  body:
247
285
  encoding: UTF-8
248
286
  string: ''
249
287
  http_version:
250
- recorded_at: Tue, 30 Jun 2015 21:55:38 GMT
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.0
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-07-28 00:00:00.000000000 Z
11
+ date: 2015-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord