trollolo 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +21 -2
- data/.rubocop_todo.yml +105 -270
- data/CHANGELOG.md +10 -0
- data/CONTRIBUTING.md +6 -4
- data/Gemfile +1 -1
- data/README.md +10 -1
- data/Rakefile +4 -4
- data/bin/trollolo +2 -2
- data/lib/backup.rb +21 -23
- data/lib/burndown_chart.rb +46 -49
- data/lib/burndown_data.rb +21 -21
- data/lib/card.rb +23 -32
- data/lib/checklist.rb +13 -1
- data/lib/cli.rb +105 -110
- data/lib/column.rb +11 -10
- data/lib/empty_column.rb +2 -2
- data/lib/scrum/backlog_mover.rb +3 -3
- data/lib/scrum/card_type_detection.rb +1 -1
- data/lib/scrum/creator.rb +7 -7
- data/lib/scrum/prioritizer.rb +1 -1
- data/lib/scrum/sprint_board.rb +4 -4
- data/lib/scrum/sprint_cleaner.rb +3 -3
- data/lib/scrum/sprint_planning_board.rb +2 -4
- data/lib/scrum_board.rb +3 -3
- data/lib/settings.rb +29 -27
- data/lib/trello_service.rb +1 -1
- data/lib/trello_wrapper.rb +9 -9
- data/lib/version.rb +1 -1
- data/spec/data/card.json +19 -0
- data/spec/data/trollolorc +3 -0
- data/spec/integration/command_line_spec.rb +14 -14
- data/spec/integration/create_burndown_spec.rb +25 -25
- data/spec/integration/integration_spec_helper.rb +1 -1
- data/spec/integration/wrapper/credentials_input_wrapper +7 -11
- data/spec/integration/wrapper/empty_config_trollolo_wrapper +2 -2
- data/spec/integration/wrapper/trollolo_wrapper +2 -2
- data/spec/unit/backup_spec.rb +14 -14
- data/spec/unit/burndown_chart_spec.rb +176 -184
- data/spec/unit/burndown_data_spec.rb +21 -23
- data/spec/unit/card_spec.rb +38 -24
- data/spec/unit/cli_spec.rb +57 -57
- data/spec/unit/empty_column_spec.rb +1 -1
- data/spec/unit/retrieve_data_spec.rb +13 -13
- data/spec/unit/scrum/backlog_mover_spec.rb +8 -8
- data/spec/unit/scrum/card_type_detection_spec.rb +12 -12
- data/spec/unit/scrum/creator_spec.rb +8 -8
- data/spec/unit/scrum/prioritizer_spec.rb +19 -19
- data/spec/unit/scrum/priority_name_spec.rb +16 -16
- data/spec/unit/scrum/sprint_board_spec.rb +3 -3
- data/spec/unit/scrum/sprint_cleaner_spec.rb +15 -15
- data/spec/unit/scrum/sprint_planning_board_spec.rb +2 -2
- data/spec/unit/scrum_board_spec.rb +56 -56
- data/spec/unit/settings_spec.rb +23 -23
- data/spec/unit/spec_helper.rb +3 -3
- data/spec/unit/support/test_data_operations.rb +4 -0
- data/spec/unit/support/update_webmock_data +9 -11
- data/spec/unit/support/vcr.rb +3 -3
- data/spec/unit/support/webmocks.rb +21 -12
- data/spec/unit/trello_wrapper_spec.rb +40 -29
- data/trollolo.gemspec +3 -3
- metadata +8 -5
@@ -1,18 +1,18 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative 'integration_spec_helper'
|
2
2
|
|
3
3
|
include GivenFilesystemSpecHelpers
|
4
4
|
include CliTester
|
5
5
|
|
6
6
|
def run_helper(working_dir, sprint_number, extra_args = [])
|
7
|
-
helper_dir = File.expand_path(
|
8
|
-
args = [
|
9
|
-
args += [
|
10
|
-
args += [
|
11
|
-
args += [
|
12
|
-
args += [
|
13
|
-
args += [
|
7
|
+
helper_dir = File.expand_path('../../../scripts', __FILE__)
|
8
|
+
args = ['run']
|
9
|
+
args += ['-v', "#{helper_dir}:/trollolo/helper"]
|
10
|
+
args += ['-v', "#{working_dir}:/trollolo/data"]
|
11
|
+
args += ['-w', '/trollolo/data']
|
12
|
+
args += ['trollolo-matplotlib']
|
13
|
+
args += ['/trollolo/helper/create_burndown.py', sprint_number]
|
14
14
|
args += extra_args
|
15
|
-
run_command(cmd:
|
15
|
+
run_command(cmd: 'docker', args: args)
|
16
16
|
end
|
17
17
|
|
18
18
|
def compare_images_for_sprint(sprint_number, extra_args = [])
|
@@ -21,12 +21,12 @@ def compare_images_for_sprint(sprint_number, extra_args = [])
|
|
21
21
|
end
|
22
22
|
|
23
23
|
result = run_helper(@working_dir, sprint_number, extra_args)
|
24
|
-
expect(result).to exit_with_success(
|
24
|
+
expect(result).to exit_with_success('')
|
25
25
|
expect(File.join(@working_dir, "burndown-#{sprint_number}.png")).
|
26
26
|
to be_same_image_as("create_burndown_helper/burndown-#{sprint_number}.png")
|
27
27
|
end
|
28
28
|
|
29
|
-
describe
|
29
|
+
describe 'create_burndown.py' do
|
30
30
|
use_given_filesystem(keep_files: true)
|
31
31
|
|
32
32
|
before(:all) do
|
@@ -35,31 +35,31 @@ describe "create_burndown.py" do
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
it
|
39
|
-
compare_images_for_sprint(
|
38
|
+
it 'creates burndown chart with varying number of total story points and tasks' do
|
39
|
+
compare_images_for_sprint('23')
|
40
40
|
end
|
41
41
|
|
42
|
-
it
|
43
|
-
compare_images_for_sprint(
|
42
|
+
it 'creates burndown chart with done tasks at the beginning' do
|
43
|
+
compare_images_for_sprint('31')
|
44
44
|
end
|
45
45
|
|
46
|
-
it
|
47
|
-
compare_images_for_sprint(
|
46
|
+
it 'creates burndown chart of unfinished sprint' do
|
47
|
+
compare_images_for_sprint('35')
|
48
48
|
end
|
49
49
|
|
50
|
-
it
|
51
|
-
compare_images_for_sprint(
|
50
|
+
it 'creates burndown chart with fast lane and no tasks' do
|
51
|
+
compare_images_for_sprint('08', ['--no-tasks', '--with-fast-lane'])
|
52
52
|
end
|
53
53
|
|
54
|
-
it
|
55
|
-
compare_images_for_sprint(
|
54
|
+
it 'creates perfect burndown chart' do
|
55
|
+
compare_images_for_sprint('42')
|
56
56
|
end
|
57
57
|
|
58
|
-
it
|
59
|
-
compare_images_for_sprint(
|
58
|
+
it 'creates burndown chart with unplanned cards' do
|
59
|
+
compare_images_for_sprint('56')
|
60
60
|
end
|
61
61
|
|
62
|
-
it
|
63
|
-
compare_images_for_sprint(
|
62
|
+
it 'creates burndown chart with unplanned tasks on day one' do
|
63
|
+
compare_images_for_sprint('01')
|
64
64
|
end
|
65
65
|
end
|
@@ -2,7 +2,7 @@ require_relative '../../lib/trollolo'
|
|
2
2
|
require 'given_filesystem/spec_helpers'
|
3
3
|
require 'cli_tester'
|
4
4
|
|
5
|
-
bin_path = File.expand_path(
|
5
|
+
bin_path = File.expand_path( '../../../bin/', __FILE__ )
|
6
6
|
|
7
7
|
if ENV['PATH'] !~ /#{bin_path}/
|
8
8
|
ENV['PATH'] = bin_path + File::PATH_SEPARATOR + ENV['PATH']
|
@@ -1,19 +1,15 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'expect'
|
4
|
+
require 'pty'
|
5
5
|
|
6
6
|
config_path = "/tmp/test-trollolorc-#{rand(100000)}"
|
7
7
|
bin_path = File.expand_path('../../../../bin/trollolo', __FILE__)
|
8
8
|
|
9
|
-
ENV[
|
9
|
+
ENV['TROLLOLO_CONFIG_PATH'] = config_path
|
10
10
|
|
11
|
-
PTY.spawn("#{bin_path} #{ARGV.join(
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
trollolo_in.puts("xxx")
|
16
|
-
if !trollolo_out.expect("token:", 2)
|
17
|
-
exit 1
|
18
|
-
end
|
11
|
+
PTY.spawn("#{bin_path} #{ARGV.join(' ')}") do |trollolo_out, trollolo_in, pid|
|
12
|
+
exit 1 unless trollolo_out.expect('key:', 2)
|
13
|
+
trollolo_in.puts('xxx')
|
14
|
+
exit 1 unless trollolo_out.expect('token:', 2)
|
19
15
|
end
|
@@ -3,8 +3,8 @@
|
|
3
3
|
config_path = "/tmp/test-trollolorc-#{rand(100000)}"
|
4
4
|
bin_path = File.expand_path('../../../../bin/trollolo', __FILE__)
|
5
5
|
|
6
|
-
ENV[
|
6
|
+
ENV['TROLLOLO_CONFIG_PATH'] = config_path
|
7
7
|
|
8
|
-
cmd = "#{bin_path} #{ARGV.join(
|
8
|
+
cmd = "#{bin_path} #{ARGV.join(' ')}"
|
9
9
|
|
10
10
|
exec(cmd)
|
@@ -3,8 +3,8 @@
|
|
3
3
|
test_config_path = File.expand_path('../../../data/trollolorc', __FILE__)
|
4
4
|
bin_path = File.expand_path('../../../../bin/trollolo', __FILE__)
|
5
5
|
|
6
|
-
ENV[
|
6
|
+
ENV['TROLLOLO_CONFIG_PATH'] = test_config_path
|
7
7
|
|
8
|
-
cmd = "#{bin_path} #{ARGV.join(
|
8
|
+
cmd = "#{bin_path} #{ARGV.join(' ')}"
|
9
9
|
|
10
10
|
exec(cmd)
|
data/spec/unit/backup_spec.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative 'spec_helper'
|
2
2
|
|
3
3
|
include GivenFilesystemSpecHelpers
|
4
4
|
|
5
5
|
describe Backup do
|
6
|
-
it
|
6
|
+
it 'sets backup directory' do
|
7
7
|
backup = Backup.new(dummy_settings)
|
8
|
-
expect(backup.directory).to match File.expand_path(
|
8
|
+
expect(backup.directory).to match File.expand_path('~/.trollolo/backup')
|
9
9
|
end
|
10
10
|
|
11
|
-
context
|
11
|
+
context 'custom backup directory' do
|
12
12
|
use_given_filesystem(keep_files: true)
|
13
13
|
|
14
14
|
before(:each) do
|
@@ -18,22 +18,22 @@ describe Backup do
|
|
18
18
|
@backup.directory = @directory
|
19
19
|
end
|
20
20
|
|
21
|
-
it
|
22
|
-
@backup.backup(
|
23
|
-
backup_file = File.join(@directory,
|
21
|
+
it 'backups board' do
|
22
|
+
@backup.backup('53186e8391ef8671265eba9d')
|
23
|
+
backup_file = File.join(@directory, '53186e8391ef8671265eba9d', 'board.json')
|
24
24
|
expect(File.exist?(backup_file)).to be true
|
25
|
-
expect(File.read(backup_file)).to eq load_test_file(
|
25
|
+
expect(File.read(backup_file)).to eq load_test_file('full-board.json').chomp
|
26
26
|
end
|
27
27
|
|
28
|
-
it
|
29
|
-
@backup.backup(
|
30
|
-
expect(@backup.list).to eq [
|
28
|
+
it 'lists backups' do
|
29
|
+
@backup.backup('53186e8391ef8671265eba9d')
|
30
|
+
expect(@backup.list).to eq ['53186e8391ef8671265eba9d']
|
31
31
|
end
|
32
32
|
|
33
|
-
it
|
33
|
+
it 'shows backup' do
|
34
34
|
output_capturer = StringIO.new
|
35
|
-
@backup.backup(
|
36
|
-
@backup.show(
|
35
|
+
@backup.backup('53186e8391ef8671265eba9d')
|
36
|
+
@backup.show('53186e8391ef8671265eba9d', output: output_capturer )
|
37
37
|
expect(output_capturer.string).to eq(<<EOT
|
38
38
|
Trollolo Testing Board
|
39
39
|
Sprint Backlog
|
@@ -24,92 +24,88 @@ describe BurndownChart do
|
|
24
24
|
full_board_mock
|
25
25
|
end
|
26
26
|
|
27
|
-
describe
|
28
|
-
it
|
29
|
-
expect(@chart.data[
|
30
|
-
expect(@chart.data[
|
31
|
-
expect(@chart.data[
|
27
|
+
describe 'initializer' do
|
28
|
+
it 'sets initial meta data' do
|
29
|
+
expect(@chart.data['meta']['sprint']).to eq 1
|
30
|
+
expect(@chart.data['meta']['total_days']).to eq 10
|
31
|
+
expect(@chart.data['meta']['weekend_lines']).to eq [3.5, 8.5]
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
describe
|
35
|
+
describe 'data' do
|
36
36
|
use_given_filesystem
|
37
37
|
|
38
38
|
before(:each) do
|
39
39
|
@raw_data = [
|
40
40
|
{
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
'date' => '2014-04-23',
|
42
|
+
'updated_at' => '2014-04-23T10:00:00+01:00',
|
43
|
+
'story_points' =>
|
44
44
|
{
|
45
|
-
|
46
|
-
|
45
|
+
'total' => 30,
|
46
|
+
'open' => 23
|
47
47
|
},
|
48
|
-
|
48
|
+
'tasks' =>
|
49
49
|
{
|
50
|
-
|
51
|
-
|
50
|
+
'total' => 25,
|
51
|
+
'open' => 21
|
52
52
|
}
|
53
53
|
},
|
54
54
|
{
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
'date' => '2014-04-24',
|
56
|
+
'updated_at' => '2014-04-24T19:00:00+01:00',
|
57
|
+
'story_points' =>
|
58
58
|
{
|
59
|
-
|
60
|
-
|
59
|
+
'total' => 30,
|
60
|
+
'open' => 21
|
61
61
|
},
|
62
|
-
|
62
|
+
'tasks' =>
|
63
63
|
{
|
64
|
-
|
65
|
-
|
64
|
+
'total' => 26,
|
65
|
+
'open' => 19
|
66
66
|
},
|
67
|
-
|
67
|
+
'story_points_extra' =>
|
68
68
|
{
|
69
|
-
|
69
|
+
'done' => 3
|
70
70
|
},
|
71
|
-
|
71
|
+
'tasks_extra' =>
|
72
72
|
{
|
73
|
-
|
73
|
+
'done' => 2
|
74
74
|
},
|
75
|
-
|
75
|
+
'story_points_unplanned' =>
|
76
76
|
{
|
77
|
-
|
78
|
-
|
77
|
+
'total' => 3,
|
78
|
+
'open' => 1
|
79
79
|
},
|
80
|
-
|
80
|
+
'tasks_unplanned' =>
|
81
81
|
{
|
82
|
-
|
83
|
-
|
82
|
+
'total' => 2,
|
83
|
+
'open' => 1
|
84
84
|
}
|
85
85
|
}
|
86
86
|
]
|
87
87
|
end
|
88
88
|
|
89
|
-
it
|
89
|
+
it 'returns sprint number' do
|
90
90
|
expect(@chart.sprint).to eq 1
|
91
91
|
end
|
92
92
|
|
93
|
-
describe
|
94
|
-
it
|
93
|
+
describe '#add_data' do
|
94
|
+
it 'creates first data entry' do
|
95
95
|
@burndown_data.story_points.open = 16
|
96
96
|
@burndown_data.story_points.done = 7
|
97
97
|
@burndown_data.tasks.open = 10
|
98
98
|
@burndown_data.tasks.done = 11
|
99
|
-
@burndown_data.date_time = DateTime.parse(
|
99
|
+
@burndown_data.date_time = DateTime.parse('2014-05-30')
|
100
100
|
|
101
101
|
@chart.add_data(@burndown_data)
|
102
102
|
|
103
|
-
expect( @chart.data[
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
{
|
110
|
-
"total" => 21,
|
111
|
-
"open" => 10
|
112
|
-
} )
|
103
|
+
expect( @chart.data['days'].first['story_points'] ).to eq(
|
104
|
+
'total' => 23,
|
105
|
+
'open' => 16 )
|
106
|
+
expect( @chart.data['days'].first['tasks'] ).to eq(
|
107
|
+
'total' => 21,
|
108
|
+
'open' => 10 )
|
113
109
|
end
|
114
110
|
|
115
111
|
it "doesn't overwrite first data entry" do
|
@@ -117,7 +113,7 @@ describe BurndownChart do
|
|
117
113
|
@burndown_data.story_points.done = 7
|
118
114
|
@burndown_data.tasks.open = 10
|
119
115
|
@burndown_data.tasks.done = 11
|
120
|
-
@burndown_data.date_time = DateTime.parse(
|
116
|
+
@burndown_data.date_time = DateTime.parse('2014-05-30')
|
121
117
|
|
122
118
|
@chart.add_data(@burndown_data)
|
123
119
|
|
@@ -125,28 +121,24 @@ describe BurndownChart do
|
|
125
121
|
@burndown_data.story_points.done = 8
|
126
122
|
@burndown_data.tasks.open = 9
|
127
123
|
@burndown_data.tasks.done = 12
|
128
|
-
@burndown_data.date_time = DateTime.parse(
|
124
|
+
@burndown_data.date_time = DateTime.parse('2014-05-30')
|
129
125
|
|
130
126
|
@chart.add_data(@burndown_data)
|
131
127
|
|
132
|
-
expect( @chart.data[
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
{
|
139
|
-
"total" => 21,
|
140
|
-
"open" => 10
|
141
|
-
} )
|
128
|
+
expect( @chart.data['days'].first['story_points'] ).to eq(
|
129
|
+
'total' => 23,
|
130
|
+
'open' => 16 )
|
131
|
+
expect( @chart.data['days'].first['tasks'] ).to eq(
|
132
|
+
'total' => 21,
|
133
|
+
'open' => 10 )
|
142
134
|
end
|
143
135
|
|
144
|
-
it
|
136
|
+
it 'does overwrite data entries after first one' do
|
145
137
|
@burndown_data.story_points.open = 16
|
146
138
|
@burndown_data.story_points.done = 7
|
147
139
|
@burndown_data.tasks.open = 10
|
148
140
|
@burndown_data.tasks.done = 11
|
149
|
-
@burndown_data.date_time = DateTime.parse(
|
141
|
+
@burndown_data.date_time = DateTime.parse('2014-05-30')
|
150
142
|
|
151
143
|
@chart.add_data(@burndown_data)
|
152
144
|
|
@@ -154,7 +146,7 @@ describe BurndownChart do
|
|
154
146
|
@burndown_data.story_points.done = 7
|
155
147
|
@burndown_data.tasks.open = 10
|
156
148
|
@burndown_data.tasks.done = 11
|
157
|
-
@burndown_data.date_time = DateTime.parse(
|
149
|
+
@burndown_data.date_time = DateTime.parse('2014-05-31')
|
158
150
|
|
159
151
|
@chart.add_data(@burndown_data)
|
160
152
|
|
@@ -162,24 +154,20 @@ describe BurndownChart do
|
|
162
154
|
@burndown_data.story_points.done = 8
|
163
155
|
@burndown_data.tasks.open = 9
|
164
156
|
@burndown_data.tasks.done = 12
|
165
|
-
@burndown_data.date_time = DateTime.parse(
|
157
|
+
@burndown_data.date_time = DateTime.parse('2014-05-31')
|
166
158
|
|
167
159
|
@chart.add_data(@burndown_data)
|
168
160
|
|
169
|
-
expect( @chart.data[
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
{
|
176
|
-
"total" => 21,
|
177
|
-
"open" => 9
|
178
|
-
} )
|
161
|
+
expect( @chart.data['days'][1]['story_points'] ).to eq(
|
162
|
+
'total' => 23,
|
163
|
+
'open' => 15 )
|
164
|
+
expect( @chart.data['days'][1]['tasks'] ).to eq(
|
165
|
+
'total' => 21,
|
166
|
+
'open' => 9 )
|
179
167
|
end
|
180
168
|
|
181
|
-
it
|
182
|
-
@chart.data[
|
169
|
+
it 'adds data' do
|
170
|
+
@chart.data['days'] = @raw_data
|
183
171
|
|
184
172
|
@burndown_data.story_points.open = 16
|
185
173
|
@burndown_data.story_points.done = 7
|
@@ -189,83 +177,83 @@ describe BurndownChart do
|
|
189
177
|
@burndown_data.extra_story_points.done = 3
|
190
178
|
@burndown_data.extra_tasks.open = 5
|
191
179
|
@burndown_data.extra_tasks.done = 2
|
192
|
-
@burndown_data.date_time = DateTime.parse(
|
180
|
+
@burndown_data.date_time = DateTime.parse('2014-05-30')
|
193
181
|
|
194
182
|
@chart.add_data(@burndown_data)
|
195
183
|
|
196
|
-
expect( @chart.data[
|
197
|
-
expect( @chart.data[
|
198
|
-
expect( @chart.data[
|
199
|
-
|
200
|
-
|
184
|
+
expect( @chart.data['days'].count ).to eq 3
|
185
|
+
expect( @chart.data['days'].last['date'] ).to eq '2014-05-30'
|
186
|
+
expect( @chart.data['days'].last['story_points'] ).to eq ( {
|
187
|
+
'total' => 23,
|
188
|
+
'open' => 16
|
201
189
|
} )
|
202
|
-
expect( @chart.data[
|
203
|
-
|
204
|
-
|
190
|
+
expect( @chart.data['days'].last['tasks'] ).to eq ( {
|
191
|
+
'total' => 21,
|
192
|
+
'open' => 10
|
205
193
|
} )
|
206
|
-
expect( @chart.data[
|
207
|
-
|
194
|
+
expect( @chart.data['days'].last['story_points_extra'] ).to eq ( {
|
195
|
+
'done' => 3
|
208
196
|
} )
|
209
|
-
expect( @chart.data[
|
210
|
-
|
197
|
+
expect( @chart.data['days'].last['tasks_extra'] ).to eq ( {
|
198
|
+
'done' => 2
|
211
199
|
} )
|
212
200
|
end
|
213
201
|
|
214
|
-
it
|
215
|
-
@chart.data[
|
202
|
+
it 'replaces data of same day' do
|
203
|
+
@chart.data['days'] = @raw_data
|
216
204
|
|
217
205
|
@burndown_data.story_points.open = 16
|
218
206
|
@burndown_data.story_points.done = 7
|
219
207
|
@burndown_data.tasks.open = 10
|
220
208
|
@burndown_data.tasks.done = 11
|
221
|
-
@burndown_data.date_time = DateTime.parse(
|
209
|
+
@burndown_data.date_time = DateTime.parse('2014-05-30')
|
222
210
|
|
223
211
|
@chart.add_data(@burndown_data)
|
224
212
|
|
225
|
-
expect( @chart.data[
|
226
|
-
expect( @chart.data[
|
227
|
-
|
228
|
-
|
213
|
+
expect( @chart.data['days'].count ).to eq 3
|
214
|
+
expect( @chart.data['days'].last['story_points'] ).to eq ( {
|
215
|
+
'total' => 23,
|
216
|
+
'open' => 16
|
229
217
|
} )
|
230
218
|
|
231
219
|
@burndown_data.story_points.done = 8
|
232
220
|
@chart.add_data(@burndown_data)
|
233
221
|
|
234
|
-
expect( @chart.data[
|
235
|
-
expect( @chart.data[
|
236
|
-
|
237
|
-
|
222
|
+
expect( @chart.data['days'].count ).to eq 3
|
223
|
+
expect( @chart.data['days'].last['story_points'] ).to eq ( {
|
224
|
+
'total' => 24,
|
225
|
+
'open' => 16
|
238
226
|
} )
|
239
227
|
end
|
240
228
|
end
|
241
229
|
|
242
|
-
describe
|
243
|
-
it
|
230
|
+
describe '#read_data' do
|
231
|
+
it 'reads data' do
|
244
232
|
@chart.read_data given_file('burndown-data.yaml')
|
245
233
|
|
246
|
-
expect(@chart.data[
|
234
|
+
expect(@chart.data['days']).to eq @raw_data
|
247
235
|
end
|
248
236
|
|
249
|
-
it
|
237
|
+
it 'reads not done columns' do
|
250
238
|
@chart.read_data given_file('burndown-data.yaml', from: 'burndown-data-with-config.yaml')
|
251
|
-
expect(@settings.not_done_columns).to eq [
|
239
|
+
expect(@settings.not_done_columns).to eq ['Sprint Backlog', 'Doing', 'QA']
|
252
240
|
end
|
253
241
|
end
|
254
242
|
|
255
|
-
describe
|
256
|
-
it
|
243
|
+
describe '#write_data' do
|
244
|
+
it 'writes object to disk' do
|
257
245
|
@chart.sprint = 2
|
258
|
-
@chart.data[
|
259
|
-
@chart.data[
|
260
|
-
@chart.data[
|
261
|
-
@chart.data[
|
246
|
+
@chart.data['meta']['total_days'] = 9
|
247
|
+
@chart.data['meta']['weekend_lines'] = [3.5, 7.5]
|
248
|
+
@chart.data['meta']['board_id'] = 'myboardid'
|
249
|
+
@chart.data['days'] = @raw_data
|
262
250
|
|
263
251
|
write_path = given_dummy_file
|
264
252
|
@chart.write_data(write_path)
|
265
253
|
expect(File.read(write_path)). to eq load_test_file('burndown-data.yaml')
|
266
254
|
end
|
267
255
|
|
268
|
-
it
|
256
|
+
it 'writes all data which was read' do
|
269
257
|
read_path = given_file('burndown-data.yaml')
|
270
258
|
@chart.read_data(read_path)
|
271
259
|
|
@@ -278,29 +266,29 @@ describe BurndownChart do
|
|
278
266
|
it "doesn't write extra entries with 0 values" do
|
279
267
|
raw_data = [
|
280
268
|
{
|
281
|
-
|
282
|
-
|
269
|
+
'date' => '2014-04-24',
|
270
|
+
'story_points' =>
|
283
271
|
{
|
284
|
-
|
285
|
-
|
272
|
+
'total' => 30,
|
273
|
+
'open' => 21
|
286
274
|
},
|
287
|
-
|
275
|
+
'tasks' =>
|
288
276
|
{
|
289
|
-
|
290
|
-
|
277
|
+
'total' => 26,
|
278
|
+
'open' => 19
|
291
279
|
},
|
292
|
-
|
280
|
+
'story_points_extra' =>
|
293
281
|
{
|
294
|
-
|
282
|
+
'done' => 0
|
295
283
|
},
|
296
|
-
|
284
|
+
'tasks_extra' =>
|
297
285
|
{
|
298
|
-
|
286
|
+
'done' => 0
|
299
287
|
}
|
300
288
|
}
|
301
289
|
]
|
302
|
-
@chart.data[
|
303
|
-
@chart.data[
|
290
|
+
@chart.data['days'] = raw_data
|
291
|
+
@chart.data['meta']['board_id'] = '1234'
|
304
292
|
|
305
293
|
write_path = given_dummy_file
|
306
294
|
@chart.write_data(write_path)
|
@@ -343,77 +331,76 @@ EOT
|
|
343
331
|
end
|
344
332
|
end
|
345
333
|
|
346
|
-
describe
|
334
|
+
describe 'commands' do
|
347
335
|
use_given_filesystem(keep_files: true)
|
348
336
|
|
349
|
-
describe
|
350
|
-
it
|
337
|
+
describe 'setup' do
|
338
|
+
it 'initializes new chart' do
|
351
339
|
path = given_directory
|
352
|
-
@chart.setup(path,
|
340
|
+
@chart.setup(path, '53186e8391ef8671265eba9d')
|
353
341
|
|
354
|
-
expect(File.exist?(File.join(path,
|
342
|
+
expect(File.exist?(File.join(path, 'burndown-data-01.yaml'))).to be true
|
355
343
|
|
356
344
|
chart = BurndownChart.new(@settings)
|
357
|
-
chart.read_data(File.join(path,
|
345
|
+
chart.read_data(File.join(path, 'burndown-data-01.yaml'))
|
358
346
|
|
359
|
-
expect(chart.board_id).to eq
|
347
|
+
expect(chart.board_id).to eq '53186e8391ef8671265eba9d'
|
360
348
|
end
|
361
349
|
end
|
362
350
|
|
363
|
-
describe
|
364
|
-
it
|
365
|
-
path = given_directory_from_data(
|
351
|
+
describe 'last_sprint' do
|
352
|
+
it 'gets the last sprint based on the burndown files' do
|
353
|
+
path = given_directory_from_data('burndown_dir')
|
366
354
|
expect(@chart.last_sprint(path)).to eq(2)
|
367
355
|
end
|
368
356
|
end
|
369
357
|
|
370
|
-
describe
|
371
|
-
let(:path) { given_directory_from_data(
|
358
|
+
describe 'load_sprint' do
|
359
|
+
let(:path) { given_directory_from_data('burndown_dir') }
|
372
360
|
|
373
|
-
it
|
361
|
+
it 'loads the burndown from the 2nd sprint into data' do
|
374
362
|
@chart.load_sprint(path)
|
375
363
|
expect(@chart.data).to eq(
|
376
|
-
|
377
|
-
{
|
378
|
-
|
379
|
-
|
380
|
-
|
364
|
+
'meta' =>
|
365
|
+
{ 'board_id' => '53186e8391ef8671265eba9d',
|
366
|
+
'sprint' => 2,
|
367
|
+
'total_days' => 9,
|
368
|
+
'weekend_lines' => [3.5, 7.5]
|
381
369
|
},
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
})
|
370
|
+
'days' => [
|
371
|
+
{ 'date' => '2015-08-28',
|
372
|
+
'updated_at' => '2015-08-28T11:04:52+02:00',
|
373
|
+
'story_points' =>
|
374
|
+
{ 'total' => 24.0,
|
375
|
+
'open' => 24.0
|
376
|
+
},
|
377
|
+
'tasks' =>
|
378
|
+
{ 'total' => 43,
|
379
|
+
'open' => 28
|
380
|
+
},
|
381
|
+
'story_points_extra' =>
|
382
|
+
{ 'done' => 2.0
|
383
|
+
},
|
384
|
+
'tasks_extra' =>
|
385
|
+
{ 'done' => 5
|
386
|
+
}
|
387
|
+
}
|
388
|
+
])
|
402
389
|
end
|
403
390
|
|
404
|
-
it
|
405
|
-
expect(@chart.load_sprint(path)).to eq(File.join(path,
|
391
|
+
it 'returns the path of the last sprint' do
|
392
|
+
expect(@chart.load_sprint(path)).to eq(File.join(path, 'burndown-data-02.yaml'))
|
406
393
|
end
|
407
394
|
end
|
408
395
|
|
409
|
-
describe
|
410
|
-
let(:path) { given_directory_from_data(
|
411
|
-
let(:options) { {'output' => path} }
|
396
|
+
describe 'update' do
|
397
|
+
let(:path) { given_directory_from_data('burndown_dir') }
|
398
|
+
let(:options) { {'output' => path, 'board-id' => '7Zar7bNm'} }
|
412
399
|
let(:before) { BurndownChart.new(@settings) }
|
413
400
|
let(:after) { BurndownChart.new(@settings) }
|
414
401
|
|
415
|
-
it
|
416
|
-
updated_at =
|
402
|
+
it 'updates chart with latest data' do
|
403
|
+
updated_at = '2015-01-12T13:57:16+01:00'
|
417
404
|
expected_date_time = DateTime.parse(updated_at)
|
418
405
|
allow(DateTime).to receive(:now).and_return(expected_date_time)
|
419
406
|
|
@@ -422,25 +409,30 @@ EOT
|
|
422
409
|
after.read_data(File.join(path, 'burndown-data-02.yaml'))
|
423
410
|
expect(after.days.size).to eq before.days.size + 1
|
424
411
|
|
425
|
-
expect(after.days.last[
|
426
|
-
expect(after.days.last[
|
412
|
+
expect(after.days.last['date']).to eq '2015-01-12'
|
413
|
+
expect(after.days.last['updated_at']).to eq updated_at
|
427
414
|
end
|
428
415
|
|
429
|
-
it
|
416
|
+
it 'overwrites data on same date' do
|
430
417
|
before.read_data(File.join(path, 'burndown-data-02.yaml'))
|
431
418
|
@chart.update(options)
|
432
419
|
@chart.update(options)
|
433
420
|
after.read_data(File.join(path, 'burndown-data-02.yaml'))
|
434
421
|
expect(after.days.size).to eq before.days.size + 1
|
435
422
|
end
|
423
|
+
|
424
|
+
it 'uses provided board-id' do
|
425
|
+
@chart.update(options)
|
426
|
+
expect(@chart.board_id).to eq '7Zar7bNm'
|
427
|
+
end
|
436
428
|
end
|
437
429
|
|
438
|
-
describe
|
439
|
-
let(:path) { given_directory_from_data(
|
430
|
+
describe 'create_next_sprint' do
|
431
|
+
let(:path) { given_directory_from_data('burndown_dir') }
|
440
432
|
let(:chart) { BurndownChart.new(@settings) }
|
441
|
-
let(:next_sprint_file) { File.join(path,
|
433
|
+
let(:next_sprint_file) { File.join(path, 'burndown-data-03.yaml') }
|
442
434
|
|
443
|
-
it
|
435
|
+
it 'create new sprint file' do
|
444
436
|
expected_file_content = <<EOT
|
445
437
|
---
|
446
438
|
meta:
|
@@ -458,7 +450,7 @@ EOT
|
|
458
450
|
expect(File.read(next_sprint_file)).to eq expected_file_content
|
459
451
|
end
|
460
452
|
|
461
|
-
it
|
453
|
+
it 'create new sprint file with params' do
|
462
454
|
expected_file_content = <<EOT
|
463
455
|
---
|
464
456
|
meta:
|
@@ -472,7 +464,7 @@ meta:
|
|
472
464
|
- 16.5
|
473
465
|
days: []
|
474
466
|
EOT
|
475
|
-
chart.create_next_sprint(path,
|
467
|
+
chart.create_next_sprint(path, total_days: 17, weekend_lines: [1.5, 6.5, 11.5, 16.5])
|
476
468
|
|
477
469
|
expect(File.exist?(next_sprint_file)).to be true
|
478
470
|
expect(File.read(next_sprint_file)).to eq expected_file_content
|
@@ -480,22 +472,22 @@ EOT
|
|
480
472
|
end
|
481
473
|
end
|
482
474
|
|
483
|
-
describe
|
475
|
+
describe 'reads meta data from the board' do
|
484
476
|
use_given_filesystem
|
485
477
|
|
486
|
-
it
|
478
|
+
it 'merges meta data from board if present' do
|
487
479
|
chart = BurndownChart.new(@settings)
|
488
|
-
chart.read_data(given_file(
|
480
|
+
chart.read_data(given_file('burndown-data-10.yaml'))
|
489
481
|
|
490
|
-
expect(chart.data[
|
482
|
+
expect(chart.data['meta']['weekend_lines']).to eq([3.5, 8.5])
|
491
483
|
|
492
484
|
burndown = BurndownData.new(@settings)
|
493
|
-
burndown.board_id =
|
485
|
+
burndown.board_id = '53186e8391ef8671265eba9d'
|
494
486
|
burndown.fetch
|
495
487
|
|
496
488
|
chart.merge_meta_data_from_board(burndown)
|
497
489
|
|
498
|
-
expect(chart.data[
|
490
|
+
expect(chart.data['meta']['weekend_lines']).to eq([1.5, 6.5, 11.5, 16.5])
|
499
491
|
end
|
500
492
|
end
|
501
493
|
|
@@ -504,7 +496,7 @@ EOT
|
|
504
496
|
allow(described_class).to receive(:process_options).and_return(%w{ --test 1 --no-blah })
|
505
497
|
allow(described_class).to receive(:plot_helper).and_return('mescript')
|
506
498
|
expect(described_class).to receive(:system).with('python mescript 42 --test 1 --no-blah')
|
507
|
-
described_class.plot(42,
|
499
|
+
described_class.plot(42, foo: 1, bar: 2)
|
508
500
|
end
|
509
501
|
end
|
510
502
|
|