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.
Files changed (403) hide show
  1. checksums.yaml +5 -5
  2. data/.coveralls.yml +2 -0
  3. data/.github/FUNDING.yml +2 -0
  4. data/.github/dependabot.yml +6 -0
  5. data/.github/workflows/integration_test.yml +45 -0
  6. data/.github/workflows/lint.yml +14 -0
  7. data/.github/workflows/pr_lint.yml +21 -0
  8. data/.github/workflows/test.yml +56 -0
  9. data/.github/workflows/update_api.yml +81 -0
  10. data/.gitignore +7 -3
  11. data/.rubocop.yml +40 -2
  12. data/.rubocop_todo.yml +209 -55
  13. data/.ruby-version +1 -0
  14. data/CHANGELOG.md +257 -30
  15. data/CONTRIBUTING.md +44 -29
  16. data/Dangerfile +2 -0
  17. data/Gemfile +28 -6
  18. data/Gemfile.danger +6 -0
  19. data/LICENSE.md +1 -1
  20. data/README.md +473 -134
  21. data/RELEASING.md +2 -2
  22. data/Rakefile +2 -1
  23. data/SECURITY.md +9 -0
  24. data/UPGRADING.md +117 -3
  25. data/bin/commands/admin_analytics.rb +22 -0
  26. data/bin/commands/admin_apps.rb +57 -0
  27. data/bin/commands/admin_apps_activities.rb +32 -0
  28. data/bin/commands/admin_apps_approved.rb +24 -0
  29. data/bin/commands/admin_apps_config.rb +31 -0
  30. data/bin/commands/admin_apps_requests.rb +35 -0
  31. data/bin/commands/admin_apps_restricted.rb +24 -0
  32. data/bin/commands/admin_audit_anomaly_allow.rb +29 -0
  33. data/bin/commands/admin_auth_policy.rb +45 -0
  34. data/bin/commands/admin_barriers.rb +53 -0
  35. data/bin/commands/admin_conversations.rb +260 -0
  36. data/bin/commands/admin_conversations_ekm.rb +23 -0
  37. data/bin/commands/admin_conversations_restrictAccess.rb +43 -0
  38. data/bin/commands/admin_emoji.rb +60 -0
  39. data/bin/commands/admin_functions.rb +23 -0
  40. data/bin/commands/admin_functions_permissions.rb +31 -0
  41. data/bin/commands/admin_inviteRequests.rb +42 -0
  42. data/bin/commands/admin_inviteRequests_approved.rb +22 -0
  43. data/bin/commands/admin_inviteRequests_denied.rb +22 -0
  44. data/bin/commands/admin_roles.rb +46 -0
  45. data/bin/commands/admin_teams.rb +33 -0
  46. data/bin/commands/admin_teams_admins.rb +22 -0
  47. data/bin/commands/admin_teams_owners.rb +22 -0
  48. data/bin/commands/admin_teams_settings.rb +70 -0
  49. data/bin/commands/admin_usergroups.rb +54 -0
  50. data/bin/commands/admin_users.rb +106 -0
  51. data/bin/commands/admin_users_session.rb +84 -0
  52. data/bin/commands/admin_users_unsupportedVersions.rb +21 -0
  53. data/bin/commands/admin_workflows.rb +42 -0
  54. data/bin/commands/admin_workflows_collaborators.rb +31 -0
  55. data/bin/commands/admin_workflows_permissions.rb +21 -0
  56. data/bin/commands/admin_workflows_triggers_types_permissions.rb +31 -0
  57. data/bin/commands/api.rb +15 -9
  58. data/bin/commands/apps.rb +21 -0
  59. data/bin/commands/apps_activities.rb +32 -0
  60. data/bin/commands/apps_auth_external.rb +32 -0
  61. data/bin/commands/apps_connections.rb +19 -0
  62. data/bin/commands/apps_datastore.rb +116 -0
  63. data/bin/commands/apps_event_authorizations.rb +22 -0
  64. data/bin/commands/apps_manifest.rb +58 -0
  65. data/bin/commands/assistant_search.rb +27 -0
  66. data/bin/commands/assistant_threads.rb +45 -0
  67. data/bin/commands/auth.rb +22 -15
  68. data/bin/commands/auth_teams.rb +22 -0
  69. data/bin/commands/bookmarks.rb +60 -0
  70. data/bin/commands/bots.rb +16 -8
  71. data/bin/commands/calls.rb +58 -0
  72. data/bin/commands/calls_participants.rb +31 -0
  73. data/bin/commands/canvases.rb +41 -0
  74. data/bin/commands/canvases_access.rb +34 -0
  75. data/bin/commands/canvases_sections.rb +21 -0
  76. data/bin/commands/chat.rb +158 -99
  77. data/bin/commands/chat_scheduledMessages.rb +25 -0
  78. data/bin/commands/conversations.rb +241 -157
  79. data/bin/commands/conversations_canvases.rb +22 -0
  80. data/bin/commands/conversations_externalInvitePermissions.rb +22 -0
  81. data/bin/commands/conversations_requestSharedInvite.rb +48 -0
  82. data/bin/commands/dialog.rb +16 -9
  83. data/bin/commands/dnd.rb +47 -38
  84. data/bin/commands/emoji.rb +15 -7
  85. data/bin/commands/files.rb +113 -87
  86. data/bin/commands/files_comments.rb +16 -30
  87. data/bin/commands/files_remote.rb +84 -0
  88. data/bin/commands/functions.rb +31 -0
  89. data/bin/commands/functions_distributions_permissions.rb +61 -0
  90. data/bin/commands/functions_workflows_steps.rb +23 -0
  91. data/bin/commands/functions_workflows_steps_responses.rb +23 -0
  92. data/bin/commands/migration.rb +17 -9
  93. data/bin/commands/oauth.rb +19 -24
  94. data/bin/commands/oauth_v2.rb +35 -0
  95. data/bin/commands/openid_connect.rb +33 -0
  96. data/bin/commands/pins.rb +33 -30
  97. data/bin/commands/reactions.rb +53 -45
  98. data/bin/commands/reminders.rb +54 -41
  99. data/bin/commands/rtm.rb +16 -22
  100. data/bin/commands/search.rb +44 -33
  101. data/bin/commands/stars.rb +39 -29
  102. data/bin/commands/team.rb +50 -34
  103. data/bin/commands/team_billing.rb +19 -0
  104. data/bin/commands/team_externalTeams.rb +35 -0
  105. data/bin/commands/team_preferences.rb +19 -0
  106. data/bin/commands/team_profile.rb +15 -8
  107. data/bin/commands/tooling_tokens.rb +20 -0
  108. data/bin/commands/usergroups.rb +69 -53
  109. data/bin/commands/usergroups_users.rb +30 -19
  110. data/bin/commands/users.rb +114 -84
  111. data/bin/commands/users_admin.rb +29 -22
  112. data/bin/commands/users_discoverableContacts.rb +20 -0
  113. data/bin/commands/users_prefs.rb +14 -7
  114. data/bin/commands/users_profile.rb +27 -20
  115. data/bin/commands/views.rb +56 -0
  116. data/bin/commands/workflows.rb +44 -0
  117. data/bin/commands/workflows_triggers_permissions.rb +60 -0
  118. data/bin/slack +50 -46
  119. data/examples/files_upload_v2/.env.example +1 -0
  120. data/examples/{hi_real_time → files_upload_v2}/Gemfile +2 -2
  121. data/examples/files_upload_v2/README.md +13 -0
  122. data/examples/files_upload_v2/files_upload_v2.rb +45 -0
  123. data/examples/hi_real_time_and_web/Gemfile +1 -0
  124. data/examples/hi_real_time_and_web/hi.rb +7 -3
  125. data/examples/{hi_real_time_async_eventmachine → hi_real_time_async_async}/Gemfile +2 -1
  126. data/examples/{hi_real_time_async_eventmachine → hi_real_time_async_async}/hi.rb +12 -7
  127. data/examples/hi_web/Gemfile +1 -0
  128. data/examples/hi_web/hi.rb +1 -0
  129. data/examples/new_ticket/Gemfile +1 -0
  130. data/examples/new_ticket/new_ticket.rb +1 -0
  131. data/examples/oauth_v2/.env.example +4 -0
  132. data/examples/oauth_v2/Gemfile +7 -0
  133. data/examples/oauth_v2/README.md +33 -0
  134. data/examples/oauth_v2/oauth_v2.rb +60 -0
  135. data/lib/slack/config.rb +2 -2
  136. data/lib/slack/events/config.rb +32 -0
  137. data/lib/slack/events/request.rb +76 -0
  138. data/lib/slack/logger.rb +6 -5
  139. data/lib/slack/messages/formatting.rb +66 -1
  140. data/lib/slack/messages/message.rb +1 -4
  141. data/lib/slack/real_time/api/message.rb +6 -3
  142. data/lib/slack/real_time/api/message_id.rb +1 -0
  143. data/lib/slack/real_time/api/ping.rb +5 -2
  144. data/lib/slack/real_time/api/templates/event_handler.erb +5 -1
  145. data/lib/slack/real_time/api/typing.rb +5 -2
  146. data/lib/slack/real_time/client.rb +117 -54
  147. data/lib/slack/real_time/concurrency/async.rb +142 -0
  148. data/lib/slack/real_time/concurrency.rb +2 -2
  149. data/lib/slack/real_time/config.rb +12 -13
  150. data/lib/slack/real_time/models/base.rb +1 -4
  151. data/lib/slack/real_time/models/bot.rb +1 -0
  152. data/lib/slack/real_time/models/channel.rb +5 -0
  153. data/lib/slack/real_time/models/im.rb +1 -0
  154. data/lib/slack/real_time/models/{group.rb → mpim.rb} +2 -1
  155. data/lib/slack/real_time/models/team.rb +1 -0
  156. data/lib/slack/real_time/models/user.rb +1 -0
  157. data/lib/slack/real_time/models.rb +3 -1
  158. data/lib/slack/real_time/socket.rb +49 -17
  159. data/lib/slack/real_time/stores/base.rb +28 -14
  160. data/lib/slack/real_time/stores/starter.rb +325 -287
  161. data/lib/slack/real_time/stores/store.rb +271 -186
  162. data/lib/slack/real_time/stores.rb +2 -7
  163. data/lib/slack/utils/security.rb +44 -0
  164. data/lib/slack/version.rb +2 -1
  165. data/lib/slack/web/api/endpoints/admin_analytics.rb +28 -0
  166. data/lib/slack/web/api/endpoints/admin_apps.rb +78 -0
  167. data/lib/slack/web/api/endpoints/admin_apps_activities.rb +53 -0
  168. data/lib/slack/web/api/endpoints/admin_apps_approved.rb +37 -0
  169. data/lib/slack/web/api/endpoints/admin_apps_config.rb +40 -0
  170. data/lib/slack/web/api/endpoints/admin_apps_requests.rb +53 -0
  171. data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +37 -0
  172. data/lib/slack/web/api/endpoints/admin_audit_anomaly_allow.rb +34 -0
  173. data/lib/slack/web/api/endpoints/admin_auth_policy.rb +72 -0
  174. data/lib/slack/web/api/endpoints/admin_barriers.rb +82 -0
  175. data/lib/slack/web/api/endpoints/admin_conversations.rb +397 -0
  176. data/lib/slack/web/api/endpoints/admin_conversations_ekm.rb +35 -0
  177. data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +61 -0
  178. data/lib/slack/web/api/endpoints/admin_emoji.rb +88 -0
  179. data/lib/slack/web/api/endpoints/admin_functions.rb +36 -0
  180. data/lib/slack/web/api/endpoints/admin_functions_permissions.rb +41 -0
  181. data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +61 -0
  182. data/lib/slack/web/api/endpoints/admin_inviteRequests_approved.rb +33 -0
  183. data/lib/slack/web/api/endpoints/admin_inviteRequests_denied.rb +33 -0
  184. data/lib/slack/web/api/endpoints/admin_roles.rb +73 -0
  185. data/lib/slack/web/api/endpoints/admin_teams.rb +50 -0
  186. data/lib/slack/web/api/endpoints/admin_teams_admins.rb +34 -0
  187. data/lib/slack/web/api/endpoints/admin_teams_owners.rb +34 -0
  188. data/lib/slack/web/api/endpoints/admin_teams_settings.rb +99 -0
  189. data/lib/slack/web/api/endpoints/admin_usergroups.rb +77 -0
  190. data/lib/slack/web/api/endpoints/admin_users.rb +167 -0
  191. data/lib/slack/web/api/endpoints/admin_users_session.rb +121 -0
  192. data/lib/slack/web/api/endpoints/admin_users_unsupportedVersions.rb +25 -0
  193. data/lib/slack/web/api/endpoints/admin_workflows.rb +67 -0
  194. data/lib/slack/web/api/endpoints/admin_workflows_collaborators.rb +42 -0
  195. data/lib/slack/web/api/endpoints/admin_workflows_permissions.rb +26 -0
  196. data/lib/slack/web/api/endpoints/admin_workflows_triggers_types_permissions.rb +41 -0
  197. data/lib/slack/web/api/endpoints/api.rb +2 -3
  198. data/lib/slack/web/api/endpoints/apps.rb +27 -0
  199. data/lib/slack/web/api/endpoints/apps_activities.rb +54 -0
  200. data/lib/slack/web/api/endpoints/apps_auth_external.rb +41 -0
  201. data/lib/slack/web/api/endpoints/apps_connections.rb +21 -0
  202. data/lib/slack/web/api/endpoints/apps_datastore.rb +181 -0
  203. data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +34 -0
  204. data/lib/slack/web/api/endpoints/apps_manifest.rb +79 -0
  205. data/lib/slack/web/api/endpoints/assistant_search.rb +44 -0
  206. data/lib/slack/web/api/endpoints/assistant_threads.rb +68 -0
  207. data/lib/slack/web/api/endpoints/auth.rb +2 -1
  208. data/lib/slack/web/api/endpoints/auth_teams.rb +33 -0
  209. data/lib/slack/web/api/endpoints/bookmarks.rb +90 -0
  210. data/lib/slack/web/api/endpoints/bots.rb +4 -1
  211. data/lib/slack/web/api/endpoints/calls.rb +83 -0
  212. data/lib/slack/web/api/endpoints/calls_participants.rb +42 -0
  213. data/lib/slack/web/api/endpoints/canvases.rb +54 -0
  214. data/lib/slack/web/api/endpoints/canvases_access.rb +47 -0
  215. data/lib/slack/web/api/endpoints/canvases_sections.rb +27 -0
  216. data/lib/slack/web/api/endpoints/chat.rb +172 -87
  217. data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +40 -0
  218. data/lib/slack/web/api/endpoints/conversations.rb +190 -64
  219. data/lib/slack/web/api/endpoints/conversations_canvases.rb +28 -0
  220. data/lib/slack/web/api/endpoints/conversations_externalInvitePermissions.rb +31 -0
  221. data/lib/slack/web/api/endpoints/conversations_requestSharedInvite.rb +73 -0
  222. data/lib/slack/web/api/endpoints/dialog.rb +6 -10
  223. data/lib/slack/web/api/endpoints/dnd.rb +11 -5
  224. data/lib/slack/web/api/endpoints/emoji.rb +3 -0
  225. data/lib/slack/web/api/endpoints/files.rb +85 -36
  226. data/lib/slack/web/api/endpoints/files_comments.rb +4 -36
  227. data/lib/slack/web/api/endpoints/files_remote.rb +127 -0
  228. data/lib/slack/web/api/endpoints/functions.rb +43 -0
  229. data/lib/slack/web/api/endpoints/functions_distributions_permissions.rb +84 -0
  230. data/lib/slack/web/api/endpoints/functions_workflows_steps.rb +30 -0
  231. data/lib/slack/web/api/endpoints/functions_workflows_steps_responses.rb +30 -0
  232. data/lib/slack/web/api/endpoints/migration.rb +6 -3
  233. data/lib/slack/web/api/endpoints/oauth.rb +10 -32
  234. data/lib/slack/web/api/endpoints/oauth_v2.rb +48 -0
  235. data/lib/slack/web/api/endpoints/openid_connect.rb +42 -0
  236. data/lib/slack/web/api/endpoints/pins.rb +11 -18
  237. data/lib/slack/web/api/endpoints/reactions.rb +31 -20
  238. data/lib/slack/web/api/endpoints/reminders.rb +25 -12
  239. data/lib/slack/web/api/endpoints/rtm.rb +4 -22
  240. data/lib/slack/web/api/endpoints/search.rb +33 -18
  241. data/lib/slack/web/api/endpoints/stars.rb +23 -10
  242. data/lib/slack/web/api/endpoints/team.rb +38 -7
  243. data/lib/slack/web/api/endpoints/team_billing.rb +21 -0
  244. data/lib/slack/web/api/endpoints/team_externalTeams.rb +53 -0
  245. data/lib/slack/web/api/endpoints/team_preferences.rb +21 -0
  246. data/lib/slack/web/api/endpoints/team_profile.rb +2 -1
  247. data/lib/slack/web/api/endpoints/tooling_tokens.rb +24 -0
  248. data/lib/slack/web/api/endpoints/usergroups.rb +44 -25
  249. data/lib/slack/web/api/endpoints/usergroups_users.rb +23 -14
  250. data/lib/slack/web/api/endpoints/users.rb +57 -18
  251. data/lib/slack/web/api/endpoints/users_admin.rb +5 -2
  252. data/lib/slack/web/api/endpoints/users_discoverableContacts.rb +24 -0
  253. data/lib/slack/web/api/endpoints/users_prefs.rb +2 -0
  254. data/lib/slack/web/api/endpoints/users_profile.rb +11 -9
  255. data/lib/slack/web/api/endpoints/views.rb +86 -0
  256. data/lib/slack/web/api/endpoints/workflows.rb +63 -0
  257. data/lib/slack/web/api/endpoints/workflows_triggers_permissions.rb +87 -0
  258. data/lib/slack/web/api/endpoints.rb +136 -12
  259. data/lib/slack/web/api/error.rb +1 -0
  260. data/lib/slack/web/api/errors/server_error.rb +37 -0
  261. data/lib/slack/web/api/errors/slack_error.rb +14 -1
  262. data/lib/slack/web/api/errors/too_many_requests_error.rb +2 -4
  263. data/lib/slack/web/api/errors.rb +1396 -0
  264. data/lib/slack/web/api/helpers/files.rb +97 -0
  265. data/lib/slack/web/api/helpers.rb +13 -0
  266. data/lib/slack/web/api/mixins/conversations.id.rb +47 -0
  267. data/lib/slack/web/api/mixins/ids.id.rb +4 -3
  268. data/lib/slack/web/api/mixins/users.id.rb +18 -4
  269. data/lib/slack/web/api/mixins/users.search.rb +3 -1
  270. data/lib/slack/web/api/mixins.rb +2 -2
  271. data/lib/slack/web/api/options.rb +26 -0
  272. data/lib/slack/web/api/patches/.gitkeep +0 -0
  273. data/lib/slack/web/api/templates/command.erb +19 -12
  274. data/lib/slack/web/api/templates/endpoints.erb +2 -2
  275. data/lib/slack/web/api/templates/errors.erb +20 -0
  276. data/lib/slack/web/api/templates/method.erb +23 -3
  277. data/lib/slack/web/api/templates/method_spec.erb +40 -3
  278. data/lib/slack/web/client.rb +4 -1
  279. data/lib/slack/web/config.rb +9 -2
  280. data/lib/slack/web/faraday/connection.rb +11 -20
  281. data/lib/slack/web/faraday/options.rb +24 -0
  282. data/lib/slack/web/faraday/request.rb +6 -1
  283. data/lib/slack/web/faraday/response/raise_error.rb +14 -8
  284. data/lib/slack/web/faraday/response/wrap_error.rb +24 -0
  285. data/lib/slack/web/pagination/cursor.rb +7 -7
  286. data/lib/slack-ruby-client.rb +18 -6
  287. data/lib/slack.rb +1 -0
  288. data/lib/slack_ruby_client.rb +1 -0
  289. data/lib/tasks/git.rake +1 -0
  290. data/lib/tasks/real_time.rake +51 -21
  291. data/lib/tasks/update.rake +1 -0
  292. data/lib/tasks/web.rake +43 -17
  293. data/slack-ruby-client.gemspec +10 -14
  294. metadata +191 -307
  295. data/.travis.yml +0 -30
  296. data/bin/commands/apps_permissions.rb +0 -22
  297. data/bin/commands/channels.rb +0 -175
  298. data/bin/commands/groups.rb +0 -172
  299. data/bin/commands/im.rb +0 -67
  300. data/bin/commands/mpim.rb +0 -63
  301. data/bin/commands.rb +0 -33
  302. data/examples/hi_real_time/hi.gif +0 -0
  303. data/examples/hi_real_time/hi.rb +0 -37
  304. data/examples/hi_real_time_async_celluloid/Gemfile +0 -6
  305. data/examples/hi_real_time_async_celluloid/hi.rb +0 -36
  306. data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
  307. data/lib/slack/real_time/concurrency/celluloid.rb +0 -117
  308. data/lib/slack/real_time/concurrency/eventmachine.rb +0 -60
  309. data/lib/slack/web/api/endpoints/apps_permissions.rb +0 -35
  310. data/lib/slack/web/api/endpoints/channels.rb +0 -265
  311. data/lib/slack/web/api/endpoints/groups.rb +0 -255
  312. data/lib/slack/web/api/endpoints/im.rb +0 -113
  313. data/lib/slack/web/api/endpoints/mpim.rb +0 -98
  314. data/lib/slack/web/api/endpoints/presence.rb +0 -23
  315. data/lib/slack/web/api/mixins/channels.id.json +0 -20
  316. data/lib/slack/web/api/mixins/channels.id.rb +0 -26
  317. data/lib/slack/web/api/mixins/groups.id.json +0 -20
  318. data/lib/slack/web/api/mixins/groups.id.rb +0 -26
  319. data/lib/slack/web/api/patches/chat.1.text-attachments-required.patch +0 -13
  320. data/lib/slack/web/api/patches/chat.2.attachments-json.patch +0 -17
  321. data/lib/slack/web/api/patches/chat.3.update-attachments-support.patch +0 -21
  322. data/lib/slack/web/api/patches/chat.4.postEphemeral-attachments-support.patch +0 -17
  323. data/lib/slack/web/api/patches/dialog.1.open-json-support.patch +0 -17
  324. data/lib/slack/web/api/templates/commands.erb +0 -5
  325. data/screenshots/register-bot.png +0 -0
  326. data/spec/fixtures/slack/web/429_error.yml +0 -85
  327. data/spec/fixtures/slack/web/auth_test_error.yml +0 -48
  328. data/spec/fixtures/slack/web/auth_test_success.yml +0 -57
  329. data/spec/fixtures/slack/web/channels_info.yml +0 -46
  330. data/spec/fixtures/slack/web/groups_info.yml +0 -43
  331. data/spec/fixtures/slack/web/paginated_users_list.yml +0 -181
  332. data/spec/fixtures/slack/web/rtm_connect.yml +0 -70
  333. data/spec/fixtures/slack/web/rtm_start.yml +0 -104
  334. data/spec/fixtures/slack/web/users_info.yml +0 -130
  335. data/spec/fixtures/slack/web/users_list.yml +0 -72
  336. data/spec/integration/integration_spec.rb +0 -139
  337. data/spec/slack/config_spec.rb +0 -14
  338. data/spec/slack/messages/formatting_spec.rb +0 -43
  339. data/spec/slack/real_time/api/message_spec.rb +0 -15
  340. data/spec/slack/real_time/api/ping_spec.rb +0 -15
  341. data/spec/slack/real_time/api/typing_spec.rb +0 -15
  342. data/spec/slack/real_time/client_spec.rb +0 -425
  343. data/spec/slack/real_time/concurrency/celluloid_spec.rb +0 -62
  344. data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -47
  345. data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +0 -19
  346. data/spec/slack/real_time/event_handlers/bot_spec.rb +0 -44
  347. data/spec/slack/real_time/event_handlers/channel_spec.rb +0 -116
  348. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +0 -15
  349. data/spec/slack/real_time/event_handlers/group_spec.rb +0 -90
  350. data/spec/slack/real_time/event_handlers/im_spec.rb +0 -47
  351. data/spec/slack/real_time/event_handlers/team_spec.rb +0 -62
  352. data/spec/slack/real_time/event_handlers/user_spec.rb +0 -63
  353. data/spec/slack/real_time/rtm_connect_spec.rb +0 -13
  354. data/spec/slack/real_time/rtm_start_spec.rb +0 -13
  355. data/spec/slack/real_time/store_spec.rb +0 -11
  356. data/spec/slack/slack_spec.rb +0 -58
  357. data/spec/slack/version_spec.rb +0 -7
  358. data/spec/slack/web/api/endpoints/api_spec.rb +0 -7
  359. data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +0 -15
  360. data/spec/slack/web/api/endpoints/bots_spec.rb +0 -7
  361. data/spec/slack/web/api/endpoints/conversations_spec.rb +0 -100
  362. data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +0 -25
  363. data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +0 -11
  364. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +0 -105
  365. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +0 -28
  366. data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +0 -11
  367. data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +0 -33
  368. data/spec/slack/web/api/endpoints/dnd_spec.rb +0 -12
  369. data/spec/slack/web/api/endpoints/emoji_spec.rb +0 -7
  370. data/spec/slack/web/api/endpoints/files_comments_spec.rb +0 -34
  371. data/spec/slack/web/api/endpoints/files_spec.rb +0 -43
  372. data/spec/slack/web/api/endpoints/im_spec.rb +0 -38
  373. data/spec/slack/web/api/endpoints/migration_spec.rb +0 -12
  374. data/spec/slack/web/api/endpoints/mpim_spec.rb +0 -38
  375. data/spec/slack/web/api/endpoints/oauth_spec.rb +0 -29
  376. data/spec/slack/web/api/endpoints/pins_spec.rb +0 -22
  377. data/spec/slack/web/api/endpoints/reactions_spec.rb +0 -17
  378. data/spec/slack/web/api/endpoints/reminders_spec.rb +0 -30
  379. data/spec/slack/web/api/endpoints/rtm_spec.rb +0 -7
  380. data/spec/slack/web/api/endpoints/search_spec.rb +0 -22
  381. data/spec/slack/web/api/endpoints/stars_spec.rb +0 -7
  382. data/spec/slack/web/api/endpoints/team_profile_spec.rb +0 -7
  383. data/spec/slack/web/api/endpoints/team_spec.rb +0 -7
  384. data/spec/slack/web/api/endpoints/usergroups_spec.rb +0 -27
  385. data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +0 -20
  386. data/spec/slack/web/api/endpoints/users_admin_spec.rb +0 -17
  387. data/spec/slack/web/api/endpoints/users_prefs_spec.rb +0 -7
  388. data/spec/slack/web/api/endpoints/users_profile_spec.rb +0 -7
  389. data/spec/slack/web/api/error_spec.rb +0 -14
  390. data/spec/slack/web/api/errors/slack_error_spec.rb +0 -14
  391. data/spec/slack/web/api/mixins/channels_spec.rb +0 -31
  392. data/spec/slack/web/api/mixins/groups_spec.rb +0 -31
  393. data/spec/slack/web/api/mixins/users_spec.rb +0 -39
  394. data/spec/slack/web/api/pagination/cursor_spec.rb +0 -70
  395. data/spec/slack/web/client_spec.rb +0 -174
  396. data/spec/spec_helper.rb +0 -14
  397. data/spec/support/queue_with_timeout.rb +0 -34
  398. data/spec/support/real_time/concurrency/mock.rb +0 -30
  399. data/spec/support/real_time/connected_client.rb +0 -21
  400. data/spec/support/real_time/event.rb +0 -11
  401. data/spec/support/token.rb +0 -10
  402. data/spec/support/vcr.rb +0 -9
  403. /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,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'helpers/files'
4
+
5
+ module Slack
6
+ module Web
7
+ module Api
8
+ module Helpers
9
+ include Files
10
+ end
11
+ end
12
+ end
13
+ 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, name, prefix, list_method, not_found_error)
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
- yield.tap do |list|
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, not_found_error
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
- throw ArgumentError.new('Required arguments :user missing') if name.nil?
22
+ raise ArgumentError, 'Required arguments :user missing' if name.nil?
17
23
 
18
- id_for(:user, name, '@', :members, 'user_not_found') do
19
- users_list
20
- end
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
- 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,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
- g.desc "<%= short_desc %>"
21
+ g.desc "<%= short_desc %>"
18
22
  <% else %>
19
- g.desc '<%= short_desc %>'
23
+ g.desc '<%= short_desc %>'
20
24
  <% end %>
21
- g.long_desc %( <%= data["desc"].split("\n").join(" ") %> )
22
- g.command '<%= name %>' do |c|
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
- c.flag '<%= arg_name %>', desc: "<%= arg_v["desc"].gsub('"', '\'') %>"
29
+ c.flag '<%= arg_name %>', desc: "<%= arg_v["desc"].gsub('"', '\'') %>"
26
30
  <% else %>
27
- c.flag '<%= arg_name %>', desc: '<%= arg_v["desc"] %>'
31
+ c.flag '<%= arg_name %>', desc: '<%= arg_v["desc"] %>'
28
32
  <% end %>
29
33
  <% end %>
30
- c.action do |_global_options, options, _args|
31
- puts JSON.dump($client.<%=group['name'].gsub(".", "_") %>_<%= name %>(options))
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::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,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
- 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?
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'] && !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]
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
- <% next if required_params.none? %>
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 = required_params.reject{ |name, _| name == arg_name }.map{|var, opts| "#{var}: '#{opts['example']}'"}.join(', ') %>
15
- expect { client.<%= group.gsub(".", "_") %>_<%= name %><%= params_except_required.empty? ? '' : "(#{params_except_required})" %> }.to raise_error ArgumentError, /Required arguments :<%= arg_name %> missing/
20
+ <% params_except_required = example_params.reject { |name, _| name == arg_name }.map { |name, val| "#{name}: %q[#{val}]" }.join(', ') %>
21
+ expect { client.<%= method_name %><%= params_except_required.empty? ? '' : "(#{params_except_required})" %> }.to raise_error ArgumentError, /Required arguments :<%= arg_name %> missing/
22
+ end
23
+ <% end %>
24
+ <% 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
@@ -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[key] || Slack::Web.config.send(key))
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
@@ -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 = defined?(OpenSSL) ? OpenSSL::X509::DEFAULT_CERT_DIR : nil
26
- self.ca_file = defined?(OpenSSL) ? OpenSSL::X509::DEFAULT_CERT_FILE : nil
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: { 'Accept' => 'application/json; charset=utf-8' }
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.use ::FaradayMiddleware::Mashify, mash_class: Slack::Messages::Message
27
- connection.use ::FaradayMiddleware::ParseJson
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 ::Faraday.default_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::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
- nil
11
- else
12
- raise Slack::Web::Api::Errors::SlackError.new(body['error'], env.response)
13
- 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)
14
20
  end
15
21
  end
16
22
  end