slack-ruby-client 1.0.0 → 2.1.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 (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