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
@@ -10,33 +10,40 @@ module Trello
10
10
  # @return [Datetime]
11
11
  # @!attribute [rw] data
12
12
  # @return [Object]
13
- # @!attribute [r] member_creator_id,
13
+ # @!attribute [r] creator_id
14
14
  # @return [String]
15
+ # @!attribute [r] creator_app
16
+ # @return [String]
17
+ # @!attribute [r] action_id
18
+ # @return [String]
19
+ # @!attribute [r] is_reactable
20
+ # @return [Boolean]
21
+ # @!attribute [r] read_at
22
+ # @return [Datetime]
23
+ # @!attribute [r] reactions
24
+ # @return [Array]
15
25
  class Notification < BasicData
16
- register_attributes :id, :unread, :type, :date, :data, :member_creator_id,
17
- read_only: [ :id, :unread, :type, :date, :member_creator_id ]
18
- validates_presence_of :id, :type, :date, :member_creator_id
19
-
20
- class << self
21
- # Locate a notification by its id
22
- def find(id, params = {})
23
- client.find(:notification, id, params)
24
- end
25
- end
26
26
 
27
- def update_fields(fields)
28
- attributes[:id] = fields['id'] || attributes[:id]
29
- attributes[:unread] = fields['unread'] if fields.has_key?('unread')
30
- attributes[:type] = fields['type'] || attributes[:type]
31
- attributes[:date] = fields['date'] || attributes[:date]
32
- attributes[:data] = fields['data'] || attributes[:data]
33
- attributes[:member_creator_id] = fields['idMemberCreator'] || attributes[:member_creator_id]
34
- self
27
+ schema do
28
+ # Readonly
29
+ attribute :id, read_only: true
30
+ attribute :type, read_only: true
31
+ attribute :date, read_only: true
32
+ attribute :data, read_only: true
33
+ attribute :creator_app, read_only: true, remote_key: 'appCreator'
34
+ attribute :creator_id, read_only: true, remote_key: 'idMemberCreator'
35
+ attribute :action_id, read_only: true, remote_key: 'idAction'
36
+ attribute :is_reactable, read_only: true, remote_key: 'isReactable'
37
+ attribute :unread, read_only: true
38
+ attribute :read_at, read_only: true, remote_key: 'dateRead'
39
+ attribute :reactions, read_only: true
35
40
  end
36
41
 
42
+ validates_presence_of :id, :type, :date, :creator_id
43
+
37
44
  alias :unread? :unread
38
45
 
39
- one :member_creator, path: :members, via: Member, using: :member_creator_id
46
+ one :creator, path: :members, via: Member, using: :creator_id
40
47
 
41
48
  def board
42
49
  Board.from_response client.get("/notifications/#{id}/board")
@@ -11,13 +11,60 @@ module Trello
11
11
  # @return [String]
12
12
  # @!attribute [r] url
13
13
  # @return [String]
14
+ # @!attribute [r] team_type
15
+ # @return [String]
16
+ # @!attribute [r] desc_data
17
+ # @return [String]
18
+ # @!attribute [r] logo_hash
19
+ # @return [String]
20
+ # @!attribute [r] logo_url
21
+ # @return [String]
22
+ # @!attribute [r] power_ups
23
+ # @return [Array]
24
+ # @!attribute [r] website
25
+ # @return [String]
26
+ # @!attribute [w] google_app_domain
27
+ # @return [String]
28
+ # @!attribute [w] google_app_version
29
+ # @return [String]
30
+ # @!attribute [w] enable_add_external_members
31
+ # @return [Boolean]
32
+ # @!attribute [w] private_board_creation_permission_level
33
+ # @return [String]
34
+ # @!attribute [w] organization_visible_board_creation_permission_level
35
+ # @return [String]
36
+ # @!attribute [w] public_board_creation_permission_level
37
+ # @return [String]
38
+ # @!attribute [w] visibility_level
39
+ # @return [String]
14
40
  class Organization < BasicData
15
- register_attributes :id, :name, :display_name, :description, :url, :invited,
16
- :website, :logo_hash, :billable_member_count, :active_billable_member_count,
17
- :memberships,
18
- readonly: [ :id, :name, :display_name, :description, :url, :invited,
19
- :website, :logo_hash, :billable_member_count, :active_billable_member_count,
20
- :memberships ]
41
+ schema do
42
+ # Readonly
43
+ attribute :id, readonly: true, primary_key: true
44
+ attribute :team_type, readonly: true, remote_key: 'teamType'
45
+ attribute :url, readonly: true
46
+ attribute :desc_data, readonly: true, remote_key: 'descData'
47
+ attribute :logo_hash, readonly: true, remote_key: 'logoHash'
48
+ attribute :logo_url, readonly: true, remote_key: 'logoUrl'
49
+ attribute :products, readonly: true
50
+ attribute :power_ups, readonly: true, remote_key: 'powerUps'
51
+
52
+ # Writable
53
+ attribute :name
54
+ attribute :display_name, remote_key: 'displayName'
55
+ attribute :description, remote_key: 'desc'
56
+ attribute :website
57
+
58
+ # Writable but update only
59
+ attribute :google_app_domain, update_only: true, remote_key: 'associatedDomain', class_name: 'BoardPref'
60
+ attribute :google_app_version, update_only: true, remote_key: 'googleAppsVersion ', class_name: 'BoardPref'
61
+ attribute :enable_add_external_members, update_only: true, remote_key: 'externalMembersDisabled', class_name: 'BoardPref'
62
+ attribute :private_board_creation_permission_level, update_only: true, remote_key: 'boardVisibilityRestrict/private', class_name: 'BoardPref'
63
+ attribute :organization_visible_board_creation_permission_level, update_only: true, remote_key: 'boardVisibilityRestrict/org', class_name: 'BoardPref'
64
+ attribute :public_board_creation_permission_level, update_only: true, remote_key: 'boardVisibilityRestrict/public', class_name: 'BoardPref'
65
+ attribute :visibility_level, update_only: true, remote_key: 'permissionLevel ', class_name: 'BoardPref'
66
+ end
67
+
21
68
  validates_presence_of :id, :name
22
69
 
23
70
  include HasActions
@@ -29,25 +76,6 @@ module Trello
29
76
  end
30
77
  end
31
78
 
32
- # Update the fields of an organization.
33
- #
34
- # Supply a hash of string keyed data retrieved from the Trello API representing
35
- # an Organization.
36
- def update_fields(fields)
37
- attributes[:id] = fields['id'] || attributes[:id]
38
- attributes[:name] = fields['name'] || attributes[:name]
39
- attributes[:display_name] = fields['displayName'] || attributes[:display_name]
40
- attributes[:description] = fields['desc'] || attributes[:description]
41
- attributes[:url] = fields['url'] || attributes[:url]
42
- attributes[:invited] = fields['invited'] if fields.has_key?('invited')
43
- attributes[:website] = fields['website'] || attributes[:website]
44
- attributes[:logo_hash] = fields['logoHash'] || attributes[:logo_hash]
45
- attributes[:billable_member_count] = fields['billableMemberCount'] || attributes[:billable_member_count]
46
- attributes[:active_billable_member_count] = fields['activeBillableMemberCount'] || attributes[:active_billable_member_count]
47
- attributes[:memberships] = fields['memberships'] || attributes[:memberships]
48
- self
49
- end
50
-
51
79
  # Returns a list of boards under this organization.
52
80
  def boards
53
81
  boards = Board.from_response client.get("/organizations/#{id}/boards/all")
@@ -3,32 +3,27 @@ module Trello
3
3
  #
4
4
  # @!attribute id
5
5
  # @return [String]
6
- # @!attribute idPlugin
6
+ # @!attribute plugin_id
7
7
  # @return [String]
8
8
  # @!attribute scope
9
9
  # @return [String]
10
- # @!attribute idModel
10
+ # @!attribute model_id
11
11
  # @return [String]
12
12
  # @!attribute value
13
13
  # @return [String]
14
14
  # @!attribute access
15
15
  # @return [String]
16
- class PluginDatum < BasicData
17
- # Update the fields of a plugin.
18
- register_attributes :id, :idPlugin, :scope, :idModel, :value, :access
16
+ class PluginDatum < BasicData
19
17
 
20
-
21
- # Supply a hash of stringkeyed data retrieved from the Trello API representing
22
- # an attachment.
23
- def update_fields(fields)
24
- attributes[:id] = fields['id'] || attributes[:id]
25
- attributes[:idPlugin] = fields['idPlugin'] || attributes[:idPlugin]
26
- attributes[:scope] = fields['scope'] || attributes[:scope]
27
- attributes[:value] = JSON.parse(fields['value']).presence if fields.has_key?('value')
28
- attributes[:idModel] = fields['idModel'] || attributes[:idModel]
29
- attributes[:access] = fields['access'] || attributes[:access]
30
- self
18
+ schema do
19
+ attribute :id, readonly: true
20
+ attribute :plugin_id, readonly: true, remote_key: 'idPlugin'
21
+ attribute :scope, readonly: true
22
+ attribute :model_id, readonly: true, remote_key: 'idModel'
23
+ attribute :value, readonly: true, remote_key: 'value'
24
+ attribute :access, readonly: true
31
25
  end
26
+
32
27
  end
33
28
 
34
29
  end
@@ -0,0 +1,79 @@
1
+ module Trello
2
+ class Schema
3
+ module Attribute
4
+ class Base
5
+
6
+ attr_reader :name, :options, :serializer
7
+
8
+ def initialize(name:, options:, serializer:)
9
+ @name = name.to_sym
10
+ @options = options || {}
11
+ @serializer = serializer
12
+ end
13
+
14
+ def build_attributes(params, attributes)
15
+ raise 'Need override'
16
+ end
17
+
18
+ def build_pending_update_attributes(params, attributes)
19
+ params = params.with_indifferent_access
20
+
21
+ return attributes unless params.key?(remote_key) || params.key?(name)
22
+
23
+ build_attributes(params, attributes)
24
+ end
25
+
26
+ def build_payload_for_create(attributes, payload)
27
+ raise 'Need override'
28
+ end
29
+
30
+ def build_payload_for_update(attributes, payload)
31
+ raise 'Need override'
32
+ end
33
+
34
+ def readonly?
35
+ options[:readonly] == true
36
+ end
37
+
38
+ def update_only?
39
+ options[:update_only] == true
40
+ end
41
+
42
+ def create_only?
43
+ options[:create_only] == true
44
+ end
45
+
46
+ def primary_key?
47
+ return false unless options.key?(:primary_key)
48
+
49
+ options[:primary_key]
50
+ end
51
+
52
+ def for_action?(action)
53
+ case action
54
+ when :create
55
+ create_only? || (!update_only? && !readonly? && !primary_key?)
56
+ when :update
57
+ update_only? || primary_key? || (!create_only? && !readonly?)
58
+ else
59
+ false
60
+ end
61
+ end
62
+
63
+ def remote_key
64
+ (options[:remote_key] || name).to_s
65
+ end
66
+
67
+ def default
68
+ return nil unless options.key?(:default)
69
+
70
+ options[:default]
71
+ end
72
+
73
+ def register(model_klass)
74
+ AttributeRegistration.register(model_klass, self)
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,45 @@
1
+ module Trello
2
+ class Schema
3
+ module Attribute
4
+ class BoardPref < Base
5
+
6
+ def build_attributes(params, attributes)
7
+ attrs = attributes.with_indifferent_access
8
+ params = params.with_indifferent_access
9
+
10
+ value = if params.key?(:prefs)
11
+ params[:prefs][remote_key]
12
+ else
13
+ params[name]
14
+ end
15
+
16
+ attrs[name] = serializer.deserialize(value, default)
17
+ attrs
18
+ end
19
+
20
+ def build_payload_for_create(attributes, payload)
21
+ payload ||= {}
22
+ return payload unless for_action?(:create)
23
+ return payload unless attributes.key?(name)
24
+
25
+ value = attributes[name]
26
+ return payload if value.nil?
27
+
28
+ payload["prefs_#{remote_key}"] = serializer.serialize(value)
29
+ payload
30
+ end
31
+
32
+ def build_payload_for_update(attributes, payload)
33
+ payload ||= {}
34
+ return payload unless for_action?(:update)
35
+ return payload unless attributes.key?(name)
36
+
37
+ value = attributes[name]
38
+ payload["prefs/#{remote_key}"] = serializer.serialize(value)
39
+ payload
40
+ end
41
+
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,45 @@
1
+ module Trello
2
+ class Schema
3
+ module Attribute
4
+ class CustomFieldDisplay < Base
5
+
6
+ def build_attributes(params, attributes)
7
+ attrs = attributes.with_indifferent_access
8
+ params = params.with_indifferent_access
9
+
10
+ value = if params.key?(:display)
11
+ params[:display][remote_key]
12
+ else
13
+ params[name]
14
+ end
15
+
16
+ attrs[name] = serializer.deserialize(value, default)
17
+ attrs
18
+ end
19
+
20
+ def build_payload_for_create(attributes, payload)
21
+ payload ||= {}
22
+ return payload unless for_action?(:create)
23
+ return payload unless attributes.key?(name)
24
+
25
+ value = attributes[name]
26
+ return payload if value.nil?
27
+
28
+ payload["display_#{remote_key}"] = serializer.serialize(value)
29
+ payload
30
+ end
31
+
32
+ def build_payload_for_update(attributes, payload)
33
+ payload ||= {}
34
+ return payload unless for_action?(:update)
35
+ return payload unless attributes.key?(name)
36
+
37
+ value = attributes[name]
38
+ payload["display/#{remote_key}"] = serializer.serialize(value)
39
+ payload
40
+ end
41
+
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,45 @@
1
+ module Trello
2
+ class Schema
3
+ module Attribute
4
+ class Default < Base
5
+
6
+ def build_attributes(params, attributes)
7
+ attrs = attributes.with_indifferent_access
8
+ params = params.with_indifferent_access
9
+
10
+ value = if params.key?(remote_key)
11
+ params[remote_key]
12
+ else
13
+ params[name]
14
+ end
15
+
16
+ attrs[name] = serializer.deserialize(value, default)
17
+ attrs
18
+ end
19
+
20
+ def build_payload_for_create(attributes, payload)
21
+ payload ||= {}
22
+ return payload unless for_action?(:create)
23
+ return payload unless attributes.key?(name)
24
+
25
+ value = attributes[name]
26
+ return payload if value.nil?
27
+
28
+ payload[remote_key] = serializer.serialize(value)
29
+ payload
30
+ end
31
+
32
+ def build_payload_for_update(attributes, payload)
33
+ payload ||= {}
34
+ return payload unless for_action?(:update)
35
+ return payload unless attributes.key?(name)
36
+
37
+ value = attributes[name]
38
+ payload[remote_key] = serializer.serialize(value)
39
+ payload
40
+ end
41
+
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,42 @@
1
+ module Trello
2
+ class Schema
3
+ class AttributeBuilder
4
+ class << self
5
+ def build(name, options = {})
6
+ new(name, options).build
7
+ end
8
+ end
9
+
10
+ attr_reader :name, :options
11
+
12
+ def initialize(name, options)
13
+ @name = name
14
+ @options = options
15
+ end
16
+
17
+ def build
18
+ attribute_class.new(
19
+ name: name,
20
+ options: options,
21
+ serializer: serializer
22
+ )
23
+ end
24
+
25
+ private
26
+
27
+ def attribute_class
28
+ class_name = options.delete(:class_name)
29
+ return Schema::Attribute::Default unless class_name
30
+
31
+ "Trello::Schema::Attribute::#{class_name}".constantize
32
+ end
33
+
34
+ def serializer
35
+ serializer_class_name = options.delete(:serializer)
36
+ return Schema::Serializer::Default unless serializer_class_name
37
+
38
+ "Trello::Schema::Serializer::#{serializer_class_name}".constantize
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,47 @@
1
+ module Trello
2
+ class Schema
3
+ class AttributeRegistration
4
+ class << self
5
+ def register(klass, attribute)
6
+ new(klass, attribute).register
7
+ end
8
+ end
9
+
10
+ attr_reader :klass, :attribute
11
+
12
+ def initialize(klass, attribute)
13
+ @klass = klass
14
+ @attribute = attribute
15
+ end
16
+
17
+ def register
18
+ define_getter
19
+ define_setter
20
+ end
21
+
22
+ private
23
+
24
+ def define_getter
25
+ attribute_name = attribute.name
26
+
27
+ klass.class_eval do
28
+ define_method(attribute_name) { @__attributes[attribute_name] }
29
+ end
30
+ end
31
+
32
+ def define_setter
33
+ return if attribute.readonly?
34
+
35
+ attribute_name = attribute.name
36
+
37
+ klass.class_eval do
38
+ define_method("#{attribute_name}=") do |value|
39
+ send("#{attribute_name}_will_change!") if value != @__attributes[attribute_name]
40
+ @__attributes[attribute_name] = value
41
+ end
42
+ end
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,17 @@
1
+ module Trello
2
+ class Schema
3
+ module Serializer
4
+ class Default
5
+ class << self
6
+ def serialize(value)
7
+ value
8
+ end
9
+
10
+ def deserialize(value, default)
11
+ value == nil ? default : value
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ module Trello
2
+ class Schema
3
+ module Serializer
4
+ class Labels
5
+ class << self
6
+ def serialize(labels)
7
+ labels.map(&:id)
8
+ end
9
+
10
+ def deserialize(labels, default)
11
+ return default unless labels
12
+
13
+ labels.map do |label|
14
+ next label if label.is_a?(Trello::Label)
15
+
16
+ Trello::Label.new(label)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ module Trello
2
+ class Schema
3
+ module Serializer
4
+ class Time
5
+ class << self
6
+ def serialize(time)
7
+ return nil unless time.respond_to?(:iso8601)
8
+
9
+ time.strftime('%FT%T.%LZ')
10
+ end
11
+
12
+ def deserialize(time, default)
13
+ if time.is_a?(String)
14
+ ::Time.iso8601(time) rescue default
15
+ elsif time.respond_to?(:to_time)
16
+ time.to_time
17
+ else
18
+ default
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ module Trello
2
+ class Schema
3
+ module Serializer
4
+ class Webhooks
5
+ class << self
6
+ def serialize(webhooks)
7
+ webhooks ||= []
8
+
9
+ webhooks.map(&:id)
10
+ end
11
+
12
+ def deserialize(webhooks, default)
13
+ return default unless webhooks
14
+
15
+ webhooks.map do |webhook|
16
+ next webhook if webhook.is_a?(Trello::Webhook)
17
+
18
+ Trello::Webhook.new(webhook)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,31 @@
1
+ module Trello
2
+ class Schema
3
+ module Attribute
4
+ autoload :Base, 'trello/schema/attribute/base'
5
+ autoload :Default, 'trello/schema/attribute/default'
6
+ autoload :BoardPref, 'trello/schema/attribute/board_pref'
7
+ autoload :CustomFieldDisplay, 'trello/schema/attribute/custom_field_display'
8
+ end
9
+
10
+ module Serializer
11
+ autoload :Default, 'trello/schema/serializer/default'
12
+ autoload :Time, 'trello/schema/serializer/time'
13
+ autoload :Labels, 'trello/schema/serializer/labels'
14
+ autoload :Webhooks, 'trello/schema/serializer/webhooks'
15
+ end
16
+
17
+ autoload :AttributeBuilder, 'trello/schema/attribute_builder'
18
+ autoload :AttributeRegistration, 'trello/schema/attribute_registration'
19
+
20
+ attr_reader :attrs
21
+
22
+ def initialize
23
+ @attrs = ActiveSupport::HashWithIndifferentAccess.new
24
+ end
25
+
26
+ def attribute(name, options={})
27
+ @attrs[name] = AttributeBuilder.build(name, options)
28
+ self
29
+ end
30
+ end
31
+ end
data/lib/trello/token.rb CHANGED
@@ -2,17 +2,30 @@ module Trello
2
2
 
3
3
  # @!attribute [r] id
4
4
  # @return [String]
5
+ # @!attribute [r] identifier
6
+ # @return [String]
5
7
  # @!attribute [r] member_id
6
8
  # @return [String]
7
9
  # @!attribute [r] created_at
8
10
  # @return [Datetime]
11
+ # @!attribute [r] expires_at
12
+ # @return [Datetime]
9
13
  # @!attribute [r] permissions
10
14
  # @return [Object]
11
15
  # @!attribute [r] webhooks
12
16
  # @return [Object]
13
17
  class Token < BasicData
14
- register_attributes :id, :member_id, :created_at, :permissions, :webhooks,
15
- readonly: [ :id, :member_id, :created_at, :permissions, :webhooks ]
18
+
19
+ schema do
20
+ # Readonly
21
+ attribute :id, readonly: true, primary_key: true
22
+ attribute :identifier, readonly: true
23
+ attribute :member_id, readonly: true, remote_key: 'idMember'
24
+ attribute :created_at, readonly: true, remote_key: 'dateCreated', serializer: 'Time'
25
+ attribute :expires_at, readonly: true, remote_key: 'dateExpires', serializer: 'Time'
26
+ attribute :permissions, readonly: true
27
+ attribute :webhooks, readonly: true, default: [], serializer: 'Webhooks'
28
+ end
16
29
 
17
30
  class << self
18
31
  # Finds a token
@@ -21,16 +34,6 @@ module Trello
21
34
  end
22
35
  end
23
36
 
24
- # :nodoc:
25
- def update_fields(fields)
26
- attributes[:id] = fields['id'] || attributes[:id]
27
- attributes[:member_id] = fields['idMember'] || attributes[:member_id]
28
- attributes[:created_at] = Time.iso8601(fields['dateCreated']) rescue nil if fields.has_key?('dateCreated')
29
- attributes[:permissions] = fields['permissions'] || attributes[:permissions]
30
- attributes[:permissions] ||= {}
31
- attributes[:webhooks] = fields['webhooks'] || attributes[:webhooks]
32
- end
33
-
34
37
  # Returns a reference to the user who authorized the token.
35
38
  one :member, path: :members, using: :member_id
36
39
  end