slack-ruby-client 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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