slack-ruby-client 0.7.9 → 0.16.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 (358) hide show
  1. checksums.yaml +5 -5
  2. data/.github/FUNDING.yml +1 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +32 -1
  5. data/.rubocop_todo.yml +98 -49
  6. data/.travis.yml +10 -14
  7. data/CHANGELOG.md +172 -24
  8. data/CONTRIBUTING.md +17 -6
  9. data/Dangerfile +2 -0
  10. data/Gemfile +10 -4
  11. data/LICENSE.md +1 -1
  12. data/README.md +276 -54
  13. data/RELEASING.md +19 -11
  14. data/Rakefile +2 -1
  15. data/UPGRADING.md +84 -2
  16. data/bin/commands.rb +43 -1
  17. data/bin/commands/admin_analytics.rb +15 -0
  18. data/bin/commands/admin_apps.rb +40 -0
  19. data/bin/commands/admin_apps_approved.rb +17 -0
  20. data/bin/commands/admin_apps_requests.rb +16 -0
  21. data/bin/commands/admin_apps_restricted.rb +17 -0
  22. data/bin/commands/admin_barriers.rb +47 -0
  23. data/bin/commands/admin_conversations.rb +169 -0
  24. data/bin/commands/admin_conversations_ekm.rb +17 -0
  25. data/bin/commands/admin_conversations_restrictAccess.rb +37 -0
  26. data/bin/commands/admin_conversations_whitelist.rb +37 -0
  27. data/bin/commands/admin_emoji.rb +54 -0
  28. data/bin/commands/admin_inviteRequests.rb +36 -0
  29. data/bin/commands/admin_inviteRequests_approved.rb +16 -0
  30. data/bin/commands/admin_inviteRequests_denied.rb +16 -0
  31. data/bin/commands/admin_teams.rb +27 -0
  32. data/bin/commands/admin_teams_admins.rb +16 -0
  33. data/bin/commands/admin_teams_owners.rb +16 -0
  34. data/bin/commands/admin_teams_settings.rb +64 -0
  35. data/bin/commands/admin_usergroups.rb +48 -0
  36. data/bin/commands/admin_users.rb +97 -0
  37. data/bin/commands/admin_users_session.rb +38 -0
  38. data/bin/commands/api.rb +3 -3
  39. data/bin/commands/apps.rb +15 -0
  40. data/bin/commands/apps_connections.rb +13 -0
  41. data/bin/commands/apps_event_authorizations.rb +16 -0
  42. data/bin/commands/apps_permissions.rb +23 -0
  43. data/bin/commands/apps_permissions_resources.rb +15 -0
  44. data/bin/commands/apps_permissions_scopes.rb +13 -0
  45. data/bin/commands/apps_permissions_users.rb +26 -0
  46. data/bin/commands/auth.rb +5 -4
  47. data/bin/commands/auth_teams.rb +16 -0
  48. data/bin/commands/bots.rb +4 -2
  49. data/bin/commands/calls.rb +52 -0
  50. data/bin/commands/calls_participants.rb +25 -0
  51. data/bin/commands/channels.rb +64 -43
  52. data/bin/commands/chat.rb +114 -24
  53. data/bin/commands/chat_scheduledMessages.rb +19 -0
  54. data/bin/commands/conversations.rb +196 -0
  55. data/bin/commands/dialog.rb +15 -0
  56. data/bin/commands/dnd.rb +9 -8
  57. data/bin/commands/emoji.rb +3 -2
  58. data/bin/commands/files.rb +45 -30
  59. data/bin/commands/files_comments.rb +3 -24
  60. data/bin/commands/files_remote.rb +78 -0
  61. data/bin/commands/groups.rb +53 -53
  62. data/bin/commands/im.rb +17 -13
  63. data/bin/commands/migration.rb +16 -0
  64. data/bin/commands/mpim.rb +16 -13
  65. data/bin/commands/oauth.rb +17 -2
  66. data/bin/commands/oauth_v2.rb +17 -0
  67. data/bin/commands/pins.rb +7 -10
  68. data/bin/commands/reactions.rb +17 -15
  69. data/bin/commands/reminders.rb +11 -10
  70. data/bin/commands/rtm.rb +19 -4
  71. data/bin/commands/search.rb +15 -11
  72. data/bin/commands/stars.rb +11 -8
  73. data/bin/commands/team.rb +15 -10
  74. data/bin/commands/team_profile.rb +3 -2
  75. data/bin/commands/usergroups.rb +22 -16
  76. data/bin/commands/usergroups_users.rb +7 -4
  77. data/bin/commands/users.rb +65 -37
  78. data/bin/commands/users_admin.rb +29 -0
  79. data/bin/commands/users_prefs.rb +13 -0
  80. data/bin/commands/users_profile.rb +8 -7
  81. data/bin/commands/views.rb +48 -0
  82. data/bin/commands/workflows.rb +38 -0
  83. data/bin/slack +3 -4
  84. data/examples/hi_real_time_and_web/Gemfile +1 -0
  85. data/examples/hi_real_time_and_web/hi.rb +8 -4
  86. data/examples/{hi_real_time_async_eventmachine → hi_real_time_async_async}/Gemfile +2 -1
  87. data/examples/{hi_real_time_async_celluloid → hi_real_time_async_async}/Procfile +0 -0
  88. data/examples/{hi_real_time_async_celluloid → hi_real_time_async_async}/hi.rb +13 -8
  89. data/examples/hi_web/Gemfile +1 -0
  90. data/examples/hi_web/hi.rb +2 -1
  91. data/examples/new_ticket/Gemfile +1 -0
  92. data/examples/new_ticket/new_ticket.rb +2 -1
  93. data/lib/slack-ruby-client.rb +40 -26
  94. data/lib/slack.rb +1 -0
  95. data/lib/slack/config.rb +1 -0
  96. data/lib/slack/events/config.rb +32 -0
  97. data/lib/slack/events/request.rb +70 -0
  98. data/lib/slack/logger.rb +6 -5
  99. data/lib/slack/messages/formatting.rb +4 -4
  100. data/lib/slack/messages/message.rb +2 -6
  101. data/lib/slack/real_time/api/message.rb +3 -1
  102. data/lib/slack/real_time/api/message_id.rb +1 -0
  103. data/lib/slack/real_time/api/ping.rb +5 -2
  104. data/lib/slack/real_time/api/templates/event_handler.erb +1 -1
  105. data/lib/slack/real_time/api/typing.rb +3 -1
  106. data/lib/slack/real_time/client.rb +113 -32
  107. data/lib/slack/real_time/concurrency.rb +2 -2
  108. data/lib/slack/real_time/concurrency/async.rb +140 -0
  109. data/lib/slack/real_time/config.rb +20 -12
  110. data/lib/slack/real_time/models.rb +8 -7
  111. data/lib/slack/real_time/models/base.rb +2 -6
  112. data/lib/slack/real_time/models/bot.rb +1 -0
  113. data/lib/slack/real_time/models/channel.rb +1 -0
  114. data/lib/slack/real_time/models/group.rb +1 -0
  115. data/lib/slack/real_time/models/im.rb +1 -0
  116. data/lib/slack/real_time/models/team.rb +1 -0
  117. data/lib/slack/real_time/models/user.rb +1 -0
  118. data/lib/slack/real_time/socket.rb +46 -17
  119. data/lib/slack/real_time/stores.rb +4 -3
  120. data/lib/slack/real_time/stores/base.rb +5 -3
  121. data/lib/slack/real_time/stores/starter.rb +113 -72
  122. data/lib/slack/real_time/stores/store.rb +131 -88
  123. data/lib/slack/version.rb +2 -1
  124. data/lib/slack/web/api/endpoints.rb +110 -26
  125. data/lib/slack/web/api/endpoints/admin_analytics.rb +26 -0
  126. data/lib/slack/web/api/endpoints/admin_apps.rb +62 -0
  127. data/lib/slack/web/api/endpoints/admin_apps_approved.rb +35 -0
  128. data/lib/slack/web/api/endpoints/admin_apps_requests.rb +33 -0
  129. data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +35 -0
  130. data/lib/slack/web/api/endpoints/admin_barriers.rb +82 -0
  131. data/lib/slack/web/api/endpoints/admin_conversations.rb +260 -0
  132. data/lib/slack/web/api/endpoints/admin_conversations_ekm.rb +35 -0
  133. data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +61 -0
  134. data/lib/slack/web/api/endpoints/admin_conversations_whitelist.rb +64 -0
  135. data/lib/slack/web/api/endpoints/admin_emoji.rb +88 -0
  136. data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +61 -0
  137. data/lib/slack/web/api/endpoints/admin_inviteRequests_approved.rb +33 -0
  138. data/lib/slack/web/api/endpoints/admin_inviteRequests_denied.rb +33 -0
  139. data/lib/slack/web/api/endpoints/admin_teams.rb +50 -0
  140. data/lib/slack/web/api/endpoints/admin_teams_admins.rb +34 -0
  141. data/lib/slack/web/api/endpoints/admin_teams_owners.rb +34 -0
  142. data/lib/slack/web/api/endpoints/admin_teams_settings.rb +99 -0
  143. data/lib/slack/web/api/endpoints/admin_usergroups.rb +77 -0
  144. data/lib/slack/web/api/endpoints/admin_users.rb +161 -0
  145. data/lib/slack/web/api/endpoints/admin_users_session.rb +66 -0
  146. data/lib/slack/web/api/endpoints/api.rb +3 -4
  147. data/lib/slack/web/api/endpoints/apps.rb +27 -0
  148. data/lib/slack/web/api/endpoints/apps_connections.rb +21 -0
  149. data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +34 -0
  150. data/lib/slack/web/api/endpoints/apps_permissions.rb +36 -0
  151. data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +31 -0
  152. data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +21 -0
  153. data/lib/slack/web/api/endpoints/apps_permissions_users.rb +50 -0
  154. data/lib/slack/web/api/endpoints/auth.rb +5 -4
  155. data/lib/slack/web/api/endpoints/auth_teams.rb +33 -0
  156. data/lib/slack/web/api/endpoints/bots.rb +5 -2
  157. data/lib/slack/web/api/endpoints/calls.rb +83 -0
  158. data/lib/slack/web/api/endpoints/calls_participants.rb +42 -0
  159. data/lib/slack/web/api/endpoints/channels.rb +105 -49
  160. data/lib/slack/web/api/endpoints/chat.rb +221 -40
  161. data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +40 -0
  162. data/lib/slack/web/api/endpoints/conversations.rb +332 -0
  163. data/lib/slack/web/api/endpoints/dialog.rb +33 -0
  164. data/lib/slack/web/api/endpoints/dnd.rb +11 -9
  165. data/lib/slack/web/api/endpoints/emoji.rb +3 -2
  166. data/lib/slack/web/api/endpoints/files.rb +75 -38
  167. data/lib/slack/web/api/endpoints/files_comments.rb +3 -38
  168. data/lib/slack/web/api/endpoints/files_remote.rb +127 -0
  169. data/lib/slack/web/api/endpoints/groups.rb +76 -53
  170. data/lib/slack/web/api/endpoints/im.rb +38 -21
  171. data/lib/slack/web/api/endpoints/migration.rb +28 -0
  172. data/lib/slack/web/api/endpoints/mpim.rb +37 -22
  173. data/lib/slack/web/api/endpoints/oauth.rb +25 -4
  174. data/lib/slack/web/api/endpoints/oauth_v2.rb +30 -0
  175. data/lib/slack/web/api/endpoints/pins.rb +10 -19
  176. data/lib/slack/web/api/endpoints/presence.rb +1 -1
  177. data/lib/slack/web/api/endpoints/reactions.rb +37 -28
  178. data/lib/slack/web/api/endpoints/reminders.rb +11 -10
  179. data/lib/slack/web/api/endpoints/rtm.rb +28 -7
  180. data/lib/slack/web/api/endpoints/search.rb +21 -14
  181. data/lib/slack/web/api/endpoints/stars.rb +24 -15
  182. data/lib/slack/web/api/endpoints/team.rb +21 -13
  183. data/lib/slack/web/api/endpoints/team_profile.rb +3 -2
  184. data/lib/slack/web/api/endpoints/usergroups.rb +33 -22
  185. data/lib/slack/web/api/endpoints/usergroups_users.rb +9 -4
  186. data/lib/slack/web/api/endpoints/users.rb +78 -29
  187. data/lib/slack/web/api/endpoints/users_admin.rb +49 -0
  188. data/lib/slack/web/api/endpoints/users_prefs.rb +21 -0
  189. data/lib/slack/web/api/endpoints/users_profile.rb +11 -10
  190. data/lib/slack/web/api/endpoints/views.rb +97 -0
  191. data/lib/slack/web/api/endpoints/workflows.rb +61 -0
  192. data/lib/slack/web/api/error.rb +2 -8
  193. data/lib/slack/web/api/errors.rb +850 -0
  194. data/lib/slack/web/api/errors/internal_error.rb +14 -0
  195. data/lib/slack/web/api/errors/slack_error.rb +29 -0
  196. data/lib/slack/web/api/errors/too_many_requests_error.rb +24 -0
  197. data/lib/slack/web/api/mixins.rb +6 -4
  198. data/lib/slack/web/api/mixins/channels.id.rb +6 -7
  199. data/lib/slack/web/api/mixins/conversations.id.rb +25 -0
  200. data/lib/slack/web/api/mixins/groups.id.rb +6 -7
  201. data/lib/slack/web/api/mixins/ids.id.rb +24 -0
  202. data/lib/slack/web/api/mixins/users.id.rb +6 -7
  203. data/lib/slack/web/api/mixins/users.search.rb +39 -36
  204. data/lib/slack/web/api/patches/chat.1.patch +72 -0
  205. data/lib/slack/web/api/patches/dialog.1.open-json-support.patch +17 -0
  206. data/lib/slack/web/api/patches/views.1.view-json.patch +40 -0
  207. data/lib/slack/web/api/patches/views.1.views-published.patch +16 -0
  208. data/lib/slack/web/api/templates/command.erb +5 -3
  209. data/lib/slack/web/api/templates/commands.erb +2 -1
  210. data/lib/slack/web/api/templates/endpoints.erb +5 -3
  211. data/lib/slack/web/api/templates/errors.erb +20 -0
  212. data/lib/slack/web/api/templates/method.erb +26 -4
  213. data/lib/slack/web/api/templates/method_spec.erb +3 -2
  214. data/lib/slack/web/client.rb +2 -1
  215. data/lib/slack/web/config.rb +21 -10
  216. data/lib/slack/web/faraday/connection.rb +25 -16
  217. data/lib/slack/web/faraday/request.rb +2 -0
  218. data/lib/slack/web/faraday/response/raise_error.rb +23 -1
  219. data/lib/slack/web/faraday/response/wrap_error.rb +18 -0
  220. data/lib/slack/web/pagination/cursor.rb +52 -0
  221. data/lib/slack_ruby_client.rb +1 -0
  222. data/lib/tasks/git.rake +2 -1
  223. data/lib/tasks/real_time.rake +16 -6
  224. data/lib/tasks/update.rake +1 -0
  225. data/lib/tasks/web.rake +38 -10
  226. data/screenshots/create-app.png +0 -0
  227. data/slack-ruby-client.gemspec +9 -6
  228. data/spec/fixtures/slack/web/429_error.yml +2 -0
  229. data/spec/fixtures/slack/web/503_error.yml +14 -0
  230. data/spec/fixtures/slack/web/channels_info.yml +108 -15
  231. data/spec/fixtures/slack/web/conversations_setTopic.yml +69 -0
  232. data/spec/fixtures/slack/web/conversations_setTopic_one_page.yml +142 -0
  233. data/spec/fixtures/slack/web/conversations_setTopic_paginated.yml +208 -0
  234. data/spec/fixtures/slack/web/paginated_users_list.yml +181 -0
  235. data/spec/fixtures/slack/web/rtm_connect.yml +70 -0
  236. data/spec/fixtures/slack/web/rtm_start.yml +1 -1
  237. data/spec/fixtures/slack/web/views_open_error.yml +76 -0
  238. data/spec/integration/integration_spec.rb +116 -48
  239. data/spec/slack/config_spec.rb +2 -0
  240. data/spec/slack/events/config_spec.rb +33 -0
  241. data/spec/slack/events/request_spec.rb +183 -0
  242. data/spec/slack/messages/formatting_spec.rb +25 -14
  243. data/spec/slack/real_time/api/message_spec.rb +6 -1
  244. data/spec/slack/real_time/api/ping_spec.rb +2 -0
  245. data/spec/slack/real_time/api/typing_spec.rb +5 -1
  246. data/spec/slack/real_time/client_spec.rb +462 -134
  247. data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +3 -1
  248. data/spec/slack/real_time/event_handlers/bot_spec.rb +6 -3
  249. data/spec/slack/real_time/event_handlers/channel_spec.rb +9 -6
  250. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +3 -2
  251. data/spec/slack/real_time/event_handlers/group_spec.rb +5 -4
  252. data/spec/slack/real_time/event_handlers/im_spec.rb +4 -3
  253. data/spec/slack/real_time/event_handlers/team_spec.rb +8 -4
  254. data/spec/slack/real_time/event_handlers/user_spec.rb +5 -2
  255. data/spec/slack/real_time/rtm_connect_spec.rb +14 -0
  256. data/spec/slack/real_time/rtm_start_spec.rb +1 -0
  257. data/spec/slack/real_time/store_spec.rb +2 -1
  258. data/spec/slack/slack_spec.rb +39 -7
  259. data/spec/slack/version_spec.rb +2 -1
  260. data/spec/slack/web/api/endpoints/admin_analytics_spec.rb +13 -0
  261. data/spec/slack/web/api/endpoints/admin_apps_approved_spec.rb +8 -0
  262. data/spec/slack/web/api/endpoints/admin_apps_requests_spec.rb +8 -0
  263. data/spec/slack/web/api/endpoints/admin_apps_restricted_spec.rb +8 -0
  264. data/spec/slack/web/api/endpoints/admin_apps_spec.rb +13 -0
  265. data/spec/slack/web/api/endpoints/admin_barriers_spec.rb +38 -0
  266. data/spec/slack/web/api/endpoints/admin_conversations_ekm_spec.rb +8 -0
  267. data/spec/slack/web/api/endpoints/admin_conversations_restrictAccess_spec.rb +32 -0
  268. data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +98 -0
  269. data/spec/slack/web/api/endpoints/admin_conversations_whitelist_spec.rb +32 -0
  270. data/spec/slack/web/api/endpoints/admin_emoji_spec.rb +37 -0
  271. data/spec/slack/web/api/endpoints/admin_inviteRequests_approved_spec.rb +8 -0
  272. data/spec/slack/web/api/endpoints/admin_inviteRequests_denied_spec.rb +8 -0
  273. data/spec/slack/web/api/endpoints/admin_inviteRequests_spec.rb +18 -0
  274. data/spec/slack/web/api/endpoints/admin_teams_admins_spec.rb +13 -0
  275. data/spec/slack/web/api/endpoints/admin_teams_owners_spec.rb +13 -0
  276. data/spec/slack/web/api/endpoints/admin_teams_settings_spec.rb +53 -0
  277. data/spec/slack/web/api/endpoints/admin_teams_spec.rb +16 -0
  278. data/spec/slack/web/api/endpoints/admin_usergroups_spec.rb +37 -0
  279. data/spec/slack/web/api/endpoints/admin_users_session_spec.rb +21 -0
  280. data/spec/slack/web/api/endpoints/admin_users_spec.rb +67 -0
  281. data/spec/slack/web/api/endpoints/api_spec.rb +1 -0
  282. data/spec/slack/web/api/endpoints/apps_connections_spec.rb +8 -0
  283. data/spec/slack/web/api/endpoints/apps_event_authorizations_spec.rb +13 -0
  284. data/spec/slack/web/api/endpoints/apps_permissions_resources_spec.rb +8 -0
  285. data/spec/slack/web/api/endpoints/apps_permissions_scopes_spec.rb +8 -0
  286. data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +16 -0
  287. data/spec/slack/web/api/endpoints/apps_permissions_users_spec.rb +19 -0
  288. data/spec/slack/web/api/endpoints/apps_spec.rb +16 -0
  289. data/spec/slack/web/api/endpoints/auth_teams_spec.rb +8 -0
  290. data/spec/slack/web/api/endpoints/bots_spec.rb +1 -0
  291. data/spec/slack/web/api/endpoints/calls_participants_spec.rb +24 -0
  292. data/spec/slack/web/api/endpoints/calls_spec.rb +31 -0
  293. data/spec/slack/web/api/endpoints/chat_scheduledMessages_spec.rb +8 -0
  294. data/spec/slack/web/api/endpoints/conversations_spec.rb +109 -0
  295. data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +13 -4
  296. data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +5 -3
  297. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +140 -24
  298. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +36 -0
  299. data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +2 -0
  300. data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +21 -6
  301. data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +95 -0
  302. data/spec/slack/web/api/endpoints/dnd_spec.rb +6 -0
  303. data/spec/slack/web/api/endpoints/emoji_spec.rb +1 -0
  304. data/spec/slack/web/api/endpoints/files_comments_spec.rb +3 -21
  305. data/spec/slack/web/api/endpoints/files_remote_spec.rb +24 -0
  306. data/spec/slack/web/api/endpoints/files_spec.rb +17 -5
  307. data/spec/slack/web/api/endpoints/im_spec.rb +5 -4
  308. data/spec/slack/web/api/endpoints/migration_spec.rb +13 -0
  309. data/spec/slack/web/api/endpoints/mpim_spec.rb +5 -4
  310. data/spec/slack/web/api/endpoints/oauth_spec.rb +5 -4
  311. data/spec/slack/web/api/endpoints/oauth_v2_spec.rb +13 -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/team_profile_spec.rb +1 -0
  319. data/spec/slack/web/api/endpoints/team_spec.rb +1 -0
  320. data/spec/slack/web/api/endpoints/usergroups_spec.rb +1 -0
  321. data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +3 -2
  322. data/spec/slack/web/api/endpoints/users_admin_spec.rb +18 -0
  323. data/spec/slack/web/api/endpoints/users_prefs_spec.rb +8 -0
  324. data/spec/slack/web/api/endpoints/users_profile_spec.rb +1 -0
  325. data/spec/slack/web/api/endpoints/views_spec.rb +29 -0
  326. data/spec/slack/web/api/endpoints/workflows_spec.rb +26 -0
  327. data/spec/slack/web/api/error_spec.rb +5 -3
  328. data/spec/slack/web/api/errors/slack_error_spec.rb +38 -0
  329. data/spec/slack/web/api/mixins/channels_spec.rb +24 -12
  330. data/spec/slack/web/api/mixins/conversations_list_spec.rb +21 -0
  331. data/spec/slack/web/api/mixins/conversations_spec.rb +43 -0
  332. data/spec/slack/web/api/mixins/groups_spec.rb +24 -12
  333. data/spec/slack/web/api/mixins/users_spec.rb +30 -17
  334. data/spec/slack/web/api/pagination/cursor_spec.rb +100 -0
  335. data/spec/slack/web/client_spec.rb +215 -14
  336. data/spec/slack/web/faraday/response/raise_error_spec.rb +85 -0
  337. data/spec/spec_helper.rb +8 -1
  338. data/spec/support/queue_with_timeout.rb +6 -5
  339. data/spec/support/real_time/concurrency/mock.rb +2 -2
  340. data/spec/support/real_time/connected_client.rb +13 -2
  341. data/spec/support/real_time/event.rb +1 -0
  342. data/spec/support/token.rb +1 -0
  343. data/spec/support/vcr.rb +6 -1
  344. metadata +280 -55
  345. data/examples/hi_real_time/Gemfile +0 -5
  346. data/examples/hi_real_time/hi.gif +0 -0
  347. data/examples/hi_real_time/hi.rb +0 -37
  348. data/examples/hi_real_time_async_celluloid/Gemfile +0 -6
  349. data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
  350. data/examples/hi_real_time_async_eventmachine/hi.rb +0 -36
  351. data/lib/slack/real_time/concurrency/celluloid.rb +0 -113
  352. data/lib/slack/real_time/concurrency/eventmachine.rb +0 -60
  353. data/lib/slack/web/api/patches/chat.1.text-attachments-required.patch +0 -13
  354. data/lib/slack/web/api/patches/chat.2.attachments-json.patch +0 -17
  355. data/lib/slack/web/api/patches/chat.3.update-attachments-support.patch +0 -20
  356. data/screenshots/register-bot.png +0 -0
  357. data/spec/slack/real_time/concurrency/celluloid_spec.rb +0 -31
  358. data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -47
@@ -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." %>
@@ -7,11 +8,12 @@ desc "<%= desc %>"
7
8
  desc '<%= desc %>'
8
9
  <% end %>
9
10
  command '<%= group['name'].gsub(".", "_") %>' do |g|
10
- <% names.each_with_index do |(name, data), index| %>
11
+ <% names.sort.each_with_index do |(name, data), index| %>
11
12
  <% if index > 0 %>
12
13
 
13
14
  <% end %>
14
15
  <% short_desc = data["desc"].split("\n").first %>
16
+ <% short_desc += ' (undocumented)' if data['undocumented'] %>
15
17
  <% if short_desc.include?("'") %>
16
18
  g.desc "<%= short_desc %>"
17
19
  <% else %>
@@ -20,8 +22,8 @@ command '<%= group['name'].gsub(".", "_") %>' do |g|
20
22
  g.long_desc %( <%= data["desc"].split("\n").join(" ") %> )
21
23
  g.command '<%= name %>' do |c|
22
24
  <% data["args"].each do |arg_name, arg_v| %>
23
- <% if arg_v["desc"].include?("'") %>
24
- c.flag '<%= arg_name %>', desc: "<%= arg_v["desc"] %>"
25
+ <% if arg_v["desc"].include?("'") %>
26
+ c.flag '<%= arg_name %>', desc: "<%= arg_v["desc"].gsub('"', '\'') %>"
25
27
  <% else %>
26
28
  c.flag '<%= arg_name %>', desc: '<%= arg_v["desc"] %>'
27
29
  <% end %>
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  # This file was auto-generated by lib/tasks/web.rake
2
3
 
3
- <% files.each do |f| %>
4
+ <% files.sort.each do |f| %>
4
5
  require 'commands/<%= f %>'
5
6
  <% end %>
@@ -1,18 +1,20 @@
1
+ # frozen_string_literal: true
1
2
  # This file was auto-generated by lib/tasks/web.rake
2
3
 
3
- <% files.each do |f| %>
4
- require 'slack/web/api/endpoints/<%= f %>'
4
+ <% files.sort.each do |f| %>
5
+ require_relative 'endpoints/<%= f %>'
5
6
  <% end %>
6
7
 
7
8
  module Slack
8
9
  module Web
9
10
  module Api
10
11
  module Endpoints
12
+ include Slack::Web::Api::Mixins::Conversations
11
13
  include Slack::Web::Api::Mixins::Channels
12
14
  include Slack::Web::Api::Mixins::Users
13
15
  include Slack::Web::Api::Mixins::Groups
14
16
 
15
- <% files.each do |f| %>
17
+ <% files.sort.each do |f| %>
16
18
  include <%= f.camelize %>
17
19
  <% end %>
18
20
  end
@@ -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
@@ -5,13 +6,14 @@ module Slack
5
6
  module Api
6
7
  module Endpoints
7
8
  module <%= group.gsub(".", "_").camelize %>
8
- <% names.each_with_index do |(name, data), index| %>
9
+ <% names.sort.each_with_index do |(name, data), index| %>
9
10
  <% next if data['mixin'] %>
10
11
  <% if index > 0 %>
11
12
 
12
13
  <% end %>
13
14
  #
14
- <% data['desc'].split("\n").each do |line| %>
15
+ <% data['desc'].split("\n").each_with_index do |line, index| %>
16
+ <% line += ' (undocumented)' if data['undocumented'] && index == 0 %>
15
17
  # <%= line %>
16
18
  <% end %>
17
19
  #
@@ -25,8 +27,12 @@ module Slack
25
27
  <% end %>
26
28
  <% end %>
27
29
  <% end %>
30
+ <% if data['undocumented'] %>
31
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/undocumented/<%= group %>/<%= group %>.<%= name %>.json
32
+ <% else %>
28
33
  # @see https://api.slack.com/methods/<%= group %>.<%= name %>
29
- # @see https://github.com/dblock/slack-api-ref/blob/master/methods/<%= group %>/<%= group %>.<%= name %>.json
34
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/<%= group %>/<%= group %>.<%= name %>.json
35
+ <% end %>
30
36
  def <%= group.gsub(".", "_") %>_<%= name %>(options = {})
31
37
  <% data['args'].select{ |k, v| v['required'] }.each do |arg_name, arg_v| %>
32
38
  throw ArgumentError.new('Required arguments :<%= arg_name %> missing') if options[:<%= arg_name %>].nil?
@@ -34,12 +40,28 @@ module Slack
34
40
  <% if data['group'] == 'groups' && data['args']['channel'] && !data['args']['channel']['desc'].include?('Can be an encoded ID, or a name.') %>
35
41
  options = options.merge(channel: groups_id(options)['group']['id']) if options[:channel]
36
42
  <% elsif data['args']['channel'] && !data['args']['channel']['desc'].include?('Can be an encoded ID, or a name.') %>
37
- 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]
38
44
  <% end %>
39
45
  <% if data['args']['user'] %>
40
46
  options = options.merge(user: users_id(options)['user']['id']) if options[:user]
41
47
  <% end %>
48
+ <% if data['undocumented'] %>
49
+ logger.warn('The <%= group %>.<%= name %> method is undocumented.')
50
+ <% end %>
51
+ <% if data['deprecated'] %>
52
+ logger.warn('<%= group %>.<%= name %>: <%= data['deprecation']['deprecation_warning']%> Alternative methods: <%= data['deprecation']['alternative_methods'].join(', ')%>.')
53
+ <% end %>
54
+ <% if data['args'].keys.include?('cursor') %>
55
+ if block_given?
56
+ Pagination::Cursor.new(self, :<%= group.gsub(".", "_") %>_<%= name %>, options).each do |page|
57
+ yield page
58
+ end
59
+ else
60
+ post('<%= group %>.<%= name %>', options)
61
+ end
62
+ <% else %>
42
63
  post('<%= group %>.<%= name %>', options)
64
+ <% end %>
43
65
  end
44
66
  <% end %>
45
67
  end
@@ -1,17 +1,18 @@
1
+ # frozen_string_literal: true
1
2
  # This file was auto-generated by lib/tasks/web.rake
2
3
 
3
4
  require 'spec_helper'
4
5
 
5
6
  RSpec.describe Slack::Web::Api::Endpoints::<%= group.gsub(".", "_").camelize %> do
6
7
  let(:client) { Slack::Web::Client.new }
7
- <% names.each_with_index do |(name, data), index| %>
8
+ <% names.sort.each_with_index do |(name, data), index| %>
8
9
  <% next if data['mixin'] %>
9
10
  <% required_params = data['args'].select{ |k, v| v['required'] } %>
10
11
  <% next if required_params.none? %>
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,16 +1,22 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module Web
3
4
  module Config
4
5
  extend self
5
6
 
6
- ATTRIBUTES = [
7
- :proxy,
8
- :user_agent,
9
- :ca_path,
10
- :ca_file,
11
- :logger,
12
- :endpoint,
13
- :token
7
+ ATTRIBUTES = %i[
8
+ proxy
9
+ user_agent
10
+ ca_path
11
+ ca_file
12
+ logger
13
+ endpoint
14
+ token
15
+ timeout
16
+ open_timeout
17
+ default_page_size
18
+ default_max_retries
19
+ adapter
14
20
  ].freeze
15
21
 
16
22
  attr_accessor(*Config::ATTRIBUTES)
@@ -18,11 +24,16 @@ module Slack
18
24
  def reset
19
25
  self.endpoint = 'https://slack.com/api/'
20
26
  self.user_agent = "Slack Ruby Client/#{Slack::VERSION}"
21
- self.ca_path = `openssl version -a | grep OPENSSLDIR | awk '{print $2}'|sed -e 's/\"//g'`
22
- self.ca_file = "#{ca_path}/ca-certificates.crt"
27
+ self.ca_path = defined?(OpenSSL) ? OpenSSL::X509::DEFAULT_CERT_DIR : nil
28
+ self.ca_file = defined?(OpenSSL) ? OpenSSL::X509::DEFAULT_CERT_FILE : nil
23
29
  self.token = nil
24
30
  self.proxy = nil
25
31
  self.logger = nil
32
+ self.timeout = nil
33
+ self.open_timeout = nil
34
+ self.default_page_size = 100
35
+ self.default_max_retries = 100
36
+ self.adapter = ::Faraday.default_adapter
26
37
  end
27
38
  end
28
39
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module Web
3
4
  module Faraday
@@ -5,24 +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 }
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
- ::Faraday::Connection.new(endpoint, options) do |connection|
17
- connection.use ::Faraday::Request::Multipart
18
- connection.use ::Faraday::Request::UrlEncoded
19
- connection.use ::Slack::Web::Faraday::Response::RaiseError
20
- connection.use ::FaradayMiddleware::Mashify, mash_class: Slack::Messages::Message
21
- connection.use ::FaradayMiddleware::ParseJson
22
- connection.use ::Faraday::Response::RaiseError
23
- connection.response :logger, logger if logger
24
- connection.adapter ::Faraday.default_adapter
25
- end
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?
23
+
24
+ ::Faraday::Connection.new(endpoint, options) do |connection|
25
+ connection.use ::Faraday::Request::Multipart
26
+ connection.use ::Faraday::Request::UrlEncoded
27
+ connection.use ::Slack::Web::Faraday::Response::WrapError
28
+ connection.use ::Slack::Web::Faraday::Response::RaiseError
29
+ connection.use ::FaradayMiddleware::Mashify, mash_class: Slack::Messages::Message
30
+ connection.use ::FaradayMiddleware::ParseJson
31
+ connection.response :logger, logger if logger
32
+ connection.adapter adapter
33
+ end
34
+ end
26
35
  end
27
36
  end
28
37
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module Web
3
4
  module Faraday
@@ -30,6 +31,7 @@ module Slack
30
31
  request.path = path
31
32
  request.body = options unless options.empty?
32
33
  end
34
+ request.options.merge!(options.delete(:request)) if options.key?(:request)
33
35
  end
34
36
  response.body
35
37
  end
@@ -1,12 +1,34 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module Web
3
4
  module Faraday
4
5
  module Response
5
6
  class RaiseError < ::Faraday::Response::Middleware
6
7
  def on_complete(env)
8
+ raise Slack::Web::Api::Errors::TooManyRequestsError, env.response if env.status == 429
9
+
10
+ return unless env.success?
11
+
7
12
  body = env.body
13
+ return unless body
8
14
  return if body['ok']
9
- fail Slack::Web::Api::Error.new(body['error'], env.response)
15
+
16
+ error_message =
17
+ body['error'] || body['errors'].map { |message| message['error'] }.join(',')
18
+
19
+ error_class = Slack::Web::Api::Errors::ERROR_CLASSES[error_message]
20
+ error_class ||= Slack::Web::Api::Errors::SlackError
21
+ raise error_class.new(error_message, env.response)
22
+ end
23
+
24
+ def call(env)
25
+ super
26
+ rescue Slack::Web::Api::Errors::SlackError, Slack::Web::Api::Errors::TooManyRequestsError
27
+ raise
28
+ rescue ::Faraday::ParsingError
29
+ raise Slack::Web::Api::Errors::ParsingError.new('parsing_error', env.response)
30
+ rescue ::Faraday::TimeoutError, ::Faraday::ConnectionFailed
31
+ raise Slack::Web::Api::Errors::TimeoutError.new('timeout_error', env.response)
10
32
  end
11
33
  end
12
34
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ module Slack
3
+ module Web
4
+ module Faraday
5
+ module Response
6
+ class WrapError < ::Faraday::Response::RaiseError
7
+ def on_complete(env)
8
+ super
9
+ rescue Slack::Web::Api::Errors::SlackError
10
+ raise
11
+ rescue ::Faraday::ServerError
12
+ raise Slack::Web::Api::Errors::UnavailableError.new('unavailable_error', env.response)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+ module Slack
3
+ module Web
4
+ module Api
5
+ module Pagination
6
+ class Cursor
7
+ include Enumerable
8
+
9
+ attr_reader :client
10
+ attr_reader :verb
11
+ attr_reader :sleep_interval
12
+ attr_reader :max_retries
13
+ attr_reader :params
14
+
15
+ def initialize(client, verb, params = {})
16
+ @client = client
17
+ @verb = verb
18
+ @params = params.dup
19
+ @sleep_interval = @params.delete(:sleep_interval)
20
+ @max_retries = @params.delete(:max_retries) || client.default_max_retries
21
+ end
22
+
23
+ def each
24
+ next_cursor = nil
25
+ retry_count = 0
26
+ loop do
27
+ query = { limit: client.default_page_size }.merge(params).merge(cursor: next_cursor)
28
+ begin
29
+ response = client.send(verb, query)
30
+ rescue Slack::Web::Api::Errors::TooManyRequestsError => e
31
+ raise e if retry_count >= max_retries
32
+
33
+ client.logger.debug("#{self.class}##{__method__}") { e.to_s }
34
+ retry_count += 1
35
+ sleep(e.retry_after)
36
+ next
37
+ end
38
+ yield response
39
+ break unless response.response_metadata
40
+
41
+ next_cursor = response.response_metadata.next_cursor
42
+ break if next_cursor.nil? || next_cursor == ''
43
+
44
+ retry_count = 0
45
+ sleep(sleep_interval) if sleep_interval
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1 +1,2 @@
1
+ # frozen_string_literal: true
1
2
  require 'slack-ruby-client'
data/lib/tasks/git.rake CHANGED
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  namespace :slack do
2
- # update slack-api-ref from https://github.com/dblock/slack-api-ref
3
+ # update slack-api-ref from https://github.com/slack-ruby/slack-api-ref
3
4
  task :git_update do
4
5
  sh 'git submodule update --init --recursive'
5
6
  sh 'git submodule foreach git pull origin master'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # largely from https://github.com/aki017/slack-ruby-gem
2
3
  require 'json-schema'
3
4
  require 'erubis'
@@ -5,22 +6,26 @@ require 'erubis'
5
6
  namespace :slack do
6
7
  namespace :real_time do
7
8
  namespace :api do
8
- REAL_TIME_EVENTS_MARKER = '### RealTime Events'.freeze
9
+ REAL_TIME_EVENTS_MARKER = '### RealTime Events'
9
10
 
10
- desc 'Update API.'
11
+ desc 'Update Real Time API.'
11
12
  task update: [:git_update] do
12
13
  event_schema = JSON.parse(File.read('lib/slack/real_time/api/schema/event.json'))
13
- events = Dir.glob('lib/slack/web/api/slack-api-ref/events/**/*.json').each_with_object({}) do |path, result|
14
+ dirglob = 'lib/slack/web/api/slack-api-ref/events/**/*.json'
15
+ events = Dir.glob(dirglob).each_with_object({}) do |path, result|
14
16
  name = File.basename(path, '.json')
15
17
  parsed = JSON.parse(File.read(path))
16
18
  JSON::Validator.validate(event_schema, parsed, insert_defaults: true)
17
- next if %w(message hello).include?(name)
19
+ next if %w[message hello].include?(name)
20
+
18
21
  result[name] = parsed
19
22
  end
20
23
 
21
- event_handler_template = Erubis::Eruby.new(File.read('lib/slack/real_time/api/templates/event_handler.erb'))
24
+ event_handler_template =
25
+ Erubis::Eruby.new(File.read('lib/slack/real_time/api/templates/event_handler.erb'))
22
26
  Dir.glob('lib/slack/real_time/stores/**/*.rb').each do |store_file|
23
27
  next if File.basename(store_file) == 'base.rb'
28
+
24
29
  STDOUT.write "#{File.basename(store_file)}:"
25
30
 
26
31
  store_file_contents = File.read(store_file)
@@ -35,7 +40,12 @@ namespace :slack do
35
40
  desc: event_data['desc']
36
41
  )
37
42
 
38
- store_file_contents.gsub! REAL_TIME_EVENTS_MARKER, REAL_TIME_EVENTS_MARKER + "\n\n" + rendered_event_handler.rstrip
43
+ store_file_contents.gsub!(
44
+ REAL_TIME_EVENTS_MARKER,
45
+ REAL_TIME_EVENTS_MARKER +
46
+ "\n\n" +
47
+ rendered_event_handler.rstrip
48
+ )
39
49
  end
40
50
  end
41
51