trollolo 0.0.5 → 0.0.6
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +4 -3
- data/lib/burndown_chart.rb +10 -6
- data/lib/burndown_data.rb +34 -16
- data/lib/card.rb +18 -0
- data/lib/checklist.rb +9 -0
- data/lib/cli.rb +36 -114
- data/lib/column.rb +5 -1
- data/lib/scrum_board.rb +40 -0
- data/lib/trello_wrapper.rb +5 -0
- data/lib/trollolo.rb +1 -0
- data/lib/version.rb +1 -1
- data/spec/data/attachment-data +1 -0
- data/spec/data/board.json +2 -1
- data/spec/data/burndown-data.yaml +6 -0
- data/spec/data/burndown_dir/burndown-data-02.yaml +13 -1
- data/spec/data/create_burndown_helper/burndown-08.png +0 -0
- data/spec/data/create_burndown_helper/burndown-23.png +0 -0
- data/spec/data/create_burndown_helper/burndown-31.png +0 -0
- data/spec/data/create_burndown_helper/burndown-35.png +0 -0
- data/spec/data/full-board.json +166 -22
- data/spec/unit/backup_spec.rb +5 -0
- data/spec/unit/burndown_chart_spec.rb +176 -85
- data/spec/unit/burndown_data_spec.rb +77 -45
- data/spec/unit/card_spec.rb +75 -0
- data/spec/unit/cli_spec.rb +71 -10
- data/spec/unit/support/update_webmock_data +22 -4
- data/spec/unit/trello_wrapper_spec.rb +30 -0
- data/trollolo.gemspec +2 -2
- data/yes_ship_it.conf +2 -2
- metadata +18 -19
- data/man/trollolo.1 +0 -128
- data/man/trollolo.1.html +0 -219
@@ -3,7 +3,6 @@ require_relative 'spec_helper'
|
|
3
3
|
include GivenFilesystemSpecHelpers
|
4
4
|
|
5
5
|
describe BurndownChart do
|
6
|
-
|
7
6
|
before(:each) do
|
8
7
|
@settings = dummy_settings
|
9
8
|
@burndown_data = BurndownData.new(@settings)
|
@@ -58,94 +57,172 @@ describe BurndownChart do
|
|
58
57
|
"tasks_extra" =>
|
59
58
|
{
|
60
59
|
"done" => 2
|
60
|
+
},
|
61
|
+
"story_points_unplanned" =>
|
62
|
+
{
|
63
|
+
"total" => 3,
|
64
|
+
"open" => 1
|
65
|
+
},
|
66
|
+
"tasks_unplanned" =>
|
67
|
+
{
|
68
|
+
"total" => 2,
|
69
|
+
"open" => 1
|
61
70
|
}
|
62
71
|
}
|
63
72
|
]
|
64
73
|
end
|
65
74
|
|
66
|
-
it "
|
67
|
-
@
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
75
|
+
it "returns sprint number" do
|
76
|
+
expect(@chart.sprint).to eq 1
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "#add_data" do
|
80
|
+
it "creates first data entry" do
|
81
|
+
@burndown_data.story_points.open = 16
|
82
|
+
@burndown_data.story_points.done = 7
|
83
|
+
@burndown_data.tasks.open = 10
|
84
|
+
@burndown_data.tasks.done = 11
|
85
|
+
@burndown_data.date_time = DateTime.parse("2014-05-30")
|
72
86
|
|
73
|
-
|
87
|
+
@chart.add_data(@burndown_data)
|
74
88
|
|
75
|
-
|
76
|
-
|
89
|
+
expect( @chart.data["days"].first["story_points"] ).to eq(
|
90
|
+
{
|
91
|
+
"total" => 23,
|
92
|
+
"open" => 16
|
93
|
+
} )
|
94
|
+
expect( @chart.data["days"].first["tasks"] ).to eq(
|
95
|
+
{
|
96
|
+
"total" => 21,
|
97
|
+
"open" => 10
|
98
|
+
} )
|
99
|
+
end
|
100
|
+
|
101
|
+
it "doesn't overwrite first data entry" do
|
102
|
+
@burndown_data.story_points.open = 16
|
103
|
+
@burndown_data.story_points.done = 7
|
104
|
+
@burndown_data.tasks.open = 10
|
105
|
+
@burndown_data.tasks.done = 11
|
106
|
+
@burndown_data.date_time = DateTime.parse("2014-05-30")
|
107
|
+
|
108
|
+
@chart.add_data(@burndown_data)
|
109
|
+
|
110
|
+
@burndown_data.story_points.open = 15
|
111
|
+
@burndown_data.story_points.done = 8
|
112
|
+
@burndown_data.tasks.open = 9
|
113
|
+
@burndown_data.tasks.done = 12
|
114
|
+
@burndown_data.date_time = DateTime.parse("2014-05-30")
|
115
|
+
|
116
|
+
@chart.add_data(@burndown_data)
|
117
|
+
|
118
|
+
expect( @chart.data["days"].first["story_points"] ).to eq(
|
119
|
+
{
|
120
|
+
"total" => 23,
|
121
|
+
"open" => 16
|
122
|
+
} )
|
123
|
+
expect( @chart.data["days"].first["tasks"] ).to eq(
|
124
|
+
{
|
125
|
+
"total" => 21,
|
126
|
+
"open" => 10
|
127
|
+
} )
|
128
|
+
end
|
129
|
+
|
130
|
+
it "does overwrite data entries after first one" do
|
131
|
+
@burndown_data.story_points.open = 16
|
132
|
+
@burndown_data.story_points.done = 7
|
133
|
+
@burndown_data.tasks.open = 10
|
134
|
+
@burndown_data.tasks.done = 11
|
135
|
+
@burndown_data.date_time = DateTime.parse("2014-05-30")
|
136
|
+
|
137
|
+
@chart.add_data(@burndown_data)
|
138
|
+
|
139
|
+
@burndown_data.story_points.open = 16
|
140
|
+
@burndown_data.story_points.done = 7
|
141
|
+
@burndown_data.tasks.open = 10
|
142
|
+
@burndown_data.tasks.done = 11
|
143
|
+
@burndown_data.date_time = DateTime.parse("2014-05-31")
|
144
|
+
|
145
|
+
@chart.add_data(@burndown_data)
|
146
|
+
|
147
|
+
@burndown_data.story_points.open = 15
|
148
|
+
@burndown_data.story_points.done = 8
|
149
|
+
@burndown_data.tasks.open = 9
|
150
|
+
@burndown_data.tasks.done = 12
|
151
|
+
@burndown_data.date_time = DateTime.parse("2014-05-31")
|
152
|
+
|
153
|
+
@chart.add_data(@burndown_data)
|
154
|
+
|
155
|
+
expect( @chart.data["days"][1]["story_points"] ).to eq(
|
156
|
+
{
|
157
|
+
"total" => 23,
|
158
|
+
"open" => 15
|
159
|
+
} )
|
160
|
+
expect( @chart.data["days"][1]["tasks"] ).to eq(
|
161
|
+
{
|
162
|
+
"total" => 21,
|
163
|
+
"open" => 9
|
164
|
+
} )
|
165
|
+
end
|
166
|
+
|
167
|
+
it "adds data" do
|
168
|
+
@chart.data["days"] = @raw_data
|
169
|
+
|
170
|
+
@burndown_data.story_points.open = 16
|
171
|
+
@burndown_data.story_points.done = 7
|
172
|
+
@burndown_data.tasks.open = 10
|
173
|
+
@burndown_data.tasks.done = 11
|
174
|
+
@burndown_data.extra_story_points.open = 2
|
175
|
+
@burndown_data.extra_story_points.done = 3
|
176
|
+
@burndown_data.extra_tasks.open = 5
|
177
|
+
@burndown_data.extra_tasks.done = 2
|
178
|
+
@burndown_data.date_time = DateTime.parse("2014-05-30")
|
179
|
+
|
180
|
+
@chart.add_data(@burndown_data)
|
181
|
+
|
182
|
+
expect( @chart.data["days"].count ).to eq 3
|
183
|
+
expect( @chart.data["days"].last["date"] ).to eq ( "2014-05-30" )
|
184
|
+
expect( @chart.data["days"].last["story_points"] ).to eq ( {
|
77
185
|
"total" => 23,
|
78
186
|
"open" => 16
|
79
187
|
} )
|
80
|
-
|
81
|
-
{
|
188
|
+
expect( @chart.data["days"].last["tasks"] ).to eq ( {
|
82
189
|
"total" => 21,
|
83
190
|
"open" => 10
|
84
191
|
} )
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
@chart.data["days"] = @raw_data
|
93
|
-
|
94
|
-
@burndown_data.story_points.open = 16
|
95
|
-
@burndown_data.story_points.done = 7
|
96
|
-
@burndown_data.tasks.open = 10
|
97
|
-
@burndown_data.tasks.done = 11
|
98
|
-
@burndown_data.extra_story_points.open = 2
|
99
|
-
@burndown_data.extra_story_points.done = 3
|
100
|
-
@burndown_data.extra_tasks.open = 5
|
101
|
-
@burndown_data.extra_tasks.done = 2
|
102
|
-
@burndown_data.date_time = DateTime.parse("2014-05-30")
|
103
|
-
|
104
|
-
@chart.add_data(@burndown_data)
|
105
|
-
|
106
|
-
expect( @chart.data["days"].count ).to eq 3
|
107
|
-
expect( @chart.data["days"].last["date"] ).to eq ( "2014-05-30" )
|
108
|
-
expect( @chart.data["days"].last["story_points"] ).to eq ( {
|
109
|
-
"total" => 23,
|
110
|
-
"open" => 16
|
111
|
-
} )
|
112
|
-
expect( @chart.data["days"].last["tasks"] ).to eq ( {
|
113
|
-
"total" => 21,
|
114
|
-
"open" => 10
|
115
|
-
} )
|
116
|
-
expect( @chart.data["days"].last["story_points_extra"] ).to eq ( {
|
117
|
-
"done" => 3
|
118
|
-
} )
|
119
|
-
expect( @chart.data["days"].last["tasks_extra"] ).to eq ( {
|
120
|
-
"done" => 2
|
121
|
-
} )
|
122
|
-
end
|
192
|
+
expect( @chart.data["days"].last["story_points_extra"] ).to eq ( {
|
193
|
+
"done" => 3
|
194
|
+
} )
|
195
|
+
expect( @chart.data["days"].last["tasks_extra"] ).to eq ( {
|
196
|
+
"done" => 2
|
197
|
+
} )
|
198
|
+
end
|
123
199
|
|
124
|
-
|
125
|
-
|
200
|
+
it "replaces data of same day" do
|
201
|
+
@chart.data["days"] = @raw_data
|
126
202
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
203
|
+
@burndown_data.story_points.open = 16
|
204
|
+
@burndown_data.story_points.done = 7
|
205
|
+
@burndown_data.tasks.open = 10
|
206
|
+
@burndown_data.tasks.done = 11
|
207
|
+
@burndown_data.date_time = DateTime.parse("2014-05-30")
|
132
208
|
|
133
|
-
|
209
|
+
@chart.add_data(@burndown_data)
|
134
210
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
211
|
+
expect( @chart.data["days"].count ).to eq 3
|
212
|
+
expect( @chart.data["days"].last["story_points"] ).to eq ( {
|
213
|
+
"total" => 23,
|
214
|
+
"open" => 16
|
215
|
+
} )
|
140
216
|
|
141
|
-
|
142
|
-
|
217
|
+
@burndown_data.story_points.done = 8
|
218
|
+
@chart.add_data(@burndown_data)
|
143
219
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
220
|
+
expect( @chart.data["days"].count ).to eq 3
|
221
|
+
expect( @chart.data["days"].last["story_points"] ).to eq ( {
|
222
|
+
"total" => 24,
|
223
|
+
"open" => 16
|
224
|
+
} )
|
225
|
+
end
|
149
226
|
end
|
150
227
|
|
151
228
|
describe "#read_data" do
|
@@ -235,7 +312,6 @@ EOT
|
|
235
312
|
expect(File.read(write_path)).to eq expected_file_content
|
236
313
|
end
|
237
314
|
end
|
238
|
-
|
239
315
|
end
|
240
316
|
|
241
317
|
describe "commands" do
|
@@ -264,14 +340,36 @@ EOT
|
|
264
340
|
|
265
341
|
describe "load_last_sprint" do
|
266
342
|
let(:path) { given_directory_from_data("burndown_dir") }
|
267
|
-
|
343
|
+
|
344
|
+
it "loads the burndown from the 2nd sprint into data" do
|
268
345
|
@chart.load_last_sprint(path)
|
269
|
-
expect(@chart.data).to eq(
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
346
|
+
expect(@chart.data).to eq(
|
347
|
+
{ "meta" =>
|
348
|
+
{ "board_id" => "53186e8391ef8671265eba9d",
|
349
|
+
"sprint" => 2,
|
350
|
+
"total_days" => 9,
|
351
|
+
"weekend_lines" => [3.5, 7.5]
|
352
|
+
},
|
353
|
+
"days" => [
|
354
|
+
{ "date" => "2015-08-28",
|
355
|
+
"updated_at" => "2015-08-28T11:04:52+02:00",
|
356
|
+
"story_points" =>
|
357
|
+
{ "total"=>24.0,
|
358
|
+
"open"=>24.0
|
359
|
+
},
|
360
|
+
"tasks" =>
|
361
|
+
{ "total" => 43,
|
362
|
+
"open" => 28
|
363
|
+
},
|
364
|
+
"story_points_extra" =>
|
365
|
+
{ "done"=>2.0
|
366
|
+
},
|
367
|
+
"tasks_extra" =>
|
368
|
+
{ "done" => 5
|
369
|
+
}
|
370
|
+
}
|
371
|
+
]
|
372
|
+
})
|
275
373
|
end
|
276
374
|
|
277
375
|
it "returns the path of the last sprint" do
|
@@ -334,7 +432,6 @@ EOT
|
|
334
432
|
end
|
335
433
|
|
336
434
|
describe "reads meta data from the board" do
|
337
|
-
|
338
435
|
use_given_filesystem
|
339
436
|
|
340
437
|
it "merges meta data from board if present" do
|
@@ -354,26 +451,21 @@ EOT
|
|
354
451
|
end
|
355
452
|
|
356
453
|
describe '.plot' do
|
357
|
-
|
358
454
|
it 'sends joined parsed options to python script' do
|
359
455
|
allow(described_class).to receive(:process_options).and_return(%w{ --test 1 --no-blah })
|
360
456
|
allow(described_class).to receive(:plot_helper).and_return('mescript')
|
361
457
|
expect(described_class).to receive(:system).with('python mescript 42 --test 1 --no-blah')
|
362
458
|
described_class.plot(42, {foo: 1, bar: 2})
|
363
459
|
end
|
364
|
-
|
365
460
|
end
|
366
461
|
|
367
462
|
describe '.plot_helper' do
|
368
|
-
|
369
463
|
it 'expands path to burndown generator' do
|
370
464
|
expect(described_class.plot_helper).to include('scripts/create_burndown.py')
|
371
465
|
end
|
372
|
-
|
373
466
|
end
|
374
467
|
|
375
468
|
describe '.process_options' do
|
376
|
-
|
377
469
|
it 'builds an array of switches for burndown chart based on input hash' do
|
378
470
|
test_hash = { 'no-tasks' => true }
|
379
471
|
expect(described_class.send(:process_options, test_hash)).to eq %w{ --no-tasks }
|
@@ -391,6 +483,5 @@ EOT
|
|
391
483
|
}
|
392
484
|
expect(described_class.send(:process_options, test_hash)).to eq ['--no-tasks', '--with-fast-lane', '--output fanagoro', '--verbose']
|
393
485
|
end
|
394
|
-
|
395
486
|
end
|
396
487
|
end
|
@@ -3,7 +3,6 @@ require_relative 'spec_helper'
|
|
3
3
|
include GivenFilesystemSpecHelpers
|
4
4
|
|
5
5
|
describe BurndownData do
|
6
|
-
|
7
6
|
before(:each) do
|
8
7
|
@burndown = BurndownData.new(dummy_settings)
|
9
8
|
@burndown.board_id = "53186e8391ef8671265eba9d"
|
@@ -15,7 +14,7 @@ describe BurndownData do
|
|
15
14
|
r = described_class.new
|
16
15
|
r.open = 7
|
17
16
|
r.done = 4
|
18
|
-
|
17
|
+
|
19
18
|
expect(r.total).to eq 11
|
20
19
|
end
|
21
20
|
end
|
@@ -25,7 +24,7 @@ describe BurndownData do
|
|
25
24
|
@burndown.story_points.open = 13
|
26
25
|
expect(@burndown.story_points.open).to eq 13
|
27
26
|
end
|
28
|
-
|
27
|
+
|
29
28
|
it "sets open tasks" do
|
30
29
|
@burndown.tasks.open = 42
|
31
30
|
expect(@burndown.tasks.open).to eq 42
|
@@ -33,53 +32,76 @@ describe BurndownData do
|
|
33
32
|
end
|
34
33
|
|
35
34
|
describe "#fetch" do
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
35
|
+
context "with meta data on sprint card" do
|
36
|
+
before do
|
37
|
+
@burndown.fetch
|
38
|
+
end
|
39
|
+
|
40
|
+
it "returns story points" do
|
41
|
+
expect( @burndown.story_points.total ).to eq 16
|
42
|
+
expect( @burndown.story_points.open ).to eq 13
|
43
|
+
expect( @burndown.story_points.done ).to eq 3
|
44
|
+
end
|
45
|
+
|
46
|
+
it "returns extra story points" do
|
47
|
+
expect( @burndown.extra_story_points.total ).to eq 8
|
48
|
+
expect( @burndown.extra_story_points.open ).to eq 8
|
49
|
+
expect( @burndown.extra_story_points.done ).to eq 0
|
50
|
+
end
|
51
|
+
|
52
|
+
it "returns unplanned story points" do
|
53
|
+
expect( @burndown.unplanned_story_points.total ).to eq 3
|
54
|
+
expect( @burndown.unplanned_story_points.open ).to eq 1
|
55
|
+
expect( @burndown.unplanned_story_points.done ).to eq 2
|
56
|
+
end
|
57
|
+
|
58
|
+
it "returns tasks" do
|
59
|
+
expect( @burndown.tasks.total ).to eq 13
|
60
|
+
expect( @burndown.tasks.open ).to eq 9
|
61
|
+
expect( @burndown.tasks.done ).to eq 4
|
62
|
+
end
|
63
|
+
|
64
|
+
it "returns extra tasks" do
|
65
|
+
expect( @burndown.extra_tasks.total ).to eq 1
|
66
|
+
expect( @burndown.extra_tasks.open ).to eq 1
|
67
|
+
expect( @burndown.extra_tasks.done ).to eq 0
|
68
|
+
end
|
69
|
+
|
70
|
+
it "returns unplanned tasks" do
|
71
|
+
expect( @burndown.unplanned_tasks.total ).to eq 2
|
72
|
+
expect( @burndown.unplanned_tasks.open ).to eq 1
|
73
|
+
expect( @burndown.unplanned_tasks.done ).to eq 1
|
74
|
+
end
|
75
|
+
|
76
|
+
it "returns meta data" do
|
77
|
+
expect( @burndown.meta ).to eq({
|
78
|
+
"sprint" => 10,
|
79
|
+
"total_days" => 18,
|
80
|
+
"weekend_lines" => [1.5, 6.5, 11.5, 16.5]
|
81
|
+
})
|
82
|
+
end
|
83
|
+
|
84
|
+
it "saves date and time" do
|
85
|
+
expected_date_time = DateTime.parse("2015-01-12T13:57:16+01:00")
|
86
|
+
allow(DateTime).to receive(:now).and_return(expected_date_time)
|
87
|
+
@burndown.fetch
|
88
|
+
expect(@burndown.date_time).to eq(expected_date_time)
|
89
|
+
end
|
63
90
|
end
|
64
91
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
})
|
71
|
-
end
|
92
|
+
context "without meta data on sprint card" do
|
93
|
+
before do
|
94
|
+
allow(Card).to receive(:parse_yaml_from_description).and_return(nil)
|
95
|
+
@burndown.fetch
|
96
|
+
end
|
72
97
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
@burndown.fetch
|
77
|
-
expect(@burndown.date_time).to eq(expected_date_time)
|
98
|
+
it "does not fail" do
|
99
|
+
expect(@burndown.meta).to be(nil)
|
100
|
+
end
|
78
101
|
end
|
79
102
|
end
|
80
103
|
|
81
104
|
describe '#to_hash' do
|
82
|
-
|
83
105
|
it 'converts to hash' do
|
84
106
|
@burndown.story_points.open = 1
|
85
107
|
@burndown.story_points.done = 2
|
@@ -89,6 +111,10 @@ describe BurndownData do
|
|
89
111
|
@burndown.extra_story_points.done = 6
|
90
112
|
@burndown.extra_tasks.open = 7
|
91
113
|
@burndown.extra_tasks.done = 8
|
114
|
+
@burndown.unplanned_story_points.open = 1
|
115
|
+
@burndown.unplanned_story_points.done = 2
|
116
|
+
@burndown.unplanned_tasks.open = 1
|
117
|
+
@burndown.unplanned_tasks.done = 1
|
92
118
|
@burndown.date_time = DateTime.parse('20150115')
|
93
119
|
|
94
120
|
expected_hash = {
|
@@ -107,12 +133,18 @@ describe BurndownData do
|
|
107
133
|
},
|
108
134
|
'tasks_extra' => {
|
109
135
|
'done' => 8
|
136
|
+
},
|
137
|
+
'unplanned_story_points' => {
|
138
|
+
'total' => 3,
|
139
|
+
'open' => 1
|
140
|
+
},
|
141
|
+
'unplanned_tasks' => {
|
142
|
+
'total' => 2,
|
143
|
+
'open' => 1
|
110
144
|
}
|
111
145
|
}
|
112
146
|
|
113
147
|
expect(@burndown.to_hash).to eq(expected_hash)
|
114
148
|
end
|
115
|
-
|
116
149
|
end
|
117
|
-
|
118
150
|
end
|
data/spec/unit/card_spec.rb
CHANGED
@@ -76,4 +76,79 @@ EOT
|
|
76
76
|
expect(meta["weekend_lines"]).to eq([1.5, 6.5])
|
77
77
|
end
|
78
78
|
end
|
79
|
+
|
80
|
+
describe "gets raw JSON" do
|
81
|
+
it "for cards" do
|
82
|
+
@settings = dummy_settings
|
83
|
+
full_board_mock
|
84
|
+
|
85
|
+
trello = TrelloWrapper.new(@settings)
|
86
|
+
board = trello.board("53186e8391ef8671265eba9d")
|
87
|
+
|
88
|
+
expected_json = <<EOT
|
89
|
+
{
|
90
|
+
"id": "5319bf244cc53afd5afd991f",
|
91
|
+
"checkItemStates": [
|
92
|
+
|
93
|
+
],
|
94
|
+
"closed": false,
|
95
|
+
"dateLastActivity": "2014-03-07T12:52:07.236Z",
|
96
|
+
"desc": "",
|
97
|
+
"descData": null,
|
98
|
+
"idBoard": "53186e8391ef8671265eba9d",
|
99
|
+
"idList": "53186e8391ef8671265eba9e",
|
100
|
+
"idMembersVoted": [
|
101
|
+
|
102
|
+
],
|
103
|
+
"idShort": 3,
|
104
|
+
"idAttachmentCover": null,
|
105
|
+
"manualCoverAttachment": false,
|
106
|
+
"idLabels": [
|
107
|
+
"5463b41e74d650d56700f16a"
|
108
|
+
],
|
109
|
+
"name": "Sprint 3",
|
110
|
+
"pos": 65535,
|
111
|
+
"shortLink": "GRsvY3vZ",
|
112
|
+
"badges": {
|
113
|
+
"votes": 0,
|
114
|
+
"viewingMemberVoted": false,
|
115
|
+
"subscribed": false,
|
116
|
+
"fogbugz": "",
|
117
|
+
"checkItems": 0,
|
118
|
+
"checkItemsChecked": 0,
|
119
|
+
"comments": 0,
|
120
|
+
"attachments": 0,
|
121
|
+
"description": false,
|
122
|
+
"due": null
|
123
|
+
},
|
124
|
+
"due": null,
|
125
|
+
"email": "trello@example.com",
|
126
|
+
"idChecklists": [
|
127
|
+
|
128
|
+
],
|
129
|
+
"idMembers": [
|
130
|
+
|
131
|
+
],
|
132
|
+
"labels": [
|
133
|
+
{
|
134
|
+
"id": "5463b41e74d650d56700f16a",
|
135
|
+
"idBoard": "53186e8391ef8671265eba9d",
|
136
|
+
"name": "Sticky",
|
137
|
+
"color": "blue",
|
138
|
+
"uses": 8
|
139
|
+
}
|
140
|
+
],
|
141
|
+
"shortUrl": "https://trello.com/c/GRsvY3vZ",
|
142
|
+
"subscribed": false,
|
143
|
+
"url": "https://trello.com/c/GRsvY3vZ/3-sprint-3",
|
144
|
+
"checklists": [
|
145
|
+
|
146
|
+
]
|
147
|
+
}
|
148
|
+
EOT
|
149
|
+
|
150
|
+
json = board.cards.first.as_json
|
151
|
+
expect(json).to eq(expected_json.chomp)
|
152
|
+
end
|
153
|
+
end
|
79
154
|
end
|
data/spec/unit/cli_spec.rb
CHANGED
@@ -3,22 +3,13 @@ require_relative 'spec_helper'
|
|
3
3
|
include GivenFilesystemSpecHelpers
|
4
4
|
|
5
5
|
describe Cli do
|
6
|
-
|
7
6
|
use_given_filesystem
|
8
7
|
|
9
8
|
before(:each) do
|
10
9
|
Cli.settings = dummy_settings
|
11
10
|
@cli = Cli.new
|
12
|
-
|
13
|
-
allow(STDOUT).to receive(:puts)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "fetches burndown data" do
|
17
|
-
expect_any_instance_of(BurndownData).to receive(:fetch)
|
18
|
-
|
19
|
-
@cli.fetch_burndown_data
|
20
11
|
end
|
21
|
-
|
12
|
+
|
22
13
|
it "fetches burndown data from board-list" do
|
23
14
|
full_board_mock
|
24
15
|
dir = given_directory
|
@@ -35,4 +26,74 @@ describe Cli do
|
|
35
26
|
@cli.backup
|
36
27
|
end
|
37
28
|
|
29
|
+
it "gets lists" do
|
30
|
+
full_board_mock
|
31
|
+
@cli.options = {"board-id" => "53186e8391ef8671265eba9d"}
|
32
|
+
expected_output = <<EOT
|
33
|
+
Sprint Backlog
|
34
|
+
Doing
|
35
|
+
Done Sprint 10
|
36
|
+
Done Sprint 9
|
37
|
+
Done Sprint 8
|
38
|
+
Legend
|
39
|
+
EOT
|
40
|
+
expect {
|
41
|
+
@cli.get_lists
|
42
|
+
}.to output(expected_output).to_stdout
|
43
|
+
end
|
44
|
+
|
45
|
+
it "gets cards" do
|
46
|
+
full_board_mock
|
47
|
+
@cli.options = {"board-id" => "53186e8391ef8671265eba9d"}
|
48
|
+
expected_output = <<EOT
|
49
|
+
Sprint 3
|
50
|
+
(3) P1: Fill Backlog column
|
51
|
+
(5) P4: Read data from Trollolo
|
52
|
+
(3) P5: Save read data as reference data
|
53
|
+
Waterline
|
54
|
+
(8) P6: Celebrate testing board
|
55
|
+
(2) P2: Fill Doing column
|
56
|
+
(1) Fix emergency
|
57
|
+
Burndown chart
|
58
|
+
Sprint 10
|
59
|
+
(3) P3: Fill Done columns
|
60
|
+
(2) Some unplanned work
|
61
|
+
Burndown chart
|
62
|
+
Sprint 9
|
63
|
+
(2) P1: Explain purpose
|
64
|
+
(2) P2: Create Scrum columns
|
65
|
+
Burndown chart
|
66
|
+
Sprint 8
|
67
|
+
(1) P1: Create Trello Testing Board
|
68
|
+
(5) P2: Add fancy background
|
69
|
+
(1) P4: Add legend
|
70
|
+
Purpose
|
71
|
+
Background image
|
72
|
+
EOT
|
73
|
+
expect {
|
74
|
+
@cli.get_cards
|
75
|
+
}.to output(expected_output).to_stdout
|
76
|
+
end
|
77
|
+
|
78
|
+
it "gets checklists" do
|
79
|
+
full_board_mock
|
80
|
+
@cli.options = {"board-id" => "53186e8391ef8671265eba9d"}
|
81
|
+
expected_output = <<EOT
|
82
|
+
Tasks
|
83
|
+
Tasks
|
84
|
+
Tasks
|
85
|
+
Tasks
|
86
|
+
Tasks
|
87
|
+
Feedback
|
88
|
+
Tasks
|
89
|
+
Tasks
|
90
|
+
Tasks
|
91
|
+
Tasks
|
92
|
+
Tasks
|
93
|
+
Tasks
|
94
|
+
EOT
|
95
|
+
expect {
|
96
|
+
@cli.get_checklists
|
97
|
+
}.to output(expected_output).to_stdout
|
98
|
+
end
|
38
99
|
end
|