restforce 4.2.0 → 5.0.2

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +9 -9
  3. data/.github/ISSUE_TEMPLATE/unhandled-salesforce-error.md +17 -0
  4. data/.rubocop.yml +4 -3
  5. data/.rubocop_todo.yml +2 -2
  6. data/CHANGELOG.md +42 -0
  7. data/CONTRIBUTING.md +21 -1
  8. data/Dockerfile +31 -0
  9. data/Gemfile +0 -1
  10. data/README.md +43 -19
  11. data/UPGRADING.md +38 -0
  12. data/docker-compose.yml +7 -0
  13. data/lib/restforce.rb +10 -13
  14. data/lib/restforce/collection.rb +7 -2
  15. data/lib/restforce/concerns/api.rb +1 -1
  16. data/lib/restforce/concerns/caching.rb +7 -0
  17. data/lib/restforce/concerns/connection.rb +3 -3
  18. data/lib/restforce/concerns/picklists.rb +1 -1
  19. data/lib/restforce/config.rb +4 -1
  20. data/lib/restforce/error_code.rb +416 -0
  21. data/lib/restforce/file_part.rb +24 -0
  22. data/lib/restforce/mash.rb +8 -3
  23. data/lib/restforce/middleware.rb +2 -0
  24. data/lib/restforce/middleware/authentication.rb +4 -1
  25. data/lib/restforce/middleware/caching.rb +1 -1
  26. data/lib/restforce/middleware/instance_url.rb +1 -1
  27. data/lib/restforce/middleware/logger.rb +3 -2
  28. data/lib/restforce/middleware/raise_error.rb +3 -4
  29. data/lib/restforce/version.rb +1 -1
  30. data/restforce.gemspec +12 -13
  31. data/spec/integration/abstract_client_spec.rb +18 -6
  32. data/spec/spec_helper.rb +14 -1
  33. data/spec/support/fixture_helpers.rb +1 -3
  34. data/spec/unit/collection_spec.rb +18 -0
  35. data/spec/unit/concerns/api_spec.rb +1 -1
  36. data/spec/unit/concerns/caching_spec.rb +26 -0
  37. data/spec/unit/concerns/connection_spec.rb +2 -2
  38. data/spec/unit/error_code_spec.rb +61 -0
  39. data/spec/unit/mash_spec.rb +5 -0
  40. data/spec/unit/middleware/authentication_spec.rb +27 -4
  41. data/spec/unit/middleware/raise_error_spec.rb +19 -10
  42. data/spec/unit/signed_request_spec.rb +1 -1
  43. data/spec/unit/sobject_spec.rb +2 -5
  44. metadata +33 -40
  45. data/lib/restforce/upload_io.rb +0 -9
@@ -510,7 +510,7 @@ module Restforce
510
510
 
511
511
  # Internal: Errors that should be rescued from in non-bang methods
512
512
  def exceptions
513
- [Faraday::Error::ClientError]
513
+ [Faraday::Error]
514
514
  end
515
515
  end
516
516
  end
@@ -15,6 +15,13 @@ module Restforce
15
15
  options.delete(:use_cache)
16
16
  end
17
17
 
18
+ def with_caching
19
+ options[:use_cache] = true
20
+ yield
21
+ ensure
22
+ options[:use_cache] = false
23
+ end
24
+
18
25
  private
19
26
 
20
27
  # Internal: Cache to use for the caching middleware
@@ -72,9 +72,9 @@ module Restforce
72
72
  # Internal: Faraday Connection options
73
73
  def connection_options
74
74
  { request: {
75
- timeout: options[:timeout],
76
- open_timeout: options[:timeout]
77
- },
75
+ timeout: options[:timeout],
76
+ open_timeout: options[:timeout]
77
+ },
78
78
  proxy: options[:proxy_uri],
79
79
  ssl: options[:ssl] }
80
80
  end
@@ -35,7 +35,7 @@ module Restforce
35
35
  @valid_for = options.delete(:valid_for)
36
36
  raise "#{field} is not a dependent picklist" if @valid_for && !dependent?
37
37
 
38
- replace(picklist_values)
38
+ super(picklist_values)
39
39
  end
40
40
 
41
41
  private
@@ -151,11 +151,14 @@ module Restforce
151
151
  option :request_headers
152
152
 
153
153
  # Set a logger for when Restforce.log is set to true, defaulting to STDOUT
154
- option :logger, default: ::Logger.new(STDOUT)
154
+ option :logger, default: ::Logger.new($stdout)
155
155
 
156
156
  # Set a log level for logging when Restforce.log is set to true, defaulting to :debug
157
157
  option :log_level, default: :debug
158
158
 
159
+ # Set use_cache to false to opt in to caching with client.with_caching
160
+ option :use_cache, default: true
161
+
159
162
  def options
160
163
  self.class.options
161
164
  end
@@ -0,0 +1,416 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Restforce
4
+ module ErrorCode
5
+ GITHUB_ISSUE_URL = "https://github.com/restforce/restforce/issues/new?template=" \
6
+ "unhandled-salesforce-error.md&title=Unhandled+Salesforce+error%3A+%3Cinsert+" \
7
+ "error+code+here%3E"
8
+
9
+ # We define all of the known errors returned by Salesforce based on the
10
+ # documentation at
11
+ # https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_calls_concepts_core_data_objects.htm#statuscode
12
+ # Previously, these were defined dynamically at runtime using `Module.const_set`. Now
13
+ # we define them up-front.
14
+ # It is possible that we will be missing some errors, so we will handle this in
15
+ # at least a semi-graceful manner.
16
+ class AllOrNoneOperationRolledBack < ResponseError; end
17
+ class AlreadyInProcess < ResponseError; end
18
+ class ApiCurrentlyDisabled < ResponseError; end
19
+ class AssigneeTypeRequired < ResponseError; end
20
+ class BadCustomEntityParentDomain < ResponseError; end
21
+ class BccNotAllowedIfBccComplianceEnabled < ResponseError; end
22
+ class BccSelfNotAllowedIfBccComplianceEnabled < ResponseError; end
23
+ class CannotCascadeProductActive < ResponseError; end
24
+ class CannotChangeFieldTypeOfApexReferencedField < ResponseError; end
25
+ class CannotCreateAnotherManagedPackage < ResponseError; end
26
+ class CannotDeactivateDivision < ResponseError; end
27
+ class CannotDeleteLastDatedConversionRate < ResponseError; end
28
+ class CannotDeleteManagedObject < ResponseError; end
29
+ class CannotDisableLastAdmin < ResponseError; end
30
+ class CannotEnableIpRestrictRequests < ResponseError; end
31
+ class CannotInsertUpdateActivateEntity < ResponseError; end
32
+ class CannotModifyManagedObject < ResponseError; end
33
+ class CannotRenameApexReferencedField < ResponseError; end
34
+ class CannotRenameApexReferencedObject < ResponseError; end
35
+ class CannotReparentRecord < ResponseError; end
36
+ class CannotResolveName < ResponseError; end
37
+ class CannotUpdateConvertedLead < ResponseError; end
38
+ class CantDisableCorpCurrency < ResponseError; end
39
+ class CantUnsetCorpCurrency < ResponseError; end
40
+ class ChildShareFailsParent < ResponseError; end
41
+ class CircularDependency < ResponseError; end
42
+ class CommunityNotAccessible < ResponseError; end
43
+ class CustomClobFieldLimitExceeded < ResponseError; end
44
+ class CustomEntityOrFieldLimit < ResponseError; end
45
+ class CustomFieldIndexLimitExceeded < ResponseError; end
46
+ class CustomIndexExists < ResponseError; end
47
+ class CustomLinkLimitExceeded < ResponseError; end
48
+ class CustomMetadataLimitExceeded < ResponseError; end
49
+ class CustomSettingsLimitExceeded < ResponseError; end
50
+ class CustomTabLimitExceeded < ResponseError; end
51
+ class DeleteFailed < ResponseError; end
52
+ class DependencyExists < ResponseError; end
53
+ class DuplicateCaseSolution < ResponseError; end
54
+ class DuplicateCustomEntityDefinition < ResponseError; end
55
+ class DuplicateCustomTabMotif < ResponseError; end
56
+ class DuplicateDeveloperName < ResponseError; end
57
+ class DuplicatesDetected < ResponseError; end
58
+ class DuplicateExternalId < ResponseError; end
59
+ class DuplicateMasterLabel < ResponseError; end
60
+ class DuplicateSenderDisplayName < ResponseError; end
61
+ class DuplicateUsername < ResponseError; end
62
+ class DuplicateValue < ResponseError; end
63
+ class EmailAddressBounced < ResponseError; end
64
+ class EmailNotProcessedDueToPriorError < ResponseError; end
65
+ class EmailOptedOut < ResponseError; end
66
+ class EmailTemplateFormulaError < ResponseError; end
67
+ class EmailTemplateMergefieldAccessError < ResponseError; end
68
+ class EmailTemplateMergefieldError < ResponseError; end
69
+ class EmailTemplateMergefieldValueError < ResponseError; end
70
+ class EmailTemplateProcessingError < ResponseError; end
71
+ class EmptyScontrolFileName < ResponseError; end
72
+ class EntityFailedIflastmodifiedOnUpdate < ResponseError; end
73
+ class EntityIsArchived < ResponseError; end
74
+ class EntityIsDeleted < ResponseError; end
75
+ class EntityIsLocked < ResponseError; end
76
+ class EnvironmentHubMembershipConflict < ResponseError; end
77
+ class ErrorInMailer < ResponseError; end
78
+ class FailedActivation < ResponseError; end
79
+ class FieldCustomValidationException < ResponseError; end
80
+ class FieldFilterValidationException < ResponseError; end
81
+ class FilteredLookupLimitExceeded < ResponseError; end
82
+ class HtmlFileUploadNotAllowed < ResponseError; end
83
+ class ImageTooLarge < ResponseError; end
84
+ class InactiveOwnerOrUser < ResponseError; end
85
+ class InsertUpdateDeleteNotAllowedDuringMaintenance < ResponseError; end
86
+ class InsufficientAccessOnCrossReferenceEntity < ResponseError; end
87
+ class InsufficientAccessOrReadonly < ResponseError; end
88
+ class InvalidAccessLevel < ResponseError; end
89
+ class InvalidArgumentType < ResponseError; end
90
+ class InvalidAssigneeType < ResponseError; end
91
+ class InvalidAssignmentRule < ResponseError; end
92
+ class InvalidBatchOperation < ResponseError; end
93
+ class InvalidContentType < ResponseError; end
94
+ class InvalidCreditCardInfo < ResponseError; end
95
+ class InvalidCrossReferenceKey < ResponseError; end
96
+ class InvalidCrossReferenceTypeForField < ResponseError; end
97
+ class InvalidCurrencyConvRate < ResponseError; end
98
+ class InvalidCurrencyCorpRate < ResponseError; end
99
+ class InvalidCurrencyIso < ResponseError; end
100
+ class InvalidEmailAddress < ResponseError; end
101
+ class InvalidEmptyKeyOwner < ResponseError; end
102
+ class InvalidEventSubscription < ResponseError; end
103
+ class InvalidField < ResponseError; end
104
+ class InvalidFieldForInsertUpdate < ResponseError; end
105
+ class InvalidFieldWhenUsingTemplate < ResponseError; end
106
+ class InvalidFilterAction < ResponseError; end
107
+ class InvalidIdField < ResponseError; end
108
+ class InvalidInetAddress < ResponseError; end
109
+ class InvalidLineitemCloneState < ResponseError; end
110
+ class InvalidMasterOrTranslatedSolution < ResponseError; end
111
+ class InvalidMessageIdReference < ResponseError; end
112
+ class InvalidOperation < ResponseError; end
113
+ class InvalidOperator < ResponseError; end
114
+ class InvalidOrNullForRestrictedPicklist < ResponseError; end
115
+ class InvalidQueryFilterOperator < ResponseError; end
116
+ class InvalidPartnerNetworkStatus < ResponseError; end
117
+ class InvalidPersonAccountOperation < ResponseError; end
118
+ class InvalidReadOnlyUserDml < ResponseError; end
119
+ class InvalidSaveAsActivityFlag < ResponseError; end
120
+ class InvalidSessionId < ResponseError; end
121
+ class InvalidStatus < ResponseError; end
122
+ class InvalidType < ResponseError; end
123
+ class InvalidTypeForOperation < ResponseError; end
124
+ class InvalidTypeOnFieldInRecord < ResponseError; end
125
+ class IpRangeLimitExceeded < ResponseError; end
126
+ class JigsawImportLimitExceeded < ResponseError; end
127
+ class LicenseLimitExceeded < ResponseError; end
128
+ class LightPortalUserException < ResponseError; end
129
+ class LimitExceeded < ResponseError; end
130
+ class LoginChallengeIssued < ResponseError; end
131
+ class LoginChallengePending < ResponseError; end
132
+ class LoginMustUseSecurityToken < ResponseError; end
133
+ class MalformedId < ResponseError; end
134
+ class MalformedQuery < ResponseError; end
135
+ class ManagerNotDefined < ResponseError; end
136
+ class MassmailRetryLimitExceeded < ResponseError; end
137
+ class MassMailLimitExceeded < ResponseError; end
138
+ class MaximumCcemailsExceeded < ResponseError; end
139
+ class MaximumDashboardComponentsExceeded < ResponseError; end
140
+ class MaximumHierarchyLevelsReached < ResponseError; end
141
+ class MaximumSizeOfAttachment < ResponseError; end
142
+ class MaximumSizeOfDocument < ResponseError; end
143
+ class MaxActionsPerRuleExceeded < ResponseError; end
144
+ class MaxActiveRulesExceeded < ResponseError; end
145
+ class MaxApprovalStepsExceeded < ResponseError; end
146
+ class MaxFormulasPerRuleExceeded < ResponseError; end
147
+ class MaxRulesExceeded < ResponseError; end
148
+ class MaxRuleEntriesExceeded < ResponseError; end
149
+ class MaxTaskDescriptionExceeded < ResponseError; end
150
+ class MaxTmRulesExceeded < ResponseError; end
151
+ class MaxTmRuleItemsExceeded < ResponseError; end
152
+ class MergeFailed < ResponseError; end
153
+ class MissingArgument < ResponseError; end
154
+ class NonuniqueShippingAddress < ResponseError; end
155
+ class NoApplicableProcess < ResponseError; end
156
+ class NoAttachmentPermission < ResponseError; end
157
+ class NoInactiveDivisionMembers < ResponseError; end
158
+ class NoMassMailPermission < ResponseError; end
159
+ class NumberOutsideValidRange < ResponseError; end
160
+ class NumHistoryFieldsBySobjectExceeded < ResponseError; end
161
+ class OpWithInvalidUserTypeException < ResponseError; end
162
+ class OptedOutOfMassMail < ResponseError; end
163
+ class PackageLicenseRequired < ResponseError; end
164
+ class PlatformEventEncryptionError < ResponseError; end
165
+ class PlatformEventPublishingUnavailable < ResponseError; end
166
+ class PlatformEventPublishFailed < ResponseError; end
167
+ class PortalUserAlreadyExistsForContact < ResponseError; end
168
+ class PrivateContactOnAsset < ResponseError; end
169
+ class RecordInUseByWorkflow < ResponseError; end
170
+ class RequestLimitExceeded < ResponseError; end
171
+ class RequestRunningTooLong < ResponseError; end
172
+ class RequiredFieldMissing < ResponseError; end
173
+ class SelfReferenceFromTrigger < ResponseError; end
174
+ class ServerUnavailable < ResponseError; end
175
+ class ShareNeededForChildOwner < ResponseError; end
176
+ class SingleEmailLimitExceeded < ResponseError; end
177
+ class StandardPriceNotDefined < ResponseError; end
178
+ class StorageLimitExceeded < ResponseError; end
179
+ class StringTooLong < ResponseError; end
180
+ class TabsetLimitExceeded < ResponseError; end
181
+ class TemplateNotActive < ResponseError; end
182
+ class TerritoryRealignInProgress < ResponseError; end
183
+ class TextDataOutsideSupportedCharset < ResponseError; end
184
+ class TooManyApexRequests < ResponseError; end
185
+ class TooManyEnumValue < ResponseError; end
186
+ class TransferRequiresRead < ResponseError; end
187
+ class UnableToLockRow < ResponseError; end
188
+ class UnavailableRecordtypeException < ResponseError; end
189
+ class UndeleteFailed < ResponseError; end
190
+ class UnknownException < ResponseError; end
191
+ class UnspecifiedEmailAddress < ResponseError; end
192
+ class UnsupportedApexTriggerOperation < ResponseError; end
193
+ class UnverifiedSenderAddress < ResponseError; end
194
+ class WeblinkSizeLimitExceeded < ResponseError; end
195
+ class WeblinkUrlInvalid < ResponseError; end
196
+ class WrongControllerType < ResponseError; end
197
+
198
+ # Maps `errorCode`s returned from Salesforce to the exception class
199
+ # to be used for these errors
200
+ ERROR_EXCEPTION_CLASSES = {
201
+ "ALL_OR_NONE_OPERATION_ROLLED_BACK" => AllOrNoneOperationRolledBack,
202
+ "ALREADY_IN_PROCESS" => AlreadyInProcess,
203
+ "API_CURRENTLY_DISABLED" => ApiCurrentlyDisabled,
204
+ "ASSIGNEE_TYPE_REQUIRED" => AssigneeTypeRequired,
205
+ "BAD_CUSTOM_ENTITY_PARENT_DOMAIN" => BadCustomEntityParentDomain,
206
+ "BCC_NOT_ALLOWED_IF_BCC_COMPLIANCE_ENABLED" =>
207
+ BccNotAllowedIfBccComplianceEnabled,
208
+ "BCC_SELF_NOT_ALLOWED_IF_BCC_COMPLIANCE_ENABLED" =>
209
+ BccSelfNotAllowedIfBccComplianceEnabled,
210
+ "CANNOT_CASCADE_PRODUCT_ACTIVE" => CannotCascadeProductActive,
211
+ "CANNOT_CHANGE_FIELD_TYPE_OF_APEX_REFERENCED_FIELD" =>
212
+ CannotChangeFieldTypeOfApexReferencedField,
213
+ "CANNOT_CREATE_ANOTHER_MANAGED_PACKAGE" => CannotCreateAnotherManagedPackage,
214
+ "CANNOT_DEACTIVATE_DIVISION" => CannotDeactivateDivision,
215
+ "CANNOT_DELETE_LAST_DATED_CONVERSION_RATE" =>
216
+ CannotDeleteLastDatedConversionRate,
217
+ "CANNOT_DELETE_MANAGED_OBJECT" => CannotDeleteManagedObject,
218
+ "CANNOT_DISABLE_LAST_ADMIN" => CannotDisableLastAdmin,
219
+ "CANNOT_ENABLE_IP_RESTRICT_REQUESTS" => CannotEnableIpRestrictRequests,
220
+ "CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY" => CannotInsertUpdateActivateEntity,
221
+ "CANNOT_MODIFY_MANAGED_OBJECT" => CannotModifyManagedObject,
222
+ "CANNOT_RENAME_APEX_REFERENCED_FIELD" => CannotRenameApexReferencedField,
223
+ "CANNOT_RENAME_APEX_REFERENCED_OBJECT" => CannotRenameApexReferencedObject,
224
+ "CANNOT_REPARENT_RECORD" => CannotReparentRecord,
225
+ "CANNOT_RESOLVE_NAME" => CannotResolveName,
226
+ "CANNOT_UPDATE_CONVERTED_LEAD" => CannotUpdateConvertedLead,
227
+ "CANT_DISABLE_CORP_CURRENCY" => CantDisableCorpCurrency,
228
+ "CANT_UNSET_CORP_CURRENCY" => CantUnsetCorpCurrency,
229
+ "CHILD_SHARE_FAILS_PARENT" => ChildShareFailsParent,
230
+ "CIRCULAR_DEPENDENCY" => CircularDependency,
231
+ "COMMUNITY_NOT_ACCESSIBLE" => CommunityNotAccessible,
232
+ "CUSTOM_CLOB_FIELD_LIMIT_EXCEEDED" => CustomClobFieldLimitExceeded,
233
+ "CUSTOM_ENTITY_OR_FIELD_LIMIT" => CustomEntityOrFieldLimit,
234
+ "CUSTOM_FIELD_INDEX_LIMIT_EXCEEDED" => CustomFieldIndexLimitExceeded,
235
+ "CUSTOM_INDEX_EXISTS" => CustomIndexExists,
236
+ "CUSTOM_LINK_LIMIT_EXCEEDED" => CustomLinkLimitExceeded,
237
+ "CUSTOM_METADATA_LIMIT_EXCEEDED" => CustomMetadataLimitExceeded,
238
+ "CUSTOM_SETTINGS_LIMIT_EXCEEDED" => CustomSettingsLimitExceeded,
239
+ "CUSTOM_TAB_LIMIT_EXCEEDED" => CustomTabLimitExceeded,
240
+ "DELETE_FAILED" => DeleteFailed,
241
+ "DEPENDENCY_EXISTS" => DependencyExists,
242
+ "DUPLICATE_CASE_SOLUTION" => DuplicateCaseSolution,
243
+ "DUPLICATE_CUSTOM_ENTITY_DEFINITION" => DuplicateCustomEntityDefinition,
244
+ "DUPLICATE_CUSTOM_TAB_MOTIF" => DuplicateCustomTabMotif,
245
+ "DUPLICATE_DEVELOPER_NAME" => DuplicateDeveloperName,
246
+ "DUPLICATES_DETECTED" => DuplicatesDetected,
247
+ "DUPLICATE_EXTERNAL_ID" => DuplicateExternalId,
248
+ "DUPLICATE_MASTER_LABEL" => DuplicateMasterLabel,
249
+ "DUPLICATE_SENDER_DISPLAY_NAME" => DuplicateSenderDisplayName,
250
+ "DUPLICATE_USERNAME" => DuplicateUsername,
251
+ "DUPLICATE_VALUE" => DuplicateValue,
252
+ "EMAIL_ADDRESS_BOUNCED" => EmailAddressBounced,
253
+ "EMAIL_NOT_PROCESSED_DUE_TO_PRIOR_ERROR" => EmailNotProcessedDueToPriorError,
254
+ "EMAIL_OPTED_OUT" => EmailOptedOut,
255
+ "EMAIL_TEMPLATE_FORMULA_ERROR" => EmailTemplateFormulaError,
256
+ "EMAIL_TEMPLATE_MERGEFIELD_ACCESS_ERROR" =>
257
+ EmailTemplateMergefieldAccessError,
258
+ "EMAIL_TEMPLATE_MERGEFIELD_ERROR" => EmailTemplateMergefieldError,
259
+ "EMAIL_TEMPLATE_MERGEFIELD_VALUE_ERROR" => EmailTemplateMergefieldValueError,
260
+ "EMAIL_TEMPLATE_PROCESSING_ERROR" => EmailTemplateProcessingError,
261
+ "EMPTY_SCONTROL_FILE_NAME" => EmptyScontrolFileName,
262
+ "ENTITY_FAILED_IFLASTMODIFIED_ON_UPDATE" =>
263
+ EntityFailedIflastmodifiedOnUpdate,
264
+ "ENTITY_IS_ARCHIVED" => EntityIsArchived,
265
+ "ENTITY_IS_DELETED" => EntityIsDeleted,
266
+ "ENTITY_IS_LOCKED" => EntityIsLocked,
267
+ "ENVIRONMENT_HUB_MEMBERSHIP_CONFLICT" => EnvironmentHubMembershipConflict,
268
+ "ERROR_IN_MAILER" => ErrorInMailer,
269
+ "FAILED_ACTIVATION" => FailedActivation,
270
+ "FIELD_CUSTOM_VALIDATION_EXCEPTION" => FieldCustomValidationException,
271
+ "FIELD_FILTER_VALIDATION_EXCEPTION" => FieldFilterValidationException,
272
+ "FILTERED_LOOKUP_LIMIT_EXCEEDED" => FilteredLookupLimitExceeded,
273
+ "HTML_FILE_UPLOAD_NOT_ALLOWED" => HtmlFileUploadNotAllowed,
274
+ "IMAGE_TOO_LARGE" => ImageTooLarge,
275
+ "INACTIVE_OWNER_OR_USER" => InactiveOwnerOrUser,
276
+ "INSERT_UPDATE_DELETE_NOT_ALLOWED_DURING_MAINTENANCE" =>
277
+ InsertUpdateDeleteNotAllowedDuringMaintenance,
278
+ "INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY" =>
279
+ InsufficientAccessOnCrossReferenceEntity,
280
+ "INSUFFICIENT_ACCESS_OR_READONLY" => InsufficientAccessOrReadonly,
281
+ "INVALID_ACCESS_LEVEL" => InvalidAccessLevel,
282
+ "INVALID_ARGUMENT_TYPE" => InvalidArgumentType,
283
+ "INVALID_ASSIGNEE_TYPE" => InvalidAssigneeType,
284
+ "INVALID_ASSIGNMENT_RULE" => InvalidAssignmentRule,
285
+ "INVALID_BATCH_OPERATION" => InvalidBatchOperation,
286
+ "INVALID_CONTENT_TYPE" => InvalidContentType,
287
+ "INVALID_CREDIT_CARD_INFO" => InvalidCreditCardInfo,
288
+ "INVALID_CROSS_REFERENCE_KEY" => InvalidCrossReferenceKey,
289
+ "INVALID_CROSS_REFERENCE_TYPE_FOR_FIELD" => InvalidCrossReferenceTypeForField,
290
+ "INVALID_CURRENCY_CONV_RATE" => InvalidCurrencyConvRate,
291
+ "INVALID_CURRENCY_CORP_RATE" => InvalidCurrencyCorpRate,
292
+ "INVALID_CURRENCY_ISO" => InvalidCurrencyIso,
293
+ "INVALID_EMAIL_ADDRESS" => InvalidEmailAddress,
294
+ "INVALID_EMPTY_KEY_OWNER" => InvalidEmptyKeyOwner,
295
+ "INVALID_EVENT_SUBSCRIPTION" => InvalidEventSubscription,
296
+ "INVALID_FIELD" => InvalidField,
297
+ "INVALID_FIELD_FOR_INSERT_UPDATE" => InvalidFieldForInsertUpdate,
298
+ "INVALID_FIELD_WHEN_USING_TEMPLATE" => InvalidFieldWhenUsingTemplate,
299
+ "INVALID_FILTER_ACTION" => InvalidFilterAction,
300
+ "INVALID_ID_FIELD" => InvalidIdField,
301
+ "INVALID_INET_ADDRESS" => InvalidInetAddress,
302
+ "INVALID_LINEITEM_CLONE_STATE" => InvalidLineitemCloneState,
303
+ "INVALID_MASTER_OR_TRANSLATED_SOLUTION" => InvalidMasterOrTranslatedSolution,
304
+ "INVALID_MESSAGE_ID_REFERENCE" => InvalidMessageIdReference,
305
+ "INVALID_OPERATION" => InvalidOperation,
306
+ "INVALID_OPERATOR" => InvalidOperator,
307
+ "INVALID_OR_NULL_FOR_RESTRICTED_PICKLIST" =>
308
+ InvalidOrNullForRestrictedPicklist,
309
+ "INVALID_QUERY_FILTER_OPERATOR" => InvalidQueryFilterOperator,
310
+ "INVALID_PARTNER_NETWORK_STATUS" => InvalidPartnerNetworkStatus,
311
+ "INVALID_PERSON_ACCOUNT_OPERATION" => InvalidPersonAccountOperation,
312
+ "INVALID_READ_ONLY_USER_DML" => InvalidReadOnlyUserDml,
313
+ "INVALID_SAVE_AS_ACTIVITY_FLAG" => InvalidSaveAsActivityFlag,
314
+ "INVALID_SESSION_ID" => InvalidSessionId,
315
+ "INVALID_STATUS" => InvalidStatus,
316
+ "INVALID_TYPE" => InvalidType,
317
+ "INVALID_TYPE_FOR_OPERATION" => InvalidTypeForOperation,
318
+ "INVALID_TYPE_ON_FIELD_IN_RECORD" => InvalidTypeOnFieldInRecord,
319
+ "IP_RANGE_LIMIT_EXCEEDED" => IpRangeLimitExceeded,
320
+ "JIGSAW_IMPORT_LIMIT_EXCEEDED" => JigsawImportLimitExceeded,
321
+ "LICENSE_LIMIT_EXCEEDED" => LicenseLimitExceeded,
322
+ "LIGHT_PORTAL_USER_EXCEPTION" => LightPortalUserException,
323
+ "LIMIT_EXCEEDED" => LimitExceeded,
324
+ "LOGIN_CHALLENGE_ISSUED" => LoginChallengeIssued,
325
+ "LOGIN_CHALLENGE_PENDING" => LoginChallengePending,
326
+ "LOGIN_MUST_USE_SECURITY_TOKEN" => LoginMustUseSecurityToken,
327
+ "MALFORMED_ID" => MalformedId,
328
+ "MALFORMED_QUERY" => MalformedQuery,
329
+ "MANAGER_NOT_DEFINED" => ManagerNotDefined,
330
+ "MASSMAIL_RETRY_LIMIT_EXCEEDED" => MassmailRetryLimitExceeded,
331
+ "MASS_MAIL_LIMIT_EXCEEDED" => MassMailLimitExceeded,
332
+ "MAXIMUM_CCEMAILS_EXCEEDED" => MaximumCcemailsExceeded,
333
+ "MAXIMUM_DASHBOARD_COMPONENTS_EXCEEDED" => MaximumDashboardComponentsExceeded,
334
+ "MAXIMUM_HIERARCHY_LEVELS_REACHED" => MaximumHierarchyLevelsReached,
335
+ "MAXIMUM_SIZE_OF_ATTACHMENT" => MaximumSizeOfAttachment,
336
+ "MAXIMUM_SIZE_OF_DOCUMENT" => MaximumSizeOfDocument,
337
+ "MAX_ACTIONS_PER_RULE_EXCEEDED" => MaxActionsPerRuleExceeded,
338
+ "MAX_ACTIVE_RULES_EXCEEDED" => MaxActiveRulesExceeded,
339
+ "MAX_APPROVAL_STEPS_EXCEEDED" => MaxApprovalStepsExceeded,
340
+ "MAX_FORMULAS_PER_RULE_EXCEEDED" => MaxFormulasPerRuleExceeded,
341
+ "MAX_RULES_EXCEEDED" => MaxRulesExceeded,
342
+ "MAX_RULE_ENTRIES_EXCEEDED" => MaxRuleEntriesExceeded,
343
+ "MAX_TASK_DESCRIPTION_EXCEEDED" => MaxTaskDescriptionExceeded,
344
+ "MAX_TM_RULES_EXCEEDED" => MaxTmRulesExceeded,
345
+ "MAX_TM_RULE_ITEMS_EXCEEDED" => MaxTmRuleItemsExceeded,
346
+ "MERGE_FAILED" => MergeFailed,
347
+ "MISSING_ARGUMENT" => MissingArgument,
348
+ "NONUNIQUE_SHIPPING_ADDRESS" => NonuniqueShippingAddress,
349
+ "NO_APPLICABLE_PROCESS" => NoApplicableProcess,
350
+ "NO_ATTACHMENT_PERMISSION" => NoAttachmentPermission,
351
+ "NO_INACTIVE_DIVISION_MEMBERS" => NoInactiveDivisionMembers,
352
+ "NO_MASS_MAIL_PERMISSION" => NoMassMailPermission,
353
+ "NUMBER_OUTSIDE_VALID_RANGE" => NumberOutsideValidRange,
354
+ "NUM_HISTORY_FIELDS_BY_SOBJECT_EXCEEDED" => NumHistoryFieldsBySobjectExceeded,
355
+ "OP_WITH_INVALID_USER_TYPE_EXCEPTION" => OpWithInvalidUserTypeException,
356
+ "OPTED_OUT_OF_MASS_MAIL" => OptedOutOfMassMail,
357
+ "PACKAGE_LICENSE_REQUIRED" => PackageLicenseRequired,
358
+ "PLATFORM_EVENT_ENCRYPTION_ERROR" => PlatformEventEncryptionError,
359
+ "PLATFORM_EVENT_PUBLISHING_UNAVAILABLE" => PlatformEventPublishingUnavailable,
360
+ "PLATFORM_EVENT_PUBLISH_FAILED" => PlatformEventPublishFailed,
361
+ "PORTAL_USER_ALREADY_EXISTS_FOR_CONTACT" => PortalUserAlreadyExistsForContact,
362
+ "PRIVATE_CONTACT_ON_ASSET" => PrivateContactOnAsset,
363
+ "RECORD_IN_USE_BY_WORKFLOW" => RecordInUseByWorkflow,
364
+ "REQUEST_LIMIT_EXCEEDED" => RequestLimitExceeded,
365
+ "REQUEST_RUNNING_TOO_LONG" => RequestRunningTooLong,
366
+ "REQUIRED_FIELD_MISSING" => RequiredFieldMissing,
367
+ "SELF_REFERENCE_FROM_TRIGGER" => SelfReferenceFromTrigger,
368
+ "SERVER_UNAVAILABLE" => ServerUnavailable,
369
+ "SHARE_NEEDED_FOR_CHILD_OWNER" => ShareNeededForChildOwner,
370
+ "SINGLE_EMAIL_LIMIT_EXCEEDED" => SingleEmailLimitExceeded,
371
+ "STANDARD_PRICE_NOT_DEFINED" => StandardPriceNotDefined,
372
+ "STORAGE_LIMIT_EXCEEDED" => StorageLimitExceeded,
373
+ "STRING_TOO_LONG" => StringTooLong,
374
+ "TABSET_LIMIT_EXCEEDED" => TabsetLimitExceeded,
375
+ "TEMPLATE_NOT_ACTIVE" => TemplateNotActive,
376
+ "TERRITORY_REALIGN_IN_PROGRESS" => TerritoryRealignInProgress,
377
+ "TEXT_DATA_OUTSIDE_SUPPORTED_CHARSET" => TextDataOutsideSupportedCharset,
378
+ "TOO_MANY_APEX_REQUESTS" => TooManyApexRequests,
379
+ "TOO_MANY_ENUM_VALUE" => TooManyEnumValue,
380
+ "TRANSFER_REQUIRES_READ" => TransferRequiresRead,
381
+ "UNABLE_TO_LOCK_ROW" => UnableToLockRow,
382
+ "UNAVAILABLE_RECORDTYPE_EXCEPTION" => UnavailableRecordtypeException,
383
+ "UNDELETE_FAILED" => UndeleteFailed,
384
+ "UNKNOWN_EXCEPTION" => UnknownException,
385
+ "UNSPECIFIED_EMAIL_ADDRESS" => UnspecifiedEmailAddress,
386
+ "UNSUPPORTED_APEX_TRIGGER_OPERATION" => UnsupportedApexTriggerOperation,
387
+ "UNVERIFIED_SENDER_ADDRESS" => UnverifiedSenderAddress,
388
+ "WEBLINK_SIZE_LIMIT_EXCEEDED" => WeblinkSizeLimitExceeded,
389
+ "WEBLINK_URL_INVALID" => WeblinkUrlInvalid,
390
+ "WRONG_CONTROLLER_TYPE" => WrongControllerType
391
+ }.freeze
392
+
393
+ def self.get_exception_class(error_code)
394
+ ERROR_EXCEPTION_CLASSES.fetch(error_code) do |_|
395
+ warn "[restforce] An unrecognised error code, `#{error_code}` has been " \
396
+ "received from Salesforce. Instead of raising an error-specific exception, " \
397
+ "we'll raise a generic `ResponseError`. Please report this missing error code" \
398
+ " on GitHub at <#{GITHUB_ISSUE_URL}>."
399
+
400
+ # If we've received an unexpected error where we don't have a specific
401
+ # class defined, we can return a generic ResponseError instead
402
+ ResponseError
403
+ end
404
+ end
405
+
406
+ def self.const_missing(constant_name)
407
+ warn "[restforce] You're referring to a Restforce error that isn't defined, " \
408
+ "`#{name}::#{constant_name}` (for example by trying to `rescue` it). This might " \
409
+ "be our fault - we've recently made some changes to how errors are defined. If " \
410
+ "you're sure that this is a valid Salesforce error, then please create an " \
411
+ "issue on GitHub at <#{GITHUB_ISSUE_URL}>."
412
+
413
+ super(constant_name)
414
+ end
415
+ end
416
+ end