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
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+ module Slack
3
+ module Web
4
+ module Api
5
+ module Errors
6
+ class ServerError < InternalError; end
7
+ class ParsingError < ServerError; end
8
+ class HttpRequestError < ServerError; end
9
+ class TimeoutError < HttpRequestError; end
10
+ class UnavailableError < HttpRequestError; end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+ module Slack
3
+ module Web
4
+ module Api
5
+ module Errors
6
+ class SlackError < ::Faraday::Error
7
+ attr_reader :response
8
+
9
+ def initialize(message, response = nil)
10
+ super message
11
+ @response = response
12
+ end
13
+
14
+ def error
15
+ response.body.error
16
+ end
17
+
18
+ def errors
19
+ response.body.errors
20
+ end
21
+
22
+ def response_metadata
23
+ response.body.response_metadata
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ module Slack
3
+ module Web
4
+ module Api
5
+ module Errors
6
+ class TooManyRequestsError < ::Faraday::Error
7
+ attr_reader :response
8
+
9
+ def initialize(response)
10
+ @response = response
11
+ end
12
+
13
+ def message
14
+ "Retry after #{retry_after} seconds"
15
+ end
16
+
17
+ def retry_after
18
+ response.headers['retry-after'].to_i
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,4 +1,6 @@
1
- require 'slack/web/api/mixins/channels.id'
2
- require 'slack/web/api/mixins/users.id'
3
- require 'slack/web/api/mixins/users.search'
4
- require 'slack/web/api/mixins/groups.id'
1
+ # frozen_string_literal: true
2
+ require_relative 'mixins/channels.id'
3
+ require_relative 'mixins/conversations.id'
4
+ require_relative 'mixins/users.id'
5
+ require_relative 'mixins/users.search'
6
+ require_relative 'mixins/groups.id'
@@ -1,8 +1,12 @@
1
+ # frozen_string_literal: true
2
+ require_relative 'ids.id'
3
+
1
4
  module Slack
2
5
  module Web
3
6
  module Api
4
7
  module Mixins
5
8
  module Channels
9
+ include Ids
6
10
  #
7
11
  # This method returns a channel ID given a channel name.
8
12
  #
@@ -11,13 +15,8 @@ module Slack
11
15
  def channels_id(options = {})
12
16
  name = options[:channel]
13
17
  throw ArgumentError.new('Required arguments :channel missing') if name.nil?
14
- return { 'ok' => true, 'channel' => { 'id' => name } } unless name[0] == '#'
15
- channels_list.tap do |list|
16
- list.channels.each do |channel|
17
- return Slack::Messages::Message.new('ok' => true, 'channel' => { 'id' => channel.id }) if channel.name == name[1..-1]
18
- end
19
- end
20
- fail Slack::Web::Api::Error, 'channel_not_found'
18
+
19
+ id_for :channel, name, '#', :channels_list, :channels, 'channel_not_found'
21
20
  end
22
21
  end
23
22
  end
@@ -0,0 +1,25 @@
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
+ def conversations_id(options = {})
16
+ name = options[:channel]
17
+ throw ArgumentError.new('Required arguments :channel missing') if name.nil?
18
+
19
+ id_for :channel, name, '#', :conversations_list, :channels, 'channel_not_found'
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,8 +1,12 @@
1
+ # frozen_string_literal: true
2
+ require_relative 'ids.id'
3
+
1
4
  module Slack
2
5
  module Web
3
6
  module Api
4
7
  module Mixins
5
8
  module Groups
9
+ include Ids
6
10
  #
7
11
  # This method returns a group ID given a group name.
8
12
  #
@@ -11,13 +15,8 @@ module Slack
11
15
  def groups_id(options = {})
12
16
  name = options[:channel]
13
17
  throw ArgumentError.new('Required arguments :channel missing') if name.nil?
14
- return { 'ok' => true, 'group' => { 'id' => name } } unless name[0] == '#'
15
- groups_list.tap do |list|
16
- list.groups.each do |group|
17
- return Slack::Messages::Message.new('ok' => true, 'group' => { 'id' => group.id }) if group.name == name[1..-1]
18
- end
19
- end
20
- fail Slack::Web::Api::Error, 'channel_not_found'
18
+
19
+ id_for :group, name, '#', :groups_list, :groups, 'channel_not_found'
21
20
  end
22
21
  end
23
22
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ module Slack
3
+ module Web
4
+ module Api
5
+ module Mixins
6
+ module Ids
7
+ private
8
+
9
+ def id_for(key, name, prefix, enum_method, list_method, not_found_error)
10
+ return { 'ok' => true, key.to_s => { 'id' => name } } unless name[0] == prefix
11
+
12
+ public_send enum_method do |list|
13
+ list.public_send(list_method).each do |li|
14
+ return Slack::Messages::Message.new('ok' => true, key.to_s => { 'id' => li.id }) if li.name == name[1..-1]
15
+ end
16
+ end
17
+
18
+ raise Slack::Web::Api::Errors::SlackError, not_found_error
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,8 +1,12 @@
1
+ # frozen_string_literal: true
2
+ require_relative 'ids.id'
3
+
1
4
  module Slack
2
5
  module Web
3
6
  module Api
4
7
  module Mixins
5
8
  module Users
9
+ include Ids
6
10
  #
7
11
  # This method returns a user ID given a user name.
8
12
  #
@@ -11,13 +15,8 @@ module Slack
11
15
  def users_id(options = {})
12
16
  name = options[:user]
13
17
  throw ArgumentError.new('Required arguments :user missing') if name.nil?
14
- return { 'ok' => true, 'user' => { 'id' => name } } unless name[0] == '@'
15
- users_list.tap do |list|
16
- list.members.each do |user|
17
- return Slack::Messages::Message.new('ok' => true, 'user' => { 'id' => user.id }) if user.name == name[1..-1]
18
- end
19
- end
20
- fail Slack::Web::Api::Error, 'user_not_found'
18
+
19
+ id_for :user, name, '@', :users_list, :members, 'user_not_found'
21
20
  end
22
21
  end
23
22
  end
@@ -1,43 +1,46 @@
1
- module Slack
2
- module Web
3
- module Api
4
- module Mixins
5
- module Users
6
- Member = Struct.new :id, :name, :first_name, :last_name, :real_name, :email
1
+ # frozen_string_literal: true
2
+ if defined?(Picky)
3
+ module Slack
4
+ module Web
5
+ module Api
6
+ module Mixins
7
+ module Users
8
+ Member = Struct.new :id, :name, :first_name, :last_name, :real_name, :email
7
9
 
8
- #
9
- # This method searches for users.
10
- #
11
- # @option options [user] :user
12
- # Free-formed text to search for.
13
- def users_search(options = {})
14
- query = options[:user]
15
- throw ArgumentError.new('Required arguments :user missing') if query.nil?
16
- index = Picky::Index.new(:users) do
17
- category :name
18
- category :first_name
19
- category :last_name
20
- category :real_name
21
- category :email
10
+ #
11
+ # This method searches for users.
12
+ #
13
+ # @option options [user] :user
14
+ # Free-formed text to search for.
15
+ def users_search(options = {})
16
+ query = options[:user]
17
+ throw ArgumentError.new('Required arguments :user missing') if query.nil?
18
+ index = Picky::Index.new(:users) do
19
+ category :name
20
+ category :first_name
21
+ category :last_name
22
+ category :real_name
23
+ category :email
24
+ end
25
+ members = users_list.members
26
+ members.each_with_index do |member, id|
27
+ user = Member.new(
28
+ id,
29
+ member.name,
30
+ member.profile.first_name,
31
+ member.profile.last_name,
32
+ member.profile.real_name,
33
+ member.profile.email
34
+ )
35
+ index.add(user)
36
+ end
37
+ ids = Picky::Search.new(index).search(query, 5, 0, unique: true).ids
38
+ results = ids.map { |id| members[id] }
39
+ Slack::Messages::Message.new('ok' => true, 'members' => results)
22
40
  end
23
- members = users_list.members
24
- members.each_with_index do |member, id|
25
- user = Member.new(
26
- id,
27
- member.name,
28
- member.profile.first_name,
29
- member.profile.last_name,
30
- member.profile.real_name,
31
- member.profile.email
32
- )
33
- index.add(user)
34
- end
35
- ids = Picky::Search.new(index).search(query, 5, 0, unique: true).ids
36
- results = ids.map { |id| members[id] }
37
- Slack::Messages::Message.new('ok' => true, 'members' => results)
38
41
  end
39
42
  end
40
43
  end
41
44
  end
42
45
  end
43
- end if defined?(Picky)
46
+ end
@@ -0,0 +1,72 @@
1
+ diff --git a/lib/slack/web/api/endpoints/chat.rb b/lib/slack/web/api/endpoints/chat.rb
2
+ index 9de4aa9..8ed5625 100644
3
+ --- a/lib/slack/web/api/endpoints/chat.rb
4
+ +++ b/lib/slack/web/api/endpoints/chat.rb
5
+ @@ -121,11 +121,22 @@ module Slack
6
+ # @see https://api.slack.com/methods/chat.postEphemeral
7
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat/chat.postEphemeral.json
8
+ def chat_postEphemeral(options = {})
9
+ - throw ArgumentError.new('Required arguments :attachments missing') if options[:attachments].nil?
10
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
11
+ - throw ArgumentError.new('Required arguments :text missing') if options[:text].nil?
12
+ + throw ArgumentError.new('Required arguments :text, :attachments or :blocks missing') if options[:text].nil? && options[:attachments].nil? && options[:blocks].nil?
13
+ throw ArgumentError.new('Required arguments :user missing') if options[:user].nil?
14
+ options = options.merge(user: users_id(options)['user']['id']) if options[:user]
15
+ + # attachments must be passed as an encoded JSON string
16
+ + if options.key?(:attachments)
17
+ + attachments = options[:attachments]
18
+ + attachments = JSON.dump(attachments) unless attachments.is_a?(String)
19
+ + options = options.merge(attachments: attachments)
20
+ + end
21
+ + # blocks must be passed as an encoded JSON string
22
+ + if options.key?(:blocks)
23
+ + blocks = options[:blocks]
24
+ + blocks = JSON.dump(blocks) unless blocks.is_a?(String)
25
+ + options = options.merge(blocks: blocks)
26
+ + end
27
+ post('chat.postEphemeral', options)
28
+ end
29
+
30
+ @@ -166,7 +177,19 @@ module Slack
31
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat/chat.postMessage.json
32
+ def chat_postMessage(options = {})
33
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
34
+ - throw ArgumentError.new('Required arguments :text missing') if options[:text].nil?
35
+ + throw ArgumentError.new('Required arguments :text, :attachments or :blocks missing') if options[:text].nil? && options[:attachments].nil? && options[:blocks].nil?
36
+ + # attachments must be passed as an encoded JSON string
37
+ + if options.key?(:attachments)
38
+ + attachments = options[:attachments]
39
+ + attachments = JSON.dump(attachments) unless attachments.is_a?(String)
40
+ + options = options.merge(attachments: attachments)
41
+ + end
42
+ + # blocks must be passed as an encoded JSON string
43
+ + if options.key?(:blocks)
44
+ + blocks = options[:blocks]
45
+ + blocks = JSON.dump(blocks) unless blocks.is_a?(String)
46
+ + options = options.merge(blocks: blocks)
47
+ + end
48
+ post('chat.postMessage', options)
49
+ end
50
+
51
+ @@ -254,8 +277,21 @@ module Slack
52
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat/chat.update.json
53
+ def chat_update(options = {})
54
+ throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
55
+ + throw ArgumentError.new('Required arguments :text, :attachments or :blocks missing') if options[:text].nil? && options[:attachments].nil? && options[:blocks].nil?
56
+ throw ArgumentError.new('Required arguments :ts missing') if options[:ts].nil?
57
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
58
+ + # attachments must be passed as an encoded JSON string
59
+ + if options.key?(:attachments)
60
+ + attachments = options[:attachments]
61
+ + attachments = JSON.dump(attachments) unless attachments.is_a?(String)
62
+ + options = options.merge(attachments: attachments)
63
+ + end
64
+ + # blocks must be passed as an encoded JSON string
65
+ + if options.key?(:blocks)
66
+ + blocks = options[:blocks]
67
+ + blocks = JSON.dump(blocks) unless blocks.is_a?(String)
68
+ + options = options.merge(blocks: blocks)
69
+ + end
70
+ post('chat.update', options)
71
+ end
72
+ end
@@ -0,0 +1,17 @@
1
+ diff --git a/lib/slack/web/api/endpoints/dialog.rb b/lib/slack/web/api/endpoints/dialog.rb
2
+ index 01f9dfd..d017adf 100644
3
+ --- a/lib/slack/web/api/endpoints/dialog.rb
4
+ +++ b/lib/slack/web/api/endpoints/dialog.rb
5
+ @@ -17,6 +17,12 @@ module Slack
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?
9
+ + # dialog must be passed as an encoded JSON string
10
+ + if options.key?(:dialog)
11
+ + dialog = options[:dialog]
12
+ + dialog = JSON.dump(dialog) unless dialog.is_a?(String)
13
+ + options = options.merge(dialog: dialog)
14
+ + end
15
+ post('dialog.open', options)
16
+ end
17
+ end
@@ -0,0 +1,40 @@
1
+ diff --git a/lib/slack/web/api/endpoints/views.rb b/lib/slack/web/api/endpoints/views.rb
2
+ index 3d7ac8e..10de15c 100644
3
+ --- a/lib/slack/web/api/endpoints/views.rb
4
+ +++ b/lib/slack/web/api/endpoints/views.rb
5
+ @@ -18,6 +18,11 @@ module Slack
6
+ def views_open(options = {})
7
+ throw ArgumentError.new('Required arguments :trigger_id missing') if options[:trigger_id].nil?
8
+ throw ArgumentError.new('Required arguments :view missing') if options[:view].nil?
9
+ + if options.key?(:view)
10
+ + view = options[:view]
11
+ + view = JSON.dump(view) unless view.is_a?(String)
12
+ + options = options.merge(view: view)
13
+ + end
14
+ post('views.open', options)
15
+ end
16
+
17
+ @@ -33,6 +38,11 @@ module Slack
18
+ def views_push(options = {})
19
+ throw ArgumentError.new('Required arguments :trigger_id missing') if options[:trigger_id].nil?
20
+ throw ArgumentError.new('Required arguments :view missing') if options[:view].nil?
21
+ + if options.key?(:view)
22
+ + view = options[:view]
23
+ + view = JSON.dump(view) unless view.is_a?(String)
24
+ + options = options.merge(view: view)
25
+ + end
26
+ post('views.push', options)
27
+ end
28
+
29
+ @@ -51,6 +61,11 @@ module Slack
30
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/views/views.update.json
31
+ def views_update(options = {})
32
+ throw ArgumentError.new('Required arguments :view missing') if options[:view].nil?
33
+ + if options.key?(:view)
34
+ + view = options[:view]
35
+ + view = JSON.dump(view) unless view.is_a?(String)
36
+ + options = options.merge(view: view)
37
+ + end
38
+ post('views.update', options)
39
+ end
40
+ end
@@ -0,0 +1,16 @@
1
+ diff --git a/lib/slack/web/api/endpoints/views.rb b/lib/slack/web/api/endpoints/views.rb
2
+ index 31626b9..8182a9c 100644
3
+ --- a/lib/slack/web/api/endpoints/views.rb
4
+ +++ b/lib/slack/web/api/endpoints/views.rb
5
+ @@ -40,6 +40,11 @@ module Slack
6
+ def views_publish(options = {})
7
+ throw ArgumentError.new('Required arguments :user_id missing') if options[:user_id].nil?
8
+ throw ArgumentError.new('Required arguments :view missing') if options[:view].nil?
9
+ + if options.key?(:view)
10
+ + view = options[:view]
11
+ + view = JSON.dump(view) unless view.is_a?(String)
12
+ + options = options.merge(view: view)
13
+ + end
14
+ post('views.publish', options)
15
+ end
16
+