trollolo 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.travis.yml +5 -1
  4. data/CHANGELOG.md +29 -0
  5. data/Gemfile +7 -2
  6. data/README.md +19 -0
  7. data/bin/trollolo +1 -1
  8. data/lib/array.rb +6 -0
  9. data/lib/backup.rb +67 -0
  10. data/lib/burndown_chart.rb +96 -67
  11. data/lib/burndown_data.rb +62 -123
  12. data/lib/card.rb +74 -30
  13. data/lib/cli.rb +131 -9
  14. data/lib/column.rb +61 -0
  15. data/lib/result.rb +0 -0
  16. data/lib/scrum_board.rb +104 -0
  17. data/lib/settings.rb +9 -4
  18. data/lib/trello_wrapper.rb +62 -0
  19. data/lib/trollolo.rb +10 -7
  20. data/lib/version.rb +1 -1
  21. data/scripts/.gitignore +1 -0
  22. data/scripts/burndowndata.py +113 -0
  23. data/scripts/create_burndown.py +111 -146
  24. data/scripts/graph.py +116 -0
  25. data/scripts/plot.py +131 -0
  26. data/spec/data/board.json +63 -0
  27. data/spec/data/burndown-data.yaml +3 -0
  28. data/spec/data/burndown_dir/burndown-data-01.yaml +1 -1
  29. data/spec/data/burndown_dir/burndown-data-02.yaml +1 -1
  30. data/spec/data/card.json +61 -0
  31. data/spec/data/full-board.json +1626 -0
  32. data/spec/data/lists.json +25 -25
  33. data/spec/data/trollolorc +5 -0
  34. data/spec/{command_line_spec.rb → integration/command_line_spec.rb} +1 -4
  35. data/spec/integration/create_burndown_spec.rb +57 -0
  36. data/spec/integration/integration_spec_helper.rb +10 -0
  37. data/spec/integration/support/aruba_hook.rb +11 -0
  38. data/spec/integration/support/custom_matchers.rb +13 -0
  39. data/spec/{wrapper → integration/wrapper}/credentials_input_wrapper +2 -2
  40. data/spec/{wrapper → integration/wrapper}/empty_config_trollolo_wrapper +2 -2
  41. data/spec/integration/wrapper/trollolo_wrapper +10 -0
  42. data/spec/unit/backup_spec.rb +107 -0
  43. data/spec/unit/burndown_chart_spec.rb +396 -0
  44. data/spec/unit/burndown_data_spec.rb +118 -0
  45. data/spec/unit/card_spec.rb +79 -0
  46. data/spec/unit/cli_spec.rb +38 -0
  47. data/spec/unit/retrieve_data_spec.rb +54 -0
  48. data/spec/unit/scrum_board_spec.rb +18 -0
  49. data/spec/{settings_spec.rb → unit/settings_spec.rb} +1 -1
  50. data/spec/{spec_helper.rb → unit/spec_helper.rb} +4 -12
  51. data/spec/unit/support/test_data_operations.rb +7 -0
  52. data/spec/unit/support/update_webmock_data +17 -0
  53. data/spec/unit/support/webmocks.rb +52 -0
  54. data/spec/unit/trello_wrapper_spec.rb +47 -0
  55. data/trollolo.gemspec +10 -11
  56. metadata +54 -37
  57. data/lib/trello.rb +0 -66
  58. data/spec/burndown_chart_spec.rb +0 -307
  59. data/spec/burndown_data_spec.rb +0 -125
  60. data/spec/card_spec.rb +0 -15
  61. data/spec/cli_spec.rb +0 -18
  62. data/spec/data/cards.json +0 -1002
  63. data/spec/trello_spec.rb +0 -32
  64. data/spec/wrapper/trollolo_wrapper +0 -11
@@ -1,28 +1,27 @@
1
1
  # -*- encoding: utf-8 -*-
2
- require File.expand_path("../lib/version", __FILE__)
2
+ require File.expand_path('../lib/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
- s.name = "trollolo"
5
+ s.name = 'trollolo'
6
6
  s.version = Trollolo::VERSION
7
7
  s.license = 'GPL-3'
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ['Cornelius Schumacher']
10
10
  s.email = ['cschum@suse.de']
11
- s.homepage = "https://github.com/openSUSE/trollolo"
12
- s.summary = "Trello command line client"
13
- s.description = "Trollolo is a command line tool to access Trello and support tasks like generation of burndown charts."
11
+ s.homepage = 'https://github.com/openSUSE/trollolo'
12
+ s.summary = 'Trello command line client'
13
+ s.description = 'Trollolo is a command line tool to access Trello and support tasks like generation of burndown charts.'
14
14
 
15
- s.required_rubygems_version = ">= 1.3.6"
16
- s.rubyforge_project = "trollolo"
15
+ s.required_rubygems_version = '>= 1.3.6'
16
+ s.rubyforge_project = 'trollolo'
17
17
 
18
- s.add_dependency "thor", ">=0.14.0"
18
+ s.add_dependency 'thor', '>= 0.19.1'
19
+ s.add_dependency 'ruby-trello', '>=1.1.2'
19
20
 
20
21
  s.files = `git ls-files`.split("\n")
21
22
  s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
22
23
  s.require_path = 'lib'
23
24
 
24
- s.files += Dir['man/*.?'] # UNIX man pages
25
+ s.files += Dir['man/*.?'] # UNIX man pages
25
26
  s.files += Dir['man/*.{html,css,js}'] # HTML man pages
26
- s.add_development_dependency 'ronn', '>=0.7.3'
27
- s.add_development_dependency 'rake'
28
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trollolo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cornelius Schumacher
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-22 00:00:00.000000000 Z
11
+ date: 2015-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -16,42 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.14.0
19
+ version: 0.19.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '>='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.14.0
26
+ version: 0.19.1
27
27
  - !ruby/object:Gem::Dependency
28
- name: ronn
28
+ name: ruby-trello
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '>='
32
32
  - !ruby/object:Gem::Version
33
- version: 0.7.3
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - '>='
39
- - !ruby/object:Gem::Version
40
- version: 0.7.3
41
- - !ruby/object:Gem::Dependency
42
- name: rake
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - '>='
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
33
+ version: 1.1.2
34
+ type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - '>='
53
39
  - !ruby/object:Gem::Version
54
- version: '0'
40
+ version: 1.1.2
55
41
  description: Trollolo is a command line tool to access Trello and support tasks like
56
42
  generation of burndown charts.
57
43
  email:
@@ -71,38 +57,69 @@ files:
71
57
  - README.md
72
58
  - Rakefile
73
59
  - bin/trollolo
60
+ - examples/burndown-26.png
61
+ - lib/array.rb
62
+ - lib/backup.rb
74
63
  - lib/burndown_chart.rb
75
64
  - lib/burndown_data.rb
76
65
  - lib/card.rb
77
66
  - lib/cli.rb
67
+ - lib/column.rb
68
+ - lib/result.rb
69
+ - lib/scrum_board.rb
78
70
  - lib/settings.rb
79
- - lib/trello.rb
71
+ - lib/trello_wrapper.rb
80
72
  - lib/trollolo.rb
81
73
  - lib/version.rb
82
74
  - man/.gitignore
83
75
  - man/trollolo.1.md
76
+ - scripts/.gitignore
77
+ - scripts/burndowndata.py
84
78
  - scripts/create_burndown.py
85
- - spec/burndown_chart_spec.rb
86
- - spec/burndown_data_spec.rb
87
- - spec/card_spec.rb
88
- - spec/cli_spec.rb
89
- - spec/command_line_spec.rb
79
+ - scripts/graph.py
80
+ - scripts/plot.py
81
+ - spec/data/board-list.yaml
82
+ - spec/data/board.json
83
+ - spec/data/burndown-data-10.yaml
84
+ - spec/data/burndown-data-with-config.yaml
90
85
  - spec/data/burndown-data.yaml
91
86
  - spec/data/burndown_dir/burndown-data-01.yaml
92
87
  - spec/data/burndown_dir/burndown-data-02.yaml
93
88
  - spec/data/burndown_dir/create_burndown
94
- - spec/data/cards.json
89
+ - spec/data/card.json
90
+ - spec/data/create_burndown_helper/burndown-08.png
91
+ - spec/data/create_burndown_helper/burndown-23.png
92
+ - spec/data/create_burndown_helper/burndown-31.png
93
+ - spec/data/create_burndown_helper/burndown-35.png
94
+ - spec/data/create_burndown_helper/burndown-data-08.yaml
95
+ - spec/data/create_burndown_helper/burndown-data-23.yaml
96
+ - spec/data/create_burndown_helper/burndown-data-31.yaml
97
+ - spec/data/create_burndown_helper/burndown-data-35.yaml
98
+ - spec/data/full-board.json
95
99
  - spec/data/lists.json
96
100
  - spec/data/trollolorc
97
- - spec/settings_spec.rb
98
- - spec/spec_helper.rb
99
- - spec/trello_spec.rb
100
- - spec/wrapper/credentials_input_wrapper
101
- - spec/wrapper/empty_config_trollolo_wrapper
102
- - spec/wrapper/trollolo_wrapper
101
+ - spec/integration/command_line_spec.rb
102
+ - spec/integration/create_burndown_spec.rb
103
+ - spec/integration/integration_spec_helper.rb
104
+ - spec/integration/support/aruba_hook.rb
105
+ - spec/integration/support/custom_matchers.rb
106
+ - spec/integration/wrapper/credentials_input_wrapper
107
+ - spec/integration/wrapper/empty_config_trollolo_wrapper
108
+ - spec/integration/wrapper/trollolo_wrapper
109
+ - spec/unit/backup_spec.rb
110
+ - spec/unit/burndown_chart_spec.rb
111
+ - spec/unit/burndown_data_spec.rb
112
+ - spec/unit/card_spec.rb
113
+ - spec/unit/cli_spec.rb
114
+ - spec/unit/retrieve_data_spec.rb
115
+ - spec/unit/scrum_board_spec.rb
116
+ - spec/unit/settings_spec.rb
117
+ - spec/unit/spec_helper.rb
118
+ - spec/unit/support/test_data_operations.rb
119
+ - spec/unit/support/update_webmock_data
120
+ - spec/unit/support/webmocks.rb
121
+ - spec/unit/trello_wrapper_spec.rb
103
122
  - trollolo.gemspec
104
- - man/trollolo.1
105
- - man/trollolo.1.html
106
123
  homepage: https://github.com/openSUSE/trollolo
107
124
  licenses:
108
125
  - GPL-3
@@ -1,66 +0,0 @@
1
- # Copyright (c) 2013-2014 SUSE LLC
2
- #
3
- # This program is free software; you can redistribute it and/or
4
- # modify it under the terms of version 3 of the GNU General Public License as
5
- # published by the Free Software Foundation.
6
- #
7
- # This program is distributed in the hope that it will be useful,
8
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
- # GNU General Public License for more details.
11
- #
12
- # You should have received a copy of the GNU General Public License
13
- # along with this program; if not, contact SUSE LLC.
14
- #
15
- # To contact SUSE about this file by physical or electronic mail,
16
- # you may find current contact information at www.suse.com
17
-
18
- class Trello
19
- class ApiError < StandardError; end
20
-
21
- attr_accessor :board_id
22
-
23
- attr_reader :developer_public_key, :member_token
24
-
25
- def initialize settings
26
- @developer_public_key = settings.fetch(:developer_public_key)
27
- @member_token = settings.fetch(:member_token)
28
- @board_id = settings.fetch(:board_id)
29
- end
30
-
31
- def lists
32
- get "lists"
33
- end
34
-
35
- def cards
36
- get "cards"
37
- end
38
-
39
- def checklists
40
- get "checklists"
41
- end
42
-
43
- private
44
-
45
- def resource_url resource
46
- "/1/boards/#{board_id}/#{resource}?key=#{developer_public_key}&token=#{member_token}"
47
- end
48
-
49
- # FIXME: we should handle time-outs gracefully.
50
-
51
- def get resource
52
- resp = http_client.get resource_url(resource)
53
- unless resp.code == "200"
54
- raise ApiError.new("Error occured while connecting to the trello API.")
55
- end
56
- JSON.parse(resp.body)
57
- rescue JSON::ParserError => e
58
- raise ApiError.new(e)
59
- end
60
-
61
- def http_client
62
- http = Net::HTTP.new "trello.com", 443
63
- http.use_ssl = true
64
- http
65
- end
66
- end
@@ -1,307 +0,0 @@
1
- require_relative 'spec_helper'
2
-
3
- include GivenFilesystemSpecHelpers
4
-
5
- describe BurndownChart do
6
-
7
- before(:each) do
8
- @settings = dummy_settings
9
- @burndown_data = BurndownData.new(@settings)
10
- @chart = BurndownChart.new(@settings)
11
- end
12
-
13
- describe "initializer" do
14
- it "sets initial meta data" do
15
- expect(@chart.data["meta"]["sprint"]).to eq 1
16
- expect(@chart.data["meta"]["total_days"]).to eq 10
17
- expect(@chart.data["meta"]["weekend_lines"]).to eq [3.5, 8.5]
18
- end
19
- end
20
-
21
- describe "data" do
22
- use_given_filesystem
23
-
24
- before(:each) do
25
- @raw_data = [
26
- {
27
- "date" => '2014-04-23',
28
- "story_points" =>
29
- {
30
- "total" => 30,
31
- "open" => 23
32
- },
33
- "tasks" =>
34
- {
35
- "total" => 25,
36
- "open" => 21
37
- }
38
- },
39
- {
40
- "date" => '2014-04-24',
41
- "story_points" =>
42
- {
43
- "total" => 30,
44
- "open" => 21
45
- },
46
- "tasks" =>
47
- {
48
- "total" => 26,
49
- "open" => 19
50
- },
51
- "story_points_extra" =>
52
- {
53
- "done" => 3
54
- },
55
- "tasks_extra" =>
56
- {
57
- "done" => 2
58
- }
59
- }
60
- ]
61
- end
62
-
63
- it "creates first data entry" do
64
- @burndown_data.story_points.open = 16
65
- @burndown_data.story_points.done = 7
66
- @burndown_data.tasks.open = 10
67
- @burndown_data.tasks.done = 11
68
-
69
- @chart.add_data(@burndown_data,Date.parse("2014-05-30"))
70
-
71
- expect( @chart.data["days"].first["story_points"] ).to eq(
72
- {
73
- "total" => 23,
74
- "open" => 16
75
- } )
76
- expect( @chart.data["days"].first["tasks"] ).to eq(
77
- {
78
- "total" => 21,
79
- "open" => 10
80
- } )
81
- end
82
-
83
- it "returns sprint number" do
84
- expect(@chart.sprint).to eq 1
85
- end
86
-
87
- it "adds data" do
88
- @chart.data["days"] = @raw_data
89
-
90
- @burndown_data.story_points.open = 16
91
- @burndown_data.story_points.done = 7
92
- @burndown_data.tasks.open = 10
93
- @burndown_data.tasks.done = 11
94
- @burndown_data.extra_story_points.open = 2
95
- @burndown_data.extra_story_points.done = 3
96
- @burndown_data.extra_tasks.open = 5
97
- @burndown_data.extra_tasks.done = 2
98
-
99
- @chart.add_data(@burndown_data,Date.parse("2014-05-30"))
100
-
101
- expect( @chart.data["days"].count ).to eq 3
102
- expect( @chart.data["days"].last["date"] ).to eq ( "2014-05-30" )
103
- expect( @chart.data["days"].last["story_points"] ).to eq ( {
104
- "total" => 23,
105
- "open" => 16
106
- } )
107
- expect( @chart.data["days"].last["tasks"] ).to eq ( {
108
- "total" => 21,
109
- "open" => 10
110
- } )
111
- expect( @chart.data["days"].last["story_points_extra"] ).to eq ( {
112
- "done" => 3
113
- } )
114
- expect( @chart.data["days"].last["tasks_extra"] ).to eq ( {
115
- "done" => 2
116
- } )
117
- end
118
-
119
- it "replaces data of same day" do
120
- @chart.data["days"] = @raw_data
121
-
122
- @burndown_data.story_points.open = 16
123
- @burndown_data.story_points.done = 7
124
- @burndown_data.tasks.open = 10
125
- @burndown_data.tasks.done = 11
126
-
127
- @chart.add_data(@burndown_data,Date.parse("2014-05-30"))
128
-
129
- expect( @chart.data["days"].count ).to eq 3
130
- expect( @chart.data["days"].last["story_points"] ).to eq ( {
131
- "total" => 23,
132
- "open" => 16
133
- } )
134
-
135
- @burndown_data.story_points.done = 8
136
- @chart.add_data(@burndown_data,Date.parse("2014-05-30"))
137
-
138
- expect( @chart.data["days"].count ).to eq 3
139
- expect( @chart.data["days"].last["story_points"] ).to eq ( {
140
- "total" => 24,
141
- "open" => 16
142
- } )
143
- end
144
-
145
- it "reads data" do
146
- @chart.read_data given_file('burndown-data.yaml')
147
-
148
- expect(@chart.data["days"]).to eq @raw_data
149
- end
150
-
151
- it "writes data" do
152
- read_path = given_file('burndown-data.yaml')
153
- @chart.read_data(read_path)
154
-
155
- write_path = given_dummy_file
156
- @chart.write_data(write_path)
157
-
158
- expect(File.read(write_path)).to eq File.read(read_path)
159
- end
160
-
161
- it "doesn't write extra entries with 0 values" do
162
- raw_data = [
163
- {
164
- "date" => '2014-04-24',
165
- "story_points" =>
166
- {
167
- "total" => 30,
168
- "open" => 21
169
- },
170
- "tasks" =>
171
- {
172
- "total" => 26,
173
- "open" => 19
174
- },
175
- "story_points_extra" =>
176
- {
177
- "done" => 0
178
- },
179
- "tasks_extra" =>
180
- {
181
- "done" => 0
182
- }
183
- }
184
- ]
185
- @chart.data["days"] = raw_data
186
- @chart.data["meta"]["board_id"] = "1234"
187
-
188
- write_path = given_dummy_file
189
- @chart.write_data(write_path)
190
-
191
- expected_file_content = <<EOT
192
- ---
193
- meta:
194
- board_id: '1234'
195
- sprint: 1
196
- total_days: 10
197
- weekend_lines:
198
- - 3.5
199
- - 8.5
200
- days:
201
- - date: '2014-04-24'
202
- story_points:
203
- total: 30
204
- open: 21
205
- tasks:
206
- total: 26
207
- open: 19
208
- EOT
209
- expect(File.read(write_path)).to eq expected_file_content
210
- end
211
-
212
- end
213
-
214
- describe "commands" do
215
- use_given_filesystem(keep_files: true)
216
-
217
- describe "setup" do
218
- it "initializes new chart" do
219
- path = given_directory
220
- @chart.setup(path,"myboardid")
221
-
222
- expect(File.exist?(File.join(path,"burndown-data-01.yaml"))).to be true
223
-
224
- chart = BurndownChart.new(@settings)
225
- chart.read_data(File.join(path,"burndown-data-01.yaml"))
226
-
227
- expect(chart.board_id).to eq "myboardid"
228
- end
229
- end
230
-
231
- describe "update" do
232
- it "updates chart with latest data" do
233
- card_url_match = /https:\/\/trello.com\/1\/boards\/myboardid\/cards\?-*/
234
-
235
- stub_request(:any,card_url_match).to_return(:status => 200,
236
- :body => load_test_file("cards.json"), :headers => {})
237
-
238
- list_url_match = /https:\/\/trello.com\/1\/boards\/myboardid\/lists\?-*/
239
-
240
- stub_request(:any,list_url_match).to_return(:status => 200,
241
- :body => load_test_file("lists.json"), :headers => {})
242
-
243
- path = given_directory_from_data("burndown_dir")
244
-
245
- before = BurndownChart.new(@settings)
246
- before.read_data(File.join(path,'burndown-data-02.yaml'))
247
-
248
- @chart.update(path)
249
-
250
- after = BurndownChart.new(@settings)
251
- after.read_data(File.join(path,'burndown-data-02.yaml'))
252
-
253
- expect(after.days.size).to eq before.days.size + 1
254
- end
255
-
256
- it "overwrites data on same date" do
257
- card_url_match = /https:\/\/trello.com\/1\/boards\/myboardid\/cards\?-*/
258
-
259
- stub_request(:any,card_url_match).to_return(:status => 200,
260
- :body => load_test_file("cards.json"), :headers => {})
261
-
262
- list_url_match = /https:\/\/trello.com\/1\/boards\/myboardid\/lists\?-*/
263
-
264
- stub_request(:any,list_url_match).to_return(:status => 200,
265
- :body => load_test_file("lists.json"), :headers => {})
266
-
267
- path = given_directory_from_data("burndown_dir")
268
-
269
- before = BurndownChart.new(@settings)
270
- before.read_data(File.join(path,'burndown-data-02.yaml'))
271
-
272
- @chart.update(path)
273
- @chart.update(path)
274
-
275
- after = BurndownChart.new(@settings)
276
- after.read_data(File.join(path,'burndown-data-02.yaml'))
277
-
278
- expect(after.days.size).to eq before.days.size + 1
279
- end
280
- end
281
-
282
- describe "create_next_sprint" do
283
- it "create new sprint file" do
284
- path = given_directory_from_data("burndown_dir")
285
- chart = BurndownChart.new(@settings)
286
- chart.create_next_sprint(path)
287
-
288
- next_sprint_file = File.join(path, "burndown-data-03.yaml")
289
- expect(File.exist?(next_sprint_file)).to be true
290
-
291
- expected_file_content = <<EOT
292
- ---
293
- meta:
294
- board_id: myboardid
295
- sprint: 3
296
- total_days: 9
297
- weekend_lines:
298
- - 3.5
299
- - 7.5
300
- days: []
301
- EOT
302
- expect(File.read(next_sprint_file)).to eq expected_file_content
303
- end
304
- end
305
- end
306
-
307
- end