ruby-trello 2.3.1 → 3.2.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.
- checksums.yaml +4 -4
- data/README.md +49 -23
- data/lib/trello/action.rb +27 -21
- data/lib/trello/attachment.rb +40 -27
- data/lib/trello/basic_data.rb +104 -9
- data/lib/trello/board.rb +88 -102
- data/lib/trello/card.rb +34 -235
- data/lib/trello/checklist.rb +17 -71
- data/lib/trello/client.rb +1 -1
- data/lib/trello/comment.rb +39 -26
- data/lib/trello/configuration.rb +8 -0
- data/lib/trello/cover_image.rb +20 -0
- data/lib/trello/custom_field.rb +31 -84
- data/lib/trello/custom_field_item.rb +36 -58
- data/lib/trello/custom_field_option.rb +40 -13
- data/lib/trello/item.rb +27 -16
- data/lib/trello/item_state.rb +7 -15
- data/lib/trello/json_utils.rb +11 -5
- data/lib/trello/label.rb +14 -101
- data/lib/trello/label_name.rb +22 -25
- data/lib/trello/list.rb +31 -44
- data/lib/trello/member.rb +77 -32
- data/lib/trello/net/faraday.rb +46 -0
- data/lib/trello/net/rest_client.rb +41 -0
- data/lib/trello/net.rb +1 -28
- data/lib/trello/notification.rb +27 -20
- data/lib/trello/organization.rb +53 -25
- data/lib/trello/plugin_datum.rb +11 -16
- data/lib/trello/schema/attribute/base.rb +79 -0
- data/lib/trello/schema/attribute/board_pref.rb +45 -0
- data/lib/trello/schema/attribute/custom_field_display.rb +45 -0
- data/lib/trello/schema/attribute/default.rb +45 -0
- data/lib/trello/schema/attribute_builder.rb +42 -0
- data/lib/trello/schema/attribute_registration.rb +47 -0
- data/lib/trello/schema/serializer/default.rb +17 -0
- data/lib/trello/schema/serializer/labels.rb +23 -0
- data/lib/trello/schema/serializer/time.rb +25 -0
- data/lib/trello/schema/serializer/webhooks.rb +25 -0
- data/lib/trello/schema.rb +31 -0
- data/lib/trello/token.rb +15 -12
- data/lib/trello/webhook.rb +18 -71
- data/lib/trello.rb +62 -7
- data/spec/action_spec.rb +1 -2
- data/spec/board_spec.rb +43 -103
- data/spec/card_spec.rb +51 -50
- data/spec/cassettes/action_find_with_id_and_get_all_fields.yml +104 -0
- data/spec/cassettes/board_find_with_id_and_get_all_fields.yml +96 -0
- data/spec/cassettes/board_find_with_id_and_get_specific_fields.yml +96 -0
- data/spec/cassettes/can_add_a_member_to_a_board.yml +191 -0
- data/spec/cassettes/can_arvhice_all_cards_of_list.yml +397 -0
- data/spec/cassettes/can_get_actions_of_board.yml +188 -0
- data/spec/cassettes/can_get_actions_of_list.yml +202 -0
- data/spec/cassettes/can_get_actions_of_members.yml +199 -0
- data/spec/cassettes/can_get_actions_of_organization.yml +201 -0
- data/spec/cassettes/can_get_boards_of_custom_field.yml +198 -0
- data/spec/cassettes/can_get_boards_of_label.yml +197 -0
- data/spec/cassettes/can_get_boards_of_organization.yml +207 -0
- data/spec/cassettes/can_get_cards_of_board.yml +193 -0
- data/spec/cassettes/can_get_cards_of_list.yml +201 -0
- data/spec/cassettes/can_get_cards_of_member.yml +204 -0
- data/spec/cassettes/can_get_checklists_of_board.yml +187 -0
- data/spec/cassettes/can_get_comments_board.yml +109 -0
- data/spec/cassettes/can_get_comments_card.yml +111 -0
- data/spec/cassettes/can_get_comments_list.yml +109 -0
- data/spec/cassettes/can_get_custom_field_options_of_custom_field.yml +197 -0
- data/spec/cassettes/can_get_custom_fields_of_board.yml +187 -0
- data/spec/cassettes/can_get_label_names_of_board.yml +187 -0
- data/spec/cassettes/can_get_labels_of_board.yml +187 -0
- data/spec/cassettes/can_get_lists_of_board.yml +187 -0
- data/spec/cassettes/can_get_members_of_board.yml +188 -0
- data/spec/cassettes/can_get_members_of_organization.yml +200 -0
- data/spec/cassettes/can_get_notifications_of_member.yml +199 -0
- data/spec/cassettes/can_get_organization_of_board.yml +189 -0
- data/spec/cassettes/can_get_organizations_of_member.yml +203 -0
- data/spec/cassettes/can_get_plugin_data_of_board.yml +187 -0
- data/spec/cassettes/can_move_all_cards_to_another_list.yml +886 -0
- data/spec/cassettes/can_success_create_a_board.yml +98 -0
- data/spec/cassettes/can_success_create_a_board_with_full_parameters.yml +97 -0
- data/spec/cassettes/can_success_create_a_board_without_clone_from_other.yml +98 -0
- data/spec/cassettes/can_success_create_a_card_when_due_is_datetime.yml +98 -0
- data/spec/cassettes/can_success_create_a_card_when_due_is_time.yml +98 -0
- data/spec/cassettes/can_success_create_a_checklist.yml +102 -0
- data/spec/cassettes/can_success_create_a_custom_field.yml +102 -0
- data/spec/cassettes/can_success_create_a_custom_field_option.yml +102 -0
- data/spec/cassettes/can_success_create_a_label.yml +102 -0
- data/spec/cassettes/can_success_create_a_list.yml +102 -0
- data/spec/cassettes/can_success_create_a_list_with_full_parameters.yml +102 -0
- data/spec/cassettes/can_success_create_a_organization.yml +104 -0
- data/spec/cassettes/can_success_create_a_webhook.yml +102 -0
- data/spec/cassettes/can_success_delete_a_custom_field_option.yml +389 -0
- data/spec/cassettes/can_success_delete_checklist.yml +284 -0
- data/spec/cassettes/can_success_get_card_of_board_by_card_id.yml +188 -0
- data/spec/cassettes/can_success_remove_member_from_board.yml +186 -0
- data/spec/cassettes/can_success_return_all_boards_of_current_user.yml +195 -0
- data/spec/cassettes/can_success_upate_a_board.yml +191 -0
- data/spec/cassettes/can_success_upate_a_list.yml +296 -0
- data/spec/cassettes/can_success_update_bong_a_board.yml +39 -39
- data/spec/cassettes/can_success_update_bong_a_board_with_specific_fields.yml +284 -0
- data/spec/cassettes/can_success_update_bong_a_checklist_with_specific_fields.yml +296 -0
- data/spec/cassettes/can_success_update_bong_a_custom_field.yml +200 -0
- data/spec/cassettes/can_success_update_bong_a_label.yml +200 -0
- data/spec/cassettes/can_success_update_bong_a_list.yml +199 -0
- data/spec/cassettes/can_success_update_bong_a_list_with_specific_fields.yml +296 -0
- data/spec/cassettes/can_success_update_bong_a_organization.yml +203 -0
- data/spec/cassettes/can_success_update_bong_a_webhook.yml +296 -0
- data/spec/cassettes/checklist_can_add_an_item.yml +296 -0
- data/spec/cassettes/checklist_can_update_the_item_state.yml +296 -0
- data/spec/cassettes/checklist_find_with_id_and_get_all_fields.yml +100 -0
- data/spec/cassettes/comment_delete.yml +331 -0
- data/spec/cassettes/comment_find_with_id.yml +116 -0
- data/spec/cassettes/custom_field_find_with_id_and_get_all_fields.yml +100 -0
- data/spec/cassettes/custom_field_find_with_id_and_get_specific_fields.yml +100 -0
- data/spec/cassettes/custom_field_item_save_1.yml +1 -1
- data/spec/cassettes/custom_field_item_save_2.yml +1 -1
- data/spec/cassettes/custom_field_option_find_with_id.yml +100 -0
- data/spec/cassettes/get_board_of_list.yml +197 -0
- data/spec/cassettes/get_boards_of_member.yml +207 -0
- data/spec/cassettes/label_delete.yml +285 -0
- data/spec/cassettes/label_find_with_id.yml +100 -0
- data/spec/cassettes/list_find_with_id_and_get_all_fields.yml +100 -0
- data/spec/cassettes/list_find_with_id_and_get_specific_fields.yml +100 -0
- data/spec/cassettes/member_find_with_id_and_get_all_fields.yml +101 -0
- data/spec/cassettes/member_find_with_id_and_get_specific_fields.yml +100 -0
- data/spec/cassettes/notification_find_with_id.yml +103 -0
- data/spec/cassettes/organization_find_with_id_and_get_all_fields.yml +102 -0
- data/spec/cassettes/organization_find_with_id_and_get_specific_fields.yml +100 -0
- data/spec/cassettes/token_find_with_token_string.yml +100 -0
- data/spec/cassettes/webhook_delete.yml +286 -0
- data/spec/cassettes/webhook_find_with_id.yml +100 -0
- data/spec/checklist_spec.rb +27 -43
- data/spec/client_spec.rb +57 -3
- data/spec/configuration_spec.rb +13 -0
- data/spec/custom_field_item_spec.rb +2 -2
- data/spec/custom_field_option_spec.rb +2 -2
- data/spec/custom_field_spec.rb +25 -13
- data/spec/integration/action/find_spec.rb +23 -0
- data/spec/integration/basic_data/many_spec.rb +4 -0
- data/spec/integration/basic_data/schema_spec.rb +156 -0
- data/spec/integration/board/add_member_spec.rb +20 -0
- data/spec/integration/board/all_spec.rb +20 -0
- data/spec/integration/board/associations/actions_spec.rb +18 -0
- data/spec/integration/board/associations/cards_spec.rb +18 -0
- data/spec/integration/board/associations/checklists_spec.rb +18 -0
- data/spec/integration/board/associations/custom_fields_spec.rb +18 -0
- data/spec/integration/board/associations/label_names_spec.rb +17 -0
- data/spec/integration/board/associations/labels_spec.rb +18 -0
- data/spec/integration/board/associations/lists_spec.rb +18 -0
- data/spec/integration/board/associations/members_spec.rb +18 -0
- data/spec/integration/board/associations/organization_spec.rb +19 -0
- data/spec/integration/board/associations/plugin_data_spec.rb +18 -0
- data/spec/integration/board/create_spec.rb +95 -0
- data/spec/integration/board/find_card_spec.rb +18 -0
- data/spec/integration/board/find_spec.rb +42 -0
- data/spec/integration/board/remove_member_spec.rb +21 -0
- data/spec/integration/board/save_spec.rb +37 -0
- data/spec/integration/board/update!_spec.rb +33 -2
- data/spec/integration/card/associations/plugin_data_spec.rb +1 -1
- data/spec/integration/card/create_spec.rb +36 -2
- data/spec/integration/card/delete_spec.rb +2 -2
- data/spec/integration/card/find_spec.rb +1 -1
- data/spec/integration/card/save_spec.rb +2 -2
- data/spec/integration/checklist/add_item_spec.rb +20 -0
- data/spec/integration/checklist/create_spec.rb +23 -0
- data/spec/integration/checklist/delete_spec.rb +17 -0
- data/spec/integration/checklist/find_spec.rb +22 -0
- data/spec/integration/checklist/update!_spec.rb +21 -0
- data/spec/integration/checklist/update_item_state_spec.rb +20 -0
- data/spec/integration/comment/association/board_spec.rb +17 -0
- data/spec/integration/comment/association/card_spec.rb +17 -0
- data/spec/integration/comment/association/list_spec.rb +17 -0
- data/spec/integration/comment/delete_spec.rb +20 -0
- data/spec/integration/comment/find_spec.rb +17 -0
- data/spec/integration/custom_field/association/board_spec.rb +18 -0
- data/spec/integration/custom_field/association/custom_field_options_spec.rb +18 -0
- data/spec/integration/custom_field/create_spec.rb +29 -0
- data/spec/integration/custom_field/find_spec.rb +41 -0
- data/spec/integration/custom_field/update!_spec.rb +25 -0
- data/spec/integration/custom_field_option/create_spec.rb +23 -0
- data/spec/integration/custom_field_option/delete_spec.rb +19 -0
- data/spec/integration/custom_field_option/find_spec.rb +21 -0
- data/spec/integration/integration_test.rb +3 -3
- data/spec/integration/label/association/board_spec.rb +18 -0
- data/spec/integration/label/create_spec.rb +23 -0
- data/spec/integration/label/delete_spec.rb +21 -0
- data/spec/integration/label/find_spec.rb +20 -0
- data/spec/integration/label/update!_spec.rb +25 -0
- data/spec/integration/list/archive_all_cards_spec.rb +20 -0
- data/spec/integration/list/associations/actions_spec.rb +18 -0
- data/spec/integration/list/associations/board_spec.rb +18 -0
- data/spec/integration/list/associations/cards_spec.rb +18 -0
- data/spec/integration/list/create_spec.rb +44 -0
- data/spec/integration/list/find_spec.rb +37 -0
- data/spec/integration/list/move_all_cards_spec.rb +31 -0
- data/spec/integration/list/save_spec.rb +40 -0
- data/spec/integration/list/update!_spec.rb +43 -0
- data/spec/integration/member/associations/actions_spec.rb +17 -0
- data/spec/integration/member/associations/boards_spec.rb +18 -0
- data/spec/integration/member/associations/cards_spec.rb +18 -0
- data/spec/integration/member/associations/notifications_spec.rb +18 -0
- data/spec/integration/member/associations/organizations_spec.rb +18 -0
- data/spec/integration/member/find_spec.rb +39 -0
- data/spec/integration/member/update!_spec.rb +18 -0
- data/spec/integration/notification/find_spec.rb +27 -0
- data/spec/integration/organization/associations/actions_spec.rb +18 -0
- data/spec/integration/organization/associations/boards_spec.rb +18 -0
- data/spec/integration/organization/associations/members_spec.rb +18 -0
- data/spec/integration/organization/create_spec.rb +23 -0
- data/spec/integration/organization/find_spec.rb +37 -0
- data/spec/integration/organization/update!_spec.rb +28 -0
- data/spec/integration/token/find_spec.rb +24 -0
- data/spec/integration/webhook/create_spec.rb +27 -0
- data/spec/integration/webhook/delete_spec.rb +21 -0
- data/spec/integration/webhook/find_spec.rb +22 -0
- data/spec/integration/webhook/update!_spec.rb +24 -0
- data/spec/item_spec.rb +2 -2
- data/spec/label_spec.rb +31 -33
- data/spec/list_spec.rb +32 -14
- data/spec/notification_spec.rb +3 -3
- data/spec/organization_spec.rb +6 -5
- data/spec/spec_helper.rb +31 -14
- data/spec/token_spec.rb +10 -11
- data/spec/unit/trello/basic_data_spec.rb +67 -8
- data/spec/unit/trello/board/new_spec.rb +370 -0
- data/spec/unit/trello/board/save_spec.rb +49 -0
- data/spec/unit/trello/board/update_fields_spec.rb +129 -0
- data/spec/unit/trello/board/update_spec.rb +197 -0
- data/spec/unit/trello/member/new_spec.rb +62 -0
- data/spec/unit/trello/member/update_fields_spec.rb +80 -0
- data/spec/unit/trello/schema/attribute/base_spec.rb +349 -0
- data/spec/unit/trello/schema/attribute/board_pref_spec.rb +208 -0
- data/spec/unit/trello/schema/attribute/default_spec.rb +236 -0
- data/spec/unit/trello/schema/attribute_builder_spec.rb +55 -0
- data/spec/unit/trello/schema/attribute_registration_spec.rb +59 -0
- data/spec/unit/trello/schema/serializer/default_spec.rb +19 -0
- data/spec/unit/trello/schema/serializer/time_spec.rb +39 -0
- data/spec/unit/trello/schema_spec.rb +25 -0
- data/spec/webhook_spec.rb +23 -7
- metadata +444 -102
- data/lib/trello/register_attributes.rb +0 -54
- data/spec/integration/basic_data/register_attributes_spec.rb +0 -75
data/lib/trello/custom_field.rb
CHANGED
@@ -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
|
14
|
+
# @!attribute [rw] position
|
15
15
|
# @return [Float]
|
16
|
-
# @!attribute type
|
16
|
+
# @!attribute [rw] type
|
17
17
|
# @return [String]
|
18
|
-
# @!attribute
|
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
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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
|
-
|
41
|
-
|
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
|
-
|
6
|
-
|
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
|
-
|
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
|
-
|
30
|
-
initialize_fields(fields)
|
31
|
-
end
|
39
|
+
payload = {}
|
32
40
|
|
33
|
-
|
34
|
-
|
35
|
-
|
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
|
-
|
45
|
+
put(element_path, payload)
|
41
46
|
end
|
42
47
|
|
43
|
-
|
44
|
-
|
45
|
-
|
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
|
-
|
54
|
-
|
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(
|
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
|
-
|
6
|
-
|
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
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
data/lib/trello/item.rb
CHANGED
@@ -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]
|
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
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
data/lib/trello/item_state.rb
CHANGED
@@ -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
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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(
|
19
|
+
Item.find(id)
|
28
20
|
end
|
29
21
|
end
|
30
22
|
end
|
data/lib/trello/json_utils.rb
CHANGED
@@ -7,7 +7,7 @@ module Trello
|
|
7
7
|
|
8
8
|
module InstanceMethods
|
9
9
|
def from_response(*args)
|
10
|
-
|
10
|
+
initialize_fields parse_json(*args)
|
11
11
|
end
|
12
12
|
|
13
13
|
def parse_json(*args)
|
@@ -32,8 +32,8 @@ module Trello
|
|
32
32
|
# thing.a == 42
|
33
33
|
# thing.b == "foo"
|
34
34
|
#
|
35
|
-
def from_response(
|
36
|
-
from_json(parse_json(
|
35
|
+
def from_response(response, encoding = 'UTF-8')
|
36
|
+
from_json(parse_json(response, encoding))
|
37
37
|
end
|
38
38
|
|
39
39
|
def from_json(json)
|
@@ -47,8 +47,14 @@ module Trello
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
def parse_json(
|
51
|
-
|
50
|
+
def parse_json(data, encoding = 'UTF-8')
|
51
|
+
# Trello.http_client.parse_json(data, encoding)
|
52
|
+
case data
|
53
|
+
when Trello::Response
|
54
|
+
JSON.parse(data.body.force_encoding(encoding))
|
55
|
+
else
|
56
|
+
JSON.parse(data.force_encoding(encoding))
|
57
|
+
end
|
52
58
|
rescue JSON::ParserError => json_error
|
53
59
|
if json_error.message =~ /model not found/
|
54
60
|
Trello.logger.error "Could not find that record."
|
data/lib/trello/label.rb
CHANGED
@@ -6,121 +6,34 @@ module Trello
|
|
6
6
|
# @return [String]
|
7
7
|
# @!attribute [rw] color
|
8
8
|
# @return [String]
|
9
|
+
# @!attribute [rw] name
|
10
|
+
# @return [String]
|
11
|
+
# @!attribute [rw] board_id
|
12
|
+
# @return [String]
|
9
13
|
class Label < BasicData
|
10
|
-
register_attributes :id, :name, :board_id, :uses,
|
11
|
-
readonly: [ :id, :uses, :board_id ]
|
12
|
-
validates_presence_of :id, :board_id, :name
|
13
|
-
validates_length_of :name, in: 1..16384
|
14
|
-
|
15
|
-
SYMBOL_TO_STRING = {
|
16
|
-
id: 'id',
|
17
|
-
name: 'name',
|
18
|
-
board_id: 'idBoard',
|
19
|
-
color: 'color',
|
20
|
-
uses: 'uses'
|
21
|
-
}
|
22
|
-
|
23
|
-
class << self
|
24
|
-
VALID_LABEL_COLOURS = %w{green yellow orange red purple blue sky lime pink black} << ''
|
25
|
-
|
26
|
-
# Find a specific label by its id.
|
27
|
-
def find(id, params = {})
|
28
|
-
client.find(:label, id, params)
|
29
|
-
end
|
30
|
-
|
31
|
-
# Create a new label and save it on Trello.
|
32
|
-
def create(options)
|
33
|
-
client.create(:label,
|
34
|
-
'name' => options[:name],
|
35
|
-
'idBoard' => options[:board_id],
|
36
|
-
'color' => options[:color],
|
37
|
-
)
|
38
|
-
end
|
39
|
-
|
40
|
-
# Label colours
|
41
|
-
def label_colours
|
42
|
-
VALID_LABEL_COLOURS
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
define_attribute_methods [:color]
|
47
|
-
|
48
|
-
def color
|
49
|
-
@__attributes[:color]
|
50
|
-
end
|
51
|
-
|
52
|
-
def color= colour
|
53
|
-
unless Label.label_colours.include? colour
|
54
|
-
errors.add(:label, "color '#{colour}' does not exist")
|
55
|
-
return Trello.logger.warn "The label colour '#{colour}' does not exist."
|
56
|
-
end
|
57
14
|
|
58
|
-
|
59
|
-
|
60
|
-
|
15
|
+
schema do
|
16
|
+
# Readonly
|
17
|
+
attribute :id, readonly: true, primary_key: true
|
61
18
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
# a label.
|
66
|
-
def update_fields(fields)
|
67
|
-
send('name_will_change!') if fields_has_key?(fields, :name)
|
68
|
-
send('color_will_change!') if fields_has_key?(fields, :color)
|
19
|
+
# Writable
|
20
|
+
attribute :name
|
21
|
+
attribute :color
|
69
22
|
|
70
|
-
|
23
|
+
# Writable but for create only
|
24
|
+
attribute :board_id, create_only: true, remote_key: 'idBoard'
|
71
25
|
end
|
72
26
|
|
73
|
-
|
74
|
-
|
75
|
-
end
|
27
|
+
validates_presence_of :id, :board_id, :name
|
28
|
+
validates_length_of :name, in: 1..16384
|
76
29
|
|
77
30
|
# Returns a reference to the board this label is currently connected.
|
78
31
|
one :board, path: :boards, using: :board_id
|
79
32
|
|
80
|
-
# Saves a record.
|
81
|
-
def save
|
82
|
-
# If we have an id, just update our fields.
|
83
|
-
return update! if id
|
84
|
-
|
85
|
-
from_response client.post("/labels", {
|
86
|
-
name: name,
|
87
|
-
color: color,
|
88
|
-
idBoard: board_id,
|
89
|
-
})
|
90
|
-
end
|
91
|
-
|
92
|
-
# Update an existing record.
|
93
|
-
# Warning, this updates all fields using values already in memory. If
|
94
|
-
# an external resource has updated these fields, you should refresh!
|
95
|
-
# this object before making your changes, and before updating the record.
|
96
|
-
def update!
|
97
|
-
@previously_changed = changes
|
98
|
-
# extract only new values to build payload
|
99
|
-
payload = Hash[changes.map { |key, values| [SYMBOL_TO_STRING[key.to_sym].to_sym, values[1]] }]
|
100
|
-
@changed_attributes.clear if @changed_attributes.respond_to?(:clear)
|
101
|
-
changes_applied if respond_to?(:changes_applied)
|
102
|
-
|
103
|
-
client.put("/labels/#{id}", payload)
|
104
|
-
end
|
105
|
-
|
106
33
|
# Delete this label
|
107
34
|
def delete
|
108
35
|
client.delete("/labels/#{id}")
|
109
36
|
end
|
110
37
|
|
111
|
-
private
|
112
|
-
|
113
|
-
def fields_has_key?(fields, key)
|
114
|
-
fields.key?(SYMBOL_TO_STRING[key]) || fields.key?(key)
|
115
|
-
end
|
116
|
-
|
117
|
-
def initialize_fields(fields)
|
118
|
-
attributes[:id] = fields['id'] || attributes[:id]
|
119
|
-
attributes[:name] = fields['name'] || fields[:name] || attributes[:name]
|
120
|
-
attributes[:color] = fields['color'] || fields[:color] || attributes[:color]
|
121
|
-
attributes[:board_id] = fields['idBoard'] || fields[:board_id] || attributes[:board_id]
|
122
|
-
attributes[:uses] = fields['uses'] if fields.has_key?('uses')
|
123
|
-
self
|
124
|
-
end
|
125
38
|
end
|
126
39
|
end
|
data/lib/trello/label_name.rb
CHANGED
@@ -1,31 +1,28 @@
|
|
1
1
|
module Trello
|
2
|
-
|
3
2
|
# A colored Label attached to a card
|
3
|
+
#
|
4
|
+
# @!attribute [r] yellow
|
5
|
+
# @!attribute [r] red
|
6
|
+
# @!attribute [r] orange
|
7
|
+
# @!attribute [r] green
|
8
|
+
# @!attribute [r] purple
|
9
|
+
# @!attribute [r] blue
|
10
|
+
# @!attribute [r] sky
|
11
|
+
# @!attribute [r] pink
|
12
|
+
# @!attribute [r] lime
|
13
|
+
# @!attribute [r] black
|
4
14
|
class LabelName < BasicData
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
attributes[:purple] = fields['purple'] || attributes[:purple]
|
17
|
-
attributes[:blue] = fields['blue'] || attributes[:blue]
|
18
|
-
attributes[:sky] = fields['sky'] || attributes[:sky]
|
19
|
-
attributes[:pink] = fields['pink'] || attributes[:pink]
|
20
|
-
attributes[:lime] = fields['lime'] || attributes[:lime]
|
21
|
-
attributes[:black] = fields['black'] || attributes[:black]
|
22
|
-
|
23
|
-
self
|
15
|
+
schema do
|
16
|
+
attribute :yellow, readonly: true
|
17
|
+
attribute :red, readonly: true
|
18
|
+
attribute :orange, readonly: true
|
19
|
+
attribute :green, readonly: true
|
20
|
+
attribute :purple, readonly: true
|
21
|
+
attribute :blue, readonly: true
|
22
|
+
attribute :sky, readonly: true
|
23
|
+
attribute :pink, readonly: true
|
24
|
+
attribute :lime, readonly: true
|
25
|
+
attribute :black, readonly: true
|
24
26
|
end
|
25
|
-
|
26
|
-
one :board, path: :boards, using: :board_id
|
27
|
-
|
28
|
-
many :cards, filter: :all
|
29
|
-
|
30
27
|
end
|
31
28
|
end
|