slack-ruby-client 0.11.0 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.coveralls.yml +2 -0
- data/.github/FUNDING.yml +2 -0
- data/.github/dependabot.yml +6 -0
- data/.github/workflows/integration_test.yml +45 -0
- data/.github/workflows/lint.yml +14 -0
- data/.github/workflows/pr_lint.yml +21 -0
- data/.github/workflows/test.yml +56 -0
- data/.github/workflows/update_api.yml +81 -0
- data/.gitignore +7 -3
- data/.rubocop.yml +40 -2
- data/.rubocop_todo.yml +209 -55
- data/.ruby-version +1 -0
- data/CHANGELOG.md +257 -30
- data/CONTRIBUTING.md +44 -29
- data/Dangerfile +2 -0
- data/Gemfile +28 -6
- data/Gemfile.danger +6 -0
- data/LICENSE.md +1 -1
- data/README.md +473 -134
- data/RELEASING.md +2 -2
- data/Rakefile +2 -1
- data/SECURITY.md +9 -0
- data/UPGRADING.md +117 -3
- data/bin/commands/admin_analytics.rb +22 -0
- data/bin/commands/admin_apps.rb +57 -0
- data/bin/commands/admin_apps_activities.rb +32 -0
- data/bin/commands/admin_apps_approved.rb +24 -0
- data/bin/commands/admin_apps_config.rb +31 -0
- data/bin/commands/admin_apps_requests.rb +35 -0
- data/bin/commands/admin_apps_restricted.rb +24 -0
- data/bin/commands/admin_audit_anomaly_allow.rb +29 -0
- data/bin/commands/admin_auth_policy.rb +45 -0
- data/bin/commands/admin_barriers.rb +53 -0
- data/bin/commands/admin_conversations.rb +260 -0
- data/bin/commands/admin_conversations_ekm.rb +23 -0
- data/bin/commands/admin_conversations_restrictAccess.rb +43 -0
- data/bin/commands/admin_emoji.rb +60 -0
- data/bin/commands/admin_functions.rb +23 -0
- data/bin/commands/admin_functions_permissions.rb +31 -0
- data/bin/commands/admin_inviteRequests.rb +42 -0
- data/bin/commands/admin_inviteRequests_approved.rb +22 -0
- data/bin/commands/admin_inviteRequests_denied.rb +22 -0
- data/bin/commands/admin_roles.rb +46 -0
- data/bin/commands/admin_teams.rb +33 -0
- data/bin/commands/admin_teams_admins.rb +22 -0
- data/bin/commands/admin_teams_owners.rb +22 -0
- data/bin/commands/admin_teams_settings.rb +70 -0
- data/bin/commands/admin_usergroups.rb +54 -0
- data/bin/commands/admin_users.rb +106 -0
- data/bin/commands/admin_users_session.rb +84 -0
- data/bin/commands/admin_users_unsupportedVersions.rb +21 -0
- data/bin/commands/admin_workflows.rb +42 -0
- data/bin/commands/admin_workflows_collaborators.rb +31 -0
- data/bin/commands/admin_workflows_permissions.rb +21 -0
- data/bin/commands/admin_workflows_triggers_types_permissions.rb +31 -0
- data/bin/commands/api.rb +15 -9
- data/bin/commands/apps.rb +21 -0
- data/bin/commands/apps_activities.rb +32 -0
- data/bin/commands/apps_auth_external.rb +32 -0
- data/bin/commands/apps_connections.rb +19 -0
- data/bin/commands/apps_datastore.rb +116 -0
- data/bin/commands/apps_event_authorizations.rb +22 -0
- data/bin/commands/apps_manifest.rb +58 -0
- data/bin/commands/assistant_search.rb +27 -0
- data/bin/commands/assistant_threads.rb +45 -0
- data/bin/commands/auth.rb +22 -15
- data/bin/commands/auth_teams.rb +22 -0
- data/bin/commands/bookmarks.rb +60 -0
- data/bin/commands/bots.rb +16 -8
- data/bin/commands/calls.rb +58 -0
- data/bin/commands/calls_participants.rb +31 -0
- data/bin/commands/canvases.rb +41 -0
- data/bin/commands/canvases_access.rb +34 -0
- data/bin/commands/canvases_sections.rb +21 -0
- data/bin/commands/chat.rb +158 -99
- data/bin/commands/chat_scheduledMessages.rb +25 -0
- data/bin/commands/conversations.rb +241 -157
- data/bin/commands/conversations_canvases.rb +22 -0
- data/bin/commands/conversations_externalInvitePermissions.rb +22 -0
- data/bin/commands/conversations_requestSharedInvite.rb +48 -0
- data/bin/commands/dialog.rb +16 -9
- data/bin/commands/dnd.rb +47 -38
- data/bin/commands/emoji.rb +15 -7
- data/bin/commands/files.rb +113 -87
- data/bin/commands/files_comments.rb +16 -30
- data/bin/commands/files_remote.rb +84 -0
- data/bin/commands/functions.rb +31 -0
- data/bin/commands/functions_distributions_permissions.rb +61 -0
- data/bin/commands/functions_workflows_steps.rb +23 -0
- data/bin/commands/functions_workflows_steps_responses.rb +23 -0
- data/bin/commands/migration.rb +17 -9
- data/bin/commands/oauth.rb +19 -24
- data/bin/commands/oauth_v2.rb +35 -0
- data/bin/commands/openid_connect.rb +33 -0
- data/bin/commands/pins.rb +33 -30
- data/bin/commands/reactions.rb +53 -45
- data/bin/commands/reminders.rb +54 -41
- data/bin/commands/rtm.rb +16 -22
- data/bin/commands/search.rb +44 -33
- data/bin/commands/stars.rb +39 -29
- data/bin/commands/team.rb +50 -34
- data/bin/commands/team_billing.rb +19 -0
- data/bin/commands/team_externalTeams.rb +35 -0
- data/bin/commands/team_preferences.rb +19 -0
- data/bin/commands/team_profile.rb +15 -8
- data/bin/commands/tooling_tokens.rb +20 -0
- data/bin/commands/usergroups.rb +69 -53
- data/bin/commands/usergroups_users.rb +30 -19
- data/bin/commands/users.rb +114 -84
- data/bin/commands/users_admin.rb +29 -22
- data/bin/commands/users_discoverableContacts.rb +20 -0
- data/bin/commands/users_prefs.rb +14 -7
- data/bin/commands/users_profile.rb +27 -20
- data/bin/commands/views.rb +56 -0
- data/bin/commands/workflows.rb +44 -0
- data/bin/commands/workflows_triggers_permissions.rb +60 -0
- data/bin/slack +50 -46
- data/examples/files_upload_v2/.env.example +1 -0
- data/examples/{hi_real_time → files_upload_v2}/Gemfile +2 -2
- data/examples/files_upload_v2/README.md +13 -0
- data/examples/files_upload_v2/files_upload_v2.rb +45 -0
- data/examples/hi_real_time_and_web/Gemfile +1 -0
- data/examples/hi_real_time_and_web/hi.rb +7 -3
- data/examples/{hi_real_time_async_eventmachine → hi_real_time_async_async}/Gemfile +2 -1
- data/examples/{hi_real_time_async_eventmachine → hi_real_time_async_async}/hi.rb +12 -7
- data/examples/hi_web/Gemfile +1 -0
- data/examples/hi_web/hi.rb +1 -0
- data/examples/new_ticket/Gemfile +1 -0
- data/examples/new_ticket/new_ticket.rb +1 -0
- data/examples/oauth_v2/.env.example +4 -0
- data/examples/oauth_v2/Gemfile +7 -0
- data/examples/oauth_v2/README.md +33 -0
- data/examples/oauth_v2/oauth_v2.rb +60 -0
- data/lib/slack/config.rb +2 -2
- data/lib/slack/events/config.rb +32 -0
- data/lib/slack/events/request.rb +76 -0
- data/lib/slack/logger.rb +6 -5
- data/lib/slack/messages/formatting.rb +66 -1
- data/lib/slack/messages/message.rb +1 -4
- data/lib/slack/real_time/api/message.rb +6 -3
- data/lib/slack/real_time/api/message_id.rb +1 -0
- data/lib/slack/real_time/api/ping.rb +5 -2
- data/lib/slack/real_time/api/templates/event_handler.erb +5 -1
- data/lib/slack/real_time/api/typing.rb +5 -2
- data/lib/slack/real_time/client.rb +117 -54
- data/lib/slack/real_time/concurrency/async.rb +142 -0
- data/lib/slack/real_time/concurrency.rb +2 -2
- data/lib/slack/real_time/config.rb +12 -13
- data/lib/slack/real_time/models/base.rb +1 -4
- data/lib/slack/real_time/models/bot.rb +1 -0
- data/lib/slack/real_time/models/channel.rb +5 -0
- data/lib/slack/real_time/models/im.rb +1 -0
- data/lib/slack/real_time/models/{group.rb → mpim.rb} +2 -1
- data/lib/slack/real_time/models/team.rb +1 -0
- data/lib/slack/real_time/models/user.rb +1 -0
- data/lib/slack/real_time/models.rb +3 -1
- data/lib/slack/real_time/socket.rb +49 -17
- data/lib/slack/real_time/stores/base.rb +28 -14
- data/lib/slack/real_time/stores/starter.rb +325 -287
- data/lib/slack/real_time/stores/store.rb +271 -186
- data/lib/slack/real_time/stores.rb +2 -7
- data/lib/slack/utils/security.rb +44 -0
- data/lib/slack/version.rb +2 -1
- data/lib/slack/web/api/endpoints/admin_analytics.rb +28 -0
- data/lib/slack/web/api/endpoints/admin_apps.rb +78 -0
- data/lib/slack/web/api/endpoints/admin_apps_activities.rb +53 -0
- data/lib/slack/web/api/endpoints/admin_apps_approved.rb +37 -0
- data/lib/slack/web/api/endpoints/admin_apps_config.rb +40 -0
- data/lib/slack/web/api/endpoints/admin_apps_requests.rb +53 -0
- data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +37 -0
- data/lib/slack/web/api/endpoints/admin_audit_anomaly_allow.rb +34 -0
- data/lib/slack/web/api/endpoints/admin_auth_policy.rb +72 -0
- data/lib/slack/web/api/endpoints/admin_barriers.rb +82 -0
- data/lib/slack/web/api/endpoints/admin_conversations.rb +397 -0
- data/lib/slack/web/api/endpoints/admin_conversations_ekm.rb +35 -0
- data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +61 -0
- data/lib/slack/web/api/endpoints/admin_emoji.rb +88 -0
- data/lib/slack/web/api/endpoints/admin_functions.rb +36 -0
- data/lib/slack/web/api/endpoints/admin_functions_permissions.rb +41 -0
- data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +61 -0
- data/lib/slack/web/api/endpoints/admin_inviteRequests_approved.rb +33 -0
- data/lib/slack/web/api/endpoints/admin_inviteRequests_denied.rb +33 -0
- data/lib/slack/web/api/endpoints/admin_roles.rb +73 -0
- data/lib/slack/web/api/endpoints/admin_teams.rb +50 -0
- data/lib/slack/web/api/endpoints/admin_teams_admins.rb +34 -0
- data/lib/slack/web/api/endpoints/admin_teams_owners.rb +34 -0
- data/lib/slack/web/api/endpoints/admin_teams_settings.rb +99 -0
- data/lib/slack/web/api/endpoints/admin_usergroups.rb +77 -0
- data/lib/slack/web/api/endpoints/admin_users.rb +167 -0
- data/lib/slack/web/api/endpoints/admin_users_session.rb +121 -0
- data/lib/slack/web/api/endpoints/admin_users_unsupportedVersions.rb +25 -0
- data/lib/slack/web/api/endpoints/admin_workflows.rb +67 -0
- data/lib/slack/web/api/endpoints/admin_workflows_collaborators.rb +42 -0
- data/lib/slack/web/api/endpoints/admin_workflows_permissions.rb +26 -0
- data/lib/slack/web/api/endpoints/admin_workflows_triggers_types_permissions.rb +41 -0
- data/lib/slack/web/api/endpoints/api.rb +2 -3
- data/lib/slack/web/api/endpoints/apps.rb +27 -0
- data/lib/slack/web/api/endpoints/apps_activities.rb +54 -0
- data/lib/slack/web/api/endpoints/apps_auth_external.rb +41 -0
- data/lib/slack/web/api/endpoints/apps_connections.rb +21 -0
- data/lib/slack/web/api/endpoints/apps_datastore.rb +181 -0
- data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +34 -0
- data/lib/slack/web/api/endpoints/apps_manifest.rb +79 -0
- data/lib/slack/web/api/endpoints/assistant_search.rb +44 -0
- data/lib/slack/web/api/endpoints/assistant_threads.rb +68 -0
- data/lib/slack/web/api/endpoints/auth.rb +2 -1
- data/lib/slack/web/api/endpoints/auth_teams.rb +33 -0
- data/lib/slack/web/api/endpoints/bookmarks.rb +90 -0
- data/lib/slack/web/api/endpoints/bots.rb +4 -1
- data/lib/slack/web/api/endpoints/calls.rb +83 -0
- data/lib/slack/web/api/endpoints/calls_participants.rb +42 -0
- data/lib/slack/web/api/endpoints/canvases.rb +54 -0
- data/lib/slack/web/api/endpoints/canvases_access.rb +47 -0
- data/lib/slack/web/api/endpoints/canvases_sections.rb +27 -0
- data/lib/slack/web/api/endpoints/chat.rb +172 -87
- data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +40 -0
- data/lib/slack/web/api/endpoints/conversations.rb +190 -64
- data/lib/slack/web/api/endpoints/conversations_canvases.rb +28 -0
- data/lib/slack/web/api/endpoints/conversations_externalInvitePermissions.rb +31 -0
- data/lib/slack/web/api/endpoints/conversations_requestSharedInvite.rb +73 -0
- data/lib/slack/web/api/endpoints/dialog.rb +6 -10
- data/lib/slack/web/api/endpoints/dnd.rb +11 -5
- data/lib/slack/web/api/endpoints/emoji.rb +3 -0
- data/lib/slack/web/api/endpoints/files.rb +85 -36
- data/lib/slack/web/api/endpoints/files_comments.rb +4 -36
- data/lib/slack/web/api/endpoints/files_remote.rb +127 -0
- data/lib/slack/web/api/endpoints/functions.rb +43 -0
- data/lib/slack/web/api/endpoints/functions_distributions_permissions.rb +84 -0
- data/lib/slack/web/api/endpoints/functions_workflows_steps.rb +30 -0
- data/lib/slack/web/api/endpoints/functions_workflows_steps_responses.rb +30 -0
- data/lib/slack/web/api/endpoints/migration.rb +6 -3
- data/lib/slack/web/api/endpoints/oauth.rb +10 -32
- data/lib/slack/web/api/endpoints/oauth_v2.rb +48 -0
- data/lib/slack/web/api/endpoints/openid_connect.rb +42 -0
- data/lib/slack/web/api/endpoints/pins.rb +11 -18
- data/lib/slack/web/api/endpoints/reactions.rb +31 -20
- data/lib/slack/web/api/endpoints/reminders.rb +25 -12
- data/lib/slack/web/api/endpoints/rtm.rb +4 -22
- data/lib/slack/web/api/endpoints/search.rb +33 -18
- data/lib/slack/web/api/endpoints/stars.rb +23 -10
- data/lib/slack/web/api/endpoints/team.rb +38 -7
- data/lib/slack/web/api/endpoints/team_billing.rb +21 -0
- data/lib/slack/web/api/endpoints/team_externalTeams.rb +53 -0
- data/lib/slack/web/api/endpoints/team_preferences.rb +21 -0
- data/lib/slack/web/api/endpoints/team_profile.rb +2 -1
- data/lib/slack/web/api/endpoints/tooling_tokens.rb +24 -0
- data/lib/slack/web/api/endpoints/usergroups.rb +44 -25
- data/lib/slack/web/api/endpoints/usergroups_users.rb +23 -14
- data/lib/slack/web/api/endpoints/users.rb +57 -18
- data/lib/slack/web/api/endpoints/users_admin.rb +5 -2
- data/lib/slack/web/api/endpoints/users_discoverableContacts.rb +24 -0
- data/lib/slack/web/api/endpoints/users_prefs.rb +2 -0
- data/lib/slack/web/api/endpoints/users_profile.rb +11 -9
- data/lib/slack/web/api/endpoints/views.rb +86 -0
- data/lib/slack/web/api/endpoints/workflows.rb +63 -0
- data/lib/slack/web/api/endpoints/workflows_triggers_permissions.rb +87 -0
- data/lib/slack/web/api/endpoints.rb +136 -12
- data/lib/slack/web/api/error.rb +1 -0
- data/lib/slack/web/api/errors/server_error.rb +37 -0
- data/lib/slack/web/api/errors/slack_error.rb +14 -1
- data/lib/slack/web/api/errors/too_many_requests_error.rb +2 -4
- data/lib/slack/web/api/errors.rb +1396 -0
- data/lib/slack/web/api/helpers/files.rb +97 -0
- data/lib/slack/web/api/helpers.rb +13 -0
- data/lib/slack/web/api/mixins/conversations.id.rb +47 -0
- data/lib/slack/web/api/mixins/ids.id.rb +4 -3
- data/lib/slack/web/api/mixins/users.id.rb +18 -4
- data/lib/slack/web/api/mixins/users.search.rb +3 -1
- data/lib/slack/web/api/mixins.rb +2 -2
- data/lib/slack/web/api/options.rb +26 -0
- data/lib/slack/web/api/patches/.gitkeep +0 -0
- data/lib/slack/web/api/templates/command.erb +19 -12
- data/lib/slack/web/api/templates/endpoints.erb +2 -2
- data/lib/slack/web/api/templates/errors.erb +20 -0
- data/lib/slack/web/api/templates/method.erb +23 -3
- data/lib/slack/web/api/templates/method_spec.erb +40 -3
- data/lib/slack/web/client.rb +4 -1
- data/lib/slack/web/config.rb +9 -2
- data/lib/slack/web/faraday/connection.rb +11 -20
- data/lib/slack/web/faraday/options.rb +24 -0
- data/lib/slack/web/faraday/request.rb +6 -1
- data/lib/slack/web/faraday/response/raise_error.rb +14 -8
- data/lib/slack/web/faraday/response/wrap_error.rb +24 -0
- data/lib/slack/web/pagination/cursor.rb +7 -7
- data/lib/slack-ruby-client.rb +18 -6
- data/lib/slack.rb +1 -0
- data/lib/slack_ruby_client.rb +1 -0
- data/lib/tasks/git.rake +1 -0
- data/lib/tasks/real_time.rake +51 -21
- data/lib/tasks/update.rake +1 -0
- data/lib/tasks/web.rake +43 -17
- data/slack-ruby-client.gemspec +10 -14
- metadata +191 -307
- data/.travis.yml +0 -30
- data/bin/commands/apps_permissions.rb +0 -22
- data/bin/commands/channels.rb +0 -175
- data/bin/commands/groups.rb +0 -172
- data/bin/commands/im.rb +0 -67
- data/bin/commands/mpim.rb +0 -63
- data/bin/commands.rb +0 -33
- data/examples/hi_real_time/hi.gif +0 -0
- data/examples/hi_real_time/hi.rb +0 -37
- data/examples/hi_real_time_async_celluloid/Gemfile +0 -6
- data/examples/hi_real_time_async_celluloid/hi.rb +0 -36
- data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
- data/lib/slack/real_time/concurrency/celluloid.rb +0 -117
- data/lib/slack/real_time/concurrency/eventmachine.rb +0 -60
- data/lib/slack/web/api/endpoints/apps_permissions.rb +0 -35
- data/lib/slack/web/api/endpoints/channels.rb +0 -265
- data/lib/slack/web/api/endpoints/groups.rb +0 -255
- data/lib/slack/web/api/endpoints/im.rb +0 -113
- data/lib/slack/web/api/endpoints/mpim.rb +0 -98
- data/lib/slack/web/api/endpoints/presence.rb +0 -23
- data/lib/slack/web/api/mixins/channels.id.json +0 -20
- data/lib/slack/web/api/mixins/channels.id.rb +0 -26
- data/lib/slack/web/api/mixins/groups.id.json +0 -20
- data/lib/slack/web/api/mixins/groups.id.rb +0 -26
- data/lib/slack/web/api/patches/chat.1.text-attachments-required.patch +0 -13
- data/lib/slack/web/api/patches/chat.2.attachments-json.patch +0 -17
- data/lib/slack/web/api/patches/chat.3.update-attachments-support.patch +0 -21
- data/lib/slack/web/api/patches/chat.4.postEphemeral-attachments-support.patch +0 -17
- data/lib/slack/web/api/patches/dialog.1.open-json-support.patch +0 -17
- data/lib/slack/web/api/templates/commands.erb +0 -5
- data/screenshots/register-bot.png +0 -0
- data/spec/fixtures/slack/web/429_error.yml +0 -85
- data/spec/fixtures/slack/web/auth_test_error.yml +0 -48
- data/spec/fixtures/slack/web/auth_test_success.yml +0 -57
- data/spec/fixtures/slack/web/channels_info.yml +0 -46
- data/spec/fixtures/slack/web/groups_info.yml +0 -43
- data/spec/fixtures/slack/web/paginated_users_list.yml +0 -181
- data/spec/fixtures/slack/web/rtm_connect.yml +0 -70
- data/spec/fixtures/slack/web/rtm_start.yml +0 -104
- data/spec/fixtures/slack/web/users_info.yml +0 -130
- data/spec/fixtures/slack/web/users_list.yml +0 -72
- data/spec/integration/integration_spec.rb +0 -139
- data/spec/slack/config_spec.rb +0 -14
- data/spec/slack/messages/formatting_spec.rb +0 -43
- data/spec/slack/real_time/api/message_spec.rb +0 -15
- data/spec/slack/real_time/api/ping_spec.rb +0 -15
- data/spec/slack/real_time/api/typing_spec.rb +0 -15
- data/spec/slack/real_time/client_spec.rb +0 -425
- data/spec/slack/real_time/concurrency/celluloid_spec.rb +0 -62
- data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -47
- data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +0 -19
- data/spec/slack/real_time/event_handlers/bot_spec.rb +0 -44
- data/spec/slack/real_time/event_handlers/channel_spec.rb +0 -116
- data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +0 -15
- data/spec/slack/real_time/event_handlers/group_spec.rb +0 -90
- data/spec/slack/real_time/event_handlers/im_spec.rb +0 -47
- data/spec/slack/real_time/event_handlers/team_spec.rb +0 -62
- data/spec/slack/real_time/event_handlers/user_spec.rb +0 -63
- data/spec/slack/real_time/rtm_connect_spec.rb +0 -13
- data/spec/slack/real_time/rtm_start_spec.rb +0 -13
- data/spec/slack/real_time/store_spec.rb +0 -11
- data/spec/slack/slack_spec.rb +0 -58
- data/spec/slack/version_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/api_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +0 -15
- data/spec/slack/web/api/endpoints/bots_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/conversations_spec.rb +0 -100
- data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +0 -25
- data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +0 -11
- data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +0 -105
- data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +0 -28
- data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +0 -11
- data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +0 -33
- data/spec/slack/web/api/endpoints/dnd_spec.rb +0 -12
- data/spec/slack/web/api/endpoints/emoji_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/files_comments_spec.rb +0 -34
- data/spec/slack/web/api/endpoints/files_spec.rb +0 -43
- data/spec/slack/web/api/endpoints/im_spec.rb +0 -38
- data/spec/slack/web/api/endpoints/migration_spec.rb +0 -12
- data/spec/slack/web/api/endpoints/mpim_spec.rb +0 -38
- data/spec/slack/web/api/endpoints/oauth_spec.rb +0 -29
- data/spec/slack/web/api/endpoints/pins_spec.rb +0 -22
- data/spec/slack/web/api/endpoints/reactions_spec.rb +0 -17
- data/spec/slack/web/api/endpoints/reminders_spec.rb +0 -30
- data/spec/slack/web/api/endpoints/rtm_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/search_spec.rb +0 -22
- data/spec/slack/web/api/endpoints/stars_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/team_profile_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/team_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/usergroups_spec.rb +0 -27
- data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +0 -20
- data/spec/slack/web/api/endpoints/users_admin_spec.rb +0 -17
- data/spec/slack/web/api/endpoints/users_prefs_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/users_profile_spec.rb +0 -7
- data/spec/slack/web/api/error_spec.rb +0 -14
- data/spec/slack/web/api/errors/slack_error_spec.rb +0 -14
- data/spec/slack/web/api/mixins/channels_spec.rb +0 -31
- data/spec/slack/web/api/mixins/groups_spec.rb +0 -31
- data/spec/slack/web/api/mixins/users_spec.rb +0 -39
- data/spec/slack/web/api/pagination/cursor_spec.rb +0 -70
- data/spec/slack/web/client_spec.rb +0 -174
- data/spec/spec_helper.rb +0 -14
- data/spec/support/queue_with_timeout.rb +0 -34
- data/spec/support/real_time/concurrency/mock.rb +0 -30
- data/spec/support/real_time/connected_client.rb +0 -21
- data/spec/support/real_time/event.rb +0 -11
- data/spec/support/token.rb +0 -10
- data/spec/support/vcr.rb +0 -9
- /data/examples/{hi_real_time_async_celluloid → hi_real_time_async_async}/Procfile +0 -0
@@ -0,0 +1,97 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Slack
|
3
|
+
module Web
|
4
|
+
module Api
|
5
|
+
module Helpers
|
6
|
+
module Files
|
7
|
+
#
|
8
|
+
# Uses Slack APIs new sequential file upload flow. This replaces the files.upload method
|
9
|
+
# @see https://api.slack.com/changelog/2024-04-a-better-way-to-upload-files-is-here-to-stay
|
10
|
+
# @see https://api.slack.com/messaging/files#uploading_files
|
11
|
+
#
|
12
|
+
# @option params [string] :filename
|
13
|
+
# Name of the file being uploaded.
|
14
|
+
# @option params [string] :content
|
15
|
+
# File contents via a POST variable.
|
16
|
+
# @option params [Array<Hash>] :files
|
17
|
+
# Array of file objects with :filename, :content, and optionally :title, :alt_txt, :snippet_type.
|
18
|
+
# @option params [string] :alt_txt
|
19
|
+
# Description of image for screen-reader.
|
20
|
+
# @option params [string] :snippet_type
|
21
|
+
# Syntax type of the snippet being uploaded.
|
22
|
+
# @option params [string] :title
|
23
|
+
# Title of file.
|
24
|
+
# @option params [string] :channel_id
|
25
|
+
# Channel ID where the file will be shared. If not specified the file will be private.
|
26
|
+
# @option params [string] :channel
|
27
|
+
# Channel where the file will be shared, alias of channel_id. If not specified the file will be private.
|
28
|
+
# @option params [string] :channels
|
29
|
+
# Comma-separated string of channel IDs where the file will be shared. If not specified the file will be private.
|
30
|
+
# @option params [string] :initial_comment
|
31
|
+
# The message text introducing the file in specified channels.
|
32
|
+
# @option params [string] :thread_ts
|
33
|
+
# Provide another message's ts value to upload this file as a reply.
|
34
|
+
# Never use a reply's ts value; use its parent instead.
|
35
|
+
# Also make sure to provide only one channel when using 'thread_ts'.
|
36
|
+
def files_upload_v2(params = {})
|
37
|
+
files_to_upload = if params[:files] && params[:files].is_a?(Array)
|
38
|
+
params[:files]
|
39
|
+
else
|
40
|
+
[params.slice(:filename, :content, :title, :alt_txt, :snippet_type)]
|
41
|
+
end
|
42
|
+
|
43
|
+
files_to_upload.each_with_index do |file, index|
|
44
|
+
%i[filename content].each do |param|
|
45
|
+
raise ArgumentError, "Required argument :#{param} missing in file (#{index})" if file[param].nil?
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
channel_params = %i[channel channels channel_id].map { |param| params[param] }.compact
|
50
|
+
raise ArgumentError, 'Only one of :channel, :channels, or :channel_id is required' if channel_params.size > 1
|
51
|
+
|
52
|
+
complete_upload_request_params = params.slice(:initial_comment, :thread_ts)
|
53
|
+
|
54
|
+
if params[:channels]
|
55
|
+
complete_upload_request_params[:channels] = Array(params[:channels]).map do |channel|
|
56
|
+
conversations_id(channel: channel)['channel']['id']
|
57
|
+
end.uniq.join(',')
|
58
|
+
elsif params[:channel]
|
59
|
+
complete_upload_request_params[:channel_id] = conversations_id(
|
60
|
+
channel: params[:channel]
|
61
|
+
)['channel']['id']
|
62
|
+
elsif params[:channel_id]
|
63
|
+
complete_upload_request_params[:channel_id] = params[:channel_id]
|
64
|
+
end
|
65
|
+
|
66
|
+
uploaded_files = files_to_upload.map do |file|
|
67
|
+
content = file[:content]
|
68
|
+
title = file[:title] || file[:filename]
|
69
|
+
|
70
|
+
upload_url_request_params = file.slice(:filename, :alt_txt, :snippet_type)
|
71
|
+
upload_url_request_params[:length] = content.bytesize
|
72
|
+
|
73
|
+
get_upload_url_response = files_getUploadURLExternal(upload_url_request_params)
|
74
|
+
upload_url = get_upload_url_response[:upload_url]
|
75
|
+
file_id = get_upload_url_response[:file_id]
|
76
|
+
|
77
|
+
::Faraday::Connection.new(upload_url, options) do |connection|
|
78
|
+
connection.request :multipart
|
79
|
+
connection.request :url_encoded
|
80
|
+
connection.use ::Slack::Web::Faraday::Response::WrapError
|
81
|
+
connection.response :logger, logger if logger
|
82
|
+
connection.adapter adapter
|
83
|
+
end.post do |request|
|
84
|
+
request.body = content
|
85
|
+
end
|
86
|
+
|
87
|
+
{ id: file_id, title: title }
|
88
|
+
end
|
89
|
+
|
90
|
+
complete_upload_request_params[:files] = uploaded_files.to_json
|
91
|
+
files_completeUploadExternal(complete_upload_request_params)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative 'ids.id'
|
3
|
+
|
4
|
+
module Slack
|
5
|
+
module Web
|
6
|
+
module Api
|
7
|
+
module Mixins
|
8
|
+
module Conversations
|
9
|
+
include Ids
|
10
|
+
#
|
11
|
+
# This method returns a channel ID given a channel name.
|
12
|
+
#
|
13
|
+
# @option options [channel] :channel
|
14
|
+
# Channel to get ID for, prefixed with #.
|
15
|
+
# @option options [string] :team_id
|
16
|
+
# The team id to search for channels in, required if token belongs to org-wide app.
|
17
|
+
# This field will be ignored if the API call is sent using a workspace-level token.
|
18
|
+
# @option options [boolean] :id_exclude_archived
|
19
|
+
# Set to true to exclude archived channels from the search
|
20
|
+
# @option options [integer] :id_limit
|
21
|
+
# The page size used for conversations_list calls required to find the channel's ID
|
22
|
+
# @option options [string] :id_types
|
23
|
+
# The types of conversations to use when searching for the ID. A comma-separated list
|
24
|
+
# containing one or more of public_channel, private_channel, mpim, im
|
25
|
+
def conversations_id(options = {})
|
26
|
+
name = options[:channel]
|
27
|
+
raise ArgumentError, 'Required arguments :channel missing' if name.nil?
|
28
|
+
|
29
|
+
id_for(
|
30
|
+
key: :channel,
|
31
|
+
name: name,
|
32
|
+
prefix: '#',
|
33
|
+
enum_method: :conversations_list,
|
34
|
+
list_method: :channels,
|
35
|
+
options: {
|
36
|
+
team_id: options.fetch(:team_id, nil),
|
37
|
+
exclude_archived: options.fetch(:id_exclude_archived, nil),
|
38
|
+
limit: options.fetch(:id_limit, Slack::Web.config.conversations_id_page_size),
|
39
|
+
types: options.fetch(:id_types, nil)
|
40
|
+
}.compact
|
41
|
+
)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Slack
|
2
3
|
module Web
|
3
4
|
module Api
|
@@ -5,16 +6,16 @@ module Slack
|
|
5
6
|
module Ids
|
6
7
|
private
|
7
8
|
|
8
|
-
def id_for(key
|
9
|
+
def id_for(key:, name:, prefix:, enum_method:, list_method:, options: {})
|
9
10
|
return { 'ok' => true, key.to_s => { 'id' => name } } unless name[0] == prefix
|
10
11
|
|
11
|
-
|
12
|
+
public_send(enum_method, **options) do |list|
|
12
13
|
list.public_send(list_method).each do |li|
|
13
14
|
return Slack::Messages::Message.new('ok' => true, key.to_s => { 'id' => li.id }) if li.name == name[1..-1]
|
14
15
|
end
|
15
16
|
end
|
16
17
|
|
17
|
-
raise Slack::Web::Api::Errors::SlackError,
|
18
|
+
raise Slack::Web::Api::Errors::SlackError, "#{key}_not_found"
|
18
19
|
end
|
19
20
|
end
|
20
21
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require_relative 'ids.id'
|
2
3
|
|
3
4
|
module Slack
|
@@ -11,13 +12,26 @@ module Slack
|
|
11
12
|
#
|
12
13
|
# @option options [user] :user
|
13
14
|
# User to get ID for, prefixed with '@'.
|
15
|
+
# @option options [string] :team_id
|
16
|
+
# The team id to search for users in, required if token belongs to org-wide app.
|
17
|
+
# This field will be ignored if the API call is sent using a workspace-level token.
|
18
|
+
# @option options [integer] :id_limit
|
19
|
+
# The page size used for users_list calls required to find the user's ID
|
14
20
|
def users_id(options = {})
|
15
21
|
name = options[:user]
|
16
|
-
|
22
|
+
raise ArgumentError, 'Required arguments :user missing' if name.nil?
|
17
23
|
|
18
|
-
id_for(
|
19
|
-
|
20
|
-
|
24
|
+
id_for(
|
25
|
+
key: :user,
|
26
|
+
name: name,
|
27
|
+
prefix: '@',
|
28
|
+
enum_method: :users_list,
|
29
|
+
list_method: :members,
|
30
|
+
options: {
|
31
|
+
team_id: options.fetch(:team_id, nil),
|
32
|
+
limit: options.fetch(:id_limit, Slack::Web.config.users_id_page_size)
|
33
|
+
}.compact
|
34
|
+
)
|
21
35
|
end
|
22
36
|
end
|
23
37
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
if defined?(Picky)
|
2
3
|
module Slack
|
3
4
|
module Web
|
@@ -13,7 +14,8 @@ if defined?(Picky)
|
|
13
14
|
# Free-formed text to search for.
|
14
15
|
def users_search(options = {})
|
15
16
|
query = options[:user]
|
16
|
-
|
17
|
+
raise ArgumentError, 'Required arguments :user missing' if query.nil?
|
18
|
+
|
17
19
|
index = Picky::Index.new(:users) do
|
18
20
|
category :name
|
19
21
|
category :first_name
|
data/lib/slack/web/api/mixins.rb
CHANGED
@@ -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
|
File without changes
|
@@ -1,12 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# This file was auto-generated by lib/tasks/web.rake
|
2
3
|
|
4
|
+
module Slack
|
5
|
+
module Cli
|
6
|
+
class App
|
3
7
|
<% desc = group['desc'] || "#{group['name'].gsub(".", "_").camelize} methods." %>
|
4
8
|
<% if desc.include?("'") %>
|
5
|
-
desc "<%= desc %>"
|
9
|
+
desc "<%= desc %>"
|
6
10
|
<% else %>
|
7
|
-
desc '<%= desc %>'
|
11
|
+
desc '<%= desc %>'
|
8
12
|
<% end %>
|
9
|
-
command '<%= group['name'].gsub(".", "_") %>' do |g|
|
13
|
+
command '<%= group['name'].gsub(".", "_") %>' do |g|
|
10
14
|
<% names.sort.each_with_index do |(name, data), index| %>
|
11
15
|
<% if index > 0 %>
|
12
16
|
|
@@ -14,22 +18,25 @@ command '<%= group['name'].gsub(".", "_") %>' do |g|
|
|
14
18
|
<% short_desc = data["desc"].split("\n").first %>
|
15
19
|
<% short_desc += ' (undocumented)' if data['undocumented'] %>
|
16
20
|
<% if short_desc.include?("'") %>
|
17
|
-
|
21
|
+
g.desc "<%= short_desc %>"
|
18
22
|
<% else %>
|
19
|
-
|
23
|
+
g.desc '<%= short_desc %>'
|
20
24
|
<% end %>
|
21
|
-
|
22
|
-
|
25
|
+
g.long_desc %( <%= data["desc"].split("\n").join(" ") %> )
|
26
|
+
g.command '<%= name %>' do |c|
|
23
27
|
<% data["args"].each do |arg_name, arg_v| %>
|
24
28
|
<% if arg_v["desc"].include?("'") %>
|
25
|
-
|
29
|
+
c.flag '<%= arg_name %>', desc: "<%= arg_v["desc"].gsub('"', '\'') %>"
|
26
30
|
<% else %>
|
27
|
-
|
31
|
+
c.flag '<%= arg_name %>', desc: '<%= arg_v["desc"] %>'
|
28
32
|
<% end %>
|
29
33
|
<% end %>
|
30
|
-
|
31
|
-
|
34
|
+
c.action do |_global_options, options, _args|
|
35
|
+
puts JSON.dump(@client.<%=group['name'].gsub(".", "_") %>_<%= name %>(options))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
<% end %>
|
39
|
+
end
|
32
40
|
end
|
33
41
|
end
|
34
|
-
<% end %>
|
35
42
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# This file was auto-generated by lib/tasks/web.rake
|
2
3
|
|
3
4
|
<% files.sort.each do |f| %>
|
@@ -8,9 +9,8 @@ module Slack
|
|
8
9
|
module Web
|
9
10
|
module Api
|
10
11
|
module Endpoints
|
11
|
-
include Slack::Web::Api::Mixins::
|
12
|
+
include Slack::Web::Api::Mixins::Conversations
|
12
13
|
include Slack::Web::Api::Mixins::Users
|
13
|
-
include Slack::Web::Api::Mixins::Groups
|
14
14
|
|
15
15
|
<% files.sort.each do |f| %>
|
16
16
|
include <%= f.camelize %>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# This file was auto-generated by lib/tasks/web.rake
|
3
|
+
|
4
|
+
module Slack
|
5
|
+
module Web
|
6
|
+
module Api
|
7
|
+
module Errors
|
8
|
+
<% errors.each do |e| %>
|
9
|
+
class <%= e.camelize %> < SlackError; end
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
ERROR_CLASSES = {
|
13
|
+
<% errors.each do |e| %>
|
14
|
+
'<%= e %>' => <%= e.camelize %>,
|
15
|
+
<% end %>
|
16
|
+
}.freeze
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# This file was auto-generated by lib/tasks/web.rake
|
2
3
|
|
3
4
|
module Slack
|
@@ -34,16 +35,35 @@ module Slack
|
|
34
35
|
<% end %>
|
35
36
|
def <%= group.gsub(".", "_") %>_<%= name %>(options = {})
|
36
37
|
<% data['args'].select{ |k, v| v['required'] }.each do |arg_name, arg_v| %>
|
37
|
-
|
38
|
+
raise ArgumentError, 'Required arguments :<%= arg_name %> missing' if options[:<%= arg_name %>].nil?
|
39
|
+
<% end %>
|
40
|
+
<% data['arg_groups']&.each do |arg_group| %>
|
41
|
+
<% next if arg_group['args'].size <= 1 %>
|
42
|
+
<% arg_string = arg_group['args'].map { |arg_name| ":#{arg_name}" }.join(', ') %>
|
43
|
+
<% if arg_group['mutually_exclusive'] %>
|
44
|
+
raise ArgumentError, 'Exactly one of <%= arg_string %> is required' unless <%= arg_group['args'].map { |arg_name| "options[:#{arg_name}].nil?" }.join(' ^ ') %>
|
45
|
+
<% else %>
|
46
|
+
raise ArgumentError, 'At least one of <%= arg_string %> is required' if <%= arg_group['args'].map { |arg_name| "options[:#{arg_name}].nil?"}.join(' && ') %>
|
47
|
+
<% end %>
|
38
48
|
<% end %>
|
39
49
|
<% if data['group'] == 'groups' && data['args']['channel'] && !data['args']['channel']['desc'].include?('Can be an encoded ID, or a name.') %>
|
40
50
|
options = options.merge(channel: groups_id(options)['group']['id']) if options[:channel]
|
41
|
-
<% elsif data['args']['channel'] &&
|
42
|
-
options = options.merge(channel:
|
51
|
+
<% elsif data['args']['channel'] && ['Can be an encoded ID, or a name.', 'encoded ID or channel name'].none? { |desc| data['args']['channel']['desc'].include?(desc) } %>
|
52
|
+
options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
|
43
53
|
<% end %>
|
44
54
|
<% if data['args']['user'] %>
|
45
55
|
options = options.merge(user: users_id(options)['user']['id']) if options[:user]
|
46
56
|
<% end %>
|
57
|
+
<% if data['undocumented'] %>
|
58
|
+
logger.warn('The <%= group %>.<%= name %> method is undocumented.')
|
59
|
+
<% end %>
|
60
|
+
<% if data['deprecated'] %>
|
61
|
+
logger.warn('<%= group %>.<%= name %>: <%= data['deprecation']['deprecation_warning']%> Alternative methods: <%= data['deprecation']['alternative_methods'].join(', ')%>.')
|
62
|
+
<% end %>
|
63
|
+
<% json_args = data['args'].map { |arg_name, arg_v| arg_name if arg_v['format'] == 'json' }.compact %>
|
64
|
+
<% if json_args.any? %>
|
65
|
+
options = encode_options_as_json(options, %i[<%= json_args.join(' ') %>])
|
66
|
+
<% end %>
|
47
67
|
<% if data['args'].keys.include?('cursor') %>
|
48
68
|
if block_given?
|
49
69
|
Pagination::Cursor.new(self, :<%= group.gsub(".", "_") %>_<%= name %>, options).each do |page|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# This file was auto-generated by lib/tasks/web.rake
|
2
3
|
|
3
4
|
require 'spec_helper'
|
@@ -6,13 +7,49 @@ RSpec.describe Slack::Web::Api::Endpoints::<%= group.gsub(".", "_").camelize %>
|
|
6
7
|
let(:client) { Slack::Web::Client.new }
|
7
8
|
<% names.sort.each_with_index do |(name, data), index| %>
|
8
9
|
<% next if data['mixin'] %>
|
10
|
+
<% group_required_params = data['arg_groups']&.map { |grp| grp['args'].first if grp['args'].size > 1 } || [] %>
|
9
11
|
<% required_params = data['args'].select{ |k, v| v['required'] } %>
|
10
|
-
<%
|
12
|
+
<% all_required_params = data['args'].select{ |k, v| v['required'] || group_required_params.include?(k) } %>
|
13
|
+
<% json_params = data['args'].map { |arg_name, arg_v| arg_name if arg_v['format'] == 'json' }.compact %>
|
14
|
+
<% next if all_required_params.none? && json_params.none? && data['arg_groups'].nil? %>
|
15
|
+
<% method_name = [group.gsub(".", "_"), name].join('_') %>
|
16
|
+
<% example_params = all_required_params.to_h { |var, opts| [var, opts['example']] } %>
|
11
17
|
context '<%= group %>_<%= name %>' do
|
12
18
|
<% required_params.each do |arg_name, arg_v| %>
|
13
19
|
it 'requires <%= arg_name %>' do
|
14
|
-
<% params_except_required =
|
15
|
-
expect { client.<%=
|
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
|
+
<% data['arg_groups']&.each do |arg_group| %>
|
25
|
+
<% next if arg_group['args'].size <= 1 %>
|
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 %>)
|
16
53
|
end
|
17
54
|
<% end %>
|
18
55
|
end
|
data/lib/slack/web/client.rb
CHANGED
@@ -1,15 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Slack
|
2
3
|
module Web
|
3
4
|
class Client
|
4
5
|
include Faraday::Connection
|
5
6
|
include Faraday::Request
|
6
7
|
include Api::Endpoints
|
8
|
+
include Api::Helpers
|
9
|
+
include Api::Options
|
7
10
|
|
8
11
|
attr_accessor(*Config::ATTRIBUTES)
|
9
12
|
|
10
13
|
def initialize(options = {})
|
11
14
|
Slack::Web::Config::ATTRIBUTES.each do |key|
|
12
|
-
send("#{key}=", options
|
15
|
+
send("#{key}=", options.fetch(key, Slack::Web.config.send(key)))
|
13
16
|
end
|
14
17
|
@logger ||= Slack::Config.logger || Slack::Logger.default
|
15
18
|
@token ||= Slack.config.token
|
data/lib/slack/web/config.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Slack
|
2
3
|
module Web
|
3
4
|
module Config
|
@@ -14,7 +15,10 @@ module Slack
|
|
14
15
|
timeout
|
15
16
|
open_timeout
|
16
17
|
default_page_size
|
18
|
+
conversations_id_page_size
|
19
|
+
users_id_page_size
|
17
20
|
default_max_retries
|
21
|
+
adapter
|
18
22
|
].freeze
|
19
23
|
|
20
24
|
attr_accessor(*Config::ATTRIBUTES)
|
@@ -22,15 +26,18 @@ module Slack
|
|
22
26
|
def reset
|
23
27
|
self.endpoint = 'https://slack.com/api/'
|
24
28
|
self.user_agent = "Slack Ruby Client/#{Slack::VERSION}"
|
25
|
-
self.ca_path =
|
26
|
-
self.ca_file =
|
29
|
+
self.ca_path = nil
|
30
|
+
self.ca_file = nil
|
27
31
|
self.token = nil
|
28
32
|
self.proxy = nil
|
29
33
|
self.logger = nil
|
30
34
|
self.timeout = nil
|
31
35
|
self.open_timeout = nil
|
32
36
|
self.default_page_size = 100
|
37
|
+
self.conversations_id_page_size = nil
|
38
|
+
self.users_id_page_size = nil
|
33
39
|
self.default_max_retries = 100
|
40
|
+
self.adapter = ::Faraday.default_adapter
|
34
41
|
end
|
35
42
|
end
|
36
43
|
|
@@ -1,32 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Slack
|
2
3
|
module Web
|
3
4
|
module Faraday
|
4
5
|
module Connection
|
6
|
+
include Slack::Web::Faraday::Options
|
7
|
+
|
5
8
|
private
|
6
9
|
|
7
10
|
def connection
|
8
|
-
options
|
9
|
-
headers
|
10
|
-
|
11
|
-
|
12
|
-
options[:headers]['User-Agent'] = user_agent if user_agent
|
13
|
-
options[:proxy] = proxy if proxy
|
14
|
-
options[:ssl] = { ca_path: ca_path, ca_file: ca_file } if ca_path || ca_file
|
15
|
-
|
16
|
-
request_options = {}
|
17
|
-
request_options[:timeout] = timeout if timeout
|
18
|
-
request_options[:open_timeout] = open_timeout if open_timeout
|
19
|
-
options[:request] = request_options if request_options.any?
|
20
|
-
|
21
|
-
::Faraday::Connection.new(endpoint, options) do |connection|
|
22
|
-
connection.use ::Faraday::Request::Multipart
|
23
|
-
connection.use ::Faraday::Request::UrlEncoded
|
24
|
-
connection.use ::Faraday::Response::RaiseError
|
11
|
+
@connection ||= ::Faraday::Connection.new(endpoint, options) do |connection|
|
12
|
+
connection.headers['Accept'] = 'application/json; charset=utf-8'
|
13
|
+
connection.request :multipart
|
14
|
+
connection.request :url_encoded
|
25
15
|
connection.use ::Slack::Web::Faraday::Response::RaiseError
|
26
|
-
connection.
|
27
|
-
connection.
|
16
|
+
connection.response :mashify, mash_class: Slack::Messages::Message
|
17
|
+
connection.response :json, content_type: /\b*$/
|
18
|
+
connection.use ::Slack::Web::Faraday::Response::WrapError
|
28
19
|
connection.response :logger, logger if logger
|
29
|
-
connection.adapter
|
20
|
+
connection.adapter adapter
|
30
21
|
end
|
31
22
|
end
|
32
23
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Slack
|
3
|
+
module Web
|
4
|
+
module Faraday
|
5
|
+
module Options
|
6
|
+
def options
|
7
|
+
@options ||= begin
|
8
|
+
options = { headers: {} }
|
9
|
+
options[:headers]['User-Agent'] = user_agent if user_agent
|
10
|
+
options[:proxy] = proxy if proxy
|
11
|
+
options[:ssl] = { ca_path: ca_path, ca_file: ca_file } if ca_path || ca_file
|
12
|
+
|
13
|
+
request_options = {}
|
14
|
+
request_options[:timeout] = timeout if timeout
|
15
|
+
request_options[:open_timeout] = open_timeout if open_timeout
|
16
|
+
options[:request] = request_options if request_options.any?
|
17
|
+
|
18
|
+
options
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Slack
|
2
3
|
module Web
|
3
4
|
module Faraday
|
@@ -21,18 +22,22 @@ module Slack
|
|
21
22
|
private
|
22
23
|
|
23
24
|
def request(method, path, options)
|
24
|
-
options = options.merge(token: token)
|
25
25
|
response = connection.send(method) do |request|
|
26
26
|
case method
|
27
27
|
when :get, :delete
|
28
28
|
request.url(path, options)
|
29
29
|
when :post, :put
|
30
30
|
request.path = path
|
31
|
+
options.compact! if options.respond_to? :compact
|
31
32
|
request.body = options unless options.empty?
|
32
33
|
end
|
34
|
+
request.headers['Authorization'] = "Bearer #{token}" if token
|
35
|
+
|
33
36
|
request.options.merge!(options.delete(:request)) if options.key?(:request)
|
34
37
|
end
|
35
38
|
response.body
|
39
|
+
rescue ::Faraday::ParsingError => e
|
40
|
+
raise Slack::Web::Api::Errors::ParsingError, e.response
|
36
41
|
end
|
37
42
|
end
|
38
43
|
end
|
@@ -1,16 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Slack
|
2
3
|
module Web
|
3
4
|
module Faraday
|
4
5
|
module Response
|
5
|
-
class RaiseError < ::Faraday::
|
6
|
+
class RaiseError < ::Faraday::Middleware
|
6
7
|
def on_complete(env)
|
7
|
-
if env.status == 429
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
raise Slack::Web::Api::Errors::TooManyRequestsError, env.response if env.status == 429
|
9
|
+
|
10
|
+
return unless env.success?
|
11
|
+
|
12
|
+
body = env.body
|
13
|
+
return unless body
|
14
|
+
return if body['ok']
|
15
|
+
|
16
|
+
error_message = body['error'] || body['errors'].map { |message| message['error'] }.join(',')
|
17
|
+
error_class = Slack::Web::Api::Errors::ERROR_CLASSES[error_message]
|
18
|
+
error_class ||= Slack::Web::Api::Errors::SlackError
|
19
|
+
raise error_class.new(error_message, env.response)
|
14
20
|
end
|
15
21
|
end
|
16
22
|
end
|