slack-ruby-client 0.13.1 → 2.0.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 (402) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/integration_test.yml +26 -0
  4. data/.github/workflows/lint.yml +14 -0
  5. data/.github/workflows/pr_lint.yml +21 -0
  6. data/.github/workflows/test.yml +36 -0
  7. data/.gitignore +5 -3
  8. data/.rubocop.yml +34 -5
  9. data/.rubocop_todo.yml +180 -46
  10. data/.ruby-version +1 -0
  11. data/CHANGELOG.md +119 -2
  12. data/CONTRIBUTING.md +23 -11
  13. data/Dangerfile +2 -0
  14. data/Gemfile +22 -5
  15. data/Gemfile.danger +6 -0
  16. data/LICENSE.md +1 -1
  17. data/README.md +236 -101
  18. data/RELEASING.md +2 -2
  19. data/Rakefile +2 -1
  20. data/UPGRADING.md +100 -2
  21. data/bin/commands/admin_analytics.rb +16 -0
  22. data/bin/commands/admin_apps.rb +51 -0
  23. data/bin/commands/admin_apps_approved.rb +17 -0
  24. data/bin/commands/admin_apps_requests.rb +28 -0
  25. data/bin/commands/admin_apps_restricted.rb +17 -0
  26. data/bin/commands/admin_audit_anomaly_allow.rb +23 -0
  27. data/bin/commands/admin_auth_policy.rb +39 -0
  28. data/bin/commands/admin_barriers.rb +47 -0
  29. data/bin/commands/admin_conversations.rb +171 -0
  30. data/bin/commands/admin_conversations_ekm.rb +17 -0
  31. data/bin/commands/admin_conversations_restrictAccess.rb +37 -0
  32. data/bin/commands/admin_emoji.rb +54 -0
  33. data/bin/commands/admin_inviteRequests.rb +36 -0
  34. data/bin/commands/admin_inviteRequests_approved.rb +16 -0
  35. data/bin/commands/admin_inviteRequests_denied.rb +16 -0
  36. data/bin/commands/admin_teams.rb +27 -0
  37. data/bin/commands/admin_teams_admins.rb +16 -0
  38. data/bin/commands/admin_teams_owners.rb +16 -0
  39. data/bin/commands/admin_teams_settings.rb +64 -0
  40. data/bin/commands/admin_usergroups.rb +48 -0
  41. data/bin/commands/admin_users.rb +98 -0
  42. data/bin/commands/admin_users_session.rb +78 -0
  43. data/bin/commands/admin_users_unsupportedVersions.rb +15 -0
  44. data/bin/commands/api.rb +1 -1
  45. data/bin/commands/apps.rb +15 -0
  46. data/bin/commands/apps_connections.rb +13 -0
  47. data/bin/commands/apps_event_authorizations.rb +16 -0
  48. data/bin/commands/apps_manifest.rb +52 -0
  49. data/bin/commands/auth.rb +1 -0
  50. data/bin/commands/auth_teams.rb +16 -0
  51. data/bin/commands/bookmarks.rb +53 -0
  52. data/bin/commands/bots.rb +2 -0
  53. data/bin/commands/calls.rb +52 -0
  54. data/bin/commands/calls_participants.rb +25 -0
  55. data/bin/commands/chat.rb +61 -14
  56. data/bin/commands/chat_scheduledMessages.rb +19 -0
  57. data/bin/commands/conversations.rb +82 -10
  58. data/bin/commands/dialog.rb +1 -0
  59. data/bin/commands/dnd.rb +6 -3
  60. data/bin/commands/emoji.rb +1 -0
  61. data/bin/commands/files.rb +34 -18
  62. data/bin/commands/files_comments.rb +1 -21
  63. data/bin/commands/files_remote.rb +78 -0
  64. data/bin/commands/migration.rb +2 -0
  65. data/bin/commands/oauth.rb +2 -14
  66. data/bin/commands/oauth_v2.rb +29 -0
  67. data/bin/commands/openid_connect.rb +27 -0
  68. data/bin/commands/pins.rb +3 -6
  69. data/bin/commands/reactions.rb +3 -3
  70. data/bin/commands/reminders.rb +7 -0
  71. data/bin/commands/rtm.rb +1 -15
  72. data/bin/commands/search.rb +6 -1
  73. data/bin/commands/stars.rb +8 -6
  74. data/bin/commands/team.rb +6 -0
  75. data/bin/commands/team_billing.rb +13 -0
  76. data/bin/commands/team_preferences.rb +13 -0
  77. data/bin/commands/team_profile.rb +1 -0
  78. data/bin/commands/tooling_tokens.rb +14 -0
  79. data/bin/commands/usergroups.rb +7 -1
  80. data/bin/commands/usergroups_users.rb +3 -0
  81. data/bin/commands/users.rb +6 -4
  82. data/bin/commands/users_admin.rb +1 -0
  83. data/bin/commands/users_prefs.rb +1 -0
  84. data/bin/commands/users_profile.rb +6 -5
  85. data/bin/commands/views.rb +50 -0
  86. data/bin/commands/workflows.rb +38 -0
  87. data/bin/commands.rb +41 -8
  88. data/bin/slack +3 -4
  89. data/examples/hi_real_time_and_web/Gemfile +1 -0
  90. data/examples/hi_real_time_and_web/hi.rb +7 -3
  91. data/examples/hi_real_time_async_async/Gemfile +1 -0
  92. data/examples/hi_real_time_async_async/hi.rb +6 -2
  93. data/examples/hi_web/Gemfile +1 -0
  94. data/examples/hi_web/hi.rb +1 -0
  95. data/examples/new_ticket/Gemfile +1 -0
  96. data/examples/new_ticket/new_ticket.rb +1 -0
  97. data/lib/slack/config.rb +2 -2
  98. data/lib/slack/events/config.rb +32 -0
  99. data/lib/slack/events/request.rb +72 -0
  100. data/lib/slack/logger.rb +6 -5
  101. data/lib/slack/messages/formatting.rb +1 -0
  102. data/lib/slack/messages/message.rb +1 -4
  103. data/lib/slack/real_time/api/message.rb +6 -3
  104. data/lib/slack/real_time/api/message_id.rb +1 -0
  105. data/lib/slack/real_time/api/ping.rb +5 -2
  106. data/lib/slack/real_time/api/templates/event_handler.erb +5 -1
  107. data/lib/slack/real_time/api/typing.rb +5 -2
  108. data/lib/slack/real_time/client.rb +105 -54
  109. data/lib/slack/real_time/concurrency/async.rb +77 -6
  110. data/lib/slack/real_time/concurrency.rb +1 -2
  111. data/lib/slack/real_time/config.rb +9 -13
  112. data/lib/slack/real_time/models/base.rb +1 -4
  113. data/lib/slack/real_time/models/bot.rb +1 -0
  114. data/lib/slack/real_time/models/channel.rb +5 -0
  115. data/lib/slack/real_time/models/im.rb +1 -0
  116. data/lib/slack/real_time/models/{group.rb → mpim.rb} +2 -1
  117. data/lib/slack/real_time/models/team.rb +1 -0
  118. data/lib/slack/real_time/models/user.rb +1 -0
  119. data/lib/slack/real_time/models.rb +3 -1
  120. data/lib/slack/real_time/socket.rb +45 -17
  121. data/lib/slack/real_time/stores/base.rb +28 -14
  122. data/lib/slack/real_time/stores/starter.rb +325 -297
  123. data/lib/slack/real_time/stores/store.rb +271 -196
  124. data/lib/slack/real_time/stores.rb +2 -7
  125. data/lib/slack/version.rb +2 -1
  126. data/lib/slack/web/api/endpoints/admin_analytics.rb +28 -0
  127. data/lib/slack/web/api/endpoints/admin_apps.rb +78 -0
  128. data/lib/slack/web/api/endpoints/admin_apps_approved.rb +35 -0
  129. data/lib/slack/web/api/endpoints/admin_apps_requests.rb +51 -0
  130. data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +35 -0
  131. data/lib/slack/web/api/endpoints/admin_audit_anomaly_allow.rb +34 -0
  132. data/lib/slack/web/api/endpoints/admin_auth_policy.rb +72 -0
  133. data/lib/slack/web/api/endpoints/admin_barriers.rb +82 -0
  134. data/lib/slack/web/api/endpoints/admin_conversations.rb +264 -0
  135. data/lib/slack/web/api/endpoints/admin_conversations_ekm.rb +35 -0
  136. data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +61 -0
  137. data/lib/slack/web/api/endpoints/admin_emoji.rb +88 -0
  138. data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +61 -0
  139. data/lib/slack/web/api/endpoints/admin_inviteRequests_approved.rb +33 -0
  140. data/lib/slack/web/api/endpoints/admin_inviteRequests_denied.rb +33 -0
  141. data/lib/slack/web/api/endpoints/admin_teams.rb +50 -0
  142. data/lib/slack/web/api/endpoints/admin_teams_admins.rb +34 -0
  143. data/lib/slack/web/api/endpoints/admin_teams_owners.rb +34 -0
  144. data/lib/slack/web/api/endpoints/admin_teams_settings.rb +99 -0
  145. data/lib/slack/web/api/endpoints/admin_usergroups.rb +77 -0
  146. data/lib/slack/web/api/endpoints/admin_users.rb +163 -0
  147. data/lib/slack/web/api/endpoints/admin_users_session.rb +122 -0
  148. data/lib/slack/web/api/endpoints/admin_users_unsupportedVersions.rb +25 -0
  149. data/lib/slack/web/api/endpoints/api.rb +2 -3
  150. data/lib/slack/web/api/endpoints/apps.rb +27 -0
  151. data/lib/slack/web/api/endpoints/apps_connections.rb +21 -0
  152. data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +34 -0
  153. data/lib/slack/web/api/endpoints/apps_manifest.rb +77 -0
  154. data/lib/slack/web/api/endpoints/auth.rb +2 -1
  155. data/lib/slack/web/api/endpoints/auth_teams.rb +33 -0
  156. data/lib/slack/web/api/endpoints/bookmarks.rb +88 -0
  157. data/lib/slack/web/api/endpoints/bots.rb +4 -1
  158. data/lib/slack/web/api/endpoints/calls.rb +83 -0
  159. data/lib/slack/web/api/endpoints/calls_participants.rb +42 -0
  160. data/lib/slack/web/api/endpoints/chat.rb +168 -65
  161. data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +40 -0
  162. data/lib/slack/web/api/endpoints/conversations.rb +182 -67
  163. data/lib/slack/web/api/endpoints/dialog.rb +5 -4
  164. data/lib/slack/web/api/endpoints/dnd.rb +9 -4
  165. data/lib/slack/web/api/endpoints/emoji.rb +1 -0
  166. data/lib/slack/web/api/endpoints/files.rb +69 -37
  167. data/lib/slack/web/api/endpoints/files_comments.rb +4 -36
  168. data/lib/slack/web/api/endpoints/files_remote.rb +127 -0
  169. data/lib/slack/web/api/endpoints/migration.rb +6 -3
  170. data/lib/slack/web/api/endpoints/oauth.rb +7 -31
  171. data/lib/slack/web/api/endpoints/oauth_v2.rb +48 -0
  172. data/lib/slack/web/api/endpoints/openid_connect.rb +42 -0
  173. data/lib/slack/web/api/endpoints/pins.rb +11 -18
  174. data/lib/slack/web/api/endpoints/reactions.rb +22 -21
  175. data/lib/slack/web/api/endpoints/reminders.rb +23 -10
  176. data/lib/slack/web/api/endpoints/rtm.rb +3 -25
  177. data/lib/slack/web/api/endpoints/search.rb +31 -16
  178. data/lib/slack/web/api/endpoints/stars.rb +14 -11
  179. data/lib/slack/web/api/endpoints/team.rb +15 -4
  180. data/lib/slack/web/api/endpoints/team_billing.rb +21 -0
  181. data/lib/slack/web/api/endpoints/team_preferences.rb +21 -0
  182. data/lib/slack/web/api/endpoints/team_profile.rb +2 -1
  183. data/lib/slack/web/api/endpoints/tooling_tokens.rb +24 -0
  184. data/lib/slack/web/api/endpoints/usergroups.rb +31 -20
  185. data/lib/slack/web/api/endpoints/usergroups_users.rb +13 -8
  186. data/lib/slack/web/api/endpoints/users.rb +24 -23
  187. data/lib/slack/web/api/endpoints/users_admin.rb +3 -2
  188. data/lib/slack/web/api/endpoints/users_prefs.rb +1 -0
  189. data/lib/slack/web/api/endpoints/users_profile.rb +8 -7
  190. data/lib/slack/web/api/endpoints/views.rb +102 -0
  191. data/lib/slack/web/api/endpoints/workflows.rb +61 -0
  192. data/lib/slack/web/api/endpoints.rb +82 -18
  193. data/lib/slack/web/api/error.rb +1 -0
  194. data/lib/slack/web/api/errors/server_error.rb +37 -0
  195. data/lib/slack/web/api/errors/slack_error.rb +14 -1
  196. data/lib/slack/web/api/errors/too_many_requests_error.rb +2 -4
  197. data/lib/slack/web/api/errors.rb +1116 -0
  198. data/lib/slack/web/api/mixins/{channels.id.rb → conversations.id.rb} +5 -6
  199. data/lib/slack/web/api/mixins/ids.id.rb +3 -2
  200. data/lib/slack/web/api/mixins/users.id.rb +3 -4
  201. data/lib/slack/web/api/mixins/users.search.rb +3 -1
  202. data/lib/slack/web/api/mixins.rb +2 -2
  203. data/lib/slack/web/api/patches/chat.attachments-blocks.patch +69 -0
  204. data/lib/slack/web/api/patches/{dialog.1.open-json-support.patch → dialog.encoded-json.patch} +4 -4
  205. data/lib/slack/web/api/patches/views.view-json.patch +55 -0
  206. data/lib/slack/web/api/templates/command.erb +1 -0
  207. data/lib/slack/web/api/templates/commands.erb +1 -0
  208. data/lib/slack/web/api/templates/endpoints.erb +2 -2
  209. data/lib/slack/web/api/templates/errors.erb +20 -0
  210. data/lib/slack/web/api/templates/method.erb +6 -2
  211. data/lib/slack/web/api/templates/method_spec.erb +2 -1
  212. data/lib/slack/web/client.rb +2 -1
  213. data/lib/slack/web/config.rb +5 -2
  214. data/lib/slack/web/faraday/connection.rb +24 -20
  215. data/lib/slack/web/faraday/request.rb +5 -1
  216. data/lib/slack/web/faraday/response/raise_error.rb +14 -7
  217. data/lib/slack/web/faraday/response/wrap_error.rb +24 -0
  218. data/lib/slack/web/pagination/cursor.rb +7 -7
  219. data/lib/slack-ruby-client.rb +12 -5
  220. data/lib/slack.rb +1 -0
  221. data/lib/slack_ruby_client.rb +1 -0
  222. data/lib/tasks/git.rake +1 -0
  223. data/lib/tasks/real_time.rake +51 -21
  224. data/lib/tasks/update.rake +1 -0
  225. data/lib/tasks/web.rake +48 -12
  226. data/screenshots/create-app.png +0 -0
  227. data/slack-ruby-client.gemspec +7 -12
  228. data/spec/fixtures/slack/web/429_error.yml +50 -54
  229. data/spec/fixtures/slack/web/auth_test_error.yml +51 -18
  230. data/spec/fixtures/slack/web/auth_test_success.yml +50 -26
  231. data/spec/fixtures/slack/web/conversations_info.yml +167 -0
  232. data/spec/fixtures/slack/web/conversations_setTopic.yml +84 -0
  233. data/spec/fixtures/slack/web/conversations_setTopic_one_page.yml +172 -0
  234. data/spec/fixtures/slack/web/conversations_setTopic_paginated.yml +253 -0
  235. data/spec/fixtures/slack/web/paginated_users_list.yml +501 -69
  236. data/spec/fixtures/slack/web/rtm_connect.yml +347 -26
  237. data/spec/fixtures/slack/web/users_info.yml +153 -69
  238. data/spec/fixtures/slack/web/users_list.yml +102 -41
  239. data/spec/fixtures/slack/web/views_open_error.yml +83 -0
  240. data/spec/integration/integration_spec.rb +115 -47
  241. data/spec/slack/config_spec.rb +2 -0
  242. data/spec/slack/events/config_spec.rb +35 -0
  243. data/spec/slack/events/request_spec.rb +188 -0
  244. data/spec/slack/messages/formatting_spec.rb +35 -13
  245. data/spec/slack/real_time/api/message_spec.rb +7 -2
  246. data/spec/slack/real_time/api/ping_spec.rb +3 -1
  247. data/spec/slack/real_time/api/typing_spec.rb +6 -2
  248. data/spec/slack/real_time/client_spec.rb +300 -142
  249. data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +2 -0
  250. data/spec/slack/real_time/concurrency/with_concurrency_spec.rb +10 -0
  251. data/spec/slack/real_time/concurrency/without_concurrency_spec.rb +10 -0
  252. data/spec/slack/real_time/event_handlers/bot_spec.rb +20 -17
  253. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +3 -2
  254. data/spec/slack/real_time/event_handlers/im_spec.rb +31 -27
  255. data/spec/slack/real_time/event_handlers/{group_spec.rb → private_channel_spec.rb} +36 -27
  256. data/spec/slack/real_time/event_handlers/{channel_spec.rb → public_channel_spec.rb} +31 -24
  257. data/spec/slack/real_time/event_handlers/team_spec.rb +8 -7
  258. data/spec/slack/real_time/event_handlers/user_spec.rb +7 -5
  259. data/spec/slack/real_time/rtm_connect_spec.rb +2 -1
  260. data/spec/slack/real_time/stores/store_spec.rb +50 -0
  261. data/spec/slack/slack_spec.rb +41 -6
  262. data/spec/slack/version_spec.rb +2 -1
  263. data/spec/slack/web/api/endpoints/admin_analytics_spec.rb +13 -0
  264. data/spec/slack/web/api/endpoints/admin_apps_approved_spec.rb +8 -0
  265. data/spec/slack/web/api/endpoints/admin_apps_requests_spec.rb +13 -0
  266. data/spec/slack/web/api/endpoints/admin_apps_restricted_spec.rb +8 -0
  267. data/spec/slack/web/api/endpoints/admin_apps_spec.rb +18 -0
  268. data/spec/slack/web/api/endpoints/admin_audit_anomaly_allow_spec.rb +8 -0
  269. data/spec/slack/web/api/endpoints/admin_auth_policy_spec.rb +35 -0
  270. data/spec/slack/web/api/endpoints/admin_barriers_spec.rb +38 -0
  271. data/spec/slack/web/api/endpoints/admin_conversations_ekm_spec.rb +8 -0
  272. data/spec/slack/web/api/endpoints/admin_conversations_restrictAccess_spec.rb +32 -0
  273. data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +98 -0
  274. data/spec/slack/web/api/endpoints/admin_emoji_spec.rb +37 -0
  275. data/spec/slack/web/api/endpoints/admin_inviteRequests_approved_spec.rb +8 -0
  276. data/spec/slack/web/api/endpoints/admin_inviteRequests_denied_spec.rb +8 -0
  277. data/spec/slack/web/api/endpoints/admin_inviteRequests_spec.rb +18 -0
  278. data/spec/slack/web/api/endpoints/admin_teams_admins_spec.rb +13 -0
  279. data/spec/slack/web/api/endpoints/admin_teams_owners_spec.rb +13 -0
  280. data/spec/slack/web/api/endpoints/admin_teams_settings_spec.rb +53 -0
  281. data/spec/slack/web/api/endpoints/admin_teams_spec.rb +16 -0
  282. data/spec/slack/web/api/endpoints/admin_usergroups_spec.rb +37 -0
  283. data/spec/slack/web/api/endpoints/admin_users_session_spec.rb +41 -0
  284. data/spec/slack/web/api/endpoints/admin_users_spec.rb +67 -0
  285. data/spec/slack/web/api/endpoints/admin_users_unsupportedVersions_spec.rb +8 -0
  286. data/spec/slack/web/api/endpoints/api_spec.rb +1 -0
  287. data/spec/slack/web/api/endpoints/apps_connections_spec.rb +8 -0
  288. data/spec/slack/web/api/endpoints/apps_event_authorizations_spec.rb +13 -0
  289. data/spec/slack/web/api/endpoints/apps_manifest_spec.rb +36 -0
  290. data/spec/slack/web/api/endpoints/apps_spec.rb +16 -0
  291. data/spec/slack/web/api/endpoints/{apps_permissions_resources_spec.rb → auth_teams_spec.rb} +2 -1
  292. data/spec/slack/web/api/endpoints/bookmarks_spec.rb +40 -0
  293. data/spec/slack/web/api/endpoints/bots_spec.rb +1 -0
  294. data/spec/slack/web/api/endpoints/calls_participants_spec.rb +24 -0
  295. data/spec/slack/web/api/endpoints/calls_spec.rb +31 -0
  296. data/spec/slack/web/api/endpoints/chat_scheduledMessages_spec.rb +8 -0
  297. data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +9 -7
  298. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +144 -40
  299. data/spec/slack/web/api/endpoints/custom_specs/conversations_spec.rb +13 -0
  300. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +18 -6
  301. data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +8 -3
  302. data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +112 -0
  303. data/spec/slack/web/api/endpoints/dnd_spec.rb +4 -3
  304. data/spec/slack/web/api/endpoints/emoji_spec.rb +1 -0
  305. data/spec/slack/web/api/endpoints/files_comments_spec.rb +3 -21
  306. data/spec/slack/web/api/endpoints/files_remote_spec.rb +24 -0
  307. data/spec/slack/web/api/endpoints/files_spec.rb +18 -4
  308. data/spec/slack/web/api/endpoints/migration_spec.rb +1 -0
  309. data/spec/slack/web/api/endpoints/oauth_spec.rb +1 -22
  310. data/spec/slack/web/api/endpoints/oauth_v2_spec.rb +16 -0
  311. data/spec/slack/web/api/endpoints/openid_connect_spec.rb +8 -0
  312. data/spec/slack/web/api/endpoints/pins_spec.rb +1 -0
  313. data/spec/slack/web/api/endpoints/reactions_spec.rb +8 -1
  314. data/spec/slack/web/api/endpoints/reminders_spec.rb +3 -2
  315. data/spec/slack/web/api/endpoints/rtm_spec.rb +1 -0
  316. data/spec/slack/web/api/endpoints/search_spec.rb +1 -0
  317. data/spec/slack/web/api/endpoints/stars_spec.rb +1 -0
  318. data/spec/slack/web/api/endpoints/{apps_permissions_scopes_spec.rb → team_billing_spec.rb} +2 -1
  319. data/spec/slack/web/api/endpoints/team_preferences_spec.rb +8 -0
  320. data/spec/slack/web/api/endpoints/team_profile_spec.rb +1 -0
  321. data/spec/slack/web/api/endpoints/team_spec.rb +1 -0
  322. data/spec/slack/web/api/endpoints/tooling_tokens_spec.rb +13 -0
  323. data/spec/slack/web/api/endpoints/usergroups_spec.rb +1 -0
  324. data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +3 -2
  325. data/spec/slack/web/api/endpoints/users_admin_spec.rb +1 -0
  326. data/spec/slack/web/api/endpoints/users_prefs_spec.rb +1 -0
  327. data/spec/slack/web/api/endpoints/users_profile_spec.rb +1 -0
  328. data/spec/slack/web/api/endpoints/workflows_spec.rb +26 -0
  329. data/spec/slack/web/api/error_spec.rb +7 -7
  330. data/spec/slack/web/api/errors/slack_error_spec.rb +26 -7
  331. data/spec/slack/web/api/mixins/conversations_list_spec.rb +21 -0
  332. data/spec/slack/web/api/mixins/conversations_spec.rb +45 -0
  333. data/spec/slack/web/api/mixins/users_spec.rb +19 -8
  334. data/spec/slack/web/api/pagination/cursor_spec.rb +47 -15
  335. data/spec/slack/web/client_spec.rb +199 -22
  336. data/spec/slack/web/faraday/request_spec.rb +80 -0
  337. data/spec/slack/web/faraday/response/raise_error_spec.rb +48 -12
  338. data/spec/spec_helper.rb +9 -2
  339. data/spec/support/queue_with_timeout.rb +5 -4
  340. data/spec/support/real_time/concurrency/mock.rb +1 -0
  341. data/spec/support/real_time/connected_client.rb +6 -6
  342. data/spec/support/real_time/event.rb +1 -0
  343. data/spec/support/real_time/loaded_client.rb +120 -0
  344. data/spec/support/token.rb +1 -0
  345. data/spec/support/vcr.rb +37 -1
  346. metadata +174 -262
  347. data/.travis.yml +0 -32
  348. data/bin/commands/apps_permissions.rb +0 -22
  349. data/bin/commands/apps_permissions_resources.rb +0 -14
  350. data/bin/commands/apps_permissions_scopes.rb +0 -12
  351. data/bin/commands/apps_permissions_users.rb +0 -25
  352. data/bin/commands/channels.rb +0 -175
  353. data/bin/commands/groups.rb +0 -174
  354. data/bin/commands/im.rb +0 -67
  355. data/bin/commands/mpim.rb +0 -65
  356. data/examples/hi_real_time/Gemfile +0 -5
  357. data/examples/hi_real_time/hi.gif +0 -0
  358. data/examples/hi_real_time/hi.rb +0 -37
  359. data/examples/hi_real_time_async_celluloid/Gemfile +0 -6
  360. data/examples/hi_real_time_async_celluloid/Procfile +0 -2
  361. data/examples/hi_real_time_async_celluloid/hi.rb +0 -35
  362. data/examples/hi_real_time_async_eventmachine/Gemfile +0 -6
  363. data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
  364. data/examples/hi_real_time_async_eventmachine/hi.rb +0 -35
  365. data/lib/slack/real_time/concurrency/celluloid.rb +0 -118
  366. data/lib/slack/real_time/concurrency/eventmachine.rb +0 -66
  367. data/lib/slack/web/api/endpoints/apps_permissions.rb +0 -35
  368. data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +0 -30
  369. data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +0 -20
  370. data/lib/slack/web/api/endpoints/apps_permissions_users.rb +0 -49
  371. data/lib/slack/web/api/endpoints/channels.rb +0 -266
  372. data/lib/slack/web/api/endpoints/groups.rb +0 -265
  373. data/lib/slack/web/api/endpoints/im.rb +0 -113
  374. data/lib/slack/web/api/endpoints/mpim.rb +0 -108
  375. data/lib/slack/web/api/endpoints/presence.rb +0 -23
  376. data/lib/slack/web/api/mixins/channels.id.json +0 -20
  377. data/lib/slack/web/api/mixins/groups.id.json +0 -20
  378. data/lib/slack/web/api/mixins/groups.id.rb +0 -26
  379. data/lib/slack/web/api/patches/chat.1.text-attachments-required.patch +0 -13
  380. data/lib/slack/web/api/patches/chat.2.attachments-json.patch +0 -17
  381. data/lib/slack/web/api/patches/chat.3.update-attachments-support.patch +0 -21
  382. data/lib/slack/web/api/patches/chat.4.postEphemeral-attachments-support.patch +0 -17
  383. data/lib/slack/web/api/patches/chat.5.postEphemeral-text-or-attachments.patch +0 -13
  384. data/screenshots/register-bot.png +0 -0
  385. data/spec/fixtures/slack/web/503_error.yml +0 -14
  386. data/spec/fixtures/slack/web/channels_info.yml +0 -46
  387. data/spec/fixtures/slack/web/groups_info.yml +0 -43
  388. data/spec/fixtures/slack/web/rtm_start.yml +0 -104
  389. data/spec/slack/real_time/concurrency/celluloid_spec.rb +0 -106
  390. data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -47
  391. data/spec/slack/real_time/rtm_start_spec.rb +0 -13
  392. data/spec/slack/real_time/store_spec.rb +0 -11
  393. data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +0 -15
  394. data/spec/slack/web/api/endpoints/apps_permissions_users_spec.rb +0 -18
  395. data/spec/slack/web/api/endpoints/conversations_spec.rb +0 -100
  396. data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +0 -11
  397. data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +0 -11
  398. data/spec/slack/web/api/endpoints/im_spec.rb +0 -38
  399. data/spec/slack/web/api/endpoints/mpim_spec.rb +0 -38
  400. data/spec/slack/web/api/errors/service_unavailable_spec.rb +0 -14
  401. data/spec/slack/web/api/mixins/channels_spec.rb +0 -33
  402. data/spec/slack/web/api/mixins/groups_spec.rb +0 -33
@@ -1,23 +1,22 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'ids.id'
2
3
 
3
4
  module Slack
4
5
  module Web
5
6
  module Api
6
7
  module Mixins
7
- module Channels
8
+ module Conversations
8
9
  include Ids
9
10
  #
10
11
  # This method returns a channel ID given a channel name.
11
12
  #
12
13
  # @option options [channel] :channel
13
14
  # Channel to get ID for, prefixed with #.
14
- def channels_id(options = {})
15
+ def conversations_id(options = {})
15
16
  name = options[:channel]
16
- throw ArgumentError.new('Required arguments :channel missing') if name.nil?
17
+ raise ArgumentError, 'Required arguments :channel missing' if name.nil?
17
18
 
18
- id_for(:channel, name, '#', :channels, 'channel_not_found') do
19
- channels_list
20
- end
19
+ id_for :channel, name, '#', :conversations_list, :channels, 'channel_not_found'
21
20
  end
22
21
  end
23
22
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module Web
3
4
  module Api
@@ -5,10 +6,10 @@ module Slack
5
6
  module Ids
6
7
  private
7
8
 
8
- def id_for(key, name, prefix, list_method, not_found_error)
9
+ def id_for(key, name, prefix, enum_method, list_method, not_found_error)
9
10
  return { 'ok' => true, key.to_s => { 'id' => name } } unless name[0] == prefix
10
11
 
11
- yield.tap do |list|
12
+ public_send enum_method 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
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'ids.id'
2
3
 
3
4
  module Slack
@@ -13,11 +14,9 @@ module Slack
13
14
  # User to get ID for, prefixed with '@'.
14
15
  def users_id(options = {})
15
16
  name = options[:user]
16
- throw ArgumentError.new('Required arguments :user missing') if name.nil?
17
+ raise ArgumentError, 'Required arguments :user missing' if name.nil?
17
18
 
18
- id_for(:user, name, '@', :members, 'user_not_found') do
19
- users_list
20
- end
19
+ id_for :user, name, '@', :users_list, :members, 'user_not_found'
21
20
  end
22
21
  end
23
22
  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
- throw ArgumentError.new('Required arguments :user missing') if query.nil?
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
@@ -1,4 +1,4 @@
1
- require_relative 'mixins/channels.id'
1
+ # frozen_string_literal: true
2
+ require_relative 'mixins/conversations.id'
2
3
  require_relative 'mixins/users.id'
3
4
  require_relative 'mixins/users.search'
4
- require_relative 'mixins/groups.id'
@@ -0,0 +1,69 @@
1
+ diff --git a/lib/slack/web/api/endpoints/chat.rb b/lib/slack/web/api/endpoints/chat.rb
2
+ index 701cd1e..07acc40 100644
3
+ --- a/lib/slack/web/api/endpoints/chat.rb
4
+ +++ b/lib/slack/web/api/endpoints/chat.rb
5
+ @@ -122,9 +122,21 @@ module Slack
6
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat/chat.postEphemeral.json
7
+ def chat_postEphemeral(options = {})
8
+ raise ArgumentError, 'Required arguments :channel missing' if options[:channel].nil?
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?
11
+ raise ArgumentError, 'Required arguments :user missing' if options[:user].nil?
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
50
+ def chat_update(options = {})
51
+ 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
+ raise ArgumentError, 'Required arguments :ts missing' if options[:ts].nil?
54
+ 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
67
+ post('chat.update', options)
68
+ end
69
+ end
@@ -1,11 +1,11 @@
1
1
  diff --git a/lib/slack/web/api/endpoints/dialog.rb b/lib/slack/web/api/endpoints/dialog.rb
2
- index 01f9dfd..d017adf 100644
2
+ index 05475c8..a4ff4ff 100644
3
3
  --- a/lib/slack/web/api/endpoints/dialog.rb
4
4
  +++ b/lib/slack/web/api/endpoints/dialog.rb
5
- @@ -17,6 +17,12 @@ module Slack
5
+ @@ -18,6 +18,12 @@ module Slack
6
6
  def dialog_open(options = {})
7
- throw ArgumentError.new('Required arguments :dialog missing') if options[:dialog].nil?
8
- throw ArgumentError.new('Required arguments :trigger_id missing') if options[:trigger_id].nil?
7
+ raise ArgumentError, 'Required arguments :dialog missing' if options[:dialog].nil?
8
+ raise ArgumentError, 'Required arguments :trigger_id missing' if options[:trigger_id].nil?
9
9
  + # dialog must be passed as an encoded JSON string
10
10
  + if options.key?(:dialog)
11
11
  + dialog = options[:dialog]
@@ -0,0 +1,55 @@
1
+ diff --git a/lib/slack/web/api/endpoints/views.rb b/lib/slack/web/api/endpoints/views.rb
2
+ index cfa83a5..038c5f0 100644
3
+ --- a/lib/slack/web/api/endpoints/views.rb
4
+ +++ b/lib/slack/web/api/endpoints/views.rb
5
+ @@ -19,6 +19,12 @@ module Slack
6
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/views/views.open.json
7
+ def views_open(options = {})
8
+ raise ArgumentError, 'Required arguments :view missing' if options[:view].nil?
9
+ + raise ArgumentError, 'One of :trigger_id, :interactivity_pointer is required' unless options[:trigger_id].nil? ^ options[:interactivity_pointer].nil?
10
+ + if options.key?(:view)
11
+ + view = options[:view]
12
+ + view = JSON.dump(view) unless view.is_a?(String)
13
+ + options = options.merge(view: view)
14
+ + end
15
+ post('views.open', options)
16
+ end
17
+
18
+ @@ -36,6 +42,11 @@ module Slack
19
+ def views_publish(options = {})
20
+ raise ArgumentError, 'Required arguments :user_id missing' if options[:user_id].nil?
21
+ raise ArgumentError, 'Required arguments :view missing' if options[:view].nil?
22
+ + if options.key?(:view)
23
+ + view = options[:view]
24
+ + view = JSON.dump(view) unless view.is_a?(String)
25
+ + options = options.merge(view: view)
26
+ + end
27
+ post('views.publish', options)
28
+ end
29
+
30
+ @@ -52,6 +63,12 @@ module Slack
31
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/views/views.push.json
32
+ def views_push(options = {})
33
+ raise ArgumentError, 'Required arguments :view missing' if options[:view].nil?
34
+ + raise ArgumentError, 'One of :trigger_id, :interactivity_pointer is required' unless options[:trigger_id].nil? ^ options[:interactivity_pointer].nil?
35
+ + if options.key?(:view)
36
+ + view = options[:view]
37
+ + view = JSON.dump(view) unless view.is_a?(String)
38
+ + options = options.merge(view: view)
39
+ + end
40
+ post('views.push', options)
41
+ end
42
+
43
+ @@ -70,6 +87,12 @@ module Slack
44
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/views/views.update.json
45
+ def views_update(options = {})
46
+ raise ArgumentError, 'Required arguments :view missing' if options[:view].nil?
47
+ + raise ArgumentError, 'One of :external_id, :view_id is required' unless options[:external_id].nil? ^ options[:view_id].nil?
48
+ + if options.key?(:view)
49
+ + view = options[:view]
50
+ + view = JSON.dump(view) unless view.is_a?(String)
51
+ + options = options.merge(view: view)
52
+ + end
53
+ post('views.update', options)
54
+ end
55
+ 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
  <% desc = group['desc'] || "#{group['name'].gsub(".", "_").camelize} methods." %>
@@ -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| %>
@@ -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::Channels
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,12 +35,12 @@ 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
- throw ArgumentError.new('Required arguments :<%= arg_name %> missing') if options[:<%= arg_name %>].nil?
38
+ raise ArgumentError, 'Required arguments :<%= arg_name %> missing' if options[:<%= arg_name %>].nil?
38
39
  <% end %>
39
40
  <% if data['group'] == 'groups' && data['args']['channel'] && !data['args']['channel']['desc'].include?('Can be an encoded ID, or a name.') %>
40
41
  options = options.merge(channel: groups_id(options)['group']['id']) if options[:channel]
41
42
  <% elsif data['args']['channel'] && !data['args']['channel']['desc'].include?('Can be an encoded ID, or a name.') %>
42
- options = options.merge(channel: channels_id(options)['channel']['id']) if options[:channel]
43
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
43
44
  <% end %>
44
45
  <% if data['args']['user'] %>
45
46
  options = options.merge(user: users_id(options)['user']['id']) if options[:user]
@@ -47,6 +48,9 @@ module Slack
47
48
  <% if data['undocumented'] %>
48
49
  logger.warn('The <%= group %>.<%= name %> method is undocumented.')
49
50
  <% end %>
51
+ <% if data['deprecated'] %>
52
+ logger.warn('<%= group %>.<%= name %>: <%= data['deprecation']['deprecation_warning']%> Alternative methods: <%= data['deprecation']['alternative_methods'].join(', ')%>.')
53
+ <% end %>
50
54
  <% if data['args'].keys.include?('cursor') %>
51
55
  if block_given?
52
56
  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'
@@ -11,7 +12,7 @@ RSpec.describe Slack::Web::Api::Endpoints::<%= group.gsub(".", "_").camelize %>
11
12
  context '<%= group %>_<%= name %>' do
12
13
  <% required_params.each do |arg_name, arg_v| %>
13
14
  it 'requires <%= arg_name %>' do
14
- <% params_except_required = required_params.reject{ |name, _| name == arg_name }.map{|var, opts| "#{var}: '#{opts['example']}'"}.join(', ') %>
15
+ <% params_except_required = required_params.reject{ |name, _| name == arg_name }.map{ |var, opts| "#{var}: %q[#{opts['example']}]"}.join(', ') %>
15
16
  expect { client.<%= group.gsub(".", "_") %>_<%= name %><%= params_except_required.empty? ? '' : "(#{params_except_required})" %> }.to raise_error ArgumentError, /Required arguments :<%= arg_name %> missing/
16
17
  end
17
18
  <% end %>
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module Web
3
4
  class Client
@@ -9,7 +10,7 @@ module Slack
9
10
 
10
11
  def initialize(options = {})
11
12
  Slack::Web::Config::ATTRIBUTES.each do |key|
12
- send("#{key}=", options[key] || Slack::Web.config.send(key))
13
+ send("#{key}=", options.fetch(key, Slack::Web.config.send(key)))
13
14
  end
14
15
  @logger ||= Slack::Config.logger || Slack::Logger.default
15
16
  @token ||= Slack.config.token
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module Web
3
4
  module Config
@@ -15,6 +16,7 @@ module Slack
15
16
  open_timeout
16
17
  default_page_size
17
18
  default_max_retries
19
+ adapter
18
20
  ].freeze
19
21
 
20
22
  attr_accessor(*Config::ATTRIBUTES)
@@ -22,8 +24,8 @@ module Slack
22
24
  def reset
23
25
  self.endpoint = 'https://slack.com/api/'
24
26
  self.user_agent = "Slack Ruby Client/#{Slack::VERSION}"
25
- self.ca_path = defined?(OpenSSL) ? OpenSSL::X509::DEFAULT_CERT_DIR : nil
26
- self.ca_file = defined?(OpenSSL) ? OpenSSL::X509::DEFAULT_CERT_FILE : nil
27
+ self.ca_path = nil
28
+ self.ca_file = nil
27
29
  self.token = nil
28
30
  self.proxy = nil
29
31
  self.logger = nil
@@ -31,6 +33,7 @@ module Slack
31
33
  self.open_timeout = nil
32
34
  self.default_page_size = 100
33
35
  self.default_max_retries = 100
36
+ self.adapter = ::Faraday.default_adapter
34
37
  end
35
38
  end
36
39
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module Web
3
4
  module Faraday
@@ -5,29 +6,32 @@ module Slack
5
6
  private
6
7
 
7
8
  def connection
8
- options = {
9
- headers: { 'Accept' => 'application/json; charset=utf-8' }
10
- }
9
+ @connection ||=
10
+ begin
11
+ options = {
12
+ headers: { 'Accept' => 'application/json; charset=utf-8' }
13
+ }
11
14
 
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
+ options[:headers]['User-Agent'] = user_agent if user_agent
16
+ options[:proxy] = proxy if proxy
17
+ options[:ssl] = { ca_path: ca_path, ca_file: ca_file } if ca_path || ca_file
15
18
 
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?
19
+ request_options = {}
20
+ request_options[:timeout] = timeout if timeout
21
+ request_options[:open_timeout] = open_timeout if open_timeout
22
+ options[:request] = request_options if request_options.any?
20
23
 
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
25
- connection.use ::Slack::Web::Faraday::Response::RaiseError
26
- connection.use ::FaradayMiddleware::Mashify, mash_class: Slack::Messages::Message
27
- connection.use ::FaradayMiddleware::ParseJson
28
- connection.response :logger, logger if logger
29
- connection.adapter ::Faraday.default_adapter
30
- end
24
+ ::Faraday::Connection.new(endpoint, options) do |connection|
25
+ connection.request :multipart
26
+ connection.request :url_encoded
27
+ connection.use ::Slack::Web::Faraday::Response::RaiseError
28
+ connection.response :mashify, mash_class: Slack::Messages::Message
29
+ connection.response :json, content_type: /\b*$/
30
+ connection.use ::Slack::Web::Faraday::Response::WrapError
31
+ connection.response :logger, logger if logger
32
+ connection.adapter adapter
33
+ end
34
+ end
31
35
  end
32
36
  end
33
37
  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,21 @@ 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!
31
32
  request.body = options unless options.empty?
32
33
  end
34
+ request.headers['Authorization'] = "Bearer #{token}" if token
33
35
  request.options.merge!(options.delete(:request)) if options.key?(:request)
34
36
  end
35
37
  response.body
38
+ rescue ::Faraday::ParsingError => e
39
+ raise Slack::Web::Api::Errors::ParsingError, e.response
36
40
  end
37
41
  end
38
42
  end
@@ -1,15 +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::Response::Middleware
6
+ class RaiseError < ::Faraday::Middleware
6
7
  def on_complete(env)
7
- if env.status == 429
8
- raise Slack::Web::Api::Errors::TooManyRequestsError, env.response
9
- elsif (body = env.body) && !body['ok']
10
- error_message = body['error'] || body['errors'].map { |message| message['error'] }.join(',')
11
- raise Slack::Web::Api::Errors::SlackError.new(error_message, env.response)
12
- end
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)
13
20
  end
14
21
  end
15
22
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ module Slack
3
+ module Web
4
+ module Faraday
5
+ module Response
6
+ class WrapError < ::Faraday::Middleware
7
+ UNAVAILABLE_ERROR_STATUSES = (500..599).freeze
8
+
9
+ def on_complete(env)
10
+ return unless UNAVAILABLE_ERROR_STATUSES.cover?(env.status)
11
+
12
+ raise Slack::Web::Api::Errors::UnavailableError, env.response
13
+ end
14
+
15
+ def call(env)
16
+ super
17
+ rescue ::Faraday::TimeoutError, ::Faraday::ConnectionFailed
18
+ raise Slack::Web::Api::Errors::TimeoutError, env.response
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 Api
@@ -5,11 +6,7 @@ module Slack
5
6
  class Cursor
6
7
  include Enumerable
7
8
 
8
- attr_reader :client
9
- attr_reader :verb
10
- attr_reader :sleep_interval
11
- attr_reader :max_retries
12
- attr_reader :params
9
+ attr_reader :client, :verb, :sleep_interval, :max_retries, :params
13
10
 
14
11
  def initialize(client, verb, params = {})
15
12
  @client = client
@@ -28,15 +25,18 @@ module Slack
28
25
  response = client.send(verb, query)
29
26
  rescue Slack::Web::Api::Errors::TooManyRequestsError => e
30
27
  raise e if retry_count >= max_retries
28
+
31
29
  client.logger.debug("#{self.class}##{__method__}") { e.to_s }
32
30
  retry_count += 1
33
- sleep(e.retry_after.seconds)
31
+ sleep(e.retry_after)
34
32
  next
35
33
  end
36
34
  yield response
37
35
  break unless response.response_metadata
36
+
38
37
  next_cursor = response.response_metadata.next_cursor
39
- break if next_cursor.blank?
38
+ break if next_cursor.nil? || next_cursor == ''
39
+
40
40
  retry_count = 0
41
41
  sleep(sleep_interval) if sleep_interval
42
42
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'slack/version'
2
3
  require_relative 'slack/logger'
3
4
  require_relative 'slack/config'
@@ -9,24 +10,28 @@ require_relative 'slack/messages/formatting'
9
10
 
10
11
  # Web API
11
12
  require 'faraday'
12
- require 'faraday_middleware'
13
+ require 'faraday/mashify'
14
+ require 'faraday/multipart'
13
15
  require 'json'
14
16
  require 'logger'
15
17
  begin
16
18
  require 'picky'
17
- rescue LoadError
19
+ rescue LoadError # rubocop:disable Lint/SuppressedException
18
20
  # ignore, only used in users_search
19
21
  end
20
22
  begin
21
23
  require 'openssl'
22
- rescue LoadError
24
+ rescue LoadError # rubocop:disable Lint/SuppressedException
23
25
  # Used in slack/web/config
24
26
  end
25
27
  require_relative 'slack/web/config'
26
28
  require_relative 'slack/web/api/errors/slack_error'
27
29
  require_relative 'slack/web/api/errors/too_many_requests_error'
28
30
  require_relative 'slack/web/api/error'
31
+ require_relative 'slack/web/api/errors'
32
+ require_relative 'slack/web/api/errors/server_error'
29
33
  require_relative 'slack/web/faraday/response/raise_error'
34
+ require_relative 'slack/web/faraday/response/wrap_error'
30
35
  require_relative 'slack/web/faraday/connection'
31
36
  require_relative 'slack/web/faraday/request'
32
37
  require_relative 'slack/web/api/mixins'
@@ -35,8 +40,6 @@ require_relative 'slack/web/pagination/cursor'
35
40
  require_relative 'slack/web/client'
36
41
 
37
42
  # RealTime API
38
- require 'active_support'
39
- require 'active_support/core_ext'
40
43
  require_relative 'slack/real_time/concurrency'
41
44
  require_relative 'slack/real_time/socket'
42
45
  require_relative 'slack/real_time/api/message_id'
@@ -47,3 +50,7 @@ require_relative 'slack/real_time/models'
47
50
  require_relative 'slack/real_time/stores'
48
51
  require_relative 'slack/real_time/config'
49
52
  require_relative 'slack/real_time/client'
53
+
54
+ # Events API
55
+ require_relative 'slack/events/config'
56
+ require_relative 'slack/events/request'
data/lib/slack.rb CHANGED
@@ -1 +1,2 @@
1
+ # frozen_string_literal: true
1
2
  require 'slack-ruby-client'
@@ -1 +1,2 @@
1
+ # frozen_string_literal: true
1
2
  require 'slack-ruby-client'
data/lib/tasks/git.rake CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  namespace :slack do
2
3
  # update slack-api-ref from https://github.com/slack-ruby/slack-api-ref
3
4
  task :git_update do