slack-ruby-client 0.14.5 → 0.17.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 (231) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.rubocop.yml +11 -3
  4. data/.rubocop_todo.yml +61 -23
  5. data/.travis.yml +1 -5
  6. data/CHANGELOG.md +43 -4
  7. data/CONTRIBUTING.md +17 -6
  8. data/Dangerfile +1 -1
  9. data/Gemfile +1 -2
  10. data/LICENSE.md +1 -1
  11. data/README.md +86 -52
  12. data/UPGRADING.md +20 -2
  13. data/bin/commands.rb +23 -0
  14. data/bin/commands/admin_analytics.rb +16 -0
  15. data/bin/commands/admin_apps.rb +15 -2
  16. data/bin/commands/admin_apps_approved.rb +17 -0
  17. data/bin/commands/admin_apps_restricted.rb +17 -0
  18. data/bin/commands/admin_barriers.rb +47 -0
  19. data/bin/commands/admin_conversations.rb +159 -0
  20. data/bin/commands/admin_conversations_ekm.rb +17 -0
  21. data/bin/commands/admin_conversations_restrictAccess.rb +37 -0
  22. data/bin/commands/admin_conversations_whitelist.rb +37 -0
  23. data/bin/commands/admin_emoji.rb +54 -0
  24. data/bin/commands/admin_inviteRequests.rb +36 -0
  25. data/bin/commands/admin_inviteRequests_approved.rb +16 -0
  26. data/bin/commands/admin_inviteRequests_denied.rb +16 -0
  27. data/bin/commands/admin_teams.rb +27 -0
  28. data/bin/commands/admin_teams_admins.rb +16 -0
  29. data/bin/commands/admin_teams_owners.rb +16 -0
  30. data/bin/commands/admin_teams_settings.rb +64 -0
  31. data/bin/commands/admin_usergroups.rb +48 -0
  32. data/bin/commands/admin_users.rb +97 -0
  33. data/bin/commands/admin_users_session.rb +22 -0
  34. data/bin/commands/api.rb +0 -1
  35. data/bin/commands/apps_connections.rb +13 -0
  36. data/bin/commands/apps_event_authorizations.rb +16 -0
  37. data/bin/commands/auth_teams.rb +16 -0
  38. data/bin/commands/bots.rb +1 -0
  39. data/bin/commands/calls.rb +52 -0
  40. data/bin/commands/calls_participants.rb +25 -0
  41. data/bin/commands/channels.rb +1 -155
  42. data/bin/commands/chat.rb +14 -12
  43. data/bin/commands/chat_scheduledMessages.rb +1 -0
  44. data/bin/commands/conversations.rb +15 -4
  45. data/bin/commands/dnd.rb +3 -1
  46. data/bin/commands/files.rb +7 -5
  47. data/bin/commands/files_remote.rb +3 -3
  48. data/bin/commands/groups.rb +1 -162
  49. data/bin/commands/im.rb +1 -63
  50. data/bin/commands/migration.rb +1 -0
  51. data/bin/commands/mpim.rb +1 -61
  52. data/bin/commands/oauth.rb +1 -1
  53. data/bin/commands/pins.rb +0 -2
  54. data/bin/commands/reactions.rb +1 -0
  55. data/bin/commands/search.rb +4 -1
  56. data/bin/commands/team.rb +3 -0
  57. data/bin/commands/usergroups.rb +6 -1
  58. data/bin/commands/usergroups_users.rb +2 -0
  59. data/bin/commands/users.rb +5 -3
  60. data/bin/commands/users_profile.rb +5 -5
  61. data/bin/commands/views.rb +1 -1
  62. data/bin/commands/workflows.rb +38 -0
  63. data/lib/slack-ruby-client.rb +5 -4
  64. data/lib/slack/events/request.rb +7 -3
  65. data/lib/slack/messages/message.rb +0 -4
  66. data/lib/slack/real_time/client.rb +2 -1
  67. data/lib/slack/real_time/concurrency.rb +0 -2
  68. data/lib/slack/real_time/concurrency/async.rb +1 -3
  69. data/lib/slack/real_time/config.rb +5 -14
  70. data/lib/slack/real_time/models/base.rb +0 -4
  71. data/lib/slack/real_time/socket.rb +2 -2
  72. data/lib/slack/real_time/stores/base.rb +3 -1
  73. data/lib/slack/version.rb +1 -1
  74. data/lib/slack/web/api/endpoints.rb +47 -0
  75. data/lib/slack/web/api/endpoints/admin_analytics.rb +28 -0
  76. data/lib/slack/web/api/endpoints/admin_apps.rb +22 -2
  77. data/lib/slack/web/api/endpoints/admin_apps_approved.rb +35 -0
  78. data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +35 -0
  79. data/lib/slack/web/api/endpoints/admin_barriers.rb +82 -0
  80. data/lib/slack/web/api/endpoints/admin_conversations.rb +246 -0
  81. data/lib/slack/web/api/endpoints/admin_conversations_ekm.rb +35 -0
  82. data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +61 -0
  83. data/lib/slack/web/api/endpoints/admin_conversations_whitelist.rb +64 -0
  84. data/lib/slack/web/api/endpoints/admin_emoji.rb +88 -0
  85. data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +61 -0
  86. data/lib/slack/web/api/endpoints/admin_inviteRequests_approved.rb +33 -0
  87. data/lib/slack/web/api/endpoints/admin_inviteRequests_denied.rb +33 -0
  88. data/lib/slack/web/api/endpoints/admin_teams.rb +50 -0
  89. data/lib/slack/web/api/endpoints/admin_teams_admins.rb +34 -0
  90. data/lib/slack/web/api/endpoints/admin_teams_owners.rb +34 -0
  91. data/lib/slack/web/api/endpoints/admin_teams_settings.rb +99 -0
  92. data/lib/slack/web/api/endpoints/admin_usergroups.rb +77 -0
  93. data/lib/slack/web/api/endpoints/admin_users.rb +161 -0
  94. data/lib/slack/web/api/endpoints/admin_users_session.rb +38 -0
  95. data/lib/slack/web/api/endpoints/api.rb +0 -2
  96. data/lib/slack/web/api/endpoints/apps_connections.rb +21 -0
  97. data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +34 -0
  98. data/lib/slack/web/api/endpoints/auth_teams.rb +33 -0
  99. data/lib/slack/web/api/endpoints/bots.rb +2 -0
  100. data/lib/slack/web/api/endpoints/calls.rb +83 -0
  101. data/lib/slack/web/api/endpoints/calls_participants.rb +42 -0
  102. data/lib/slack/web/api/endpoints/channels.rb +1 -245
  103. data/lib/slack/web/api/endpoints/chat.rb +23 -19
  104. data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +3 -1
  105. data/lib/slack/web/api/endpoints/conversations.rb +37 -19
  106. data/lib/slack/web/api/endpoints/dnd.rb +4 -0
  107. data/lib/slack/web/api/endpoints/files.rb +8 -4
  108. data/lib/slack/web/api/endpoints/files_remote.rb +4 -4
  109. data/lib/slack/web/api/endpoints/groups.rb +0 -253
  110. data/lib/slack/web/api/endpoints/im.rb +0 -101
  111. data/lib/slack/web/api/endpoints/migration.rb +2 -0
  112. data/lib/slack/web/api/endpoints/mpim.rb +0 -96
  113. data/lib/slack/web/api/endpoints/oauth.rb +1 -4
  114. data/lib/slack/web/api/endpoints/pins.rb +3 -8
  115. data/lib/slack/web/api/endpoints/reactions.rb +5 -3
  116. data/lib/slack/web/api/endpoints/search.rb +6 -0
  117. data/lib/slack/web/api/endpoints/stars.rb +2 -2
  118. data/lib/slack/web/api/endpoints/team.rb +6 -0
  119. data/lib/slack/web/api/endpoints/usergroups.rb +10 -0
  120. data/lib/slack/web/api/endpoints/usergroups_users.rb +4 -0
  121. data/lib/slack/web/api/endpoints/users.rb +7 -5
  122. data/lib/slack/web/api/endpoints/users_profile.rb +3 -3
  123. data/lib/slack/web/api/endpoints/views.rb +1 -1
  124. data/lib/slack/web/api/endpoints/workflows.rb +61 -0
  125. data/lib/slack/web/api/errors.rb +848 -0
  126. data/lib/slack/web/api/errors/internal_error.rb +14 -0
  127. data/lib/slack/web/api/errors/slack_error.rb +12 -0
  128. data/lib/slack/web/api/mixins.rb +1 -0
  129. data/lib/slack/web/api/mixins/channels.id.rb +1 -3
  130. data/lib/slack/web/api/mixins/conversations.id.rb +25 -0
  131. data/lib/slack/web/api/mixins/groups.id.rb +1 -3
  132. data/lib/slack/web/api/mixins/ids.id.rb +3 -5
  133. data/lib/slack/web/api/mixins/users.id.rb +1 -3
  134. data/lib/slack/web/api/patches/{chat.6.block-kit-support.patch → chat.1.patch} +26 -24
  135. data/lib/slack/web/api/templates/endpoints.erb +1 -0
  136. data/lib/slack/web/api/templates/errors.erb +20 -0
  137. data/lib/slack/web/api/templates/method.erb +4 -1
  138. data/lib/slack/web/api/templates/method_spec.erb +1 -1
  139. data/lib/slack/web/client.rb +1 -1
  140. data/lib/slack/web/config.rb +2 -0
  141. data/lib/slack/web/faraday/connection.rb +23 -20
  142. data/lib/slack/web/faraday/response/raise_error.rb +16 -2
  143. data/lib/slack/web/faraday/response/wrap_error.rb +24 -0
  144. data/lib/slack/web/pagination/cursor.rb +2 -2
  145. data/lib/tasks/real_time.rake +1 -1
  146. data/lib/tasks/web.rake +21 -4
  147. data/slack-ruby-client.gemspec +5 -5
  148. data/spec/fixtures/slack/web/channels_info.yml +108 -15
  149. data/spec/fixtures/slack/web/{groups_info.yml → conversations_info.yml} +4 -4
  150. data/spec/fixtures/slack/web/conversations_setTopic.yml +69 -0
  151. data/spec/fixtures/slack/web/conversations_setTopic_one_page.yml +142 -0
  152. data/spec/fixtures/slack/web/conversations_setTopic_paginated.yml +208 -0
  153. data/spec/fixtures/slack/web/views_open_error.yml +76 -0
  154. data/spec/slack/events/request_spec.rb +13 -8
  155. data/spec/slack/real_time/client_spec.rb +18 -1
  156. data/spec/slack/real_time/concurrency/with_concurrency_spec.rb +10 -0
  157. data/spec/slack/real_time/concurrency/without_concurrency_spec.rb +10 -0
  158. data/spec/slack/real_time/rtm_connect_spec.rb +1 -1
  159. data/spec/slack/real_time/rtm_start_spec.rb +1 -1
  160. data/spec/slack/web/api/endpoints/admin_analytics_spec.rb +13 -0
  161. data/spec/slack/web/api/endpoints/admin_apps_approved_spec.rb +8 -0
  162. data/spec/slack/web/api/endpoints/admin_apps_restricted_spec.rb +8 -0
  163. data/spec/slack/web/api/endpoints/admin_apps_spec.rb +5 -0
  164. data/spec/slack/web/api/endpoints/admin_barriers_spec.rb +38 -0
  165. data/spec/slack/web/api/endpoints/admin_conversations_ekm_spec.rb +8 -0
  166. data/spec/slack/web/api/endpoints/admin_conversations_restrictAccess_spec.rb +32 -0
  167. data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +93 -0
  168. data/spec/slack/web/api/endpoints/admin_emoji_spec.rb +37 -0
  169. data/spec/slack/web/api/endpoints/admin_inviteRequests_approved_spec.rb +8 -0
  170. data/spec/slack/web/api/endpoints/admin_inviteRequests_denied_spec.rb +8 -0
  171. data/spec/slack/web/api/endpoints/admin_inviteRequests_spec.rb +18 -0
  172. data/spec/slack/web/api/endpoints/admin_teams_admins_spec.rb +13 -0
  173. data/spec/slack/web/api/endpoints/admin_teams_owners_spec.rb +13 -0
  174. data/spec/slack/web/api/endpoints/admin_teams_settings_spec.rb +53 -0
  175. data/spec/slack/web/api/endpoints/admin_teams_spec.rb +16 -0
  176. data/spec/slack/web/api/endpoints/admin_usergroups_spec.rb +37 -0
  177. data/spec/slack/web/api/endpoints/admin_users_session_spec.rb +8 -0
  178. data/spec/slack/web/api/endpoints/admin_users_spec.rb +67 -0
  179. data/spec/slack/web/api/endpoints/apps_connections_spec.rb +8 -0
  180. data/spec/slack/web/api/endpoints/apps_event_authorizations_spec.rb +13 -0
  181. data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +2 -2
  182. data/spec/slack/web/api/endpoints/apps_permissions_users_spec.rb +3 -3
  183. data/spec/slack/web/api/endpoints/apps_spec.rb +2 -2
  184. data/spec/slack/web/api/endpoints/auth_teams_spec.rb +8 -0
  185. data/spec/slack/web/api/endpoints/calls_participants_spec.rb +24 -0
  186. data/spec/slack/web/api/endpoints/calls_spec.rb +31 -0
  187. data/spec/slack/web/api/endpoints/conversations_spec.rb +20 -12
  188. data/spec/slack/web/api/endpoints/custom_specs/conversations_spec.rb +13 -0
  189. data/spec/slack/web/api/endpoints/files_comments_spec.rb +2 -2
  190. data/spec/slack/web/api/endpoints/files_remote_spec.rb +3 -3
  191. data/spec/slack/web/api/endpoints/files_spec.rb +4 -4
  192. data/spec/slack/web/api/endpoints/im_spec.rb +0 -31
  193. data/spec/slack/web/api/endpoints/mpim_spec.rb +0 -31
  194. data/spec/slack/web/api/endpoints/oauth_spec.rb +3 -14
  195. data/spec/slack/web/api/endpoints/pins_spec.rb +1 -4
  196. data/spec/slack/web/api/endpoints/reactions_spec.rb +3 -3
  197. data/spec/slack/web/api/endpoints/reminders_spec.rb +2 -2
  198. data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +2 -2
  199. data/spec/slack/web/api/endpoints/workflows_spec.rb +26 -0
  200. data/spec/slack/web/api/errors/slack_error_spec.rb +22 -0
  201. data/spec/slack/web/api/mixins/channels_spec.rb +1 -1
  202. data/spec/slack/web/api/mixins/conversations_list_spec.rb +21 -0
  203. data/spec/slack/web/api/mixins/conversations_spec.rb +43 -0
  204. data/spec/slack/web/api/mixins/groups_spec.rb +1 -1
  205. data/spec/slack/web/api/mixins/users_spec.rb +1 -1
  206. data/spec/slack/web/client_spec.rb +121 -0
  207. data/spec/slack/web/faraday/response/raise_error_spec.rb +33 -9
  208. data/spec/support/vcr.rb +4 -0
  209. metadata +145 -55
  210. data/examples/hi_real_time/Gemfile +0 -6
  211. data/examples/hi_real_time/hi.gif +0 -0
  212. data/examples/hi_real_time/hi.rb +0 -41
  213. data/examples/hi_real_time_async_celluloid/Gemfile +0 -7
  214. data/examples/hi_real_time_async_celluloid/Procfile +0 -2
  215. data/examples/hi_real_time_async_celluloid/hi.rb +0 -39
  216. data/examples/hi_real_time_async_eventmachine/Gemfile +0 -7
  217. data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
  218. data/examples/hi_real_time_async_eventmachine/hi.rb +0 -39
  219. data/lib/slack/real_time/concurrency/celluloid.rb +0 -142
  220. data/lib/slack/real_time/concurrency/eventmachine.rb +0 -85
  221. data/lib/slack/web/api/patches/chat.1.text-attachments-required.patch +0 -13
  222. data/lib/slack/web/api/patches/chat.2.attachments-json.patch +0 -17
  223. data/lib/slack/web/api/patches/chat.3.update-attachments-support.patch +0 -21
  224. data/lib/slack/web/api/patches/chat.4.postEphemeral-attachments-support.patch +0 -17
  225. data/lib/slack/web/api/patches/chat.5.postEphemeral-text-or-attachments.patch +0 -15
  226. data/spec/slack/real_time/concurrency/celluloid_spec.rb +0 -116
  227. data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -57
  228. data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +0 -13
  229. data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +0 -13
  230. data/spec/slack/web/api/endpoints/views_spec.rb +0 -29
  231. data/spec/slack/web/api/errors/service_unavailable_spec.rb +0 -17
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+ module Slack
3
+ module Web
4
+ module Api
5
+ module Errors
6
+ class ServerError < InternalError; end
7
+ class ParsingError < ServerError; end
8
+ class HttpRequestError < ServerError; end
9
+ class TimeoutError < HttpRequestError; end
10
+ class UnavailableError < HttpRequestError; end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -10,6 +10,18 @@ module Slack
10
10
  super message
11
11
  @response = response
12
12
  end
13
+
14
+ def error
15
+ response.body.error
16
+ end
17
+
18
+ def errors
19
+ response.body.errors
20
+ end
21
+
22
+ def response_metadata
23
+ response.body.response_metadata
24
+ end
13
25
  end
14
26
  end
15
27
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  require_relative 'mixins/channels.id'
3
+ require_relative 'mixins/conversations.id'
3
4
  require_relative 'mixins/users.id'
4
5
  require_relative 'mixins/users.search'
5
6
  require_relative 'mixins/groups.id'
@@ -16,9 +16,7 @@ module Slack
16
16
  name = options[:channel]
17
17
  throw ArgumentError.new('Required arguments :channel missing') if name.nil?
18
18
 
19
- id_for(:channel, name, '#', :channels, 'channel_not_found') do
20
- channels_list
21
- end
19
+ id_for :channel, name, '#', :channels_list, :channels, 'channel_not_found'
22
20
  end
23
21
  end
24
22
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ require_relative 'ids.id'
3
+
4
+ module Slack
5
+ module Web
6
+ module Api
7
+ module Mixins
8
+ module Conversations
9
+ include Ids
10
+ #
11
+ # This method returns a channel ID given a channel name.
12
+ #
13
+ # @option options [channel] :channel
14
+ # Channel to get ID for, prefixed with #.
15
+ def conversations_id(options = {})
16
+ name = options[:channel]
17
+ throw ArgumentError.new('Required arguments :channel missing') if name.nil?
18
+
19
+ id_for :channel, name, '#', :conversations_list, :channels, 'channel_not_found'
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -16,9 +16,7 @@ module Slack
16
16
  name = options[:channel]
17
17
  throw ArgumentError.new('Required arguments :channel missing') if name.nil?
18
18
 
19
- id_for(:group, name, '#', :groups, 'channel_not_found') do
20
- groups_list
21
- end
19
+ id_for :group, name, '#', :groups_list, :groups, 'channel_not_found'
22
20
  end
23
21
  end
24
22
  end
@@ -6,14 +6,12 @@ module Slack
6
6
  module Ids
7
7
  private
8
8
 
9
- def id_for(key, name, prefix, list_method, not_found_error)
9
+ def id_for(key, name, prefix, enum_method, list_method, not_found_error)
10
10
  return { 'ok' => true, key.to_s => { 'id' => name } } unless name[0] == prefix
11
11
 
12
- yield.tap do |list|
12
+ public_send enum_method do |list|
13
13
  list.public_send(list_method).each do |li|
14
- if li.name == name[1..-1]
15
- return Slack::Messages::Message.new('ok' => true, key.to_s => { 'id' => li.id })
16
- end
14
+ return Slack::Messages::Message.new('ok' => true, key.to_s => { 'id' => li.id }) if li.name == name[1..-1]
17
15
  end
18
16
  end
19
17
 
@@ -16,9 +16,7 @@ module Slack
16
16
  name = options[:user]
17
17
  throw ArgumentError.new('Required arguments :user missing') if name.nil?
18
18
 
19
- id_for(:user, name, '@', :members, 'user_not_found') do
20
- users_list
21
- end
19
+ id_for :user, name, '@', :users_list, :members, 'user_not_found'
22
20
  end
23
21
  end
24
22
  end
@@ -1,20 +1,23 @@
1
1
  diff --git a/lib/slack/web/api/endpoints/chat.rb b/lib/slack/web/api/endpoints/chat.rb
2
- index 54a7db1..c535bb5 100644
2
+ index d090ae2..50186d5 100644
3
3
  --- a/lib/slack/web/api/endpoints/chat.rb
4
4
  +++ b/lib/slack/web/api/endpoints/chat.rb
5
- @@ -97,7 +97,7 @@ module Slack
5
+ @@ -121,11 +121,22 @@ module Slack
6
+ # @see https://api.slack.com/methods/chat.postEphemeral
6
7
  # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat/chat.postEphemeral.json
7
8
  def chat_postEphemeral(options = {})
9
+ - throw ArgumentError.new('Required arguments :attachments missing') if options[:attachments].nil?
8
10
  throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
9
- - throw ArgumentError.new('Required arguments :text or :attachments missing') if options[:text].nil? && options[:attachments].nil?
11
+ - throw ArgumentError.new('Required arguments :text missing') if options[:text].nil?
10
12
  + throw ArgumentError.new('Required arguments :text, :attachments or :blocks missing') if options[:text].nil? && options[:attachments].nil? && options[:blocks].nil?
11
13
  throw ArgumentError.new('Required arguments :user missing') if options[:user].nil?
12
14
  options = options.merge(user: users_id(options)['user']['id']) if options[:user]
13
- # attachments must be passed as an encoded JSON string
14
- @@ -106,6 +106,12 @@ module Slack
15
- attachments = JSON.dump(attachments) unless attachments.is_a?(String)
16
- options = options.merge(attachments: attachments)
17
- end
15
+ + # attachments must be passed as an encoded JSON string
16
+ + if options.key?(:attachments)
17
+ + attachments = options[:attachments]
18
+ + attachments = JSON.dump(attachments) unless attachments.is_a?(String)
19
+ + options = options.merge(attachments: attachments)
20
+ + end
18
21
  + # blocks must be passed as an encoded JSON string
19
22
  + if options.key?(:blocks)
20
23
  + blocks = options[:blocks]
@@ -24,18 +27,17 @@ index 54a7db1..c535bb5 100644
24
27
  post('chat.postEphemeral', options)
25
28
  end
26
29
 
27
- @@ -146,13 +152,19 @@ module Slack
30
+ @@ -168,6 +179,19 @@ module Slack
28
31
  # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat/chat.postMessage.json
29
32
  def chat_postMessage(options = {})
30
33
  throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
31
- - throw ArgumentError.new('Required arguments :text or :attachments missing') if options[:text].nil? && options[:attachments].nil?
32
34
  + throw ArgumentError.new('Required arguments :text, :attachments or :blocks missing') if options[:text].nil? && options[:attachments].nil? && options[:blocks].nil?
33
- # attachments must be passed as an encoded JSON string
34
- if options.key?(:attachments)
35
- attachments = options[:attachments]
36
- attachments = JSON.dump(attachments) unless attachments.is_a?(String)
37
- options = options.merge(attachments: attachments)
38
- end
35
+ + # attachments must be passed as an encoded JSON string
36
+ + if options.key?(:attachments)
37
+ + attachments = options[:attachments]
38
+ + attachments = JSON.dump(attachments) unless attachments.is_a?(String)
39
+ + options = options.merge(attachments: attachments)
40
+ + end
39
41
  + # blocks must be passed as an encoded JSON string
40
42
  + if options.key?(:blocks)
41
43
  + blocks = options[:blocks]
@@ -45,19 +47,19 @@ index 54a7db1..c535bb5 100644
45
47
  post('chat.postMessage', options)
46
48
  end
47
49
 
48
- @@ -204,7 +216,7 @@ module Slack
50
+ @@ -257,8 +281,21 @@ module Slack
49
51
  # @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat/chat.update.json
50
52
  def chat_update(options = {})
51
53
  throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
52
- - throw ArgumentError.new('Required arguments :text or :attachments missing') if options[:text].nil? && options[:attachments].nil?
53
54
  + throw ArgumentError.new('Required arguments :text, :attachments or :blocks missing') if options[:text].nil? && options[:attachments].nil? && options[:blocks].nil?
54
55
  throw ArgumentError.new('Required arguments :ts missing') if options[:ts].nil?
55
- options = options.merge(channel: channels_id(options)['channel']['id']) if options[:channel]
56
- # attachments must be passed as an encoded JSON string
57
- @@ -213,6 +225,12 @@ module Slack
58
- attachments = JSON.dump(attachments) unless attachments.is_a?(String)
59
- options = options.merge(attachments: attachments)
60
- end
56
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
57
+ + # attachments must be passed as an encoded JSON string
58
+ + if options.key?(:attachments)
59
+ + attachments = options[:attachments]
60
+ + attachments = JSON.dump(attachments) unless attachments.is_a?(String)
61
+ + options = options.merge(attachments: attachments)
62
+ + end
61
63
  + # blocks must be passed as an encoded JSON string
62
64
  + if options.key?(:blocks)
63
65
  + blocks = options[:blocks]
@@ -9,6 +9,7 @@ module Slack
9
9
  module Web
10
10
  module Api
11
11
  module Endpoints
12
+ include Slack::Web::Api::Mixins::Conversations
12
13
  include Slack::Web::Api::Mixins::Channels
13
14
  include Slack::Web::Api::Mixins::Users
14
15
  include Slack::Web::Api::Mixins::Groups
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ # This file was auto-generated by lib/tasks/web.rake
3
+
4
+ module Slack
5
+ module Web
6
+ module Api
7
+ module Errors
8
+ <% errors.each do |e| %>
9
+ class <%= e.camelize %> < SlackError; end
10
+ <% end %>
11
+
12
+ ERROR_CLASSES = {
13
+ <% errors.each do |e| %>
14
+ '<%= e %>' => <%= e.camelize %>,
15
+ <% end %>
16
+ }.freeze
17
+ end
18
+ end
19
+ end
20
+ end
@@ -40,7 +40,7 @@ module Slack
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]
42
42
  <% elsif data['args']['channel'] && !data['args']['channel']['desc'].include?('Can be an encoded ID, or a name.') %>
43
- options = options.merge(channel: channels_id(options)['channel']['id']) if options[:channel]
43
+ options = options.merge(channel: conversations_id(options)['channel']['id']) if options[:channel]
44
44
  <% end %>
45
45
  <% if data['args']['user'] %>
46
46
  options = options.merge(user: users_id(options)['user']['id']) if options[:user]
@@ -48,6 +48,9 @@ module Slack
48
48
  <% if data['undocumented'] %>
49
49
  logger.warn('The <%= group %>.<%= name %> method is undocumented.')
50
50
  <% end %>
51
+ <% if data['deprecated'] %>
52
+ logger.warn('<%= group %>.<%= name %>: <%= data['deprecation']['deprecation_warning']%> Alternative methods: <%= data['deprecation']['alternative_methods'].join(', ')%>.')
53
+ <% end %>
51
54
  <% if data['args'].keys.include?('cursor') %>
52
55
  if block_given?
53
56
  Pagination::Cursor.new(self, :<%= group.gsub(".", "_") %>_<%= name %>, options).each do |page|
@@ -12,7 +12,7 @@ RSpec.describe Slack::Web::Api::Endpoints::<%= group.gsub(".", "_").camelize %>
12
12
  context '<%= group %>_<%= name %>' do
13
13
  <% required_params.each do |arg_name, arg_v| %>
14
14
  it 'requires <%= arg_name %>' do
15
- <% params_except_required = required_params.reject{ |name, _| name == arg_name }.map{|var, opts| "#{var}: '#{opts['example']}'"}.join(', ') %>
15
+ <% params_except_required = required_params.reject{ |name, _| name == arg_name }.map{ |var, opts| "#{var}: %q[#{opts['example']}]"}.join(', ') %>
16
16
  expect { client.<%= group.gsub(".", "_") %>_<%= name %><%= params_except_required.empty? ? '' : "(#{params_except_required})" %> }.to raise_error ArgumentError, /Required arguments :<%= arg_name %> missing/
17
17
  end
18
18
  <% end %>
@@ -10,7 +10,7 @@ module Slack
10
10
 
11
11
  def initialize(options = {})
12
12
  Slack::Web::Config::ATTRIBUTES.each do |key|
13
- send("#{key}=", options[key] || Slack::Web.config.send(key))
13
+ send("#{key}=", options.fetch(key, Slack::Web.config.send(key)))
14
14
  end
15
15
  @logger ||= Slack::Config.logger || Slack::Logger.default
16
16
  @token ||= Slack.config.token
@@ -16,6 +16,7 @@ module Slack
16
16
  open_timeout
17
17
  default_page_size
18
18
  default_max_retries
19
+ adapter
19
20
  ].freeze
20
21
 
21
22
  attr_accessor(*Config::ATTRIBUTES)
@@ -32,6 +33,7 @@ module Slack
32
33
  self.open_timeout = nil
33
34
  self.default_page_size = 100
34
35
  self.default_max_retries = 100
36
+ self.adapter = ::Faraday.default_adapter
35
37
  end
36
38
  end
37
39
 
@@ -6,29 +6,32 @@ module Slack
6
6
  private
7
7
 
8
8
  def connection
9
- options = {
10
- headers: { 'Accept' => 'application/json; charset=utf-8' }
11
- }
9
+ @connection ||=
10
+ begin
11
+ options = {
12
+ headers: { 'Accept' => 'application/json; charset=utf-8' }
13
+ }
12
14
 
13
- options[:headers]['User-Agent'] = user_agent if user_agent
14
- options[:proxy] = proxy if proxy
15
- options[:ssl] = { ca_path: ca_path, ca_file: ca_file } if ca_path || ca_file
15
+ options[:headers]['User-Agent'] = user_agent if user_agent
16
+ options[:proxy] = proxy if proxy
17
+ options[:ssl] = { ca_path: ca_path, ca_file: ca_file } if ca_path || ca_file
16
18
 
17
- request_options = {}
18
- request_options[:timeout] = timeout if timeout
19
- request_options[:open_timeout] = open_timeout if open_timeout
20
- options[:request] = request_options if request_options.any?
19
+ request_options = {}
20
+ request_options[:timeout] = timeout if timeout
21
+ request_options[:open_timeout] = open_timeout if open_timeout
22
+ options[:request] = request_options if request_options.any?
21
23
 
22
- ::Faraday::Connection.new(endpoint, options) do |connection|
23
- connection.use ::Faraday::Request::Multipart
24
- connection.use ::Faraday::Request::UrlEncoded
25
- connection.use ::Faraday::Response::RaiseError
26
- connection.use ::Slack::Web::Faraday::Response::RaiseError
27
- connection.use ::FaradayMiddleware::Mashify, mash_class: Slack::Messages::Message
28
- connection.use ::FaradayMiddleware::ParseJson
29
- connection.response :logger, logger if logger
30
- connection.adapter ::Faraday.default_adapter
31
- end
24
+ ::Faraday::Connection.new(endpoint, options) do |connection|
25
+ connection.use ::Faraday::Request::Multipart
26
+ connection.use ::Faraday::Request::UrlEncoded
27
+ connection.use ::Slack::Web::Faraday::Response::RaiseError
28
+ connection.use ::FaradayMiddleware::Mashify, mash_class: Slack::Messages::Message
29
+ connection.use ::FaradayMiddleware::ParseJson
30
+ connection.use ::Slack::Web::Faraday::Response::WrapError
31
+ connection.response :logger, logger if logger
32
+ connection.adapter adapter
33
+ end
34
+ end
32
35
  end
33
36
  end
34
37
  end
@@ -6,11 +6,25 @@ module Slack
6
6
  class RaiseError < ::Faraday::Response::Middleware
7
7
  def on_complete(env)
8
8
  raise Slack::Web::Api::Errors::TooManyRequestsError, env.response if env.status == 429
9
- return unless (body = env.body) && !body['ok']
9
+
10
+ return unless env.success?
11
+
12
+ body = env.body
13
+ return unless body
14
+ return if body['ok']
10
15
 
11
16
  error_message =
12
17
  body['error'] || body['errors'].map { |message| message['error'] }.join(',')
13
- raise Slack::Web::Api::Errors::SlackError.new(error_message, env.response)
18
+
19
+ error_class = Slack::Web::Api::Errors::ERROR_CLASSES[error_message]
20
+ error_class ||= Slack::Web::Api::Errors::SlackError
21
+ raise error_class.new(error_message, env.response)
22
+ end
23
+
24
+ def call(env)
25
+ super
26
+ rescue ::Faraday::ParsingError
27
+ raise Slack::Web::Api::Errors::ParsingError.new('parsing_error', env.response)
14
28
  end
15
29
  end
16
30
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ module Slack
3
+ module Web
4
+ module Faraday
5
+ module Response
6
+ class WrapError < ::Faraday::Response::Middleware
7
+ UNAVAILABLE_ERROR_STATUSES = (500..599).freeze
8
+
9
+ def on_complete(env)
10
+ return unless UNAVAILABLE_ERROR_STATUSES.cover?(env.status)
11
+
12
+ raise Slack::Web::Api::Errors::UnavailableError.new('unavailable_error', env.response)
13
+ end
14
+
15
+ def call(env)
16
+ super
17
+ rescue ::Faraday::TimeoutError, ::Faraday::ConnectionFailed
18
+ raise Slack::Web::Api::Errors::TimeoutError.new('timeout_error', env.response)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -32,14 +32,14 @@ module Slack
32
32
 
33
33
  client.logger.debug("#{self.class}##{__method__}") { e.to_s }
34
34
  retry_count += 1
35
- sleep(e.retry_after.seconds)
35
+ sleep(e.retry_after)
36
36
  next
37
37
  end
38
38
  yield response
39
39
  break unless response.response_metadata
40
40
 
41
41
  next_cursor = response.response_metadata.next_cursor
42
- break if next_cursor.blank?
42
+ break if next_cursor.nil? || next_cursor == ''
43
43
 
44
44
  retry_count = 0
45
45
  sleep(sleep_interval) if sleep_interval
@@ -8,7 +8,7 @@ namespace :slack do
8
8
  namespace :api do
9
9
  REAL_TIME_EVENTS_MARKER = '### RealTime Events'
10
10
 
11
- desc 'Update API.'
11
+ desc 'Update Real Time API.'
12
12
  task update: [:git_update] do
13
13
  event_schema = JSON.parse(File.read('lib/slack/real_time/api/schema/event.json'))
14
14
  dirglob = 'lib/slack/web/api/slack-api-ref/events/**/*.json'
data/lib/tasks/web.rake CHANGED
@@ -8,7 +8,7 @@ require 'active_support/core_ext'
8
8
  namespace :slack do
9
9
  namespace :web do
10
10
  namespace :api do
11
- desc 'Update API.'
11
+ desc 'Update Web API.'
12
12
  task update: [:git_update] do
13
13
  group_schema = JSON.parse(File.read('lib/slack/web/api/schema/group.json'))
14
14
  dirglob = 'lib/slack/web/api/slack-api-ref/groups/**/*.json'
@@ -32,6 +32,10 @@ namespace :slack do
32
32
  parsed = JSON.parse(File.read(path))
33
33
  parsed['undocumented'] = true if path =~ /undocumented/
34
34
  JSON::Validator.validate(method_schema, parsed, insert_defaults: true)
35
+ if parsed['deprecated'] && parsed['deprecation']['deprecation_warning'] =~ /It will stop functioning in February 2021/
36
+ next
37
+ end
38
+
35
39
  result[prefix][name] = parsed
36
40
  end
37
41
 
@@ -51,10 +55,14 @@ namespace :slack do
51
55
  rendered_method_spec = method_spec_template.result(group: group, names: names)
52
56
  File.write "spec/slack/web/api/endpoints/#{snaked_group}_spec.rb", rendered_method_spec
53
57
  end
54
- Dir.glob("lib/slack/web/api/patches/#{group}*.patch").sort.each do |patch|
55
- puts "- patching #{patch}"
56
- system("git apply #{patch}") || raise('failed to apply patch')
58
+
59
+ unless ENV.key?('SKIP_PATCH')
60
+ Dir.glob("lib/slack/web/api/patches/#{group}*.patch").sort.each do |patch|
61
+ puts "- patching #{patch}"
62
+ system("git apply #{patch}") || raise('failed to apply patch')
63
+ end
57
64
  end
65
+
58
66
  # command
59
67
  raise "Missing group #{group}" unless groups.key?(group)
60
68
 
@@ -74,6 +82,15 @@ namespace :slack do
74
82
  'bin/commands.rb',
75
83
  commands_template.result(files: data.keys.map { |key| key.tr('.', '_') })
76
84
  )
85
+
86
+ errors_template = Erubis::Eruby.new(File.read('lib/slack/web/api/templates/errors.erb'))
87
+ errors = data.values.map do |names|
88
+ names.values.map do |d|
89
+ d['errors'].keys
90
+ end
91
+ end.flatten.compact.uniq.sort
92
+ rendered_errors = errors_template.result(errors: errors)
93
+ File.write('lib/slack/web/api/errors.rb', rendered_errors)
77
94
  end
78
95
  end
79
96
  end