slack-ruby-client 0.7.9 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
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,48 @@
1
+ # frozen_string_literal: true
2
+ # This file was auto-generated by lib/tasks/web.rake
3
+
4
+ desc 'Views methods.'
5
+ command 'views' do |g|
6
+ g.desc 'Open a view for a user.'
7
+ g.long_desc %( Open a view for a user. )
8
+ g.command 'open' do |c|
9
+ c.flag 'trigger_id', desc: 'Exchange a trigger to post to the user.'
10
+ c.flag 'view', desc: 'A view payload. This must be a JSON-encoded string.'
11
+ c.action do |_global_options, options, _args|
12
+ puts JSON.dump($client.views_open(options))
13
+ end
14
+ end
15
+
16
+ g.desc 'Publish a static view for a User.'
17
+ g.long_desc %( Publish a static view for a User. )
18
+ g.command 'publish' do |c|
19
+ c.flag 'user_id', desc: 'id of the user you want publish a view to.'
20
+ c.flag 'view', desc: 'A view payload. This must be a JSON-encoded string.'
21
+ c.flag 'hash', desc: 'A string that represents view state to protect against possible race conditions.'
22
+ c.action do |_global_options, options, _args|
23
+ puts JSON.dump($client.views_publish(options))
24
+ end
25
+ end
26
+
27
+ g.desc 'Push a view onto the stack of a root view.'
28
+ g.long_desc %( Push a view onto the stack of a root view. )
29
+ g.command 'push' do |c|
30
+ c.flag 'trigger_id', desc: 'Exchange a trigger to post to the user.'
31
+ c.flag 'view', desc: 'A view payload. This must be a JSON-encoded string.'
32
+ c.action do |_global_options, options, _args|
33
+ puts JSON.dump($client.views_push(options))
34
+ end
35
+ end
36
+
37
+ g.desc 'Update an existing view.'
38
+ g.long_desc %( Update an existing view. )
39
+ g.command 'update' do |c|
40
+ c.flag 'view', desc: 'A view object. This must be a JSON-encoded string.'
41
+ c.flag 'external_id', desc: 'A unique identifier of the view set by the developer. Must be unique for all views on a team. Max length of 255 characters. Either view_id or external_id is required.'
42
+ c.flag 'hash', desc: 'A string that represents view state to protect against possible race conditions.'
43
+ c.flag 'view_id', desc: 'A unique identifier of the view to be updated. Either view_id or external_id is required.'
44
+ c.action do |_global_options, options, _args|
45
+ puts JSON.dump($client.views_update(options))
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+ # This file was auto-generated by lib/tasks/web.rake
3
+
4
+ desc 'Workflows methods.'
5
+ command 'workflows' do |g|
6
+ g.desc "Indicate that an app's step in a workflow completed execution."
7
+ g.long_desc %( Indicate that an app's step in a workflow completed execution. )
8
+ g.command 'stepCompleted' do |c|
9
+ c.flag 'workflow_step_execute_id', desc: 'Context identifier that maps to the correct workflow step execution.'
10
+ c.flag 'outputs', desc: 'Key-value object of outputs from your step. Keys of this object reflect the configured key properties of your outputs array from your workflow_step object.'
11
+ c.action do |_global_options, options, _args|
12
+ puts JSON.dump($client.workflows_stepCompleted(options))
13
+ end
14
+ end
15
+
16
+ g.desc "Indicate that an app's step in a workflow failed to execute."
17
+ g.long_desc %( Indicate that an app's step in a workflow failed to execute. )
18
+ g.command 'stepFailed' do |c|
19
+ c.flag 'error', desc: 'A JSON-based object with a message property that should contain a human readable error message.'
20
+ c.flag 'workflow_step_execute_id', desc: 'Context identifier that maps to the correct workflow step execution.'
21
+ c.action do |_global_options, options, _args|
22
+ puts JSON.dump($client.workflows_stepFailed(options))
23
+ end
24
+ end
25
+
26
+ g.desc 'Update the configuration for a workflow step.'
27
+ g.long_desc %( Update the configuration for a workflow step. )
28
+ g.command 'updateStep' do |c|
29
+ c.flag 'workflow_step_edit_id', desc: 'A context identifier provided with view_submission payloads used to call back to workflows.updateStep.'
30
+ c.flag 'inputs', desc: 'A JSON key-value map of inputs required from a user during configuration. This is the data your app expects to receive when the workflow step starts. Please note: the embedded variable format is set and replaced by the workflow system. You cannot create custom variables that will be replaced at runtime. Read more about variables in workflow steps here.'
31
+ c.flag 'outputs', desc: 'An JSON array of output objects used during step execution. This is the data your app agrees to provide when your workflow step was executed.'
32
+ c.flag 'step_image_url', desc: 'An optional field that can be used to override app image that is shown in the Workflow Builder.'
33
+ c.flag 'step_name', desc: 'An optional field that can be used to override the step name that is shown in the Workflow Builder.'
34
+ c.action do |_global_options, options, _args|
35
+ puts JSON.dump($client.workflows_updateStep(options))
36
+ end
37
+ end
38
+ end
data/bin/slack CHANGED
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
-
3
2
  require 'gli'
4
- require 'slack-ruby-client'
3
+ require 'slack_ruby_client'
5
4
 
6
5
  include GLI::App
7
6
 
@@ -9,7 +8,7 @@ program_desc 'Slack client.'
9
8
 
10
9
  default_command :help
11
10
 
12
- switch [:d, :debug], desc: 'Enable debug-level logging.', default_value: false
11
+ switch %i[d debug], desc: 'Enable debug-level logging.', default_value: false
13
12
  flag [:t, 'slack-api-token'], desc: 'Slack API token.', default_value: ENV['SLACK_API_TOKEN']
14
13
  flag ['vcr-cassette-name'], desc: 'Offline VCR cassette.'
15
14
 
@@ -46,7 +45,7 @@ pre do |global_options, _command, options, _args|
46
45
  true
47
46
  end
48
47
 
49
- $LOAD_PATH.push File.expand_path('..', __FILE__)
48
+ $LOAD_PATH.push File.expand_path(__dir__)
50
49
  require 'commands'
51
50
 
52
51
  exit run(ARGV)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  source 'http://rubygems.org'
2
3
 
3
4
  gem 'slack-ruby-client', path: '../..'
@@ -1,22 +1,26 @@
1
+ # frozen_string_literal: true
1
2
  require 'slack-ruby-client'
2
3
 
3
4
  Slack.configure do |config|
4
5
  config.token = ENV['SLACK_API_TOKEN']
5
- fail 'Missing ENV[SLACK_API_TOKEN]!' unless config.token
6
+ raise 'Missing ENV[SLACK_API_TOKEN]!' unless config.token
6
7
  end
7
8
 
8
9
  client = Slack::RealTime::Client.new
9
10
 
10
11
  client.on :hello do
11
- puts "Successfully connected, welcome '#{client.self.name}' to the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
12
+ puts(
13
+ "Successfully connected, welcome '#{client.self.name}' " \
14
+ "to the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
15
+ )
12
16
  end
13
17
 
14
18
  client.on :message do |data|
15
19
  puts data
16
20
  case data.text
17
- when 'bot hi' then
21
+ when 'bot hi'
18
22
  client.web_client.chat_postMessage channel: data.channel, text: "Hi <@#{data.user}>!"
19
- when /^bot/ then
23
+ when /^bot/
20
24
  client.web_client.chat_postMessage channel: data.channel, text: "Sorry <@#{data.user}>, what?"
21
25
  end
22
26
  end
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
1
2
  source 'http://rubygems.org'
2
3
 
3
4
  gem 'slack-ruby-client', path: '../..'
4
5
 
5
- gem 'faye-websocket'
6
+ gem 'async-websocket'
6
7
  gem 'foreman'
@@ -1,18 +1,25 @@
1
+ # frozen_string_literal: true
1
2
  require 'slack-ruby-client'
3
+ require 'async'
2
4
 
3
- fail 'Missing ENV[SLACK_API_TOKENS]!' unless ENV.key?('SLACK_API_TOKENS')
5
+ raise 'Missing ENV[SLACK_API_TOKENS]!' unless ENV.key?('SLACK_API_TOKENS')
4
6
 
5
7
  $stdout.sync = true
6
8
  logger = Logger.new($stdout)
7
9
  logger.level = Logger::DEBUG
8
10
 
11
+ threads = []
12
+
9
13
  ENV['SLACK_API_TOKENS'].split.each do |token|
10
14
  logger.info "Starting #{token[0..12]} ..."
11
15
 
12
16
  client = Slack::RealTime::Client.new(token: token)
13
17
 
14
18
  client.on :hello do
15
- logger.info "Successfully connected, welcome '#{client.self.name}' to the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
19
+ logger.info(
20
+ "Successfully connected, welcome '#{client.self.name}' to " \
21
+ "the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
22
+ )
16
23
  end
17
24
 
18
25
  client.on :message do |data|
@@ -21,16 +28,14 @@ ENV['SLACK_API_TOKENS'].split.each do |token|
21
28
  client.typing channel: data.channel
22
29
 
23
30
  case data.text
24
- when 'bot hi' then
31
+ when /hi/
25
32
  client.message channel: data.channel, text: "Hi <@#{data.user}>!"
26
- when /^bot/ then
33
+ else
27
34
  client.message channel: data.channel, text: "Sorry <@#{data.user}>, what?"
28
35
  end
29
36
  end
30
37
 
31
- client.start_async
38
+ threads << client.start_async
32
39
  end
33
40
 
34
- loop do
35
- Thread.pass
36
- end
41
+ threads.each(&:join)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  source 'http://rubygems.org'
2
3
 
3
4
  gem 'slack-ruby-client', path: '../..'
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
1
2
  require 'slack-ruby-client'
2
3
 
3
4
  Slack.configure do |config|
4
5
  config.token = ENV['SLACK_API_TOKEN']
5
- fail 'Missing ENV[SLACK_API_TOKEN]!' unless config.token
6
+ raise 'Missing ENV[SLACK_API_TOKEN]!' unless config.token
6
7
  end
7
8
 
8
9
  client = Slack::Web::Client.new
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  source 'http://rubygems.org'
2
3
 
3
4
  gem 'slack-ruby-client', path: '../..'
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
1
2
  require 'slack-ruby-client'
2
3
 
3
4
  Slack.configure do |config|
4
5
  config.token = ENV['SLACK_API_TOKEN']
5
- fail 'Missing ENV[SLACK_API_TOKEN]!' unless config.token
6
+ raise 'Missing ENV[SLACK_API_TOKEN]!' unless config.token
6
7
  end
7
8
 
8
9
  client = Slack::Web::Client.new
@@ -1,11 +1,12 @@
1
- require 'slack/version'
2
- require 'slack/logger'
3
- require 'slack/config'
1
+ # frozen_string_literal: true
2
+ require_relative 'slack/version'
3
+ require_relative 'slack/logger'
4
+ require_relative 'slack/config'
4
5
 
5
6
  # Messages
6
7
  require 'hashie'
7
- require 'slack/messages/message'
8
- require 'slack/messages/formatting'
8
+ require_relative 'slack/messages/message'
9
+ require_relative 'slack/messages/formatting'
9
10
 
10
11
  # Web API
11
12
  require 'faraday'
@@ -14,28 +15,41 @@ require 'json'
14
15
  require 'logger'
15
16
  begin
16
17
  require 'picky'
17
- rescue LoadError
18
+ rescue LoadError # rubocop:disable Lint/SuppressedException
18
19
  # ignore, only used in users_search
19
20
  end
20
- require 'slack/web/config'
21
- require 'slack/web/api/error'
22
- require 'slack/web/faraday/response/raise_error'
23
- require 'slack/web/faraday/connection'
24
- require 'slack/web/faraday/request'
25
- require 'slack/web/api/mixins'
26
- require 'slack/web/api/endpoints'
27
- require 'slack/web/client'
21
+ begin
22
+ require 'openssl'
23
+ rescue LoadError # rubocop:disable Lint/SuppressedException
24
+ # Used in slack/web/config
25
+ end
26
+ require_relative 'slack/web/config'
27
+ require_relative 'slack/web/api/errors/slack_error'
28
+ require_relative 'slack/web/api/errors/too_many_requests_error'
29
+ require_relative 'slack/web/api/error'
30
+ require_relative 'slack/web/api/errors'
31
+ require_relative 'slack/web/api/errors/internal_error'
32
+ require_relative 'slack/web/faraday/response/raise_error'
33
+ require_relative 'slack/web/faraday/response/wrap_error'
34
+ require_relative 'slack/web/faraday/connection'
35
+ require_relative 'slack/web/faraday/request'
36
+ require_relative 'slack/web/api/mixins'
37
+ require_relative 'slack/web/api/endpoints'
38
+ require_relative 'slack/web/pagination/cursor'
39
+ require_relative 'slack/web/client'
28
40
 
29
41
  # RealTime API
30
- require 'active_support'
31
- require 'active_support/core_ext'
32
- require 'slack/real_time/concurrency'
33
- require 'slack/real_time/socket'
34
- require 'slack/real_time/api/message_id'
35
- require 'slack/real_time/api/ping'
36
- require 'slack/real_time/api/message'
37
- require 'slack/real_time/api/typing'
38
- require 'slack/real_time/models'
39
- require 'slack/real_time/stores'
40
- require 'slack/real_time/config'
41
- require 'slack/real_time/client'
42
+ require_relative 'slack/real_time/concurrency'
43
+ require_relative 'slack/real_time/socket'
44
+ require_relative 'slack/real_time/api/message_id'
45
+ require_relative 'slack/real_time/api/ping'
46
+ require_relative 'slack/real_time/api/message'
47
+ require_relative 'slack/real_time/api/typing'
48
+ require_relative 'slack/real_time/models'
49
+ require_relative 'slack/real_time/stores'
50
+ require_relative 'slack/real_time/config'
51
+ require_relative 'slack/real_time/client'
52
+
53
+ # Events API
54
+ require_relative 'slack/events/config'
55
+ require_relative 'slack/events/request'
data/lib/slack.rb CHANGED
@@ -1 +1,2 @@
1
+ # frozen_string_literal: true
1
2
  require 'slack-ruby-client'
data/lib/slack/config.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module Config
3
4
  extend self
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+ module Slack
3
+ module Events
4
+ module Config
5
+ extend self
6
+
7
+ ATTRIBUTES = %i[
8
+ signing_secret
9
+ signature_expires_in
10
+ ].freeze
11
+
12
+ attr_accessor(*Config::ATTRIBUTES)
13
+
14
+ def reset
15
+ self.signing_secret = ENV['SLACK_SIGNING_SECRET']
16
+ self.signature_expires_in = 5 * 60
17
+ end
18
+ end
19
+
20
+ class << self
21
+ def configure
22
+ block_given? ? yield(Config) : Config
23
+ end
24
+
25
+ def config
26
+ Config
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ Slack::Events::Config.reset
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+ module Slack
3
+ module Events
4
+ class Request
5
+ class MissingSigningSecret < StandardError; end
6
+ class TimestampExpired < StandardError; end
7
+ class InvalidSignature < StandardError; end
8
+
9
+ attr_reader :http_request,
10
+ :signing_secret,
11
+ :signature_expires_in
12
+
13
+ def initialize(http_request, options = {})
14
+ @http_request = http_request
15
+ @signing_secret = options[:signing_secret] || Slack::Events.config.signing_secret
16
+ @signature_expires_in =
17
+ options[:signature_expires_in] || Slack::Events.config.signature_expires_in
18
+ end
19
+
20
+ # Request timestamp.
21
+ def timestamp
22
+ @timestamp ||= http_request.headers['X-Slack-Request-Timestamp']
23
+ end
24
+
25
+ # The signature is created by combining the signing secret with the body of the request
26
+ # Slack is sending using a standard HMAC-SHA256 keyed hash.
27
+ def signature
28
+ @signature ||= http_request.headers['X-Slack-Signature']
29
+ end
30
+
31
+ # Signature version.
32
+ def version
33
+ 'v0'
34
+ end
35
+
36
+ # Request body.
37
+ def body
38
+ @body ||= begin
39
+ body = http_request.body.read
40
+ http_request.body.rewind
41
+ body
42
+ end
43
+ end
44
+
45
+ # Returns true if the signature coming from Slack has expired.
46
+ def expired?
47
+ timestamp.nil? || (Time.now.to_i - timestamp.to_i).abs > signature_expires_in
48
+ end
49
+
50
+ # Returns true if the signature coming from Slack is valid.
51
+ def valid?
52
+ raise MissingSigningSecret unless signing_secret
53
+
54
+ digest = OpenSSL::Digest::SHA256.new
55
+ signature_basestring = [version, timestamp, body].join(':')
56
+ hex_hash = OpenSSL::HMAC.hexdigest(digest, signing_secret, signature_basestring)
57
+ computed_signature = [version, hex_hash].join('=')
58
+ computed_signature == signature
59
+ end
60
+
61
+ # Validates the request signature and its expiration.
62
+ def verify!
63
+ raise TimestampExpired if expired?
64
+ raise InvalidSignature unless valid?
65
+
66
+ true
67
+ end
68
+ end
69
+ end
70
+ end