trollolo 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,125 @@
1
+ require_relative 'spec_helper'
2
+
3
+ include GivenFilesystemSpecHelpers
4
+
5
+ describe BurndownData do
6
+
7
+ before(:each) do
8
+ @burndown = BurndownData.new( dummy_settings )
9
+ @burndown.board_id = "myboardid"
10
+ end
11
+
12
+ describe BurndownData::Result do
13
+ it "calculates total" do
14
+ r = BurndownData::Result.new
15
+ r.open = 7
16
+ r.done = 4
17
+
18
+ expect( r.total).to eq 11
19
+ end
20
+ end
21
+
22
+ describe "setters" do
23
+ it "sets open story points" do
24
+ @burndown.story_points.open = 13
25
+ expect( @burndown.story_points.open ).to eq 13
26
+ end
27
+
28
+ it "sets open tasks" do
29
+ @burndown.tasks.open = 42
30
+ expect( @burndown.tasks.open ).to eq 42
31
+ end
32
+ end
33
+
34
+ describe "#fetch_todo_list_id" do
35
+ it "returns list id" do
36
+ list_url_match = /https:\/\/trello.com\/1\/boards\/myboardid\/lists\?-*/
37
+
38
+ stub_request(:any,list_url_match).to_return(:status => 200,
39
+ :body => load_test_file("lists.json"), :headers => {})
40
+
41
+ expect( @burndown.fetch_todo_list_id ).to eq "53186e8391ef8671265eba9e"
42
+ end
43
+
44
+ it "raises exception if it does not find done column" do
45
+ expect{ @burndown.fetch_todo_list_id }.to raise_error
46
+ end
47
+ end
48
+
49
+ describe "#fetch_doing_list_id" do
50
+ it "returns list id" do
51
+ list_url_match = /https:\/\/trello.com\/1\/boards\/myboardid\/lists\?-*/
52
+
53
+ stub_request(:any,list_url_match).to_return(:status => 200,
54
+ :body => load_test_file("lists.json"), :headers => {})
55
+
56
+ expect( @burndown.fetch_doing_list_id ).to eq "53186e8391ef8671265eba9f"
57
+ end
58
+
59
+ it "raises exception if it does not find done column" do
60
+ expect{ @burndown.fetch_doing_list_id }.to raise_error
61
+ end
62
+ end
63
+
64
+ describe "#fetch_done_list_id" do
65
+ it "returns list id" do
66
+ list_url_match = /https:\/\/trello.com\/1\/boards\/myboardid\/lists\?-*/
67
+
68
+ stub_request(:any,list_url_match).to_return(:status => 200,
69
+ :body => load_test_file("lists.json"), :headers => {})
70
+
71
+ expect( @burndown.fetch_done_list_id ).to eq "5319bf088cdf9cd82be336b0"
72
+ end
73
+
74
+ it "raises exception if it does not find done column" do
75
+ expect{ @burndown.fetch_done_list_id }.to raise_error
76
+ end
77
+ end
78
+
79
+ describe "#fetch" do
80
+ before(:each) do
81
+ card_url_match = /https:\/\/trello.com\/1\/boards\/myboardid\/cards\?-*/
82
+
83
+ stub_request(:any,card_url_match).to_return(:status => 200,
84
+ :body => load_test_file("cards.json"), :headers => {})
85
+
86
+ list_url_match = /https:\/\/trello.com\/1\/boards\/myboardid\/lists\?-*/
87
+
88
+ stub_request(:any,list_url_match).to_return(:status => 200,
89
+ :body => load_test_file("lists.json"), :headers => {})
90
+ end
91
+
92
+ it "returns story points" do
93
+ @burndown.fetch
94
+
95
+ expect( @burndown.story_points.total ).to eq 16
96
+ expect( @burndown.story_points.open ).to eq 13
97
+ expect( @burndown.story_points.done ).to eq 3
98
+ end
99
+
100
+ it "returns extra story points" do
101
+ @burndown.fetch
102
+
103
+ expect( @burndown.extra_story_points.total ).to eq 8
104
+ expect( @burndown.extra_story_points.open ).to eq 8
105
+ expect( @burndown.extra_story_points.done ).to eq 0
106
+ end
107
+
108
+ it "returns tasks" do
109
+ @burndown.fetch
110
+
111
+ expect( @burndown.tasks.total ).to eq 13
112
+ expect( @burndown.tasks.open ).to eq 9
113
+ expect( @burndown.tasks.done ).to eq 4
114
+ end
115
+
116
+ it "returns extra tasks" do
117
+ @burndown.fetch
118
+
119
+ expect( @burndown.extra_tasks.total ).to eq 1
120
+ expect( @burndown.extra_tasks.open ).to eq 1
121
+ expect( @burndown.extra_tasks.done ).to eq 0
122
+ end
123
+ end
124
+
125
+ end
@@ -0,0 +1,15 @@
1
+ require "spec_helper"
2
+
3
+ describe Card do
4
+ it "extracts single digit story point value from card name" do
5
+ expect(Card.name_to_points("(3) P1: Refactor cards")).to eq(3)
6
+ end
7
+
8
+ it "extracts double digit story point value from card name" do
9
+ expect(Card.name_to_points("(13) P1: Refactor cards")).to eq(13)
10
+ end
11
+
12
+ it "extracts fractional story point value from card name" do
13
+ expect(Card.name_to_points("(0.5) P1: Refactor cards")).to eq(0.5)
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe Cli do
4
+
5
+ before(:each) do
6
+ Cli.settings = dummy_settings
7
+ @cli = Cli.new
8
+
9
+ allow(STDOUT).to receive(:puts)
10
+ end
11
+
12
+ it "fetches burndown data" do
13
+ expect_any_instance_of(BurndownData).to receive(:fetch)
14
+
15
+ @cli.fetch_burndown_data
16
+ end
17
+
18
+ end
@@ -0,0 +1,56 @@
1
+ require_relative 'spec_helper'
2
+
3
+ require "aruba/api"
4
+
5
+ include Aruba::Api
6
+ include GivenFilesystemSpecHelpers
7
+
8
+ def trollolo_cmd
9
+ File.expand_path('../wrapper/trollolo_wrapper',__FILE__)
10
+ end
11
+
12
+ def trollolo_cmd_empty_config
13
+ File.expand_path('../wrapper/empty_config_trollolo_wrapper',__FILE__)
14
+ end
15
+
16
+ def credentials_input_wrapper
17
+ File.expand_path('../wrapper/credentials_input_wrapper',__FILE__)
18
+ end
19
+
20
+ describe "command line" do
21
+
22
+ it "processes help option" do
23
+ run "trollolo -h"
24
+ assert_exit_status_and_partial_output 0, "Commands:"
25
+ assert_partial_output "trollolo help", all_output
26
+ assert_partial_output "Options:", all_output
27
+ end
28
+
29
+ it "throws error on invalid command" do
30
+ run "#{trollolo_cmd} invalid_command"
31
+ assert_exit_status 1
32
+ end
33
+
34
+ it "asks for authorization data" do
35
+ run "#{credentials_input_wrapper} get-cards --board-id=myboardid"
36
+ assert_exit_status 0
37
+ end
38
+
39
+ describe "burndown chart" do
40
+ use_given_filesystem
41
+
42
+ it "inits burndown directory" do
43
+ path = given_directory
44
+ run "#{trollolo_cmd} burndown-init -o #{path} --board-id=myboardid"
45
+ assert_exit_status 0
46
+ end
47
+
48
+ it "fails, if burndown data is not found" do
49
+ path = given_directory
50
+ run "#{trollolo_cmd} burndown -o #{path}"
51
+ assert_exit_status 1
52
+ assert_partial_output "burndown-data-01.yaml' not found", all_stderr
53
+ end
54
+ end
55
+
56
+ end
@@ -0,0 +1,26 @@
1
+ ---
2
+ meta:
3
+ sprint: 2
4
+ total_days: 9
5
+ weekend_lines:
6
+ - 3.5
7
+ - 7.5
8
+ days:
9
+ - date: '2014-04-23'
10
+ story_points:
11
+ total: 30
12
+ open: 23
13
+ tasks:
14
+ total: 25
15
+ open: 21
16
+ - date: '2014-04-24'
17
+ story_points:
18
+ total: 30
19
+ open: 21
20
+ tasks:
21
+ total: 26
22
+ open: 19
23
+ story_points_extra:
24
+ done: 3
25
+ tasks_extra:
26
+ done: 2
@@ -0,0 +1,9 @@
1
+ ---
2
+ meta:
3
+ board_id: "myboardid"
4
+ sprint: 1
5
+ total_days: 9
6
+ weekend_lines:
7
+ - 3.5
8
+ - 7.5
9
+ days: []
@@ -0,0 +1,9 @@
1
+ ---
2
+ meta:
3
+ board_id: "myboardid"
4
+ sprint: 2
5
+ total_days: 9
6
+ weekend_lines:
7
+ - 3.5
8
+ - 7.5
9
+ days: []
@@ -0,0 +1,142 @@
1
+ #!/usr/bin/python
2
+ import matplotlib.pyplot as plt
3
+ import numpy as np
4
+ import sys
5
+ import yaml
6
+
7
+ if len(sys.argv) != 2:
8
+ print "Usage: alfred-burndown.py <sprint-number>"
9
+ sys.exit(1)
10
+
11
+ sprint = sys.argv[1]
12
+
13
+ with open('burndown-data-' + sprint + '.yaml', 'r') as f:
14
+ burndown = yaml.load(f)
15
+
16
+ meta = burndown["meta"]
17
+
18
+ total_days = meta["total_days"]
19
+ weekend_line1 = meta["weekend_lines"][0]
20
+ weekend_line2 = meta["weekend_lines"][1]
21
+
22
+ current_day = 1
23
+ x_days = []
24
+ y_open_story_points = []
25
+ y_open_tasks = []
26
+ total_tasks = []
27
+ total_story_points = []
28
+ x_days_extra = []
29
+ x_day_extra_start = []
30
+ y_story_points_done_extra = [0]
31
+ y_tasks_done_extra = [0]
32
+
33
+ for day in burndown["days"]:
34
+ x_days.append(current_day)
35
+ y_open_story_points.append(day["story_points"]["open"])
36
+ y_open_tasks.append(day["tasks"]["open"])
37
+ total_tasks.append(day["tasks"]["total"])
38
+ total_story_points.append(day["story_points"]["total"])
39
+
40
+ if "story_points_extra" in day or "tasks_extra" in day:
41
+ x_days_extra.append(current_day)
42
+ y_story_points_done_extra.append(-day["story_points_extra"]["done"])
43
+ y_tasks_done_extra.append(-day["tasks_extra"]["done"])
44
+
45
+ current_day += 1
46
+
47
+ # Calculate array for days under the waterline
48
+ x_days_extra = [x_days_extra[0] - 1] + x_days_extra
49
+
50
+ scalefactor = float(total_tasks[0]) / float(y_open_story_points[0])
51
+
52
+ # Calculate minimum and maximum 'y' values for the axis
53
+ ymin_t_extra = 0
54
+ ymin_s_extra = 0
55
+ ymax = y_open_story_points[0] + 3
56
+
57
+ if len(y_tasks_done_extra) > 0:
58
+ ymin_t_extra = y_tasks_done_extra[len(y_tasks_done_extra) -1] -3
59
+ if len(y_story_points_done_extra) > 0:
60
+ ymin_s_extra = y_story_points_done_extra[len(y_story_points_done_extra) -1] -3
61
+ if ymin_t_extra < ymin_s_extra:
62
+ ymin = ymin_t_extra
63
+ else:
64
+ ymin = ymin_s_extra
65
+ if ymin_t_extra == 0 and ymin_s_extra == 0:
66
+ ymin = -3
67
+
68
+ # Plot in xkcd style
69
+ plt.xkcd()
70
+
71
+ plt.figure(1, figsize=(11, 6))
72
+
73
+ # Title of the burndown chart
74
+ plt.suptitle('Sprint ' + sprint, fontsize='large')
75
+
76
+ plt.xlabel('Days')
77
+ plt.axis([0, total_days + 1, ymin, ymax])
78
+ plt.plot([1, total_days] , [y_open_story_points[0], 0], color='grey')
79
+ plt.plot([0, total_days + 1], [0, 0], color='blue', linestyle=':')
80
+
81
+ # Weekend lines
82
+ plt.plot([weekend_line1, weekend_line1], [ymin+1, ymax-1], color='grey', linestyle=':')
83
+ plt.plot([weekend_line2, weekend_line2], [ymin+1, ymax-1], color='grey', linestyle=':')
84
+
85
+ # Story points
86
+ plt.ylabel('Story Points', color='black')
87
+ plt.plot(x_days, y_open_story_points, 'ko-', linewidth=2)
88
+ plt.plot(x_days_extra, y_story_points_done_extra, 'ko-', linewidth=2)
89
+
90
+ # Tasks
91
+ plt.twinx()
92
+ plt.ylabel('Tasks', color='green')
93
+ plt.tick_params(axis='y', colors='green')
94
+ plt.axis([0, total_days + 1, ymin*scalefactor, ymax * scalefactor])
95
+ plt.plot(x_days, y_open_tasks, 'go-', linewidth=2)
96
+ plt.plot(x_days_extra, y_tasks_done_extra, 'go-', linewidth=2)
97
+
98
+ # Calculation of new tasks
99
+ if len(total_tasks) > 1:
100
+ new_tasks = [0]
101
+ for i in range(1, len(total_tasks)):
102
+ new_tasks.append(total_tasks[i] - total_tasks[i - 1])
103
+ effective_new_tasks_days = []
104
+ effective_new_tasks = []
105
+ for i in range(len(new_tasks)):
106
+ if new_tasks[i] != 0:
107
+ effective_new_tasks_days.append(i - 0.25 + 1)
108
+ effective_new_tasks.append(new_tasks[i])
109
+ if len(effective_new_tasks) > 0:
110
+ plt.bar(effective_new_tasks_days, effective_new_tasks, .2, color='green')
111
+
112
+ # Calculation of new story points
113
+ if len(total_story_points) > 1:
114
+ new_story_points = [0]
115
+ for i in range(1, len(total_story_points)):
116
+ new_story_points.append(total_story_points[i] - total_story_points[i - 1])
117
+ effective_new_story_points_days = []
118
+ effective_new_story_points = []
119
+ for i in range(len(new_story_points)):
120
+ if new_story_points[i] != 0:
121
+ effective_new_story_points_days.append(i + 0.05 + 1)
122
+ effective_new_story_points.append(new_story_points[i])
123
+ if len(effective_new_story_points) > 0:
124
+ plt.bar(effective_new_story_points_days, effective_new_story_points, .2, color='black')
125
+
126
+ # Draw arrow showing already done tasks at begin of sprint
127
+ tasks_done = burndown["days"][0]["tasks"]["total"] - burndown["days"][0]["tasks"]["open"]
128
+
129
+ if tasks_done > 0:
130
+ plt.annotate("",
131
+ xy=(x_days[0], scalefactor * y_open_story_points[0] - 0.5 ), xycoords='data',
132
+ xytext=(x_days[0], y_open_tasks[0] + 0.5), textcoords='data',
133
+ arrowprops=dict(arrowstyle="<|-|>", connectionstyle="arc3", color='green')
134
+ )
135
+
136
+ plt.text(0.7, y_open_story_points[0], str(tasks_done) + " tasks done",
137
+ rotation='vertical', verticalalignment='center', color='green'
138
+ )
139
+
140
+ # Save the burndown chart
141
+ plt.savefig('burndown-' + sprint + '.png',bbox_inches='tight')
142
+ plt.show()
@@ -0,0 +1,1002 @@
1
+ [
2
+ {
3
+ "subscribed": false,
4
+ "idBoard": "53186e8391ef8671265eba9d",
5
+ "dateLastActivity": "2014-03-07T12:52:07.236Z",
6
+ "closed": false,
7
+ "id": "5319bf244cc53afd5afd991f",
8
+ "badges": {
9
+ "subscribed": false,
10
+ "checkItems": 0,
11
+ "description": false,
12
+ "votes": 0,
13
+ "attachments": 0,
14
+ "comments": 0,
15
+ "viewingMemberVoted": false,
16
+ "fogbugz": "",
17
+ "due": null,
18
+ "checkItemsChecked": 0
19
+ },
20
+ "url": "https://trello.com/c/GRsvY3vZ/3-sprint-3",
21
+ "shortUrl": "https://trello.com/c/GRsvY3vZ",
22
+ "descData": null,
23
+ "shortLink": "GRsvY3vZ",
24
+ "idShort": 3,
25
+ "checkItemStates": [
26
+
27
+ ],
28
+ "idAttachmentCover": null,
29
+ "idMembersVoted": [
30
+
31
+ ],
32
+ "idMembers": [
33
+
34
+ ],
35
+ "pos": 65535,
36
+ "name": "Sprint 3",
37
+ "idChecklists": [
38
+
39
+ ],
40
+ "due": null,
41
+ "manualCoverAttachment": false,
42
+ "desc": "",
43
+ "labels": [
44
+ {
45
+ "color": "blue",
46
+ "name": "Sticky"
47
+ }
48
+ ],
49
+ "idList": "53186e8391ef8671265eba9e"
50
+ },
51
+ {
52
+ "subscribed": false,
53
+ "idBoard": "53186e8391ef8671265eba9d",
54
+ "dateLastActivity": "2014-03-07T13:00:17.162Z",
55
+ "closed": false,
56
+ "id": "5319c16d9d04708d450d65f1",
57
+ "badges": {
58
+ "subscribed": false,
59
+ "checkItems": 4,
60
+ "description": false,
61
+ "votes": 0,
62
+ "attachments": 0,
63
+ "comments": 0,
64
+ "viewingMemberVoted": false,
65
+ "fogbugz": "",
66
+ "due": null,
67
+ "checkItemsChecked": 0
68
+ },
69
+ "url": "https://trello.com/c/pOLDMtPW/16-3-p1-fill-backlog-column",
70
+ "shortUrl": "https://trello.com/c/pOLDMtPW",
71
+ "descData": null,
72
+ "shortLink": "pOLDMtPW",
73
+ "idShort": 16,
74
+ "checkItemStates": [
75
+
76
+ ],
77
+ "idAttachmentCover": null,
78
+ "idMembersVoted": [
79
+
80
+ ],
81
+ "idMembers": [
82
+
83
+ ],
84
+ "pos": 131071,
85
+ "name": "(3) P1: Fill Backlog column",
86
+ "idChecklists": [
87
+ "5319c22c584448bf2c314936"
88
+ ],
89
+ "due": null,
90
+ "manualCoverAttachment": false,
91
+ "desc": "",
92
+ "labels": [
93
+
94
+ ],
95
+ "idList": "53186e8391ef8671265eba9e"
96
+ },
97
+ {
98
+ "subscribed": false,
99
+ "idBoard": "53186e8391ef8671265eba9d",
100
+ "dateLastActivity": "2014-03-14T12:09:14.263Z",
101
+ "closed": false,
102
+ "id": "5319c57ff6be845f428aa7a3",
103
+ "badges": {
104
+ "subscribed": false,
105
+ "checkItems": 2,
106
+ "description": false,
107
+ "votes": 0,
108
+ "attachments": 0,
109
+ "comments": 0,
110
+ "viewingMemberVoted": false,
111
+ "fogbugz": "",
112
+ "due": null,
113
+ "checkItemsChecked": 0
114
+ },
115
+ "url": "https://trello.com/c/d7ZeVHVH/18-5-p4-read-data-from-trollolo",
116
+ "shortUrl": "https://trello.com/c/d7ZeVHVH",
117
+ "descData": null,
118
+ "shortLink": "d7ZeVHVH",
119
+ "idShort": 18,
120
+ "checkItemStates": [
121
+
122
+ ],
123
+ "idAttachmentCover": null,
124
+ "idMembersVoted": [
125
+
126
+ ],
127
+ "idMembers": [
128
+
129
+ ],
130
+ "pos": 163839,
131
+ "name": "(5) P4: Read data from Trollolo",
132
+ "idChecklists": [
133
+ "5319c5b3d9e20a072df0400a"
134
+ ],
135
+ "due": null,
136
+ "manualCoverAttachment": false,
137
+ "desc": "",
138
+ "labels": [
139
+
140
+ ],
141
+ "idList": "53186e8391ef8671265eba9e"
142
+ },
143
+ {
144
+ "subscribed": false,
145
+ "idBoard": "53186e8391ef8671265eba9d",
146
+ "dateLastActivity": "2014-03-14T12:09:20.214Z",
147
+ "closed": false,
148
+ "id": "5319c5961e530fd26f83999d",
149
+ "badges": {
150
+ "subscribed": false,
151
+ "checkItems": 2,
152
+ "description": false,
153
+ "votes": 0,
154
+ "attachments": 0,
155
+ "comments": 0,
156
+ "viewingMemberVoted": false,
157
+ "fogbugz": "",
158
+ "due": null,
159
+ "checkItemsChecked": 0
160
+ },
161
+ "url": "https://trello.com/c/sSDUmT6R/19-3-p5-save-read-data-as-reference-data",
162
+ "shortUrl": "https://trello.com/c/sSDUmT6R",
163
+ "descData": null,
164
+ "shortLink": "sSDUmT6R",
165
+ "idShort": 19,
166
+ "checkItemStates": [
167
+
168
+ ],
169
+ "idAttachmentCover": null,
170
+ "idMembersVoted": [
171
+
172
+ ],
173
+ "idMembers": [
174
+
175
+ ],
176
+ "pos": 180223,
177
+ "name": "(3) P5: Save read data as reference data",
178
+ "idChecklists": [
179
+ "5319c5ce8cf780f37d4c0b35"
180
+ ],
181
+ "due": null,
182
+ "manualCoverAttachment": false,
183
+ "desc": "",
184
+ "labels": [
185
+
186
+ ],
187
+ "idList": "53186e8391ef8671265eba9e"
188
+ },
189
+ {
190
+ "subscribed": false,
191
+ "idBoard": "53186e8391ef8671265eba9d",
192
+ "dateLastActivity": "2014-03-07T12:54:51.637Z",
193
+ "closed": false,
194
+ "id": "5319c197e4a1ba6215bc03c8",
195
+ "badges": {
196
+ "subscribed": false,
197
+ "checkItems": 0,
198
+ "description": false,
199
+ "votes": 0,
200
+ "attachments": 0,
201
+ "comments": 0,
202
+ "viewingMemberVoted": false,
203
+ "fogbugz": "",
204
+ "due": null,
205
+ "checkItemsChecked": 0
206
+ },
207
+ "url": "https://trello.com/c/663yRhde/17-waterline",
208
+ "shortUrl": "https://trello.com/c/663yRhde",
209
+ "descData": null,
210
+ "shortLink": "663yRhde",
211
+ "idShort": 17,
212
+ "checkItemStates": [
213
+
214
+ ],
215
+ "idAttachmentCover": null,
216
+ "idMembersVoted": [
217
+
218
+ ],
219
+ "idMembers": [
220
+
221
+ ],
222
+ "pos": 196607,
223
+ "name": "Waterline",
224
+ "idChecklists": [
225
+
226
+ ],
227
+ "due": null,
228
+ "manualCoverAttachment": false,
229
+ "desc": "",
230
+ "labels": [
231
+ {
232
+ "color": "blue",
233
+ "name": "Sticky"
234
+ }
235
+ ],
236
+ "idList": "53186e8391ef8671265eba9e"
237
+ },
238
+ {
239
+ "subscribed": false,
240
+ "idBoard": "53186e8391ef8671265eba9d",
241
+ "dateLastActivity": "2014-03-14T12:10:26.446Z",
242
+ "closed": false,
243
+ "id": "5319c5a8743488047e13fcbc",
244
+ "badges": {
245
+ "subscribed": false,
246
+ "checkItems": 1,
247
+ "description": false,
248
+ "votes": 0,
249
+ "attachments": 0,
250
+ "comments": 0,
251
+ "viewingMemberVoted": false,
252
+ "fogbugz": "",
253
+ "due": null,
254
+ "checkItemsChecked": 0
255
+ },
256
+ "url": "https://trello.com/c/n2g4S35q/20-8-p6-celebrate-testing-board",
257
+ "shortUrl": "https://trello.com/c/n2g4S35q",
258
+ "descData": null,
259
+ "shortLink": "n2g4S35q",
260
+ "idShort": 20,
261
+ "checkItemStates": [
262
+
263
+ ],
264
+ "idAttachmentCover": null,
265
+ "idMembersVoted": [
266
+
267
+ ],
268
+ "idMembers": [
269
+
270
+ ],
271
+ "pos": 393215,
272
+ "name": "(8) P6: Celebrate testing board",
273
+ "idChecklists": [
274
+ "5319c5ea7b7a51a62bc907a1"
275
+ ],
276
+ "due": null,
277
+ "manualCoverAttachment": false,
278
+ "desc": "",
279
+ "labels": [
280
+ {
281
+ "color": "yellow",
282
+ "name": "Under waterline"
283
+ }
284
+ ],
285
+ "idList": "53186e8391ef8671265eba9e"
286
+ },
287
+ {
288
+ "subscribed": false,
289
+ "idBoard": "53186e8391ef8671265eba9d",
290
+ "dateLastActivity": "2014-03-07T12:57:01.715Z",
291
+ "closed": false,
292
+ "id": "5319c15d4a5040bb15f74655",
293
+ "badges": {
294
+ "subscribed": false,
295
+ "checkItems": 2,
296
+ "description": false,
297
+ "votes": 0,
298
+ "attachments": 0,
299
+ "comments": 0,
300
+ "viewingMemberVoted": false,
301
+ "fogbugz": "",
302
+ "due": null,
303
+ "checkItemsChecked": 1
304
+ },
305
+ "url": "https://trello.com/c/QI256QAJ/15-2-p2-fill-doing-column",
306
+ "shortUrl": "https://trello.com/c/QI256QAJ",
307
+ "descData": null,
308
+ "shortLink": "QI256QAJ",
309
+ "idShort": 15,
310
+ "checkItemStates": [
311
+ {
312
+ "idCheckItem": "5319c20b30a984c645c687ac",
313
+ "state": "complete"
314
+ }
315
+ ],
316
+ "idAttachmentCover": null,
317
+ "idMembersVoted": [
318
+
319
+ ],
320
+ "idMembers": [
321
+
322
+ ],
323
+ "pos": 65535,
324
+ "name": "(2) P2: Fill Doing column",
325
+ "idChecklists": [
326
+ "5319c1cd55ed32bd2bb998eb"
327
+ ],
328
+ "due": null,
329
+ "manualCoverAttachment": false,
330
+ "desc": "",
331
+ "labels": [
332
+
333
+ ],
334
+ "idList": "53186e8391ef8671265eba9f"
335
+ },
336
+ {
337
+ "subscribed": false,
338
+ "idBoard": "53186e8391ef8671265eba9d",
339
+ "dateLastActivity": "2014-03-07T12:53:06.043Z",
340
+ "closed": false,
341
+ "id": "5319c12ca78944d77d7912ea",
342
+ "badges": {
343
+ "subscribed": false,
344
+ "checkItems": 0,
345
+ "description": false,
346
+ "votes": 0,
347
+ "attachments": 0,
348
+ "comments": 0,
349
+ "viewingMemberVoted": false,
350
+ "fogbugz": "",
351
+ "due": null,
352
+ "checkItemsChecked": 0
353
+ },
354
+ "url": "https://trello.com/c/m2WRyutm/14-burndown-chart",
355
+ "shortUrl": "https://trello.com/c/m2WRyutm",
356
+ "descData": null,
357
+ "shortLink": "m2WRyutm",
358
+ "idShort": 14,
359
+ "checkItemStates": [
360
+
361
+ ],
362
+ "idAttachmentCover": null,
363
+ "idMembersVoted": [
364
+
365
+ ],
366
+ "idMembers": [
367
+
368
+ ],
369
+ "pos": 32767.5,
370
+ "name": "Burndown chart",
371
+ "idChecklists": [
372
+
373
+ ],
374
+ "due": null,
375
+ "manualCoverAttachment": false,
376
+ "desc": "",
377
+ "labels": [
378
+ {
379
+ "color": "blue",
380
+ "name": "Sticky"
381
+ }
382
+ ],
383
+ "idList": "5319bf088cdf9cd82be336b0"
384
+ },
385
+ {
386
+ "subscribed": false,
387
+ "idBoard": "53186e8391ef8671265eba9d",
388
+ "dateLastActivity": "2014-03-07T12:54:22.043Z",
389
+ "closed": false,
390
+ "id": "5319c07f277eb1661503be8a",
391
+ "badges": {
392
+ "subscribed": false,
393
+ "checkItems": 3,
394
+ "description": false,
395
+ "votes": 0,
396
+ "attachments": 0,
397
+ "comments": 0,
398
+ "viewingMemberVoted": false,
399
+ "fogbugz": "",
400
+ "due": null,
401
+ "checkItemsChecked": 3
402
+ },
403
+ "url": "https://trello.com/c/mbmz1nct/9-3-p3-fill-done-columns",
404
+ "shortUrl": "https://trello.com/c/mbmz1nct",
405
+ "descData": null,
406
+ "shortLink": "mbmz1nct",
407
+ "idShort": 9,
408
+ "checkItemStates": [
409
+ {
410
+ "idCheckItem": "5319c0b4deedfe4142d2f2bc",
411
+ "state": "complete"
412
+ },
413
+ {
414
+ "idCheckItem": "5319c0b8a8f372aa2b17ab8d",
415
+ "state": "complete"
416
+ },
417
+ {
418
+ "idCheckItem": "5319c0bd66b5b18a15d6c0ac",
419
+ "state": "complete"
420
+ }
421
+ ],
422
+ "idAttachmentCover": null,
423
+ "idMembersVoted": [
424
+
425
+ ],
426
+ "idMembers": [
427
+
428
+ ],
429
+ "pos": 65535,
430
+ "name": "(3) P3: Fill Done columns",
431
+ "idChecklists": [
432
+ "5319c09cab4511c37d2a6254"
433
+ ],
434
+ "due": null,
435
+ "manualCoverAttachment": false,
436
+ "desc": "",
437
+ "labels": [
438
+
439
+ ],
440
+ "idList": "5319bf088cdf9cd82be336b0"
441
+ },
442
+ {
443
+ "subscribed": false,
444
+ "idBoard": "53186e8391ef8671265eba9d",
445
+ "dateLastActivity": "2014-03-07T12:52:52.679Z",
446
+ "closed": false,
447
+ "id": "5319c10ed542ef5b1591d0e4",
448
+ "badges": {
449
+ "subscribed": false,
450
+ "checkItems": 0,
451
+ "description": false,
452
+ "votes": 0,
453
+ "attachments": 0,
454
+ "comments": 0,
455
+ "viewingMemberVoted": false,
456
+ "fogbugz": "",
457
+ "due": null,
458
+ "checkItemsChecked": 0
459
+ },
460
+ "url": "https://trello.com/c/WGpuHyli/13-burndown-chart",
461
+ "shortUrl": "https://trello.com/c/WGpuHyli",
462
+ "descData": null,
463
+ "shortLink": "WGpuHyli",
464
+ "idShort": 13,
465
+ "checkItemStates": [
466
+
467
+ ],
468
+ "idAttachmentCover": null,
469
+ "idMembersVoted": [
470
+
471
+ ],
472
+ "idMembers": [
473
+
474
+ ],
475
+ "pos": 65535.75,
476
+ "name": "Burndown chart",
477
+ "idChecklists": [
478
+
479
+ ],
480
+ "due": null,
481
+ "manualCoverAttachment": false,
482
+ "desc": "",
483
+ "labels": [
484
+ {
485
+ "color": "blue",
486
+ "name": "Sticky"
487
+ }
488
+ ],
489
+ "idList": "5319bf045c6ef0092c55331e"
490
+ },
491
+ {
492
+ "subscribed": false,
493
+ "idBoard": "53186e8391ef8671265eba9d",
494
+ "dateLastActivity": "2014-03-07T12:51:40.941Z",
495
+ "closed": false,
496
+ "id": "5319c0ccfb3dad67457985d0",
497
+ "badges": {
498
+ "subscribed": false,
499
+ "checkItems": 0,
500
+ "description": false,
501
+ "votes": 0,
502
+ "attachments": 0,
503
+ "comments": 0,
504
+ "viewingMemberVoted": false,
505
+ "fogbugz": "",
506
+ "due": null,
507
+ "checkItemsChecked": 0
508
+ },
509
+ "url": "https://trello.com/c/tHgAV3is/10-sprint-2",
510
+ "shortUrl": "https://trello.com/c/tHgAV3is",
511
+ "descData": null,
512
+ "shortLink": "tHgAV3is",
513
+ "idShort": 10,
514
+ "checkItemStates": [
515
+
516
+ ],
517
+ "idAttachmentCover": null,
518
+ "idMembersVoted": [
519
+
520
+ ],
521
+ "idMembers": [
522
+
523
+ ],
524
+ "pos": 131071.5,
525
+ "name": "Sprint 2",
526
+ "idChecklists": [
527
+
528
+ ],
529
+ "due": null,
530
+ "manualCoverAttachment": false,
531
+ "desc": "",
532
+ "labels": [
533
+ {
534
+ "color": "blue",
535
+ "name": "Sticky"
536
+ }
537
+ ],
538
+ "idList": "5319bf045c6ef0092c55331e"
539
+ },
540
+ {
541
+ "subscribed": false,
542
+ "idBoard": "53186e8391ef8671265eba9d",
543
+ "dateLastActivity": "2014-03-07T12:48:06.330Z",
544
+ "closed": false,
545
+ "id": "5319bf851193a85e110d8460",
546
+ "badges": {
547
+ "subscribed": false,
548
+ "checkItems": 0,
549
+ "description": false,
550
+ "votes": 0,
551
+ "attachments": 0,
552
+ "comments": 0,
553
+ "viewingMemberVoted": false,
554
+ "fogbugz": "",
555
+ "due": null,
556
+ "checkItemsChecked": 0
557
+ },
558
+ "url": "https://trello.com/c/xIBbjlRQ/7-2-p1-explain-purpose",
559
+ "shortUrl": "https://trello.com/c/xIBbjlRQ",
560
+ "descData": null,
561
+ "shortLink": "xIBbjlRQ",
562
+ "idShort": 7,
563
+ "checkItemStates": [
564
+
565
+ ],
566
+ "idAttachmentCover": null,
567
+ "idMembersVoted": [
568
+
569
+ ],
570
+ "idMembers": [
571
+
572
+ ],
573
+ "pos": 262143,
574
+ "name": "(2) P1: Explain purpose",
575
+ "idChecklists": [
576
+
577
+ ],
578
+ "due": null,
579
+ "manualCoverAttachment": false,
580
+ "desc": "",
581
+ "labels": [
582
+
583
+ ],
584
+ "idList": "5319bf045c6ef0092c55331e"
585
+ },
586
+ {
587
+ "subscribed": false,
588
+ "idBoard": "53186e8391ef8671265eba9d",
589
+ "dateLastActivity": "2014-03-07T12:49:44.474Z",
590
+ "closed": false,
591
+ "id": "5319c0409a567dc62b68aa6b",
592
+ "badges": {
593
+ "subscribed": false,
594
+ "checkItems": 3,
595
+ "description": false,
596
+ "votes": 0,
597
+ "attachments": 0,
598
+ "comments": 0,
599
+ "viewingMemberVoted": false,
600
+ "fogbugz": "",
601
+ "due": null,
602
+ "checkItemsChecked": 3
603
+ },
604
+ "url": "https://trello.com/c/afmNzjbW/8-2-p2-create-scrum-columns",
605
+ "shortUrl": "https://trello.com/c/afmNzjbW",
606
+ "descData": null,
607
+ "shortLink": "afmNzjbW",
608
+ "idShort": 8,
609
+ "checkItemStates": [
610
+ {
611
+ "idCheckItem": "5319c052d86da6cb6fa2a9e0",
612
+ "state": "complete"
613
+ },
614
+ {
615
+ "idCheckItem": "5319c0548163d08c11d36a07",
616
+ "state": "complete"
617
+ },
618
+ {
619
+ "idCheckItem": "5319c0562fef3bc511c79279",
620
+ "state": "complete"
621
+ }
622
+ ],
623
+ "idAttachmentCover": null,
624
+ "idMembersVoted": [
625
+
626
+ ],
627
+ "idMembers": [
628
+
629
+ ],
630
+ "pos": 327679,
631
+ "name": "(2) P2: Create Scrum columns",
632
+ "idChecklists": [
633
+ "5319c04d592a9182153db831"
634
+ ],
635
+ "due": null,
636
+ "manualCoverAttachment": false,
637
+ "desc": "",
638
+ "labels": [
639
+
640
+ ],
641
+ "idList": "5319bf045c6ef0092c55331e"
642
+ },
643
+ {
644
+ "subscribed": false,
645
+ "idBoard": "53186e8391ef8671265eba9d",
646
+ "dateLastActivity": "2014-03-07T12:52:49.208Z",
647
+ "closed": false,
648
+ "id": "5319c1062d3cd2de456c3127",
649
+ "badges": {
650
+ "subscribed": false,
651
+ "checkItems": 0,
652
+ "description": false,
653
+ "votes": 0,
654
+ "attachments": 0,
655
+ "comments": 0,
656
+ "viewingMemberVoted": false,
657
+ "fogbugz": "",
658
+ "due": null,
659
+ "checkItemsChecked": 0
660
+ },
661
+ "url": "https://trello.com/c/dBvqdCxL/12-burndown-chart",
662
+ "shortUrl": "https://trello.com/c/dBvqdCxL",
663
+ "descData": null,
664
+ "shortLink": "dBvqdCxL",
665
+ "idShort": 12,
666
+ "checkItemStates": [
667
+
668
+ ],
669
+ "idAttachmentCover": null,
670
+ "idMembersVoted": [
671
+
672
+ ],
673
+ "idMembers": [
674
+
675
+ ],
676
+ "pos": 16383.75,
677
+ "name": "Burndown chart",
678
+ "idChecklists": [
679
+
680
+ ],
681
+ "due": null,
682
+ "manualCoverAttachment": false,
683
+ "desc": "",
684
+ "labels": [
685
+ {
686
+ "color": "blue",
687
+ "name": "Sticky"
688
+ }
689
+ ],
690
+ "idList": "53186e8391ef8671265ebaa0"
691
+ },
692
+ {
693
+ "subscribed": false,
694
+ "idBoard": "53186e8391ef8671265eba9d",
695
+ "dateLastActivity": "2014-03-07T12:51:57.432Z",
696
+ "closed": false,
697
+ "id": "5319c0cf0c9c84b0450b41ce",
698
+ "badges": {
699
+ "subscribed": false,
700
+ "checkItems": 0,
701
+ "description": false,
702
+ "votes": 0,
703
+ "attachments": 0,
704
+ "comments": 0,
705
+ "viewingMemberVoted": false,
706
+ "fogbugz": "",
707
+ "due": null,
708
+ "checkItemsChecked": 0
709
+ },
710
+ "url": "https://trello.com/c/kyPwZhls/11-sprint-1",
711
+ "shortUrl": "https://trello.com/c/kyPwZhls",
712
+ "descData": null,
713
+ "shortLink": "kyPwZhls",
714
+ "idShort": 11,
715
+ "checkItemStates": [
716
+
717
+ ],
718
+ "idAttachmentCover": null,
719
+ "idMembersVoted": [
720
+
721
+ ],
722
+ "idMembers": [
723
+
724
+ ],
725
+ "pos": 32767.5,
726
+ "name": "Sprint 1",
727
+ "idChecklists": [
728
+
729
+ ],
730
+ "due": null,
731
+ "manualCoverAttachment": false,
732
+ "desc": "",
733
+ "labels": [
734
+ {
735
+ "color": "blue",
736
+ "name": "Sticky"
737
+ }
738
+ ],
739
+ "idList": "53186e8391ef8671265ebaa0"
740
+ },
741
+ {
742
+ "subscribed": false,
743
+ "idBoard": "53186e8391ef8671265eba9d",
744
+ "dateLastActivity": "2014-03-07T12:48:42.185Z",
745
+ "closed": false,
746
+ "id": "5319bf6980da466e451848bb",
747
+ "badges": {
748
+ "subscribed": false,
749
+ "checkItems": 2,
750
+ "description": false,
751
+ "votes": 0,
752
+ "attachments": 0,
753
+ "comments": 0,
754
+ "viewingMemberVoted": false,
755
+ "fogbugz": "",
756
+ "due": null,
757
+ "checkItemsChecked": 2
758
+ },
759
+ "url": "https://trello.com/c/jK3lHglS/4-1-p1-create-trello-testing-board",
760
+ "shortUrl": "https://trello.com/c/jK3lHglS",
761
+ "descData": null,
762
+ "shortLink": "jK3lHglS",
763
+ "idShort": 4,
764
+ "checkItemStates": [
765
+ {
766
+ "idCheckItem": "5319bfd806b13b906faa1705",
767
+ "state": "complete"
768
+ },
769
+ {
770
+ "idCheckItem": "5319bfdb43b3177d1112b8b4",
771
+ "state": "complete"
772
+ }
773
+ ],
774
+ "idAttachmentCover": null,
775
+ "idMembersVoted": [
776
+
777
+ ],
778
+ "idMembers": [
779
+
780
+ ],
781
+ "pos": 65535,
782
+ "name": "(1) P1: Create Trello Testing Board",
783
+ "idChecklists": [
784
+ "5319bfca9876ce6d4591c4b2"
785
+ ],
786
+ "due": null,
787
+ "manualCoverAttachment": false,
788
+ "desc": "",
789
+ "labels": [
790
+
791
+ ],
792
+ "idList": "53186e8391ef8671265ebaa0"
793
+ },
794
+ {
795
+ "subscribed": false,
796
+ "idBoard": "53186e8391ef8671265eba9d",
797
+ "dateLastActivity": "2014-03-07T12:46:58.957Z",
798
+ "closed": false,
799
+ "id": "5319bf7099ee686d15b3e966",
800
+ "badges": {
801
+ "subscribed": false,
802
+ "checkItems": 4,
803
+ "description": false,
804
+ "votes": 0,
805
+ "attachments": 0,
806
+ "comments": 0,
807
+ "viewingMemberVoted": false,
808
+ "fogbugz": "",
809
+ "due": null,
810
+ "checkItemsChecked": 4
811
+ },
812
+ "url": "https://trello.com/c/Ph2XGEwl/5-5-p2-add-fancy-background",
813
+ "shortUrl": "https://trello.com/c/Ph2XGEwl",
814
+ "descData": null,
815
+ "shortLink": "Ph2XGEwl",
816
+ "idShort": 5,
817
+ "checkItemStates": [
818
+ {
819
+ "idCheckItem": "5319bfae5a24d7037e79a726",
820
+ "state": "complete"
821
+ },
822
+ {
823
+ "idCheckItem": "5319bfb5b0d2cfb56fa08a3b",
824
+ "state": "complete"
825
+ },
826
+ {
827
+ "idCheckItem": "5319bfb7eeecdca82bffe3d4",
828
+ "state": "complete"
829
+ },
830
+ {
831
+ "idCheckItem": "5319bfbe5b4bd5c845e3c598",
832
+ "state": "complete"
833
+ }
834
+ ],
835
+ "idAttachmentCover": null,
836
+ "idMembersVoted": [
837
+
838
+ ],
839
+ "idMembers": [
840
+
841
+ ],
842
+ "pos": 131071,
843
+ "name": "(5) P2: Add fancy background",
844
+ "idChecklists": [
845
+ "5319bfaa8ff351c22b123ad0"
846
+ ],
847
+ "due": null,
848
+ "manualCoverAttachment": false,
849
+ "desc": "",
850
+ "labels": [
851
+
852
+ ],
853
+ "idList": "53186e8391ef8671265ebaa0"
854
+ },
855
+ {
856
+ "subscribed": false,
857
+ "idBoard": "53186e8391ef8671265eba9d",
858
+ "dateLastActivity": "2014-03-07T12:48:38.152Z",
859
+ "closed": false,
860
+ "id": "5319bf7bf2c8ecce45c2f5bb",
861
+ "badges": {
862
+ "subscribed": false,
863
+ "checkItems": 1,
864
+ "description": false,
865
+ "votes": 0,
866
+ "attachments": 0,
867
+ "comments": 0,
868
+ "viewingMemberVoted": false,
869
+ "fogbugz": "",
870
+ "due": null,
871
+ "checkItemsChecked": 1
872
+ },
873
+ "url": "https://trello.com/c/02broblM/6-1-p4-add-legend",
874
+ "shortUrl": "https://trello.com/c/02broblM",
875
+ "descData": null,
876
+ "shortLink": "02broblM",
877
+ "idShort": 6,
878
+ "checkItemStates": [
879
+ {
880
+ "idCheckItem": "5319bff6c1d6da8742926989",
881
+ "state": "complete"
882
+ }
883
+ ],
884
+ "idAttachmentCover": null,
885
+ "idMembersVoted": [
886
+
887
+ ],
888
+ "idMembers": [
889
+
890
+ ],
891
+ "pos": 196607,
892
+ "name": "(1) P4: Add legend",
893
+ "idChecklists": [
894
+ "5319bfeb2d638eb411117815"
895
+ ],
896
+ "due": null,
897
+ "manualCoverAttachment": false,
898
+ "desc": "",
899
+ "labels": [
900
+
901
+ ],
902
+ "idList": "53186e8391ef8671265ebaa0"
903
+ },
904
+ {
905
+ "subscribed": false,
906
+ "idBoard": "53186e8391ef8671265eba9d",
907
+ "dateLastActivity": "2014-03-07T12:36:34.037Z",
908
+ "closed": false,
909
+ "id": "5319bd1a8b60144a4255b294",
910
+ "badges": {
911
+ "subscribed": false,
912
+ "checkItems": 0,
913
+ "description": true,
914
+ "votes": 0,
915
+ "attachments": 0,
916
+ "comments": 0,
917
+ "viewingMemberVoted": false,
918
+ "fogbugz": "",
919
+ "due": null,
920
+ "checkItemsChecked": 0
921
+ },
922
+ "url": "https://trello.com/c/APlDWOc8/2-purpose",
923
+ "shortUrl": "https://trello.com/c/APlDWOc8",
924
+ "descData": {
925
+ "emoji": {
926
+ }
927
+ },
928
+ "shortLink": "APlDWOc8",
929
+ "idShort": 2,
930
+ "checkItemStates": [
931
+
932
+ ],
933
+ "idAttachmentCover": null,
934
+ "idMembersVoted": [
935
+
936
+ ],
937
+ "idMembers": [
938
+
939
+ ],
940
+ "pos": 32767.5,
941
+ "name": "Purpose",
942
+ "idChecklists": [
943
+
944
+ ],
945
+ "due": null,
946
+ "manualCoverAttachment": false,
947
+ "desc": "This board is used for testing the command line application \"Trollolo\", which is used by Team Alfred to extract data from their Scrum board to create Burndown charts.",
948
+ "labels": [
949
+
950
+ ],
951
+ "idList": "5319bc0aa338308d42f108d6"
952
+ },
953
+ {
954
+ "subscribed": false,
955
+ "idBoard": "53186e8391ef8671265eba9d",
956
+ "dateLastActivity": "2014-03-07T12:35:23.121Z",
957
+ "closed": false,
958
+ "id": "5319bc12f1ac326d11e3f46c",
959
+ "badges": {
960
+ "subscribed": false,
961
+ "checkItems": 0,
962
+ "description": true,
963
+ "votes": 0,
964
+ "attachments": 0,
965
+ "comments": 0,
966
+ "viewingMemberVoted": false,
967
+ "fogbugz": "",
968
+ "due": null,
969
+ "checkItemsChecked": 0
970
+ },
971
+ "url": "https://trello.com/c/C46wQCD2/1-background-image",
972
+ "shortUrl": "https://trello.com/c/C46wQCD2",
973
+ "descData": {
974
+ "emoji": {
975
+ }
976
+ },
977
+ "shortLink": "C46wQCD2",
978
+ "idShort": 1,
979
+ "checkItemStates": [
980
+
981
+ ],
982
+ "idAttachmentCover": null,
983
+ "idMembersVoted": [
984
+
985
+ ],
986
+ "idMembers": [
987
+
988
+ ],
989
+ "pos": 65535,
990
+ "name": "Background image",
991
+ "idChecklists": [
992
+
993
+ ],
994
+ "due": null,
995
+ "manualCoverAttachment": false,
996
+ "desc": "[Lots of thirty-second notes with a legato above by Horia Varlan, on Flickr](http://www.flickr.com/photos/horiavarlan/4268316033/) (CC BY 2.0)\n",
997
+ "labels": [
998
+
999
+ ],
1000
+ "idList": "5319bc0aa338308d42f108d6"
1001
+ }
1002
+ ]