slack_resources 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (316) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +87 -0
  3. data/.circleci/gem_deployment.rb +53 -0
  4. data/.gitignore +13 -0
  5. data/.rubocop.yml +104 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile.lock +93 -0
  8. data/README.md +29 -0
  9. data/Rakefile +6 -0
  10. data/lib/generate_event_api_resources.rb +8 -0
  11. data/lib/slack_resources.rb +11 -0
  12. data/lib/slack_resources/generator/event_api/examples_preparation.rb +71 -0
  13. data/lib/slack_resources/generator/event_api/fetch.rb +111 -0
  14. data/lib/slack_resources/generator/event_api/strong_hash.rb +25 -0
  15. data/lib/slack_resources/generator/event_api/to_schema.rb +200 -0
  16. data/lib/slack_resources/generator/event_api/type_detection.rb +272 -0
  17. data/lib/slack_resources/generator/event_api/write.rb +123 -0
  18. data/lib/slack_resources/raw_data/event_api/_added_examples/emoji_changed.add.json +7 -0
  19. data/lib/slack_resources/raw_data/event_api/_added_examples/emoji_changed.remove.json +6 -0
  20. data/lib/slack_resources/raw_data/event_api/_added_examples/event_callback.json +13 -0
  21. data/lib/slack_resources/raw_data/event_api/examples/app_mention.json +8 -0
  22. data/lib/slack_resources/raw_data/event_api/examples/app_rate_limited.json +7 -0
  23. data/lib/slack_resources/raw_data/event_api/examples/app_uninstalled.json +11 -0
  24. data/lib/slack_resources/raw_data/event_api/examples/channel_archive.json +5 -0
  25. data/lib/slack_resources/raw_data/event_api/examples/channel_created.json +9 -0
  26. data/lib/slack_resources/raw_data/event_api/examples/channel_deleted.json +4 -0
  27. data/lib/slack_resources/raw_data/event_api/examples/channel_history_changed.json +6 -0
  28. data/lib/slack_resources/raw_data/event_api/examples/channel_left.json +4 -0
  29. data/lib/slack_resources/raw_data/event_api/examples/channel_rename.json +8 -0
  30. data/lib/slack_resources/raw_data/event_api/examples/channel_unarchive.json +5 -0
  31. data/lib/slack_resources/raw_data/event_api/examples/dnd_updated.json +11 -0
  32. data/lib/slack_resources/raw_data/event_api/examples/dnd_updated_user.json +9 -0
  33. data/lib/slack_resources/raw_data/event_api/examples/email_domain_changed.json +5 -0
  34. data/lib/slack_resources/raw_data/event_api/examples/emoji_changed.json +8 -0
  35. data/lib/slack_resources/raw_data/event_api/examples/file_change.json +7 -0
  36. data/lib/slack_resources/raw_data/event_api/examples/file_comment_added.json +9 -0
  37. data/lib/slack_resources/raw_data/event_api/examples/file_comment_deleted.json +8 -0
  38. data/lib/slack_resources/raw_data/event_api/examples/file_comment_edited.json +9 -0
  39. data/lib/slack_resources/raw_data/event_api/examples/file_created.json +7 -0
  40. data/lib/slack_resources/raw_data/event_api/examples/file_deleted.json +5 -0
  41. data/lib/slack_resources/raw_data/event_api/examples/file_public.json +7 -0
  42. data/lib/slack_resources/raw_data/event_api/examples/file_shared.json +7 -0
  43. data/lib/slack_resources/raw_data/event_api/examples/file_unshared.json +7 -0
  44. data/lib/slack_resources/raw_data/event_api/examples/grid_migration_finished.json +12 -0
  45. data/lib/slack_resources/raw_data/event_api/examples/grid_migration_started.json +12 -0
  46. data/lib/slack_resources/raw_data/event_api/examples/group_archive.json +4 -0
  47. data/lib/slack_resources/raw_data/event_api/examples/group_close.json +5 -0
  48. data/lib/slack_resources/raw_data/event_api/examples/group_deleted.json +4 -0
  49. data/lib/slack_resources/raw_data/event_api/examples/group_history_changed.json +6 -0
  50. data/lib/slack_resources/raw_data/event_api/examples/group_left.json +4 -0
  51. data/lib/slack_resources/raw_data/event_api/examples/group_open.json +5 -0
  52. data/lib/slack_resources/raw_data/event_api/examples/group_rename.json +8 -0
  53. data/lib/slack_resources/raw_data/event_api/examples/group_unarchive.json +4 -0
  54. data/lib/slack_resources/raw_data/event_api/examples/im_close.json +5 -0
  55. data/lib/slack_resources/raw_data/event_api/examples/im_created.json +6 -0
  56. data/lib/slack_resources/raw_data/event_api/examples/im_history_changed.json +6 -0
  57. data/lib/slack_resources/raw_data/event_api/examples/im_open.json +5 -0
  58. data/lib/slack_resources/raw_data/event_api/examples/link_shared.json +33 -0
  59. data/lib/slack_resources/raw_data/event_api/examples/member_joined_channel.json +8 -0
  60. data/lib/slack_resources/raw_data/event_api/examples/member_left_channel.json +7 -0
  61. data/lib/slack_resources/raw_data/event_api/examples/message.app_home.json +20 -0
  62. data/lib/slack_resources/raw_data/event_api/examples/message.channels.json +20 -0
  63. data/lib/slack_resources/raw_data/event_api/examples/message.groups.json +20 -0
  64. data/lib/slack_resources/raw_data/event_api/examples/message.im.json +20 -0
  65. data/lib/slack_resources/raw_data/event_api/examples/message.json +7 -0
  66. data/lib/slack_resources/raw_data/event_api/examples/message.mpim.json +20 -0
  67. data/lib/slack_resources/raw_data/event_api/examples/pin_added.json +8 -0
  68. data/lib/slack_resources/raw_data/event_api/examples/pin_removed.json +9 -0
  69. data/lib/slack_resources/raw_data/event_api/examples/reaction_added.json +12 -0
  70. data/lib/slack_resources/raw_data/event_api/examples/reaction_removed.json +12 -0
  71. data/lib/slack_resources/raw_data/event_api/examples/resources_added.json +31 -0
  72. data/lib/slack_resources/raw_data/event_api/examples/resources_removed.json +31 -0
  73. data/lib/slack_resources/raw_data/event_api/examples/scope_denied.json +20 -0
  74. data/lib/slack_resources/raw_data/event_api/examples/scope_granted.json +20 -0
  75. data/lib/slack_resources/raw_data/event_api/examples/star_added.json +7 -0
  76. data/lib/slack_resources/raw_data/event_api/examples/star_removed.json +7 -0
  77. data/lib/slack_resources/raw_data/event_api/examples/subteam_created.json +28 -0
  78. data/lib/slack_resources/raw_data/event_api/examples/subteam_members_changed.json +17 -0
  79. data/lib/slack_resources/raw_data/event_api/examples/subteam_self_added.json +4 -0
  80. data/lib/slack_resources/raw_data/event_api/examples/subteam_self_removed.json +4 -0
  81. data/lib/slack_resources/raw_data/event_api/examples/subteam_updated.json +34 -0
  82. data/lib/slack_resources/raw_data/event_api/examples/team_domain_change.json +5 -0
  83. data/lib/slack_resources/raw_data/event_api/examples/team_join.json +5 -0
  84. data/lib/slack_resources/raw_data/event_api/examples/team_rename.json +4 -0
  85. data/lib/slack_resources/raw_data/event_api/examples/tokens_revoked.json +19 -0
  86. data/lib/slack_resources/raw_data/event_api/examples/url_verification.json +5 -0
  87. data/lib/slack_resources/raw_data/event_api/examples/user_change.json +5 -0
  88. data/lib/slack_resources/raw_data/event_api/examples/user_resource_denied.json +20 -0
  89. data/lib/slack_resources/raw_data/event_api/examples/user_resource_granted.json +20 -0
  90. data/lib/slack_resources/raw_data/event_api/examples/user_resource_removed.json +16 -0
  91. data/lib/slack_resources/raw_data/event_api/meta.json +834 -0
  92. data/lib/slack_resources/raw_data/event_api/preset_schemas.json +33 -0
  93. data/lib/slack_resources/resources/event_api.rb +38 -0
  94. data/lib/slack_resources/resources/event_api/details/app_mention.json +85 -0
  95. data/lib/slack_resources/resources/event_api/details/app_rate_limited.json +80 -0
  96. data/lib/slack_resources/resources/event_api/details/app_uninstalled.json +36 -0
  97. data/lib/slack_resources/resources/event_api/details/channel_archive.json +59 -0
  98. data/lib/slack_resources/resources/event_api/details/channel_created.json +82 -0
  99. data/lib/slack_resources/resources/event_api/details/channel_deleted.json +48 -0
  100. data/lib/slack_resources/resources/event_api/details/channel_history_changed.json +66 -0
  101. data/lib/slack_resources/resources/event_api/details/channel_left.json +48 -0
  102. data/lib/slack_resources/resources/event_api/details/channel_rename.json +77 -0
  103. data/lib/slack_resources/resources/event_api/details/channel_unarchive.json +59 -0
  104. data/lib/slack_resources/resources/event_api/details/dnd_updated.json +86 -0
  105. data/lib/slack_resources/resources/event_api/details/dnd_updated_user.json +82 -0
  106. data/lib/slack_resources/resources/event_api/details/email_domain_changed.json +56 -0
  107. data/lib/slack_resources/resources/event_api/details/emoji_changed.add.json +78 -0
  108. data/lib/slack_resources/resources/event_api/details/emoji_changed.json +103 -0
  109. data/lib/slack_resources/resources/event_api/details/emoji_changed.remove.json +77 -0
  110. data/lib/slack_resources/resources/event_api/details/event_callback.json +126 -0
  111. data/lib/slack_resources/resources/event_api/details/file_change.json +69 -0
  112. data/lib/slack_resources/resources/event_api/details/file_comment_added.json +85 -0
  113. data/lib/slack_resources/resources/event_api/details/file_comment_deleted.json +80 -0
  114. data/lib/slack_resources/resources/event_api/details/file_comment_edited.json +85 -0
  115. data/lib/slack_resources/resources/event_api/details/file_created.json +69 -0
  116. data/lib/slack_resources/resources/event_api/details/file_deleted.json +59 -0
  117. data/lib/slack_resources/resources/event_api/details/file_public.json +69 -0
  118. data/lib/slack_resources/resources/event_api/details/file_shared.json +69 -0
  119. data/lib/slack_resources/resources/event_api/details/file_unshared.json +69 -0
  120. data/lib/slack_resources/resources/event_api/details/grid_migration_finished.json +47 -0
  121. data/lib/slack_resources/resources/event_api/details/grid_migration_started.json +47 -0
  122. data/lib/slack_resources/resources/event_api/details/group_archive.json +48 -0
  123. data/lib/slack_resources/resources/event_api/details/group_close.json +59 -0
  124. data/lib/slack_resources/resources/event_api/details/group_deleted.json +48 -0
  125. data/lib/slack_resources/resources/event_api/details/group_history_changed.json +64 -0
  126. data/lib/slack_resources/resources/event_api/details/group_left.json +48 -0
  127. data/lib/slack_resources/resources/event_api/details/group_open.json +59 -0
  128. data/lib/slack_resources/resources/event_api/details/group_rename.json +77 -0
  129. data/lib/slack_resources/resources/event_api/details/group_unarchive.json +48 -0
  130. data/lib/slack_resources/resources/event_api/details/im_close.json +59 -0
  131. data/lib/slack_resources/resources/event_api/details/im_created.json +73 -0
  132. data/lib/slack_resources/resources/event_api/details/im_history_changed.json +64 -0
  133. data/lib/slack_resources/resources/event_api/details/im_open.json +59 -0
  134. data/lib/slack_resources/resources/event_api/details/link_shared.json +129 -0
  135. data/lib/slack_resources/resources/event_api/details/member_joined_channel.json +87 -0
  136. data/lib/slack_resources/resources/event_api/details/member_left_channel.json +79 -0
  137. data/lib/slack_resources/resources/event_api/details/message.app_home.json +93 -0
  138. data/lib/slack_resources/resources/event_api/details/message.channels.json +93 -0
  139. data/lib/slack_resources/resources/event_api/details/message.groups.json +93 -0
  140. data/lib/slack_resources/resources/event_api/details/message.im.json +93 -0
  141. data/lib/slack_resources/resources/event_api/details/message.json +129 -0
  142. data/lib/slack_resources/resources/event_api/details/message.mpim.json +93 -0
  143. data/lib/slack_resources/resources/event_api/details/pin_added.json +86 -0
  144. data/lib/slack_resources/resources/event_api/details/pin_removed.json +94 -0
  145. data/lib/slack_resources/resources/event_api/details/reaction_added.json +115 -0
  146. data/lib/slack_resources/resources/event_api/details/reaction_removed.json +115 -0
  147. data/lib/slack_resources/resources/event_api/details/resources_added.json +152 -0
  148. data/lib/slack_resources/resources/event_api/details/resources_removed.json +152 -0
  149. data/lib/slack_resources/resources/event_api/details/scope_denied.json +91 -0
  150. data/lib/slack_resources/resources/event_api/details/scope_granted.json +91 -0
  151. data/lib/slack_resources/resources/event_api/details/star_added.json +75 -0
  152. data/lib/slack_resources/resources/event_api/details/star_removed.json +75 -0
  153. data/lib/slack_resources/resources/event_api/details/subteam_created.json +198 -0
  154. data/lib/slack_resources/resources/event_api/details/subteam_members_changed.json +140 -0
  155. data/lib/slack_resources/resources/event_api/details/subteam_self_added.json +48 -0
  156. data/lib/slack_resources/resources/event_api/details/subteam_self_removed.json +48 -0
  157. data/lib/slack_resources/resources/event_api/details/subteam_updated.json +210 -0
  158. data/lib/slack_resources/resources/event_api/details/team_domain_change.json +53 -0
  159. data/lib/slack_resources/resources/event_api/details/team_join.json +53 -0
  160. data/lib/slack_resources/resources/event_api/details/team_rename.json +48 -0
  161. data/lib/slack_resources/resources/event_api/details/tokens_revoked.json +76 -0
  162. data/lib/slack_resources/resources/event_api/details/url_verification.json +52 -0
  163. data/lib/slack_resources/resources/event_api/details/user_change.json +53 -0
  164. data/lib/slack_resources/resources/event_api/details/user_resource_denied.json +100 -0
  165. data/lib/slack_resources/resources/event_api/details/user_resource_granted.json +100 -0
  166. data/lib/slack_resources/resources/event_api/details/user_resource_removed.json +58 -0
  167. data/lib/slack_resources/resources/event_api/examples/app_mention.json +8 -0
  168. data/lib/slack_resources/resources/event_api/examples/app_rate_limited.json +7 -0
  169. data/lib/slack_resources/resources/event_api/examples/app_uninstalled.json +3 -0
  170. data/lib/slack_resources/resources/event_api/examples/channel_archive.json +5 -0
  171. data/lib/slack_resources/resources/event_api/examples/channel_created.json +9 -0
  172. data/lib/slack_resources/resources/event_api/examples/channel_deleted.json +4 -0
  173. data/lib/slack_resources/resources/event_api/examples/channel_history_changed.json +6 -0
  174. data/lib/slack_resources/resources/event_api/examples/channel_left.json +4 -0
  175. data/lib/slack_resources/resources/event_api/examples/channel_rename.json +8 -0
  176. data/lib/slack_resources/resources/event_api/examples/channel_unarchive.json +5 -0
  177. data/lib/slack_resources/resources/event_api/examples/dnd_updated.json +11 -0
  178. data/lib/slack_resources/resources/event_api/examples/dnd_updated_user.json +9 -0
  179. data/lib/slack_resources/resources/event_api/examples/email_domain_changed.json +5 -0
  180. data/lib/slack_resources/resources/event_api/examples/emoji_changed.add.json +7 -0
  181. data/lib/slack_resources/resources/event_api/examples/emoji_changed.json +7 -0
  182. data/lib/slack_resources/resources/event_api/examples/emoji_changed.remove.json +8 -0
  183. data/lib/slack_resources/resources/event_api/examples/event_callback.json +14 -0
  184. data/lib/slack_resources/resources/event_api/examples/file_change.json +7 -0
  185. data/lib/slack_resources/resources/event_api/examples/file_comment_added.json +9 -0
  186. data/lib/slack_resources/resources/event_api/examples/file_comment_deleted.json +8 -0
  187. data/lib/slack_resources/resources/event_api/examples/file_comment_edited.json +9 -0
  188. data/lib/slack_resources/resources/event_api/examples/file_created.json +7 -0
  189. data/lib/slack_resources/resources/event_api/examples/file_deleted.json +5 -0
  190. data/lib/slack_resources/resources/event_api/examples/file_public.json +7 -0
  191. data/lib/slack_resources/resources/event_api/examples/file_shared.json +7 -0
  192. data/lib/slack_resources/resources/event_api/examples/file_unshared.json +7 -0
  193. data/lib/slack_resources/resources/event_api/examples/grid_migration_finished.json +4 -0
  194. data/lib/slack_resources/resources/event_api/examples/grid_migration_started.json +4 -0
  195. data/lib/slack_resources/resources/event_api/examples/group_archive.json +4 -0
  196. data/lib/slack_resources/resources/event_api/examples/group_close.json +5 -0
  197. data/lib/slack_resources/resources/event_api/examples/group_deleted.json +4 -0
  198. data/lib/slack_resources/resources/event_api/examples/group_history_changed.json +6 -0
  199. data/lib/slack_resources/resources/event_api/examples/group_left.json +4 -0
  200. data/lib/slack_resources/resources/event_api/examples/group_open.json +5 -0
  201. data/lib/slack_resources/resources/event_api/examples/group_rename.json +8 -0
  202. data/lib/slack_resources/resources/event_api/examples/group_unarchive.json +4 -0
  203. data/lib/slack_resources/resources/event_api/examples/im_close.json +5 -0
  204. data/lib/slack_resources/resources/event_api/examples/im_created.json +6 -0
  205. data/lib/slack_resources/resources/event_api/examples/im_history_changed.json +6 -0
  206. data/lib/slack_resources/resources/event_api/examples/im_open.json +5 -0
  207. data/lib/slack_resources/resources/event_api/examples/link_shared.json +21 -0
  208. data/lib/slack_resources/resources/event_api/examples/member_joined_channel.json +8 -0
  209. data/lib/slack_resources/resources/event_api/examples/member_left_channel.json +7 -0
  210. data/lib/slack_resources/resources/event_api/examples/message.app_home.json +9 -0
  211. data/lib/slack_resources/resources/event_api/examples/message.channels.json +9 -0
  212. data/lib/slack_resources/resources/event_api/examples/message.groups.json +9 -0
  213. data/lib/slack_resources/resources/event_api/examples/message.im.json +9 -0
  214. data/lib/slack_resources/resources/event_api/examples/message.json +9 -0
  215. data/lib/slack_resources/resources/event_api/examples/message.mpim.json +9 -0
  216. data/lib/slack_resources/resources/event_api/examples/pin_added.json +8 -0
  217. data/lib/slack_resources/resources/event_api/examples/pin_removed.json +9 -0
  218. data/lib/slack_resources/resources/event_api/examples/reaction_added.json +12 -0
  219. data/lib/slack_resources/resources/event_api/examples/reaction_removed.json +12 -0
  220. data/lib/slack_resources/resources/event_api/examples/resources_added.json +20 -0
  221. data/lib/slack_resources/resources/event_api/examples/resources_removed.json +20 -0
  222. data/lib/slack_resources/resources/event_api/examples/scope_denied.json +9 -0
  223. data/lib/slack_resources/resources/event_api/examples/scope_granted.json +9 -0
  224. data/lib/slack_resources/resources/event_api/examples/star_added.json +7 -0
  225. data/lib/slack_resources/resources/event_api/examples/star_removed.json +7 -0
  226. data/lib/slack_resources/resources/event_api/examples/subteam_created.json +28 -0
  227. data/lib/slack_resources/resources/event_api/examples/subteam_members_changed.json +17 -0
  228. data/lib/slack_resources/resources/event_api/examples/subteam_self_added.json +4 -0
  229. data/lib/slack_resources/resources/event_api/examples/subteam_self_removed.json +4 -0
  230. data/lib/slack_resources/resources/event_api/examples/subteam_updated.json +34 -0
  231. data/lib/slack_resources/resources/event_api/examples/team_domain_change.json +5 -0
  232. data/lib/slack_resources/resources/event_api/examples/team_join.json +5 -0
  233. data/lib/slack_resources/resources/event_api/examples/team_rename.json +4 -0
  234. data/lib/slack_resources/resources/event_api/examples/tokens_revoked.json +11 -0
  235. data/lib/slack_resources/resources/event_api/examples/url_verification.json +5 -0
  236. data/lib/slack_resources/resources/event_api/examples/user_change.json +5 -0
  237. data/lib/slack_resources/resources/event_api/examples/user_resource_denied.json +9 -0
  238. data/lib/slack_resources/resources/event_api/examples/user_resource_granted.json +9 -0
  239. data/lib/slack_resources/resources/event_api/examples/user_resource_removed.json +5 -0
  240. data/lib/slack_resources/resources/event_api/schema.json +2261 -0
  241. data/lib/slack_resources/resources/event_api/schemas/app_mention.json +46 -0
  242. data/lib/slack_resources/resources/event_api/schemas/app_rate_limited.json +45 -0
  243. data/lib/slack_resources/resources/event_api/schemas/app_uninstalled.json +17 -0
  244. data/lib/slack_resources/resources/event_api/schemas/channel_archive.json +31 -0
  245. data/lib/slack_resources/resources/event_api/schemas/channel_created.json +53 -0
  246. data/lib/slack_resources/resources/event_api/schemas/channel_deleted.json +24 -0
  247. data/lib/slack_resources/resources/event_api/schemas/channel_history_changed.json +32 -0
  248. data/lib/slack_resources/resources/event_api/schemas/channel_left.json +24 -0
  249. data/lib/slack_resources/resources/event_api/schemas/channel_rename.json +49 -0
  250. data/lib/slack_resources/resources/event_api/schemas/channel_unarchive.json +31 -0
  251. data/lib/slack_resources/resources/event_api/schemas/dnd_updated.json +52 -0
  252. data/lib/slack_resources/resources/event_api/schemas/dnd_updated_user.json +50 -0
  253. data/lib/slack_resources/resources/event_api/schemas/email_domain_changed.json +28 -0
  254. data/lib/slack_resources/resources/event_api/schemas/emoji_changed.add.json +42 -0
  255. data/lib/slack_resources/resources/event_api/schemas/emoji_changed.json +61 -0
  256. data/lib/slack_resources/resources/event_api/schemas/emoji_changed.remove.json +40 -0
  257. data/lib/slack_resources/resources/event_api/schemas/event_callback.json +76 -0
  258. data/lib/slack_resources/resources/event_api/schemas/file_change.json +39 -0
  259. data/lib/slack_resources/resources/event_api/schemas/file_comment_added.json +50 -0
  260. data/lib/slack_resources/resources/event_api/schemas/file_comment_deleted.json +46 -0
  261. data/lib/slack_resources/resources/event_api/schemas/file_comment_edited.json +50 -0
  262. data/lib/slack_resources/resources/event_api/schemas/file_created.json +39 -0
  263. data/lib/slack_resources/resources/event_api/schemas/file_deleted.json +31 -0
  264. data/lib/slack_resources/resources/event_api/schemas/file_public.json +39 -0
  265. data/lib/slack_resources/resources/event_api/schemas/file_shared.json +39 -0
  266. data/lib/slack_resources/resources/event_api/schemas/file_unshared.json +39 -0
  267. data/lib/slack_resources/resources/event_api/schemas/grid_migration_finished.json +24 -0
  268. data/lib/slack_resources/resources/event_api/schemas/grid_migration_started.json +24 -0
  269. data/lib/slack_resources/resources/event_api/schemas/group_archive.json +24 -0
  270. data/lib/slack_resources/resources/event_api/schemas/group_close.json +31 -0
  271. data/lib/slack_resources/resources/event_api/schemas/group_deleted.json +24 -0
  272. data/lib/slack_resources/resources/event_api/schemas/group_history_changed.json +32 -0
  273. data/lib/slack_resources/resources/event_api/schemas/group_left.json +24 -0
  274. data/lib/slack_resources/resources/event_api/schemas/group_open.json +31 -0
  275. data/lib/slack_resources/resources/event_api/schemas/group_rename.json +49 -0
  276. data/lib/slack_resources/resources/event_api/schemas/group_unarchive.json +24 -0
  277. data/lib/slack_resources/resources/event_api/schemas/im_close.json +31 -0
  278. data/lib/slack_resources/resources/event_api/schemas/im_created.json +44 -0
  279. data/lib/slack_resources/resources/event_api/schemas/im_history_changed.json +32 -0
  280. data/lib/slack_resources/resources/event_api/schemas/im_open.json +31 -0
  281. data/lib/slack_resources/resources/event_api/schemas/link_shared.json +74 -0
  282. data/lib/slack_resources/resources/event_api/schemas/member_joined_channel.json +46 -0
  283. data/lib/slack_resources/resources/event_api/schemas/member_left_channel.json +42 -0
  284. data/lib/slack_resources/resources/event_api/schemas/message.app_home.json +50 -0
  285. data/lib/slack_resources/resources/event_api/schemas/message.channels.json +50 -0
  286. data/lib/slack_resources/resources/event_api/schemas/message.groups.json +50 -0
  287. data/lib/slack_resources/resources/event_api/schemas/message.im.json +50 -0
  288. data/lib/slack_resources/resources/event_api/schemas/message.json +82 -0
  289. data/lib/slack_resources/resources/event_api/schemas/message.mpim.json +50 -0
  290. data/lib/slack_resources/resources/event_api/schemas/pin_added.json +49 -0
  291. data/lib/slack_resources/resources/event_api/schemas/pin_removed.json +53 -0
  292. data/lib/slack_resources/resources/event_api/schemas/reaction_added.json +71 -0
  293. data/lib/slack_resources/resources/event_api/schemas/reaction_removed.json +71 -0
  294. data/lib/slack_resources/resources/event_api/schemas/resources_added.json +110 -0
  295. data/lib/slack_resources/resources/event_api/schemas/resources_removed.json +110 -0
  296. data/lib/slack_resources/resources/event_api/schemas/scope_denied.json +57 -0
  297. data/lib/slack_resources/resources/event_api/schemas/scope_granted.json +57 -0
  298. data/lib/slack_resources/resources/event_api/schemas/star_added.json +42 -0
  299. data/lib/slack_resources/resources/event_api/schemas/star_removed.json +42 -0
  300. data/lib/slack_resources/resources/event_api/schemas/subteam_created.json +150 -0
  301. data/lib/slack_resources/resources/event_api/schemas/subteam_members_changed.json +76 -0
  302. data/lib/slack_resources/resources/event_api/schemas/subteam_self_added.json +24 -0
  303. data/lib/slack_resources/resources/event_api/schemas/subteam_self_removed.json +24 -0
  304. data/lib/slack_resources/resources/event_api/schemas/subteam_updated.json +156 -0
  305. data/lib/slack_resources/resources/event_api/schemas/team_domain_change.json +25 -0
  306. data/lib/slack_resources/resources/event_api/schemas/team_join.json +28 -0
  307. data/lib/slack_resources/resources/event_api/schemas/team_rename.json +24 -0
  308. data/lib/slack_resources/resources/event_api/schemas/tokens_revoked.json +46 -0
  309. data/lib/slack_resources/resources/event_api/schemas/url_verification.json +25 -0
  310. data/lib/slack_resources/resources/event_api/schemas/user_change.json +28 -0
  311. data/lib/slack_resources/resources/event_api/schemas/user_resource_denied.json +63 -0
  312. data/lib/slack_resources/resources/event_api/schemas/user_resource_granted.json +63 -0
  313. data/lib/slack_resources/resources/event_api/schemas/user_resource_removed.json +31 -0
  314. data/lib/slack_resources/resources/event_api/summary.json +5876 -0
  315. data/slack_resources.gemspec +33 -0
  316. metadata +470 -0
@@ -0,0 +1,111 @@
1
+ require 'pathname'
2
+ require 'rest-client'
3
+ require 'nokogiri'
4
+ require 'json'
5
+ require 'active_support/core_ext/object/blank'
6
+ require 'active_support/core_ext/string/inflections'
7
+
8
+ BASE_DIR = Pathname('./resources/event_api')
9
+ EXAMPLES_DIR = BASE_DIR.join('examples')
10
+ FileUtils.mkdir_p(EXAMPLES_DIR)
11
+
12
+ def fetch(url)
13
+ tmp = Pathname('./tmp')
14
+ path = tmp.join(url.tr(':', '_').tr('/', '_')).to_s
15
+
16
+ return File.read(path) if File.exist?(path)
17
+
18
+ RestClient.get(url).tap { |data| File.write(path, data) }
19
+ end
20
+
21
+ def event_api_urls
22
+ base = 'https://api.slack.com/events/api'
23
+ doc = Nokogiri.parse(fetch(base))
24
+ doc.css('#api_main_content a.bold.block').map { |a| URI.join(base, a.attributes['href']).to_s }
25
+ end
26
+
27
+ def event_api_pages
28
+ @event_api_pages ||= event_api_urls.map do |url|
29
+ [url, url.split('/').pop, fetch(url)]
30
+ end
31
+ end
32
+
33
+ def analise(html)
34
+ doc = Nokogiri.parse(html)
35
+ [
36
+ pick_response(doc),
37
+ pick_compatibility(doc),
38
+ pick_scopes(doc),
39
+ ]
40
+ end
41
+
42
+ def pick_response(doc)
43
+ response_raw = doc.css('#api_main_content pre')[0].content
44
+ parse(response_raw)
45
+ end
46
+
47
+ def pick_compatibility(doc)
48
+ doc.css('#api_main_content .col.span_2_of_3.small')[0]
49
+ .content
50
+ .gsub("\t\t", "\t")
51
+ .split("\t")
52
+ .select(&:present?)[1..-1]&.
53
+ map(&:chomp) || []
54
+ end
55
+
56
+ def pick_scopes(doc)
57
+ doc.css('#api_main_content .col.span_1_of_3.small')[0]&.
58
+ content
59
+ .gsub("\t\t", "\t")
60
+ .split("\t")
61
+ .select(&:present?)[1..-1]&.
62
+ map(&:chomp) || []
63
+ end
64
+
65
+ def parse(json)
66
+ clean = json.gsub(/\{[\s\n]*…[^}]*\},?/m, '{},').gsub(/\{[\s\n]*\.\.\.[^}]*\},?/m, '{},').gsub(%("3"\n), %("3",\n))
67
+ JSON.parse(clean)
68
+ rescue StandardError
69
+ force(clean)
70
+ end
71
+
72
+ def force(clean)
73
+ eval(clean)
74
+ rescue StandardError
75
+ raise
76
+ end
77
+
78
+ def write_response_sample
79
+ types = []
80
+ on_event_api = []
81
+ on_rtm = []
82
+ all_scopes = []
83
+ subscriptions = {}
84
+
85
+ event_api_pages.each do |url, type, page|
86
+ response, compatibility, scopes = analise(page)
87
+
88
+ types << type
89
+ on_event_api << type if compatibility.include?('Events API')
90
+ on_rtm << type if compatibility.include?('RTM')
91
+
92
+ all_scopes += scopes
93
+
94
+ subscriptions[type] = {
95
+ url: url,
96
+ compatibility: compatibility,
97
+ scopes: scopes,
98
+ }
99
+ File.write(EXAMPLES_DIR.join("#{type}.json"), JSON.pretty_generate(response))
100
+ end
101
+
102
+ File.write(BASE_DIR.join('meta.json'), JSON.pretty_generate({
103
+ types: types.uniq,
104
+ on_event_api: on_event_api.uniq,
105
+ on_rtm: on_rtm.uniq,
106
+ scopes: all_scopes.uniq,
107
+ subscriptions: subscriptions,
108
+ }))
109
+ end
110
+
111
+ write_response_sample
@@ -0,0 +1,25 @@
1
+ module SlackResources
2
+ module Generator
3
+ module StrongHash
4
+ refine Hash do
5
+ def protect_merge!(b)
6
+ b.keys.map do |new_key|
7
+ if self[new_key]
8
+ self[new_key] = b[new_key] if b[new_key].is_a?(Hash) && b[new_key]['type'].is_a?(Array)
9
+ else
10
+ self[new_key] = b[new_key]
11
+ end
12
+ end
13
+
14
+ self
15
+ end
16
+
17
+ def key_ordered
18
+ keys.sort.inject({}) do |a, k|
19
+ a.merge!(k => self[k])
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,200 @@
1
+ require 'json'
2
+ require 'active_support/core_ext/object/blank'
3
+ require 'active_support/core_ext/hash/keys'
4
+
5
+ module SlackResources
6
+ module Generator
7
+ class ToSchema
8
+ using StrongHash
9
+
10
+ def initialize(example:, url:, preset:, key: 'root', defined: {}, defined_used: Set.new, parent: {}, root: nil)
11
+ @example = JSON.parse(example.to_json).key_ordered
12
+ @url = url
13
+ @preset = preset
14
+ @key = key
15
+ @defined = defined
16
+ @defined_used = defined_used
17
+ @parent = parent
18
+ @root = root || @example
19
+ end
20
+
21
+ def execute!
22
+ properties = @example.inject({}) do |a, (prop_name, value)|
23
+ type = TypeDetection.new(
24
+ parent_key: @key,
25
+ to_schema_instance: self,
26
+ prop_name: prop_name,
27
+ value: value,
28
+ container: @example,
29
+ preset: @preset
30
+ ).execute!
31
+
32
+ @defined_used << type if type.is_a?(String)
33
+
34
+ definition =
35
+ case
36
+ when TypeDetection.default_type?(type)
37
+ { 'type' => type }
38
+ when detail?(type)
39
+ type
40
+ when array_type?(type)
41
+ define_as_array(type, value)
42
+ else
43
+ ref_to(type)
44
+ end
45
+
46
+ a.merge(prop_name => definition)
47
+ end
48
+
49
+ [
50
+ {
51
+ 'type' => 'object',
52
+ 'description' => properties.blank? ? "definition snipped. learn more: #{@url}" : '(defined by script)',
53
+ 'properties' => properties,
54
+ },
55
+ @defined,
56
+ @defined_used,
57
+ ]
58
+ end
59
+
60
+ def root_schema?
61
+ @root == @example
62
+ end
63
+
64
+ def root_type
65
+ @root['type']
66
+ end
67
+
68
+ def root_type_prefix
69
+ @root_type_prefix ||= root_type.split('_').shift
70
+ end
71
+
72
+ def array_type?(type)
73
+ type.to_s[0..1] == '[]'
74
+ end
75
+
76
+ def detail?(type)
77
+ type.is_a?(Hash)
78
+ end
79
+
80
+ def define_as_array(array_type, values)
81
+ type = array_type[2..-1]
82
+
83
+ if TypeDetection.default_type?(type)
84
+ return {
85
+ 'type' => 'array',
86
+ 'items' => {
87
+ 'type' => type,
88
+ },
89
+ }
90
+ end
91
+
92
+ if values.first.is_a?(Hash)
93
+ to_child_schema(
94
+ prop_name: type,
95
+ example: values.first,
96
+ key: type,
97
+ parent: @example
98
+ )
99
+ elsif values.first.is_a?(String)
100
+ define_string(type)
101
+ end
102
+
103
+ {
104
+ 'type' => 'array',
105
+ 'items' => ref_to(type),
106
+ }
107
+ end
108
+
109
+ def define_object(k, v, types)
110
+ ref_key = k == 'item' ? "#{root_type_prefix}_item" : k
111
+
112
+ to_child_schema(
113
+ prop_name: ref_key,
114
+ example: v,
115
+ key: k,
116
+ parent: types
117
+ )
118
+
119
+ ref_key
120
+ end
121
+
122
+ def define_special_type(prop_name, value, container, const)
123
+ @defined_used << prop_name
124
+
125
+ return prop_name if @parent[prop_name]
126
+
127
+ types = value['items'].map { |v| detect_default_type(prop_name, v, container) }.uniq
128
+
129
+ @defined[prop_name] =
130
+ if const
131
+ { 'type' => normalize_type(types), enum: value['items'].uniq }
132
+ else
133
+ { 'type' => normalize_type(types) }
134
+ end
135
+
136
+ prop_name
137
+ end
138
+
139
+ def normalize_type(types)
140
+ types.size == 1 ? types[0] : types
141
+ end
142
+
143
+ def define_string(prop_name)
144
+ define_default_type(prop_name, 'string', nil)
145
+ end
146
+
147
+ def define_default_type(prop_name, value, container, const = false)
148
+ @defined.protect_merge!(
149
+ prop_name => {
150
+ 'type' => detect_default_type(prop_name, value, container, const),
151
+ }
152
+ )
153
+ @defined_used << prop_name
154
+
155
+ ref_to(prop_name)
156
+ end
157
+
158
+ def detect_default_type(prop_name, value, container, const = false)
159
+ return define_special_type(prop_name, value, container, const) if value.is_a?(Hash) && value[TypeDetection::SPECIAL_TYPE] == TypeDetection::MULTIPLE_EXAMPLES
160
+
161
+ case value
162
+ when Integer
163
+ 'number'
164
+ when Array
165
+ 'array'
166
+ when Hash
167
+ define_object(prop_name, value, container)
168
+ when true, false
169
+ 'boolean'
170
+ when nil
171
+ 'null'
172
+ else
173
+ 'string'
174
+ end
175
+ end
176
+
177
+ def ref_to(type)
178
+ { '$ref' => "#/definitions/#{type}" }
179
+ end
180
+
181
+ def to_child_schema(params)
182
+ prop_name = params.delete(:prop_name)
183
+ SlackResources::Generator::ToSchema.new(
184
+ example: @example,
185
+ url: @url,
186
+ preset: @preset,
187
+ key: @key,
188
+ defined: @defined,
189
+ defined_used: @defined_used,
190
+ parent: @parent,
191
+ root: @root,
192
+ **params
193
+ ).execute!.tap do |schema,|
194
+ @defined_used << prop_name
195
+ @defined[prop_name] = schema
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end
@@ -0,0 +1,272 @@
1
+ require 'active_support/core_ext/module/delegation'
2
+
3
+ module SlackResources
4
+ module Generator
5
+ class TypeDetection
6
+ using StrongHash
7
+
8
+ SPECIAL_TYPE = '_type'.freeze
9
+ MULTIPLE_EXAMPLES = 'MULTIPLE_EXAMPLES'.freeze
10
+
11
+ CONST_TYPES = %w[
12
+ type
13
+ subtype
14
+ ].freeze
15
+
16
+ DEFAULT_TYPES = Set.new(%w[
17
+ string
18
+ number
19
+ object
20
+ array
21
+ boolean
22
+ null
23
+ ])
24
+
25
+ STRING_ID_PROPERTIES_MAP = {
26
+ item_user: 'user_id',
27
+ user: 'user_id',
28
+ creator: 'user_id',
29
+ inviter: 'user_id',
30
+ created_by: 'user_id',
31
+ updated_by: 'user_id',
32
+ deleted_by: 'user_id',
33
+ channel: 'channel_id',
34
+ comment: 'comment_id',
35
+ team: 'team_id',
36
+ }.stringify_keys!
37
+
38
+ STRING_ID_PROPERTIES = Set.new(STRING_ID_PROPERTIES_MAP.keys)
39
+
40
+ DIRECT_STRING_PROPERTIES = Set.new(%w[
41
+ email_domain
42
+ text
43
+ description
44
+ handle
45
+ url
46
+ domain
47
+ challenge
48
+ ])
49
+
50
+ USER_COUNT_PROPERTIES = Set.new(%w[
51
+ user_count
52
+ added_users_count
53
+ removed_users_count
54
+ ])
55
+
56
+ ARRAY_PROPERTIES_TYPE_MAP = {
57
+ authed_users: 'user_id',
58
+ users: 'user_id',
59
+ added_users: 'user_id',
60
+ removed_users: 'user_id',
61
+ authed_teams: 'team_id',
62
+ channels: 'channel_id',
63
+ groups: 'group_id',
64
+ scopes: 'scope',
65
+ links: 'link',
66
+ oauth: 'string',
67
+ bot: 'string',
68
+ resources: 'resource_item',
69
+ }.stringify_keys!
70
+
71
+ TOKENS_REVOKED_ARRAY_PROPERTIES = Set.new(%w[
72
+ oauth
73
+ bot
74
+ ])
75
+
76
+ ARRAY_PROPERTIES = Set.new(ARRAY_PROPERTIES_TYPE_MAP.keys - TOKENS_REVOKED_ARRAY_PROPERTIES.to_a)
77
+
78
+ BOOLEAN = Set.new([true, false])
79
+
80
+ AMBIENT_PROPERTIES = Set.new(%w[
81
+ id
82
+ type
83
+ name
84
+ subtype
85
+ value
86
+ item
87
+ ])
88
+
89
+ class << self
90
+ def default_type?(type)
91
+ DEFAULT_TYPES.include?(type)
92
+ end
93
+ end
94
+
95
+ def initialize(to_schema_instance:, parent_key:, prop_name:, value:, container:, preset:)
96
+ @to_schema = to_schema_instance
97
+ @parent_key = parent_key
98
+ @prop_name = prop_name
99
+ @value = value
100
+ @container = container
101
+ @preset = preset
102
+ end
103
+
104
+ def execute! # rubocop:disable Metrics/PerceivedComplexity,Metrics/CyclomaticComplexity
105
+ case
106
+ when root_schema? && constantable?
107
+ { 'const' => @value }
108
+ when item_schema? && type?
109
+ define_string("#{root_type_prefix}_#{@parent_key}_type")
110
+
111
+ when string_id?
112
+ define_string_id
113
+
114
+ when emoji_list?
115
+ define_string('emoji_name')
116
+ '[]emoji_name'
117
+ when emoji_alternative?
118
+ define_string('emoji_name')
119
+
120
+ when array?
121
+ define_array_type
122
+
123
+ when user_count?
124
+ 'user_count'
125
+ when time_integer?
126
+ 'time_integer'
127
+ when boolean?
128
+ 'boolean'
129
+ when direct_string? || (on_url_verification? && @prop_name == 'token')
130
+ 'string'
131
+ when timestamp?
132
+ 'timestamp'
133
+
134
+ else
135
+ define_default_type(normalized_prop_name, @value, @container, const_type?)
136
+ end
137
+ end
138
+
139
+ private
140
+
141
+ delegate(
142
+ :root_schema?,
143
+ :define_string,
144
+ :root_type,
145
+ :root_type_prefix,
146
+ :define_default_type,
147
+ :define_object,
148
+ :define_enum,
149
+ :ref_to,
150
+ to: :@to_schema
151
+ )
152
+
153
+ def normalized_prop_name
154
+ if ambient?
155
+ root_schema? ? "#{root_type_prefix}_#{@prop_name}" : "#{@parent_key}_#{@prop_name}"
156
+ else
157
+ @prop_name
158
+ end
159
+ end
160
+
161
+ def type?
162
+ @prop_name == 'type'
163
+ end
164
+
165
+ def const_type?
166
+ CONST_TYPES.include?(@prop_name) || @prop_name.match(/_type$/)
167
+ end
168
+
169
+ def string?
170
+ @value.is_a?(String)
171
+ end
172
+
173
+ def constantable?
174
+ const_type? && (@value.is_a?(String) || @value.is_a?(Integer))
175
+ end
176
+
177
+ def emoji_alternative?
178
+ @prop_name == 'reaction'
179
+ end
180
+
181
+ def item_schema?
182
+ @parent_key == 'item'
183
+ end
184
+
185
+ def ambient?
186
+ AMBIENT_PROPERTIES.include?(@prop_name)
187
+ end
188
+
189
+ def time_integer?
190
+ @value.is_a?(Integer)
191
+ end
192
+
193
+ def boolean?
194
+ BOOLEAN.include?(@value)
195
+ end
196
+
197
+ def timestamp?
198
+ @prop_name == 'latest' || @prop_name.match(/.+_ts$/) || float_string?
199
+ end
200
+
201
+ def float_string?
202
+ @value.respond_to?(:to_f) && @value == @value.to_f.to_s
203
+ end
204
+
205
+ def array?
206
+ ARRAY_PROPERTIES.include?(@prop_name) || tokens_revoked_array?
207
+ end
208
+
209
+ def tokens_revoked_array?
210
+ on_tokens_revoked? && TOKENS_REVOKED_ARRAY_PROPERTIES.include?(@prop_name)
211
+ end
212
+
213
+ def user_count?
214
+ USER_COUNT_PROPERTIES.include?(@prop_name)
215
+ end
216
+
217
+ def direct_string?
218
+ DIRECT_STRING_PROPERTIES.include?(@prop_name)
219
+ end
220
+
221
+ def string_id?
222
+ @prop_name.match(/_id$/) || (string_value? && STRING_ID_PROPERTIES.include?(@prop_name))
223
+ end
224
+
225
+ def string_value?
226
+ @value.nil? || @value.is_a?(String)
227
+ end
228
+
229
+ def default_type?(type)
230
+ DEFAULT_TYPES.include?(type)
231
+ end
232
+
233
+ def emoji_list?
234
+ on_emoji_changed? && @prop_name == 'names'
235
+ end
236
+
237
+ def on_tokens_revoked?
238
+ root_type == 'tokens_revoked'
239
+ end
240
+
241
+ def on_url_verification?
242
+ root_type == 'url_verification'
243
+ end
244
+
245
+ def on_emoji_changed?
246
+ root_type == 'emoji_changed'
247
+ end
248
+
249
+ def define_array_type
250
+ type = ARRAY_PROPERTIES_TYPE_MAP[@prop_name]
251
+ array_type = "[]#{type}"
252
+
253
+ return array_type if default_type?(type)
254
+ return define_string(type) && array_type unless @value.is_a?(Hash)
255
+
256
+ to_child_schema(
257
+ prop_name: type,
258
+ example: @value.first,
259
+ key: @prop_name,
260
+ parent: @container
261
+ )
262
+
263
+ array_type
264
+ end
265
+
266
+ def define_string_id
267
+ type = STRING_ID_PROPERTIES_MAP[@prop_name] || @prop_name
268
+ define_string(type)
269
+ end
270
+ end
271
+ end
272
+ end