restforce-db 2.7.0 → 3.0.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/README.md +12 -0
- data/lib/generators/templates/script +102 -3
- data/lib/restforce/db/instances/active_record.rb +20 -9
- data/lib/restforce/db/instances/salesforce.rb +0 -8
- data/lib/restforce/db/record_types/salesforce.rb +17 -5
- data/lib/restforce/db/version.rb +1 -1
- data/test/cassettes/Restforce_DB_Initializer/_run/given_an_existing_database_record/for_an_Always_strategy/populates_Salesforce_with_the_new_record.yml +56 -56
- data/test/cassettes/Restforce_DB_Model/given_a_database_model_which_includes_the_module/_force_sync_/given_an_unsynchronized_record_for_a_mapped_model/creates_a_matching_record_in_Salesforce.yml +49 -49
- data/test/cassettes/Restforce_DB_RecordTypes_Salesforce/_create_/creates_a_record_in_Salesforce_from_the_passed_database_record_s_attributes.yml +41 -41
- data/test/cassettes/Restforce_DB_RecordTypes_Salesforce/_create_/updates_the_database_record_with_the_Salesforce_record_s_ID.yml +41 -41
- data/test/cassettes/Restforce_DB_RecordTypes_Salesforce/_create_/when_a_Salesforce_record_already_exists_for_the_database_instance/uses_the_existing_record.yml +247 -0
- data/test/cassettes/Restforce_DB_Worker/a_race_condition_during_synchronization/does_not_change_the_user-entered_name_on_the_database_record.yml +106 -107
- data/test/cassettes/Restforce_DB_Worker/a_race_condition_during_synchronization/overrides_the_stale-but-more-recent_name_on_the_Salesforce.yml +114 -115
- data/test/lib/restforce/db/instances/active_record_test.rb +9 -2
- data/test/lib/restforce/db/record_types/salesforce_test.rb +14 -4
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed593fdcf73e145f3957db532c939650f7112b77
|
4
|
+
data.tar.gz: 2a20acce1c5b9d85e717d6dc33d9c1e85a1c392d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f875a2b2f3f88717e2fd3ef74d842f25fc7b0bbc11726ee33ed3e91ed26c0744f28d647aa5d04c4a5bf548665f19fdc102462a84474ef694687d0df26d7ad4e
|
7
|
+
data.tar.gz: 0fab5908d5a1ae144f8563c4a27fb02f03004a932ac4044316d17f442047b0f170529ccf457ee6600e3a87fb5b0acdb606a18d56dd78804a9448bd54ee389c9d
|
data/README.md
CHANGED
@@ -225,6 +225,18 @@ In the above example, `Dish__c` is a Salesforce object type which references the
|
|
225
225
|
|
226
226
|
You may want to consult [the ActiveRecord documentation](http://apidock.com/rails/ActiveRecord/Associations/ClassMethods) for your specific use case.
|
227
227
|
|
228
|
+
### Add an external ID to your Salesforce objects
|
229
|
+
|
230
|
+
If your application creates any objects that you want/need to propagate to Salesforce, you'll need to expose an external ID field named `SynchronizationId__c` on the Salesforce object. This external ID is used as a key for Salesforce's [upsert](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_upsert.htm) API interaction, which allows Restforce::DB to avoid accidentally duplicating records via a less-safe non-idempotent POST to Salesforce.
|
231
|
+
|
232
|
+
The `restforce-db` executable has a handy mechanism for automating this:
|
233
|
+
|
234
|
+
$ ruby bin/restforce-db meta Restaurant__c Dish__c
|
235
|
+
# => ADDING SynchronizationId__c to Restaurant__c... DONE
|
236
|
+
# => ADDING SynchronizationId__c to Dish__c... DONE
|
237
|
+
|
238
|
+
NOTE: This script uses `bundler/inline` to get access to the `metaforce` gem at runtime. Due to some issues with Bundler's handling of inline gemfiles, the use of `ruby` versus `bundle exec` is intentional here.
|
239
|
+
|
228
240
|
### Seed your data
|
229
241
|
|
230
242
|
To populate your database with existing information from Salesforce (or vice-versa), you _could_ manually update each of the records you care about, and expect the Restforce::DB daemon to automatically pick them up when it runs. However, for any record type you need/want to _fully_ synchronize, this can be a very tedious process.
|
@@ -1,6 +1,105 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
require "
|
3
|
+
if ARGV[0] != "meta"
|
4
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "config", "environment"))
|
5
|
+
require "restforce/db/command"
|
5
6
|
|
6
|
-
Restforce::DB::Command.new(ARGV).daemonize
|
7
|
+
Restforce::DB::Command.new(ARGV).daemonize
|
8
|
+
elsif ARGV.length > 1 && !defined?(Bundler)
|
9
|
+
|
10
|
+
# MetadataInitializer exposes functionality to automatically add an
|
11
|
+
# external Synchronization ID to your Salesforce models.
|
12
|
+
class MetadataInitializer
|
13
|
+
|
14
|
+
# Public: Initialize a new MetadataInitializer.
|
15
|
+
#
|
16
|
+
# config_file - The path to a configuration file.
|
17
|
+
# models - An Array of String Salesforce model names.
|
18
|
+
def initialize(config_file, *models)
|
19
|
+
@models = models
|
20
|
+
@config = YAML.load_file(config_file)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Public: Set up an external Synchronization ID for each specified
|
24
|
+
# Salesforce model.
|
25
|
+
#
|
26
|
+
# Returns nothing.
|
27
|
+
def setup
|
28
|
+
@models.each do |model|
|
29
|
+
print "ADDING SynchronizationId__c to #{model}... "
|
30
|
+
job = client.create(
|
31
|
+
:custom_field,
|
32
|
+
full_name: "#{model}.SynchronizationId__c",
|
33
|
+
description: "External Synchronization ID",
|
34
|
+
label: "Synchronization ID",
|
35
|
+
type: "Text",
|
36
|
+
external_id: true,
|
37
|
+
unique: true,
|
38
|
+
length: ENV["UUID_LENGTH"] || 255,
|
39
|
+
)
|
40
|
+
|
41
|
+
begin
|
42
|
+
job.on_complete { |_| puts "DONE" }.on_error { |_| puts "FAILED" }.perform
|
43
|
+
rescue Savon::SOAP::Fault => e
|
44
|
+
puts "\n(#{e.class}) #{e.message}\n#{e.backtrace.join("\n")}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Internal: Get a Metaforce client to process the custom field CRUD
|
50
|
+
# requests.
|
51
|
+
#
|
52
|
+
# Returns a Metaforce::Metadata:Client.
|
53
|
+
def client
|
54
|
+
@client ||= begin
|
55
|
+
Metaforce.configure do |configuration|
|
56
|
+
configuration.host = @config["client"]["host"]
|
57
|
+
configuration.log = false
|
58
|
+
end
|
59
|
+
|
60
|
+
options = {
|
61
|
+
username: @config["client"]["username"],
|
62
|
+
password: @config["client"]["password"],
|
63
|
+
security_token: @config["client"]["security_token"],
|
64
|
+
}
|
65
|
+
|
66
|
+
# Verify the login credentials
|
67
|
+
Metaforce.login(options)
|
68
|
+
Metaforce.new(options)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
# NOTE: For whatever reason, bundler/inline's "install" functionality seems
|
75
|
+
# busted. We can work around it by just installing the gem ourselves, as a
|
76
|
+
# convenience to users.
|
77
|
+
unless `gem list metaforce -i` == "true\n"
|
78
|
+
system "gem install metaforce"
|
79
|
+
puts
|
80
|
+
end
|
81
|
+
|
82
|
+
# Suppress bundler output
|
83
|
+
require "stringio"
|
84
|
+
stdout, $stdout = $stdout, StringIO.new
|
85
|
+
|
86
|
+
require "bundler/inline"
|
87
|
+
require "yaml"
|
88
|
+
|
89
|
+
gemfile(true) do
|
90
|
+
source "https://rubygems.org"
|
91
|
+
|
92
|
+
# NOTE: Necessary to deal with a bad require in Metaforce
|
93
|
+
gem "activesupport", require: "active_support"
|
94
|
+
gem "metaforce"
|
95
|
+
end
|
96
|
+
|
97
|
+
$stdout = stdout
|
98
|
+
|
99
|
+
config_file = ENV["CONFIG"] || Pathname.new(Dir.pwd).join("config", "restforce-db.yml")
|
100
|
+
MetadataInitializer.new(config_file, *ARGV[1..-1]).setup
|
101
|
+
else
|
102
|
+
puts "The `meta` command doesn't work through `bundle exec`." if defined?(Bundler)
|
103
|
+
puts "You must supply at least one Salesforce model." if ARGV.length < 2
|
104
|
+
puts "Use the syntax `ruby bin/restforce-db meta <sobject> [<sobject>...]`"
|
105
|
+
end
|
@@ -14,23 +14,24 @@ module Restforce
|
|
14
14
|
#
|
15
15
|
# Returns a String.
|
16
16
|
def id
|
17
|
-
return
|
17
|
+
return uuid unless synced?
|
18
18
|
@record.send(@mapping.lookup_column)
|
19
19
|
end
|
20
20
|
|
21
|
-
# Public: Get
|
21
|
+
# Public: Get a unique identifier for this record. This value should
|
22
|
+
# be consistent for the specific ActiveRecord object passed to this
|
23
|
+
# instance.
|
22
24
|
#
|
23
|
-
# Returns
|
24
|
-
def
|
25
|
-
@record.
|
25
|
+
# Returns nothing.
|
26
|
+
def uuid
|
27
|
+
"#{@record_type}::#{@record.id}"
|
26
28
|
end
|
27
29
|
|
28
|
-
# Public: Get the time of the last
|
29
|
-
# record.
|
30
|
+
# Public: Get the time of the last update to this record.
|
30
31
|
#
|
31
32
|
# Returns a Time-compatible object.
|
32
|
-
def
|
33
|
-
@record.
|
33
|
+
def last_update
|
34
|
+
@record.updated_at
|
34
35
|
end
|
35
36
|
|
36
37
|
# Public: Has this record been synced to a Salesforce record?
|
@@ -56,6 +57,16 @@ module Restforce
|
|
56
57
|
super
|
57
58
|
end
|
58
59
|
|
60
|
+
private
|
61
|
+
|
62
|
+
# Internal: Get the time of the last synchronization update to this
|
63
|
+
# record.
|
64
|
+
#
|
65
|
+
# Returns a Time-compatible object.
|
66
|
+
def last_synchronize
|
67
|
+
@record.synchronized_at
|
68
|
+
end
|
69
|
+
|
59
70
|
end
|
60
71
|
|
61
72
|
end
|
@@ -39,14 +39,6 @@ module Restforce
|
|
39
39
|
Time.parse(@record.SystemModstamp)
|
40
40
|
end
|
41
41
|
|
42
|
-
# Public: Get the time of the last synchronization update to this
|
43
|
-
# record.
|
44
|
-
#
|
45
|
-
# Returns a Time-compatible object.
|
46
|
-
def last_synchronize
|
47
|
-
last_update
|
48
|
-
end
|
49
|
-
|
50
42
|
# Public: Has this record been synced with Salesforce?
|
51
43
|
#
|
52
44
|
# Returns a Boolean.
|
@@ -18,11 +18,23 @@ module Restforce
|
|
18
18
|
# Raises on any error from Salesforce.
|
19
19
|
def create!(from_record)
|
20
20
|
from_attributes = FieldProcessor.new.process(@record_type, from_record.attributes, :create)
|
21
|
-
record_id = DB.client.
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
record_id = DB.client.upsert!(
|
22
|
+
@record_type,
|
23
|
+
"SynchronizationId__c",
|
24
|
+
from_attributes.merge("SynchronizationId__c" => from_record.uuid),
|
25
|
+
)
|
26
|
+
|
27
|
+
# NOTE: #upsert! returns a String Salesforce ID when a record is
|
28
|
+
# created, or returns `true` when an existing record was found and
|
29
|
+
# updated.
|
30
|
+
if record_id.is_a?(String)
|
31
|
+
from_record.update!(@mapping.lookup_column => record_id).after_sync
|
32
|
+
find(record_id)
|
33
|
+
else
|
34
|
+
instance = first("SynchronizationId__c = '#{from_record.uuid}'")
|
35
|
+
from_record.update!(@mapping.lookup_column => instance.id).after_sync
|
36
|
+
instance
|
37
|
+
end
|
26
38
|
end
|
27
39
|
|
28
40
|
# Public: Find the first Salesforce record which meets the passed
|
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
|
+
- Wed, 24 Jun 2015 18:34:52 GMT
|
25
25
|
Set-Cookie:
|
26
|
-
- BrowserId=
|
27
|
-
|
26
|
+
- BrowserId=aKS8yAn1RXaQ5xLLDWvcqw;Path=/;Domain=.salesforce.com;Expires=Sun,
|
27
|
+
23-Aug-2015 18:34:52 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":"1435170892365","token_type":"Bearer","instance_url":"https://<host>","signature":"A0a5DAaWIK8kteDcmiwQXntRWHIfAq0gIi9OO00wcyk=","access_token":"00D1a000000H3O9!AQ4AQNK96zuBaEk9NKWUAyWWpuQMJkhWoqad9KZ4VwaiC5uJ8k6jTm.ILyUyydEv.pXY3IFrmILmW.cLInyzW6.ZDXbrtThl"}'
|
41
41
|
http_version:
|
42
|
-
recorded_at:
|
42
|
+
recorded_at: Wed, 24 Jun 2015 18:35:00 GMT
|
43
43
|
- request:
|
44
44
|
method: get
|
45
45
|
uri: https://<host>/services/data/<api_version>/query?q=select%20Id,%20SystemModstamp,%20LastModifiedById,%20Name,%20Example_Field__c%20from%20CustomObject__c
|
@@ -50,7 +50,7 @@ http_interactions:
|
|
50
50
|
User-Agent:
|
51
51
|
- Faraday v0.9.1
|
52
52
|
Authorization:
|
53
|
-
- OAuth 00D1a000000H3O9!
|
53
|
+
- OAuth 00D1a000000H3O9!AQ4AQNK96zuBaEk9NKWUAyWWpuQMJkhWoqad9KZ4VwaiC5uJ8k6jTm.ILyUyydEv.pXY3IFrmILmW.cLInyzW6.ZDXbrtThl
|
54
54
|
Accept-Encoding:
|
55
55
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
56
56
|
Accept:
|
@@ -61,23 +61,23 @@ http_interactions:
|
|
61
61
|
message: OK
|
62
62
|
headers:
|
63
63
|
Date:
|
64
|
-
-
|
64
|
+
- Wed, 24 Jun 2015 18:34:52 GMT
|
65
65
|
Set-Cookie:
|
66
|
-
- BrowserId=
|
67
|
-
|
66
|
+
- BrowserId=_TMdYkP7SsKPbLFyVbQW7Q;Path=/;Domain=.salesforce.com;Expires=Sun,
|
67
|
+
23-Aug-2015 18:34:52 GMT
|
68
68
|
Expires:
|
69
69
|
- Thu, 01 Jan 1970 00:00:00 GMT
|
70
70
|
Sforce-Limit-Info:
|
71
|
-
- api-usage=
|
71
|
+
- api-usage=34/15000
|
72
72
|
Content-Type:
|
73
73
|
- application/json;charset=UTF-8
|
74
74
|
Transfer-Encoding:
|
75
75
|
- chunked
|
76
76
|
body:
|
77
77
|
encoding: ASCII-8BIT
|
78
|
-
string: '{"totalSize":1,"done":true,"records":[{"attributes":{"type":"CustomObject__c","url":"/services/data/<api_version>/sobjects/CustomObject__c/
|
78
|
+
string: '{"totalSize":1,"done":true,"records":[{"attributes":{"type":"CustomObject__c","url":"/services/data/<api_version>/sobjects/CustomObject__c/a001a000002ze8cAAA"},"Id":"a001a000002ze8cAAA","SystemModstamp":"2015-06-24T17:05:30.000+0000","LastModifiedById":"0051a000000UGT8AAO","Name":"Testing2","Example_Field__c":null}]}'
|
79
79
|
http_version:
|
80
|
-
recorded_at:
|
80
|
+
recorded_at: Wed, 24 Jun 2015 18:35:00 GMT
|
81
81
|
- request:
|
82
82
|
method: get
|
83
83
|
uri: https://<host>/services/data/<api_version>/sobjects/CustomObject__c/describe
|
@@ -88,7 +88,7 @@ http_interactions:
|
|
88
88
|
User-Agent:
|
89
89
|
- Faraday v0.9.1
|
90
90
|
Authorization:
|
91
|
-
- OAuth 00D1a000000H3O9!
|
91
|
+
- OAuth 00D1a000000H3O9!AQ4AQNK96zuBaEk9NKWUAyWWpuQMJkhWoqad9KZ4VwaiC5uJ8k6jTm.ILyUyydEv.pXY3IFrmILmW.cLInyzW6.ZDXbrtThl
|
92
92
|
Accept-Encoding:
|
93
93
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
94
94
|
Accept:
|
@@ -99,22 +99,22 @@ http_interactions:
|
|
99
99
|
message: OK
|
100
100
|
headers:
|
101
101
|
Date:
|
102
|
-
-
|
102
|
+
- Wed, 24 Jun 2015 18:34:52 GMT
|
103
103
|
Set-Cookie:
|
104
|
-
- BrowserId=
|
105
|
-
|
104
|
+
- BrowserId=LW_-C13XRouLPEZWiq2dCw;Path=/;Domain=.salesforce.com;Expires=Sun,
|
105
|
+
23-Aug-2015 18:34:52 GMT
|
106
106
|
Expires:
|
107
107
|
- Thu, 01 Jan 1970 00:00:00 GMT
|
108
108
|
Sforce-Limit-Info:
|
109
|
-
- api-usage=
|
109
|
+
- api-usage=34/15000
|
110
110
|
Org.eclipse.jetty.server.include.etag:
|
111
|
-
-
|
111
|
+
- aa7ee96f
|
112
112
|
Last-Modified:
|
113
|
-
- Wed,
|
113
|
+
- Wed, 24 Jun 2015 02:10:32 GMT
|
114
114
|
Content-Type:
|
115
115
|
- application/json;charset=UTF-8
|
116
116
|
Etag:
|
117
|
-
-
|
117
|
+
- aa7ee96-gzip"
|
118
118
|
Transfer-Encoding:
|
119
119
|
- chunked
|
120
120
|
body:
|
@@ -128,12 +128,12 @@ http_interactions:
|
|
128
128
|
Modified Date","length":0,"name":"LastModifiedDate","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":18,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":false,"custom":false,"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":"Last
|
129
129
|
Modified By ID","length":18,"name":"LastModifiedById","nameField":false,"namePointing":false,"nillable":false,"permissionable":false,"picklistValues":[],"precision":0,"referenceTo":["User"],"relationshipName":"LastModifiedBy","relationshipOrder":null,"restrictedDelete":false,"restrictedPicklist":false,"scale":0,"soapType":"tns:ID","sortable":true,"type":"reference","unique":false,"updateable":false,"writeRequiresMasterRead":false},{"autoNumber":false,"byteLength":0,"calculated":false,"calculatedFormula":null,"cascadeDelete":false,"caseSensitive":false,"controllerName":null,"createable":false,"custom":false,"defaultValue":null,"defaultValueFormula":null,"defaultedOnCreate":true,"dependentPicklist":false,"deprecatedAndHidden":false,"digits":0,"displayLocationInDecimal":false,"externalId":false,"filterable":true,"groupable":false,"htmlFormatted":false,"idLookup":false,"inlineHelpText":null,"label":"System
|
130
130
|
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
|
131
|
-
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}],"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"}}'
|
131
|
+
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"}}'
|
132
132
|
http_version:
|
133
|
-
recorded_at:
|
133
|
+
recorded_at: Wed, 24 Jun 2015 18:35:00 GMT
|
134
134
|
- request:
|
135
|
-
method:
|
136
|
-
uri: https://<host>/services/data/<api_version>/sobjects/CustomObject__c
|
135
|
+
method: patch
|
136
|
+
uri: https://<host>/services/data/<api_version>/sobjects/CustomObject__c/SynchronizationId__c/CustomObject::1
|
137
137
|
body:
|
138
138
|
encoding: UTF-8
|
139
139
|
string: '{"Name":"Custom object","Example_Field__c":"Some sample text"}'
|
@@ -143,7 +143,7 @@ http_interactions:
|
|
143
143
|
Content-Type:
|
144
144
|
- application/json
|
145
145
|
Authorization:
|
146
|
-
- OAuth 00D1a000000H3O9!
|
146
|
+
- OAuth 00D1a000000H3O9!AQ4AQNK96zuBaEk9NKWUAyWWpuQMJkhWoqad9KZ4VwaiC5uJ8k6jTm.ILyUyydEv.pXY3IFrmILmW.cLInyzW6.ZDXbrtThl
|
147
147
|
Accept-Encoding:
|
148
148
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
149
149
|
Accept:
|
@@ -154,28 +154,28 @@ http_interactions:
|
|
154
154
|
message: Created
|
155
155
|
headers:
|
156
156
|
Date:
|
157
|
-
-
|
157
|
+
- Wed, 24 Jun 2015 18:34:53 GMT
|
158
158
|
Set-Cookie:
|
159
|
-
- BrowserId=
|
160
|
-
|
159
|
+
- BrowserId=mmlGpTRaTUa8h8XOKyh2eQ;Path=/;Domain=.salesforce.com;Expires=Sun,
|
160
|
+
23-Aug-2015 18:34:53 GMT
|
161
161
|
Expires:
|
162
162
|
- Thu, 01 Jan 1970 00:00:00 GMT
|
163
163
|
Sforce-Limit-Info:
|
164
|
-
- api-usage=
|
164
|
+
- api-usage=34/15000
|
165
165
|
Location:
|
166
|
-
- "/services/data/<api_version>/sobjects/CustomObject__c/
|
166
|
+
- "/services/data/<api_version>/sobjects/CustomObject__c/a001a000002zeDhAAI"
|
167
167
|
Content-Type:
|
168
168
|
- application/json;charset=UTF-8
|
169
169
|
Transfer-Encoding:
|
170
170
|
- chunked
|
171
171
|
body:
|
172
|
-
encoding:
|
173
|
-
string: '{"id":"
|
172
|
+
encoding: UTF-8
|
173
|
+
string: '{"id":"a001a000002zeDhAAI","success":true,"errors":[]}'
|
174
174
|
http_version:
|
175
|
-
recorded_at:
|
175
|
+
recorded_at: Wed, 24 Jun 2015 18:35:01 GMT
|
176
176
|
- request:
|
177
177
|
method: get
|
178
|
-
uri: https://<host>/services/data/<api_version>/query?q=select%20Id,%20SystemModstamp,%20LastModifiedById,%20Name,%20Example_Field__c%20from%20CustomObject__c%20where%20Id%20=%20%
|
178
|
+
uri: https://<host>/services/data/<api_version>/query?q=select%20Id,%20SystemModstamp,%20LastModifiedById,%20Name,%20Example_Field__c%20from%20CustomObject__c%20where%20Id%20=%20%27a001a000002zeDhAAI%27
|
179
179
|
body:
|
180
180
|
encoding: US-ASCII
|
181
181
|
string: ''
|
@@ -183,7 +183,7 @@ http_interactions:
|
|
183
183
|
User-Agent:
|
184
184
|
- Faraday v0.9.1
|
185
185
|
Authorization:
|
186
|
-
- OAuth 00D1a000000H3O9!
|
186
|
+
- OAuth 00D1a000000H3O9!AQ4AQNK96zuBaEk9NKWUAyWWpuQMJkhWoqad9KZ4VwaiC5uJ8k6jTm.ILyUyydEv.pXY3IFrmILmW.cLInyzW6.ZDXbrtThl
|
187
187
|
Accept-Encoding:
|
188
188
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
189
189
|
Accept:
|
@@ -194,27 +194,27 @@ http_interactions:
|
|
194
194
|
message: OK
|
195
195
|
headers:
|
196
196
|
Date:
|
197
|
-
-
|
197
|
+
- Wed, 24 Jun 2015 18:34:53 GMT
|
198
198
|
Set-Cookie:
|
199
|
-
- BrowserId=
|
200
|
-
|
199
|
+
- BrowserId=FMKsCORzSPGqpi2wDE2yFw;Path=/;Domain=.salesforce.com;Expires=Sun,
|
200
|
+
23-Aug-2015 18:34:53 GMT
|
201
201
|
Expires:
|
202
202
|
- Thu, 01 Jan 1970 00:00:00 GMT
|
203
203
|
Sforce-Limit-Info:
|
204
|
-
- api-usage=
|
204
|
+
- api-usage=34/15000
|
205
205
|
Content-Type:
|
206
206
|
- application/json;charset=UTF-8
|
207
207
|
Transfer-Encoding:
|
208
208
|
- chunked
|
209
209
|
body:
|
210
210
|
encoding: ASCII-8BIT
|
211
|
-
string: '{"totalSize":1,"done":true,"records":[{"attributes":{"type":"CustomObject__c","url":"/services/data/<api_version>/sobjects/CustomObject__c/
|
211
|
+
string: '{"totalSize":1,"done":true,"records":[{"attributes":{"type":"CustomObject__c","url":"/services/data/<api_version>/sobjects/CustomObject__c/a001a000002zeDhAAI"},"Id":"a001a000002zeDhAAI","SystemModstamp":"2015-06-24T18:34:53.000+0000","LastModifiedById":"0051a000000UGT8AAO","Name":"Custom
|
212
212
|
object","Example_Field__c":"Some sample text"}]}'
|
213
213
|
http_version:
|
214
|
-
recorded_at:
|
214
|
+
recorded_at: Wed, 24 Jun 2015 18:35:01 GMT
|
215
215
|
- request:
|
216
216
|
method: get
|
217
|
-
uri: https://<host>/services/data/<api_version>/query?q=select%20Id,%20SystemModstamp,%20LastModifiedById,%20Name,%20Example_Field__c%20from%20CustomObject__c%20where%20Id%20=%20%
|
217
|
+
uri: https://<host>/services/data/<api_version>/query?q=select%20Id,%20SystemModstamp,%20LastModifiedById,%20Name,%20Example_Field__c%20from%20CustomObject__c%20where%20Id%20=%20%27a001a000002zeDhAAI%27
|
218
218
|
body:
|
219
219
|
encoding: US-ASCII
|
220
220
|
string: ''
|
@@ -222,7 +222,7 @@ http_interactions:
|
|
222
222
|
User-Agent:
|
223
223
|
- Faraday v0.9.1
|
224
224
|
Authorization:
|
225
|
-
- OAuth 00D1a000000H3O9!
|
225
|
+
- OAuth 00D1a000000H3O9!AQ4AQNK96zuBaEk9NKWUAyWWpuQMJkhWoqad9KZ4VwaiC5uJ8k6jTm.ILyUyydEv.pXY3IFrmILmW.cLInyzW6.ZDXbrtThl
|
226
226
|
Accept-Encoding:
|
227
227
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
228
228
|
Accept:
|
@@ -233,27 +233,27 @@ http_interactions:
|
|
233
233
|
message: OK
|
234
234
|
headers:
|
235
235
|
Date:
|
236
|
-
-
|
236
|
+
- Wed, 24 Jun 2015 18:34:53 GMT
|
237
237
|
Set-Cookie:
|
238
|
-
- BrowserId=
|
239
|
-
|
238
|
+
- BrowserId=KxgLmlPAQji8dJHgvKiYfQ;Path=/;Domain=.salesforce.com;Expires=Sun,
|
239
|
+
23-Aug-2015 18:34:53 GMT
|
240
240
|
Expires:
|
241
241
|
- Thu, 01 Jan 1970 00:00:00 GMT
|
242
242
|
Sforce-Limit-Info:
|
243
|
-
- api-usage=
|
243
|
+
- api-usage=35/15000
|
244
244
|
Content-Type:
|
245
245
|
- application/json;charset=UTF-8
|
246
246
|
Transfer-Encoding:
|
247
247
|
- chunked
|
248
248
|
body:
|
249
249
|
encoding: ASCII-8BIT
|
250
|
-
string: '{"totalSize":1,"done":true,"records":[{"attributes":{"type":"CustomObject__c","url":"/services/data/<api_version>/sobjects/CustomObject__c/
|
250
|
+
string: '{"totalSize":1,"done":true,"records":[{"attributes":{"type":"CustomObject__c","url":"/services/data/<api_version>/sobjects/CustomObject__c/a001a000002zeDhAAI"},"Id":"a001a000002zeDhAAI","SystemModstamp":"2015-06-24T18:34:53.000+0000","LastModifiedById":"0051a000000UGT8AAO","Name":"Custom
|
251
251
|
object","Example_Field__c":"Some sample text"}]}'
|
252
252
|
http_version:
|
253
|
-
recorded_at:
|
253
|
+
recorded_at: Wed, 24 Jun 2015 18:35:01 GMT
|
254
254
|
- request:
|
255
255
|
method: delete
|
256
|
-
uri: https://<host>/services/data/<api_version>/sobjects/CustomObject__c/
|
256
|
+
uri: https://<host>/services/data/<api_version>/sobjects/CustomObject__c/a001a000002zeDhAAI
|
257
257
|
body:
|
258
258
|
encoding: US-ASCII
|
259
259
|
string: ''
|
@@ -261,7 +261,7 @@ http_interactions:
|
|
261
261
|
User-Agent:
|
262
262
|
- Faraday v0.9.1
|
263
263
|
Authorization:
|
264
|
-
- OAuth 00D1a000000H3O9!
|
264
|
+
- OAuth 00D1a000000H3O9!AQ4AQNK96zuBaEk9NKWUAyWWpuQMJkhWoqad9KZ4VwaiC5uJ8k6jTm.ILyUyydEv.pXY3IFrmILmW.cLInyzW6.ZDXbrtThl
|
265
265
|
Accept-Encoding:
|
266
266
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
267
267
|
Accept:
|
@@ -272,17 +272,17 @@ http_interactions:
|
|
272
272
|
message: No Content
|
273
273
|
headers:
|
274
274
|
Date:
|
275
|
-
-
|
275
|
+
- Wed, 24 Jun 2015 18:34:53 GMT
|
276
276
|
Set-Cookie:
|
277
|
-
- BrowserId=
|
278
|
-
|
277
|
+
- BrowserId=QANHelrFTM-AFubF5KfZpw;Path=/;Domain=.salesforce.com;Expires=Sun,
|
278
|
+
23-Aug-2015 18:34:53 GMT
|
279
279
|
Expires:
|
280
280
|
- Thu, 01 Jan 1970 00:00:00 GMT
|
281
281
|
Sforce-Limit-Info:
|
282
|
-
- api-usage=
|
282
|
+
- api-usage=34/15000
|
283
283
|
body:
|
284
284
|
encoding: UTF-8
|
285
285
|
string: ''
|
286
286
|
http_version:
|
287
|
-
recorded_at:
|
287
|
+
recorded_at: Wed, 24 Jun 2015 18:35:01 GMT
|
288
288
|
recorded_with: VCR 2.9.3
|