slack-ruby-client 1.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (239) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/integration_test.yml +45 -0
  4. data/.github/workflows/lint.yml +14 -0
  5. data/.github/workflows/pr_lint.yml +21 -0
  6. data/.github/workflows/test.yml +37 -0
  7. data/.gitignore +4 -3
  8. data/.rubocop.yml +6 -1
  9. data/.rubocop_todo.yml +88 -34
  10. data/.ruby-version +1 -0
  11. data/CHANGELOG.md +36 -0
  12. data/CONTRIBUTING.md +6 -5
  13. data/Gemfile +13 -1
  14. data/Gemfile.danger +6 -0
  15. data/README.md +78 -76
  16. data/RELEASING.md +2 -2
  17. data/SECURITY.md +9 -0
  18. data/UPGRADING.md +28 -0
  19. data/bin/commands/admin_analytics.rb +16 -10
  20. data/bin/commands/admin_apps.rb +48 -42
  21. data/bin/commands/admin_apps_approved.rb +17 -11
  22. data/bin/commands/admin_apps_requests.rb +28 -11
  23. data/bin/commands/admin_apps_restricted.rb +17 -11
  24. data/bin/commands/admin_audit_anomaly_allow.rb +29 -0
  25. data/bin/commands/admin_auth_policy.rb +37 -31
  26. data/bin/commands/admin_barriers.rb +44 -38
  27. data/bin/commands/admin_conversations.rb +221 -163
  28. data/bin/commands/admin_conversations_ekm.rb +17 -11
  29. data/bin/commands/admin_conversations_restrictAccess.rb +35 -29
  30. data/bin/commands/admin_emoji.rb +50 -44
  31. data/bin/commands/admin_inviteRequests.rb +34 -28
  32. data/bin/commands/admin_inviteRequests_approved.rb +16 -10
  33. data/bin/commands/admin_inviteRequests_denied.rb +16 -10
  34. data/bin/commands/admin_roles.rb +46 -0
  35. data/bin/commands/admin_teams.rb +26 -20
  36. data/bin/commands/admin_teams_admins.rb +16 -10
  37. data/bin/commands/admin_teams_owners.rb +16 -10
  38. data/bin/commands/admin_teams_settings.rb +59 -53
  39. data/bin/commands/admin_usergroups.rb +45 -39
  40. data/bin/commands/admin_users.rb +91 -85
  41. data/bin/commands/admin_users_session.rb +72 -66
  42. data/bin/commands/admin_users_unsupportedVersions.rb +21 -0
  43. data/bin/commands/api.rb +14 -8
  44. data/bin/commands/apps.rb +15 -9
  45. data/bin/commands/apps_connections.rb +13 -7
  46. data/bin/commands/apps_event_authorizations.rb +16 -10
  47. data/bin/commands/apps_manifest.rb +48 -41
  48. data/bin/commands/auth.rb +21 -15
  49. data/bin/commands/auth_teams.rb +16 -10
  50. data/bin/commands/bookmarks.rb +59 -0
  51. data/bin/commands/bots.rb +15 -9
  52. data/bin/commands/calls.rb +49 -43
  53. data/bin/commands/calls_participants.rb +24 -18
  54. data/bin/commands/chat.rb +150 -141
  55. data/bin/commands/chat_scheduledMessages.rb +19 -13
  56. data/bin/commands/conversations.rb +233 -225
  57. data/bin/commands/dialog.rb +15 -9
  58. data/bin/commands/dnd.rb +46 -40
  59. data/bin/commands/emoji.rb +14 -7
  60. data/bin/commands/files.rb +112 -83
  61. data/bin/commands/files_comments.rb +15 -9
  62. data/bin/commands/files_remote.rb +73 -67
  63. data/bin/commands/functions_workflows_steps.rb +22 -0
  64. data/bin/commands/functions_workflows_steps_responses.rb +22 -0
  65. data/bin/commands/migration.rb +16 -10
  66. data/bin/commands/oauth.rb +18 -12
  67. data/bin/commands/oauth_v2.rb +28 -22
  68. data/bin/commands/openid_connect.rb +26 -20
  69. data/bin/commands/pins.rb +33 -26
  70. data/bin/commands/reactions.rb +52 -46
  71. data/bin/commands/reminders.rb +53 -47
  72. data/bin/commands/rtm.rb +15 -24
  73. data/bin/commands/search.rb +43 -37
  74. data/bin/commands/stars.rb +38 -32
  75. data/bin/commands/team.rb +47 -38
  76. data/bin/commands/team_billing.rb +13 -7
  77. data/bin/commands/team_preferences.rb +13 -7
  78. data/bin/commands/team_profile.rb +14 -8
  79. data/bin/commands/tooling_tokens.rb +14 -8
  80. data/bin/commands/usergroups.rb +64 -58
  81. data/bin/commands/usergroups_users.rb +27 -21
  82. data/bin/commands/users.rb +111 -105
  83. data/bin/commands/users_admin.rb +28 -22
  84. data/bin/commands/users_prefs.rb +13 -7
  85. data/bin/commands/users_profile.rb +26 -20
  86. data/bin/commands/views.rb +47 -39
  87. data/bin/commands/workflows.rb +36 -30
  88. data/bin/slack +48 -43
  89. data/lib/slack/real_time/api/message.rb +3 -2
  90. data/lib/slack/real_time/api/templates/event_handler.erb +5 -1
  91. data/lib/slack/real_time/api/typing.rb +2 -1
  92. data/lib/slack/real_time/client.rb +10 -28
  93. data/lib/slack/real_time/config.rb +3 -3
  94. data/lib/slack/real_time/models/channel.rb +4 -0
  95. data/lib/slack/real_time/models/{group.rb → mpim.rb} +1 -1
  96. data/lib/slack/real_time/models.rb +2 -1
  97. data/lib/slack/real_time/stores/base.rb +25 -9
  98. data/lib/slack/real_time/stores/starter.rb +323 -309
  99. data/lib/slack/real_time/stores/store.rb +265 -198
  100. data/lib/slack/real_time/stores.rb +1 -7
  101. data/lib/slack/version.rb +1 -1
  102. data/lib/slack/web/api/endpoints/admin_analytics.rb +2 -2
  103. data/lib/slack/web/api/endpoints/admin_apps.rb +2 -2
  104. data/lib/slack/web/api/endpoints/admin_apps_requests.rb +16 -0
  105. data/lib/slack/web/api/endpoints/admin_audit_anomaly_allow.rb +34 -0
  106. data/lib/slack/web/api/endpoints/admin_auth_policy.rb +7 -7
  107. data/lib/slack/web/api/endpoints/admin_barriers.rb +8 -8
  108. data/lib/slack/web/api/endpoints/admin_conversations.rb +110 -28
  109. data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +6 -6
  110. data/lib/slack/web/api/endpoints/admin_emoji.rb +9 -9
  111. data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +2 -2
  112. data/lib/slack/web/api/endpoints/admin_roles.rb +73 -0
  113. data/lib/slack/web/api/endpoints/admin_teams.rb +2 -2
  114. data/lib/slack/web/api/endpoints/admin_teams_admins.rb +1 -1
  115. data/lib/slack/web/api/endpoints/admin_teams_owners.rb +1 -1
  116. data/lib/slack/web/api/endpoints/admin_teams_settings.rb +11 -11
  117. data/lib/slack/web/api/endpoints/admin_usergroups.rb +7 -7
  118. data/lib/slack/web/api/endpoints/admin_users.rb +16 -16
  119. data/lib/slack/web/api/endpoints/admin_users_session.rb +8 -8
  120. data/lib/slack/web/api/endpoints/admin_users_unsupportedVersions.rb +25 -0
  121. data/lib/slack/web/api/endpoints/apps.rb +2 -2
  122. data/lib/slack/web/api/endpoints/apps_connections.rb +1 -1
  123. data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +1 -1
  124. data/lib/slack/web/api/endpoints/apps_manifest.rb +8 -6
  125. data/lib/slack/web/api/endpoints/bookmarks.rb +88 -0
  126. data/lib/slack/web/api/endpoints/bots.rb +1 -1
  127. data/lib/slack/web/api/endpoints/calls.rb +5 -5
  128. data/lib/slack/web/api/endpoints/calls_participants.rb +4 -4
  129. data/lib/slack/web/api/endpoints/chat.rb +37 -31
  130. data/lib/slack/web/api/endpoints/conversations.rb +38 -34
  131. data/lib/slack/web/api/endpoints/dialog.rb +2 -2
  132. data/lib/slack/web/api/endpoints/dnd.rb +1 -1
  133. data/lib/slack/web/api/endpoints/emoji.rb +2 -0
  134. data/lib/slack/web/api/endpoints/files.rb +45 -10
  135. data/lib/slack/web/api/endpoints/files_comments.rb +2 -2
  136. data/lib/slack/web/api/endpoints/files_remote.rb +8 -8
  137. data/lib/slack/web/api/endpoints/functions_workflows_steps.rb +28 -0
  138. data/lib/slack/web/api/endpoints/functions_workflows_steps_responses.rb +28 -0
  139. data/lib/slack/web/api/endpoints/migration.rb +1 -1
  140. data/lib/slack/web/api/endpoints/oauth_v2.rb +2 -2
  141. data/lib/slack/web/api/endpoints/pins.rb +5 -3
  142. data/lib/slack/web/api/endpoints/reactions.rb +4 -4
  143. data/lib/slack/web/api/endpoints/reminders.rb +5 -5
  144. data/lib/slack/web/api/endpoints/rtm.rb +0 -23
  145. data/lib/slack/web/api/endpoints/search.rb +3 -3
  146. data/lib/slack/web/api/endpoints/team.rb +13 -1
  147. data/lib/slack/web/api/endpoints/tooling_tokens.rb +1 -1
  148. data/lib/slack/web/api/endpoints/usergroups.rb +5 -5
  149. data/lib/slack/web/api/endpoints/usergroups_users.rb +3 -3
  150. data/lib/slack/web/api/endpoints/users.rb +4 -4
  151. data/lib/slack/web/api/endpoints/users_admin.rb +2 -2
  152. data/lib/slack/web/api/endpoints/users_profile.rb +1 -1
  153. data/lib/slack/web/api/endpoints/views.rb +16 -11
  154. data/lib/slack/web/api/endpoints/workflows.rb +4 -4
  155. data/lib/slack/web/api/endpoints.rb +12 -0
  156. data/lib/slack/web/api/errors.rb +146 -8
  157. data/lib/slack/web/api/mixins/conversations.id.rb +1 -1
  158. data/lib/slack/web/api/mixins/users.id.rb +1 -1
  159. data/lib/slack/web/api/mixins/users.search.rb +2 -1
  160. data/lib/slack/web/api/patches/{chat.1.patch → chat.attachments-blocks.patch} +13 -14
  161. data/lib/slack/web/api/patches/{dialog.1.open-json-support.patch → dialog.encoded-json.patch} +4 -4
  162. data/lib/slack/web/api/patches/views.view-json.patch +55 -0
  163. data/lib/slack/web/api/templates/command.erb +18 -12
  164. data/lib/slack/web/api/templates/method.erb +1 -1
  165. data/lib/slack/web/config.rb +2 -2
  166. data/lib/slack/web/faraday/connection.rb +4 -4
  167. data/lib/slack/web/faraday/request.rb +2 -0
  168. data/lib/slack/web/faraday/response/raise_error.rb +2 -10
  169. data/lib/slack/web/faraday/response/wrap_error.rb +1 -1
  170. data/lib/slack-ruby-client.rb +2 -1
  171. data/lib/tasks/real_time.rake +44 -24
  172. data/lib/tasks/web.rake +9 -8
  173. data/slack-ruby-client.gemspec +5 -14
  174. data/spec/fixtures/slack/web/rtm_connect.yml +85 -1
  175. data/spec/integration/integration_spec.rb +1 -1
  176. data/spec/slack/events/config_spec.rb +2 -0
  177. data/spec/slack/events/request_spec.rb +5 -1
  178. data/spec/slack/messages/formatting_spec.rb +10 -0
  179. data/spec/slack/real_time/api/message_spec.rb +1 -1
  180. data/spec/slack/real_time/api/ping_spec.rb +1 -1
  181. data/spec/slack/real_time/api/typing_spec.rb +1 -1
  182. data/spec/slack/real_time/client_spec.rb +91 -127
  183. data/spec/slack/real_time/event_handlers/bot_spec.rb +19 -17
  184. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +1 -1
  185. data/spec/slack/real_time/event_handlers/im_spec.rb +30 -27
  186. data/spec/slack/real_time/event_handlers/{group_spec.rb → private_channel_spec.rb} +35 -27
  187. data/spec/slack/real_time/event_handlers/{channel_spec.rb → public_channel_spec.rb} +27 -23
  188. data/spec/slack/real_time/event_handlers/team_spec.rb +7 -8
  189. data/spec/slack/real_time/event_handlers/user_spec.rb +6 -5
  190. data/spec/slack/real_time/stores/store_spec.rb +50 -0
  191. data/spec/slack/slack_spec.rb +5 -4
  192. data/spec/slack/version_spec.rb +1 -1
  193. data/spec/slack/web/api/endpoints/admin_apps_requests_spec.rb +5 -0
  194. data/spec/slack/web/api/endpoints/admin_audit_anomaly_allow_spec.rb +8 -0
  195. data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +31 -0
  196. data/spec/slack/web/api/endpoints/admin_roles_spec.rb +30 -0
  197. data/spec/slack/web/api/endpoints/admin_users_unsupportedVersions_spec.rb +8 -0
  198. data/spec/slack/web/api/endpoints/bookmarks_spec.rb +40 -0
  199. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +45 -17
  200. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +6 -2
  201. data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +33 -16
  202. data/spec/slack/web/api/endpoints/files_spec.rb +13 -0
  203. data/spec/slack/web/api/endpoints/functions_workflows_steps_responses_spec.rb +13 -0
  204. data/spec/slack/web/api/endpoints/functions_workflows_steps_spec.rb +13 -0
  205. data/spec/slack/web/api/mixins/conversations_spec.rb +2 -0
  206. data/spec/slack/web/api/mixins/users_spec.rb +2 -0
  207. data/spec/slack/web/api/pagination/cursor_spec.rb +11 -7
  208. data/spec/slack/web/client_spec.rb +39 -11
  209. data/spec/slack/web/faraday/response/raise_error_spec.rb +1 -1
  210. data/spec/support/real_time/connected_client.rb +1 -1
  211. data/spec/support/real_time/loaded_client.rb +120 -0
  212. metadata +45 -197
  213. data/.travis.yml +0 -29
  214. data/bin/commands/admin_conversations_whitelist.rb +0 -37
  215. data/bin/commands/apps_permissions.rb +0 -23
  216. data/bin/commands/apps_permissions_resources.rb +0 -15
  217. data/bin/commands/apps_permissions_scopes.rb +0 -13
  218. data/bin/commands/apps_permissions_users.rb +0 -26
  219. data/bin/commands/channels.rb +0 -23
  220. data/bin/commands/groups.rb +0 -14
  221. data/bin/commands/im.rb +0 -6
  222. data/bin/commands/mpim.rb +0 -6
  223. data/bin/commands.rb +0 -66
  224. data/lib/slack/web/api/endpoints/admin_conversations_whitelist.rb +0 -64
  225. data/lib/slack/web/api/endpoints/apps_permissions.rb +0 -36
  226. data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +0 -31
  227. data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +0 -21
  228. data/lib/slack/web/api/endpoints/apps_permissions_users.rb +0 -50
  229. data/lib/slack/web/api/endpoints/channels.rb +0 -25
  230. data/lib/slack/web/api/endpoints/groups.rb +0 -13
  231. data/lib/slack/web/api/endpoints/im.rb +0 -13
  232. data/lib/slack/web/api/endpoints/mpim.rb +0 -13
  233. data/lib/slack/web/api/endpoints/presence.rb +0 -23
  234. data/lib/slack/web/api/patches/views.1.view-json.patch +0 -40
  235. data/lib/slack/web/api/patches/views.1.views-published.patch +0 -16
  236. data/lib/slack/web/api/templates/commands.erb +0 -6
  237. data/spec/fixtures/slack/web/rtm_start.yml +0 -815
  238. data/spec/slack/real_time/rtm_start_spec.rb +0 -14
  239. data/spec/slack/real_time/store_spec.rb +0 -12
@@ -14,7 +14,7 @@ module Slack
14
14
  # Channel to get ID for, prefixed with #.
15
15
  def conversations_id(options = {})
16
16
  name = options[:channel]
17
- throw ArgumentError.new('Required arguments :channel missing') if name.nil?
17
+ raise ArgumentError, 'Required arguments :channel missing' if name.nil?
18
18
 
19
19
  id_for :channel, name, '#', :conversations_list, :channels, 'channel_not_found'
20
20
  end
@@ -14,7 +14,7 @@ module Slack
14
14
  # User to get ID for, prefixed with '@'.
15
15
  def users_id(options = {})
16
16
  name = options[:user]
17
- throw ArgumentError.new('Required arguments :user missing') if name.nil?
17
+ raise ArgumentError, 'Required arguments :user missing' if name.nil?
18
18
 
19
19
  id_for :user, name, '@', :users_list, :members, 'user_not_found'
20
20
  end
@@ -14,7 +14,8 @@ if defined?(Picky)
14
14
  # Free-formed text to search for.
15
15
  def users_search(options = {})
16
16
  query = options[:user]
17
- throw ArgumentError.new('Required arguments :user missing') if query.nil?
17
+ raise ArgumentError, 'Required arguments :user missing' if query.nil?
18
+
18
19
  index = Picky::Index.new(:users) do
19
20
  category :name
20
21
  category :first_name
@@ -1,15 +1,14 @@
1
1
  diff --git a/lib/slack/web/api/endpoints/chat.rb b/lib/slack/web/api/endpoints/chat.rb
2
- index d090ae2..50186d5 100644
2
+ index 701cd1e..07acc40 100644
3
3
  --- a/lib/slack/web/api/endpoints/chat.rb
4
4
  +++ b/lib/slack/web/api/endpoints/chat.rb
5
- @@ -121,10 +121,22 @@ module Slack
6
- # @see https://api.slack.com/methods/chat.postEphemeral
5
+ @@ -122,9 +122,21 @@ module Slack
7
6
  # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat/chat.postEphemeral.json
8
7
  def chat_postEphemeral(options = {})
9
- throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
10
- - throw ArgumentError.new('Required arguments :text missing') if options[:text].nil?
11
- + throw ArgumentError.new('Required arguments :text, :attachments or :blocks missing') if options[:text].nil? && options[:attachments].nil? && options[:blocks].nil?
12
- throw ArgumentError.new('Required arguments :user missing') if options[:user].nil?
8
+ raise ArgumentError, 'Required arguments :channel missing' if options[:channel].nil?
9
+ - raise ArgumentError, 'Required arguments :text missing' if options[:text].nil?
10
+ + raise ArgumentError, 'Required arguments :text, :attachments or :blocks missing' if options[:text].nil? && options[:attachments].nil? && options[:blocks].nil?
11
+ raise ArgumentError, 'Required arguments :user missing' if options[:user].nil?
13
12
  options = options.merge(user: users_id(options)['user']['id']) if options[:user]
14
13
  + # attachments must be passed as an encoded JSON string
15
14
  + if options.key?(:attachments)
@@ -26,11 +25,11 @@ index d090ae2..50186d5 100644
26
25
  post('chat.postEphemeral', options)
27
26
  end
28
27
 
29
- @@ -168,6 +179,19 @@ module Slack
28
+ @@ -167,6 +179,19 @@ module Slack
30
29
  # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat/chat.postMessage.json
31
30
  def chat_postMessage(options = {})
32
- throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
33
- + throw ArgumentError.new('Required arguments :text, :attachments or :blocks missing') if options[:text].nil? && options[:attachments].nil? && options[:blocks].nil?
31
+ raise ArgumentError, 'Required arguments :channel missing' if options[:channel].nil?
32
+ + raise ArgumentError, 'Required arguments :text, :attachments or :blocks missing' if options[:text].nil? && options[:attachments].nil? && options[:blocks].nil?
34
33
  + # attachments must be passed as an encoded JSON string
35
34
  + if options.key?(:attachments)
36
35
  + attachments = options[:attachments]
@@ -46,12 +45,12 @@ index d090ae2..50186d5 100644
46
45
  post('chat.postMessage', options)
47
46
  end
48
47
 
49
- @@ -257,8 +281,21 @@ module Slack
48
+ @@ -268,8 +293,21 @@ module Slack
50
49
  # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat/chat.update.json
51
50
  def chat_update(options = {})
52
- throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
53
- + throw ArgumentError.new('Required arguments :text, :attachments or :blocks missing') if options[:text].nil? && options[:attachments].nil? && options[:blocks].nil?
54
- throw ArgumentError.new('Required arguments :ts missing') if options[:ts].nil?
51
+ raise ArgumentError, 'Required arguments :channel missing' if options[:channel].nil?
52
+ + raise ArgumentError, 'Required arguments :text, :attachments, :blocks or :reply_broadcast missing' if options[:text].nil? && options[:attachments].nil? && options[:blocks].nil? && options[:reply_broadcast].nil?
53
+ raise ArgumentError, 'Required arguments :ts missing' if options[:ts].nil?
55
54
  options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
56
55
  + # attachments must be passed as an encoded JSON string
57
56
  + if options.key?(:attachments)
@@ -1,11 +1,11 @@
1
1
  diff --git a/lib/slack/web/api/endpoints/dialog.rb b/lib/slack/web/api/endpoints/dialog.rb
2
- index 01f9dfd..d017adf 100644
2
+ index 05475c8..a4ff4ff 100644
3
3
  --- a/lib/slack/web/api/endpoints/dialog.rb
4
4
  +++ b/lib/slack/web/api/endpoints/dialog.rb
5
- @@ -17,6 +17,12 @@ module Slack
5
+ @@ -18,6 +18,12 @@ module Slack
6
6
  def dialog_open(options = {})
7
- throw ArgumentError.new('Required arguments :dialog missing') if options[:dialog].nil?
8
- throw ArgumentError.new('Required arguments :trigger_id missing') if options[:trigger_id].nil?
7
+ raise ArgumentError, 'Required arguments :dialog missing' if options[:dialog].nil?
8
+ raise ArgumentError, 'Required arguments :trigger_id missing' if options[:trigger_id].nil?
9
9
  + # dialog must be passed as an encoded JSON string
10
10
  + if options.key?(:dialog)
11
11
  + dialog = options[:dialog]
@@ -0,0 +1,55 @@
1
+ diff --git a/lib/slack/web/api/endpoints/views.rb b/lib/slack/web/api/endpoints/views.rb
2
+ index cfa83a5..038c5f0 100644
3
+ --- a/lib/slack/web/api/endpoints/views.rb
4
+ +++ b/lib/slack/web/api/endpoints/views.rb
5
+ @@ -19,6 +19,12 @@ module Slack
6
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/views/views.open.json
7
+ def views_open(options = {})
8
+ raise ArgumentError, 'Required arguments :view missing' if options[:view].nil?
9
+ + raise ArgumentError, 'One of :trigger_id, :interactivity_pointer is required' unless options[:trigger_id].nil? ^ options[:interactivity_pointer].nil?
10
+ + if options.key?(:view)
11
+ + view = options[:view]
12
+ + view = JSON.dump(view) unless view.is_a?(String)
13
+ + options = options.merge(view: view)
14
+ + end
15
+ post('views.open', options)
16
+ end
17
+
18
+ @@ -36,6 +42,11 @@ module Slack
19
+ def views_publish(options = {})
20
+ raise ArgumentError, 'Required arguments :user_id missing' if options[:user_id].nil?
21
+ raise ArgumentError, 'Required arguments :view missing' if options[:view].nil?
22
+ + if options.key?(:view)
23
+ + view = options[:view]
24
+ + view = JSON.dump(view) unless view.is_a?(String)
25
+ + options = options.merge(view: view)
26
+ + end
27
+ post('views.publish', options)
28
+ end
29
+
30
+ @@ -52,6 +63,12 @@ module Slack
31
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/views/views.push.json
32
+ def views_push(options = {})
33
+ raise ArgumentError, 'Required arguments :view missing' if options[:view].nil?
34
+ + raise ArgumentError, 'One of :trigger_id, :interactivity_pointer is required' unless options[:trigger_id].nil? ^ options[:interactivity_pointer].nil?
35
+ + if options.key?(:view)
36
+ + view = options[:view]
37
+ + view = JSON.dump(view) unless view.is_a?(String)
38
+ + options = options.merge(view: view)
39
+ + end
40
+ post('views.push', options)
41
+ end
42
+
43
+ @@ -70,6 +87,12 @@ module Slack
44
+ # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/views/views.update.json
45
+ def views_update(options = {})
46
+ raise ArgumentError, 'Required arguments :view missing' if options[:view].nil?
47
+ + raise ArgumentError, 'One of :external_id, :view_id is required' unless options[:external_id].nil? ^ options[:view_id].nil?
48
+ + if options.key?(:view)
49
+ + view = options[:view]
50
+ + view = JSON.dump(view) unless view.is_a?(String)
51
+ + options = options.merge(view: view)
52
+ + end
53
+ post('views.update', options)
54
+ end
55
+ end
@@ -1,13 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
  # This file was auto-generated by lib/tasks/web.rake
3
3
 
4
+ module Slack
5
+ module Cli
6
+ class App
4
7
  <% desc = group['desc'] || "#{group['name'].gsub(".", "_").camelize} methods." %>
5
8
  <% if desc.include?("'") %>
6
- desc "<%= desc %>"
9
+ desc "<%= desc %>"
7
10
  <% else %>
8
- desc '<%= desc %>'
11
+ desc '<%= desc %>'
9
12
  <% end %>
10
- command '<%= group['name'].gsub(".", "_") %>' do |g|
13
+ command '<%= group['name'].gsub(".", "_") %>' do |g|
11
14
  <% names.sort.each_with_index do |(name, data), index| %>
12
15
  <% if index > 0 %>
13
16
 
@@ -15,22 +18,25 @@ command '<%= group['name'].gsub(".", "_") %>' do |g|
15
18
  <% short_desc = data["desc"].split("\n").first %>
16
19
  <% short_desc += ' (undocumented)' if data['undocumented'] %>
17
20
  <% if short_desc.include?("'") %>
18
- g.desc "<%= short_desc %>"
21
+ g.desc "<%= short_desc %>"
19
22
  <% else %>
20
- g.desc '<%= short_desc %>'
23
+ g.desc '<%= short_desc %>'
21
24
  <% end %>
22
- g.long_desc %( <%= data["desc"].split("\n").join(" ") %> )
23
- g.command '<%= name %>' do |c|
25
+ g.long_desc %( <%= data["desc"].split("\n").join(" ") %> )
26
+ g.command '<%= name %>' do |c|
24
27
  <% data["args"].each do |arg_name, arg_v| %>
25
28
  <% if arg_v["desc"].include?("'") %>
26
- c.flag '<%= arg_name %>', desc: "<%= arg_v["desc"].gsub('"', '\'') %>"
29
+ c.flag '<%= arg_name %>', desc: "<%= arg_v["desc"].gsub('"', '\'') %>"
27
30
  <% else %>
28
- c.flag '<%= arg_name %>', desc: '<%= arg_v["desc"] %>'
31
+ c.flag '<%= arg_name %>', desc: '<%= arg_v["desc"] %>'
29
32
  <% end %>
30
33
  <% end %>
31
- c.action do |_global_options, options, _args|
32
- puts JSON.dump($client.<%=group['name'].gsub(".", "_") %>_<%= name %>(options))
34
+ c.action do |_global_options, options, _args|
35
+ puts JSON.dump(@client.<%=group['name'].gsub(".", "_") %>_<%= name %>(options))
36
+ end
37
+ end
38
+ <% end %>
39
+ end
33
40
  end
34
41
  end
35
- <% end %>
36
42
  end
@@ -35,7 +35,7 @@ module Slack
35
35
  <% end %>
36
36
  def <%= group.gsub(".", "_") %>_<%= name %>(options = {})
37
37
  <% data['args'].select{ |k, v| v['required'] }.each do |arg_name, arg_v| %>
38
- throw ArgumentError.new('Required arguments :<%= arg_name %> missing') if options[:<%= arg_name %>].nil?
38
+ raise ArgumentError, 'Required arguments :<%= arg_name %> missing' if options[:<%= arg_name %>].nil?
39
39
  <% end %>
40
40
  <% if data['group'] == 'groups' && data['args']['channel'] && !data['args']['channel']['desc'].include?('Can be an encoded ID, or a name.') %>
41
41
  options = options.merge(channel: groups_id(options)['group']['id']) if options[:channel]
@@ -24,8 +24,8 @@ module Slack
24
24
  def reset
25
25
  self.endpoint = 'https://slack.com/api/'
26
26
  self.user_agent = "Slack Ruby Client/#{Slack::VERSION}"
27
- self.ca_path = defined?(OpenSSL) ? OpenSSL::X509::DEFAULT_CERT_DIR : nil
28
- self.ca_file = defined?(OpenSSL) ? OpenSSL::X509::DEFAULT_CERT_FILE : nil
27
+ self.ca_path = nil
28
+ self.ca_file = nil
29
29
  self.token = nil
30
30
  self.proxy = nil
31
31
  self.logger = nil
@@ -22,11 +22,11 @@ module Slack
22
22
  options[:request] = request_options if request_options.any?
23
23
 
24
24
  ::Faraday::Connection.new(endpoint, options) do |connection|
25
- connection.use ::Faraday::Request::Multipart
26
- connection.use ::Faraday::Request::UrlEncoded
25
+ connection.request :multipart
26
+ connection.request :url_encoded
27
27
  connection.use ::Slack::Web::Faraday::Response::RaiseError
28
- connection.use ::FaradayMiddleware::Mashify, mash_class: Slack::Messages::Message
29
- connection.use ::FaradayMiddleware::ParseJson
28
+ connection.response :mashify, mash_class: Slack::Messages::Message
29
+ connection.response :json, content_type: /\b*$/
30
30
  connection.use ::Slack::Web::Faraday::Response::WrapError
31
31
  connection.response :logger, logger if logger
32
32
  connection.adapter adapter
@@ -35,6 +35,8 @@ module Slack
35
35
  request.options.merge!(options.delete(:request)) if options.key?(:request)
36
36
  end
37
37
  response.body
38
+ rescue ::Faraday::ParsingError => e
39
+ raise Slack::Web::Api::Errors::ParsingError, e.response
38
40
  end
39
41
  end
40
42
  end
@@ -3,7 +3,7 @@ module Slack
3
3
  module Web
4
4
  module Faraday
5
5
  module Response
6
- class RaiseError < ::Faraday::Response::Middleware
6
+ class RaiseError < ::Faraday::Middleware
7
7
  def on_complete(env)
8
8
  raise Slack::Web::Api::Errors::TooManyRequestsError, env.response if env.status == 429
9
9
 
@@ -13,19 +13,11 @@ module Slack
13
13
  return unless body
14
14
  return if body['ok']
15
15
 
16
- error_message =
17
- body['error'] || body['errors'].map { |message| message['error'] }.join(',')
18
-
16
+ error_message = body['error'] || body['errors'].map { |message| message['error'] }.join(',')
19
17
  error_class = Slack::Web::Api::Errors::ERROR_CLASSES[error_message]
20
18
  error_class ||= Slack::Web::Api::Errors::SlackError
21
19
  raise error_class.new(error_message, env.response)
22
20
  end
23
-
24
- def call(env)
25
- super
26
- rescue ::Faraday::ParsingError
27
- raise Slack::Web::Api::Errors::ParsingError, env.response
28
- end
29
21
  end
30
22
  end
31
23
  end
@@ -3,7 +3,7 @@ module Slack
3
3
  module Web
4
4
  module Faraday
5
5
  module Response
6
- class WrapError < ::Faraday::Response::Middleware
6
+ class WrapError < ::Faraday::Middleware
7
7
  UNAVAILABLE_ERROR_STATUSES = (500..599).freeze
8
8
 
9
9
  def on_complete(env)
@@ -10,7 +10,8 @@ require_relative 'slack/messages/formatting'
10
10
 
11
11
  # Web API
12
12
  require 'faraday'
13
- require 'faraday_middleware'
13
+ require 'faraday/mashify'
14
+ require 'faraday/multipart'
14
15
  require 'json'
15
16
  require 'logger'
16
17
  begin
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
- # largely from https://github.com/aki017/slack-ruby-gem
2
+
3
3
  require 'json-schema'
4
4
  require 'erubis'
5
5
 
6
+ # largely from https://github.com/aki017/slack-ruby-gem
6
7
  namespace :slack do
7
8
  namespace :real_time do
8
9
  namespace :api do
@@ -16,43 +17,62 @@ namespace :slack do
16
17
  name = File.basename(path, '.json')
17
18
  parsed = JSON.parse(File.read(path))
18
19
  JSON::Validator.validate(event_schema, parsed, insert_defaults: true)
19
- next if %w[message hello].include?(name)
20
+ next if name == 'message'
20
21
 
21
22
  result[name] = parsed
22
23
  end
23
24
 
24
- event_handler_template =
25
- Erubis::Eruby.new(File.read('lib/slack/real_time/api/templates/event_handler.erb'))
25
+ hook_template = Erubis::Eruby.new(File.read('lib/slack/real_time/api/templates/event_handler.erb'))
26
26
  Dir.glob('lib/slack/real_time/stores/**/*.rb').each do |store_file|
27
27
  next if File.basename(store_file) == 'base.rb'
28
28
 
29
- STDOUT.write "#{File.basename(store_file)}:"
29
+ STDOUT.write "#{File.basename(store_file)}: "
30
30
 
31
31
  store_file_contents = File.read(store_file)
32
32
 
33
- events.each_pair do |event_name, event_data|
34
- if store_file_contents.include?("on :#{event_name} do")
35
- STDOUT.write('.')
36
- else
37
- STDOUT.write('x')
38
- rendered_event_handler = event_handler_template.result(
39
- name: event_data['name'],
40
- desc: event_data['desc']
41
- )
42
-
43
- store_file_contents.gsub!(
44
- REAL_TIME_EVENTS_MARKER,
45
- REAL_TIME_EVENTS_MARKER +
46
- "\n\n" +
47
- rendered_event_handler.rstrip
48
- )
49
- end
33
+ unless store_file_contents.include?(REAL_TIME_EVENTS_MARKER)
34
+ puts "missing '#{REAL_TIME_EVENTS_MARKER}' line; skipping."
35
+ next
50
36
  end
51
37
 
52
- File.open store_file, 'w' do |f|
53
- f.write store_file_contents
38
+ # Extract current hook implementations from the store class
39
+ hooks = {}
40
+ hook_matcher = /
41
+ (?:^[[:blank:]]*\R)+ # At least one blank line
42
+ (?:^[[:blank:]]*\#.*\R)* # Optional preceding comments
43
+ (?<hook> # on :event do |data|
44
+ ^(?<padding>[[:blank:]]+)\#\ *on\ :(?<event>\w+)\ do\ \|[\w, ]+\|\ *\R # Commented hook
45
+ (?>^\k<padding>\#.*\R)* # Extra comments
46
+ |
47
+ ^(?<padding>[[:blank:]]+)on\ :(?<event>\w+)\ do\ \|[\w, ]+\|\ *\R # Active hook
48
+ [\s\S]*? # Inside block
49
+ (?>^\k<padding>end[[:blank:]]*\R) # End of block
50
+ )
51
+ /x
52
+ store_file_contents.gsub!(hook_matcher) do
53
+ hook, event = Regexp.last_match.values_at(:hook, :event)
54
+ hooks[event] = hook
55
+ nil
54
56
  end
55
57
 
58
+ # Render latest event documentation with current hook implementations
59
+ rendered_hooks = events.sort.map do |event_name, event_data|
60
+ STDOUT.write(hooks.key?(event_name) ? '.' : 'x')
61
+
62
+ hook_template.result(
63
+ name: event_data['name'],
64
+ desc: event_data['desc'],
65
+ hook: hooks[event_name]
66
+ ).rstrip
67
+ end
68
+
69
+ # Insert updated event hooks under RealTime Events marker
70
+ store_file_contents.gsub!(
71
+ REAL_TIME_EVENTS_MARKER,
72
+ [REAL_TIME_EVENTS_MARKER, *rendered_hooks].join("\n\n")
73
+ )
74
+ File.write(store_file, store_file_contents)
75
+
56
76
  puts ' done.'
57
77
  end
58
78
  end
data/lib/tasks/web.rake CHANGED
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
- # largely from https://github.com/aki017/slack-ruby-gem
2
+
3
3
  require 'json-schema'
4
4
  require 'erubis'
5
5
  require 'active_support'
6
6
  require 'active_support/core_ext'
7
7
 
8
+ # largely from https://github.com/aki017/slack-ruby-gem
8
9
  namespace :slack do
9
10
  namespace :web do
10
11
  namespace :api do
@@ -39,11 +40,17 @@ namespace :slack do
39
40
  result[prefix][name] = parsed
40
41
  end
41
42
 
43
+ # Start with a fresh slate
44
+ Dir.glob('lib/slack/web/api/endpoints/*.rb').each { |file| File.delete(file) }
45
+ Dir.glob('spec/slack/web/api/endpoints/*_spec.rb').each { |file| File.delete(file) }
46
+ Dir.glob('bin/commands/*.rb').each { |file| File.delete(file) }
47
+
42
48
  method_template = Erubis::Eruby.new(File.read('lib/slack/web/api/templates/method.erb'))
43
49
  method_spec_template =
44
50
  Erubis::Eruby.new(File.read('lib/slack/web/api/templates/method_spec.erb'))
45
51
  command_template = Erubis::Eruby.new(File.read('lib/slack/web/api/templates/command.erb'))
46
- data.each_with_index do |(group, names), index|
52
+
53
+ data.each.with_index(1) do |(group, names), index|
47
54
  printf "%2d/%2d %10s %s\n", index, data.size, group, names.keys
48
55
  # method
49
56
  snaked_group = group.tr('.', '_')
@@ -77,12 +84,6 @@ namespace :slack do
77
84
  endpoints_template.result(files: data.keys.map { |key| key.tr('.', '_') })
78
85
  )
79
86
 
80
- commands_template = Erubis::Eruby.new(File.read('lib/slack/web/api/templates/commands.erb'))
81
- File.write(
82
- 'bin/commands.rb',
83
- commands_template.result(files: data.keys.map { |key| key.tr('.', '_') })
84
- )
85
-
86
87
  errors_template = Erubis::Eruby.new(File.read('lib/slack/web/api/templates/errors.erb'))
87
88
  errors = data.values.map do |names|
88
89
  names.values.map do |d|
@@ -10,26 +10,17 @@ Gem::Specification.new do |s|
10
10
  s.authors = ['Daniel Doubrovkine']
11
11
  s.email = 'dblock@dblock.org'
12
12
  s.platform = Gem::Platform::RUBY
13
+ s.required_ruby_version = '>= 2.7'
13
14
  s.required_rubygems_version = '>= 1.3.6'
14
15
  s.files = `git ls-files`.split("\n")
15
16
  s.require_paths = ['lib']
16
17
  s.homepage = 'http://github.com/slack-ruby/slack-ruby-client'
17
18
  s.licenses = ['MIT']
18
19
  s.summary = 'Slack Web and RealTime API client.'
19
- s.add_dependency 'faraday', '>= 1.0'
20
- s.add_dependency 'faraday_middleware'
20
+ s.add_dependency 'faraday', '>= 2.0'
21
+ s.add_dependency 'faraday-mashify'
22
+ s.add_dependency 'faraday-multipart'
21
23
  s.add_dependency 'gli'
22
24
  s.add_dependency 'hashie'
23
- s.add_dependency 'websocket-driver'
24
- s.add_development_dependency 'activesupport'
25
- s.add_development_dependency 'erubis'
26
- s.add_development_dependency 'json-schema'
27
- s.add_development_dependency 'rake', '~> 13'
28
- s.add_development_dependency 'rspec'
29
- s.add_development_dependency 'rubocop', '~> 0.93.1'
30
- s.add_development_dependency 'rubocop-performance', '~> 1.5.2'
31
- s.add_development_dependency 'rubocop-rspec', '~> 1.39.0'
32
- s.add_development_dependency 'timecop'
33
- s.add_development_dependency 'vcr'
34
- s.add_development_dependency 'webmock'
25
+ s.metadata['rubygems_mfa_required'] = 'true'
35
26
  end
@@ -304,4 +304,88 @@ http_interactions:
304
304
  encoding: UTF-8
305
305
  string: '{"ok":false,"error":"invalid_array_arg"}'
306
306
  recorded_at: Sat, 19 Jan 2019 21:25:48 GMT
307
- recorded_with: VCR 6.0.0
307
+ - request:
308
+ method: post
309
+ uri: https://slack.com/api/rtm.connect
310
+ body:
311
+ encoding: UTF-8
312
+ string: presence_sub=true
313
+ headers:
314
+ Accept:
315
+ - application/json; charset=utf-8
316
+ User-Agent:
317
+ - Slack Ruby Client/2.0.0
318
+ Authorization:
319
+ - Bearer <SLACK_API_TOKEN>
320
+ Content-Type:
321
+ - application/x-www-form-urlencoded
322
+ Accept-Encoding:
323
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
324
+ response:
325
+ status:
326
+ code: 200
327
+ message: OK
328
+ headers:
329
+ Date:
330
+ - Sun, 25 Sep 2022 22:32:50 GMT
331
+ Server:
332
+ - Apache
333
+ X-Powered-By:
334
+ - HHVM/4.153.1
335
+ Access-Control-Allow-Origin:
336
+ - "*"
337
+ Referrer-Policy:
338
+ - no-referrer
339
+ X-Slack-Backend:
340
+ - r
341
+ X-Slack-Unique-Id:
342
+ - YzDXEnlUBjX0uWkT8kmCzwAAABM
343
+ Strict-Transport-Security:
344
+ - max-age=31536000; includeSubDomains; preload
345
+ Access-Control-Allow-Headers:
346
+ - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid,
347
+ x-b3-sampled, x-b3-flags
348
+ Access-Control-Expose-Headers:
349
+ - x-slack-req-id, retry-after
350
+ X-Oauth-Scopes:
351
+ - identify,bot:basic
352
+ X-Accepted-Oauth-Scopes:
353
+ - rtm:stream,client
354
+ Expires:
355
+ - Mon, 26 Jul 1997 05:00:00 GMT
356
+ Cache-Control:
357
+ - private, no-cache, no-store, must-revalidate
358
+ Pragma:
359
+ - no-cache
360
+ X-Xss-Protection:
361
+ - '0'
362
+ X-Content-Type-Options:
363
+ - nosniff
364
+ X-Slack-Req-Id:
365
+ - 20417f9da55172a329704fca8e35f683
366
+ Vary:
367
+ - Accept-Encoding
368
+ Content-Length:
369
+ - '275'
370
+ Content-Type:
371
+ - application/json; charset=utf-8
372
+ X-Envoy-Upstream-Service-Time:
373
+ - '116'
374
+ X-Backend:
375
+ - main_normal main_bedrock_normal_with_overflow main_canary_with_overflow main_bedrock_canary_with_overflow
376
+ main_control_with_overflow main_bedrock_control_with_overflow
377
+ X-Server:
378
+ - slack-www-hhvm-main-iad-fbwt
379
+ X-Slack-Shared-Secret-Outcome:
380
+ - no-match
381
+ Via:
382
+ - envoy-www-iad-twh3, envoy-edge-pdx-hvfy
383
+ X-Edge-Backend:
384
+ - envoy-www
385
+ X-Slack-Edge-Shared-Secret-Outcome:
386
+ - no-match
387
+ body:
388
+ encoding: UTF-8
389
+ string: '{"ok":true,"url":"wss:\/\/wss-primary.slack.com\/websocket\/IDugmjBU5vPyDN1rGavpMHB1CdAznuJDyHl3pqAHz_DSflTYmCyuPIxH1vwqvz3aIXhyarUZMxyWiJD7zako2Wqc_poO8uiP3i6teabXYTA4vx4Hu2pa9k9PACV1apgYJFRU_iw4g2c5qeo=\/2","team":{"id":"T04KB5WQH","name":"dblock","domain":"dblockdotorg"},"self":{"id":"U0J1GAHN1","name":"travis-ci"}}'
390
+ recorded_at: Sun, 25 Sep 2022 22:32:50 GMT
391
+ recorded_with: VCR 6.1.0
@@ -182,7 +182,7 @@ RSpec.describe 'integration test', skip: ( # rubocop:disable RSpec/DescribeClass
182
182
  start_server
183
183
  wait_for_server
184
184
 
185
- expect(@reply_to).to be nil
185
+ expect(@reply_to).to be_nil
186
186
  end
187
187
  end
188
188
 
@@ -14,9 +14,11 @@ RSpec.describe Slack::Events::Config do
14
14
  it 'defaults signing secret to ENV[SLACK_SIGNING_SECRET]' do
15
15
  expect(Slack::Events.config.signing_secret).to eq 'secret'
16
16
  end
17
+
17
18
  it 'defaults signature expiration to 5 minutes' do
18
19
  expect(Slack::Events.config.signature_expires_in).to eq 5 * 60
19
20
  end
21
+
20
22
  context 'configured' do
21
23
  before do
22
24
  Slack::Events.configure do |config|
@@ -18,7 +18,7 @@ RSpec.describe Slack::Events::Request do
18
18
  let(:timestamp) { '1547933148' }
19
19
  let(:body) do
20
20
  '{"token":"X34FAqCu8tmGEkEEpoDncnja","challenge":' \
21
- '"P7sFXA4o3HV2hTx4zb4zcQ9yrvuQs8pDh6EacOxmMRj0tJaXfQFF","type":"url_verification"}'
21
+ '"P7sFXA4o3HV2hTx4zb4zcQ9yrvuQs8pDh6EacOxmMRj0tJaXfQFF","type":"url_verification"}'
22
22
  end
23
23
  let(:http_request) do
24
24
  request_double = double(
@@ -101,6 +101,7 @@ RSpec.describe Slack::Events::Request do
101
101
  expect(request).to be_valid
102
102
  expect(request).not_to be_expired
103
103
  end
104
+
104
105
  it 'does not raise an error and returns true' do
105
106
  expect(request.verify!).to be true
106
107
  end
@@ -115,6 +116,7 @@ RSpec.describe Slack::Events::Request do
115
116
  expect(request).to be_valid
116
117
  expect(request).to be_expired
117
118
  end
119
+
118
120
  it 'raises an error on verify!' do
119
121
  expect { request.verify! }.to raise_error Slack::Events::Request::TimestampExpired
120
122
  end
@@ -129,6 +131,7 @@ RSpec.describe Slack::Events::Request do
129
131
  expect(request).to be_valid
130
132
  expect(request).not_to be_expired
131
133
  end
134
+
132
135
  it 'does not raise an error on verify!' do
133
136
  expect(request.verify!).to be true
134
137
  end
@@ -143,6 +146,7 @@ RSpec.describe Slack::Events::Request do
143
146
  expect(request).to be_valid
144
147
  expect(request).to be_expired
145
148
  end
149
+
146
150
  it 'raises an error on verify!' do
147
151
  expect { request.verify! }.to raise_error Slack::Events::Request::TimestampExpired
148
152
  end