kanban_metrics 0.1.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.
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ module CommandLineSteps
4
+ step "the line in :filename :line" do |filename, line|
5
+ File.open(filename, 'a') do |file|
6
+ file.puts line
7
+ end
8
+ end
9
+
10
+ step "I run the command :command" do |command|
11
+ @output = exec(command)
12
+ end
13
+
14
+ step "I see :output" do |output|
15
+ @output.should eql(output.split('\n'))
16
+ end
17
+
18
+ step "I delete :filename" do |filename|
19
+ FileUtils.rm_f(filename)
20
+ end
21
+ end
22
+
23
+ RSpec.configure { |c| c.include CommandLineSteps }
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ module KanbanMetrics
4
+ describe ChartDataHelper do
5
+ it "should return the same content but ordered by key" do
6
+ chart_data = {"1" => "1", "3" => "3", "2" => "2"}
7
+ sorted_chart_data = ChartDataHelper.sort(chart_data)
8
+ assert_hash_order_matters(sorted_chart_data, {"1" => "1", "2" => "2", "3" => "3"})
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ module KanbanMetrics
4
+ module Commands
5
+ describe Cfd do
6
+ before(:each) do
7
+ @work_item1 = WorkItem.new({:committed => "2013-01-02", :started => "2013-01-02", :finished => "2013-01-04", :delivered => "2013-01-05" })
8
+ @work_item2 = WorkItem.new({:committed => "2013-01-02", :started => "2013-01-03", :finished => "2013-01-05", :delivered => "2013-01-05" })
9
+ end
10
+
11
+ it "should create chart data for a work item" do
12
+ chart_data = Cfd.new.execute([@work_item1])
13
+ assert_hash_order_matters(chart_data, {Date.parse("2013-01-02") => [1,1,0,0], Date.parse("2013-01-04") => [1,1,1,0], Date.parse("2013-01-05") => [1,1,1,1]})
14
+ end
15
+
16
+ it "should create chart data for two work items" do
17
+ chart_data = Cfd.new.execute([@work_item1, @work_item2])
18
+ assert_hash_order_matters(chart_data, {Date.parse("2013-01-02") => [2,1,0,0], Date.parse("2013-01-03") => [2,2,0,0], Date.parse("2013-01-04") => [2,2,1,0], Date.parse("2013-01-05") => [2,2,2,2]})
19
+ end
20
+
21
+ it "should create chart data for a shorter range than the work items determine" do
22
+ chart_data = Cfd.new.execute([@work_item1, @work_item2], Date.parse("2013-01-02"), Date.parse("2013-01-03"))
23
+ assert_hash_order_matters(chart_data, {Date.parse("2013-01-02") => [2,1,0,0], Date.parse("2013-01-03") => [2,2,0,0]})
24
+ end
25
+
26
+ it "should create chart data for partial data set" do
27
+ work_item1 = WorkItem.new({:committed => "2013-01-02", :started => "2013-01-02"})
28
+ work_item2 = WorkItem.new({:committed => "2013-01-02", :started => "2013-01-03", :finished => "2013-01-05" })
29
+
30
+ chart_data = Cfd.new.execute([work_item1, work_item2])
31
+ assert_hash_order_matters(chart_data, {Date.parse("2013-01-02") => [2,1,0,0], Date.parse("2013-01-03") => [2,2,0,0], Date.parse("2013-01-05") => [2,2,1,0]})
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ module KanbanMetrics
4
+ module Commands
5
+ describe CfdView do
6
+ it "should print out the chart data in csv" do
7
+ chart_data = {Date.parse("2013-01-01") => [1,0,0,0], Date.parse("2013-01-02") => [1,1,0,0]}
8
+
9
+ STDOUT.should_receive(:puts).with("2013-01-01,1,0,0,0")
10
+ STDOUT.should_receive(:puts).with("2013-01-02,1,1,0,0")
11
+
12
+ CfdView.new.render(chart_data)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ module KanbanMetrics
3
+ module Commands
4
+ describe Io do
5
+ before(:each) do
6
+ @work_item1 = WorkItem.new({:started => "2013-01-02", :delivered => "2013-01-05" })
7
+ @work_item2 = WorkItem.new({:started => "2013-01-02", :delivered => "2013-01-02" })
8
+ @work_item3 = WorkItem.new({:started => "2013-01-06", :delivered => "2013-01-08" })
9
+ end
10
+
11
+ it "should return in and out by week" do
12
+ work_items = [@work_item1, @work_item2, @work_item3]
13
+ chart_data = Io.new.execute(work_items)
14
+ assert_hash_order_matters(chart_data, {"2013-1" => [3,2], "2013-2" => [0,1]})
15
+ end
16
+
17
+ it "should return in and out for a time range" do
18
+ work_items = [@work_item1, @work_item2, @work_item3]
19
+ chart_data = Io.new.execute(work_items, Date.parse("2013-01-03"), Date.parse("2013-01-04"))
20
+ assert_hash_order_matters(chart_data, {"2013-1" => [3,2]})
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ module KanbanMetrics
4
+ module Commands
5
+ describe IoView do
6
+ it "should print out the chart data in csv" do
7
+ chart_data = {"2013-01" => [1,0], "2013-02" => [1,1]}
8
+
9
+ STDOUT.should_receive(:puts).with("week, in, out")
10
+ STDOUT.should_receive(:puts).with("2013-01,1,0")
11
+ STDOUT.should_receive(:puts).with("2013-02,1,1")
12
+
13
+ IoView.new.render(chart_data)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ module KanbanMetrics
4
+ module Commands
5
+ describe Leadtime do
6
+ before(:each) do
7
+ @work_item1 = WorkItem.new({:committed => "2013-01-02", :delivered => "2013-01-05" })
8
+ @work_item2 = WorkItem.new({:committed => "2013-01-02", :delivered => "2013-01-02" })
9
+ @work_item3 = WorkItem.new({:committed => "2013-01-02", :delivered => "2013-01-04" })
10
+ end
11
+
12
+ it "should return distribution" do
13
+ work_items = [@work_item1, @work_item2, @work_item3]
14
+ chart_data = Leadtime.new.execute(work_items)
15
+ assert_hash_order_matters(chart_data, {1=>1, 3 => 2})
16
+ end
17
+
18
+ it "should leave out unfinished items from chart_data" do
19
+ work_item2 = WorkItem.new({:committed => "2013-01-02" })
20
+ work_items = [@work_item1, work_item2, @work_item3]
21
+ chart_data = Leadtime.new.execute(work_items, Date.parse("2013-01-02"), Date.parse("2013-01-05"))
22
+ assert_hash_order_matters(chart_data, {3 => 2})
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ module KanbanMetrics
4
+ module Commands
5
+ describe LeadtimeView do
6
+ it "should print out the chart data in csv" do
7
+ chart_data = {2 => 3, 3 => 4}
8
+
9
+ STDOUT.should_receive(:puts).with("2,3")
10
+ STDOUT.should_receive(:puts).with("3,4")
11
+
12
+ LeadtimeView.new.render(chart_data)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ module KanbanMetrics
4
+ describe CsvLoader do
5
+ it "should load work items from csv file" do
6
+ filename = "dummy.csv"
7
+ CSV.stub(:foreach).with(filename, {:force_quotes => true, :headers => true}).and_yield(
8
+ CSV::Row.new(["id","committed","done", "back count"],[], true)).and_yield(
9
+ CSV::Row.new(["id","committed","done", "back count"],["2", "2013-01-01", "2013-01-02", "0"], false))
10
+
11
+ work_items = CsvLoader.new.load(filename)
12
+
13
+ work_items.size.should eql(1)
14
+ work_items[0].committed.should eql(Date.parse("2013-01-01"))
15
+ work_items[0].back_count.should eql("0")
16
+ end
17
+
18
+ it "should skip empty cells" do
19
+ filename = "dummy.csv"
20
+ CSV.stub(:foreach).with(filename, {:force_quotes => true, :headers => true}).and_yield(
21
+ CSV::Row.new(["id","committed","done", "back count"],[], true)).and_yield(
22
+ CSV::Row.new(["id","committed","done", "back count"],["2", "", "2013-01-02", "0"], false))
23
+
24
+ work_items = CsvLoader.new.load(filename)
25
+ work_items[0].committed.should be_nil
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ module KanbanMetrics
4
+ describe DateHelper do
5
+ it "should return the number of weekdays (no weekends)" do
6
+ days = DateHelper.weekdays_in_date_range(Date.parse("2013-01-01")..Date.parse("2013-01-08"))
7
+ days.should eql(6)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ module KanbanMetrics
4
+ describe WorkItem do
5
+
6
+ before(:each) do
7
+ @work_item = WorkItem.new({:id => "id", :committed => "2011-05-18", :started => "2011-05-20", :finished => "2011-05-20", :type => "type"})
8
+ end
9
+
10
+ describe "#create" do
11
+ it "should store every detail" do
12
+ @work_item.id.should eql('id')
13
+ @work_item.committed.should eql(Date.parse('2011-05-18'))
14
+ @work_item.started.should eql(Date.parse('2011-05-20'))
15
+ @work_item.finished.should eql(Date.parse('2011-05-20'))
16
+ @work_item.type.should eql('type')
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ require 'kanban_metrics'
2
+ require 'rspec'
3
+
4
+ begin
5
+ require "debugger"
6
+ rescue LoadError
7
+ # most probably using 1.8
8
+ require "ruby-debug"
9
+ end
10
+
11
+ require 'open3'
12
+ def exec(command)
13
+ stdin, stdout, stderr = Open3.popen3("#{command}")
14
+ error = stderr.readlines.map {|line| line.chomp}.join("\n")
15
+ raise error unless error.empty?
16
+ stdout.readlines.map {|line| line.gsub(/\n/,"")}
17
+ end
18
+
19
+ def assert_hash_order_matters(hash1, hash2)
20
+ hash1.keys.to_a.flatten.should eql(hash2.keys.to_a.flatten)
21
+ hash1.should eql(hash2)
22
+ end
23
+
24
+ def fs_test_path
25
+ "test_data_public"
26
+ end
@@ -0,0 +1 @@
1
+ Dir.glob("spec/acceptance/steps/**/*_steps.rb") { |f| load f, true }
metadata ADDED
@@ -0,0 +1,163 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kanban_metrics
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Zsolt Fabok
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-09-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '2.12'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '2.12'
30
+ - !ruby/object:Gem::Dependency
31
+ name: turnip
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 1.1.0
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 1.1.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 10.0.3
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 10.0.3
62
+ - !ruby/object:Gem::Dependency
63
+ name: simplecov
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: 0.7.1
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: 0.7.1
78
+ description: A simple tool for processing data from the Kanban board (in csv) and
79
+ providing metrics
80
+ email: me@zsoltfabok.com
81
+ executables:
82
+ - kanban_metrics
83
+ extensions: []
84
+ extra_rdoc_files: []
85
+ files:
86
+ - .editorconfig
87
+ - .rspec
88
+ - LICENSE.md
89
+ - README.md
90
+ - bin/kanban_metrics
91
+ - kanban_metrics.gemspec
92
+ - lib/kanban_metrics.rb
93
+ - lib/kanban_metrics/chart_data_helper.rb
94
+ - lib/kanban_metrics/commands/cfd.rb
95
+ - lib/kanban_metrics/commands/cfd_view.rb
96
+ - lib/kanban_metrics/commands/io.rb
97
+ - lib/kanban_metrics/commands/io_view.rb
98
+ - lib/kanban_metrics/commands/leadtime.rb
99
+ - lib/kanban_metrics/commands/leadtime_view.rb
100
+ - lib/kanban_metrics/csv_loader.rb
101
+ - lib/kanban_metrics/date_helper.rb
102
+ - lib/kanban_metrics/version.rb
103
+ - lib/kanban_metrics/work_item.rb
104
+ - spec/acceptance/command_line.feature
105
+ - spec/acceptance/steps/command_line_steps.rb
106
+ - spec/kanban_metrics/chart_data_helper_spec.rb
107
+ - spec/kanban_metrics/commands/cfd_spec.rb
108
+ - spec/kanban_metrics/commands/cfd_view_spec.rb
109
+ - spec/kanban_metrics/commands/io_spec.rb
110
+ - spec/kanban_metrics/commands/io_view_spec.rb
111
+ - spec/kanban_metrics/commands/leadtime_spec.rb
112
+ - spec/kanban_metrics/commands/leadtime_view_spec.rb
113
+ - spec/kanban_metrics/csv_loader_spec.rb
114
+ - spec/kanban_metrics/date_helper_spec.rb
115
+ - spec/kanban_metrics/work_item_spec.rb
116
+ - spec/spec_helper.rb
117
+ - spec/turnip_helper.rb
118
+ homepage: https://github.com/ZsoltFabok/kanban_metrics
119
+ licenses:
120
+ - GPLv3
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ none: false
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ segments:
132
+ - 0
133
+ hash: 2875506641942411674
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ none: false
136
+ requirements:
137
+ - - ! '>='
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ segments:
141
+ - 0
142
+ hash: 2875506641942411674
143
+ requirements: []
144
+ rubyforge_project:
145
+ rubygems_version: 1.8.23
146
+ signing_key:
147
+ specification_version: 3
148
+ summary: kanban_metrics-0.1.0
149
+ test_files:
150
+ - spec/acceptance/command_line.feature
151
+ - spec/acceptance/steps/command_line_steps.rb
152
+ - spec/kanban_metrics/chart_data_helper_spec.rb
153
+ - spec/kanban_metrics/commands/cfd_spec.rb
154
+ - spec/kanban_metrics/commands/cfd_view_spec.rb
155
+ - spec/kanban_metrics/commands/io_spec.rb
156
+ - spec/kanban_metrics/commands/io_view_spec.rb
157
+ - spec/kanban_metrics/commands/leadtime_spec.rb
158
+ - spec/kanban_metrics/commands/leadtime_view_spec.rb
159
+ - spec/kanban_metrics/csv_loader_spec.rb
160
+ - spec/kanban_metrics/date_helper_spec.rb
161
+ - spec/kanban_metrics/work_item_spec.rb
162
+ - spec/spec_helper.rb
163
+ - spec/turnip_helper.rb