ruby-trello 2.0.0 → 2.3.1

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 (142) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +106 -17
  3. data/lib/trello.rb +47 -34
  4. data/lib/trello/action.rb +10 -8
  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/attachment.rb +13 -10
  16. data/lib/trello/basic_data.rb +16 -49
  17. data/lib/trello/board.rb +17 -3
  18. data/lib/trello/card.rb +103 -38
  19. data/lib/trello/checklist.rb +14 -13
  20. data/lib/trello/client.rb +1 -1
  21. data/lib/trello/comment.rb +4 -4
  22. data/lib/trello/custom_field.rb +131 -0
  23. data/lib/trello/custom_field_item.rb +98 -0
  24. data/lib/trello/custom_field_option.rb +22 -0
  25. data/lib/trello/error.rb +12 -0
  26. data/lib/trello/item.rb +7 -7
  27. data/lib/trello/item_state.rb +3 -3
  28. data/lib/trello/label.rb +30 -12
  29. data/lib/trello/label_name.rb +10 -10
  30. data/lib/trello/list.rb +6 -6
  31. data/lib/trello/member.rb +10 -9
  32. data/lib/trello/notification.rb +6 -6
  33. data/lib/trello/organization.rb +11 -11
  34. data/lib/trello/plugin_datum.rb +6 -6
  35. data/lib/trello/register_attributes.rb +54 -0
  36. data/lib/trello/token.rb +6 -5
  37. data/lib/trello/webhook.rb +5 -5
  38. data/spec/action_spec.rb +22 -1
  39. data/spec/basic_data_spec.rb +58 -0
  40. data/spec/board_spec.rb +28 -2
  41. data/spec/card_spec.rb +183 -8
  42. data/spec/cassettes/can_add_a_file_from_url_on_a_card.yml +189 -0
  43. data/spec/cassettes/can_add_a_file_on_a_card.yml +200 -0
  44. data/spec/cassettes/can_add_a_member_to_a_card.yml +190 -0
  45. data/spec/cassettes/can_add_label_on_a_card.yml +281 -0
  46. data/spec/cassettes/can_close_bong_a_card.yml +189 -0
  47. data/spec/cassettes/can_get_actions.yml +196 -0
  48. data/spec/cassettes/can_get_attachments.yml +187 -0
  49. data/spec/cassettes/can_get_comments.yml +193 -0
  50. data/spec/cassettes/can_move_a_card_to_another_board_with_specific_list.yml +373 -0
  51. data/spec/cassettes/can_move_a_card_to_another_board_without_specific_list.yml +281 -0
  52. data/spec/cassettes/can_move_a_card_to_another_list.yml +281 -0
  53. data/spec/cassettes/can_remove_a_member_from_a_card.yml +185 -0
  54. data/spec/cassettes/can_remove_an_attachment_on_a_card.yml +277 -0
  55. data/spec/cassettes/can_remove_an_upvote_on_a_card.yml +465 -0
  56. data/spec/cassettes/can_remove_label_on_a_card.yml +279 -0
  57. data/spec/cassettes/can_success_add_comment_to_a_card.yml +196 -0
  58. data/spec/cassettes/can_success_copy_checklist_to_a_card.yml +281 -0
  59. data/spec/cassettes/can_success_copy_checklist_to_a_card_without_name_pos.yml +281 -0
  60. data/spec/cassettes/can_success_create_a_card.yml +99 -0
  61. data/spec/cassettes/can_success_create_new_checklist_to_a_card.yml +189 -0
  62. data/spec/cassettes/can_success_delete_card.yml +185 -0
  63. data/spec/cassettes/can_success_upate_a_card.yml +189 -0
  64. data/spec/cassettes/can_success_update_bong_a_board.yml +283 -0
  65. data/spec/cassettes/can_success_update_bong_a_card.yml +191 -0
  66. data/spec/cassettes/can_upvote_on_a_card.yml +469 -0
  67. data/spec/cassettes/card_find_with_id_and_get_all_fields.yml +95 -0
  68. data/spec/cassettes/card_find_with_id_and_get_specific_fields.yml +96 -0
  69. data/spec/cassettes/custom_field_item_save_1.yml +97 -0
  70. data/spec/cassettes/custom_field_item_save_2.yml +281 -0
  71. data/spec/cassettes/get_board_of_card.yml +187 -0
  72. data/spec/cassettes/get_check_item_states_of_card.yml +188 -0
  73. data/spec/cassettes/get_checklists_of_card.yml +187 -0
  74. data/spec/cassettes/get_cover_image_of_card.yml +187 -0
  75. data/spec/cassettes/get_custom_field_items_of_card.yml +187 -0
  76. data/spec/cassettes/get_list_of_card.yml +188 -0
  77. data/spec/cassettes/get_lists.yml +187 -0
  78. data/spec/cassettes/get_members_of_card.yml +189 -0
  79. data/spec/cassettes/get_plugin_data_of_card.yml +187 -0
  80. data/spec/cassettes/get_voters_of_card.yml +188 -0
  81. data/spec/cassettes/remove_upvote_on_a_card_when_have_not_voted.yml +366 -0
  82. data/spec/cassettes/revote_on_a_card.yml +464 -0
  83. data/spec/checklist_spec.rb +39 -3
  84. data/spec/client_spec.rb +5 -1
  85. data/spec/custom_field_item_spec.rb +192 -0
  86. data/spec/custom_field_option_spec.rb +49 -0
  87. data/spec/custom_field_spec.rb +261 -0
  88. data/spec/integration/basic_data/many_spec.rb +123 -0
  89. data/spec/integration/basic_data/one_spec.rb +84 -0
  90. data/spec/integration/basic_data/register_attributes_spec.rb +75 -0
  91. data/spec/integration/board/update!_spec.rb +31 -0
  92. data/spec/integration/board_lists_spec.rb +21 -0
  93. data/spec/integration/card/add_and_remove_attachment_spec.rb +45 -0
  94. data/spec/integration/card/add_and_remove_label_spec.rb +35 -0
  95. data/spec/integration/card/add_checklist_spec.rb +32 -0
  96. data/spec/integration/card/add_comment_spec.rb +19 -0
  97. data/spec/integration/card/add_memeber_spec.rb +19 -0
  98. data/spec/integration/card/associations/actions_spec.rb +17 -0
  99. data/spec/integration/card/associations/attachments_spec.rb +18 -0
  100. data/spec/integration/card/associations/board_spec.rb +17 -0
  101. data/spec/integration/card/associations/check_item_states_spec.rb +17 -0
  102. data/spec/integration/card/associations/checklists_spec.rb +18 -0
  103. data/spec/integration/card/associations/comments_spec.rb +19 -0
  104. data/spec/integration/card/associations/cover_image_spec.rb +18 -0
  105. data/spec/integration/card/associations/custom_field_items_spec.rb +18 -0
  106. data/spec/integration/card/associations/list_spec.rb +16 -0
  107. data/spec/integration/card/associations/members_spec.rb +18 -0
  108. data/spec/integration/card/associations/plugin_data_spec.rb +18 -0
  109. data/spec/integration/card/associations/voters_spec.rb +17 -0
  110. data/spec/integration/card/close!_spec.rb +16 -0
  111. data/spec/integration/card/create_new_check_list_spec.rb +19 -0
  112. data/spec/integration/card/create_spec.rb +50 -0
  113. data/spec/integration/card/delete_spec.rb +16 -0
  114. data/spec/integration/card/find_spec.rb +67 -0
  115. data/spec/integration/card/move_to_board_spec.rb +36 -0
  116. data/spec/integration/card/move_to_list_spec.rb +20 -0
  117. data/spec/integration/card/remove_member_spec.rb +19 -0
  118. data/spec/integration/card/save_spec.rb +61 -0
  119. data/spec/integration/card/update!_spec.rb +53 -0
  120. data/spec/integration/card/vote_spec.rb +50 -0
  121. data/spec/integration/custom_field_item_spec.rb +47 -0
  122. data/spec/item_spec.rb +20 -0
  123. data/spec/label_spec.rb +99 -0
  124. data/spec/list_spec.rb +21 -0
  125. data/spec/member_spec.rb +23 -0
  126. data/spec/notification_spec.rb +21 -0
  127. data/spec/organization_spec.rb +26 -0
  128. data/spec/spec_helper.rb +96 -23
  129. data/spec/token_spec.rb +19 -0
  130. data/spec/unit/trello/association_builder/has_many_spec.rb +36 -0
  131. data/spec/unit/trello/association_builder/has_one_spec.rb +36 -0
  132. data/spec/unit/trello/association_fetcher/has_many/fetch_spec.rb +38 -0
  133. data/spec/unit/trello/association_fetcher/has_many/params_spec.rb +107 -0
  134. data/spec/unit/trello/association_fetcher/has_many_spec.rb +50 -0
  135. data/spec/unit/trello/association_fetcher/has_one/fetch_spec.rb +51 -0
  136. data/spec/unit/trello/association_fetcher/has_one/params_spec.rb +81 -0
  137. data/spec/unit/trello/association_fetcher/has_one_spec.rb +49 -0
  138. data/spec/unit/trello/association_infer_tool_spec.rb +41 -0
  139. data/spec/unit/trello/basic_data_spec.rb +54 -0
  140. data/spec/unit/trello/card_spec.rb +103 -0
  141. data/spec/webhook_spec.rb +20 -0
  142. metadata +224 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: aef36c181b18bcb01b8a45c21aad954536f40188
4
- data.tar.gz: 1271b238eae444a32c6c84ea9c3cf8c26fe50a98
2
+ SHA256:
3
+ metadata.gz: 7e7396e189c2f3b43af4bf1eacbdd78ec358ef684d2526d7c3537c1af1ca4abd
4
+ data.tar.gz: c8e2c74d10eaedb521829b3598e4500119c8fbfdd8c8cd71758254580eee1079
5
5
  SHA512:
6
- metadata.gz: 86b932d63a9e11a9d63ab20233e67aeb241cc5203bfd689d56f5323c8a31dfbb5dfd1d6b5873571d50fad68487033ead6b70282b7e52557ffd72b7bb81cd70fa
7
- data.tar.gz: b03c3113250ff01a490bb39304e7d7ed4dc7a64f61a6c7feb923138a7621e0034b73bfeee58c796e017485a0d2b0d5f46c80ab907c68b19c0f2f19dc503d91bc
6
+ metadata.gz: 1d441be6f124b3dd47ff332da22ccbf71eb201ff90ddf82775fc3f208eb6621dd10acc2cff21c81d30231d9b50f4aa9cf867cf66d26e9c894e16f1a1596a11fa
7
+ data.tar.gz: 647e16d5104ba1cf8dc3a7811117f168d6e132503e4b0989e8316a8abd9b30f3401cc04814da202cb4fc74846c5b9dee88a80fc36358fa0cd9c5f65340aba97b
data/README.md CHANGED
@@ -1,35 +1,37 @@
1
1
  # Ruby Trello API
2
2
 
3
- [![Stories in Ready](http://badge.waffle.io/jeremytregunna/ruby-trello.png)](http://waffle.io/jeremytregunna/ruby-trello)
4
- [![Build Status](https://secure.travis-ci.org/jeremytregunna/ruby-trello.png)](http://travis-ci.org/jeremytregunna/ruby-trello) [![Dependency Status](https://gemnasium.com/jeremytregunna/ruby-trello.png)](https://gemnasium.com/jeremytregunna/ruby-trello)
3
+ [![Build Status](https://secure.travis-ci.org/jeremytregunna/ruby-trello.svg)](http://travis-ci.org/jeremytregunna/ruby-trello)
4
+ [![security](https://hakiri.io/github/jeremytregunna/ruby-trello/master.svg)](https://hakiri.io/github/jeremytregunna/ruby-trello/master)
5
5
  [![Code Climate](https://codeclimate.com/github/jeremytregunna/ruby-trello/badges/gpa.svg)](https://codeclimate.com/github/jeremytregunna/ruby-trello)
6
6
 
7
- This library implements the [Trello](http://www.trello.com/) [API](http://trello.com/api).
7
+ This library implements the [Trello](http://www.trello.com/) [API](https://developers.trello.com/).
8
8
 
9
9
  Trello is an awesome tool for organization. Not just aimed at developers, but everybody.
10
10
  Seriously, [check it out](http://www.trello.com/).
11
11
 
12
12
  [Full API documentation](http://www.rubydoc.info/gems/ruby-trello).
13
13
 
14
+ Full Disclosure: This library is mostly complete, if you do find anything missing or not functioning as you expect it
15
+ to, please just [create an issue](https://github.com/jeremytregunna/ruby-trello/issues/new).
16
+
17
+ ## Requirements
18
+
19
+ Use the newest version for Ruby 2.5.0 or newer support.
20
+ Use version 2.2.1 or earlier for Ruby 2.1 ~ 2.4 support.
21
+ Use version 1.3.0 or earlier for Ruby 1.9.3 support.
22
+ Use version 1.4.x or earlier for Ruby 2.0.0 support.
23
+
14
24
  ## Installation
15
25
 
16
26
  ```
17
27
  # gem install ruby-trello
18
28
  ```
19
29
 
20
- Full Disclosure: This library is mostly complete, if you do find anything missing or not functioning as you expect it
21
- to, please [let us know](https://trello.com/card/spot-a-bug-report-it/4f092b2ee23cb6fe6d1aaabd/17).
22
-
23
- Supports Ruby 2.1.0 or newer.
24
-
25
- Use version 1.3.0 or earlier for ruby 1.9.3 support.
26
- Use version 1.4.x or earlier for ruby 2.0.0 support.
27
-
28
30
  ## Configuration
29
31
 
30
- ####Basic authorization:
32
+ #### Basic authorization:
31
33
 
32
- 1. Get your API public key from Trello via the irb console:
34
+ 1. Get your API public key from Trello via [trello.com/app-key/](https://trello.com/app-key/) or the irb console as follows:
33
35
 
34
36
  ```
35
37
  $ gem install ruby-trello
@@ -50,7 +52,7 @@ Trello.configure do |config|
50
52
  end
51
53
  ```
52
54
 
53
- ####2-legged OAuth authorization
55
+ #### 2-legged OAuth authorization
54
56
 
55
57
  ```ruby
56
58
  Trello.configure do |config|
@@ -61,7 +63,7 @@ Trello.configure do |config|
61
63
  end
62
64
  ```
63
65
 
64
- ####3-legged OAuth authorization
66
+ #### 3-legged OAuth authorization
65
67
 
66
68
  ```ruby
67
69
  Trello.configure do |config|
@@ -72,18 +74,67 @@ Trello.configure do |config|
72
74
  end
73
75
  ```
74
76
 
75
- All the calls this library make to Trello require authentication using these keys. Be sure to protect them.
77
+ All the calls this library makes to Trello require authentication using these keys. Be sure to protect them.
78
+
79
+ #### Usage
76
80
 
77
- So lets say you want to get information about the user *bobtester*. We can do something like this:
81
+ So let's say you want to get information about the user *bobtester*. We can do something like this:
78
82
 
79
83
  ```ruby
80
84
  bob = Trello::Member.find("bobtester")
85
+
81
86
  # Print out his name
82
87
  puts bob.full_name # "Bob Tester"
88
+
83
89
  # Print his bio
84
90
  puts bob.bio # A wonderfully delightful test user
91
+
85
92
  # How about a list of his boards?
86
93
  bob.boards
94
+
95
+ # And then to read the lists of the first board do :
96
+ bob.boards.first.lists
97
+ ```
98
+
99
+ ##### Accessing specific items
100
+
101
+ There is no find by name method in the trello API, to access a specific item, you have to know it's ID.
102
+ The best way is to pretty print the elements and then find the id of the element you are looking for.
103
+
104
+ ```ruby
105
+ # With bob
106
+ pp bob.boards # Will pretty print all boards, allowing us to find our board id
107
+
108
+ # We can now access it's lists
109
+ pp Trello::Board.find( board_id ).lists # will pretty print all lists. Let's get the list id
110
+
111
+ # We can now access the cards of the list
112
+ pp Trello::List.find( list_id ).cards
113
+
114
+ # We can now access the checklists of the card
115
+ pp Trello::Card.find( card_id ).checklists
116
+
117
+ # and so on ...
118
+ ```
119
+
120
+ ##### Changing a checkbox state
121
+ ```ruby
122
+ # First get your checklist id
123
+ checklist = Trello::Checklist.find( checklist_id )
124
+
125
+ # At this point, there is no more ids. To get your checklist item,
126
+ # you have to know it's position (same as in the trello interface).
127
+ # Let's take the first
128
+ checklist_item = checklist.items.first
129
+
130
+ # Then we can read the status
131
+ checklist_item.state # return 'complete' or 'incomplete'
132
+
133
+ # We can update it (note we call update_item_state from checklist, not from checklist_item)
134
+ checklist.update_item_state( checklist_item.id, 'complete' ) # or 'incomplete'
135
+
136
+ # You can also use true or false instead of 'complete' or 'incomplete'
137
+ checklist.update_item_state( checklist_item.id, true ) # or false
87
138
  ```
88
139
 
89
140
  #### Multiple Users
@@ -131,3 +182,41 @@ Several ways you can contribute. Documentation, code, tests, feature requests, b
131
182
  If you submit a pull request that's accepted, you'll be given commit access to this repository.
132
183
 
133
184
  Please see the `CONTRIBUTING.md` file for more information.
185
+
186
+ ## Local Development
187
+
188
+ Init all Gemfile.lock.* files
189
+
190
+ ```bash
191
+ make init
192
+ ```
193
+
194
+ Bundle install for all Ruby versions
195
+
196
+ ```bash
197
+ make bundle:all
198
+ ```
199
+
200
+ Run tests for all Ruby versions
201
+
202
+ ```bash
203
+ make test:all
204
+ ```
205
+
206
+ Run tests for each Ruby versions individual
207
+
208
+ ```bash
209
+ make test:ruby_2_5
210
+ make test:ruby_2_6
211
+ make test:ruby_2_7
212
+ make test:jruby_9_2
213
+ ```
214
+
215
+ Do development for each Ruby versions individual
216
+
217
+ ```bash
218
+ make dev:ruby_2_5
219
+ make dev:ruby_2_6
220
+ make dev:ruby_2_7
221
+ make dev:jruby_9_2
222
+ ```
@@ -37,47 +37,60 @@ require 'addressable/uri'
37
37
  #
38
38
  # Feel free to {peruse and participate in our Trello board}[https://trello.com/board/ruby-trello/4f092b2ee23cb6fe6d1aaabd]. It's completely open to the public.
39
39
  module Trello
40
- autoload :Action, 'trello/action'
41
- autoload :Comment, 'trello/comment'
42
- autoload :Association, 'trello/association'
43
- autoload :AssociationProxy, 'trello/association_proxy'
44
- autoload :Attachment, 'trello/attachment'
45
- autoload :CoverImage, 'trello/cover_image'
46
- autoload :BasicData, 'trello/basic_data'
47
- autoload :Board, 'trello/board'
48
- autoload :Card, 'trello/card'
49
- autoload :Checklist, 'trello/checklist'
50
- autoload :Client, 'trello/client'
51
- autoload :Configuration, 'trello/configuration'
52
- autoload :HasActions, 'trello/has_actions'
53
- autoload :Item, 'trello/item'
54
- autoload :CheckItemState, 'trello/item_state'
55
- autoload :Label, 'trello/label'
56
- autoload :LabelName, 'trello/label_name'
57
- autoload :List, 'trello/list'
58
- autoload :Member, 'trello/member'
59
- autoload :MultiAssociation, 'trello/multi_association'
60
- autoload :Notification, 'trello/notification'
61
- autoload :Organization, 'trello/organization'
62
- autoload :PluginDatum, 'trello/plugin_datum'
63
- autoload :Request, 'trello/net'
64
- autoload :TInternet, 'trello/net'
65
- autoload :Token, 'trello/token'
66
- autoload :Webhook, 'trello/webhook'
67
- autoload :JsonUtils, 'trello/json_utils'
40
+ autoload :Error, 'trello/error'
41
+ autoload :Action, 'trello/action'
42
+ autoload :Comment, 'trello/comment'
43
+ autoload :Association, 'trello/association'
44
+ autoload :AssociationProxy, 'trello/association_proxy'
45
+ autoload :Attachment, 'trello/attachment'
46
+ autoload :CoverImage, 'trello/cover_image'
47
+ autoload :BasicData, 'trello/basic_data'
48
+ autoload :Board, 'trello/board'
49
+ autoload :Card, 'trello/card'
50
+ autoload :Checklist, 'trello/checklist'
51
+ autoload :Client, 'trello/client'
52
+ autoload :Configuration, 'trello/configuration'
53
+ autoload :CustomField, 'trello/custom_field'
54
+ autoload :CustomFieldItem, 'trello/custom_field_item'
55
+ autoload :CustomFieldOption, 'trello/custom_field_option'
56
+ autoload :HasActions, 'trello/has_actions'
57
+ autoload :Item, 'trello/item'
58
+ autoload :CheckItemState, 'trello/item_state'
59
+ autoload :Label, 'trello/label'
60
+ autoload :LabelName, 'trello/label_name'
61
+ autoload :List, 'trello/list'
62
+ autoload :Member, 'trello/member'
63
+ autoload :MultiAssociation, 'trello/multi_association'
64
+ autoload :Notification, 'trello/notification'
65
+ autoload :Organization, 'trello/organization'
66
+ autoload :PluginDatum, 'trello/plugin_datum'
67
+ autoload :Request, 'trello/net'
68
+ autoload :TInternet, 'trello/net'
69
+ autoload :Token, 'trello/token'
70
+ autoload :Webhook, 'trello/webhook'
71
+ autoload :JsonUtils, 'trello/json_utils'
72
+ autoload :AssociationInferTool, 'trello/association_infer_tool'
73
+ autoload :RegisterAttributes, 'trello/register_attributes'
68
74
 
69
75
  module Authorization
70
- autoload :AuthPolicy, 'trello/authorization'
71
- autoload :BasicAuthPolicy, 'trello/authorization'
72
- autoload :OAuthPolicy, 'trello/authorization'
76
+ autoload :AuthPolicy, 'trello/authorization'
77
+ autoload :BasicAuthPolicy, 'trello/authorization'
78
+ autoload :OAuthPolicy, 'trello/authorization'
79
+ end
80
+
81
+ module AssociationFetcher
82
+ autoload :HasMany, 'trello/association_fetcher/has_many'
83
+ autoload :HasOne, 'trello/association_fetcher/has_one'
84
+ end
85
+
86
+ module AssociationBuilder
87
+ autoload :HasMany, 'trello/association_builder/has_many'
88
+ autoload :HasOne, 'trello/association_builder/has_one'
73
89
  end
74
90
 
75
91
  # Version of the Trello API that we use by default.
76
92
  API_VERSION = 1
77
93
 
78
- # Raise this when we hit a Trello error.
79
- Error = Class.new(StandardError)
80
-
81
94
  # This specific error is thrown when your access token is invalid. You should get a new one.
82
95
  InvalidAccessToken = Class.new(Error)
83
96
 
@@ -38,12 +38,12 @@ module Trello
38
38
  # Supply a hash of string keyed data retrieved from the Trello API representing
39
39
  # an Action.
40
40
  def update_fields(fields)
41
- attributes[:id] = fields['id']
42
- attributes[:type] = fields['type']
43
- attributes[:data] = fields['data']
44
- attributes[:date] = Time.iso8601(fields['date'])
45
- attributes[:member_creator_id] = fields['idMemberCreator']
46
- attributes[:member_participant] = fields['member']
41
+ attributes[:id] = fields['id'] || attributes[:id]
42
+ attributes[:type] = fields['type'] || attributes[:type]
43
+ attributes[:data] = fields['data'] || attributes[:data]
44
+ attributes[:date] = Time.iso8601(fields['date']) rescue nil if fields.has_key?('date')
45
+ attributes[:member_creator_id] = fields['idMemberCreator'] || attributes[:member_creator_id]
46
+ attributes[:member_participant] = fields['member'] || attributes[:member_participant]
47
47
  self
48
48
  end
49
49
 
@@ -62,7 +62,9 @@ module Trello
62
62
  List.from_response client.get("/actions/#{id}/list")
63
63
  end
64
64
 
65
- # Returns the member who created the action.
66
- one :member_creator, via: Member, path: :members, using: :member_creator_id
65
+ # Returns the list the action occurred on.
66
+ def member_creator
67
+ Member.from_response client.get("/actions/#{id}/memberCreator")
68
+ end
67
69
  end
68
70
  end
@@ -0,0 +1,17 @@
1
+ module Trello
2
+ module AssociationBuilder
3
+ class HasMany
4
+ class << self
5
+ def build(model_klass, name, options)
6
+ model_klass.class_eval do
7
+ define_method(name) do |*args|
8
+ has_many_fetcher = AssociationFetcher::HasMany.new(self, name, options)
9
+ filter_params = args[0] || {}
10
+ has_many_fetcher.fetch(filter_params)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ module Trello
2
+ module AssociationBuilder
3
+ class HasOne
4
+ class << self
5
+ def build(model_klass, name, options)
6
+ model_klass.class_eval do
7
+ define_method(name) do |*args|
8
+ has_one_fetcher = AssociationFetcher::HasOne.new(self, name, options)
9
+ has_one_fetcher.fetch
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,26 @@
1
+ module Trello
2
+ module AssociationFetcher
3
+ class HasMany
4
+ autoload :Params, 'trello/association_fetcher/has_many/params'
5
+ autoload :Fetch, 'trello/association_fetcher/has_many/fetch'
6
+
7
+ attr_reader :model, :name, :options
8
+
9
+ def initialize(model, name, options)
10
+ @model = model
11
+ @name = name
12
+ @options = options
13
+ end
14
+
15
+ def fetch(filter_params)
16
+ params = Params.new(
17
+ association_owner: model,
18
+ association_name: name,
19
+ association_options: options,
20
+ filter: filter_params
21
+ )
22
+ Fetch.execute(params)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,47 @@
1
+ module Trello
2
+ module AssociationFetcher
3
+ class HasMany
4
+ class Fetch
5
+ class << self
6
+ def execute(params)
7
+ new(params).execute
8
+ end
9
+ end
10
+
11
+ attr_reader :params
12
+
13
+ def initialize(params)
14
+ @params = params
15
+ end
16
+
17
+ def execute
18
+ resources = client.find_many(association_class, path, filter_params)
19
+
20
+ MultiAssociation.new(association_owner, resources).proxy
21
+ end
22
+
23
+ private
24
+
25
+ def client
26
+ association_owner.client
27
+ end
28
+
29
+ def association_class
30
+ params.association_class
31
+ end
32
+
33
+ def path
34
+ params.fetch_path
35
+ end
36
+
37
+ def filter_params
38
+ params.filter_params
39
+ end
40
+
41
+ def association_owner
42
+ params.association_owner
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,56 @@
1
+ module Trello
2
+ module AssociationFetcher
3
+ class HasMany
4
+ class Params
5
+ attr_reader :association_owner
6
+
7
+ def initialize(association_owner:, association_name:, association_options:, filter:)
8
+ @association_owner = association_owner
9
+ @association_name = association_name
10
+ @association_options = association_options || {}
11
+ @filter = filter || {}
12
+ end
13
+
14
+ def association_class
15
+ association_options[:via] || infer_class_on(association_name)
16
+ end
17
+
18
+ def fetch_path
19
+ "/#{parent_restful_resource}/#{parent_restful_resource_id}/#{target_restful_resource}"
20
+ end
21
+
22
+ def filter_params
23
+ default_filter.merge(filter)
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :association_name, :association_options, :filter
29
+
30
+ def default_filter
31
+ association_options.reject { |k, _| %w[via in path].include?(k.to_s) }
32
+ end
33
+
34
+ def parent_restful_resource
35
+ association_options[:in] || infer_restful_resource_on(association_owner.class)
36
+ end
37
+
38
+ def parent_restful_resource_id
39
+ association_owner.id
40
+ end
41
+
42
+ def target_restful_resource
43
+ association_options[:path] || association_name
44
+ end
45
+
46
+ def infer_restful_resource_on(klass)
47
+ AssociationInferTool.infer_restful_resource_on_class(klass)
48
+ end
49
+
50
+ def infer_class_on(name)
51
+ AssociationInferTool.infer_class_on_name(name)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end