ruby-trello 2.2.0 → 3.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 (314) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +63 -10
  3. data/lib/trello/action.rb +31 -23
  4. data/lib/trello/association_builder/has_many.rb +17 -0
  5. data/lib/trello/association_builder/has_one.rb +16 -0
  6. data/lib/trello/association_fetcher/has_many/fetch.rb +47 -0
  7. data/lib/trello/association_fetcher/has_many/params.rb +56 -0
  8. data/lib/trello/association_fetcher/has_many.rb +26 -0
  9. data/lib/trello/association_fetcher/has_one/fetch.rb +49 -0
  10. data/lib/trello/association_fetcher/has_one/params.rb +36 -0
  11. data/lib/trello/association_fetcher/has_one.rb +25 -0
  12. data/lib/trello/association_infer_tool.rb +13 -0
  13. data/lib/trello/association_proxy.rb +1 -1
  14. data/lib/trello/attachment.rb +40 -27
  15. data/lib/trello/basic_data.rb +103 -49
  16. data/lib/trello/board.rb +88 -102
  17. data/lib/trello/card.rb +49 -198
  18. data/lib/trello/checklist.rb +17 -71
  19. data/lib/trello/comment.rb +39 -26
  20. data/lib/trello/cover_image.rb +20 -0
  21. data/lib/trello/custom_field.rb +31 -67
  22. data/lib/trello/custom_field_item.rb +37 -39
  23. data/lib/trello/custom_field_option.rb +40 -13
  24. data/lib/trello/item.rb +27 -16
  25. data/lib/trello/item_state.rb +7 -15
  26. data/lib/trello/json_utils.rb +1 -1
  27. data/lib/trello/label.rb +15 -85
  28. data/lib/trello/label_name.rb +22 -25
  29. data/lib/trello/list.rb +31 -44
  30. data/lib/trello/member.rb +77 -32
  31. data/lib/trello/notification.rb +27 -20
  32. data/lib/trello/organization.rb +53 -25
  33. data/lib/trello/plugin_datum.rb +11 -16
  34. data/lib/trello/schema/attribute/base.rb +79 -0
  35. data/lib/trello/schema/attribute/board_pref.rb +45 -0
  36. data/lib/trello/schema/attribute/custom_field_display.rb +45 -0
  37. data/lib/trello/schema/attribute/default.rb +45 -0
  38. data/lib/trello/schema/attribute_builder.rb +42 -0
  39. data/lib/trello/schema/attribute_registration.rb +47 -0
  40. data/lib/trello/schema/serializer/default.rb +17 -0
  41. data/lib/trello/schema/serializer/labels.rb +23 -0
  42. data/lib/trello/schema/serializer/time.rb +25 -0
  43. data/lib/trello/schema/serializer/webhooks.rb +25 -0
  44. data/lib/trello/schema.rb +31 -0
  45. data/lib/trello/token.rb +15 -12
  46. data/lib/trello/webhook.rb +18 -71
  47. data/lib/trello.rb +57 -39
  48. data/spec/action_spec.rb +2 -3
  49. data/spec/board_spec.rb +43 -103
  50. data/spec/card_spec.rb +143 -66
  51. data/spec/cassettes/action_find_with_id_and_get_all_fields.yml +104 -0
  52. data/spec/cassettes/board_find_with_id_and_get_all_fields.yml +96 -0
  53. data/spec/cassettes/board_find_with_id_and_get_specific_fields.yml +96 -0
  54. data/spec/cassettes/can_add_a_file_from_url_on_a_card.yml +189 -0
  55. data/spec/cassettes/can_add_a_file_on_a_card.yml +200 -0
  56. data/spec/cassettes/can_add_a_member_to_a_board.yml +191 -0
  57. data/spec/cassettes/can_add_a_member_to_a_card.yml +190 -0
  58. data/spec/cassettes/can_add_label_on_a_card.yml +281 -0
  59. data/spec/cassettes/can_arvhice_all_cards_of_list.yml +397 -0
  60. data/spec/cassettes/can_close_bong_a_card.yml +189 -0
  61. data/spec/cassettes/can_get_actions.yml +196 -0
  62. data/spec/cassettes/can_get_actions_of_board.yml +188 -0
  63. data/spec/cassettes/can_get_actions_of_list.yml +202 -0
  64. data/spec/cassettes/can_get_actions_of_members.yml +199 -0
  65. data/spec/cassettes/can_get_actions_of_organization.yml +201 -0
  66. data/spec/cassettes/can_get_attachments.yml +187 -0
  67. data/spec/cassettes/can_get_boards_of_custom_field.yml +198 -0
  68. data/spec/cassettes/can_get_boards_of_label.yml +197 -0
  69. data/spec/cassettes/can_get_boards_of_organization.yml +207 -0
  70. data/spec/cassettes/can_get_cards_of_board.yml +193 -0
  71. data/spec/cassettes/can_get_cards_of_list.yml +201 -0
  72. data/spec/cassettes/can_get_cards_of_member.yml +204 -0
  73. data/spec/cassettes/can_get_checklists_of_board.yml +187 -0
  74. data/spec/cassettes/can_get_comments.yml +193 -0
  75. data/spec/cassettes/can_get_comments_board.yml +109 -0
  76. data/spec/cassettes/can_get_comments_card.yml +111 -0
  77. data/spec/cassettes/can_get_comments_list.yml +109 -0
  78. data/spec/cassettes/can_get_custom_field_options_of_custom_field.yml +197 -0
  79. data/spec/cassettes/can_get_custom_fields_of_board.yml +187 -0
  80. data/spec/cassettes/can_get_label_names_of_board.yml +187 -0
  81. data/spec/cassettes/can_get_labels_of_board.yml +187 -0
  82. data/spec/cassettes/can_get_lists_of_board.yml +187 -0
  83. data/spec/cassettes/can_get_members_of_board.yml +188 -0
  84. data/spec/cassettes/can_get_members_of_organization.yml +200 -0
  85. data/spec/cassettes/can_get_notifications_of_member.yml +199 -0
  86. data/spec/cassettes/can_get_organization_of_board.yml +189 -0
  87. data/spec/cassettes/can_get_organizations_of_member.yml +203 -0
  88. data/spec/cassettes/can_get_plugin_data_of_board.yml +187 -0
  89. data/spec/cassettes/can_move_a_card_to_another_board_with_specific_list.yml +373 -0
  90. data/spec/cassettes/can_move_a_card_to_another_board_without_specific_list.yml +281 -0
  91. data/spec/cassettes/can_move_a_card_to_another_list.yml +281 -0
  92. data/spec/cassettes/can_move_all_cards_to_another_list.yml +886 -0
  93. data/spec/cassettes/can_remove_a_member_from_a_card.yml +185 -0
  94. data/spec/cassettes/can_remove_an_attachment_on_a_card.yml +277 -0
  95. data/spec/cassettes/can_remove_an_upvote_on_a_card.yml +465 -0
  96. data/spec/cassettes/can_remove_label_on_a_card.yml +279 -0
  97. data/spec/cassettes/can_success_add_comment_to_a_card.yml +196 -0
  98. data/spec/cassettes/can_success_copy_checklist_to_a_card.yml +281 -0
  99. data/spec/cassettes/can_success_copy_checklist_to_a_card_without_name_pos.yml +281 -0
  100. data/spec/cassettes/can_success_create_a_board.yml +98 -0
  101. data/spec/cassettes/can_success_create_a_board_with_full_parameters.yml +97 -0
  102. data/spec/cassettes/can_success_create_a_board_without_clone_from_other.yml +98 -0
  103. data/spec/cassettes/can_success_create_a_card.yml +99 -0
  104. data/spec/cassettes/can_success_create_a_card_when_due_is_datetime.yml +98 -0
  105. data/spec/cassettes/can_success_create_a_card_when_due_is_time.yml +98 -0
  106. data/spec/cassettes/can_success_create_a_checklist.yml +102 -0
  107. data/spec/cassettes/can_success_create_a_custom_field.yml +102 -0
  108. data/spec/cassettes/can_success_create_a_custom_field_option.yml +102 -0
  109. data/spec/cassettes/can_success_create_a_label.yml +102 -0
  110. data/spec/cassettes/can_success_create_a_list.yml +102 -0
  111. data/spec/cassettes/can_success_create_a_list_with_full_parameters.yml +102 -0
  112. data/spec/cassettes/can_success_create_a_organization.yml +104 -0
  113. data/spec/cassettes/can_success_create_a_webhook.yml +102 -0
  114. data/spec/cassettes/can_success_create_new_checklist_to_a_card.yml +189 -0
  115. data/spec/cassettes/can_success_delete_a_custom_field_option.yml +389 -0
  116. data/spec/cassettes/can_success_delete_card.yml +185 -0
  117. data/spec/cassettes/can_success_delete_checklist.yml +284 -0
  118. data/spec/cassettes/can_success_get_card_of_board_by_card_id.yml +188 -0
  119. data/spec/cassettes/can_success_remove_member_from_board.yml +186 -0
  120. data/spec/cassettes/can_success_return_all_boards_of_current_user.yml +195 -0
  121. data/spec/cassettes/can_success_upate_a_board.yml +191 -0
  122. data/spec/cassettes/can_success_upate_a_card.yml +189 -0
  123. data/spec/cassettes/can_success_upate_a_list.yml +296 -0
  124. data/spec/cassettes/can_success_update_bong_a_board.yml +283 -0
  125. data/spec/cassettes/can_success_update_bong_a_board_with_specific_fields.yml +284 -0
  126. data/spec/cassettes/can_success_update_bong_a_card.yml +191 -0
  127. data/spec/cassettes/can_success_update_bong_a_checklist_with_specific_fields.yml +296 -0
  128. data/spec/cassettes/can_success_update_bong_a_custom_field.yml +200 -0
  129. data/spec/cassettes/can_success_update_bong_a_label.yml +200 -0
  130. data/spec/cassettes/can_success_update_bong_a_list.yml +199 -0
  131. data/spec/cassettes/can_success_update_bong_a_list_with_specific_fields.yml +296 -0
  132. data/spec/cassettes/can_success_update_bong_a_organization.yml +203 -0
  133. data/spec/cassettes/can_success_update_bong_a_webhook.yml +296 -0
  134. data/spec/cassettes/can_upvote_on_a_card.yml +469 -0
  135. data/spec/cassettes/card_find_with_id_and_get_all_fields.yml +95 -0
  136. data/spec/cassettes/card_find_with_id_and_get_specific_fields.yml +96 -0
  137. data/spec/cassettes/checklist_can_add_an_item.yml +296 -0
  138. data/spec/cassettes/checklist_can_update_the_item_state.yml +296 -0
  139. data/spec/cassettes/checklist_find_with_id_and_get_all_fields.yml +100 -0
  140. data/spec/cassettes/comment_delete.yml +331 -0
  141. data/spec/cassettes/comment_find_with_id.yml +116 -0
  142. data/spec/cassettes/custom_field_find_with_id_and_get_all_fields.yml +100 -0
  143. data/spec/cassettes/custom_field_find_with_id_and_get_specific_fields.yml +100 -0
  144. data/spec/cassettes/custom_field_item_save_1.yml +97 -0
  145. data/spec/cassettes/custom_field_item_save_2.yml +281 -0
  146. data/spec/cassettes/custom_field_option_find_with_id.yml +100 -0
  147. data/spec/cassettes/get_board_of_card.yml +187 -0
  148. data/spec/cassettes/get_board_of_list.yml +197 -0
  149. data/spec/cassettes/get_boards_of_member.yml +207 -0
  150. data/spec/cassettes/get_check_item_states_of_card.yml +188 -0
  151. data/spec/cassettes/get_checklists_of_card.yml +187 -0
  152. data/spec/cassettes/get_cover_image_of_card.yml +187 -0
  153. data/spec/cassettes/get_custom_field_items_of_card.yml +187 -0
  154. data/spec/cassettes/get_list_of_card.yml +188 -0
  155. data/spec/cassettes/get_lists.yml +187 -0
  156. data/spec/cassettes/get_members_of_card.yml +189 -0
  157. data/spec/cassettes/get_plugin_data_of_card.yml +187 -0
  158. data/spec/cassettes/get_voters_of_card.yml +188 -0
  159. data/spec/cassettes/label_delete.yml +285 -0
  160. data/spec/cassettes/label_find_with_id.yml +100 -0
  161. data/spec/cassettes/list_find_with_id_and_get_all_fields.yml +100 -0
  162. data/spec/cassettes/list_find_with_id_and_get_specific_fields.yml +100 -0
  163. data/spec/cassettes/member_find_with_id_and_get_all_fields.yml +101 -0
  164. data/spec/cassettes/member_find_with_id_and_get_specific_fields.yml +100 -0
  165. data/spec/cassettes/notification_find_with_id.yml +103 -0
  166. data/spec/cassettes/organization_find_with_id_and_get_all_fields.yml +102 -0
  167. data/spec/cassettes/organization_find_with_id_and_get_specific_fields.yml +100 -0
  168. data/spec/cassettes/remove_upvote_on_a_card_when_have_not_voted.yml +366 -0
  169. data/spec/cassettes/revote_on_a_card.yml +464 -0
  170. data/spec/cassettes/token_find_with_token_string.yml +100 -0
  171. data/spec/cassettes/webhook_delete.yml +286 -0
  172. data/spec/cassettes/webhook_find_with_id.yml +100 -0
  173. data/spec/checklist_spec.rb +27 -43
  174. data/spec/custom_field_item_spec.rb +74 -0
  175. data/spec/custom_field_option_spec.rb +2 -2
  176. data/spec/custom_field_spec.rb +98 -10
  177. data/spec/integration/action/find_spec.rb +23 -0
  178. data/spec/integration/basic_data/many_spec.rb +127 -0
  179. data/spec/integration/basic_data/one_spec.rb +84 -0
  180. data/spec/integration/basic_data/schema_spec.rb +156 -0
  181. data/spec/integration/board/add_member_spec.rb +21 -0
  182. data/spec/integration/board/all_spec.rb +20 -0
  183. data/spec/integration/board/associations/actions_spec.rb +18 -0
  184. data/spec/integration/board/associations/cards_spec.rb +18 -0
  185. data/spec/integration/board/associations/checklists_spec.rb +18 -0
  186. data/spec/integration/board/associations/custom_fields_spec.rb +18 -0
  187. data/spec/integration/board/associations/label_names_spec.rb +17 -0
  188. data/spec/integration/board/associations/labels_spec.rb +18 -0
  189. data/spec/integration/board/associations/lists_spec.rb +18 -0
  190. data/spec/integration/board/associations/members_spec.rb +18 -0
  191. data/spec/integration/board/associations/organization_spec.rb +19 -0
  192. data/spec/integration/board/associations/plugin_data_spec.rb +18 -0
  193. data/spec/integration/board/create_spec.rb +95 -0
  194. data/spec/integration/board/find_card_spec.rb +18 -0
  195. data/spec/integration/board/find_spec.rb +42 -0
  196. data/spec/integration/board/remove_member_spec.rb +21 -0
  197. data/spec/integration/board/save_spec.rb +37 -0
  198. data/spec/integration/board/update!_spec.rb +62 -0
  199. data/spec/integration/board_lists_spec.rb +21 -0
  200. data/spec/integration/card/add_and_remove_attachment_spec.rb +45 -0
  201. data/spec/integration/card/add_and_remove_label_spec.rb +35 -0
  202. data/spec/integration/card/add_checklist_spec.rb +32 -0
  203. data/spec/integration/card/add_comment_spec.rb +19 -0
  204. data/spec/integration/card/add_memeber_spec.rb +19 -0
  205. data/spec/integration/card/associations/actions_spec.rb +17 -0
  206. data/spec/integration/card/associations/attachments_spec.rb +18 -0
  207. data/spec/integration/card/associations/board_spec.rb +17 -0
  208. data/spec/integration/card/associations/check_item_states_spec.rb +17 -0
  209. data/spec/integration/card/associations/checklists_spec.rb +18 -0
  210. data/spec/integration/card/associations/comments_spec.rb +19 -0
  211. data/spec/integration/card/associations/cover_image_spec.rb +18 -0
  212. data/spec/integration/card/associations/custom_field_items_spec.rb +18 -0
  213. data/spec/integration/card/associations/list_spec.rb +16 -0
  214. data/spec/integration/card/associations/members_spec.rb +18 -0
  215. data/spec/integration/card/associations/plugin_data_spec.rb +18 -0
  216. data/spec/integration/card/associations/voters_spec.rb +17 -0
  217. data/spec/integration/card/close!_spec.rb +16 -0
  218. data/spec/integration/card/create_new_check_list_spec.rb +19 -0
  219. data/spec/integration/card/create_spec.rb +84 -0
  220. data/spec/integration/card/delete_spec.rb +16 -0
  221. data/spec/integration/card/find_spec.rb +67 -0
  222. data/spec/integration/card/move_to_board_spec.rb +36 -0
  223. data/spec/integration/card/move_to_list_spec.rb +20 -0
  224. data/spec/integration/card/remove_member_spec.rb +19 -0
  225. data/spec/integration/card/save_spec.rb +61 -0
  226. data/spec/integration/card/update!_spec.rb +53 -0
  227. data/spec/integration/card/vote_spec.rb +50 -0
  228. data/spec/integration/checklist/add_item_spec.rb +20 -0
  229. data/spec/integration/checklist/create_spec.rb +23 -0
  230. data/spec/integration/checklist/delete_spec.rb +17 -0
  231. data/spec/integration/checklist/find_spec.rb +22 -0
  232. data/spec/integration/checklist/update!_spec.rb +21 -0
  233. data/spec/integration/checklist/update_item_state_spec.rb +20 -0
  234. data/spec/integration/comment/association/board_spec.rb +17 -0
  235. data/spec/integration/comment/association/card_spec.rb +17 -0
  236. data/spec/integration/comment/association/list_spec.rb +17 -0
  237. data/spec/integration/comment/delete_spec.rb +20 -0
  238. data/spec/integration/comment/find_spec.rb +17 -0
  239. data/spec/integration/custom_field/association/board_spec.rb +18 -0
  240. data/spec/integration/custom_field/association/custom_field_options_spec.rb +18 -0
  241. data/spec/integration/custom_field/create_spec.rb +29 -0
  242. data/spec/integration/custom_field/find_spec.rb +41 -0
  243. data/spec/integration/custom_field/update!_spec.rb +25 -0
  244. data/spec/integration/custom_field_item_spec.rb +47 -0
  245. data/spec/integration/custom_field_option/create_spec.rb +23 -0
  246. data/spec/integration/custom_field_option/delete_spec.rb +19 -0
  247. data/spec/integration/custom_field_option/find_spec.rb +21 -0
  248. data/spec/integration/label/association/board_spec.rb +18 -0
  249. data/spec/integration/label/create_spec.rb +23 -0
  250. data/spec/integration/label/delete_spec.rb +21 -0
  251. data/spec/integration/label/find_spec.rb +20 -0
  252. data/spec/integration/label/update!_spec.rb +25 -0
  253. data/spec/integration/list/archive_all_cards_spec.rb +20 -0
  254. data/spec/integration/list/associations/actions_spec.rb +18 -0
  255. data/spec/integration/list/associations/board_spec.rb +18 -0
  256. data/spec/integration/list/associations/cards_spec.rb +18 -0
  257. data/spec/integration/list/create_spec.rb +44 -0
  258. data/spec/integration/list/find_spec.rb +37 -0
  259. data/spec/integration/list/move_all_cards_spec.rb +31 -0
  260. data/spec/integration/list/save_spec.rb +40 -0
  261. data/spec/integration/list/update!_spec.rb +43 -0
  262. data/spec/integration/member/associations/actions_spec.rb +17 -0
  263. data/spec/integration/member/associations/boards_spec.rb +18 -0
  264. data/spec/integration/member/associations/cards_spec.rb +18 -0
  265. data/spec/integration/member/associations/notifications_spec.rb +18 -0
  266. data/spec/integration/member/associations/organizations_spec.rb +18 -0
  267. data/spec/integration/member/find_spec.rb +39 -0
  268. data/spec/integration/member/update!_spec.rb +18 -0
  269. data/spec/integration/notification/find_spec.rb +27 -0
  270. data/spec/integration/organization/associations/actions_spec.rb +18 -0
  271. data/spec/integration/organization/associations/boards_spec.rb +18 -0
  272. data/spec/integration/organization/associations/members_spec.rb +18 -0
  273. data/spec/integration/organization/create_spec.rb +23 -0
  274. data/spec/integration/organization/find_spec.rb +37 -0
  275. data/spec/integration/organization/update!_spec.rb +28 -0
  276. data/spec/integration/token/find_spec.rb +24 -0
  277. data/spec/integration/webhook/create_spec.rb +27 -0
  278. data/spec/integration/webhook/delete_spec.rb +21 -0
  279. data/spec/integration/webhook/find_spec.rb +22 -0
  280. data/spec/integration/webhook/update!_spec.rb +24 -0
  281. data/spec/item_spec.rb +2 -2
  282. data/spec/label_spec.rb +105 -28
  283. data/spec/list_spec.rb +32 -14
  284. data/spec/notification_spec.rb +3 -3
  285. data/spec/organization_spec.rb +6 -5
  286. data/spec/spec_helper.rb +70 -37
  287. data/spec/token_spec.rb +10 -11
  288. data/spec/unit/trello/association_builder/has_many_spec.rb +36 -0
  289. data/spec/unit/trello/association_builder/has_one_spec.rb +36 -0
  290. data/spec/unit/trello/association_fetcher/has_many/fetch_spec.rb +38 -0
  291. data/spec/unit/trello/association_fetcher/has_many/params_spec.rb +107 -0
  292. data/spec/unit/trello/association_fetcher/has_many_spec.rb +50 -0
  293. data/spec/unit/trello/association_fetcher/has_one/fetch_spec.rb +51 -0
  294. data/spec/unit/trello/association_fetcher/has_one/params_spec.rb +81 -0
  295. data/spec/unit/trello/association_fetcher/has_one_spec.rb +49 -0
  296. data/spec/unit/trello/association_infer_tool_spec.rb +41 -0
  297. data/spec/unit/trello/basic_data_spec.rb +113 -0
  298. data/spec/unit/trello/board/new_spec.rb +370 -0
  299. data/spec/unit/trello/board/save_spec.rb +49 -0
  300. data/spec/unit/trello/board/update_fields_spec.rb +129 -0
  301. data/spec/unit/trello/board/update_spec.rb +197 -0
  302. data/spec/unit/trello/card_spec.rb +103 -0
  303. data/spec/unit/trello/member/new_spec.rb +62 -0
  304. data/spec/unit/trello/member/update_fields_spec.rb +80 -0
  305. data/spec/unit/trello/schema/attribute/base_spec.rb +349 -0
  306. data/spec/unit/trello/schema/attribute/board_pref_spec.rb +208 -0
  307. data/spec/unit/trello/schema/attribute/default_spec.rb +236 -0
  308. data/spec/unit/trello/schema/attribute_builder_spec.rb +55 -0
  309. data/spec/unit/trello/schema/attribute_registration_spec.rb +59 -0
  310. data/spec/unit/trello/schema/serializer/default_spec.rb +19 -0
  311. data/spec/unit/trello/schema/serializer/time_spec.rb +39 -0
  312. data/spec/unit/trello/schema_spec.rb +25 -0
  313. data/spec/webhook_spec.rb +23 -7
  314. metadata +556 -33
@@ -5,86 +5,33 @@ module Trello
5
5
  # @return [String]
6
6
  # @!attribute [r] description
7
7
  # @return [String]
8
- # @!attribute [r] id_model
8
+ # @!attribute [r] model_id
9
9
  # @return [String] A 24-character hex string
10
10
  # @!attribute [r] callback_url
11
11
  # @return [String]
12
12
  # @!attribute [r] active
13
13
  # @return [Boolean]
14
+ # @!attribute [r] consecutive_failures
15
+ # @return [Integer]
16
+ # @!attribute [r] first_consecutive_fail_date
17
+ # @return [Datetime]
14
18
  class Webhook < BasicData
15
- register_attributes :id, :description, :id_model, :callback_url, :active,
16
- readonly: [ :id ]
17
- validates_presence_of :id, :id_model, :callback_url
18
- validates_length_of :description, in: 1..16384
19
19
 
20
- class << self
21
- # Find a specific webhook by its ID.
22
- #
23
- # @raise [Trello::Error] if a Webhook with the given ID can't be found.
24
- # @return [Trello::Webhook] the Webhook with the given ID.
25
- def find(id, params = {})
26
- client.find(:webhook, id, params)
27
- end
28
-
29
- # Create a new webhook and save it to Trello.
30
- #
31
- # @param [Hash] options
32
- #
33
- # @option options [String] :description (optional) A string with a length from 0 to 16384
34
- # @option options [String] :callback_url (required) A valid URL that is
35
- # reachable with a HEAD request
36
- # @option options [String] :id_model (required) id of the model that should be hooked
37
- #
38
- # @raise [Trello::Error] if the Webhook could not be created.
39
- #
40
- # @return [Trello::Webhook]
41
- def create(options)
42
- client.create(:webhook,
43
- 'description' => options[:description],
44
- 'idModel' => options[:id_model],
45
- 'callbackURL' => options[:callback_url])
46
- end
47
- end
48
-
49
- # @return [Trello::Webhook] self
50
- def update_fields(fields)
51
- attributes[:id] = fields['id'] || attributes[:id]
52
- attributes[:description] = fields['description'] || fields[:description] || attributes[:description]
53
- attributes[:id_model] = fields['idModel'] || fields[:id_model] || attributes[:id_model]
54
- attributes[:callback_url] = fields['callbackURL'] || fields[:callback_url] || attributes[:callback_url]
55
- attributes[:active] = fields['active'] if fields.has_key?('active')
56
- self
20
+ schema do
21
+ # Readonly
22
+ attribute :id, readonly: true, primary_key: true
23
+ attribute :consecutive_failures, readonly: true, remote_key: 'consecutiveFailures'
24
+ attribute :first_consecutive_fail_date, readonly: true, remote_key: 'firstConsecutiveFailDate', serializer: 'Time'
25
+
26
+ # Writable
27
+ attribute :description
28
+ attribute :model_id, remote_key: 'idModel'
29
+ attribute :callback_url, remote_key: 'callbackURL'
30
+ attribute :active
57
31
  end
58
32
 
59
- # Save the webhook.
60
- #
61
- # @raise [Trello::Error] if the Webhook could not be saved.
62
- #
63
- # @return [String] the JSON representation of the saved webhook.
64
- def save
65
- # If we have an id, just update our fields.
66
- return update! if id
67
-
68
- from_response client.post("/webhooks", {
69
- description: description,
70
- idModel: id_model,
71
- callbackURL: callback_url
72
- })
73
- end
74
-
75
- # Update the webhook.
76
- #
77
- # @raise [Trello::Error] if the Webhook could not be saved.
78
- #
79
- # @return [String] the JSON representation of the updated webhook.
80
- def update!
81
- client.put("/webhooks/#{id}", {
82
- description: description,
83
- idModel: id_model,
84
- callbackURL: callback_url,
85
- active: active
86
- })
87
- end
33
+ validates_presence_of :id, :model_id, :callback_url
34
+ validates_length_of :description, in: 1..16384
88
35
 
89
36
  # Delete this webhook
90
37
  #
data/lib/trello.rb CHANGED
@@ -1,12 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'oauth'
2
4
  require 'json'
3
5
  require 'logger'
4
6
  require 'active_model'
5
7
  require 'addressable/uri'
8
+ require 'active_support/core_ext/hash/indifferent_access'
6
9
 
7
- # Ruby wrapper around the Trello[http://trello.com] API
10
+ # Ruby wrapper around the [Trello] API
8
11
  #
9
- # First, set up your key information. You can get this information by {clicking here}[https://trello.com/1/appKey/generate].
12
+ # First, set up your key information. You can get this information by [clicking here][trello-app-key].
10
13
  #
11
14
  # You can get the key by going to this url in your browser:
12
15
  # https://trello.com/1/authorize?key=TRELLO_CONSUMER_KEY_FROM_ABOVE&name=MyApp&response_type=token&scope=read,write,account&expiration=never
@@ -35,45 +38,61 @@ require 'addressable/uri'
35
38
  #
36
39
  # And so much more. Consult the rest of the documentation for more information.
37
40
  #
38
- # Feel free to {peruse and participate in our Trello board}[https://trello.com/board/ruby-trello/4f092b2ee23cb6fe6d1aaabd]. It's completely open to the public.
41
+ # Feel free to [peruse and participate in our Trello board][ruby-trello-board]. It's completely open to the public.
42
+ #
43
+ # [trello]: http://trello.com
44
+ # [trello-app-key]: https://trello.com/app-key
45
+ # [ruby-trello-board]: https://trello.com/board/ruby-trello/4f092b2ee23cb6fe6d1aaabd
39
46
  module Trello
40
- autoload :Error, 'trello/error'
41
- autoload :Action, 'trello/action'
42
- autoload :Comment, 'trello/comment'
43
- autoload :Association, 'trello/association'
44
- autoload :AssociationProxy, 'trello/association_proxy'
45
- autoload :Attachment, 'trello/attachment'
46
- autoload :CoverImage, 'trello/cover_image'
47
- autoload :BasicData, 'trello/basic_data'
48
- autoload :Board, 'trello/board'
49
- autoload :Card, 'trello/card'
50
- autoload :Checklist, 'trello/checklist'
51
- autoload :Client, 'trello/client'
52
- autoload :Configuration, 'trello/configuration'
53
- autoload :CustomField, 'trello/custom_field'
54
- autoload :CustomFieldItem, 'trello/custom_field_item'
55
- autoload :CustomFieldOption, 'trello/custom_field_option'
56
- autoload :HasActions, 'trello/has_actions'
57
- autoload :Item, 'trello/item'
58
- autoload :CheckItemState, 'trello/item_state'
59
- autoload :Label, 'trello/label'
60
- autoload :LabelName, 'trello/label_name'
61
- autoload :List, 'trello/list'
62
- autoload :Member, 'trello/member'
63
- autoload :MultiAssociation, 'trello/multi_association'
64
- autoload :Notification, 'trello/notification'
65
- autoload :Organization, 'trello/organization'
66
- autoload :PluginDatum, 'trello/plugin_datum'
67
- autoload :Request, 'trello/net'
68
- autoload :TInternet, 'trello/net'
69
- autoload :Token, 'trello/token'
70
- autoload :Webhook, 'trello/webhook'
71
- autoload :JsonUtils, 'trello/json_utils'
47
+ autoload :Error, 'trello/error'
48
+ autoload :Action, 'trello/action'
49
+ autoload :Comment, 'trello/comment'
50
+ autoload :Association, 'trello/association'
51
+ autoload :AssociationProxy, 'trello/association_proxy'
52
+ autoload :Attachment, 'trello/attachment'
53
+ autoload :CoverImage, 'trello/cover_image'
54
+ autoload :BasicData, 'trello/basic_data'
55
+ autoload :Board, 'trello/board'
56
+ autoload :Card, 'trello/card'
57
+ autoload :Checklist, 'trello/checklist'
58
+ autoload :Client, 'trello/client'
59
+ autoload :Configuration, 'trello/configuration'
60
+ autoload :CustomField, 'trello/custom_field'
61
+ autoload :CustomFieldItem, 'trello/custom_field_item'
62
+ autoload :CustomFieldOption, 'trello/custom_field_option'
63
+ autoload :HasActions, 'trello/has_actions'
64
+ autoload :Item, 'trello/item'
65
+ autoload :CheckItemState, 'trello/item_state'
66
+ autoload :Label, 'trello/label'
67
+ autoload :LabelName, 'trello/label_name'
68
+ autoload :List, 'trello/list'
69
+ autoload :Member, 'trello/member'
70
+ autoload :MultiAssociation, 'trello/multi_association'
71
+ autoload :Notification, 'trello/notification'
72
+ autoload :Organization, 'trello/organization'
73
+ autoload :PluginDatum, 'trello/plugin_datum'
74
+ autoload :Request, 'trello/net'
75
+ autoload :TInternet, 'trello/net'
76
+ autoload :Token, 'trello/token'
77
+ autoload :Webhook, 'trello/webhook'
78
+ autoload :JsonUtils, 'trello/json_utils'
79
+ autoload :AssociationInferTool, 'trello/association_infer_tool'
80
+ autoload :Schema, 'trello/schema'
72
81
 
73
82
  module Authorization
74
- autoload :AuthPolicy, 'trello/authorization'
75
- autoload :BasicAuthPolicy, 'trello/authorization'
76
- autoload :OAuthPolicy, 'trello/authorization'
83
+ autoload :AuthPolicy, 'trello/authorization'
84
+ autoload :BasicAuthPolicy, 'trello/authorization'
85
+ autoload :OAuthPolicy, 'trello/authorization'
86
+ end
87
+
88
+ module AssociationFetcher
89
+ autoload :HasMany, 'trello/association_fetcher/has_many'
90
+ autoload :HasOne, 'trello/association_fetcher/has_one'
91
+ end
92
+
93
+ module AssociationBuilder
94
+ autoload :HasMany, 'trello/association_builder/has_many'
95
+ autoload :HasOne, 'trello/association_builder/has_one'
77
96
  end
78
97
 
79
98
  # Version of the Trello API that we use by default.
@@ -116,7 +135,6 @@ module Trello
116
135
 
117
136
  # Url to token for making authorized requests to the Trello API
118
137
  #
119
- # @param [String, #read] contents the contents to reverse
120
138
  # @param options [Hash] Repository information to update
121
139
  # @option options [String] :name Name of the application
122
140
  # @option options [String] :key Application key
data/spec/action_spec.rb CHANGED
@@ -116,7 +116,7 @@ module Trello
116
116
  before do
117
117
  allow(client)
118
118
  .to receive(:get)
119
- .with('/members/abcdef123456789123456789', {})
119
+ .with('/actions/4ee2482134a81a757a08af47/memberCreator')
120
120
  .and_return user_payload
121
121
  end
122
122
 
@@ -131,8 +131,7 @@ module Trello
131
131
  'id' => 'id',
132
132
  'type' => 'type',
133
133
  'data' => 'data',
134
- 'idMemberCreator' => 'member_creator_id',
135
- 'member' => 'member_participant'
134
+ 'idMemberCreator' => 'creator_id'
136
135
  }
137
136
 
138
137
  action = Action.new(expected)
data/spec/board_spec.rb CHANGED
@@ -6,7 +6,7 @@ module Trello
6
6
 
7
7
  let(:board) { client.find(:board, 'abcdef123456789123456789') }
8
8
  let(:client) { Client.new }
9
- let(:member) { Member.new(user_payload) }
9
+ let(:member) { Member.new(JSON.parse(user_payload)) }
10
10
 
11
11
  before do
12
12
  allow(client)
@@ -21,7 +21,7 @@ module Trello
21
21
  it "delegates to client#find" do
22
22
  expect(client)
23
23
  .to receive(:find)
24
- .with(:board, 'abcdef123456789123456789', {})
24
+ .with('board', 'abcdef123456789123456789', {})
25
25
 
26
26
  Board.find('abcdef123456789123456789')
27
27
  end
@@ -31,6 +31,35 @@ module Trello
31
31
  end
32
32
  end
33
33
 
34
+ describe '.create' do
35
+ before { allow(Board).to receive(:client).and_return(client) }
36
+
37
+ it 'will call create on client with correct parameters' do
38
+ params = {
39
+ name: 'Board Name',
40
+ use_default_labels: true,
41
+ use_default_lists: true,
42
+ description: 'description...',
43
+ organization_id: 11111,
44
+ source_board_id: 22222,
45
+ keep_cards_from_source: true,
46
+ power_ups: 'all',
47
+ visibility_level: 'org',
48
+ voting_permission_level: 'org',
49
+ comment_permission_level: 'org',
50
+ invitation_permission_level: 'admins',
51
+ enable_self_join: true,
52
+ enable_card_covers: true,
53
+ background_color: 'orange',
54
+ card_aging_type: 'pirate'
55
+ }
56
+
57
+ expect(client).to receive(:create).with('board', params)
58
+
59
+ Board.create(params)
60
+ end
61
+ end
62
+
34
63
  context "self.all" do
35
64
  let(:client) { Trello.client }
36
65
 
@@ -133,12 +162,10 @@ module Trello
133
162
  expect(labels[2].id).to eq('cbcdef123456789123456789')
134
163
  expect(labels[2].board_id).to eq('abcdef123456789123456789')
135
164
  expect(labels[2].name).to eq('deploy')
136
- expect(labels[2].uses).to eq(2)
137
165
  expect(labels[3].color).to eq('blue')
138
166
  expect(labels[3].id).to eq('dbcdef123456789123456789')
139
167
  expect(labels[3].board_id).to eq('abcdef123456789123456789')
140
168
  expect(labels[3].name).to eq('on hold')
141
- expect(labels[3].uses).to eq(6)
142
169
  end
143
170
 
144
171
  it "passes the label limit" do
@@ -170,7 +197,7 @@ module Trello
170
197
  it "adds a member to the board as a normal user (default)" do
171
198
  expect(client)
172
199
  .to receive(:put)
173
- .with("/boards/abcdef123456789123456789/members/id", type: :normal)
200
+ .with("/boards/abcdef123456789123456789/members/#{member.id}", type: :normal)
174
201
 
175
202
  board.add_member(member)
176
203
  end
@@ -178,7 +205,7 @@ module Trello
178
205
  it "adds a member to the board as an admin" do
179
206
  expect(client)
180
207
  .to receive(:put)
181
- .with("/boards/abcdef123456789123456789/members/id", type: :admin)
208
+ .with("/boards/abcdef123456789123456789/members/#{member.id}", type: :admin)
182
209
 
183
210
  board.add_member(member, :admin)
184
211
  end
@@ -193,7 +220,7 @@ module Trello
193
220
  it "removes a member from the board" do
194
221
  expect(client)
195
222
  .to receive(:delete)
196
- .with("/boards/abcdef123456789123456789/members/id")
223
+ .with("/boards/abcdef123456789123456789/members/#{member.id}")
197
224
 
198
225
  board.remove_member(member)
199
226
  end
@@ -264,62 +291,15 @@ module Trello
264
291
  end
265
292
  end
266
293
 
267
- it "is not closed" do
268
- expect(board).not_to be_closed
269
- end
270
-
271
- it "is not starred" do
272
- expect(board).not_to be_starred
273
- end
274
-
275
- describe "#update_fields" do
276
- it "does not set any fields when the fields argument is empty" do
277
- expected = {
278
- 'id' => "id",
279
- 'name' => "name",
280
- 'desc' => "desc",
281
- 'closed' => false,
282
- 'starred' => false,
283
- 'url' => "url",
284
- 'idOrganization' => "org_id"
285
- }
286
-
287
- board = Board.new(expected)
288
- board.client = client
289
-
290
- board.update_fields({})
291
-
292
- expected.each_pair do |key, value|
293
- if board.respond_to?(key)
294
- expect(board.send(key)).to eq value
295
- end
296
- end
297
-
298
- expect(board.description).to eq expected['desc']
299
- expect(board.organization_id).to eq expected['idOrganization']
300
- end
301
-
302
- it "initializes all fields from response-like formatted hash" do
303
- board_details = boards_details.first
304
- board = Board.new(board_details)
305
- expect(board.id).to eq board_details['id']
306
- expect(board.name).to eq board_details['name']
307
- expect(board.description).to eq board_details['desc']
308
- expect(board.closed).to eq board_details['closed']
309
- expect(board.starred).to eq board_details['starred']
310
- expect(board.organization_id).to eq board_details['idOrganization']
311
- expect(board.url).to eq board_details['url']
312
- expect(board.last_activity_date).to eq board_details['dateLastActivity']
294
+ describe '#closed?' do
295
+ it "returns the closed attribute" do
296
+ expect(board.closed?).to be_falsy
313
297
  end
298
+ end
314
299
 
315
- it "initializes all fields from options-like formatted hash" do
316
- board_details = boards_details[1]
317
- board = Board.new(board_details)
318
- expect(board.name).to eq board_details[:name]
319
- expect(board.description).to eq board_details[:desc]
320
- expect(board.closed).to eq board_details[:closed]
321
- expect(board.starred).to eq board_details[:starred]
322
- expect(board.organization_id).to eq board_details[:organization_id]
300
+ describe '#starred?' do
301
+ it "returns the starred attribute" do
302
+ expect(board.starred?).to be_falsy
323
303
  end
324
304
  end
325
305
 
@@ -342,17 +322,6 @@ module Trello
342
322
  }.to raise_error(Trello::ConfigurationError)
343
323
  end
344
324
 
345
- it "puts all fields except id" do
346
- expected_fields = %w{ name description closed starred idOrganization}.map { |s| s.to_sym }
347
-
348
- expect(client).to receive(:put) do |anything, body|
349
- expect(body.keys).to match expected_fields
350
- any_board_json
351
- end
352
-
353
- Board.new('id' => "xxx").save
354
- end
355
-
356
325
  it "mutates the current instance" do
357
326
  allow(client)
358
327
  .to receive(:put)
@@ -366,7 +335,7 @@ module Trello
366
335
  expected_resource_id = "xxx_board_id_xxx"
367
336
 
368
337
  expect(client).to receive(:put) do |path, anything|
369
- expect(path).to match(/#{expected_resource_id}\/\z/)
338
+ expect(path).to match(/#{expected_resource_id}\z/)
370
339
  any_board_json
371
340
  end
372
341
 
@@ -376,35 +345,6 @@ module Trello
376
345
  it "saves OR updates depending on whether or not it has an id set"
377
346
  end
378
347
 
379
- describe '#update!' do
380
- let(:client) { Trello.client }
381
-
382
- let(:any_board_json) do
383
- JSON.generate(boards_details.first)
384
- end
385
-
386
- it "puts basic attributes" do
387
- board = Board.new 'id' => "board_id"
388
-
389
- board.name = "new name"
390
- board.description = "new description"
391
- board.closed = true
392
- board.starred = true
393
-
394
- expect(client)
395
- .to receive(:put)
396
- .with("/boards/#{board.id}/", {
397
- name: "new name",
398
- description: "new description",
399
- closed: true,
400
- starred: true,
401
- idOrganization: nil })
402
- .and_return any_board_json
403
-
404
- board.update!
405
- end
406
- end
407
-
408
348
  describe "Repository" do
409
349
  include Helpers
410
350
 
@@ -421,7 +361,7 @@ module Trello
421
361
 
422
362
  it "creates a new board with whatever attributes are supplied " do
423
363
  expected_attributes = { name: "Any new board name", description: "Any new board desription" }
424
- sent_attributes = { name: expected_attributes[:name], desc: expected_attributes[:description] }
364
+ sent_attributes = { 'name' => expected_attributes[:name], 'desc' => expected_attributes[:description] }
425
365
 
426
366
  expect(client)
427
367
  .to receive(:post)