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 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