restforce 4.2.2 → 5.0.3

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.
@@ -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,418 @@
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 ExceededMaxSemijoinSubselects < ResponseError; end
79
+ class FailedActivation < ResponseError; end
80
+ class FieldCustomValidationException < ResponseError; end
81
+ class FieldFilterValidationException < ResponseError; end
82
+ class FilteredLookupLimitExceeded < ResponseError; end
83
+ class HtmlFileUploadNotAllowed < ResponseError; end
84
+ class ImageTooLarge < ResponseError; end
85
+ class InactiveOwnerOrUser < ResponseError; end
86
+ class InsertUpdateDeleteNotAllowedDuringMaintenance < ResponseError; end
87
+ class InsufficientAccessOnCrossReferenceEntity < ResponseError; end
88
+ class InsufficientAccessOrReadonly < ResponseError; end
89
+ class InvalidAccessLevel < ResponseError; end
90
+ class InvalidArgumentType < ResponseError; end
91
+ class InvalidAssigneeType < ResponseError; end
92
+ class InvalidAssignmentRule < ResponseError; end
93
+ class InvalidBatchOperation < ResponseError; end
94
+ class InvalidContentType < ResponseError; end
95
+ class InvalidCreditCardInfo < ResponseError; end
96
+ class InvalidCrossReferenceKey < ResponseError; end
97
+ class InvalidCrossReferenceTypeForField < ResponseError; end
98
+ class InvalidCurrencyConvRate < ResponseError; end
99
+ class InvalidCurrencyCorpRate < ResponseError; end
100
+ class InvalidCurrencyIso < ResponseError; end
101
+ class InvalidEmailAddress < ResponseError; end
102
+ class InvalidEmptyKeyOwner < ResponseError; end
103
+ class InvalidEventSubscription < ResponseError; end
104
+ class InvalidField < ResponseError; end
105
+ class InvalidFieldForInsertUpdate < ResponseError; end
106
+ class InvalidFieldWhenUsingTemplate < ResponseError; end
107
+ class InvalidFilterAction < ResponseError; end
108
+ class InvalidIdField < ResponseError; end
109
+ class InvalidInetAddress < ResponseError; end
110
+ class InvalidLineitemCloneState < ResponseError; end
111
+ class InvalidMasterOrTranslatedSolution < ResponseError; end
112
+ class InvalidMessageIdReference < ResponseError; end
113
+ class InvalidOperation < ResponseError; end
114
+ class InvalidOperator < ResponseError; end
115
+ class InvalidOrNullForRestrictedPicklist < ResponseError; end
116
+ class InvalidQueryFilterOperator < ResponseError; end
117
+ class InvalidPartnerNetworkStatus < ResponseError; end
118
+ class InvalidPersonAccountOperation < ResponseError; end
119
+ class InvalidReadOnlyUserDml < ResponseError; end
120
+ class InvalidSaveAsActivityFlag < ResponseError; end
121
+ class InvalidSessionId < ResponseError; end
122
+ class InvalidStatus < ResponseError; end
123
+ class InvalidType < ResponseError; end
124
+ class InvalidTypeForOperation < ResponseError; end
125
+ class InvalidTypeOnFieldInRecord < ResponseError; end
126
+ class IpRangeLimitExceeded < ResponseError; end
127
+ class JigsawImportLimitExceeded < ResponseError; end
128
+ class LicenseLimitExceeded < ResponseError; end
129
+ class LightPortalUserException < ResponseError; end
130
+ class LimitExceeded < ResponseError; end
131
+ class LoginChallengeIssued < ResponseError; end
132
+ class LoginChallengePending < ResponseError; end
133
+ class LoginMustUseSecurityToken < ResponseError; end
134
+ class MalformedId < ResponseError; end
135
+ class MalformedQuery < ResponseError; end
136
+ class ManagerNotDefined < ResponseError; end
137
+ class MassmailRetryLimitExceeded < ResponseError; end
138
+ class MassMailLimitExceeded < ResponseError; end
139
+ class MaximumCcemailsExceeded < ResponseError; end
140
+ class MaximumDashboardComponentsExceeded < ResponseError; end
141
+ class MaximumHierarchyLevelsReached < ResponseError; end
142
+ class MaximumSizeOfAttachment < ResponseError; end
143
+ class MaximumSizeOfDocument < ResponseError; end
144
+ class MaxActionsPerRuleExceeded < ResponseError; end
145
+ class MaxActiveRulesExceeded < ResponseError; end
146
+ class MaxApprovalStepsExceeded < ResponseError; end
147
+ class MaxFormulasPerRuleExceeded < ResponseError; end
148
+ class MaxRulesExceeded < ResponseError; end
149
+ class MaxRuleEntriesExceeded < ResponseError; end
150
+ class MaxTaskDescriptionExceeded < ResponseError; end
151
+ class MaxTmRulesExceeded < ResponseError; end
152
+ class MaxTmRuleItemsExceeded < ResponseError; end
153
+ class MergeFailed < ResponseError; end
154
+ class MissingArgument < ResponseError; end
155
+ class NonuniqueShippingAddress < ResponseError; end
156
+ class NoApplicableProcess < ResponseError; end
157
+ class NoAttachmentPermission < ResponseError; end
158
+ class NoInactiveDivisionMembers < ResponseError; end
159
+ class NoMassMailPermission < ResponseError; end
160
+ class NumberOutsideValidRange < ResponseError; end
161
+ class NumHistoryFieldsBySobjectExceeded < ResponseError; end
162
+ class OpWithInvalidUserTypeException < ResponseError; end
163
+ class OptedOutOfMassMail < ResponseError; end
164
+ class PackageLicenseRequired < ResponseError; end
165
+ class PlatformEventEncryptionError < ResponseError; end
166
+ class PlatformEventPublishingUnavailable < ResponseError; end
167
+ class PlatformEventPublishFailed < ResponseError; end
168
+ class PortalUserAlreadyExistsForContact < ResponseError; end
169
+ class PrivateContactOnAsset < ResponseError; end
170
+ class RecordInUseByWorkflow < ResponseError; end
171
+ class RequestLimitExceeded < ResponseError; end
172
+ class RequestRunningTooLong < ResponseError; end
173
+ class RequiredFieldMissing < ResponseError; end
174
+ class SelfReferenceFromTrigger < ResponseError; end
175
+ class ServerUnavailable < ResponseError; end
176
+ class ShareNeededForChildOwner < ResponseError; end
177
+ class SingleEmailLimitExceeded < ResponseError; end
178
+ class StandardPriceNotDefined < ResponseError; end
179
+ class StorageLimitExceeded < ResponseError; end
180
+ class StringTooLong < ResponseError; end
181
+ class TabsetLimitExceeded < ResponseError; end
182
+ class TemplateNotActive < ResponseError; end
183
+ class TerritoryRealignInProgress < ResponseError; end
184
+ class TextDataOutsideSupportedCharset < ResponseError; end
185
+ class TooManyApexRequests < ResponseError; end
186
+ class TooManyEnumValue < ResponseError; end
187
+ class TransferRequiresRead < ResponseError; end
188
+ class UnableToLockRow < ResponseError; end
189
+ class UnavailableRecordtypeException < ResponseError; end
190
+ class UndeleteFailed < ResponseError; end
191
+ class UnknownException < ResponseError; end
192
+ class UnspecifiedEmailAddress < ResponseError; end
193
+ class UnsupportedApexTriggerOperation < ResponseError; end
194
+ class UnverifiedSenderAddress < ResponseError; end
195
+ class WeblinkSizeLimitExceeded < ResponseError; end
196
+ class WeblinkUrlInvalid < ResponseError; end
197
+ class WrongControllerType < ResponseError; end
198
+
199
+ # Maps `errorCode`s returned from Salesforce to the exception class
200
+ # to be used for these errors
201
+ ERROR_EXCEPTION_CLASSES = {
202
+ "ALL_OR_NONE_OPERATION_ROLLED_BACK" => AllOrNoneOperationRolledBack,
203
+ "ALREADY_IN_PROCESS" => AlreadyInProcess,
204
+ "API_CURRENTLY_DISABLED" => ApiCurrentlyDisabled,
205
+ "ASSIGNEE_TYPE_REQUIRED" => AssigneeTypeRequired,
206
+ "BAD_CUSTOM_ENTITY_PARENT_DOMAIN" => BadCustomEntityParentDomain,
207
+ "BCC_NOT_ALLOWED_IF_BCC_COMPLIANCE_ENABLED" =>
208
+ BccNotAllowedIfBccComplianceEnabled,
209
+ "BCC_SELF_NOT_ALLOWED_IF_BCC_COMPLIANCE_ENABLED" =>
210
+ BccSelfNotAllowedIfBccComplianceEnabled,
211
+ "CANNOT_CASCADE_PRODUCT_ACTIVE" => CannotCascadeProductActive,
212
+ "CANNOT_CHANGE_FIELD_TYPE_OF_APEX_REFERENCED_FIELD" =>
213
+ CannotChangeFieldTypeOfApexReferencedField,
214
+ "CANNOT_CREATE_ANOTHER_MANAGED_PACKAGE" => CannotCreateAnotherManagedPackage,
215
+ "CANNOT_DEACTIVATE_DIVISION" => CannotDeactivateDivision,
216
+ "CANNOT_DELETE_LAST_DATED_CONVERSION_RATE" =>
217
+ CannotDeleteLastDatedConversionRate,
218
+ "CANNOT_DELETE_MANAGED_OBJECT" => CannotDeleteManagedObject,
219
+ "CANNOT_DISABLE_LAST_ADMIN" => CannotDisableLastAdmin,
220
+ "CANNOT_ENABLE_IP_RESTRICT_REQUESTS" => CannotEnableIpRestrictRequests,
221
+ "CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY" => CannotInsertUpdateActivateEntity,
222
+ "CANNOT_MODIFY_MANAGED_OBJECT" => CannotModifyManagedObject,
223
+ "CANNOT_RENAME_APEX_REFERENCED_FIELD" => CannotRenameApexReferencedField,
224
+ "CANNOT_RENAME_APEX_REFERENCED_OBJECT" => CannotRenameApexReferencedObject,
225
+ "CANNOT_REPARENT_RECORD" => CannotReparentRecord,
226
+ "CANNOT_RESOLVE_NAME" => CannotResolveName,
227
+ "CANNOT_UPDATE_CONVERTED_LEAD" => CannotUpdateConvertedLead,
228
+ "CANT_DISABLE_CORP_CURRENCY" => CantDisableCorpCurrency,
229
+ "CANT_UNSET_CORP_CURRENCY" => CantUnsetCorpCurrency,
230
+ "CHILD_SHARE_FAILS_PARENT" => ChildShareFailsParent,
231
+ "CIRCULAR_DEPENDENCY" => CircularDependency,
232
+ "COMMUNITY_NOT_ACCESSIBLE" => CommunityNotAccessible,
233
+ "CUSTOM_CLOB_FIELD_LIMIT_EXCEEDED" => CustomClobFieldLimitExceeded,
234
+ "CUSTOM_ENTITY_OR_FIELD_LIMIT" => CustomEntityOrFieldLimit,
235
+ "CUSTOM_FIELD_INDEX_LIMIT_EXCEEDED" => CustomFieldIndexLimitExceeded,
236
+ "CUSTOM_INDEX_EXISTS" => CustomIndexExists,
237
+ "CUSTOM_LINK_LIMIT_EXCEEDED" => CustomLinkLimitExceeded,
238
+ "CUSTOM_METADATA_LIMIT_EXCEEDED" => CustomMetadataLimitExceeded,
239
+ "CUSTOM_SETTINGS_LIMIT_EXCEEDED" => CustomSettingsLimitExceeded,
240
+ "CUSTOM_TAB_LIMIT_EXCEEDED" => CustomTabLimitExceeded,
241
+ "DELETE_FAILED" => DeleteFailed,
242
+ "DEPENDENCY_EXISTS" => DependencyExists,
243
+ "DUPLICATE_CASE_SOLUTION" => DuplicateCaseSolution,
244
+ "DUPLICATE_CUSTOM_ENTITY_DEFINITION" => DuplicateCustomEntityDefinition,
245
+ "DUPLICATE_CUSTOM_TAB_MOTIF" => DuplicateCustomTabMotif,
246
+ "DUPLICATE_DEVELOPER_NAME" => DuplicateDeveloperName,
247
+ "DUPLICATES_DETECTED" => DuplicatesDetected,
248
+ "DUPLICATE_EXTERNAL_ID" => DuplicateExternalId,
249
+ "DUPLICATE_MASTER_LABEL" => DuplicateMasterLabel,
250
+ "DUPLICATE_SENDER_DISPLAY_NAME" => DuplicateSenderDisplayName,
251
+ "DUPLICATE_USERNAME" => DuplicateUsername,
252
+ "DUPLICATE_VALUE" => DuplicateValue,
253
+ "EMAIL_ADDRESS_BOUNCED" => EmailAddressBounced,
254
+ "EMAIL_NOT_PROCESSED_DUE_TO_PRIOR_ERROR" => EmailNotProcessedDueToPriorError,
255
+ "EMAIL_OPTED_OUT" => EmailOptedOut,
256
+ "EMAIL_TEMPLATE_FORMULA_ERROR" => EmailTemplateFormulaError,
257
+ "EMAIL_TEMPLATE_MERGEFIELD_ACCESS_ERROR" =>
258
+ EmailTemplateMergefieldAccessError,
259
+ "EMAIL_TEMPLATE_MERGEFIELD_ERROR" => EmailTemplateMergefieldError,
260
+ "EMAIL_TEMPLATE_MERGEFIELD_VALUE_ERROR" => EmailTemplateMergefieldValueError,
261
+ "EMAIL_TEMPLATE_PROCESSING_ERROR" => EmailTemplateProcessingError,
262
+ "EMPTY_SCONTROL_FILE_NAME" => EmptyScontrolFileName,
263
+ "ENTITY_FAILED_IFLASTMODIFIED_ON_UPDATE" =>
264
+ EntityFailedIflastmodifiedOnUpdate,
265
+ "ENTITY_IS_ARCHIVED" => EntityIsArchived,
266
+ "ENTITY_IS_DELETED" => EntityIsDeleted,
267
+ "ENTITY_IS_LOCKED" => EntityIsLocked,
268
+ "ENVIRONMENT_HUB_MEMBERSHIP_CONFLICT" => EnvironmentHubMembershipConflict,
269
+ "ERROR_IN_MAILER" => ErrorInMailer,
270
+ "EXCEEDED_MAX_SEMIJOIN_SUBSELECTS" => ExceededMaxSemijoinSubselects,
271
+ "FAILED_ACTIVATION" => FailedActivation,
272
+ "FIELD_CUSTOM_VALIDATION_EXCEPTION" => FieldCustomValidationException,
273
+ "FIELD_FILTER_VALIDATION_EXCEPTION" => FieldFilterValidationException,
274
+ "FILTERED_LOOKUP_LIMIT_EXCEEDED" => FilteredLookupLimitExceeded,
275
+ "HTML_FILE_UPLOAD_NOT_ALLOWED" => HtmlFileUploadNotAllowed,
276
+ "IMAGE_TOO_LARGE" => ImageTooLarge,
277
+ "INACTIVE_OWNER_OR_USER" => InactiveOwnerOrUser,
278
+ "INSERT_UPDATE_DELETE_NOT_ALLOWED_DURING_MAINTENANCE" =>
279
+ InsertUpdateDeleteNotAllowedDuringMaintenance,
280
+ "INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY" =>
281
+ InsufficientAccessOnCrossReferenceEntity,
282
+ "INSUFFICIENT_ACCESS_OR_READONLY" => InsufficientAccessOrReadonly,
283
+ "INVALID_ACCESS_LEVEL" => InvalidAccessLevel,
284
+ "INVALID_ARGUMENT_TYPE" => InvalidArgumentType,
285
+ "INVALID_ASSIGNEE_TYPE" => InvalidAssigneeType,
286
+ "INVALID_ASSIGNMENT_RULE" => InvalidAssignmentRule,
287
+ "INVALID_BATCH_OPERATION" => InvalidBatchOperation,
288
+ "INVALID_CONTENT_TYPE" => InvalidContentType,
289
+ "INVALID_CREDIT_CARD_INFO" => InvalidCreditCardInfo,
290
+ "INVALID_CROSS_REFERENCE_KEY" => InvalidCrossReferenceKey,
291
+ "INVALID_CROSS_REFERENCE_TYPE_FOR_FIELD" => InvalidCrossReferenceTypeForField,
292
+ "INVALID_CURRENCY_CONV_RATE" => InvalidCurrencyConvRate,
293
+ "INVALID_CURRENCY_CORP_RATE" => InvalidCurrencyCorpRate,
294
+ "INVALID_CURRENCY_ISO" => InvalidCurrencyIso,
295
+ "INVALID_EMAIL_ADDRESS" => InvalidEmailAddress,
296
+ "INVALID_EMPTY_KEY_OWNER" => InvalidEmptyKeyOwner,
297
+ "INVALID_EVENT_SUBSCRIPTION" => InvalidEventSubscription,
298
+ "INVALID_FIELD" => InvalidField,
299
+ "INVALID_FIELD_FOR_INSERT_UPDATE" => InvalidFieldForInsertUpdate,
300
+ "INVALID_FIELD_WHEN_USING_TEMPLATE" => InvalidFieldWhenUsingTemplate,
301
+ "INVALID_FILTER_ACTION" => InvalidFilterAction,
302
+ "INVALID_ID_FIELD" => InvalidIdField,
303
+ "INVALID_INET_ADDRESS" => InvalidInetAddress,
304
+ "INVALID_LINEITEM_CLONE_STATE" => InvalidLineitemCloneState,
305
+ "INVALID_MASTER_OR_TRANSLATED_SOLUTION" => InvalidMasterOrTranslatedSolution,
306
+ "INVALID_MESSAGE_ID_REFERENCE" => InvalidMessageIdReference,
307
+ "INVALID_OPERATION" => InvalidOperation,
308
+ "INVALID_OPERATOR" => InvalidOperator,
309
+ "INVALID_OR_NULL_FOR_RESTRICTED_PICKLIST" =>
310
+ InvalidOrNullForRestrictedPicklist,
311
+ "INVALID_QUERY_FILTER_OPERATOR" => InvalidQueryFilterOperator,
312
+ "INVALID_PARTNER_NETWORK_STATUS" => InvalidPartnerNetworkStatus,
313
+ "INVALID_PERSON_ACCOUNT_OPERATION" => InvalidPersonAccountOperation,
314
+ "INVALID_READ_ONLY_USER_DML" => InvalidReadOnlyUserDml,
315
+ "INVALID_SAVE_AS_ACTIVITY_FLAG" => InvalidSaveAsActivityFlag,
316
+ "INVALID_SESSION_ID" => InvalidSessionId,
317
+ "INVALID_STATUS" => InvalidStatus,
318
+ "INVALID_TYPE" => InvalidType,
319
+ "INVALID_TYPE_FOR_OPERATION" => InvalidTypeForOperation,
320
+ "INVALID_TYPE_ON_FIELD_IN_RECORD" => InvalidTypeOnFieldInRecord,
321
+ "IP_RANGE_LIMIT_EXCEEDED" => IpRangeLimitExceeded,
322
+ "JIGSAW_IMPORT_LIMIT_EXCEEDED" => JigsawImportLimitExceeded,
323
+ "LICENSE_LIMIT_EXCEEDED" => LicenseLimitExceeded,
324
+ "LIGHT_PORTAL_USER_EXCEPTION" => LightPortalUserException,
325
+ "LIMIT_EXCEEDED" => LimitExceeded,
326
+ "LOGIN_CHALLENGE_ISSUED" => LoginChallengeIssued,
327
+ "LOGIN_CHALLENGE_PENDING" => LoginChallengePending,
328
+ "LOGIN_MUST_USE_SECURITY_TOKEN" => LoginMustUseSecurityToken,
329
+ "MALFORMED_ID" => MalformedId,
330
+ "MALFORMED_QUERY" => MalformedQuery,
331
+ "MANAGER_NOT_DEFINED" => ManagerNotDefined,
332
+ "MASSMAIL_RETRY_LIMIT_EXCEEDED" => MassmailRetryLimitExceeded,
333
+ "MASS_MAIL_LIMIT_EXCEEDED" => MassMailLimitExceeded,
334
+ "MAXIMUM_CCEMAILS_EXCEEDED" => MaximumCcemailsExceeded,
335
+ "MAXIMUM_DASHBOARD_COMPONENTS_EXCEEDED" => MaximumDashboardComponentsExceeded,
336
+ "MAXIMUM_HIERARCHY_LEVELS_REACHED" => MaximumHierarchyLevelsReached,
337
+ "MAXIMUM_SIZE_OF_ATTACHMENT" => MaximumSizeOfAttachment,
338
+ "MAXIMUM_SIZE_OF_DOCUMENT" => MaximumSizeOfDocument,
339
+ "MAX_ACTIONS_PER_RULE_EXCEEDED" => MaxActionsPerRuleExceeded,
340
+ "MAX_ACTIVE_RULES_EXCEEDED" => MaxActiveRulesExceeded,
341
+ "MAX_APPROVAL_STEPS_EXCEEDED" => MaxApprovalStepsExceeded,
342
+ "MAX_FORMULAS_PER_RULE_EXCEEDED" => MaxFormulasPerRuleExceeded,
343
+ "MAX_RULES_EXCEEDED" => MaxRulesExceeded,
344
+ "MAX_RULE_ENTRIES_EXCEEDED" => MaxRuleEntriesExceeded,
345
+ "MAX_TASK_DESCRIPTION_EXCEEDED" => MaxTaskDescriptionExceeded,
346
+ "MAX_TM_RULES_EXCEEDED" => MaxTmRulesExceeded,
347
+ "MAX_TM_RULE_ITEMS_EXCEEDED" => MaxTmRuleItemsExceeded,
348
+ "MERGE_FAILED" => MergeFailed,
349
+ "MISSING_ARGUMENT" => MissingArgument,
350
+ "NONUNIQUE_SHIPPING_ADDRESS" => NonuniqueShippingAddress,
351
+ "NO_APPLICABLE_PROCESS" => NoApplicableProcess,
352
+ "NO_ATTACHMENT_PERMISSION" => NoAttachmentPermission,
353
+ "NO_INACTIVE_DIVISION_MEMBERS" => NoInactiveDivisionMembers,
354
+ "NO_MASS_MAIL_PERMISSION" => NoMassMailPermission,
355
+ "NUMBER_OUTSIDE_VALID_RANGE" => NumberOutsideValidRange,
356
+ "NUM_HISTORY_FIELDS_BY_SOBJECT_EXCEEDED" => NumHistoryFieldsBySobjectExceeded,
357
+ "OP_WITH_INVALID_USER_TYPE_EXCEPTION" => OpWithInvalidUserTypeException,
358
+ "OPTED_OUT_OF_MASS_MAIL" => OptedOutOfMassMail,
359
+ "PACKAGE_LICENSE_REQUIRED" => PackageLicenseRequired,
360
+ "PLATFORM_EVENT_ENCRYPTION_ERROR" => PlatformEventEncryptionError,
361
+ "PLATFORM_EVENT_PUBLISHING_UNAVAILABLE" => PlatformEventPublishingUnavailable,
362
+ "PLATFORM_EVENT_PUBLISH_FAILED" => PlatformEventPublishFailed,
363
+ "PORTAL_USER_ALREADY_EXISTS_FOR_CONTACT" => PortalUserAlreadyExistsForContact,
364
+ "PRIVATE_CONTACT_ON_ASSET" => PrivateContactOnAsset,
365
+ "RECORD_IN_USE_BY_WORKFLOW" => RecordInUseByWorkflow,
366
+ "REQUEST_LIMIT_EXCEEDED" => RequestLimitExceeded,
367
+ "REQUEST_RUNNING_TOO_LONG" => RequestRunningTooLong,
368
+ "REQUIRED_FIELD_MISSING" => RequiredFieldMissing,
369
+ "SELF_REFERENCE_FROM_TRIGGER" => SelfReferenceFromTrigger,
370
+ "SERVER_UNAVAILABLE" => ServerUnavailable,
371
+ "SHARE_NEEDED_FOR_CHILD_OWNER" => ShareNeededForChildOwner,
372
+ "SINGLE_EMAIL_LIMIT_EXCEEDED" => SingleEmailLimitExceeded,
373
+ "STANDARD_PRICE_NOT_DEFINED" => StandardPriceNotDefined,
374
+ "STORAGE_LIMIT_EXCEEDED" => StorageLimitExceeded,
375
+ "STRING_TOO_LONG" => StringTooLong,
376
+ "TABSET_LIMIT_EXCEEDED" => TabsetLimitExceeded,
377
+ "TEMPLATE_NOT_ACTIVE" => TemplateNotActive,
378
+ "TERRITORY_REALIGN_IN_PROGRESS" => TerritoryRealignInProgress,
379
+ "TEXT_DATA_OUTSIDE_SUPPORTED_CHARSET" => TextDataOutsideSupportedCharset,
380
+ "TOO_MANY_APEX_REQUESTS" => TooManyApexRequests,
381
+ "TOO_MANY_ENUM_VALUE" => TooManyEnumValue,
382
+ "TRANSFER_REQUIRES_READ" => TransferRequiresRead,
383
+ "UNABLE_TO_LOCK_ROW" => UnableToLockRow,
384
+ "UNAVAILABLE_RECORDTYPE_EXCEPTION" => UnavailableRecordtypeException,
385
+ "UNDELETE_FAILED" => UndeleteFailed,
386
+ "UNKNOWN_EXCEPTION" => UnknownException,
387
+ "UNSPECIFIED_EMAIL_ADDRESS" => UnspecifiedEmailAddress,
388
+ "UNSUPPORTED_APEX_TRIGGER_OPERATION" => UnsupportedApexTriggerOperation,
389
+ "UNVERIFIED_SENDER_ADDRESS" => UnverifiedSenderAddress,
390
+ "WEBLINK_SIZE_LIMIT_EXCEEDED" => WeblinkSizeLimitExceeded,
391
+ "WEBLINK_URL_INVALID" => WeblinkUrlInvalid,
392
+ "WRONG_CONTROLLER_TYPE" => WrongControllerType
393
+ }.freeze
394
+
395
+ def self.get_exception_class(error_code)
396
+ ERROR_EXCEPTION_CLASSES.fetch(error_code) do |_|
397
+ warn "[restforce] An unrecognised error code, `#{error_code}` has been " \
398
+ "received from Salesforce. Instead of raising an error-specific exception, " \
399
+ "we'll raise a generic `ResponseError`. Please report this missing error code" \
400
+ " on GitHub at <#{GITHUB_ISSUE_URL}>."
401
+
402
+ # If we've received an unexpected error where we don't have a specific
403
+ # class defined, we can return a generic ResponseError instead
404
+ ResponseError
405
+ end
406
+ end
407
+
408
+ def self.const_missing(constant_name)
409
+ warn "[restforce] You're referring to a Restforce error that isn't defined, " \
410
+ "`#{name}::#{constant_name}` (for example by trying to `rescue` it). This might " \
411
+ "be our fault - we've recently made some changes to how errors are defined. If " \
412
+ "you're sure that this is a valid Salesforce error, then please create an " \
413
+ "issue on GitHub at <#{GITHUB_ISSUE_URL}>."
414
+
415
+ super(constant_name)
416
+ end
417
+ end
418
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ begin
4
+ require 'faraday/file_part'
5
+ rescue LoadError
6
+ require 'faraday/upload_io'
7
+ end
8
+
9
+ module Restforce
10
+ if defined?(::Faraday::FilePart)
11
+ FilePart = Faraday::FilePart
12
+
13
+ # Deprecated
14
+ UploadIO = Faraday::FilePart
15
+ else
16
+ # Handle pre-1.0 versions of faraday
17
+ FilePart = Faraday::UploadIO
18
+ UploadIO = Faraday::UploadIO
19
+ end
20
+ end
21
+
22
+ # This patch is only needed with multipart-post < 2.0.0
23
+ # 2.0.0 was released in 2013.
24
+ require 'restforce/patches/parts' unless Parts::Part.method(:new).arity.abs == 4