ruby-trello 2.2.0 → 2.3.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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +49 -10
  3. data/lib/trello.rb +47 -35
  4. data/lib/trello/action.rb +4 -2
  5. data/lib/trello/association_builder/has_many.rb +17 -0
  6. data/lib/trello/association_builder/has_one.rb +16 -0
  7. data/lib/trello/association_fetcher/has_many.rb +26 -0
  8. data/lib/trello/association_fetcher/has_many/fetch.rb +47 -0
  9. data/lib/trello/association_fetcher/has_many/params.rb +56 -0
  10. data/lib/trello/association_fetcher/has_one.rb +25 -0
  11. data/lib/trello/association_fetcher/has_one/fetch.rb +49 -0
  12. data/lib/trello/association_fetcher/has_one/params.rb +36 -0
  13. data/lib/trello/association_infer_tool.rb +13 -0
  14. data/lib/trello/association_proxy.rb +1 -1
  15. data/lib/trello/basic_data.rb +7 -48
  16. data/lib/trello/board.rb +1 -1
  17. data/lib/trello/card.rb +88 -36
  18. data/lib/trello/custom_field.rb +26 -9
  19. data/lib/trello/custom_field_item.rb +32 -12
  20. data/lib/trello/label.rb +24 -7
  21. data/lib/trello/member.rb +1 -1
  22. data/lib/trello/register_attributes.rb +54 -0
  23. data/spec/action_spec.rb +1 -1
  24. data/spec/card_spec.rb +98 -22
  25. data/spec/cassettes/can_add_a_file_from_url_on_a_card.yml +189 -0
  26. data/spec/cassettes/can_add_a_file_on_a_card.yml +200 -0
  27. data/spec/cassettes/can_add_a_member_to_a_card.yml +190 -0
  28. data/spec/cassettes/can_add_label_on_a_card.yml +281 -0
  29. data/spec/cassettes/can_close_bong_a_card.yml +189 -0
  30. data/spec/cassettes/can_get_actions.yml +196 -0
  31. data/spec/cassettes/can_get_attachments.yml +187 -0
  32. data/spec/cassettes/can_get_comments.yml +193 -0
  33. data/spec/cassettes/can_move_a_card_to_another_board_with_specific_list.yml +373 -0
  34. data/spec/cassettes/can_move_a_card_to_another_board_without_specific_list.yml +281 -0
  35. data/spec/cassettes/can_move_a_card_to_another_list.yml +281 -0
  36. data/spec/cassettes/can_remove_a_member_from_a_card.yml +185 -0
  37. data/spec/cassettes/can_remove_an_attachment_on_a_card.yml +277 -0
  38. data/spec/cassettes/can_remove_an_upvote_on_a_card.yml +465 -0
  39. data/spec/cassettes/can_remove_label_on_a_card.yml +279 -0
  40. data/spec/cassettes/can_success_add_comment_to_a_card.yml +196 -0
  41. data/spec/cassettes/can_success_copy_checklist_to_a_card.yml +281 -0
  42. data/spec/cassettes/can_success_copy_checklist_to_a_card_without_name_pos.yml +281 -0
  43. data/spec/cassettes/can_success_create_a_card.yml +99 -0
  44. data/spec/cassettes/can_success_create_new_checklist_to_a_card.yml +189 -0
  45. data/spec/cassettes/can_success_delete_card.yml +185 -0
  46. data/spec/cassettes/can_success_upate_a_card.yml +189 -0
  47. data/spec/cassettes/can_success_update_bong_a_card.yml +191 -0
  48. data/spec/cassettes/can_upvote_on_a_card.yml +469 -0
  49. data/spec/cassettes/card_find_with_id_and_get_all_fields.yml +95 -0
  50. data/spec/cassettes/card_find_with_id_and_get_specific_fields.yml +96 -0
  51. data/spec/cassettes/custom_field_item_save_1.yml +97 -0
  52. data/spec/cassettes/custom_field_item_save_2.yml +281 -0
  53. data/spec/cassettes/get_board_of_card.yml +187 -0
  54. data/spec/cassettes/get_check_item_states_of_card.yml +188 -0
  55. data/spec/cassettes/get_checklists_of_card.yml +187 -0
  56. data/spec/cassettes/get_cover_image_of_card.yml +187 -0
  57. data/spec/cassettes/get_custom_field_items_of_card.yml +187 -0
  58. data/spec/cassettes/get_list_of_card.yml +188 -0
  59. data/spec/cassettes/get_lists.yml +187 -0
  60. data/spec/cassettes/get_members_of_card.yml +189 -0
  61. data/spec/cassettes/get_plugin_data_of_card.yml +187 -0
  62. data/spec/cassettes/get_voters_of_card.yml +188 -0
  63. data/spec/cassettes/remove_upvote_on_a_card_when_have_not_voted.yml +366 -0
  64. data/spec/cassettes/revote_on_a_card.yml +464 -0
  65. data/spec/custom_field_item_spec.rb +74 -0
  66. data/spec/custom_field_spec.rb +76 -0
  67. data/spec/integration/basic_data/many_spec.rb +123 -0
  68. data/spec/integration/basic_data/one_spec.rb +84 -0
  69. data/spec/integration/basic_data/register_attributes_spec.rb +75 -0
  70. data/spec/integration/board_lists_spec.rb +21 -0
  71. data/spec/integration/card/add_and_remove_attachment_spec.rb +45 -0
  72. data/spec/integration/card/add_and_remove_label_spec.rb +35 -0
  73. data/spec/integration/card/add_checklist_spec.rb +32 -0
  74. data/spec/integration/card/add_comment_spec.rb +19 -0
  75. data/spec/integration/card/add_memeber_spec.rb +19 -0
  76. data/spec/integration/card/associations/actions_spec.rb +17 -0
  77. data/spec/integration/card/associations/attachments_spec.rb +18 -0
  78. data/spec/integration/card/associations/board_spec.rb +17 -0
  79. data/spec/integration/card/associations/check_item_states_spec.rb +17 -0
  80. data/spec/integration/card/associations/checklists_spec.rb +18 -0
  81. data/spec/integration/card/associations/comments_spec.rb +19 -0
  82. data/spec/integration/card/associations/cover_image_spec.rb +18 -0
  83. data/spec/integration/card/associations/custom_field_items_spec.rb +18 -0
  84. data/spec/integration/card/associations/list_spec.rb +16 -0
  85. data/spec/integration/card/associations/members_spec.rb +18 -0
  86. data/spec/integration/card/associations/plugin_data_spec.rb +18 -0
  87. data/spec/integration/card/associations/voters_spec.rb +17 -0
  88. data/spec/integration/card/close!_spec.rb +16 -0
  89. data/spec/integration/card/create_new_check_list_spec.rb +19 -0
  90. data/spec/integration/card/create_spec.rb +50 -0
  91. data/spec/integration/card/delete_spec.rb +16 -0
  92. data/spec/integration/card/find_spec.rb +67 -0
  93. data/spec/integration/card/move_to_board_spec.rb +36 -0
  94. data/spec/integration/card/move_to_list_spec.rb +20 -0
  95. data/spec/integration/card/remove_member_spec.rb +19 -0
  96. data/spec/integration/card/save_spec.rb +61 -0
  97. data/spec/integration/card/update!_spec.rb +53 -0
  98. data/spec/integration/card/vote_spec.rb +50 -0
  99. data/spec/integration/custom_field_item_spec.rb +47 -0
  100. data/spec/label_spec.rb +79 -0
  101. data/spec/spec_helper.rb +48 -23
  102. data/spec/unit/trello/association_builder/has_many_spec.rb +36 -0
  103. data/spec/unit/trello/association_builder/has_one_spec.rb +36 -0
  104. data/spec/unit/trello/association_fetcher/has_many/fetch_spec.rb +38 -0
  105. data/spec/unit/trello/association_fetcher/has_many/params_spec.rb +107 -0
  106. data/spec/unit/trello/association_fetcher/has_many_spec.rb +50 -0
  107. data/spec/unit/trello/association_fetcher/has_one/fetch_spec.rb +51 -0
  108. data/spec/unit/trello/association_fetcher/has_one/params_spec.rb +81 -0
  109. data/spec/unit/trello/association_fetcher/has_one_spec.rb +49 -0
  110. data/spec/unit/trello/association_infer_tool_spec.rb +41 -0
  111. data/spec/unit/trello/basic_data_spec.rb +54 -0
  112. data/spec/unit/trello/card_spec.rb +103 -0
  113. metadata +185 -6
data/lib/trello/member.rb CHANGED
@@ -92,7 +92,7 @@ module Trello
92
92
 
93
93
  def save
94
94
  @previously_changed = changes
95
- @changed_attributes.try(:clear)
95
+ @changed_attributes.clear if @changed_attributes.respond_to?(:clear)
96
96
  changes_applied if respond_to?(:changes_applied)
97
97
 
98
98
  return update! if id
@@ -0,0 +1,54 @@
1
+ module Trello
2
+ class RegisterAttributes
3
+ class << self
4
+ def execute(model_klass, names, readonly_names)
5
+ names ||= []
6
+ readonly_names ||= []
7
+
8
+ define_method_attributes(model_klass, names)
9
+ define_getters(model_klass, names)
10
+ define_setters(model_klass, names, readonly_names)
11
+ track_attributes_changes(model_klass, names)
12
+ end
13
+
14
+ private
15
+
16
+ def define_method_attributes(model_klass, names)
17
+ model_klass.class_eval do
18
+ define_method :attributes do
19
+ @__attributes ||= names.reduce({}) do |attrs, name|
20
+ attrs.merge(name.to_sym => nil)
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ def define_getters(model_klass, names)
27
+ model_klass.class_eval do
28
+ names.each do |key|
29
+ define_method(key) { @__attributes[key] }
30
+ end
31
+ end
32
+ end
33
+
34
+ def define_setters(model_klass, names, readonly_names)
35
+ model_klass.class_eval do
36
+ names.each do |key|
37
+ next if readonly_names.include?(key.to_sym)
38
+
39
+ define_method("#{key}=") do |value|
40
+ send("#{key}_will_change!") if value != @__attributes[key]
41
+ @__attributes[key] = value
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ def track_attributes_changes(model_klass, names)
48
+ model_klass.class_eval do
49
+ define_attribute_methods(names)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
data/spec/action_spec.rb CHANGED
@@ -116,7 +116,7 @@ module Trello
116
116
  before do
117
117
  allow(client)
118
118
  .to receive(:get)
119
- .with('/members/abcdef123456789123456789', {})
119
+ .with('/actions/4ee2482134a81a757a08af47/memberCreator')
120
120
  .and_return user_payload
121
121
  end
122
122
 
data/spec/card_spec.rb CHANGED
@@ -187,6 +187,7 @@ module Trello
187
187
  .to receive(:put)
188
188
  .once
189
189
  .with("/cards/abcdef123456789123456789", payload)
190
+ .and_return(payload.to_json)
190
191
 
191
192
  card.name = expected_new_name
192
193
  card.save
@@ -199,7 +200,10 @@ module Trello
199
200
  desc: expected_new_desc,
200
201
  }
201
202
 
202
- expect(client).to receive(:put).once.with("/cards/abcdef123456789123456789", payload)
203
+ expect(client)
204
+ .to receive(:put).once
205
+ .with("/cards/abcdef123456789123456789", payload)
206
+ .and_return(payload.to_json)
203
207
 
204
208
  card.desc = expected_new_desc
205
209
  card.save
@@ -307,7 +311,7 @@ module Trello
307
311
  before do
308
312
  allow(client)
309
313
  .to receive(:get)
310
- .with("/attachments/abcdef123456789123456789", {})
314
+ .with("/cards/#{card.id}/attachments/abcdef123456789123456789", {})
311
315
  .and_return JSON.generate(attachments_details.first)
312
316
  end
313
317
 
@@ -473,7 +477,7 @@ module Trello
473
477
  card.move_to_list_on_any_board(other_list.id)
474
478
  end
475
479
 
476
- it 'should not be moved if new board is identical with old board', focus: true do
480
+ it 'should not be moved if new board is identical with old board' do
477
481
  other_board = double(id: 'abcdef123456789123456789')
478
482
  expect(client).to_not receive(:put)
479
483
  card.move_to_board(other_board)
@@ -506,7 +510,7 @@ module Trello
506
510
 
507
511
  expect(client)
508
512
  .to receive(:post)
509
- .with("/cards/abcdef123456789123456789/members", payload)
513
+ .with("/cards/abcdef123456789123456789/idMembers", payload)
510
514
 
511
515
  card.add_member(new_member)
512
516
  end
@@ -516,7 +520,7 @@ module Trello
516
520
 
517
521
  expect(client)
518
522
  .to receive(:delete)
519
- .with("/cards/abcdef123456789123456789/members/#{existing_member.id}")
523
+ .with("/cards/abcdef123456789123456789/idMembers/#{existing_member.id}")
520
524
 
521
525
  card.remove_member(existing_member)
522
526
  end
@@ -788,6 +792,7 @@ module Trello
788
792
  .to receive(:put)
789
793
  .once
790
794
  .with("/cards/abcdef123456789123456789", payload)
795
+ .and_return(payload.to_json)
791
796
 
792
797
  card.close!
793
798
  end
@@ -805,6 +810,7 @@ module Trello
805
810
  .to receive(:put)
806
811
  .once
807
812
  .with("/cards/abcdef123456789123456789", payload)
813
+ .and_return(payload.to_json)
808
814
 
809
815
  card.due = due_date
810
816
  card.save
@@ -819,6 +825,7 @@ module Trello
819
825
  .to receive(:put)
820
826
  .once
821
827
  .with("/cards/abcdef123456789123456789", payload)
828
+ .and_return(payload.to_json)
822
829
 
823
830
  card.due_complete = true
824
831
  card.save
@@ -827,28 +834,97 @@ module Trello
827
834
  end
828
835
  end
829
836
 
830
- describe "#update_fields" do
831
- it "does not set any fields when the fields argument is empty" do
832
- expected = cards_details.first
837
+ describe '#update_fields' do
838
+ context 'when the fields argument is empty' do
839
+ let(:fields) { {} }
840
+
841
+ it 'card does not set any fields' do
842
+ expected = cards_details.first
843
+
844
+ card = Card.new(expected)
845
+ card.client = client
846
+
847
+ card.update_fields(fields)
848
+
849
+ expected.each do |key, value|
850
+ if card.respond_to?(key) && key != 'labels'
851
+ expect(card.send(key)).to eq value
852
+ end
853
+
854
+ expect(card.labels).to eq expected['labels'].map { |lbl| Trello::Label.new(lbl) }
855
+ expect(card.short_id).to eq expected['idShort']
856
+ expect(card.short_url).to eq expected['shortUrl']
857
+ expect(card.board_id).to eq expected['idBoard']
858
+ expect(card.member_ids).to eq expected['idMembers']
859
+ expect(card.cover_image_id).to eq expected['idAttachmentCover']
860
+ expect(card.list_id).to eq expected['idList']
861
+ expect(card.card_labels).to eq expected['idLabels']
862
+ end
863
+ end
864
+ end
865
+
866
+ context 'when the fields argument has at least one field' do
867
+ let(:expected) { cards_details.first }
868
+ let(:card) {
869
+ card = Card.new(expected)
870
+ card.client = client
871
+ card
872
+ }
873
+
874
+ context 'and the field does changed' do
875
+ let(:fields) { { desc: 'Awesome things have changed.' } }
876
+
877
+ it 'card does set the changed fields' do
878
+ card.update_fields(fields)
833
879
 
834
- card = Card.new(expected)
835
- card.client = client
880
+ expect(card.desc).to eq('Awesome things have changed.')
881
+ end
882
+
883
+ it 'card has been mark as changed' do
884
+ card.update_fields(fields)
885
+
886
+ expect(card.changed?).to be_truthy
887
+ end
888
+ end
889
+
890
+ context "and the field doesn't changed" do
891
+ let(:fields) { { desc: expected[:desc] } }
892
+
893
+ it "card attributes doesn't changed" do
894
+ card.update_fields(fields)
836
895
 
837
- card.update_fields({})
896
+ expect(card.desc).to eq(expected['desc'])
897
+ end
898
+
899
+ it "card hasn't been mark as changed", pending: true do
900
+ card.update_fields(fields)
838
901
 
839
- expected.each do |key, value|
840
- if card.respond_to?(key) && key != 'labels'
841
- expect(card.send(key)).to eq value
902
+ expect(card.changed?).to be_falsy
842
903
  end
904
+ end
843
905
 
844
- expect(card.labels).to eq expected['labels'].map { |lbl| Trello::Label.new(lbl) }
845
- expect(card.short_id).to eq expected['idShort']
846
- expect(card.short_url).to eq expected['shortUrl']
847
- expect(card.board_id).to eq expected['idBoard']
848
- expect(card.member_ids).to eq expected['idMembers']
849
- expect(card.cover_image_id).to eq expected['idAttachmentCover']
850
- expect(card.list_id).to eq expected['idList']
851
- expect(card.card_labels).to eq expected['idLabels']
906
+ context "and the field isn't a correct attributes of the card" do
907
+ let(:fields) { { abc: 'abc' } }
908
+
909
+ it "card attributes doesn't changed" do
910
+ card.update_fields(fields)
911
+
912
+ expect(card.labels).to eq expected['labels'].map { |lbl| Trello::Label.new(lbl) }
913
+ expect(card.short_id).to eq expected['idShort']
914
+ expect(card.short_url).to eq expected['shortUrl']
915
+ expect(card.board_id).to eq expected['idBoard']
916
+ expect(card.member_ids).to eq expected['idMembers']
917
+ expect(card.cover_image_id).to eq expected['idAttachmentCover']
918
+ expect(card.list_id).to eq expected['idList']
919
+ expect(card.card_labels).to eq expected['idLabels']
920
+ expect(card.desc).to eq expected['desc']
921
+ end
922
+
923
+ it "card hasn't been mark as changed" do
924
+ card.update_fields(fields)
925
+
926
+ expect(card.changed?).to be_falsy
927
+ end
852
928
  end
853
929
  end
854
930
  end
@@ -0,0 +1,189 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.trello.com/1/cards/5e95d1b4f43f9a06497f17f7?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 (darwin19.2.0 x86_64) ruby/2.6.5p114
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
+ Strict-Transport-Security:
28
+ - max-age=15552000; includeSubDomains
29
+ X-Download-Options:
30
+ - noopen
31
+ Surrogate-Control:
32
+ - no-store
33
+ X-Content-Type-Options:
34
+ - nosniff
35
+ Referrer-Policy:
36
+ - strict-origin-when-cross-origin
37
+ X-Xss-Protection:
38
+ - 1; mode=block
39
+ X-Trello-Version:
40
+ - 1.2055.0
41
+ X-Trello-Environment:
42
+ - Production
43
+ Access-Control-Allow-Origin:
44
+ - "*"
45
+ Access-Control-Allow-Methods:
46
+ - GET, PUT, POST, DELETE
47
+ Access-Control-Allow-Headers:
48
+ - Authorization, Accept, Content-Type
49
+ Access-Control-Expose-Headers:
50
+ - x-rate-limit-api-key-interval-ms, x-rate-limit-api-key-max, x-rate-limit-api-key-remaining,
51
+ x-rate-limit-api-token-interval-ms, x-rate-limit-api-token-max, x-rate-limit-api-token-remaining
52
+ X-Rate-Limit-Api-Key-Interval-Ms:
53
+ - '10000'
54
+ X-Rate-Limit-Api-Key-Max:
55
+ - '300'
56
+ X-Rate-Limit-Api-Key-Remaining:
57
+ - '299'
58
+ X-Rate-Limit-Api-Token-Interval-Ms:
59
+ - '10000'
60
+ X-Rate-Limit-Api-Token-Max:
61
+ - '100'
62
+ X-Rate-Limit-Api-Token-Remaining:
63
+ - '99'
64
+ X-Rate-Limit-Member-Interval-Ms:
65
+ - '10000'
66
+ X-Rate-Limit-Member-Max:
67
+ - '200'
68
+ X-Rate-Limit-Member-Remaining:
69
+ - '199'
70
+ X-Server-Time:
71
+ - '1586956885846'
72
+ Content-Type:
73
+ - application/json; charset=utf-8
74
+ Vary:
75
+ - Accept-Encoding
76
+ Expires:
77
+ - Wed, 15 Apr 2020 13:21:25 GMT
78
+ Cache-Control:
79
+ - max-age=0, no-cache, no-store
80
+ Pragma:
81
+ - no-cache
82
+ Date:
83
+ - Wed, 15 Apr 2020 13:21:25 GMT
84
+ Content-Length:
85
+ - '997'
86
+ Connection:
87
+ - keep-alive
88
+ Set-Cookie:
89
+ - dsc=set_cookie_dsc; Path=/; Expires=Sat, 18 Apr 2020 13:21:25 GMT; Secure
90
+ body:
91
+ encoding: UTF-8
92
+ string: '{"id":"5e95d1b4f43f9a06497f17f7","checkItemStates":[],"closed":false,"dateLastActivity":"2020-04-15T13:18:04.471Z","desc":"","descData":null,"dueReminder":null,"idBoard":"5e94f5ded016b22c2437c13c","idList":"5e95d1b07f2ff83927319128","idMembersVoted":[],"idShort":2,"idAttachmentCover":null,"idLabels":[],"manualCoverAttachment":false,"name":"C2","pos":16384,"shortLink":"DeJYDbq0","isTemplate":false,"dueComplete":false,"due":null,"email":null,"labels":[],"shortUrl":"https://trello.com/c/DeJYDbq0","url":"https://trello.com/c/DeJYDbq0/2-c2","cover":{"idAttachment":null,"color":null,"idUploadedBackground":null,"size":"normal","brightness":"light"},"idMembers":[],"idChecklists":[],"badges":{"attachmentsByType":{"trello":{"board":0,"card":0}},"location":false,"votes":0,"viewingMemberVoted":false,"subscribed":false,"fogbugz":"","checkItems":0,"checkItemsChecked":0,"checkItemsEarliestDue":null,"comments":0,"attachments":1,"description":false,"due":null,"dueComplete":false},"subscribed":false}'
93
+ http_version: null
94
+ recorded_at: Wed, 15 Apr 2020 13:21:25 GMT
95
+ - request:
96
+ method: post
97
+ uri: https://api.trello.com/1/cards/5e95d1b4f43f9a06497f17f7/attachments?key=DEVELOPER_PUBLIC_KEY&token=MEMBER_TOKEN
98
+ body:
99
+ encoding: UTF-8
100
+ string: url=https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fen%2F6%2F6b%2FHello_Web_Series_%2528Wordmark%2529_Logo.png&name=hello.png
101
+ headers:
102
+ Accept:
103
+ - "*/*"
104
+ User-Agent:
105
+ - rest-client/2.1.0 (darwin19.2.0 x86_64) ruby/2.6.5p114
106
+ Content-Length:
107
+ - '126'
108
+ Content-Type:
109
+ - application/x-www-form-urlencoded
110
+ Accept-Encoding:
111
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
112
+ Host:
113
+ - api.trello.com
114
+ response:
115
+ status:
116
+ code: 200
117
+ message: OK
118
+ headers:
119
+ X-Dns-Prefetch-Control:
120
+ - 'off'
121
+ X-Frame-Options:
122
+ - DENY
123
+ Strict-Transport-Security:
124
+ - max-age=15552000; includeSubDomains
125
+ X-Download-Options:
126
+ - noopen
127
+ Surrogate-Control:
128
+ - no-store
129
+ X-Content-Type-Options:
130
+ - nosniff
131
+ Referrer-Policy:
132
+ - strict-origin-when-cross-origin
133
+ X-Xss-Protection:
134
+ - 1; mode=block
135
+ X-Trello-Version:
136
+ - 1.2055.0
137
+ X-Trello-Environment:
138
+ - Production
139
+ Access-Control-Allow-Origin:
140
+ - "*"
141
+ Access-Control-Allow-Methods:
142
+ - GET, PUT, POST, DELETE
143
+ Access-Control-Allow-Headers:
144
+ - Authorization, Accept, Content-Type
145
+ Access-Control-Expose-Headers:
146
+ - x-rate-limit-api-key-interval-ms, x-rate-limit-api-key-max, x-rate-limit-api-key-remaining,
147
+ x-rate-limit-api-token-interval-ms, x-rate-limit-api-token-max, x-rate-limit-api-token-remaining
148
+ X-Rate-Limit-Api-Token-Interval-Ms:
149
+ - '10000'
150
+ X-Rate-Limit-Api-Token-Max:
151
+ - '100'
152
+ X-Rate-Limit-Api-Token-Remaining:
153
+ - '98'
154
+ X-Rate-Limit-Api-Key-Interval-Ms:
155
+ - '10000'
156
+ X-Rate-Limit-Api-Key-Max:
157
+ - '300'
158
+ X-Rate-Limit-Api-Key-Remaining:
159
+ - '298'
160
+ X-Rate-Limit-Member-Interval-Ms:
161
+ - '10000'
162
+ X-Rate-Limit-Member-Max:
163
+ - '200'
164
+ X-Rate-Limit-Member-Remaining:
165
+ - '197'
166
+ X-Server-Time:
167
+ - '1586956887595'
168
+ Content-Type:
169
+ - application/json; charset=utf-8
170
+ Vary:
171
+ - Accept-Encoding
172
+ Expires:
173
+ - Wed, 15 Apr 2020 13:21:27 GMT
174
+ Cache-Control:
175
+ - max-age=0, no-cache, no-store
176
+ Pragma:
177
+ - no-cache
178
+ Date:
179
+ - Wed, 15 Apr 2020 13:21:27 GMT
180
+ Content-Length:
181
+ - '2182'
182
+ Connection:
183
+ - keep-alive
184
+ body:
185
+ encoding: UTF-8
186
+ string: '{"id":"5e970a563812b3075bb192f1","bytes":92147,"date":"2020-04-15T13:21:26.794Z","edgeColor":null,"idMember":"5e679b808e6e8828784b30e1","isUpload":true,"mimeType":null,"name":"hello.png","previews":[{"id":"5e970a573812b3075bb1930e","_id":"5e970a573812b3075bb1930e","scaled":false,"url":"https://trello-attachments.s3.amazonaws.com/5e95d1b4f43f9a06497f17f7/70x50/f3c672acdd52be2ccff69bd3127fe575/hello.png","bytes":2380,"height":50,"width":70},{"id":"5e970a573812b3075bb1930f","_id":"5e970a573812b3075bb1930f","scaled":false,"url":"https://trello-attachments.s3.amazonaws.com/5e95d1b4f43f9a06497f17f7/250x150/f3c672acdd52be2ccff69bd3127fe575/hello.png","bytes":12261,"height":150,"width":250},{"id":"5e970a573812b3075bb19310","_id":"5e970a573812b3075bb19310","scaled":true,"url":"https://trello-attachments.s3.amazonaws.com/5e95d1b4f43f9a06497f17f7/149x84/f3c672acdd52be2ccff69bd3127fe575/hello.png","bytes":6486,"height":84,"width":149},{"id":"5e970a573812b3075bb19311","_id":"5e970a573812b3075bb19311","scaled":true,"url":"https://trello-attachments.s3.amazonaws.com/5e95d1b4f43f9a06497f17f7/300x169/f3c672acdd52be2ccff69bd3127fe575/hello.png","bytes":15654,"height":169,"width":300},{"id":"5e970a573812b3075bb19312","_id":"5e970a573812b3075bb19312","scaled":true,"url":"https://trello-attachments.s3.amazonaws.com/5e95d1b4f43f9a06497f17f7/600x338/f3c672acdd52be2ccff69bd3127fe575/hello.png","bytes":38279,"height":338,"width":600},{"id":"5e970a573812b3075bb19313","_id":"5e970a573812b3075bb19313","scaled":true,"url":"https://trello-attachments.s3.amazonaws.com/5e95d1b4f43f9a06497f17f7/1200x675/f3c672acdd52be2ccff69bd3127fe575/hello.png","bytes":102035,"height":675,"width":1200},{"id":"5e970a573812b3075bb19314","_id":"5e970a573812b3075bb19314","scaled":true,"url":"https://trello-attachments.s3.amazonaws.com/5e94f5ded016b22c2437c13c/5e95d1b4f43f9a06497f17f7/9566af90e112b494b57a76091635f882/Hello_Web_Series__28Wordmark_29_Logo.png","bytes":92147,"height":720,"width":1280}],"url":"https://trello-attachments.s3.amazonaws.com/5e94f5ded016b22c2437c13c/5e95d1b4f43f9a06497f17f7/9566af90e112b494b57a76091635f882/Hello_Web_Series__28Wordmark_29_Logo.png","pos":32768,"limits":{}}'
187
+ http_version: null
188
+ recorded_at: Wed, 15 Apr 2020 13:21:27 GMT
189
+ recorded_with: VCR 5.1.0