slack-ruby-client 2.1.0 → 2.2.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.
Files changed (137) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +2 -0
  3. data/.github/workflows/test.yml +6 -0
  4. data/.github/workflows/update_api.yml +76 -0
  5. data/.gitignore +1 -0
  6. data/.rubocop_todo.yml +17 -29
  7. data/CHANGELOG.md +23 -1
  8. data/CONTRIBUTING.md +35 -32
  9. data/Gemfile +2 -0
  10. data/README.md +123 -14
  11. data/bin/commands/admin_apps_activities.rb +32 -0
  12. data/bin/commands/admin_apps_approved.rb +1 -0
  13. data/bin/commands/admin_apps_config.rb +31 -0
  14. data/bin/commands/admin_apps_requests.rb +1 -0
  15. data/bin/commands/admin_apps_restricted.rb +1 -0
  16. data/bin/commands/admin_functions.rb +23 -0
  17. data/bin/commands/admin_functions_permissions.rb +31 -0
  18. data/bin/commands/admin_roles.rb +1 -1
  19. data/bin/commands/admin_teams.rb +1 -1
  20. data/bin/commands/admin_users.rb +2 -2
  21. data/bin/commands/admin_workflows.rb +38 -0
  22. data/bin/commands/admin_workflows_collaborators.rb +31 -0
  23. data/bin/commands/admin_workflows_permissions.rb +21 -0
  24. data/bin/commands/apps_activities.rb +32 -0
  25. data/bin/commands/apps_auth_external.rb +32 -0
  26. data/bin/commands/apps_datastore.rb +70 -0
  27. data/bin/commands/auth_teams.rb +2 -2
  28. data/bin/commands/calls.rb +1 -1
  29. data/bin/commands/chat.rb +6 -6
  30. data/bin/commands/chat_scheduledMessages.rb +2 -2
  31. data/bin/commands/conversations.rb +3 -3
  32. data/bin/commands/dnd.rb +1 -1
  33. data/bin/commands/functions_workflows_steps.rb +2 -1
  34. data/bin/commands/functions_workflows_steps_responses.rb +2 -1
  35. data/bin/commands/reminders.rb +1 -1
  36. data/bin/commands/stars.rb +4 -4
  37. data/bin/commands/team.rb +3 -1
  38. data/bin/commands/users.rb +1 -1
  39. data/lib/slack/messages/formatting.rb +44 -0
  40. data/lib/slack/real_time/client.rb +14 -2
  41. data/lib/slack/real_time/concurrency/async.rb +4 -0
  42. data/lib/slack/real_time/config.rb +3 -0
  43. data/lib/slack/real_time/socket.rb +4 -0
  44. data/lib/slack/real_time/stores/starter.rb +2 -2
  45. data/lib/slack/real_time/stores/store.rb +2 -2
  46. data/lib/slack/version.rb +1 -1
  47. data/lib/slack/web/api/endpoints/admin_apps_activities.rb +53 -0
  48. data/lib/slack/web/api/endpoints/admin_apps_approved.rb +2 -0
  49. data/lib/slack/web/api/endpoints/admin_apps_config.rb +40 -0
  50. data/lib/slack/web/api/endpoints/admin_apps_requests.rb +2 -0
  51. data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +2 -0
  52. data/lib/slack/web/api/endpoints/admin_conversations.rb +1 -0
  53. data/lib/slack/web/api/endpoints/admin_functions.rb +36 -0
  54. data/lib/slack/web/api/endpoints/admin_functions_permissions.rb +41 -0
  55. data/lib/slack/web/api/endpoints/admin_roles.rb +1 -1
  56. data/lib/slack/web/api/endpoints/admin_teams.rb +1 -1
  57. data/lib/slack/web/api/endpoints/admin_users.rb +2 -2
  58. data/lib/slack/web/api/endpoints/admin_workflows.rb +59 -0
  59. data/lib/slack/web/api/endpoints/admin_workflows_collaborators.rb +42 -0
  60. data/lib/slack/web/api/endpoints/admin_workflows_permissions.rb +26 -0
  61. data/lib/slack/web/api/endpoints/apps_activities.rb +54 -0
  62. data/lib/slack/web/api/endpoints/apps_auth_external.rb +41 -0
  63. data/lib/slack/web/api/endpoints/apps_datastore.rb +110 -0
  64. data/lib/slack/web/api/endpoints/apps_manifest.rb +2 -0
  65. data/lib/slack/web/api/endpoints/auth_teams.rb +1 -1
  66. data/lib/slack/web/api/endpoints/calls.rb +1 -1
  67. data/lib/slack/web/api/endpoints/chat.rb +14 -45
  68. data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +2 -2
  69. data/lib/slack/web/api/endpoints/conversations.rb +3 -3
  70. data/lib/slack/web/api/endpoints/dialog.rb +1 -6
  71. data/lib/slack/web/api/endpoints/dnd.rb +1 -1
  72. data/lib/slack/web/api/endpoints/functions_workflows_steps.rb +3 -1
  73. data/lib/slack/web/api/endpoints/functions_workflows_steps_responses.rb +3 -1
  74. data/lib/slack/web/api/endpoints/reminders.rb +1 -1
  75. data/lib/slack/web/api/endpoints/stars.rb +2 -2
  76. data/lib/slack/web/api/endpoints/team.rb +12 -2
  77. data/lib/slack/web/api/endpoints/users.rb +1 -1
  78. data/lib/slack/web/api/endpoints/users_profile.rb +1 -0
  79. data/lib/slack/web/api/endpoints/views.rb +7 -23
  80. data/lib/slack/web/api/endpoints/workflows.rb +2 -0
  81. data/lib/slack/web/api/endpoints.rb +20 -0
  82. data/lib/slack/web/api/errors.rb +66 -4
  83. data/lib/slack/web/api/options.rb +26 -0
  84. data/lib/slack/web/api/patches/chat.attachments-blocks.patch +7 -55
  85. data/lib/slack/web/api/templates/method.erb +12 -0
  86. data/lib/slack/web/api/templates/method_spec.erb +40 -4
  87. data/lib/slack/web/client.rb +1 -0
  88. data/lib/slack-ruby-client.rb +1 -0
  89. data/lib/tasks/web.rake +2 -4
  90. data/slack-ruby-client.gemspec +1 -0
  91. data/spec/slack/messages/formatting_spec.rb +60 -0
  92. data/spec/slack/real_time/client_spec.rb +25 -7
  93. data/spec/slack/real_time/concurrency/clients/async_spec.rb +16 -0
  94. data/spec/slack/web/api/endpoints/admin_apps_activities_spec.rb +8 -0
  95. data/spec/slack/web/api/endpoints/admin_apps_config_spec.rb +18 -0
  96. data/spec/slack/web/api/endpoints/admin_auth_policy_spec.rb +6 -6
  97. data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +14 -10
  98. data/spec/slack/web/api/endpoints/admin_functions_permissions_spec.rb +21 -0
  99. data/spec/slack/web/api/endpoints/admin_functions_spec.rb +13 -0
  100. data/spec/slack/web/api/endpoints/admin_roles_spec.rb +6 -6
  101. data/spec/slack/web/api/endpoints/admin_teams_settings_spec.rb +1 -1
  102. data/spec/slack/web/api/endpoints/admin_usergroups_spec.rb +6 -6
  103. data/spec/slack/web/api/endpoints/admin_users_session_spec.rb +2 -2
  104. data/spec/slack/web/api/endpoints/admin_users_spec.rb +8 -8
  105. data/spec/slack/web/api/endpoints/admin_workflows_collaborators_spec.rb +24 -0
  106. data/spec/slack/web/api/endpoints/admin_workflows_permissions_spec.rb +13 -0
  107. data/spec/slack/web/api/endpoints/admin_workflows_spec.rb +13 -0
  108. data/spec/slack/web/api/endpoints/apps_activities_spec.rb +13 -0
  109. data/spec/slack/web/api/endpoints/apps_auth_external_spec.rb +13 -0
  110. data/spec/slack/web/api/endpoints/apps_datastore_spec.rb +45 -0
  111. data/spec/slack/web/api/endpoints/apps_manifest_spec.rb +8 -0
  112. data/spec/slack/web/api/endpoints/apps_spec.rb +2 -2
  113. data/spec/slack/web/api/endpoints/auth_spec.rb +8 -0
  114. data/spec/slack/web/api/endpoints/bookmarks_spec.rb +4 -4
  115. data/spec/slack/web/api/endpoints/calls_participants_spec.rb +4 -4
  116. data/spec/slack/web/api/endpoints/calls_spec.rb +2 -2
  117. data/spec/slack/web/api/endpoints/chat_spec.rb +62 -0
  118. data/spec/slack/web/api/endpoints/conversations_spec.rb +8 -0
  119. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +3 -3
  120. data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +1 -1
  121. data/spec/slack/web/api/endpoints/dialog_spec.rb +14 -0
  122. data/spec/slack/web/api/endpoints/files_comments_spec.rb +2 -2
  123. data/spec/slack/web/api/endpoints/files_remote_spec.rb +3 -3
  124. data/spec/slack/web/api/endpoints/files_spec.rb +2 -2
  125. data/spec/slack/web/api/endpoints/oauth_v2_spec.rb +2 -2
  126. data/spec/slack/web/api/endpoints/reactions_spec.rb +3 -3
  127. data/spec/slack/web/api/endpoints/reminders_spec.rb +2 -2
  128. data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +2 -2
  129. data/spec/slack/web/api/endpoints/users_profile_spec.rb +6 -0
  130. data/spec/slack/web/api/endpoints/users_spec.rb +8 -0
  131. data/spec/slack/web/api/endpoints/views_spec.rb +65 -0
  132. data/spec/slack/web/api/endpoints/workflows_spec.rb +8 -0
  133. data/spec/slack/web/api/options_spec.rb +69 -0
  134. data/spec/spec_helper.rb +9 -0
  135. metadata +45 -5
  136. data/lib/slack/web/api/patches/dialog.encoded-json.patch +0 -17
  137. data/lib/slack/web/api/patches/views.view-json.patch +0 -55
@@ -6,6 +6,7 @@ module Slack
6
6
  module Api
7
7
  module Errors
8
8
  class AccessDenied < SlackError; end
9
+ class AccessTokenExchangeFailed < SlackError; end
9
10
  class Accesslimited < SlackError; end
10
11
  class AccountInactive < SlackError; end
11
12
  class ActionAlreadyInProgress < SlackError; end
@@ -25,6 +26,7 @@ module Slack
25
26
  class AppMissingActionUrl < SlackError; end
26
27
  class AppNotEligible < SlackError; end
27
28
  class AppNotFound < SlackError; end
29
+ class AppNotHosted < SlackError; end
28
30
  class AppRestrictedOrgWide < SlackError; end
29
31
  class ApprovalInactive < SlackError; end
30
32
  class ApprovalNotFound < SlackError; end
@@ -77,10 +79,10 @@ module Slack
77
79
  class CannotParse < SlackError; end
78
80
  class CannotParseAttachment < SlackError; end
79
81
  class CannotPrompt < SlackError; end
82
+ class CannotReplyToMessage < SlackError; end
80
83
  class CannotResetBot < SlackError; end
81
84
  class CannotResetPrimaryOwner < SlackError; end
82
85
  class CannotResolveAlias < SlackError; end
83
- class CannotSetBothNumMinutesAndIsIndefinite < SlackError; end
84
86
  class CannotSetThisGuestToRegularAtTeamLevel < SlackError; end
85
87
  class CannotShareCrossWorkspaceChannel < SlackError; end
86
88
  class CannotShareMandatoryChannel < SlackError; end
@@ -101,6 +103,7 @@ module Slack
101
103
  class CantUpdateMessage < SlackError; end
102
104
  class CanvasDisabledFileTeam < SlackError; end
103
105
  class CanvasDisabledUserTeam < SlackError; end
106
+ class CanvasGloballyDisabled < SlackError; end
104
107
  class ChannelArchived < SlackError; end
105
108
  class ChannelCannotBeUnshared < SlackError; end
106
109
  class ChannelCanvasDeleted < SlackError; end
@@ -133,6 +136,8 @@ module Slack
133
136
  class CouldNotUnarchiveChannel < SlackError; end
134
137
  class CustomIntegrationNotAllowedAtEnterprise < SlackError; end
135
138
  class DataNotAvailable < SlackError; end
139
+ class DatastoreError < SlackError; end
140
+ class DatastoreMigrationInProgress < SlackError; end
136
141
  class DefaultChannelRestricted < SlackError; end
137
142
  class DefaultOrgWideChannel < SlackError; end
138
143
  class DeleteNotAllowed < SlackError; end
@@ -146,6 +151,7 @@ module Slack
146
151
  class EditWindowClosed < SlackError; end
147
152
  class EkmAccessDenied < SlackError; end
148
153
  class EmailDoesNotMatch < SlackError; end
154
+ class EmailNotVerified < SlackError; end
149
155
  class EmailTaken < SlackError; end
150
156
  class EmojiLimitReached < SlackError; end
151
157
  class EmojiNotFound < SlackError; end
@@ -153,6 +159,7 @@ module Slack
153
159
  class EnterpriseIsRestricted < SlackError; end
154
160
  class EnterpriseNotFound < SlackError; end
155
161
  class EntityNotFound < SlackError; end
162
+ class ErrorAddingCollaborators < SlackError; end
156
163
  class ErrorBadFormat < SlackError; end
157
164
  class ErrorBadNameI18n < SlackError; end
158
165
  class ErrorBadUpload < SlackError; end
@@ -163,7 +170,9 @@ module Slack
163
170
  class ErrorNameTaken < SlackError; end
164
171
  class ErrorNameTakenI18n < SlackError; end
165
172
  class ErrorNoImage < SlackError; end
173
+ class ErrorRemovingCollaborators < SlackError; end
166
174
  class ErrorTooBig < SlackError; end
175
+ class ErrorUnpublishingWorkflows < SlackError; end
167
176
  class ExchangedTriggerId < SlackError; end
168
177
  class ExpiredTriggerId < SlackError; end
169
178
  class ExternalChannelMigrating < SlackError; end
@@ -221,6 +230,8 @@ module Slack
221
230
  class FileUploadsDisabled < SlackError; end
222
231
  class ForbiddenHandle < SlackError; end
223
232
  class ForbiddenTeam < SlackError; end
233
+ class FreeTeamNotAllowed < SlackError; end
234
+ class FunctionNotFound < SlackError; end
224
235
  class GroupAlreadyLinkedToChannel < SlackError; end
225
236
  class GroupMustNotBeEmpty < SlackError; end
226
237
  class GroupNotFound < SlackError; end
@@ -256,7 +267,9 @@ module Slack
256
267
  class InvalidCode < SlackError; end
257
268
  class InvalidCreatedBy < SlackError; end
258
269
  class InvalidCursor < SlackError; end
270
+ class InvalidDatastore < SlackError; end
259
271
  class InvalidDate < SlackError; end
272
+ class InvalidDomains < SlackError; end
260
273
  class InvalidDuration < SlackError; end
261
274
  class InvalidEmail < SlackError; end
262
275
  class InvalidEmoji < SlackError; end
@@ -300,6 +313,7 @@ module Slack
300
313
  class InvalidScheduledMessageId < SlackError; end
301
314
  class InvalidScopes < SlackError; end
302
315
  class InvalidSearchChannelType < SlackError; end
316
+ class InvalidSetting < SlackError; end
303
317
  class InvalidSort < SlackError; end
304
318
  class InvalidSortDir < SlackError; end
305
319
  class InvalidSource < SlackError; end
@@ -309,6 +323,7 @@ module Slack
309
323
  class InvalidTeam < SlackError; end
310
324
  class InvalidTeamId < SlackError; end
311
325
  class InvalidTeamIds < SlackError; end
326
+ class InvalidThreadTs < SlackError; end
312
327
  class InvalidTime < SlackError; end
313
328
  class InvalidTimestamp < SlackError; end
314
329
  class InvalidTitle < SlackError; end
@@ -327,6 +342,7 @@ module Slack
327
342
  class InvalidUserId < SlackError; end
328
343
  class InvalidUsers < SlackError; end
329
344
  class InvalidValue < SlackError; end
345
+ class InvalidWorkflowAuthStrategy < SlackError; end
330
346
  class InviteFromSameOrg < SlackError; end
331
347
  class InviteLookupError < SlackError; end
332
348
  class InviteNotFound < SlackError; end
@@ -337,6 +353,7 @@ module Slack
337
353
  class InvitorCannotSeeChannel < SlackError; end
338
354
  class IsArchived < SlackError; end
339
355
  class IsBot < SlackError; end
356
+ class IsIdpManaged < SlackError; end
340
357
  class IsInactive < SlackError; end
341
358
  class IsPendingConnectedToOrg < SlackError; end
342
359
  class LastMember < SlackError; end
@@ -350,6 +367,7 @@ module Slack
350
367
  class ManagedChannelNotSupported < SlackError; end
351
368
  class MemberAnalyticsDisabled < SlackError; end
352
369
  class MemberLimitExceeded < SlackError; end
370
+ class MessageLimitExceeded < SlackError; end
353
371
  class MessageNotFound < SlackError; end
354
372
  class MessageTooLong < SlackError; end
355
373
  class MessagesTabDisabled < SlackError; end
@@ -358,6 +376,7 @@ module Slack
358
376
  class MetadataOnlyDoesNotSupportDate < SlackError; end
359
377
  class MetadataTooLarge < SlackError; end
360
378
  class MethodDeprecated < SlackError; end
379
+ class MethodNotSupported < SlackError; end
361
380
  class MethodNotSupportedForChannelType < SlackError; end
362
381
  class MigrationInProgress < SlackError; end
363
382
  class MissingArgs < SlackError; end
@@ -384,6 +403,7 @@ module Slack
384
403
  class MustProvideTeamName < SlackError; end
385
404
  class MustRevokeAccess < SlackError; end
386
405
  class NameAlreadyExists < SlackError; end
406
+ class NameNotAllowed < SlackError; end
387
407
  class NameTaken < SlackError; end
388
408
  class NameTakenInOrg < SlackError; end
389
409
  class NameTooLong < SlackError; end
@@ -392,6 +412,7 @@ module Slack
392
412
  class NoBotUserForApp < SlackError; end
393
413
  class NoChannel < SlackError; end
394
414
  class NoChannelMemberships < SlackError; end
415
+ class NoDomainsProvided < SlackError; end
395
416
  class NoDualBroadcastContentUpdate < SlackError; end
396
417
  class NoImageUploaded < SlackError; end
397
418
  class NoItemSpecified < SlackError; end
@@ -399,12 +420,14 @@ module Slack
399
420
  class NoPermission < SlackError; end
400
421
  class NoPin < SlackError; end
401
422
  class NoReaction < SlackError; end
423
+ class NoRefreshToken < SlackError; end
402
424
  class NoResolutionFound < SlackError; end
403
425
  class NoScopes < SlackError; end
404
426
  class NoSuchSubteam < SlackError; end
405
427
  class NoTeamIdsGiven < SlackError; end
406
428
  class NoTeamsToDisconnect < SlackError; end
407
429
  class NoText < SlackError; end
430
+ class NoTokensFound < SlackError; end
408
431
  class NoUser < SlackError; end
409
432
  class NoUsersProvided < SlackError; end
410
433
  class NoValidChannels < SlackError; end
@@ -442,6 +465,7 @@ module Slack
442
465
  class OrgLevelEmailDisplayDisabled < SlackError; end
443
466
  class OrgLoginRequired < SlackError; end
444
467
  class OrgNotFound < SlackError; end
468
+ class OrgResolutionRequired < SlackError; end
445
469
  class OrgUserNotInTeam < SlackError; end
446
470
  class OverMaxEntityLimit < SlackError; end
447
471
  class OverPaginationLimit < SlackError; end
@@ -460,6 +484,7 @@ module Slack
460
484
  class PreviewFeatureNotAvailable < SlackError; end
461
485
  class PrimaryUsergroupNotFound < SlackError; end
462
486
  class ProfileSetFailed < SlackError; end
487
+ class ProvidersNotFound < SlackError; end
463
488
  class PublicVideoNotAllowed < SlackError; end
464
489
  class PublishedAppOnly < SlackError; end
465
490
  class PushLimitReached < SlackError; end
@@ -491,7 +516,6 @@ module Slack
491
516
  class SlackConnectClipSharingBlocked < SlackError; end
492
517
  class SlackConnectFileLinkSharingBlocked < SlackError; end
493
518
  class SlackConnectFileUploadSharingBlocked < SlackError; end
494
- class SlackConnectTeamBlocked < SlackError; end
495
519
  class SnippetTooLarge < SlackError; end
496
520
  class SnoozeEndFailed < SlackError; end
497
521
  class SnoozeFailed < SlackError; end
@@ -508,13 +532,16 @@ module Slack
508
532
  class TeamIdRequiredForEnterprise < SlackError; end
509
533
  class TeamNotFound < SlackError; end
510
534
  class TeamNotOnEnterprise < SlackError; end
535
+ class TeamQuotaExceeded < SlackError; end
511
536
  class TeamsNotFound < SlackError; end
537
+ class TemplateNotVisible < SlackError; end
512
538
  class ThreadLocked < SlackError; end
513
539
  class ThreadNotFound < SlackError; end
514
540
  class TimeInPast < SlackError; end
515
541
  class TimeTooFar < SlackError; end
516
542
  class TokenAlreadyExchanged < SlackError; end
517
543
  class TokenExpired < SlackError; end
544
+ class TokenNotFound < SlackError; end
518
545
  class TokenRevoked < SlackError; end
519
546
  class TokenRotationNotEnabled < SlackError; end
520
547
  class TooLarge < SlackError; end
@@ -524,6 +551,7 @@ module Slack
524
551
  class TooManyContactCards < SlackError; end
525
552
  class TooManyConvosForAppOnTeam < SlackError; end
526
553
  class TooManyConvosForTeam < SlackError; end
554
+ class TooManyDomainsProvided < SlackError; end
527
555
  class TooManyEmails < SlackError; end
528
556
  class TooManyEmoji < SlackError; end
529
557
  class TooManyEntities < SlackError; end
@@ -541,6 +569,7 @@ module Slack
541
569
  class TriggerExchanged < SlackError; end
542
570
  class TriggerExpired < SlackError; end
543
571
  class TwoFactorSetupRequired < SlackError; end
572
+ class UnableToDelete < SlackError; end
544
573
  class UnableToFetchCustomEmojis < SlackError; end
545
574
  class UnableToLinkIdpGroupAndChannel < SlackError; end
546
575
  class UnableToProcessPostRequest < SlackError; end
@@ -563,6 +592,7 @@ module Slack
563
592
  class UpdateFailed < SlackError; end
564
593
  class UraMaxChannels < SlackError; end
565
594
  class UrlInMessage < SlackError; end
595
+ class UrlRestrictionNotSupported < SlackError; end
566
596
  class UserAlreadyDeleted < SlackError; end
567
597
  class UserAlreadyTeamMember < SlackError; end
568
598
  class UserCannotCreateChannel < SlackError; end
@@ -587,9 +617,11 @@ module Slack
587
617
  class UsersNotFound < SlackError; end
588
618
  class ValidationErrors < SlackError; end
589
619
  class ViewTooLarge < SlackError; end
620
+ class WorkflowsExportCsvNotEnabled < SlackError; end
590
621
 
591
622
  ERROR_CLASSES = {
592
623
  'access_denied' => AccessDenied,
624
+ 'access_token_exchange_failed' => AccessTokenExchangeFailed,
593
625
  'accesslimited' => Accesslimited,
594
626
  'account_inactive' => AccountInactive,
595
627
  'action_already_in_progress' => ActionAlreadyInProgress,
@@ -609,6 +641,7 @@ module Slack
609
641
  'app_missing_action_url' => AppMissingActionUrl,
610
642
  'app_not_eligible' => AppNotEligible,
611
643
  'app_not_found' => AppNotFound,
644
+ 'app_not_hosted' => AppNotHosted,
612
645
  'app_restricted_org_wide' => AppRestrictedOrgWide,
613
646
  'approval_inactive' => ApprovalInactive,
614
647
  'approval_not_found' => ApprovalNotFound,
@@ -661,10 +694,10 @@ module Slack
661
694
  'cannot_parse' => CannotParse,
662
695
  'cannot_parse_attachment' => CannotParseAttachment,
663
696
  'cannot_prompt' => CannotPrompt,
697
+ 'cannot_reply_to_message' => CannotReplyToMessage,
664
698
  'cannot_reset_bot' => CannotResetBot,
665
699
  'cannot_reset_primary_owner' => CannotResetPrimaryOwner,
666
700
  'cannot_resolve_alias' => CannotResolveAlias,
667
- 'cannot_set_both_num_minutes_and_is_indefinite' => CannotSetBothNumMinutesAndIsIndefinite,
668
701
  'cannot_set_this_guest_to_regular_at_team_level' => CannotSetThisGuestToRegularAtTeamLevel,
669
702
  'cannot_share_cross_workspace_channel' => CannotShareCrossWorkspaceChannel,
670
703
  'cannot_share_mandatory_channel' => CannotShareMandatoryChannel,
@@ -685,6 +718,7 @@ module Slack
685
718
  'cant_update_message' => CantUpdateMessage,
686
719
  'canvas_disabled_file_team' => CanvasDisabledFileTeam,
687
720
  'canvas_disabled_user_team' => CanvasDisabledUserTeam,
721
+ 'canvas_globally_disabled' => CanvasGloballyDisabled,
688
722
  'channel_archived' => ChannelArchived,
689
723
  'channel_cannot_be_unshared' => ChannelCannotBeUnshared,
690
724
  'channel_canvas_deleted' => ChannelCanvasDeleted,
@@ -717,6 +751,8 @@ module Slack
717
751
  'could_not_unarchive_channel' => CouldNotUnarchiveChannel,
718
752
  'custom_integration_not_allowed_at_enterprise' => CustomIntegrationNotAllowedAtEnterprise,
719
753
  'data_not_available' => DataNotAvailable,
754
+ 'datastore_error' => DatastoreError,
755
+ 'datastore_migration_in_progress' => DatastoreMigrationInProgress,
720
756
  'default_channel_restricted' => DefaultChannelRestricted,
721
757
  'default_org_wide_channel' => DefaultOrgWideChannel,
722
758
  'delete_not_allowed' => DeleteNotAllowed,
@@ -730,6 +766,7 @@ module Slack
730
766
  'edit_window_closed' => EditWindowClosed,
731
767
  'ekm_access_denied' => EkmAccessDenied,
732
768
  'email_does_not_match' => EmailDoesNotMatch,
769
+ 'email_not_verified' => EmailNotVerified,
733
770
  'email_taken' => EmailTaken,
734
771
  'emoji_limit_reached' => EmojiLimitReached,
735
772
  'emoji_not_found' => EmojiNotFound,
@@ -737,6 +774,7 @@ module Slack
737
774
  'enterprise_is_restricted' => EnterpriseIsRestricted,
738
775
  'enterprise_not_found' => EnterpriseNotFound,
739
776
  'entity_not_found' => EntityNotFound,
777
+ 'error_adding_collaborators' => ErrorAddingCollaborators,
740
778
  'error_bad_format' => ErrorBadFormat,
741
779
  'error_bad_name_i18n' => ErrorBadNameI18n,
742
780
  'error_bad_upload' => ErrorBadUpload,
@@ -747,7 +785,9 @@ module Slack
747
785
  'error_name_taken' => ErrorNameTaken,
748
786
  'error_name_taken_i18n' => ErrorNameTakenI18n,
749
787
  'error_no_image' => ErrorNoImage,
788
+ 'error_removing_collaborators' => ErrorRemovingCollaborators,
750
789
  'error_too_big' => ErrorTooBig,
790
+ 'error_unpublishing_workflows' => ErrorUnpublishingWorkflows,
751
791
  'exchanged_trigger_id' => ExchangedTriggerId,
752
792
  'expired_trigger_id' => ExpiredTriggerId,
753
793
  'external_channel_migrating' => ExternalChannelMigrating,
@@ -805,6 +845,8 @@ module Slack
805
845
  'file_uploads_disabled' => FileUploadsDisabled,
806
846
  'forbidden_handle' => ForbiddenHandle,
807
847
  'forbidden_team' => ForbiddenTeam,
848
+ 'free_team_not_allowed' => FreeTeamNotAllowed,
849
+ 'function_not_found' => FunctionNotFound,
808
850
  'group_already_linked_to_channel' => GroupAlreadyLinkedToChannel,
809
851
  'group_must_not_be_empty' => GroupMustNotBeEmpty,
810
852
  'group_not_found' => GroupNotFound,
@@ -840,7 +882,9 @@ module Slack
840
882
  'invalid_code' => InvalidCode,
841
883
  'invalid_created_by' => InvalidCreatedBy,
842
884
  'invalid_cursor' => InvalidCursor,
885
+ 'invalid_datastore' => InvalidDatastore,
843
886
  'invalid_date' => InvalidDate,
887
+ 'invalid_domains' => InvalidDomains,
844
888
  'invalid_duration' => InvalidDuration,
845
889
  'invalid_email' => InvalidEmail,
846
890
  'invalid_emoji' => InvalidEmoji,
@@ -884,6 +928,7 @@ module Slack
884
928
  'invalid_scheduled_message_id' => InvalidScheduledMessageId,
885
929
  'invalid_scopes' => InvalidScopes,
886
930
  'invalid_search_channel_type' => InvalidSearchChannelType,
931
+ 'invalid_setting' => InvalidSetting,
887
932
  'invalid_sort' => InvalidSort,
888
933
  'invalid_sort_dir' => InvalidSortDir,
889
934
  'invalid_source' => InvalidSource,
@@ -893,6 +938,7 @@ module Slack
893
938
  'invalid_team' => InvalidTeam,
894
939
  'invalid_team_id' => InvalidTeamId,
895
940
  'invalid_team_ids' => InvalidTeamIds,
941
+ 'invalid_thread_ts' => InvalidThreadTs,
896
942
  'invalid_time' => InvalidTime,
897
943
  'invalid_timestamp' => InvalidTimestamp,
898
944
  'invalid_title' => InvalidTitle,
@@ -911,6 +957,7 @@ module Slack
911
957
  'invalid_user_id' => InvalidUserId,
912
958
  'invalid_users' => InvalidUsers,
913
959
  'invalid_value' => InvalidValue,
960
+ 'invalid_workflow_auth_strategy' => InvalidWorkflowAuthStrategy,
914
961
  'invite_from_same_org' => InviteFromSameOrg,
915
962
  'invite_lookup_error' => InviteLookupError,
916
963
  'invite_not_found' => InviteNotFound,
@@ -921,6 +968,7 @@ module Slack
921
968
  'invitor_cannot_see_channel' => InvitorCannotSeeChannel,
922
969
  'is_archived' => IsArchived,
923
970
  'is_bot' => IsBot,
971
+ 'is_idp_managed' => IsIdpManaged,
924
972
  'is_inactive' => IsInactive,
925
973
  'is_pending_connected_to_org' => IsPendingConnectedToOrg,
926
974
  'last_member' => LastMember,
@@ -934,6 +982,7 @@ module Slack
934
982
  'managed_channel_not_supported' => ManagedChannelNotSupported,
935
983
  'member_analytics_disabled' => MemberAnalyticsDisabled,
936
984
  'member_limit_exceeded' => MemberLimitExceeded,
985
+ 'message_limit_exceeded' => MessageLimitExceeded,
937
986
  'message_not_found' => MessageNotFound,
938
987
  'message_too_long' => MessageTooLong,
939
988
  'messages_tab_disabled' => MessagesTabDisabled,
@@ -942,6 +991,7 @@ module Slack
942
991
  'metadata_only_does_not_support_date' => MetadataOnlyDoesNotSupportDate,
943
992
  'metadata_too_large' => MetadataTooLarge,
944
993
  'method_deprecated' => MethodDeprecated,
994
+ 'method_not_supported' => MethodNotSupported,
945
995
  'method_not_supported_for_channel_type' => MethodNotSupportedForChannelType,
946
996
  'migration_in_progress' => MigrationInProgress,
947
997
  'missing_args' => MissingArgs,
@@ -968,6 +1018,7 @@ module Slack
968
1018
  'must_provide_team_name' => MustProvideTeamName,
969
1019
  'must_revoke_access' => MustRevokeAccess,
970
1020
  'name_already_exists' => NameAlreadyExists,
1021
+ 'name_not_allowed' => NameNotAllowed,
971
1022
  'name_taken' => NameTaken,
972
1023
  'name_taken_in_org' => NameTakenInOrg,
973
1024
  'name_too_long' => NameTooLong,
@@ -976,6 +1027,7 @@ module Slack
976
1027
  'no_bot_user_for_app' => NoBotUserForApp,
977
1028
  'no_channel' => NoChannel,
978
1029
  'no_channel_memberships' => NoChannelMemberships,
1030
+ 'no_domains_provided' => NoDomainsProvided,
979
1031
  'no_dual_broadcast_content_update' => NoDualBroadcastContentUpdate,
980
1032
  'no_image_uploaded' => NoImageUploaded,
981
1033
  'no_item_specified' => NoItemSpecified,
@@ -983,12 +1035,14 @@ module Slack
983
1035
  'no_permission' => NoPermission,
984
1036
  'no_pin' => NoPin,
985
1037
  'no_reaction' => NoReaction,
1038
+ 'no_refresh_token' => NoRefreshToken,
986
1039
  'no_resolution_found' => NoResolutionFound,
987
1040
  'no_scopes' => NoScopes,
988
1041
  'no_such_subteam' => NoSuchSubteam,
989
1042
  'no_team_ids_given' => NoTeamIdsGiven,
990
1043
  'no_teams_to_disconnect' => NoTeamsToDisconnect,
991
1044
  'no_text' => NoText,
1045
+ 'no_tokens_found' => NoTokensFound,
992
1046
  'no_user' => NoUser,
993
1047
  'no_users_provided' => NoUsersProvided,
994
1048
  'no_valid_channels' => NoValidChannels,
@@ -1026,6 +1080,7 @@ module Slack
1026
1080
  'org_level_email_display_disabled' => OrgLevelEmailDisplayDisabled,
1027
1081
  'org_login_required' => OrgLoginRequired,
1028
1082
  'org_not_found' => OrgNotFound,
1083
+ 'org_resolution_required' => OrgResolutionRequired,
1029
1084
  'org_user_not_in_team' => OrgUserNotInTeam,
1030
1085
  'over_max_entity_limit' => OverMaxEntityLimit,
1031
1086
  'over_pagination_limit' => OverPaginationLimit,
@@ -1044,6 +1099,7 @@ module Slack
1044
1099
  'preview_feature_not_available' => PreviewFeatureNotAvailable,
1045
1100
  'primary_usergroup_not_found' => PrimaryUsergroupNotFound,
1046
1101
  'profile_set_failed' => ProfileSetFailed,
1102
+ 'providers_not_found' => ProvidersNotFound,
1047
1103
  'public_video_not_allowed' => PublicVideoNotAllowed,
1048
1104
  'published_app_only' => PublishedAppOnly,
1049
1105
  'push_limit_reached' => PushLimitReached,
@@ -1075,7 +1131,6 @@ module Slack
1075
1131
  'slack_connect_clip_sharing_blocked' => SlackConnectClipSharingBlocked,
1076
1132
  'slack_connect_file_link_sharing_blocked' => SlackConnectFileLinkSharingBlocked,
1077
1133
  'slack_connect_file_upload_sharing_blocked' => SlackConnectFileUploadSharingBlocked,
1078
- 'slack_connect_team_blocked' => SlackConnectTeamBlocked,
1079
1134
  'snippet_too_large' => SnippetTooLarge,
1080
1135
  'snooze_end_failed' => SnoozeEndFailed,
1081
1136
  'snooze_failed' => SnoozeFailed,
@@ -1092,13 +1147,16 @@ module Slack
1092
1147
  'team_id_required_for_enterprise' => TeamIdRequiredForEnterprise,
1093
1148
  'team_not_found' => TeamNotFound,
1094
1149
  'team_not_on_enterprise' => TeamNotOnEnterprise,
1150
+ 'team_quota_exceeded' => TeamQuotaExceeded,
1095
1151
  'teams_not_found' => TeamsNotFound,
1152
+ 'template_not_visible' => TemplateNotVisible,
1096
1153
  'thread_locked' => ThreadLocked,
1097
1154
  'thread_not_found' => ThreadNotFound,
1098
1155
  'time_in_past' => TimeInPast,
1099
1156
  'time_too_far' => TimeTooFar,
1100
1157
  'token_already_exchanged' => TokenAlreadyExchanged,
1101
1158
  'token_expired' => TokenExpired,
1159
+ 'token_not_found' => TokenNotFound,
1102
1160
  'token_revoked' => TokenRevoked,
1103
1161
  'token_rotation_not_enabled' => TokenRotationNotEnabled,
1104
1162
  'too_large' => TooLarge,
@@ -1108,6 +1166,7 @@ module Slack
1108
1166
  'too_many_contact_cards' => TooManyContactCards,
1109
1167
  'too_many_convos_for_app_on_team' => TooManyConvosForAppOnTeam,
1110
1168
  'too_many_convos_for_team' => TooManyConvosForTeam,
1169
+ 'too_many_domains_provided' => TooManyDomainsProvided,
1111
1170
  'too_many_emails' => TooManyEmails,
1112
1171
  'too_many_emoji' => TooManyEmoji,
1113
1172
  'too_many_entities' => TooManyEntities,
@@ -1125,6 +1184,7 @@ module Slack
1125
1184
  'trigger_exchanged' => TriggerExchanged,
1126
1185
  'trigger_expired' => TriggerExpired,
1127
1186
  'two_factor_setup_required' => TwoFactorSetupRequired,
1187
+ 'unable_to_delete' => UnableToDelete,
1128
1188
  'unable_to_fetch_custom_emojis' => UnableToFetchCustomEmojis,
1129
1189
  'unable_to_link_idp_group_and_channel' => UnableToLinkIdpGroupAndChannel,
1130
1190
  'unable_to_process_post_request' => UnableToProcessPostRequest,
@@ -1147,6 +1207,7 @@ module Slack
1147
1207
  'update_failed' => UpdateFailed,
1148
1208
  'ura_max_channels' => UraMaxChannels,
1149
1209
  'url_in_message' => UrlInMessage,
1210
+ 'url_restriction_not_supported' => UrlRestrictionNotSupported,
1150
1211
  'user_already_deleted' => UserAlreadyDeleted,
1151
1212
  'user_already_team_member' => UserAlreadyTeamMember,
1152
1213
  'user_cannot_create_channel' => UserCannotCreateChannel,
@@ -1171,6 +1232,7 @@ module Slack
1171
1232
  'users_not_found' => UsersNotFound,
1172
1233
  'validation_errors' => ValidationErrors,
1173
1234
  'view_too_large' => ViewTooLarge,
1235
+ 'workflows_export_csv_not_enabled' => WorkflowsExportCsvNotEnabled,
1174
1236
  }.freeze
1175
1237
  end
1176
1238
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Slack
4
+ module Web
5
+ module Api
6
+ module Options
7
+ def encode_options_as_json(options, keys)
8
+ encoded_options = options.slice(*keys).transform_values do |value|
9
+ encode_json(value)
10
+ end
11
+ options.merge(encoded_options)
12
+ end
13
+
14
+ private
15
+
16
+ def encode_json(value)
17
+ if value.is_a?(String)
18
+ value
19
+ else
20
+ JSON.dump(value)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,69 +1,21 @@
1
1
  diff --git a/lib/slack/web/api/endpoints/chat.rb b/lib/slack/web/api/endpoints/chat.rb
2
- index 701cd1e..07acc40 100644
2
+ index b49065a..bf202f1 100644
3
3
  --- a/lib/slack/web/api/endpoints/chat.rb
4
4
  +++ b/lib/slack/web/api/endpoints/chat.rb
5
- @@ -122,9 +122,21 @@ module Slack
5
+ @@ -122,7 +122,7 @@ module Slack
6
6
  # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat/chat.postEphemeral.json
7
7
  def chat_postEphemeral(options = {})
8
8
  raise ArgumentError, 'Required arguments :channel missing' if options[:channel].nil?
9
9
  - raise ArgumentError, 'Required arguments :text missing' if options[:text].nil?
10
- + raise ArgumentError, 'Required arguments :text, :attachments or :blocks missing' if options[:text].nil? && options[:attachments].nil? && options[:blocks].nil?
10
+ + raise ArgumentError, 'At least one of :attachments, :blocks, :text is required' if options[:attachments].nil? && options[:blocks].nil? && options[:text].nil?
11
11
  raise ArgumentError, 'Required arguments :user missing' if options[:user].nil?
12
12
  options = options.merge(user: users_id(options)['user']['id']) if options[:user]
13
- + # attachments must be passed as an encoded JSON string
14
- + if options.key?(:attachments)
15
- + attachments = options[:attachments]
16
- + attachments = JSON.dump(attachments) unless attachments.is_a?(String)
17
- + options = options.merge(attachments: attachments)
18
- + end
19
- + # blocks must be passed as an encoded JSON string
20
- + if options.key?(:blocks)
21
- + blocks = options[:blocks]
22
- + blocks = JSON.dump(blocks) unless blocks.is_a?(String)
23
- + options = options.merge(blocks: blocks)
24
- + end
25
- post('chat.postEphemeral', options)
26
- end
27
-
28
- @@ -167,6 +179,19 @@ module Slack
29
- # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat/chat.postMessage.json
30
- def chat_postMessage(options = {})
31
- raise ArgumentError, 'Required arguments :channel missing' if options[:channel].nil?
32
- + raise ArgumentError, 'Required arguments :text, :attachments or :blocks missing' if options[:text].nil? && options[:attachments].nil? && options[:blocks].nil?
33
- + # attachments must be passed as an encoded JSON string
34
- + if options.key?(:attachments)
35
- + attachments = options[:attachments]
36
- + attachments = JSON.dump(attachments) unless attachments.is_a?(String)
37
- + options = options.merge(attachments: attachments)
38
- + end
39
- + # blocks must be passed as an encoded JSON string
40
- + if options.key?(:blocks)
41
- + blocks = options[:blocks]
42
- + blocks = JSON.dump(blocks) unless blocks.is_a?(String)
43
- + options = options.merge(blocks: blocks)
44
- + end
45
- post('chat.postMessage', options)
46
- end
47
-
48
- @@ -268,8 +293,21 @@ module Slack
49
- # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat/chat.update.json
13
+ options = encode_options_as_json(options, %i[attachments blocks])
14
+ @@ -274,6 +274,7 @@ module Slack
50
15
  def chat_update(options = {})
51
16
  raise ArgumentError, 'Required arguments :channel missing' if options[:channel].nil?
52
- + raise ArgumentError, 'Required arguments :text, :attachments, :blocks or :reply_broadcast missing' if options[:text].nil? && options[:attachments].nil? && options[:blocks].nil? && options[:reply_broadcast].nil?
53
17
  raise ArgumentError, 'Required arguments :ts missing' if options[:ts].nil?
18
+ + raise ArgumentError, 'At least one of :attachments, :blocks, :text, :reply_broadcast is required' if options[:attachments].nil? && options[:blocks].nil? && options[:text].nil? && options[:reply_broadcast].nil?
54
19
  options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
55
- + # attachments must be passed as an encoded JSON string
56
- + if options.key?(:attachments)
57
- + attachments = options[:attachments]
58
- + attachments = JSON.dump(attachments) unless attachments.is_a?(String)
59
- + options = options.merge(attachments: attachments)
60
- + end
61
- + # blocks must be passed as an encoded JSON string
62
- + if options.key?(:blocks)
63
- + blocks = options[:blocks]
64
- + blocks = JSON.dump(blocks) unless blocks.is_a?(String)
65
- + options = options.merge(blocks: blocks)
66
- + end
20
+ options = encode_options_as_json(options, %i[attachments blocks metadata])
67
21
  post('chat.update', options)
68
- end
69
- end
@@ -37,6 +37,14 @@ module Slack
37
37
  <% data['args'].select{ |k, v| v['required'] }.each do |arg_name, arg_v| %>
38
38
  raise ArgumentError, 'Required arguments :<%= arg_name %> missing' if options[:<%= arg_name %>].nil?
39
39
  <% end %>
40
+ <% data['arg_groups']&.each do |arg_group| %>
41
+ <% arg_string = arg_group['args'].map { |arg_name| ":#{arg_name}" }.join(', ') %>
42
+ <% if arg_group['mutually_exclusive'] %>
43
+ raise ArgumentError, 'Exactly one of <%= arg_string %> is required' unless <%= arg_group['args'].map { |arg_name| "options[:#{arg_name}].nil?" }.join(' ^ ') %>
44
+ <% else %>
45
+ raise ArgumentError, 'At least one of <%= arg_string %> is required' if <%= arg_group['args'].map { |arg_name| "options[:#{arg_name}].nil?"}.join(' && ') %>
46
+ <% end %>
47
+ <% end %>
40
48
  <% if data['group'] == 'groups' && data['args']['channel'] && !data['args']['channel']['desc'].include?('Can be an encoded ID, or a name.') %>
41
49
  options = options.merge(channel: groups_id(options)['group']['id']) if options[:channel]
42
50
  <% elsif data['args']['channel'] && !data['args']['channel']['desc'].include?('Can be an encoded ID, or a name.') %>
@@ -51,6 +59,10 @@ module Slack
51
59
  <% if data['deprecated'] %>
52
60
  logger.warn('<%= group %>.<%= name %>: <%= data['deprecation']['deprecation_warning']%> Alternative methods: <%= data['deprecation']['alternative_methods'].join(', ')%>.')
53
61
  <% end %>
62
+ <% json_args = data['args'].map { |arg_name, arg_v| arg_name if arg_v['format'] == 'json' }.compact %>
63
+ <% if json_args.any? %>
64
+ options = encode_options_as_json(options, %i[<%= json_args.join(' ') %>])
65
+ <% end %>
54
66
  <% if data['args'].keys.include?('cursor') %>
55
67
  if block_given?
56
68
  Pagination::Cursor.new(self, :<%= group.gsub(".", "_") %>_<%= name %>, options).each do |page|
@@ -7,13 +7,49 @@ RSpec.describe Slack::Web::Api::Endpoints::<%= group.gsub(".", "_").camelize %>
7
7
  let(:client) { Slack::Web::Client.new }
8
8
  <% names.sort.each_with_index do |(name, data), index| %>
9
9
  <% next if data['mixin'] %>
10
- <% required_params = data['args'].select{ |k, v| v['required'] } %>
11
- <% next if required_params.none? %>
10
+ <% group_required_params = data['arg_groups']&.map { |grp| grp['args'].first } || [] %>
11
+ <% required_params = data['args'].select{ |k, v| v['required'] || group_required_params.include?(k) } %>
12
+ <% json_params = data['args'].map { |arg_name, arg_v| arg_name if arg_v['format'] == 'json' }.compact %>
13
+ <% next if (required_params.none? || custom_spec_exists) && json_params.none? && data['arg_groups'].nil? %>
14
+ <% method_name = [group.gsub(".", "_"), name].join('_') %>
15
+ <% example_params = required_params.to_h { |var, opts| [var, opts['example']] } %>
12
16
  context '<%= group %>_<%= name %>' do
17
+ <% unless custom_spec_exists %>
13
18
  <% required_params.each do |arg_name, arg_v| %>
14
19
  it 'requires <%= arg_name %>' do
15
- <% params_except_required = required_params.reject{ |name, _| name == arg_name }.map{ |var, opts| "#{var}: %q[#{opts['example']}]"}.join(', ') %>
16
- expect { client.<%= group.gsub(".", "_") %>_<%= name %><%= params_except_required.empty? ? '' : "(#{params_except_required})" %> }.to raise_error ArgumentError, /Required arguments :<%= arg_name %> missing/
20
+ <% params_except_required = example_params.reject { |name, _| name == arg_name }.map { |name, val| "#{name}: %q[#{val}]" }.join(', ') %>
21
+ expect { client.<%= method_name %><%= params_except_required.empty? ? '' : "(#{params_except_required})" %> }.to raise_error ArgumentError, /Required arguments :<%= arg_name %> missing/
22
+ end
23
+ <% end %>
24
+ <% end %>
25
+ <% data['arg_groups']&.each do |arg_group| %>
26
+ it 'requires one of <%= arg_group['args'].join(', ') %>' do
27
+ <% params_except_required = example_params.reject { |name, _| arg_group['args'].include?(name) }.map { |name, val| "#{name}: %q[#{val}]" }.join(', ') %>
28
+ <% error_message = arg_group['mutually_exclusive'] ? 'Exactly' : 'At least' %>
29
+ expect { client.<%= method_name %><%= params_except_required.empty? ? '' : "(#{params_except_required})" %> }.to raise_error ArgumentError, /<%= error_message %> one of/
30
+ <% (1..arg_group['args'].length).each do |n| %>
31
+ <% arg_group['args'].combination(n) do |names| %>
32
+ <% params = names.map { |name| "#{name}: %q[#{data['args'][name]['example']}]" }.join(', ') %>
33
+ <% params = "#{params}, #{params_except_required}" unless params_except_required.empty? %>
34
+ <% if n == 1 || !arg_group['mutually_exclusive'] %>
35
+
36
+ expect(client).to receive(:post).with('<%= group %>.<%= name %>', {<%= params %>})
37
+ client.<%= method_name %><%= "(#{params})" %>
38
+ <% else %>
39
+
40
+ expect { client.<%= method_name %><%= "(#{params})" %> }.to raise_error ArgumentError, /<%= error_message %> one of/
41
+ <% end %>
42
+ <% end %>
43
+ <% end %>
44
+ end
45
+ <% end %>
46
+ <% if json_params.any? %>
47
+ <% example_json_params = json_params.to_h { |name| [name, {data: ['data']}] } %>
48
+ <% params = example_params.merge(example_json_params).map { |name, val| val = val.is_a?(String) ? "%q[#{val}]" : val; "#{name}: #{val}" }.join(', ') %>
49
+ <% expected_params = example_params.merge(example_json_params.transform_values { |v| JSON.dump(v) }).map { |name, val| val = "%q[#{val}]"; "#{name}: #{val}" }.join(', ') %>
50
+ it 'encodes <%= json_params.join(', ') %> as json' do
51
+ expect(client).to receive(:post).with('<%= group %>.<%= name %>', {<%= expected_params %>})
52
+ client.<%= method_name %>(<%= params %>)
17
53
  end
18
54
  <% end %>
19
55
  end
@@ -5,6 +5,7 @@ module Slack
5
5
  include Faraday::Connection
6
6
  include Faraday::Request
7
7
  include Api::Endpoints
8
+ include Api::Options
8
9
 
9
10
  attr_accessor(*Config::ATTRIBUTES)
10
11