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
@@ -0,0 +1,286 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.trello.com/1/webhooks/5fa8a1e0009b2a6a669e6efa?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.2278.0
43
+ X-Trello-Environment:
44
+ - Production
45
+ Set-Cookie:
46
+ - dsc=set_cookie_dsc; Path=/; Expires=Thu, 12 Nov 2020 02:08:29 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-Key-Interval-Ms:
57
+ - '10000'
58
+ X-Rate-Limit-Api-Key-Max:
59
+ - '300'
60
+ X-Rate-Limit-Api-Key-Remaining:
61
+ - '299'
62
+ X-Rate-Limit-Api-Token-Interval-Ms:
63
+ - '10000'
64
+ X-Rate-Limit-Api-Token-Max:
65
+ - '100'
66
+ X-Rate-Limit-Api-Token-Remaining:
67
+ - '99'
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
+ - '1604887709725'
76
+ Content-Type:
77
+ - application/json; charset=utf-8
78
+ Date:
79
+ - Mon, 09 Nov 2020 02:08:29 GMT
80
+ X-Envoy-Upstream-Service-Time:
81
+ - '83'
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":"5fa8a1e0009b2a6a669e6efa","description":"Test - Changed","idModel":"5fa759f1564c6e5bb803c61e","callbackURL":"https://example.com/webhook/trello_callbacks","active":true,"consecutiveFailures":0,"firstConsecutiveFailDate":null}'
98
+ http_version: null
99
+ recorded_at: Mon, 09 Nov 2020 02:08:29 GMT
100
+ - request:
101
+ method: delete
102
+ uri: https://api.trello.com/1/webhooks/5fa8a1e0009b2a6a669e6efa?key=DEVELOPER_PUBLIC_KEY&token=MEMBER_TOKEN
103
+ body:
104
+ encoding: US-ASCII
105
+ string: ''
106
+ headers:
107
+ Accept:
108
+ - "*/*"
109
+ User-Agent:
110
+ - rest-client/2.1.0 (linux-gnu x86_64) ruby/2.6.6p146
111
+ Accept-Encoding:
112
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
113
+ Host:
114
+ - api.trello.com
115
+ response:
116
+ status:
117
+ code: 200
118
+ message: OK
119
+ headers:
120
+ X-Dns-Prefetch-Control:
121
+ - 'off'
122
+ X-Frame-Options:
123
+ - DENY
124
+ X-Download-Options:
125
+ - noopen
126
+ X-Permitted-Cross-Domain-Policies:
127
+ - none
128
+ Referrer-Policy:
129
+ - strict-origin-when-cross-origin
130
+ Surrogate-Control:
131
+ - no-store
132
+ Cache-Control:
133
+ - max-age=0, must-revalidate, no-cache, no-store
134
+ Pragma:
135
+ - no-cache
136
+ Expires:
137
+ - Thu, 01 Jan 1970 00:00:00
138
+ X-Trello-Version:
139
+ - 1.2278.0
140
+ X-Trello-Environment:
141
+ - Production
142
+ Access-Control-Allow-Origin:
143
+ - "*"
144
+ Access-Control-Allow-Methods:
145
+ - GET, PUT, POST, DELETE
146
+ Access-Control-Allow-Headers:
147
+ - Authorization, Accept, Content-Type
148
+ Access-Control-Expose-Headers:
149
+ - x-rate-limit-api-key-interval-ms, x-rate-limit-api-key-max, x-rate-limit-api-key-remaining,
150
+ x-rate-limit-api-token-interval-ms, x-rate-limit-api-token-max, x-rate-limit-api-token-remaining
151
+ X-Rate-Limit-Api-Key-Interval-Ms:
152
+ - '10000'
153
+ X-Rate-Limit-Api-Key-Max:
154
+ - '300'
155
+ X-Rate-Limit-Api-Key-Remaining:
156
+ - '299'
157
+ X-Rate-Limit-Api-Token-Interval-Ms:
158
+ - '10000'
159
+ X-Rate-Limit-Api-Token-Max:
160
+ - '100'
161
+ X-Rate-Limit-Api-Token-Remaining:
162
+ - '99'
163
+ X-Rate-Limit-Member-Interval-Ms:
164
+ - '10000'
165
+ X-Rate-Limit-Member-Max:
166
+ - '200'
167
+ X-Rate-Limit-Member-Remaining:
168
+ - '199'
169
+ X-Server-Time:
170
+ - '1604887710401'
171
+ Content-Type:
172
+ - application/json; charset=utf-8
173
+ Date:
174
+ - Mon, 09 Nov 2020 02:08:30 GMT
175
+ X-Envoy-Upstream-Service-Time:
176
+ - '80'
177
+ Expect-Ct:
178
+ - report-uri="https://web-security-reports.services.atlassian.com/expect-ct-report/trello-edge",
179
+ max-age=86400
180
+ Strict-Transport-Security:
181
+ - max-age=63072000; preload
182
+ X-Content-Type-Options:
183
+ - nosniff
184
+ X-Xss-Protection:
185
+ - 1; mode=block
186
+ Server:
187
+ - globaledge-envoy
188
+ Transfer-Encoding:
189
+ - chunked
190
+ body:
191
+ encoding: ASCII-8BIT
192
+ string: '{"_value":null}
193
+
194
+ '
195
+ http_version: null
196
+ recorded_at: Mon, 09 Nov 2020 02:08:30 GMT
197
+ - request:
198
+ method: get
199
+ uri: https://api.trello.com/1/webhooks/5fa8a1e0009b2a6a669e6efa?key=DEVELOPER_PUBLIC_KEY&token=MEMBER_TOKEN
200
+ body:
201
+ encoding: US-ASCII
202
+ string: ''
203
+ headers:
204
+ Accept:
205
+ - "*/*"
206
+ User-Agent:
207
+ - rest-client/2.1.0 (linux-gnu x86_64) ruby/2.6.6p146
208
+ Accept-Encoding:
209
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
210
+ Host:
211
+ - api.trello.com
212
+ response:
213
+ status:
214
+ code: 404
215
+ message: Not Found
216
+ headers:
217
+ X-Dns-Prefetch-Control:
218
+ - 'off'
219
+ X-Frame-Options:
220
+ - DENY
221
+ X-Download-Options:
222
+ - noopen
223
+ X-Permitted-Cross-Domain-Policies:
224
+ - none
225
+ Referrer-Policy:
226
+ - strict-origin-when-cross-origin
227
+ Surrogate-Control:
228
+ - no-store
229
+ Cache-Control:
230
+ - no-store, no-cache, must-revalidate, proxy-revalidate
231
+ Pragma:
232
+ - no-cache
233
+ Expires:
234
+ - '0'
235
+ X-Trello-Version:
236
+ - 1.2278.0
237
+ X-Trello-Environment:
238
+ - Production
239
+ Set-Cookie:
240
+ - dsc=set_cookie_dsc; Path=/; Expires=Thu, 12 Nov 2020 02:08:31 GMT; Secure
241
+ Access-Control-Allow-Origin:
242
+ - "*"
243
+ Access-Control-Allow-Methods:
244
+ - GET, PUT, POST, DELETE
245
+ Access-Control-Allow-Headers:
246
+ - Authorization, Accept, Content-Type
247
+ Access-Control-Expose-Headers:
248
+ - x-rate-limit-api-key-interval-ms, x-rate-limit-api-key-max, x-rate-limit-api-key-remaining,
249
+ x-rate-limit-api-token-interval-ms, x-rate-limit-api-token-max, x-rate-limit-api-token-remaining
250
+ X-Rate-Limit-Api-Key-Interval-Ms:
251
+ - '10000'
252
+ X-Rate-Limit-Api-Key-Max:
253
+ - '300'
254
+ X-Rate-Limit-Api-Key-Remaining:
255
+ - '298'
256
+ X-Rate-Limit-Api-Token-Interval-Ms:
257
+ - '10000'
258
+ X-Rate-Limit-Api-Token-Max:
259
+ - '100'
260
+ X-Rate-Limit-Api-Token-Remaining:
261
+ - '98'
262
+ Content-Type:
263
+ - text/plain; charset=utf-8
264
+ Content-Length:
265
+ - '37'
266
+ Date:
267
+ - Mon, 09 Nov 2020 02:08:31 GMT
268
+ X-Envoy-Upstream-Service-Time:
269
+ - '78'
270
+ Expect-Ct:
271
+ - report-uri="https://web-security-reports.services.atlassian.com/expect-ct-report/trello-edge",
272
+ max-age=86400
273
+ Strict-Transport-Security:
274
+ - max-age=63072000; preload
275
+ X-Content-Type-Options:
276
+ - nosniff
277
+ X-Xss-Protection:
278
+ - 1; mode=block
279
+ Server:
280
+ - globaledge-envoy
281
+ body:
282
+ encoding: UTF-8
283
+ string: The requested resource was not found.
284
+ http_version: null
285
+ recorded_at: Mon, 09 Nov 2020 02:08:31 GMT
286
+ recorded_with: VCR 5.1.0
@@ -0,0 +1,100 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.trello.com/1/webhooks/5fa8a1e0009b2a6a669e6efa?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.2278.0
43
+ X-Trello-Environment:
44
+ - Production
45
+ Set-Cookie:
46
+ - dsc=set_cookie_dsc; Path=/; Expires=Thu, 12 Nov 2020 02:02:32 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-Key-Interval-Ms:
57
+ - '10000'
58
+ X-Rate-Limit-Api-Key-Max:
59
+ - '300'
60
+ X-Rate-Limit-Api-Key-Remaining:
61
+ - '299'
62
+ X-Rate-Limit-Api-Token-Interval-Ms:
63
+ - '10000'
64
+ X-Rate-Limit-Api-Token-Max:
65
+ - '100'
66
+ X-Rate-Limit-Api-Token-Remaining:
67
+ - '99'
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
+ - '1604887352812'
76
+ Content-Type:
77
+ - application/json; charset=utf-8
78
+ Date:
79
+ - Mon, 09 Nov 2020 02:02:32 GMT
80
+ X-Envoy-Upstream-Service-Time:
81
+ - '80'
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":"5fa8a1e0009b2a6a669e6efa","description":"test","idModel":"5fa759f1564c6e5bb803c61e","callbackURL":"https://example.com/webhook/trello_callbacks","active":true,"consecutiveFailures":0,"firstConsecutiveFailDate":null}'
98
+ http_version: null
99
+ recorded_at: Mon, 09 Nov 2020 02:02:33 GMT
100
+ recorded_with: VCR 5.1.0
@@ -20,7 +20,7 @@ module Trello
20
20
  it "delegates to Trello.client#find" do
21
21
  expect(client)
22
22
  .to receive(:find)
23
- .with(:checklist, 'abcdef123456789123456789', {})
23
+ .with('checklist', 'abcdef123456789123456789', {})
24
24
 
25
25
  Checklist.find('abcdef123456789123456789')
26
26
  end
@@ -35,41 +35,43 @@ module Trello
35
35
 
36
36
  it 'creates a new record and saves it on Trello', refactor: true do
37
37
  payload = {
38
- name: 'Test Checklist',
39
- desc: '',
40
- card_id: cards_details.first['id']
38
+ name: 'Test Checklist',
39
+ card_id: '5e94fd9443f25a7263b165d0'
41
40
  }
42
41
 
43
- attributes = checklists_details.first.merge(payload).except("idBoard")
44
- result = JSON.generate(attributes)
42
+ result = JSON.generate(payload)
45
43
 
46
-
47
- expected_payload = {name: "Test Checklist", idCard: cards_details.first['id']}
44
+ expected_payload = {
45
+ 'name' => 'Test Checklist',
46
+ 'idCard' => '5e94fd9443f25a7263b165d0'
47
+ }
48
48
 
49
49
  expect(client)
50
50
  .to receive(:post)
51
51
  .with("/checklists", expected_payload)
52
52
  .and_return result
53
53
 
54
- checklist = Checklist.create(attributes)
54
+ checklist = Checklist.create(payload)
55
55
 
56
56
  expect(checklist).to be_a Checklist
57
57
  end
58
58
 
59
59
  it 'initializes all fields from response-like hash' do
60
- checklist_details = checklists_details.first
61
- checklist = Checklist.new(checklist_details)
62
- expect(checklist.id).to eq checklist_details['id']
63
- expect(checklist.name).to eq checklist_details['name']
64
- expect(checklist.description).to eq checklist_details['desc']
65
- expect(checklist.closed).to eq checklist_details['closed']
66
- expect(checklist.position).to eq checklist_details['pos']
67
- expect(checklist.url).to eq checklist_details['url']
68
- expect(checklist.board_id).to eq checklist_details['idBoard']
69
- expect(checklist.card_id).to eq checklist_details['idCard']
70
- expect(checklist.list_id).to eq checklist_details['idList']
71
- expect(checklist.member_ids).to eq checklist_details['idMembers']
72
- expect(checklist.check_items).to eq checklist_details['checkItems']
60
+ checklist = Checklist.new(
61
+ 'id' => 'abcdef123456789123456789',
62
+ 'name' => 'Test Checklist',
63
+ 'pos' => 16384,
64
+ 'idBoard' => 'abcdef123456789123456789',
65
+ 'idCard' => 'abccardid',
66
+ 'checkItems' => { 'id' => 'ghijk987654321' }
67
+ )
68
+
69
+ expect(checklist.id).to eq 'abcdef123456789123456789'
70
+ expect(checklist.name).to eq 'Test Checklist'
71
+ expect(checklist.position).to eq 16384
72
+ expect(checklist.board_id).to eq 'abcdef123456789123456789'
73
+ expect(checklist.card_id).to eq 'abccardid'
74
+ expect(checklist.check_items).to eq({ 'id' => 'ghijk987654321' })
73
75
  end
74
76
 
75
77
  it 'initializes required fields from options-like hash' do
@@ -113,7 +115,7 @@ module Trello
113
115
  result = JSON.generate(checklists_details.first)
114
116
  expect(client)
115
117
  .to receive(:put)
116
- .once.with(expected_resource, payload)
118
+ .once.with(expected_resource, {'name' => expected_new_name})
117
119
  .and_return result
118
120
 
119
121
  checklist.name = expected_new_name
@@ -132,7 +134,7 @@ module Trello
132
134
  expect(client)
133
135
  .to receive(:put)
134
136
  .once
135
- .with(expected_resource, payload)
137
+ .with(expected_resource, {'pos' => expected_new_position})
136
138
  .and_return result
137
139
 
138
140
  checklist.position = expected_new_position
@@ -197,19 +199,6 @@ module Trello
197
199
  end
198
200
  end
199
201
 
200
- context "list" do
201
- before do
202
- allow(client)
203
- .to receive(:get)
204
- .with("/lists/abcdef123456789123456789", {})
205
- .and_return JSON.generate(lists_details.first)
206
- end
207
-
208
- it 'has a list' do
209
- expect(checklist.list).to_not be_nil
210
- end
211
- end
212
-
213
202
  context "making a copy" do
214
203
  let(:client) { Trello.client }
215
204
  let(:copy_options) { { :name => checklist.name, :idCard => checklist.card_id } }
@@ -218,7 +207,7 @@ module Trello
218
207
  before(:each) do
219
208
  allow(client)
220
209
  .to receive(:post)
221
- .with("/checklists", copy_options)
210
+ .with("/checklists", copy_options.stringify_keys)
222
211
  .and_return JSON.generate(copied_checklists_details.first)
223
212
 
224
213
  allow(checklist)
@@ -271,15 +260,10 @@ module Trello
271
260
  expected = {
272
261
  'id' => 'id',
273
262
  'name' => 'name',
274
- 'desc' => 'description',
275
- 'closed' => 'closed',
276
- 'url' => 'url',
277
263
  'checkItems' => 'check_items',
278
264
  'pos' => 'position',
279
265
  'idBoard' => 'board_id',
280
266
  'idCard' => 'card_id',
281
- 'idList' => 'list_id',
282
- 'idMembers' => 'member_ids'
283
267
  }
284
268
 
285
269
  checklist = Checklist.new(expected)
data/spec/client_spec.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  require "spec_helper"
2
+ require "rest-client"
3
+ require "faraday"
2
4
 
3
5
  include Trello
4
6
  include Trello::Authorization
@@ -18,11 +20,16 @@ describe Client do
18
20
  end
19
21
 
20
22
  describe "and how it handles RestClient exceptions" do
23
+
24
+ before do
25
+ Trello.http_client = 'rest-client'
26
+ end
27
+
21
28
  context "with RestClient::Exception sans HTTP code" do
22
29
  let(:rc_exception_without_http_code) { RestClient::Exception.new }
23
30
 
24
31
  before do
25
- allow(TInternet)
32
+ allow(Trello::TRestClient::TInternet)
26
33
  .to receive(:execute_core)
27
34
  .and_raise(rc_exception_without_http_code)
28
35
  end
@@ -39,14 +46,61 @@ describe Client do
39
46
  let(:rc_exception_with_http_code) { RestClient::Exception.new(double("404 error response", {:code => 404, :body => "404 error response"}))}
40
47
 
41
48
  before do
42
- allow(TInternet)
49
+ allow(Trello::TRestClient::TInternet)
43
50
  .to receive(:execute_core)
44
51
  .and_raise(rc_exception_with_http_code)
45
52
  end
46
53
 
47
54
  it "raises Error" do
48
55
 
49
- expect(TInternet)
56
+ expect(Trello::TRestClient::TInternet)
57
+ .to receive(:try_execute)
58
+ .and_return(response_with_non_200_status)
59
+
60
+ expect { client.get "/xxx" }.to raise_error do |error|
61
+ expect(error).to be_a(Error)
62
+ expect(error.message).to eq("404 error response")
63
+ expect(error.status_code).to eq(404)
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ describe "and how it handles Faraday errors" do
70
+
71
+ before do
72
+ Trello.http_client = 'faraday'
73
+ end
74
+
75
+ context "with Faraday::Error sans HTTP code" do
76
+ let(:faraday_error_without_http_code) { Faraday::Error.new("Test error") }
77
+
78
+ before do
79
+ allow(Trello::TFaraday::TInternet)
80
+ .to receive(:execute_core)
81
+ .and_raise(faraday_error_without_http_code)
82
+ end
83
+
84
+ it "bubbles up Faraday::Error errors that don't contain an HTTP code" do
85
+ expect { client.get "/xxx" }.to raise_error faraday_error_without_http_code
86
+ end
87
+ end
88
+
89
+ context "with Faraday::Error that contains HTTP code" do
90
+ let(:response_with_non_200_status) { double "A fake 404 response",
91
+ code: 404,
92
+ body: "404 error response"}
93
+ let(:faraday_error_with_http_code) { Faraday::Error.new(double("404 error response", {:code => 404, :body => "404 error response"}))}
94
+
95
+ before do
96
+ allow(Trello::TFaraday::TInternet)
97
+ .to receive(:execute_core)
98
+ .and_raise(faraday_error_with_http_code)
99
+ end
100
+
101
+ it "raises Error" do
102
+
103
+ expect(Trello::TFaraday::TInternet)
50
104
  .to receive(:try_execute)
51
105
  .and_return(response_with_non_200_status)
52
106
 
@@ -19,6 +19,19 @@ describe Trello::Configuration do
19
19
  end
20
20
  end
21
21
 
22
+ it "only allows http_client to be set to one of Trello::HTTP_CLIENTS" do
23
+ Trello::HTTP_CLIENTS.each do |key, _client|
24
+ configuration.http_client = key
25
+ expect(configuration.http_client).to eq key
26
+ end
27
+ end
28
+
29
+ it "raises an error if an invalid http_client is set" do
30
+ expect {
31
+ configuration.http_client = :invalid_http_client
32
+ }.to raise_error(ArgumentError)
33
+ end
34
+
22
35
  it 'has a callback (for oauth)' do
23
36
  callback = -> { 'foobar' }
24
37
  configuration.callback = callback
@@ -140,7 +140,7 @@ module Trello
140
140
  it 'custom field item does set the changed fields' do
141
141
  text_item.update_fields(fields)
142
142
 
143
- expect(text_item.value).to eq( { number: '42' } )
143
+ expect(text_item.value).to eq( { 'number' => '42' } )
144
144
  end
145
145
 
146
146
  it 'card has been mark as changed' do
@@ -159,7 +159,7 @@ module Trello
159
159
  expect(text_item.value).to eq(text_field_details['value'])
160
160
  end
161
161
 
162
- it "custom field item hasn't been mark as changed", pending: true do
162
+ it "custom field item hasn't been mark as changed" do
163
163
  text_item.update_fields(fields)
164
164
 
165
165
  expect(text_item.changed?).to be_falsy
@@ -27,8 +27,8 @@ module Trello
27
27
  expect(option.value).to eq custom_field_option_details['value']
28
28
  end
29
29
 
30
- it 'gets its pos' do
31
- expect(option.pos).to eq custom_field_option_details['pos']
30
+ it 'gets its position' do
31
+ expect(option.position).to eq custom_field_option_details['pos']
32
32
  end
33
33
  end
34
34