ruby-trello 2.3.1 → 3.0.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 (221) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -2
  3. data/lib/trello.rb +13 -7
  4. data/lib/trello/action.rb +27 -21
  5. data/lib/trello/attachment.rb +40 -27
  6. data/lib/trello/basic_data.rb +104 -9
  7. data/lib/trello/board.rb +88 -102
  8. data/lib/trello/card.rb +34 -235
  9. data/lib/trello/checklist.rb +17 -71
  10. data/lib/trello/comment.rb +32 -22
  11. data/lib/trello/cover_image.rb +20 -0
  12. data/lib/trello/custom_field.rb +31 -84
  13. data/lib/trello/custom_field_item.rb +36 -58
  14. data/lib/trello/custom_field_option.rb +40 -13
  15. data/lib/trello/item.rb +27 -16
  16. data/lib/trello/item_state.rb +7 -15
  17. data/lib/trello/json_utils.rb +1 -1
  18. data/lib/trello/label.rb +14 -101
  19. data/lib/trello/label_name.rb +22 -25
  20. data/lib/trello/list.rb +31 -44
  21. data/lib/trello/member.rb +77 -32
  22. data/lib/trello/notification.rb +27 -20
  23. data/lib/trello/organization.rb +53 -25
  24. data/lib/trello/plugin_datum.rb +11 -16
  25. data/lib/trello/schema.rb +31 -0
  26. data/lib/trello/schema/attribute/base.rb +79 -0
  27. data/lib/trello/schema/attribute/board_pref.rb +45 -0
  28. data/lib/trello/schema/attribute/custom_field_display.rb +45 -0
  29. data/lib/trello/schema/attribute/default.rb +45 -0
  30. data/lib/trello/schema/attribute_builder.rb +42 -0
  31. data/lib/trello/schema/attribute_registration.rb +47 -0
  32. data/lib/trello/schema/serializer/default.rb +17 -0
  33. data/lib/trello/schema/serializer/labels.rb +23 -0
  34. data/lib/trello/schema/serializer/time.rb +25 -0
  35. data/lib/trello/schema/serializer/webhooks.rb +25 -0
  36. data/lib/trello/token.rb +15 -12
  37. data/lib/trello/webhook.rb +18 -71
  38. data/spec/action_spec.rb +1 -2
  39. data/spec/board_spec.rb +43 -103
  40. data/spec/card_spec.rb +51 -50
  41. data/spec/cassettes/action_find_with_id_and_get_all_fields.yml +104 -0
  42. data/spec/cassettes/board_find_with_id_and_get_all_fields.yml +96 -0
  43. data/spec/cassettes/board_find_with_id_and_get_specific_fields.yml +96 -0
  44. data/spec/cassettes/can_add_a_member_to_a_board.yml +191 -0
  45. data/spec/cassettes/can_arvhice_all_cards_of_list.yml +397 -0
  46. data/spec/cassettes/can_get_actions_of_board.yml +188 -0
  47. data/spec/cassettes/can_get_actions_of_list.yml +202 -0
  48. data/spec/cassettes/can_get_actions_of_members.yml +199 -0
  49. data/spec/cassettes/can_get_actions_of_organization.yml +201 -0
  50. data/spec/cassettes/can_get_boards_of_custom_field.yml +198 -0
  51. data/spec/cassettes/can_get_boards_of_label.yml +197 -0
  52. data/spec/cassettes/can_get_boards_of_organization.yml +207 -0
  53. data/spec/cassettes/can_get_cards_of_board.yml +193 -0
  54. data/spec/cassettes/can_get_cards_of_list.yml +201 -0
  55. data/spec/cassettes/can_get_cards_of_member.yml +204 -0
  56. data/spec/cassettes/can_get_checklists_of_board.yml +187 -0
  57. data/spec/cassettes/can_get_custom_field_options_of_custom_field.yml +197 -0
  58. data/spec/cassettes/can_get_custom_fields_of_board.yml +187 -0
  59. data/spec/cassettes/can_get_label_names_of_board.yml +187 -0
  60. data/spec/cassettes/can_get_labels_of_board.yml +187 -0
  61. data/spec/cassettes/can_get_lists_of_board.yml +187 -0
  62. data/spec/cassettes/can_get_members_of_board.yml +188 -0
  63. data/spec/cassettes/can_get_members_of_organization.yml +200 -0
  64. data/spec/cassettes/can_get_notifications_of_member.yml +199 -0
  65. data/spec/cassettes/can_get_organization_of_board.yml +189 -0
  66. data/spec/cassettes/can_get_organizations_of_member.yml +203 -0
  67. data/spec/cassettes/can_get_plugin_data_of_board.yml +187 -0
  68. data/spec/cassettes/can_move_all_cards_to_another_list.yml +886 -0
  69. data/spec/cassettes/can_success_create_a_board.yml +98 -0
  70. data/spec/cassettes/can_success_create_a_board_with_full_parameters.yml +97 -0
  71. data/spec/cassettes/can_success_create_a_board_without_clone_from_other.yml +98 -0
  72. data/spec/cassettes/can_success_create_a_card_when_due_is_datetime.yml +98 -0
  73. data/spec/cassettes/can_success_create_a_card_when_due_is_time.yml +98 -0
  74. data/spec/cassettes/can_success_create_a_checklist.yml +102 -0
  75. data/spec/cassettes/can_success_create_a_custom_field.yml +102 -0
  76. data/spec/cassettes/can_success_create_a_custom_field_option.yml +102 -0
  77. data/spec/cassettes/can_success_create_a_label.yml +102 -0
  78. data/spec/cassettes/can_success_create_a_list.yml +102 -0
  79. data/spec/cassettes/can_success_create_a_list_with_full_parameters.yml +102 -0
  80. data/spec/cassettes/can_success_create_a_organization.yml +104 -0
  81. data/spec/cassettes/can_success_create_a_webhook.yml +102 -0
  82. data/spec/cassettes/can_success_delete_a_custom_field_option.yml +389 -0
  83. data/spec/cassettes/can_success_delete_checklist.yml +284 -0
  84. data/spec/cassettes/can_success_get_card_of_board_by_card_id.yml +188 -0
  85. data/spec/cassettes/can_success_remove_member_from_board.yml +186 -0
  86. data/spec/cassettes/can_success_return_all_boards_of_current_user.yml +195 -0
  87. data/spec/cassettes/can_success_upate_a_board.yml +191 -0
  88. data/spec/cassettes/can_success_upate_a_list.yml +296 -0
  89. data/spec/cassettes/can_success_update_bong_a_board.yml +39 -39
  90. data/spec/cassettes/can_success_update_bong_a_board_with_specific_fields.yml +284 -0
  91. data/spec/cassettes/can_success_update_bong_a_checklist_with_specific_fields.yml +296 -0
  92. data/spec/cassettes/can_success_update_bong_a_custom_field.yml +200 -0
  93. data/spec/cassettes/can_success_update_bong_a_label.yml +200 -0
  94. data/spec/cassettes/can_success_update_bong_a_list.yml +199 -0
  95. data/spec/cassettes/can_success_update_bong_a_list_with_specific_fields.yml +296 -0
  96. data/spec/cassettes/can_success_update_bong_a_organization.yml +203 -0
  97. data/spec/cassettes/can_success_update_bong_a_webhook.yml +296 -0
  98. data/spec/cassettes/checklist_can_add_an_item.yml +296 -0
  99. data/spec/cassettes/checklist_can_update_the_item_state.yml +296 -0
  100. data/spec/cassettes/checklist_find_with_id_and_get_all_fields.yml +100 -0
  101. data/spec/cassettes/custom_field_find_with_id_and_get_all_fields.yml +100 -0
  102. data/spec/cassettes/custom_field_find_with_id_and_get_specific_fields.yml +100 -0
  103. data/spec/cassettes/custom_field_item_save_1.yml +1 -1
  104. data/spec/cassettes/custom_field_item_save_2.yml +1 -1
  105. data/spec/cassettes/custom_field_option_find_with_id.yml +100 -0
  106. data/spec/cassettes/get_board_of_list.yml +197 -0
  107. data/spec/cassettes/get_boards_of_member.yml +207 -0
  108. data/spec/cassettes/label_delete.yml +285 -0
  109. data/spec/cassettes/label_find_with_id.yml +100 -0
  110. data/spec/cassettes/list_find_with_id_and_get_all_fields.yml +100 -0
  111. data/spec/cassettes/list_find_with_id_and_get_specific_fields.yml +100 -0
  112. data/spec/cassettes/member_find_with_id_and_get_all_fields.yml +101 -0
  113. data/spec/cassettes/member_find_with_id_and_get_specific_fields.yml +100 -0
  114. data/spec/cassettes/notification_find_with_id.yml +103 -0
  115. data/spec/cassettes/organization_find_with_id_and_get_all_fields.yml +102 -0
  116. data/spec/cassettes/organization_find_with_id_and_get_specific_fields.yml +100 -0
  117. data/spec/cassettes/token_find_with_token_string.yml +100 -0
  118. data/spec/cassettes/webhook_delete.yml +286 -0
  119. data/spec/cassettes/webhook_find_with_id.yml +100 -0
  120. data/spec/checklist_spec.rb +27 -43
  121. data/spec/custom_field_item_spec.rb +2 -2
  122. data/spec/custom_field_option_spec.rb +2 -2
  123. data/spec/custom_field_spec.rb +25 -13
  124. data/spec/integration/action/find_spec.rb +23 -0
  125. data/spec/integration/basic_data/many_spec.rb +4 -0
  126. data/spec/integration/basic_data/schema_spec.rb +156 -0
  127. data/spec/integration/board/add_member_spec.rb +21 -0
  128. data/spec/integration/board/all_spec.rb +20 -0
  129. data/spec/integration/board/associations/actions_spec.rb +18 -0
  130. data/spec/integration/board/associations/cards_spec.rb +18 -0
  131. data/spec/integration/board/associations/checklists_spec.rb +18 -0
  132. data/spec/integration/board/associations/custom_fields_spec.rb +18 -0
  133. data/spec/integration/board/associations/label_names_spec.rb +17 -0
  134. data/spec/integration/board/associations/labels_spec.rb +18 -0
  135. data/spec/integration/board/associations/lists_spec.rb +18 -0
  136. data/spec/integration/board/associations/members_spec.rb +18 -0
  137. data/spec/integration/board/associations/organization_spec.rb +19 -0
  138. data/spec/integration/board/associations/plugin_data_spec.rb +18 -0
  139. data/spec/integration/board/create_spec.rb +95 -0
  140. data/spec/integration/board/find_card_spec.rb +18 -0
  141. data/spec/integration/board/find_spec.rb +42 -0
  142. data/spec/integration/board/remove_member_spec.rb +21 -0
  143. data/spec/integration/board/save_spec.rb +37 -0
  144. data/spec/integration/board/update!_spec.rb +33 -2
  145. data/spec/integration/card/associations/plugin_data_spec.rb +1 -1
  146. data/spec/integration/card/create_spec.rb +36 -2
  147. data/spec/integration/card/find_spec.rb +1 -1
  148. data/spec/integration/card/save_spec.rb +2 -2
  149. data/spec/integration/checklist/add_item_spec.rb +20 -0
  150. data/spec/integration/checklist/create_spec.rb +23 -0
  151. data/spec/integration/checklist/delete_spec.rb +17 -0
  152. data/spec/integration/checklist/find_spec.rb +22 -0
  153. data/spec/integration/checklist/update!_spec.rb +21 -0
  154. data/spec/integration/checklist/update_item_state_spec.rb +20 -0
  155. data/spec/integration/custom_field/association/board_spec.rb +18 -0
  156. data/spec/integration/custom_field/association/custom_field_options_spec.rb +18 -0
  157. data/spec/integration/custom_field/create_spec.rb +29 -0
  158. data/spec/integration/custom_field/find_spec.rb +41 -0
  159. data/spec/integration/custom_field/update!_spec.rb +25 -0
  160. data/spec/integration/custom_field_option/create_spec.rb +23 -0
  161. data/spec/integration/custom_field_option/delete_spec.rb +19 -0
  162. data/spec/integration/custom_field_option/find_spec.rb +21 -0
  163. data/spec/integration/label/association/board_spec.rb +18 -0
  164. data/spec/integration/label/create_spec.rb +23 -0
  165. data/spec/integration/label/delete_spec.rb +21 -0
  166. data/spec/integration/label/find_spec.rb +20 -0
  167. data/spec/integration/label/update!_spec.rb +25 -0
  168. data/spec/integration/list/archive_all_cards_spec.rb +20 -0
  169. data/spec/integration/list/associations/actions_spec.rb +18 -0
  170. data/spec/integration/list/associations/board_spec.rb +18 -0
  171. data/spec/integration/list/associations/cards_spec.rb +18 -0
  172. data/spec/integration/list/create_spec.rb +44 -0
  173. data/spec/integration/list/find_spec.rb +37 -0
  174. data/spec/integration/list/move_all_cards_spec.rb +31 -0
  175. data/spec/integration/list/save_spec.rb +40 -0
  176. data/spec/integration/list/update!_spec.rb +43 -0
  177. data/spec/integration/member/associations/actions_spec.rb +17 -0
  178. data/spec/integration/member/associations/boards_spec.rb +18 -0
  179. data/spec/integration/member/associations/cards_spec.rb +18 -0
  180. data/spec/integration/member/associations/notifications_spec.rb +18 -0
  181. data/spec/integration/member/associations/organizations_spec.rb +18 -0
  182. data/spec/integration/member/find_spec.rb +39 -0
  183. data/spec/integration/member/update!_spec.rb +18 -0
  184. data/spec/integration/notification/find_spec.rb +27 -0
  185. data/spec/integration/organization/associations/actions_spec.rb +18 -0
  186. data/spec/integration/organization/associations/boards_spec.rb +18 -0
  187. data/spec/integration/organization/associations/members_spec.rb +18 -0
  188. data/spec/integration/organization/create_spec.rb +23 -0
  189. data/spec/integration/organization/find_spec.rb +37 -0
  190. data/spec/integration/organization/update!_spec.rb +28 -0
  191. data/spec/integration/token/find_spec.rb +24 -0
  192. data/spec/integration/webhook/create_spec.rb +27 -0
  193. data/spec/integration/webhook/delete_spec.rb +21 -0
  194. data/spec/integration/webhook/find_spec.rb +22 -0
  195. data/spec/integration/webhook/update!_spec.rb +24 -0
  196. data/spec/item_spec.rb +2 -2
  197. data/spec/label_spec.rb +31 -33
  198. data/spec/list_spec.rb +32 -14
  199. data/spec/notification_spec.rb +3 -3
  200. data/spec/organization_spec.rb +6 -5
  201. data/spec/spec_helper.rb +22 -14
  202. data/spec/token_spec.rb +10 -11
  203. data/spec/unit/trello/basic_data_spec.rb +67 -8
  204. data/spec/unit/trello/board/new_spec.rb +370 -0
  205. data/spec/unit/trello/board/save_spec.rb +49 -0
  206. data/spec/unit/trello/board/update_fields_spec.rb +129 -0
  207. data/spec/unit/trello/board/update_spec.rb +197 -0
  208. data/spec/unit/trello/member/new_spec.rb +62 -0
  209. data/spec/unit/trello/member/update_fields_spec.rb +80 -0
  210. data/spec/unit/trello/schema/attribute/base_spec.rb +349 -0
  211. data/spec/unit/trello/schema/attribute/board_pref_spec.rb +208 -0
  212. data/spec/unit/trello/schema/attribute/default_spec.rb +236 -0
  213. data/spec/unit/trello/schema/attribute_builder_spec.rb +55 -0
  214. data/spec/unit/trello/schema/attribute_registration_spec.rb +59 -0
  215. data/spec/unit/trello/schema/serializer/default_spec.rb +19 -0
  216. data/spec/unit/trello/schema/serializer/time_spec.rb +39 -0
  217. data/spec/unit/trello/schema_spec.rb +25 -0
  218. data/spec/webhook_spec.rb +23 -7
  219. metadata +422 -102
  220. data/lib/trello/register_attributes.rb +0 -54
  221. data/spec/integration/basic_data/register_attributes_spec.rb +0 -75
@@ -4,5 +4,25 @@ module Trello
4
4
  # This is normally an attachment that the user (or trello) has set
5
5
  # as the cover image
6
6
  class CoverImage < Attachment
7
+ # Same with Attachment may need refactor it to support inheritance
8
+ schema do
9
+ # Readonly
10
+ attribute :id, readonly: true, primary_key: true
11
+ attribute :position, readonly: true, remote_key: 'pos'
12
+ attribute :bytes, readonly: true
13
+ attribute :member_id, remote_key: 'idMember', readonly: true
14
+ attribute :date, serializer: 'Time', readonly: true
15
+ attribute :is_upload, remote_key: 'isUpload', readonly: true
16
+ attribute :previews, readonly: true
17
+ attribute :file_name, remote_key: 'fileName', readonly: true
18
+ attribute :edge_color, remote_key: 'edgeColor', readonly: true
19
+
20
+ # Writable but create only
21
+ attribute :name, create_only: true
22
+ attribute :url, create_only: true
23
+ attribute :mime_type, remote_key: 'mimeType', create_only: true
24
+ attribute :file, create_only: true
25
+ attribute :set_as_cover, remote_key: 'setCover', create_only: true
26
+ end
7
27
  end
8
28
  end
@@ -1,53 +1,54 @@
1
1
  module Trello
2
2
  # A Custom Field can be activated on a board. Values are stored at the card level.
3
3
  #
4
- # @!attribute id
4
+ # @!attribute [r] id
5
5
  # @return [String]
6
- # @!attribute model_id
6
+ # @!attribute [rw] model_id
7
7
  # @return [String]
8
- # @!attribute model_type
8
+ # @!attribute [rw] model_type
9
9
  # @return [String]
10
- # @!attribute field_group
10
+ # @!attribute [r] field_group
11
11
  # @return [String]
12
- # @!attribute name
12
+ # @!attribute [rw] name
13
13
  # @return [String]
14
- # @!attribute pos
14
+ # @!attribute [rw] position
15
15
  # @return [Float]
16
- # @!attribute type
16
+ # @!attribute [rw] type
17
17
  # @return [String]
18
- # @!attribute options
18
+ # @!attribute [rw] checkbox_options
19
19
  # @return [Array<Hash>]
20
+ # @!attribute [w] enable_display_on_card
21
+ # @return [Boolean]
20
22
  class CustomField < BasicData
21
- register_attributes :id, :model_id, :model_type, :field_group, :name, :pos, :type
22
- validates_presence_of :id, :model_id, :model_type, :name, :type, :pos
23
23
 
24
- SYMBOL_TO_STRING = {
25
- id: 'id',
26
- name: 'name',
27
- model_id: 'idModel',
28
- model_type: 'modelType',
29
- field_group: 'fieldGroup',
30
- type: 'type',
31
- pos: 'pos'
32
- }
24
+ schema do
25
+ # Readonly
26
+ attribute :id, readonly: true, primary_key: true
27
+ attribute :field_group, readonly: true, remote_key: 'fieldGroup'
28
+
29
+ # Writable
30
+ attribute :name
31
+ attribute :position, remote_key: 'pos'
32
+ attribute :enable_display_on_card, remote_key: 'cardFront', class_name: 'CustomFieldDisplay'
33
+
34
+ # Writable but for create only
35
+ attribute :model_id, remote_key: 'idModel', create_only: true
36
+ attribute :model_type, remote_key: 'modelType', create_only: true
37
+ attribute :type, create_only: true
38
+ attribute :checkbox_options, remote_key: 'options', create_only: true
39
+ end
40
+
41
+ validates_presence_of :id, :model_id, :model_type, :name, :type, :position
33
42
 
34
43
  class << self
35
44
  # Find a custom field by its id.
36
45
  def find(id, params = {})
37
46
  client.find('customFields', id, params)
38
47
  end
48
+ end
39
49
 
40
- # Create a new custom field and save it on Trello.
41
- def create(options)
42
- client.create('customFields',
43
- 'name' => options[:name],
44
- 'idModel' => options[:model_id],
45
- 'modelType' => options[:model_type],
46
- 'fieldGroup' => options[:field_group],
47
- 'type' => options[:type],
48
- 'pos' => options[:pos]
49
- )
50
- end
50
+ def collection_name
51
+ 'customFields'
51
52
  end
52
53
 
53
54
  # References Board where this custom field is located
@@ -57,43 +58,6 @@ module Trello
57
58
  # If type == 'list'
58
59
  many :custom_field_options, path: 'options'
59
60
 
60
- def update_fields(fields)
61
- send('name_will_change!') if fields_has_key?(fields, :name)
62
- send('pos_will_change!') if fields_has_key?(fields, :pos)
63
-
64
- initialize_fields(fields)
65
- end
66
-
67
- def initialize(fields = {})
68
- initialize_fields(fields)
69
- end
70
-
71
- # Saves a record.
72
- def save
73
- # If we have an id, just update our fields.
74
- return update! if id
75
-
76
- from_response client.post("/customFields", {
77
- name: name,
78
- idModel: model_id,
79
- modelType: model_type,
80
- type: type,
81
- pos: pos,
82
- fieldGroup: field_group
83
- })
84
- end
85
-
86
- # Update an existing custom field.
87
- def update!
88
- @previously_changed = changes
89
- # extract only new values to build payload
90
- payload = Hash[changes.map { |key, values| [SYMBOL_TO_STRING[key.to_sym].to_sym, values[1]] }]
91
- @changed_attributes.clear if @changed_attributes.respond_to?(:clear)
92
- changes_applied if respond_to?(:changes_applied)
93
-
94
- client.put("/customFields/#{id}", payload)
95
- end
96
-
97
61
  # Delete this custom field
98
62
  # Also deletes all associated values across all cards
99
63
  def delete
@@ -110,22 +74,5 @@ module Trello
110
74
  def delete_option(option_id)
111
75
  client.delete("/customFields/#{id}/options/#{option_id}")
112
76
  end
113
-
114
- private
115
-
116
- def fields_has_key?(fields, key)
117
- fields.key?(SYMBOL_TO_STRING[key]) || fields.key?(key)
118
- end
119
-
120
- def initialize_fields(fields)
121
- attributes[:id] = fields[SYMBOL_TO_STRING[:id]] || fields[:id] || attributes[:id]
122
- attributes[:name] = fields[SYMBOL_TO_STRING[:name]] || fields[:name] || attributes[:name]
123
- attributes[:model_id] = fields[SYMBOL_TO_STRING[:model_id]] || fields[:model_id] || attributes[:model_id]
124
- attributes[:model_type] = fields[SYMBOL_TO_STRING[:model_type]] || fields[:model_type] || attributes[:model_type]
125
- attributes[:field_group] = fields[SYMBOL_TO_STRING[:field_group]] || fields[:field_group] || attributes[:field_group]
126
- attributes[:type] = fields[SYMBOL_TO_STRING[:type]] || fields[:type] || attributes[:type]
127
- attributes[:pos] = fields[SYMBOL_TO_STRING[:pos]] || fields[:pos] || attributes[:pos]
128
- self
129
- end
130
77
  end
131
78
  end
@@ -1,9 +1,30 @@
1
1
  module Trello
2
2
  # A custom field item contains the value for a custom field on a particular card.
3
3
  #
4
+ # @!attribute [r] id
5
+ # @return [String]
6
+ # @!attribute [r] model_id
7
+ # @return [String]
8
+ # @!attribute [r] model_type
9
+ # @return [String]
10
+ # @!attribute [r] custom_field_id
11
+ # @return [String]
12
+ # @!attribute [r] option_id
13
+ # @return [String]
14
+ # @!attribute [rw] value
15
+ # @return [Hash]
4
16
  class CustomFieldItem < BasicData
5
- register_attributes :id, :model_id, :model_type, :custom_field_id, :value, :option_id,
6
- readonly: [ :id, :custom_field_id, :model_id, :model_type, :option_id ]
17
+
18
+ schema do
19
+ attribute :id, readonly: true, primary_key: true
20
+ attribute :model_id, readonly: true, remote_key: 'idModel'
21
+ attribute :model_type, readonly: true, remote_key: 'modelType'
22
+ attribute :custom_field_id, readonly: true, remote_key: 'idCustomField'
23
+ attribute :option_id, readonly: true, remote_key: 'idValue'
24
+
25
+ attribute :value
26
+ end
27
+
7
28
  validates_presence_of :id, :model_id, :custom_field_id
8
29
 
9
30
  # References the card with this custom field value
@@ -12,57 +33,33 @@ module Trello
12
33
  # References the parent custom field that this item is an instance of
13
34
  one :custom_field, path: 'customFields', using: :custom_field_id
14
35
 
15
- # Update the fields of a custom field item.
16
- #
17
- # Supply a hash of string keyed data retrieved from the Trello API representing
18
- # an item state.
19
- def update_fields(fields)
20
- if fields_has_key?(fields, 'value')
21
- send('value_will_change!')
22
- elsif fields_has_key?(fields, 'idValue')
23
- send('option_id_will_change!')
24
- end
25
-
26
- initialize_fields(fields)
27
- end
36
+ def save
37
+ return update! if id
28
38
 
29
- def initialize(fields = {})
30
- initialize_fields(fields)
31
- end
39
+ payload = {}
32
40
 
33
- def update!
34
- @previously_changed = changes
35
- # extract only new values to build payload
36
- payload = Hash[changes.map { |key, values| [key.to_sym, values[1]] }]
37
- @changed_attributes.clear if @changed_attributes.respond_to?(:clear)
38
- changes_applied if respond_to?(:changes_applied)
41
+ schema.attrs.each do |_, attribute|
42
+ payload = attribute.build_payload_for_create(attributes, payload)
43
+ end
39
44
 
40
- client.put("/card/#{model_id}/customField/#{custom_field_id}/item", payload)
45
+ put(element_path, payload)
41
46
  end
42
47
 
43
- # Saves a record.
44
- #
45
- # @raise [Trello::Error] if the card could not be saved
46
- #
47
- # @return [String] The JSON representation of the saved custom field item returned by
48
- # the Trello API.
49
- def save
50
- # If we have an id, just update our fields.
51
- return update! if id
48
+ def collection_path
49
+ "/cards/#{model_id}/#{collection_name}"
50
+ end
52
51
 
53
- from_response client.put("/card/#{model_id}/customField/#{custom_field_id}/item", {
54
- value: value
55
- })
52
+ def element_path
53
+ "/cards/#{model_id}/customField/#{custom_field_id}/item"
56
54
  end
57
55
 
58
56
  # You can't "delete" a custom field item, you can only clear the value
59
57
  def remove
60
58
  params = { value: {} }
61
- client.put("/card/#{model_id}/customField/#{custom_field_id}/item", params)
59
+ client.put(element_path, params)
62
60
  end
63
61
 
64
62
  # Type is saved at the CustomField level
65
- # Can equally be derived from :value, with a little parsing work: {"number": 42}
66
63
  def type
67
64
  custom_field.type
68
65
  end
@@ -75,24 +72,5 @@ module Trello
75
72
  option.value
76
73
  end
77
74
  end
78
-
79
- private
80
-
81
- def fields_has_key?(fields, key)
82
- fields.key?(key.to_s) || fields.key?(key.to_sym)
83
- end
84
-
85
- def initialize_fields(fields)
86
- attributes[:id] = fields['id'] || fields[:id] || attributes[:id]
87
- attributes[:model_id] = fields['idModel'] || fields[:model_id] || attributes[:model_id]
88
- attributes[:custom_field_id] = fields['idCustomField'] || fields[:custom_field_id] || attributes[:custom_field_id]
89
- attributes[:model_type] = fields['modelType'] || fields[:model_type] || attributes[:model_type]
90
- # Dropdown custom field items do not have a value, they have an ID that maps to
91
- # a different endpoint to get the value
92
- attributes[:option_id] = fields['idValue'] || fields[:idValue] if fields_has_key?(fields, 'idValue')
93
- # value format: { "text": "hello world" }
94
- attributes[:value] = fields['value'] || fields[:value] if fields_has_key?(fields, 'value')
95
- self
96
- end
97
75
  end
98
76
  end
@@ -1,22 +1,49 @@
1
1
  module Trello
2
2
  # A custom field option contains the individual items in a custom field dropdown menu.
3
3
  #
4
+ # @!attribute [r] id
5
+ # @return [String]
6
+ # @!attribute [r] custom_field_id
7
+ # @return [String]
8
+ # @!attribute [rw] value
9
+ # @return [Hash]
10
+ # @!attribute [rw] color
11
+ # @return [String]
12
+ # @!attribute [rw] position
13
+ # @return [Float]
4
14
  class CustomFieldOption < BasicData
5
- register_attributes :id, :value, :pos, :color,
6
- readonly: [:id]
15
+
16
+ schema do
17
+ # Readonly
18
+ attribute :id, remote_key: '_id', readonly: true, primary_key: true
19
+ attribute :custom_field_id, remote_key: 'idCustomField', readonly: true
20
+
21
+ # Writable but for create only
22
+ attribute :value, create_only: true
23
+ attribute :color, create_only: true
24
+ attribute :position, remote_key: 'pos', create_only: true
25
+ end
26
+
7
27
  validates_presence_of :id, :value
8
28
 
9
- # Update the fields of a custom field option.
10
- #
11
- # Supply a hash of string keyed data retrieved from the Trello API representing
12
- # an item state.
13
- def update_fields(fields)
14
- attributes[:id] = fields['_id'] || fields[:id] || attributes[:id]
15
- attributes[:color] = fields['color'] || fields[:color] || attributes[:color]
16
- attributes[:pos] = fields['pos'] || fields[:pos] || attributes[:pos]
17
- # value format: { "text": "hello world" }
18
- attributes[:value] = fields['value'] || fields[:value] || attributes[:value]
19
- self
29
+ def self.find(id, params = {})
30
+ params = params.with_indifferent_access
31
+ custom_field_id = params.delete(:custom_field_id)
32
+ return if custom_field_id.nil?
33
+
34
+ from_response client.get("/customFields/#{custom_field_id}/options/#{id}")
35
+ end
36
+
37
+ def delete
38
+ client.delete(element_path)
39
+ end
40
+
41
+ def collection_path
42
+ "/customFields/#{custom_field_id}/options"
43
+ end
44
+
45
+ def element_path
46
+ "/customFields/#{custom_field_id}/options/#{id}"
20
47
  end
21
48
  end
22
49
  end
@@ -5,31 +5,42 @@ module Trello
5
5
  # @return [String]
6
6
  # @!attribute [r] name
7
7
  # @return [String]
8
+ # @!attribute [r] name_data
9
+ # @return [String]
8
10
  # @!attribute [r] type
9
11
  # @return [Object]
10
12
  # @!attribute [r] state
11
13
  # @return [Object]
12
- # @!attribute [r] pos
14
+ # @!attribute [r] position
13
15
  # @return [Object]
16
+ # @!attribute [r] due_date
17
+ # @return [Datetime]
18
+ # @!attribute [r] member_id
19
+ # @return [String]
20
+ # @!attribute [r] checklist_id
21
+ # @return [String]
22
+ # @!attribute [w] checked
23
+ # @return [Boolean]
14
24
  class Item < BasicData
15
- register_attributes :id, :name, :type, :state, :pos, readonly: [ :id, :name, :type, :state, :pos ]
16
- validates_presence_of :id, :type
17
25
 
18
- # Updates the fields of an item.
19
- #
20
- # Supply a hash of string keyed data retrieved from the Trello API representing
21
- # an item.
22
- def update_fields(fields)
23
- attributes[:id] = fields['id'] || attributes[:id]
24
- attributes[:card_id] = fields['idCard'] || attributes[:card_id]
25
- attributes[:checklist_id] = fields['idChecklist'] || attributes[:checklist_id]
26
- attributes[:name] = fields['name'] || attributes[:name]
27
- attributes[:type] = fields['type'] || attributes[:type]
28
- attributes[:state] = fields['state'] || attributes[:state]
29
- attributes[:pos] = fields['pos'] || attributes[:pos]
30
- self
26
+ schema do
27
+ # Readonly
28
+ attribute :id, readonly: true, primary_key: true
29
+ attribute :type, readonly: true
30
+ attribute :name_data, readonly: true, remote_key: 'nameData'
31
+ attribute :due_date, readonly: true, remote_key: 'due', serializer: 'Time'
32
+ attribute :member_id, readonly: true, remote_key: 'idMember'
33
+ attribute :state, readonly: true
34
+ attribute :checklist_id, readonly: true, remote_key: 'idChecklist'
35
+
36
+ # Writable and write only
37
+ attribute :name, write_only: true
38
+ attribute :position, write_only: true, remote_key: 'pos'
39
+ attribute :checked, write_only: true
31
40
  end
32
41
 
42
+ validates_presence_of :id
43
+
33
44
  def complete?
34
45
  state == "complete"
35
46
  end
@@ -5,26 +5,18 @@ module Trello
5
5
  # @return [String]
6
6
  # @!attribute [r] state
7
7
  # @return [Object]
8
- # @!attribute [r] item_id
9
- # @return [String]
10
8
  class CheckItemState < BasicData
11
- register_attributes :id, :state, :item_id, readonly: [ :id, :state, :item_id ]
12
- validates_presence_of :id, :item_id
13
-
14
- # Update the fields of an item state.
15
- #
16
- # Supply a hash of string keyed data retrieved from the Trello API representing
17
- # an item state.
18
- def update_fields(fields)
19
- attributes[:id] = fields['id'] || attributes[:id]
20
- attributes[:state] = fields['state'] || attributes[:state]
21
- attributes[:item_id] = fields['idCheckItem'] || attributes[:item_id]
22
- self
9
+ schema do
10
+ #Readonly
11
+ attribute :id, remote_key: 'idCheckItem', readonly: true, primary_key: true
12
+ attribute :state
23
13
  end
24
14
 
15
+ validates_presence_of :id
16
+
25
17
  # Return the item this state belongs to.
26
18
  def item
27
- Item.find(item_id)
19
+ Item.find(id)
28
20
  end
29
21
  end
30
22
  end