taskmapper-trello 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cf2ca13422c543d08265d55eae1ea7e565857251
4
+ data.tar.gz: 6a0b56fdfd0d962eee5791003bc7683e324376a5
5
+ SHA512:
6
+ metadata.gz: 4f0415b02544f0ef912d35dcdb6469cb1031ad4337cbeee079665956ed1b770d2f71359fcf14511fc7ab5800735fe747debed7b5adcab1ccdc8dc4ee4a21e055
7
+ data.tar.gz: b862e25d21ec49033834441a6b1401aa3ff29021745b7ed73cea8a84581d1397b725925288c56b82047f0419e4f9d1f946eeb5df425aae6f568da816f6d0d7fc
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ spec/credentials.rb
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - 2.0.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in taskmapper-trello.gemspec
4
+ gemspec
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 The Hybrid Group
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,116 @@
1
+ # taskmapper-trello
2
+
3
+
4
+ This is the [TaskMapper][] for interaction with [Trello][]
5
+
6
+ ## Usage
7
+
8
+ Initialize the Trello TaskMapper instance using your public key and member
9
+ token:
10
+
11
+ ```ruby
12
+ trello = TaskMapper.new(
13
+ :taskmapper,
14
+ :developer_public_key => "YOUR_DEVELOPER_PUBLIC_KEY",
15
+ :member_token => "YOUR_MEMBER_TOKEN"
16
+ )
17
+ ```
18
+
19
+ To find your `developer_public_key`, go to
20
+ [https://trello.com/1/appKey/generate][key].
21
+
22
+ To get a `member_token` you can use ad infinitum, modify this URL and visit it in
23
+ a browser:
24
+
25
+ https://trello.com/1/authorize?key=APPLICATION_KEY&scope=read%2Cwrite&name=taskmapper-trello&expiration=never&response_type=token
26
+
27
+ After confirming, you'll be given a `member_token` that should not
28
+ expire.
29
+
30
+
31
+ [key]: https://trello.com/1/appKey/generate#
32
+ [token]: https://trello.com/1/appKey/generate#
33
+
34
+ ### Finding Projects(Boards)
35
+
36
+ You can find your own projects by using:
37
+
38
+ ```ruby
39
+ projects = trello.projects # will return all boards
40
+ projects = trello.projects ["board_id", "another_board_id"]
41
+ project = trello.projects.find :first, "board_id"
42
+ projects = trello.projects.find :all, ["board_id", "another_board_id"]
43
+ ```
44
+
45
+ ### Finding Tickets(Cards)
46
+
47
+ ```ruby
48
+ tickets = project.tickets # All open tickets
49
+ tickets = project.tickets :all, :status => 'closed' # all closed tickets
50
+ ticket = project.ticket "4ea4fa0dd791269d4e29a1b3"
51
+ ```
52
+
53
+ ### Opening A Ticket
54
+
55
+ ```ruby
56
+ ticket = project.ticket!(
57
+ :name => "New Ticket"
58
+ :description => "Content of the new ticket."
59
+ )
60
+ ```
61
+
62
+ ### Closing Tickets
63
+
64
+ ```ruby
65
+ ticket.close
66
+ ```
67
+
68
+ ### Reopening Tickets
69
+
70
+ ```ruby
71
+ ticket.reopen
72
+ ```
73
+
74
+ ### Updating Tickets
75
+
76
+ ```ruby
77
+ ticket.name = "Updated name"
78
+ ticket.description = "New description"
79
+ ticket.save
80
+ ```
81
+
82
+ ## Dependencies
83
+
84
+ - rubygems
85
+ - [taskmapper][]
86
+ - [ruby-trello][]
87
+
88
+ ## Notes
89
+
90
+ The Trello API does not currently support fetching comments for tickets/cards.
91
+ As such, the `taskmapper-trello` gem does not provide comment functionality for
92
+ tickets right now. If the API changes to allow this, we'll update
93
+ `taskmapper-trello` to match.
94
+
95
+ If you run into any issues, please feel free to open an issue or pull request.
96
+
97
+ ## Contributing
98
+
99
+ The main way you can contribute is with some code! Here's how:
100
+
101
+ - Fork `taskmapper-trello`
102
+ - Create a topic branch: git checkout -b my_awesome_feature
103
+ - Push to your branch - git push origin my_awesome_feature
104
+ - Create a Pull Request from your branch
105
+ - That's it!
106
+
107
+ We use RSpec for testing. Please include tests with your pull request. A simple
108
+ `bundle exec rake` will run the suite. Also, please try to TomDoc your methods,
109
+ it makes it easier to see what the code does and makes it easier for future
110
+ contributors to get started.
111
+
112
+ (c) 2013 The Hybrid Group
113
+
114
+ [TaskMapper]: http://ticketrb.com
115
+ [Trello]: http://trello.com
116
+ [ruby-trello]: https://github.com/jeremytregunna/ruby-trello
@@ -0,0 +1,7 @@
1
+ require "bundler"
2
+ require 'rspec/core/rake_task'
3
+
4
+ task :default => :spec
5
+
6
+ Bundler::GemHelper.install_tasks
7
+ RSpec::Core::RakeTask.new :spec
@@ -0,0 +1,28 @@
1
+ module TaskMapper::Provider
2
+ module Trello
3
+ class Project < TaskMapper::Provider::Base::Project
4
+ def initialize(*object)
5
+ if object.first
6
+ object = object.first
7
+ super object
8
+ end
9
+ end
10
+
11
+ class << self
12
+ def find_by_attributes(attributes = {})
13
+ search_by_attribute(self.find_all, attributes)
14
+ end
15
+
16
+ def find_all
17
+ boards = TaskMapper::Provider::Trello.api.boards
18
+ boards.map { |board| self.new board.attributes }
19
+ end
20
+
21
+ def find_by_id(id)
22
+ board = TaskMapper::Provider::Trello.api.boards.find { |f| f.id == id}
23
+ self.new board.attributes
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,103 @@
1
+ module TaskMapper::Provider
2
+ module Trello
3
+ class Ticket < TaskMapper::Provider::Base::Ticket
4
+ class << self
5
+ def find_by_id(project_id, ticket_id)
6
+ api = TaskMapper::Provider::Trello.api
7
+ board = api.boards.find { |b| b.id == project_id }
8
+ cards = board.cards.map(&:attributes)
9
+ card = cards.find { |c| c[:id] == ticket_id }
10
+ self.new card
11
+ end
12
+
13
+ def find_by_attributes(project_id, attributes = {})
14
+ tickets = self.find_all(project_id)
15
+ search_by_attribute(tickets, attributes)
16
+ end
17
+
18
+ def find_all(project_id)
19
+ api = TaskMapper::Provider::Trello.api
20
+ board = api.boards.find { |b| b.id == project_id }
21
+ cards = board.cards.map(&:attributes)
22
+ cards.collect { |c| self.new c }
23
+ end
24
+
25
+ def create(attributes)
26
+ ticket = self.new(attributes)
27
+ ticket if ticket.save
28
+ end
29
+ end
30
+
31
+ def initialize(*object)
32
+ object = object.first if object.is_a? Array
33
+ super object
34
+ check_and_replace_attribute :desc, :description
35
+ check_and_replace_attribute :board_id, :project_id
36
+ check_and_replace_attribute :last_activity_date, :updated_at
37
+ set_status
38
+ end
39
+
40
+ def save
41
+ new? ? to_card : update
42
+ end
43
+
44
+ def new?
45
+ list_id.nil?
46
+ end
47
+
48
+ def to_card
49
+ opts = {
50
+ :name => name,
51
+ :list_id => project_id,
52
+ :desc => description
53
+ }
54
+
55
+ card = ::Trello::Card.create(opts)
56
+
57
+ card = card.first if card.is_a?(Array)
58
+
59
+ self.merge!(card.attributes)
60
+ check_and_replace_attribute :desc, :description
61
+ check_and_replace_attribute :board_id, :project_id
62
+ check_and_replace_attribute :last_activity_date, :updated_at
63
+ set_status
64
+ end
65
+
66
+ def update
67
+ card = find_card
68
+ attrs = Hash[self]
69
+ attrs['desc'] = attrs.delete('description')
70
+ attrs['board_id'] = attrs.delete('project_id')
71
+ attrs['closed'] = (attrs.delete('status') == 'closed')
72
+ card.update_fields(attrs).save
73
+ end
74
+
75
+ def close
76
+ self.status = 'closed'
77
+ update
78
+ end
79
+
80
+ def reopen
81
+ self.status = 'open'
82
+ update
83
+ end
84
+
85
+ private
86
+ def check_and_replace_attribute(base, target)
87
+ if self[base] && !self[target]
88
+ self[target] = self.delete(base)
89
+ end
90
+ end
91
+
92
+ def set_status
93
+ self[:status] = (self[:closed] ? 'closed' : 'open')
94
+ end
95
+
96
+ def find_card
97
+ api = TaskMapper::Provider::Trello.api
98
+ board = api.boards.find { |b| b.id == project_id }
99
+ board.cards.find { |c| c.id == id }
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,45 @@
1
+ module TaskMapper::Provider
2
+ module Trello
3
+ include TaskMapper::Provider::Base
4
+
5
+ class << self
6
+ attr_accessor :developer_public_key, :member_token, :api
7
+ end
8
+
9
+ def self.new(auth = {})
10
+ TaskMapper.new(:trello, auth)
11
+ end
12
+
13
+ def provider
14
+ TaskMapper::Provider::Trello
15
+ end
16
+
17
+ def configure(auth)
18
+ ::Trello.configure do |c|
19
+ c.developer_public_key = auth[:developer_public_key]
20
+ c.member_token = auth[:member_token]
21
+ end
22
+
23
+ provider.api = ::Trello::Member.find auth[:username]
24
+ end
25
+
26
+ def authorize(auth = {})
27
+ @authentication ||= TaskMapper::Authenticator.new(auth)
28
+ unless auth[:developer_public_key] && auth[:member_token]
29
+ exception = "Please provide a developer_public_key and member_token."
30
+ raise TaskMapper::Exception.new(exception)
31
+ end
32
+
33
+ unless auth[:username]
34
+ raise TaskMapper::Exception.new("Please provide a username.")
35
+ end
36
+
37
+ provider.developer_public_key = auth[:developer_public_key]
38
+ provider.member_token = auth[:member_token]
39
+ configure auth
40
+ end
41
+
42
+ def valid?
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,7 @@
1
+ class TaskMapper
2
+ module Provider
3
+ module Trello
4
+ VERSION = "0.0.1" unless defined?(Trello::VERSION)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'taskmapper'
2
+ require 'trello'
3
+
4
+ require 'provider/trello'
5
+ require 'provider/project'
6
+ require 'provider/ticket'
7
+ require 'provider/version'
@@ -0,0 +1,15 @@
1
+ # If you'd like to create some additional specs, and need to make requests of
2
+ # the Trello API as part of your testing, copy this file to spec/credentials.rb
3
+ # and modify the values as you need.
4
+
5
+ def key
6
+ "YOUR_TRELLO_DEVELOPER_PUBLIC_KEY"
7
+ end
8
+
9
+ def token
10
+ "YOUR_MEMBER_TOKEN"
11
+ end
12
+
13
+ def username
14
+ "YOUR_TRELLO_USERNAME"
15
+ end
@@ -0,0 +1,498 @@
1
+ [
2
+ {
3
+ "id": "4f26e22814cd935006633fd9",
4
+ "name": "ITAS",
5
+ "desc": "",
6
+ "descData": null,
7
+ "closed": true,
8
+ "idOrganization": "",
9
+ "invited": false,
10
+ "pinned": true,
11
+ "url": "https:\/\/trello.com\/b\/hXRaLTzn\/itas",
12
+ "prefs": {
13
+ "permissionLevel": "private",
14
+ "voting": "disabled",
15
+ "comments": "members",
16
+ "invitations": "members",
17
+ "selfJoin": false,
18
+ "cardCovers": true,
19
+ "backgroundColor": "#205C7E",
20
+ "backgroundImage": null,
21
+ "backgroundImageScaled": null,
22
+ "bg": "blue",
23
+ "canBePublic": true,
24
+ "canBeOrg": true,
25
+ "canBePrivate": true,
26
+ "canInvite": true
27
+ },
28
+ "invitations": [
29
+
30
+ ],
31
+ "memberships": [
32
+ {
33
+ "id": "4f26e22814cd935006633fe0",
34
+ "idMember": "4ea4f9b1ad8ba68c10013887",
35
+ "memberType": "admin",
36
+ "deactivated": false,
37
+ "unconfirmed": false
38
+ }
39
+ ],
40
+ "shortLink": "hXRaLTzn",
41
+ "subscribed": false,
42
+ "labelNames": {
43
+ "yellow": "ITAS 274 - Internet Scripting II",
44
+ "red": "ITAS 280 - Advanced Wide Area Technologies",
45
+ "purple": "ITAS 288 - Database Administration and Design",
46
+ "orange": "ITAS 278 - Internet Server Management II",
47
+ "green": "ITAS 264 - Technology & Human Management",
48
+ "blue": ""
49
+ },
50
+ "powerUps": [
51
+
52
+ ],
53
+ "dateLastActivity": null,
54
+ "dateLastView": "2012-02-21T19:38:39.170Z",
55
+ "shortUrl": "https:\/\/trello.com\/b\/hXRaLTzn"
56
+ },
57
+ {
58
+ "id": "4ea4fd11fc8f1d3999192a7d",
59
+ "name": "ITAS 257 - Internet Server Management",
60
+ "desc": "",
61
+ "descData": null,
62
+ "closed": true,
63
+ "idOrganization": "",
64
+ "invited": false,
65
+ "pinned": false,
66
+ "url": "https:\/\/trello.com\/b\/ANiuLvrz\/itas-257-internet-server-management",
67
+ "prefs": {
68
+ "permissionLevel": "private",
69
+ "voting": "disabled",
70
+ "comments": "members",
71
+ "invitations": "members",
72
+ "selfJoin": false,
73
+ "cardCovers": true,
74
+ "backgroundColor": "#205C7E",
75
+ "backgroundImage": null,
76
+ "backgroundImageScaled": null,
77
+ "bg": "blue",
78
+ "canBePublic": true,
79
+ "canBeOrg": true,
80
+ "canBePrivate": true,
81
+ "canInvite": true
82
+ },
83
+ "invitations": [
84
+
85
+ ],
86
+ "memberships": [
87
+ {
88
+ "id": "4ea4fd11fc8f1d3999192a84",
89
+ "idMember": "4ea4f9b1ad8ba68c10013887",
90
+ "memberType": "admin",
91
+ "deactivated": false,
92
+ "unconfirmed": false
93
+ },
94
+ {
95
+ "id": "4ea597797bfb3f050e08fbaa",
96
+ "idMember": "4ea58a183e561607d9021747",
97
+ "memberType": "normal",
98
+ "deactivated": false,
99
+ "unconfirmed": false
100
+ }
101
+ ],
102
+ "shortLink": "ANiuLvrz",
103
+ "subscribed": false,
104
+ "labelNames": {
105
+ "purple": "",
106
+ "blue": "",
107
+ "green": "",
108
+ "yellow": "",
109
+ "orange": "",
110
+ "red": ""
111
+ },
112
+ "powerUps": [
113
+
114
+ ],
115
+ "dateLastActivity": "2013-07-05T15:35:32.519Z",
116
+ "dateLastView": "2011-11-25T18:46:31.693Z",
117
+ "shortUrl": "https:\/\/trello.com\/b\/ANiuLvrz"
118
+ },
119
+ {
120
+ "id": "4f0f2f4508f28652554231d2",
121
+ "name": "Main",
122
+ "desc": "",
123
+ "descData": null,
124
+ "closed": true,
125
+ "idOrganization": "",
126
+ "invited": false,
127
+ "pinned": false,
128
+ "url": "https:\/\/trello.com\/b\/Ul6WmOB2\/main",
129
+ "prefs": {
130
+ "permissionLevel": "private",
131
+ "voting": "disabled",
132
+ "comments": "members",
133
+ "invitations": "members",
134
+ "selfJoin": false,
135
+ "cardCovers": true,
136
+ "backgroundColor": "#205C7E",
137
+ "backgroundImage": null,
138
+ "backgroundImageScaled": null,
139
+ "bg": "blue",
140
+ "canBePublic": true,
141
+ "canBeOrg": true,
142
+ "canBePrivate": true,
143
+ "canInvite": true
144
+ },
145
+ "invitations": [
146
+
147
+ ],
148
+ "memberships": [
149
+ {
150
+ "id": "4f0f2f4508f28652554231d9",
151
+ "idMember": "4ea4f9b1ad8ba68c10013887",
152
+ "memberType": "admin",
153
+ "deactivated": false,
154
+ "unconfirmed": false
155
+ },
156
+ {
157
+ "id": "4f0f334c002f1e43770ef559",
158
+ "idMember": "4f0e36e1d41f37e75910f8e1",
159
+ "memberType": "normal",
160
+ "deactivated": false,
161
+ "unconfirmed": false
162
+ },
163
+ {
164
+ "id": "4f0f33a0db768c194e45ea18",
165
+ "idMember": "4f0f3373db768c194e45dbf3",
166
+ "memberType": "normal",
167
+ "deactivated": false,
168
+ "unconfirmed": false
169
+ }
170
+ ],
171
+ "shortLink": "Ul6WmOB2",
172
+ "subscribed": false,
173
+ "labelNames": {
174
+ "purple": "",
175
+ "blue": "",
176
+ "green": "",
177
+ "yellow": "",
178
+ "orange": "",
179
+ "red": ""
180
+ },
181
+ "powerUps": [
182
+
183
+ ],
184
+ "dateLastActivity": null,
185
+ "dateLastView": "2012-04-14T05:40:19.537Z",
186
+ "shortUrl": "https:\/\/trello.com\/b\/Ul6WmOB2"
187
+ },
188
+ {
189
+ "id": "4f2ac73accc68eeb0b24fc44",
190
+ "name": "Nanaimo Health Care",
191
+ "desc": "",
192
+ "descData": null,
193
+ "closed": true,
194
+ "idOrganization": "",
195
+ "invited": false,
196
+ "pinned": false,
197
+ "url": "https:\/\/trello.com\/b\/SF7e1ezt\/nanaimo-health-care",
198
+ "prefs": {
199
+ "permissionLevel": "private",
200
+ "voting": "members",
201
+ "comments": "members",
202
+ "invitations": "members",
203
+ "selfJoin": true,
204
+ "cardCovers": true,
205
+ "backgroundColor": "#205C7E",
206
+ "backgroundImage": null,
207
+ "backgroundImageScaled": null,
208
+ "bg": "blue",
209
+ "canBePublic": true,
210
+ "canBeOrg": true,
211
+ "canBePrivate": true,
212
+ "canInvite": true
213
+ },
214
+ "invitations": [
215
+
216
+ ],
217
+ "memberships": [
218
+ {
219
+ "id": "4f2ac73accc68eeb0b24fc4b",
220
+ "idMember": "4ea4f9b1ad8ba68c10013887",
221
+ "memberType": "admin",
222
+ "deactivated": false,
223
+ "unconfirmed": false
224
+ },
225
+ {
226
+ "id": "4f2accb59737398111007a18",
227
+ "idMember": "4f0f3373db768c194e45dbf3",
228
+ "memberType": "normal",
229
+ "deactivated": false,
230
+ "unconfirmed": false
231
+ },
232
+ {
233
+ "id": "4f2ace58e99432b27a025923",
234
+ "idMember": "4f0e36e1d41f37e75910f8e1",
235
+ "memberType": "normal",
236
+ "deactivated": false,
237
+ "unconfirmed": false
238
+ },
239
+ {
240
+ "id": "4f2acfcd31d7f3b57a0402ac",
241
+ "idMember": "4f1062fd8751a92b300a93ca",
242
+ "memberType": "normal",
243
+ "deactivated": false,
244
+ "unconfirmed": false
245
+ },
246
+ {
247
+ "id": "4f2adb7c8e01c02a1b048024",
248
+ "idMember": "4f0f6a159729ac321e02126f",
249
+ "memberType": "normal",
250
+ "deactivated": false,
251
+ "unconfirmed": false
252
+ }
253
+ ],
254
+ "shortLink": "SF7e1ezt",
255
+ "subscribed": false,
256
+ "labelNames": {
257
+ "purple": "",
258
+ "blue": "",
259
+ "green": "",
260
+ "yellow": "",
261
+ "orange": "",
262
+ "red": ""
263
+ },
264
+ "powerUps": [
265
+ "voting"
266
+ ],
267
+ "dateLastActivity": null,
268
+ "dateLastView": "2012-04-14T05:40:30.102Z",
269
+ "shortUrl": "https:\/\/trello.com\/b\/SF7e1ezt"
270
+ },
271
+ {
272
+ "id": "4f225e83ed560e771605d318",
273
+ "name": "Personal",
274
+ "desc": "",
275
+ "descData": null,
276
+ "closed": true,
277
+ "idOrganization": "",
278
+ "invited": false,
279
+ "pinned": true,
280
+ "url": "https:\/\/trello.com\/b\/zsxNiIwU\/personal",
281
+ "prefs": {
282
+ "permissionLevel": "private",
283
+ "voting": "disabled",
284
+ "comments": "members",
285
+ "invitations": "members",
286
+ "selfJoin": false,
287
+ "cardCovers": true,
288
+ "backgroundColor": "#205C7E",
289
+ "backgroundImage": null,
290
+ "backgroundImageScaled": null,
291
+ "bg": "blue",
292
+ "canBePublic": true,
293
+ "canBeOrg": true,
294
+ "canBePrivate": true,
295
+ "canInvite": true
296
+ },
297
+ "invitations": [
298
+
299
+ ],
300
+ "memberships": [
301
+ {
302
+ "id": "4f225e83ed560e771605d31f",
303
+ "idMember": "4ea4f9b1ad8ba68c10013887",
304
+ "memberType": "admin",
305
+ "deactivated": false,
306
+ "unconfirmed": false
307
+ }
308
+ ],
309
+ "shortLink": "zsxNiIwU",
310
+ "subscribed": false,
311
+ "labelNames": {
312
+ "purple": "",
313
+ "blue": "",
314
+ "green": "",
315
+ "yellow": "",
316
+ "orange": "",
317
+ "red": ""
318
+ },
319
+ "powerUps": [
320
+
321
+ ],
322
+ "dateLastActivity": null,
323
+ "dateLastView": "2012-02-21T19:38:46.955Z",
324
+ "shortUrl": "https:\/\/trello.com\/b\/zsxNiIwU"
325
+ },
326
+ {
327
+ "id": "4f1ef9220dc5a4633b3e9d9b",
328
+ "name": "Projects",
329
+ "desc": "",
330
+ "descData": null,
331
+ "closed": true,
332
+ "idOrganization": "",
333
+ "invited": false,
334
+ "pinned": true,
335
+ "url": "https:\/\/trello.com\/b\/C0XDDoeE\/projects",
336
+ "prefs": {
337
+ "permissionLevel": "private",
338
+ "voting": "disabled",
339
+ "comments": "members",
340
+ "invitations": "members",
341
+ "selfJoin": false,
342
+ "cardCovers": true,
343
+ "backgroundColor": "#205C7E",
344
+ "backgroundImage": null,
345
+ "backgroundImageScaled": null,
346
+ "bg": "blue",
347
+ "canBePublic": true,
348
+ "canBeOrg": true,
349
+ "canBePrivate": true,
350
+ "canInvite": true
351
+ },
352
+ "invitations": [
353
+
354
+ ],
355
+ "memberships": [
356
+ {
357
+ "id": "4f1ef9220dc5a4633b3e9da2",
358
+ "idMember": "4ea4f9b1ad8ba68c10013887",
359
+ "memberType": "admin",
360
+ "deactivated": false,
361
+ "unconfirmed": false
362
+ }
363
+ ],
364
+ "shortLink": "C0XDDoeE",
365
+ "subscribed": false,
366
+ "labelNames": {
367
+ "purple": "",
368
+ "blue": "",
369
+ "green": "",
370
+ "yellow": "",
371
+ "orange": "",
372
+ "red": ""
373
+ },
374
+ "powerUps": [
375
+
376
+ ],
377
+ "dateLastActivity": null,
378
+ "dateLastView": "2012-01-24T18:48:52.425Z",
379
+ "shortUrl": "https:\/\/trello.com\/b\/C0XDDoeE"
380
+ },
381
+ {
382
+ "id": "4f0b8693acbcd9212e362eae",
383
+ "name": "Reach API",
384
+ "desc": "",
385
+ "descData": null,
386
+ "closed": true,
387
+ "idOrganization": "",
388
+ "invited": false,
389
+ "pinned": false,
390
+ "url": "https:\/\/trello.com\/b\/R5OTduDx\/reach-api",
391
+ "prefs": {
392
+ "permissionLevel": "private",
393
+ "voting": "disabled",
394
+ "comments": "members",
395
+ "invitations": "members",
396
+ "selfJoin": false,
397
+ "cardCovers": true,
398
+ "backgroundColor": "#205C7E",
399
+ "backgroundImage": null,
400
+ "backgroundImageScaled": null,
401
+ "bg": "blue",
402
+ "canBePublic": true,
403
+ "canBeOrg": true,
404
+ "canBePrivate": true,
405
+ "canInvite": true
406
+ },
407
+ "invitations": [
408
+
409
+ ],
410
+ "memberships": [
411
+ {
412
+ "id": "4f0b8693acbcd9212e362eb5",
413
+ "idMember": "4ea4f9b1ad8ba68c10013887",
414
+ "memberType": "admin",
415
+ "deactivated": false,
416
+ "unconfirmed": false
417
+ }
418
+ ],
419
+ "shortLink": "R5OTduDx",
420
+ "subscribed": false,
421
+ "labelNames": {
422
+ "purple": "",
423
+ "blue": "",
424
+ "green": "",
425
+ "yellow": "",
426
+ "orange": "",
427
+ "red": ""
428
+ },
429
+ "powerUps": [
430
+
431
+ ],
432
+ "dateLastActivity": null,
433
+ "dateLastView": "2012-01-12T19:20:48.475Z",
434
+ "shortUrl": "https:\/\/trello.com\/b\/R5OTduDx"
435
+ },
436
+ {
437
+ "id": "4ea4fa0cd791269d4e29a176",
438
+ "name": "Welcome Board",
439
+ "desc": "",
440
+ "descData": null,
441
+ "closed": false,
442
+ "idOrganization": null,
443
+ "invited": false,
444
+ "pinned": false,
445
+ "url": "https:\/\/trello.com\/b\/i5t3ZIBG\/welcome-board",
446
+ "prefs": {
447
+ "permissionLevel": "public",
448
+ "voting": "members",
449
+ "comments": "members",
450
+ "invitations": "members",
451
+ "selfJoin": false,
452
+ "cardCovers": true,
453
+ "backgroundColor": "#205C7E",
454
+ "backgroundImage": null,
455
+ "backgroundImageScaled": null,
456
+ "bg": "blue",
457
+ "canBePublic": true,
458
+ "canBeOrg": true,
459
+ "canBePrivate": true,
460
+ "canInvite": true
461
+ },
462
+ "invitations": [
463
+
464
+ ],
465
+ "memberships": [
466
+ {
467
+ "id": "4ea4fa0cd791269d4e29a175",
468
+ "idMember": "4e6a7fad05d98b02ba00845c",
469
+ "memberType": "normal",
470
+ "deactivated": false,
471
+ "unconfirmed": false
472
+ },
473
+ {
474
+ "id": "4ea4fa0cd791269d4e29a180",
475
+ "idMember": "4ea4f9b1ad8ba68c10013887",
476
+ "memberType": "admin",
477
+ "deactivated": false,
478
+ "unconfirmed": false
479
+ }
480
+ ],
481
+ "shortLink": "i5t3ZIBG",
482
+ "subscribed": false,
483
+ "labelNames": {
484
+ "purple": "",
485
+ "blue": "",
486
+ "green": "",
487
+ "yellow": "",
488
+ "orange": "",
489
+ "red": ""
490
+ },
491
+ "powerUps": [
492
+ "voting"
493
+ ],
494
+ "dateLastActivity": "2013-07-05T15:32:27.188Z",
495
+ "dateLastView": "2013-09-23T17:52:26.647Z",
496
+ "shortUrl": "https:\/\/trello.com\/b\/i5t3ZIBG"
497
+ }
498
+ ]