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.
Files changed (240) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +49 -23
  3. data/lib/trello/action.rb +27 -21
  4. data/lib/trello/attachment.rb +40 -27
  5. data/lib/trello/basic_data.rb +104 -9
  6. data/lib/trello/board.rb +88 -102
  7. data/lib/trello/card.rb +34 -235
  8. data/lib/trello/checklist.rb +17 -71
  9. data/lib/trello/client.rb +1 -1
  10. data/lib/trello/comment.rb +39 -26
  11. data/lib/trello/configuration.rb +8 -0
  12. data/lib/trello/cover_image.rb +20 -0
  13. data/lib/trello/custom_field.rb +31 -84
  14. data/lib/trello/custom_field_item.rb +36 -58
  15. data/lib/trello/custom_field_option.rb +40 -13
  16. data/lib/trello/item.rb +27 -16
  17. data/lib/trello/item_state.rb +7 -15
  18. data/lib/trello/json_utils.rb +11 -5
  19. data/lib/trello/label.rb +14 -101
  20. data/lib/trello/label_name.rb +22 -25
  21. data/lib/trello/list.rb +31 -44
  22. data/lib/trello/member.rb +77 -32
  23. data/lib/trello/net/faraday.rb +46 -0
  24. data/lib/trello/net/rest_client.rb +41 -0
  25. data/lib/trello/net.rb +1 -28
  26. data/lib/trello/notification.rb +27 -20
  27. data/lib/trello/organization.rb +53 -25
  28. data/lib/trello/plugin_datum.rb +11 -16
  29. data/lib/trello/schema/attribute/base.rb +79 -0
  30. data/lib/trello/schema/attribute/board_pref.rb +45 -0
  31. data/lib/trello/schema/attribute/custom_field_display.rb +45 -0
  32. data/lib/trello/schema/attribute/default.rb +45 -0
  33. data/lib/trello/schema/attribute_builder.rb +42 -0
  34. data/lib/trello/schema/attribute_registration.rb +47 -0
  35. data/lib/trello/schema/serializer/default.rb +17 -0
  36. data/lib/trello/schema/serializer/labels.rb +23 -0
  37. data/lib/trello/schema/serializer/time.rb +25 -0
  38. data/lib/trello/schema/serializer/webhooks.rb +25 -0
  39. data/lib/trello/schema.rb +31 -0
  40. data/lib/trello/token.rb +15 -12
  41. data/lib/trello/webhook.rb +18 -71
  42. data/lib/trello.rb +62 -7
  43. data/spec/action_spec.rb +1 -2
  44. data/spec/board_spec.rb +43 -103
  45. data/spec/card_spec.rb +51 -50
  46. data/spec/cassettes/action_find_with_id_and_get_all_fields.yml +104 -0
  47. data/spec/cassettes/board_find_with_id_and_get_all_fields.yml +96 -0
  48. data/spec/cassettes/board_find_with_id_and_get_specific_fields.yml +96 -0
  49. data/spec/cassettes/can_add_a_member_to_a_board.yml +191 -0
  50. data/spec/cassettes/can_arvhice_all_cards_of_list.yml +397 -0
  51. data/spec/cassettes/can_get_actions_of_board.yml +188 -0
  52. data/spec/cassettes/can_get_actions_of_list.yml +202 -0
  53. data/spec/cassettes/can_get_actions_of_members.yml +199 -0
  54. data/spec/cassettes/can_get_actions_of_organization.yml +201 -0
  55. data/spec/cassettes/can_get_boards_of_custom_field.yml +198 -0
  56. data/spec/cassettes/can_get_boards_of_label.yml +197 -0
  57. data/spec/cassettes/can_get_boards_of_organization.yml +207 -0
  58. data/spec/cassettes/can_get_cards_of_board.yml +193 -0
  59. data/spec/cassettes/can_get_cards_of_list.yml +201 -0
  60. data/spec/cassettes/can_get_cards_of_member.yml +204 -0
  61. data/spec/cassettes/can_get_checklists_of_board.yml +187 -0
  62. data/spec/cassettes/can_get_comments_board.yml +109 -0
  63. data/spec/cassettes/can_get_comments_card.yml +111 -0
  64. data/spec/cassettes/can_get_comments_list.yml +109 -0
  65. data/spec/cassettes/can_get_custom_field_options_of_custom_field.yml +197 -0
  66. data/spec/cassettes/can_get_custom_fields_of_board.yml +187 -0
  67. data/spec/cassettes/can_get_label_names_of_board.yml +187 -0
  68. data/spec/cassettes/can_get_labels_of_board.yml +187 -0
  69. data/spec/cassettes/can_get_lists_of_board.yml +187 -0
  70. data/spec/cassettes/can_get_members_of_board.yml +188 -0
  71. data/spec/cassettes/can_get_members_of_organization.yml +200 -0
  72. data/spec/cassettes/can_get_notifications_of_member.yml +199 -0
  73. data/spec/cassettes/can_get_organization_of_board.yml +189 -0
  74. data/spec/cassettes/can_get_organizations_of_member.yml +203 -0
  75. data/spec/cassettes/can_get_plugin_data_of_board.yml +187 -0
  76. data/spec/cassettes/can_move_all_cards_to_another_list.yml +886 -0
  77. data/spec/cassettes/can_success_create_a_board.yml +98 -0
  78. data/spec/cassettes/can_success_create_a_board_with_full_parameters.yml +97 -0
  79. data/spec/cassettes/can_success_create_a_board_without_clone_from_other.yml +98 -0
  80. data/spec/cassettes/can_success_create_a_card_when_due_is_datetime.yml +98 -0
  81. data/spec/cassettes/can_success_create_a_card_when_due_is_time.yml +98 -0
  82. data/spec/cassettes/can_success_create_a_checklist.yml +102 -0
  83. data/spec/cassettes/can_success_create_a_custom_field.yml +102 -0
  84. data/spec/cassettes/can_success_create_a_custom_field_option.yml +102 -0
  85. data/spec/cassettes/can_success_create_a_label.yml +102 -0
  86. data/spec/cassettes/can_success_create_a_list.yml +102 -0
  87. data/spec/cassettes/can_success_create_a_list_with_full_parameters.yml +102 -0
  88. data/spec/cassettes/can_success_create_a_organization.yml +104 -0
  89. data/spec/cassettes/can_success_create_a_webhook.yml +102 -0
  90. data/spec/cassettes/can_success_delete_a_custom_field_option.yml +389 -0
  91. data/spec/cassettes/can_success_delete_checklist.yml +284 -0
  92. data/spec/cassettes/can_success_get_card_of_board_by_card_id.yml +188 -0
  93. data/spec/cassettes/can_success_remove_member_from_board.yml +186 -0
  94. data/spec/cassettes/can_success_return_all_boards_of_current_user.yml +195 -0
  95. data/spec/cassettes/can_success_upate_a_board.yml +191 -0
  96. data/spec/cassettes/can_success_upate_a_list.yml +296 -0
  97. data/spec/cassettes/can_success_update_bong_a_board.yml +39 -39
  98. data/spec/cassettes/can_success_update_bong_a_board_with_specific_fields.yml +284 -0
  99. data/spec/cassettes/can_success_update_bong_a_checklist_with_specific_fields.yml +296 -0
  100. data/spec/cassettes/can_success_update_bong_a_custom_field.yml +200 -0
  101. data/spec/cassettes/can_success_update_bong_a_label.yml +200 -0
  102. data/spec/cassettes/can_success_update_bong_a_list.yml +199 -0
  103. data/spec/cassettes/can_success_update_bong_a_list_with_specific_fields.yml +296 -0
  104. data/spec/cassettes/can_success_update_bong_a_organization.yml +203 -0
  105. data/spec/cassettes/can_success_update_bong_a_webhook.yml +296 -0
  106. data/spec/cassettes/checklist_can_add_an_item.yml +296 -0
  107. data/spec/cassettes/checklist_can_update_the_item_state.yml +296 -0
  108. data/spec/cassettes/checklist_find_with_id_and_get_all_fields.yml +100 -0
  109. data/spec/cassettes/comment_delete.yml +331 -0
  110. data/spec/cassettes/comment_find_with_id.yml +116 -0
  111. data/spec/cassettes/custom_field_find_with_id_and_get_all_fields.yml +100 -0
  112. data/spec/cassettes/custom_field_find_with_id_and_get_specific_fields.yml +100 -0
  113. data/spec/cassettes/custom_field_item_save_1.yml +1 -1
  114. data/spec/cassettes/custom_field_item_save_2.yml +1 -1
  115. data/spec/cassettes/custom_field_option_find_with_id.yml +100 -0
  116. data/spec/cassettes/get_board_of_list.yml +197 -0
  117. data/spec/cassettes/get_boards_of_member.yml +207 -0
  118. data/spec/cassettes/label_delete.yml +285 -0
  119. data/spec/cassettes/label_find_with_id.yml +100 -0
  120. data/spec/cassettes/list_find_with_id_and_get_all_fields.yml +100 -0
  121. data/spec/cassettes/list_find_with_id_and_get_specific_fields.yml +100 -0
  122. data/spec/cassettes/member_find_with_id_and_get_all_fields.yml +101 -0
  123. data/spec/cassettes/member_find_with_id_and_get_specific_fields.yml +100 -0
  124. data/spec/cassettes/notification_find_with_id.yml +103 -0
  125. data/spec/cassettes/organization_find_with_id_and_get_all_fields.yml +102 -0
  126. data/spec/cassettes/organization_find_with_id_and_get_specific_fields.yml +100 -0
  127. data/spec/cassettes/token_find_with_token_string.yml +100 -0
  128. data/spec/cassettes/webhook_delete.yml +286 -0
  129. data/spec/cassettes/webhook_find_with_id.yml +100 -0
  130. data/spec/checklist_spec.rb +27 -43
  131. data/spec/client_spec.rb +57 -3
  132. data/spec/configuration_spec.rb +13 -0
  133. data/spec/custom_field_item_spec.rb +2 -2
  134. data/spec/custom_field_option_spec.rb +2 -2
  135. data/spec/custom_field_spec.rb +25 -13
  136. data/spec/integration/action/find_spec.rb +23 -0
  137. data/spec/integration/basic_data/many_spec.rb +4 -0
  138. data/spec/integration/basic_data/schema_spec.rb +156 -0
  139. data/spec/integration/board/add_member_spec.rb +20 -0
  140. data/spec/integration/board/all_spec.rb +20 -0
  141. data/spec/integration/board/associations/actions_spec.rb +18 -0
  142. data/spec/integration/board/associations/cards_spec.rb +18 -0
  143. data/spec/integration/board/associations/checklists_spec.rb +18 -0
  144. data/spec/integration/board/associations/custom_fields_spec.rb +18 -0
  145. data/spec/integration/board/associations/label_names_spec.rb +17 -0
  146. data/spec/integration/board/associations/labels_spec.rb +18 -0
  147. data/spec/integration/board/associations/lists_spec.rb +18 -0
  148. data/spec/integration/board/associations/members_spec.rb +18 -0
  149. data/spec/integration/board/associations/organization_spec.rb +19 -0
  150. data/spec/integration/board/associations/plugin_data_spec.rb +18 -0
  151. data/spec/integration/board/create_spec.rb +95 -0
  152. data/spec/integration/board/find_card_spec.rb +18 -0
  153. data/spec/integration/board/find_spec.rb +42 -0
  154. data/spec/integration/board/remove_member_spec.rb +21 -0
  155. data/spec/integration/board/save_spec.rb +37 -0
  156. data/spec/integration/board/update!_spec.rb +33 -2
  157. data/spec/integration/card/associations/plugin_data_spec.rb +1 -1
  158. data/spec/integration/card/create_spec.rb +36 -2
  159. data/spec/integration/card/delete_spec.rb +2 -2
  160. data/spec/integration/card/find_spec.rb +1 -1
  161. data/spec/integration/card/save_spec.rb +2 -2
  162. data/spec/integration/checklist/add_item_spec.rb +20 -0
  163. data/spec/integration/checklist/create_spec.rb +23 -0
  164. data/spec/integration/checklist/delete_spec.rb +17 -0
  165. data/spec/integration/checklist/find_spec.rb +22 -0
  166. data/spec/integration/checklist/update!_spec.rb +21 -0
  167. data/spec/integration/checklist/update_item_state_spec.rb +20 -0
  168. data/spec/integration/comment/association/board_spec.rb +17 -0
  169. data/spec/integration/comment/association/card_spec.rb +17 -0
  170. data/spec/integration/comment/association/list_spec.rb +17 -0
  171. data/spec/integration/comment/delete_spec.rb +20 -0
  172. data/spec/integration/comment/find_spec.rb +17 -0
  173. data/spec/integration/custom_field/association/board_spec.rb +18 -0
  174. data/spec/integration/custom_field/association/custom_field_options_spec.rb +18 -0
  175. data/spec/integration/custom_field/create_spec.rb +29 -0
  176. data/spec/integration/custom_field/find_spec.rb +41 -0
  177. data/spec/integration/custom_field/update!_spec.rb +25 -0
  178. data/spec/integration/custom_field_option/create_spec.rb +23 -0
  179. data/spec/integration/custom_field_option/delete_spec.rb +19 -0
  180. data/spec/integration/custom_field_option/find_spec.rb +21 -0
  181. data/spec/integration/integration_test.rb +3 -3
  182. data/spec/integration/label/association/board_spec.rb +18 -0
  183. data/spec/integration/label/create_spec.rb +23 -0
  184. data/spec/integration/label/delete_spec.rb +21 -0
  185. data/spec/integration/label/find_spec.rb +20 -0
  186. data/spec/integration/label/update!_spec.rb +25 -0
  187. data/spec/integration/list/archive_all_cards_spec.rb +20 -0
  188. data/spec/integration/list/associations/actions_spec.rb +18 -0
  189. data/spec/integration/list/associations/board_spec.rb +18 -0
  190. data/spec/integration/list/associations/cards_spec.rb +18 -0
  191. data/spec/integration/list/create_spec.rb +44 -0
  192. data/spec/integration/list/find_spec.rb +37 -0
  193. data/spec/integration/list/move_all_cards_spec.rb +31 -0
  194. data/spec/integration/list/save_spec.rb +40 -0
  195. data/spec/integration/list/update!_spec.rb +43 -0
  196. data/spec/integration/member/associations/actions_spec.rb +17 -0
  197. data/spec/integration/member/associations/boards_spec.rb +18 -0
  198. data/spec/integration/member/associations/cards_spec.rb +18 -0
  199. data/spec/integration/member/associations/notifications_spec.rb +18 -0
  200. data/spec/integration/member/associations/organizations_spec.rb +18 -0
  201. data/spec/integration/member/find_spec.rb +39 -0
  202. data/spec/integration/member/update!_spec.rb +18 -0
  203. data/spec/integration/notification/find_spec.rb +27 -0
  204. data/spec/integration/organization/associations/actions_spec.rb +18 -0
  205. data/spec/integration/organization/associations/boards_spec.rb +18 -0
  206. data/spec/integration/organization/associations/members_spec.rb +18 -0
  207. data/spec/integration/organization/create_spec.rb +23 -0
  208. data/spec/integration/organization/find_spec.rb +37 -0
  209. data/spec/integration/organization/update!_spec.rb +28 -0
  210. data/spec/integration/token/find_spec.rb +24 -0
  211. data/spec/integration/webhook/create_spec.rb +27 -0
  212. data/spec/integration/webhook/delete_spec.rb +21 -0
  213. data/spec/integration/webhook/find_spec.rb +22 -0
  214. data/spec/integration/webhook/update!_spec.rb +24 -0
  215. data/spec/item_spec.rb +2 -2
  216. data/spec/label_spec.rb +31 -33
  217. data/spec/list_spec.rb +32 -14
  218. data/spec/notification_spec.rb +3 -3
  219. data/spec/organization_spec.rb +6 -5
  220. data/spec/spec_helper.rb +31 -14
  221. data/spec/token_spec.rb +10 -11
  222. data/spec/unit/trello/basic_data_spec.rb +67 -8
  223. data/spec/unit/trello/board/new_spec.rb +370 -0
  224. data/spec/unit/trello/board/save_spec.rb +49 -0
  225. data/spec/unit/trello/board/update_fields_spec.rb +129 -0
  226. data/spec/unit/trello/board/update_spec.rb +197 -0
  227. data/spec/unit/trello/member/new_spec.rb +62 -0
  228. data/spec/unit/trello/member/update_fields_spec.rb +80 -0
  229. data/spec/unit/trello/schema/attribute/base_spec.rb +349 -0
  230. data/spec/unit/trello/schema/attribute/board_pref_spec.rb +208 -0
  231. data/spec/unit/trello/schema/attribute/default_spec.rb +236 -0
  232. data/spec/unit/trello/schema/attribute_builder_spec.rb +55 -0
  233. data/spec/unit/trello/schema/attribute_registration_spec.rb +59 -0
  234. data/spec/unit/trello/schema/serializer/default_spec.rb +19 -0
  235. data/spec/unit/trello/schema/serializer/time_spec.rb +39 -0
  236. data/spec/unit/trello/schema_spec.rb +25 -0
  237. data/spec/webhook_spec.rb +23 -7
  238. metadata +444 -102
  239. data/lib/trello/register_attributes.rb +0 -54
  240. data/spec/integration/basic_data/register_attributes_spec.rb +0 -75
data/spec/board_spec.rb CHANGED
@@ -6,7 +6,7 @@ module Trello
6
6
 
7
7
  let(:board) { client.find(:board, 'abcdef123456789123456789') }
8
8
  let(:client) { Client.new }
9
- let(:member) { Member.new(user_payload) }
9
+ let(:member) { Member.new(JSON.parse(user_payload)) }
10
10
 
11
11
  before do
12
12
  allow(client)
@@ -21,7 +21,7 @@ module Trello
21
21
  it "delegates to client#find" do
22
22
  expect(client)
23
23
  .to receive(:find)
24
- .with(:board, 'abcdef123456789123456789', {})
24
+ .with('board', 'abcdef123456789123456789', {})
25
25
 
26
26
  Board.find('abcdef123456789123456789')
27
27
  end
@@ -31,6 +31,35 @@ module Trello
31
31
  end
32
32
  end
33
33
 
34
+ describe '.create' do
35
+ before { allow(Board).to receive(:client).and_return(client) }
36
+
37
+ it 'will call create on client with correct parameters' do
38
+ params = {
39
+ name: 'Board Name',
40
+ use_default_labels: true,
41
+ use_default_lists: true,
42
+ description: 'description...',
43
+ organization_id: 11111,
44
+ source_board_id: 22222,
45
+ keep_cards_from_source: true,
46
+ power_ups: 'all',
47
+ visibility_level: 'org',
48
+ voting_permission_level: 'org',
49
+ comment_permission_level: 'org',
50
+ invitation_permission_level: 'admins',
51
+ enable_self_join: true,
52
+ enable_card_covers: true,
53
+ background_color: 'orange',
54
+ card_aging_type: 'pirate'
55
+ }
56
+
57
+ expect(client).to receive(:create).with('board', params)
58
+
59
+ Board.create(params)
60
+ end
61
+ end
62
+
34
63
  context "self.all" do
35
64
  let(:client) { Trello.client }
36
65
 
@@ -133,12 +162,10 @@ module Trello
133
162
  expect(labels[2].id).to eq('cbcdef123456789123456789')
134
163
  expect(labels[2].board_id).to eq('abcdef123456789123456789')
135
164
  expect(labels[2].name).to eq('deploy')
136
- expect(labels[2].uses).to eq(2)
137
165
  expect(labels[3].color).to eq('blue')
138
166
  expect(labels[3].id).to eq('dbcdef123456789123456789')
139
167
  expect(labels[3].board_id).to eq('abcdef123456789123456789')
140
168
  expect(labels[3].name).to eq('on hold')
141
- expect(labels[3].uses).to eq(6)
142
169
  end
143
170
 
144
171
  it "passes the label limit" do
@@ -170,7 +197,7 @@ module Trello
170
197
  it "adds a member to the board as a normal user (default)" do
171
198
  expect(client)
172
199
  .to receive(:put)
173
- .with("/boards/abcdef123456789123456789/members/id", type: :normal)
200
+ .with("/boards/abcdef123456789123456789/members/#{member.id}", type: :normal)
174
201
 
175
202
  board.add_member(member)
176
203
  end
@@ -178,7 +205,7 @@ module Trello
178
205
  it "adds a member to the board as an admin" do
179
206
  expect(client)
180
207
  .to receive(:put)
181
- .with("/boards/abcdef123456789123456789/members/id", type: :admin)
208
+ .with("/boards/abcdef123456789123456789/members/#{member.id}", type: :admin)
182
209
 
183
210
  board.add_member(member, :admin)
184
211
  end
@@ -193,7 +220,7 @@ module Trello
193
220
  it "removes a member from the board" do
194
221
  expect(client)
195
222
  .to receive(:delete)
196
- .with("/boards/abcdef123456789123456789/members/id")
223
+ .with("/boards/abcdef123456789123456789/members/#{member.id}")
197
224
 
198
225
  board.remove_member(member)
199
226
  end
@@ -264,62 +291,15 @@ module Trello
264
291
  end
265
292
  end
266
293
 
267
- it "is not closed" do
268
- expect(board).not_to be_closed
269
- end
270
-
271
- it "is not starred" do
272
- expect(board).not_to be_starred
273
- end
274
-
275
- describe "#update_fields" do
276
- it "does not set any fields when the fields argument is empty" do
277
- expected = {
278
- 'id' => "id",
279
- 'name' => "name",
280
- 'desc' => "desc",
281
- 'closed' => false,
282
- 'starred' => false,
283
- 'url' => "url",
284
- 'idOrganization' => "org_id"
285
- }
286
-
287
- board = Board.new(expected)
288
- board.client = client
289
-
290
- board.update_fields({})
291
-
292
- expected.each_pair do |key, value|
293
- if board.respond_to?(key)
294
- expect(board.send(key)).to eq value
295
- end
296
- end
297
-
298
- expect(board.description).to eq expected['desc']
299
- expect(board.organization_id).to eq expected['idOrganization']
300
- end
301
-
302
- it "initializes all fields from response-like formatted hash" do
303
- board_details = boards_details.first
304
- board = Board.new(board_details)
305
- expect(board.id).to eq board_details['id']
306
- expect(board.name).to eq board_details['name']
307
- expect(board.description).to eq board_details['desc']
308
- expect(board.closed).to eq board_details['closed']
309
- expect(board.starred).to eq board_details['starred']
310
- expect(board.organization_id).to eq board_details['idOrganization']
311
- expect(board.url).to eq board_details['url']
312
- expect(board.last_activity_date).to eq board_details['dateLastActivity']
294
+ describe '#closed?' do
295
+ it "returns the closed attribute" do
296
+ expect(board.closed?).to be_falsy
313
297
  end
298
+ end
314
299
 
315
- it "initializes all fields from options-like formatted hash" do
316
- board_details = boards_details[1]
317
- board = Board.new(board_details)
318
- expect(board.name).to eq board_details[:name]
319
- expect(board.description).to eq board_details[:desc]
320
- expect(board.closed).to eq board_details[:closed]
321
- expect(board.starred).to eq board_details[:starred]
322
- expect(board.organization_id).to eq board_details[:organization_id]
300
+ describe '#starred?' do
301
+ it "returns the starred attribute" do
302
+ expect(board.starred?).to be_falsy
323
303
  end
324
304
  end
325
305
 
@@ -342,17 +322,6 @@ module Trello
342
322
  }.to raise_error(Trello::ConfigurationError)
343
323
  end
344
324
 
345
- it "puts all fields except id" do
346
- expected_fields = %w{ name desc closed starred idOrganization}.map { |s| s.to_sym }
347
-
348
- expect(client).to receive(:put) do |anything, body|
349
- expect(body.keys).to match expected_fields
350
- any_board_json
351
- end
352
-
353
- Board.new('id' => "xxx").save
354
- end
355
-
356
325
  it "mutates the current instance" do
357
326
  allow(client)
358
327
  .to receive(:put)
@@ -366,7 +335,7 @@ module Trello
366
335
  expected_resource_id = "xxx_board_id_xxx"
367
336
 
368
337
  expect(client).to receive(:put) do |path, anything|
369
- expect(path).to match(/#{expected_resource_id}\/\z/)
338
+ expect(path).to match(/#{expected_resource_id}\z/)
370
339
  any_board_json
371
340
  end
372
341
 
@@ -376,35 +345,6 @@ module Trello
376
345
  it "saves OR updates depending on whether or not it has an id set"
377
346
  end
378
347
 
379
- describe '#update!' do
380
- let(:client) { Trello.client }
381
-
382
- let(:any_board_json) do
383
- JSON.generate(boards_details.first)
384
- end
385
-
386
- it "puts basic attributes" do
387
- board = Board.new 'id' => "board_id"
388
-
389
- board.name = "new name"
390
- board.description = "new description"
391
- board.closed = true
392
- board.starred = true
393
-
394
- expect(client)
395
- .to receive(:put)
396
- .with("/boards/#{board.id}/", {
397
- name: "new name",
398
- desc: "new description",
399
- closed: true,
400
- starred: true,
401
- idOrganization: nil })
402
- .and_return any_board_json
403
-
404
- board.update!
405
- end
406
- end
407
-
408
348
  describe "Repository" do
409
349
  include Helpers
410
350
 
@@ -421,7 +361,7 @@ module Trello
421
361
 
422
362
  it "creates a new board with whatever attributes are supplied " do
423
363
  expected_attributes = { name: "Any new board name", description: "Any new board desription" }
424
- sent_attributes = { name: expected_attributes[:name], desc: expected_attributes[:description] }
364
+ sent_attributes = { 'name' => expected_attributes[:name], 'desc' => expected_attributes[:description] }
425
365
 
426
366
  expect(client)
427
367
  .to receive(:post)
data/spec/card_spec.rb CHANGED
@@ -25,7 +25,7 @@ module Trello
25
25
  it "delegates to Trello.client#find" do
26
26
  expect(client)
27
27
  .to receive(:find)
28
- .with(:card, 'abcdef123456789123456789', {})
28
+ .with('card', 'abcdef123456789123456789', {})
29
29
 
30
30
  Card.find('abcdef123456789123456789')
31
31
  end
@@ -62,7 +62,8 @@ module Trello
62
62
  expect(card.url).to eq(card_details['url'])
63
63
  expect(card.short_url).to eq(card_details['shortUrl'])
64
64
  expect(card.pos).to eq(card_details['pos'])
65
- expect(card.last_activity_date).to eq(card_details['dateLastActivity'])
65
+ expect(card.last_activity_date).to be_a(Time)
66
+ expect(card.last_activity_date).to eq(Time.iso8601(card_details['dateLastActivity']))
66
67
  end
67
68
 
68
69
  it 'properly initializes all fields from options-like formatted hash' do
@@ -73,7 +74,7 @@ module Trello
73
74
  expect(card.desc).to eq(card_details[:desc])
74
75
  expect(card.member_ids).to eq(card_details[:member_ids])
75
76
  expect(card.card_labels).to eq(card_details[:card_labels])
76
- expect(card.due).to eq(card_details[:due])
77
+ expect(card.due).to eq(card_details[:due].to_time)
77
78
  expect(card.pos).to eq(card_details[:pos])
78
79
  expect(card.source_card_id).to eq(card_details[:source_card_id])
79
80
  expect(card.source_card_properties).to eq(card_details[:source_card_properties])
@@ -96,17 +97,18 @@ module Trello
96
97
  card_labels: "abcdef123456789123456789"
97
98
  }
98
99
 
99
- result = JSON.generate(cards_details.first.merge(payload.merge(idList: lists_details.first['id'])))
100
-
101
- expected_payload = {name: "Test Card", desc: nil, idList: "abcdef123456789123456789",
102
- idMembers: nil, idLabels: "abcdef123456789123456789", pos: nil, due: nil, dueComplete: false, idCardSource: nil, keepFromSource: 'all'}
100
+ expected_payload = {
101
+ 'name' => "Test Card",
102
+ 'idList' => "abcdef123456789123456789",
103
+ 'idLabels' => "abcdef123456789123456789",
104
+ }
103
105
 
104
106
  expect(client)
105
107
  .to receive(:post)
106
108
  .with("/cards", expected_payload)
107
- .and_return result
109
+ .and_return JSON.generate(cards_details.first.merge(payload.merge(idList: lists_details.first['id'])))
108
110
 
109
- card = Card.create(cards_details.first.merge(payload.merge(list_id: lists_details.first['id'])))
111
+ card = Card.create(payload.merge(list_id: lists_details.first['id']))
110
112
 
111
113
  expect(card).to be_a Card
112
114
  end
@@ -118,15 +120,17 @@ module Trello
118
120
 
119
121
  result = JSON.generate(cards_details.first.merge(payload.merge(idList: lists_details.first['id'])))
120
122
 
121
- expected_payload = {name: nil, desc: nil, idList: "abcdef123456789123456789",
122
- idMembers: nil, idLabels: nil, pos: nil, due: nil, dueComplete: false, idCardSource: cards_details.first['id'], keepFromSource: 'all'}
123
+ expected_payload = {
124
+ 'idList' => "abcdef123456789123456789",
125
+ 'idCardSource' => cards_details.first['id'],
126
+ }
123
127
 
124
128
  expect(client)
125
129
  .to receive(:post)
126
130
  .with("/cards", expected_payload)
127
131
  .and_return result
128
132
 
129
- card = Card.create(cards_details.first.merge(payload.merge(list_id: lists_details.first['id'])))
133
+ card = Card.create(payload.merge(list_id: lists_details.first['id']))
130
134
 
131
135
  expect(card).to be_a Card
132
136
  end
@@ -139,15 +143,18 @@ module Trello
139
143
 
140
144
  result = JSON.generate(cards_details.first.merge(payload.merge(idList: lists_details.first['id'])))
141
145
 
142
- expected_payload = {name: nil, desc: nil, idList: "abcdef123456789123456789",
143
- idMembers: nil, idLabels: nil, pos: nil, due: nil, dueComplete: false, idCardSource: cards_details.first['id'], keepFromSource: ['due', 'checklists']}
146
+ expected_payload = {
147
+ 'idList' => "abcdef123456789123456789",
148
+ 'idCardSource' => cards_details.first['id'],
149
+ 'keepFromSource' => ['due', 'checklists']
150
+ }
144
151
 
145
152
  expect(client)
146
153
  .to receive(:post)
147
154
  .with("/cards", expected_payload)
148
155
  .and_return result
149
156
 
150
- card = Card.create(cards_details.first.merge(payload.merge(list_id: lists_details.first['id'])))
157
+ card = Card.create(payload.merge(list_id: lists_details.first['id']))
151
158
 
152
159
  expect(card).to be_a Card
153
160
  end
@@ -160,15 +167,17 @@ module Trello
160
167
 
161
168
  result = JSON.generate(cards_details.first.merge(payload.merge(idList: lists_details.first['id'])))
162
169
 
163
- expected_payload = {name: nil, desc: nil, idList: "abcdef123456789123456789",
164
- idMembers: nil, idLabels: nil, pos: nil, due: nil, dueComplete: false, idCardSource: cards_details.first['id'], keepFromSource: nil}
170
+ expected_payload = {
171
+ 'idList' => "abcdef123456789123456789",
172
+ 'idCardSource' => cards_details.first['id'],
173
+ }
165
174
 
166
175
  expect(client)
167
176
  .to receive(:post)
168
177
  .with("/cards", expected_payload)
169
178
  .and_return result
170
179
 
171
- card = Card.create(cards_details.first.merge(payload.merge(list_id: lists_details.first['id'])))
180
+ card = Card.create(payload.merge(list_id: lists_details.first['id']))
172
181
 
173
182
  expect(card).to be_a Card
174
183
  end
@@ -180,7 +189,7 @@ module Trello
180
189
  expected_new_name = "xxx"
181
190
 
182
191
  payload = {
183
- name: expected_new_name,
192
+ 'name' => expected_new_name,
184
193
  }
185
194
 
186
195
  expect(client)
@@ -197,7 +206,7 @@ module Trello
197
206
  expected_new_desc = "xxx"
198
207
 
199
208
  payload = {
200
- desc: expected_new_desc,
209
+ 'desc' => expected_new_desc,
201
210
  }
202
211
 
203
212
  expect(client)
@@ -358,17 +367,26 @@ module Trello
358
367
 
359
368
  expect(client)
360
369
  .to receive(:put)
361
- .with("/card/abcdef123456789123456789/customField/abcdef123456789123456789/item", params)
370
+ .with("/cards/abcdef123456789123456789/customField/abcdef123456789123456789/item", params)
362
371
 
363
372
  card.custom_field_items.last.remove
364
373
  end
365
374
 
366
375
  it "updates a custom field value" do
367
- payload = { value: { text: 'Test Text' } }
376
+ payload = { 'value' => { 'text' => 'Test Text' } }
368
377
 
369
378
  expect(client)
370
379
  .to receive(:put)
371
- .with("/card/abcdef123456789123456789/customField/abcdef123456789123456789/item", payload)
380
+ .with("/cards/abcdef123456789123456789/customField/abcdef123456789123456789/item", payload)
381
+ .and_return(JSON.generate({
382
+ "id" => "5e68e885e4baf545ec8ce7ba",
383
+ "value" => {
384
+ "text" => "Test Text"
385
+ },
386
+ "idCustomField" => "abcdef123456789123456789",
387
+ "idModel" => "abcdef123456789123456789",
388
+ "modelType" => "card"
389
+ }))
372
390
 
373
391
  text_custom_field = card.custom_field_items.last
374
392
  text_custom_field.value = { text: 'Test Text' }
@@ -626,12 +644,10 @@ module Trello
626
644
  expect(labels[0].id).to eq('abcdef123456789123456789')
627
645
  expect(labels[0].board_id).to eq('abcdef123456789123456789')
628
646
  expect(labels[0].name).to eq('iOS')
629
- expect(labels[0].uses).to eq(3)
630
647
  expect(labels[1].color).to eq('purple')
631
648
  expect(labels[1].id).to eq('bbcdef123456789123456789')
632
649
  expect(labels[1].board_id).to eq('abcdef123456789123456789')
633
650
  expect(labels[1].name).to eq('Issue or bug')
634
- expect(labels[1].uses).to eq(1)
635
651
  end
636
652
 
637
653
  it "includes label ids list" do
@@ -691,18 +707,18 @@ module Trello
691
707
 
692
708
  first_plugin = card.plugin_data.first
693
709
  expect(first_plugin.id).to eq plugin_data_details[0]["id"]
694
- expect(first_plugin.idPlugin).to eq plugin_data_details[0]["idPlugin"]
710
+ expect(first_plugin.plugin_id).to eq plugin_data_details[0]["idPlugin"]
695
711
  expect(first_plugin.scope).to eq plugin_data_details[0]["scope"]
696
- expect(first_plugin.idModel).to eq plugin_data_details[0]["idModel"]
697
- expect(first_plugin.value).to eq JSON.parse plugin_data_details[0]["value"]
712
+ expect(first_plugin.model_id).to eq plugin_data_details[0]["idModel"]
713
+ expect(first_plugin.value).to eq plugin_data_details[0]["value"]
698
714
  expect(first_plugin.access).to eq plugin_data_details[0]["access"]
699
715
 
700
716
  second_plugin = card.plugin_data[1]
701
717
  expect(second_plugin.id).to eq plugin_data_details[1]["id"]
702
- expect(second_plugin.idPlugin).to eq plugin_data_details[1]["idPlugin"]
718
+ expect(second_plugin.plugin_id).to eq plugin_data_details[1]["idPlugin"]
703
719
  expect(second_plugin.scope).to eq plugin_data_details[1]["scope"]
704
- expect(second_plugin.idModel).to eq plugin_data_details[1]["idModel"]
705
- expect(second_plugin.value).to eq JSON.parse plugin_data_details[1]["value"]
720
+ expect(second_plugin.model_id).to eq plugin_data_details[1]["idModel"]
721
+ expect(second_plugin.value).to eq plugin_data_details[1]["value"]
706
722
  expect(second_plugin.access).to eq plugin_data_details[1]["access"]
707
723
 
708
724
  end
@@ -786,7 +802,7 @@ module Trello
786
802
 
787
803
  describe "#close!" do
788
804
  it "updates the close attribute to true and saves the list" do
789
- payload = { closed: true }
805
+ payload = { 'closed' => true }
790
806
 
791
807
  expect(client)
792
808
  .to receive(:put)
@@ -803,7 +819,7 @@ module Trello
803
819
  due_date = Time.now
804
820
 
805
821
  payload = {
806
- due: due_date,
822
+ 'due' => due_date.strftime('%FT%T.%LZ'),
807
823
  }
808
824
 
809
825
  expect(client)
@@ -816,21 +832,6 @@ module Trello
816
832
  card.save
817
833
 
818
834
  expect(card.due).to_not be_nil
819
-
820
- payload = {
821
- dueComplete: true
822
- }
823
-
824
- expect(client)
825
- .to receive(:put)
826
- .once
827
- .with("/cards/abcdef123456789123456789", payload)
828
- .and_return(payload.to_json)
829
-
830
- card.due_complete = true
831
- card.save
832
-
833
- expect(card.due_complete).to be true
834
835
  end
835
836
  end
836
837
 
@@ -888,7 +889,7 @@ module Trello
888
889
  end
889
890
 
890
891
  context "and the field doesn't changed" do
891
- let(:fields) { { desc: expected[:desc] } }
892
+ let(:fields) { { desc: expected['desc'] } }
892
893
 
893
894
  it "card attributes doesn't changed" do
894
895
  card.update_fields(fields)
@@ -896,7 +897,7 @@ module Trello
896
897
  expect(card.desc).to eq(expected['desc'])
897
898
  end
898
899
 
899
- it "card hasn't been mark as changed", pending: true do
900
+ it "card hasn't been mark as changed" do
900
901
  card.update_fields(fields)
901
902
 
902
903
  expect(card.changed?).to be_falsy
@@ -0,0 +1,104 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.trello.com/1/actions/5f60f07958388d26dc063c30?key=DEVELOPER_PUBLIC_KEY&token=MEMBER_TOKEN
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - "*/*"
12
+ User-Agent:
13
+ - rest-client/2.1.0 (linux-gnu x86_64) ruby/2.6.6p146
14
+ Accept-Encoding:
15
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
16
+ Host:
17
+ - api.trello.com
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: OK
22
+ headers:
23
+ X-Dns-Prefetch-Control:
24
+ - 'off'
25
+ X-Frame-Options:
26
+ - DENY
27
+ X-Download-Options:
28
+ - noopen
29
+ X-Permitted-Cross-Domain-Policies:
30
+ - none
31
+ Referrer-Policy:
32
+ - strict-origin-when-cross-origin
33
+ Surrogate-Control:
34
+ - no-store
35
+ Cache-Control:
36
+ - max-age=0, must-revalidate, no-cache, no-store
37
+ Pragma:
38
+ - no-cache
39
+ Expires:
40
+ - Thu, 01 Jan 1970 00:00:00
41
+ X-Trello-Version:
42
+ - 1.2239.2
43
+ X-Trello-Environment:
44
+ - Production
45
+ Set-Cookie:
46
+ - dsc=set_cookie_dsc; Path=/; Expires=Thu, 01 Oct 2020 14:31:36 GMT; Secure
47
+ Access-Control-Allow-Origin:
48
+ - "*"
49
+ Access-Control-Allow-Methods:
50
+ - GET, PUT, POST, DELETE
51
+ Access-Control-Allow-Headers:
52
+ - Authorization, Accept, Content-Type
53
+ Access-Control-Expose-Headers:
54
+ - x-rate-limit-api-key-interval-ms, x-rate-limit-api-key-max, x-rate-limit-api-key-remaining,
55
+ x-rate-limit-api-token-interval-ms, x-rate-limit-api-token-max, x-rate-limit-api-token-remaining
56
+ X-Rate-Limit-Api-Token-Interval-Ms:
57
+ - '10000'
58
+ X-Rate-Limit-Api-Token-Max:
59
+ - '100'
60
+ X-Rate-Limit-Api-Token-Remaining:
61
+ - '99'
62
+ X-Rate-Limit-Api-Key-Interval-Ms:
63
+ - '10000'
64
+ X-Rate-Limit-Api-Key-Max:
65
+ - '300'
66
+ X-Rate-Limit-Api-Key-Remaining:
67
+ - '299'
68
+ X-Rate-Limit-Member-Interval-Ms:
69
+ - '10000'
70
+ X-Rate-Limit-Member-Max:
71
+ - '200'
72
+ X-Rate-Limit-Member-Remaining:
73
+ - '199'
74
+ X-Server-Time:
75
+ - '1601303496725'
76
+ Content-Type:
77
+ - application/json; charset=utf-8
78
+ Date:
79
+ - Mon, 28 Sep 2020 14:31:36 GMT
80
+ X-Envoy-Upstream-Service-Time:
81
+ - '159'
82
+ Expect-Ct:
83
+ - report-uri="https://web-security-reports.services.atlassian.com/expect-ct-report/trello-edge",
84
+ max-age=86400
85
+ Strict-Transport-Security:
86
+ - max-age=63072000; preload
87
+ X-Content-Type-Options:
88
+ - nosniff
89
+ X-Xss-Protection:
90
+ - 1; mode=block
91
+ Server:
92
+ - globaledge-envoy
93
+ Transfer-Encoding:
94
+ - chunked
95
+ body:
96
+ encoding: ASCII-8BIT
97
+ string: '{"id":"5f60f07958388d26dc063c30","idMemberCreator":"5e679b808e6e8828784b30e1","data":{"board":{"id":"5e93ba98614ac22d22f085c4","name":"IT
98
+ 2","shortLink":"y1TF9GTa"},"customField":{"id":"5f60f07958388d26dc063c2d","name":"Test"}},"type":"createCustomField","date":"2020-09-15T16:48:57.454Z","limits":{},"appCreator":null,"display":{"translationKey":"action_create_custom_field","entities":{"board":{"type":"board","id":"5e93ba98614ac22d22f085c4","text":"IT
99
+ 2","shortLink":"y1TF9GTa"},"customField":{"type":"customField","id":"5f60f07958388d26dc063c2d","text":"Test"},"memberCreator":{"type":"member","id":"5e679b808e6e8828784b30e1","username":"hoppertest","text":"Hopper
100
+ Test"}}},"memberCreator":{"id":"5e679b808e6e8828784b30e1","username":"hoppertest","activityBlocked":false,"avatarHash":null,"avatarUrl":null,"fullName":"Hopper
101
+ Test","idMemberReferrer":null,"initials":"HT","nonPublic":{},"nonPublicAvailable":true}}'
102
+ http_version: null
103
+ recorded_at: Mon, 28 Sep 2020 14:31:36 GMT
104
+ recorded_with: VCR 5.1.0