kpi 0.4.1 → 0.5.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.
@@ -22,7 +22,7 @@ module KPI
22
22
  Enumerator.new do |yielder|
23
23
  self.class.defined_kpis.each do |kpi_method|
24
24
  result = send(kpi_method)
25
- yielder.yield(Entry.new(result[0], result[1], result[2]))
25
+ yielder.yield(Entry.new(*result))
26
26
  end
27
27
  end
28
28
  end
@@ -10,7 +10,7 @@ module KPI
10
10
  end
11
11
 
12
12
  def method_blacklisted?(name)
13
- not_kpi_methods.include?(name) || name =~ /_unmemoized_/
13
+ not_kpi_methods.include?(name) || name =~ /_unmemoized_/ || !self.instance_methods(true).map(&:to_sym).include?(name)
14
14
  end
15
15
 
16
16
  def blacklist(*methods)
@@ -0,0 +1,38 @@
1
+ module KPI
2
+ module Report
3
+ class Merged
4
+ def initialize(*args, &block)
5
+ raise ArgumentError, "Should have any argument" if args.length == 0
6
+ raise Exception unless block_given?
7
+ raise ArgumentError, "Argument must be the same type" unless args.map(&:class).uniq.size == 1
8
+
9
+ @reports ||= args
10
+ @compare = block
11
+ end
12
+
13
+ def entries
14
+ Enumerator.new do |yielder|
15
+ @reports.first.class.defined_kpis.each do |kpi_method|
16
+ result = self.send(kpi_method.to_sym)
17
+ yielder.yield(KPI::Entry.new(*result))
18
+ end
19
+ end
20
+ end
21
+
22
+ def title
23
+ self.class.name
24
+ end
25
+
26
+ def method_missing(name, *args)
27
+ result = @compare.call(*@reports.map(&name.to_sym))
28
+ [0,2].each do |i|
29
+ text = @reports.first.send(name.to_sym)[i]
30
+ result[i] = text ? result[i].gsub!("$$", text) : nil
31
+ end
32
+ result
33
+ end
34
+
35
+
36
+ end
37
+ end
38
+ end
data/test/test_helper.rb CHANGED
@@ -15,4 +15,5 @@ require File.join(File.dirname(__FILE__), '..', 'app/models/kpi/entry')
15
15
  require File.join(File.dirname(__FILE__), '..', 'app/models/kpi/report/dynamic_definitions')
16
16
  require File.join(File.dirname(__FILE__), '..', 'app/models/kpi/report/suppress_memoization')
17
17
  require File.join(File.dirname(__FILE__), '..', 'app/models/kpi/report/base')
18
+ require File.join(File.dirname(__FILE__), '..', 'app/models/kpi/report/merged')
18
19
 
@@ -1,19 +1,32 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../../test_helper')
2
2
 
3
- class TestKpi < KPI::Report::Base
4
- def test_kpi
5
- return ["title", 1, "description"]
6
- end
3
+ describe "KPI::Report::Base" do
4
+ before do
5
+ class TestKpi < KPI::Report::Base
6
+ def test_kpi
7
+ return ["title", 1, "description"]
8
+ end
7
9
 
8
- def another_kpi
9
- return ["another title", 0]
10
+ def another_kpi
11
+ return ["another title", 0]
12
+ end
13
+ end
10
14
  end
11
- end
12
15
 
13
- describe "KPI::Report::Base" do
16
+ after { Object.send(:remove_const, :TestKpi) }
17
+
14
18
  it "should define indicators" do
15
19
  assert_equal [:test_kpi, :another_kpi], TestKpi.defined_kpis
16
20
  end
21
+
22
+ it "should not define indicator from private method" do
23
+ class TestKpi
24
+ private
25
+ def not_kpi
26
+ end
27
+ end
28
+ assert !TestKpi.defined_kpis.include?(:not_kpi)
29
+ end
17
30
 
18
31
  describe :collect! do
19
32
  before { @kpi = TestKpi.new }
@@ -51,4 +64,4 @@ describe "KPI::Report::Base" do
51
64
  assert_equal "TestKpi", TestKpi.new.title
52
65
  end
53
66
  end
54
- end
67
+ end
@@ -0,0 +1,100 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../test_helper')
2
+
3
+ describe "KPI::Report::Merged" do
4
+
5
+ before do
6
+ class TestKpi < KPI::Report::Base
7
+ def initialize return_value = 1
8
+ super()
9
+ @return = return_value
10
+ end
11
+
12
+ def test_kpi
13
+ return ["title", @return, "description"]
14
+ end
15
+
16
+ def test_kpi_2
17
+ return ["title 2 ", @return*2]
18
+ end
19
+ end
20
+ class AnotherReport < KPI::Report::Base
21
+ end
22
+ end
23
+
24
+ after do
25
+ Object.send(:remove_const, :TestKpi)
26
+ Object.send(:remove_const, :AnotherReport)
27
+ end
28
+
29
+ describe "when initializing" do
30
+ it "should initialize with list of KPI::Report::Base objects and block" do
31
+ KPI::Report::Merged.new(TestKpi.new) {}
32
+ KPI::Report::Merged.new(TestKpi.new,TestKpi.new) {}
33
+ KPI::Report::Merged.new(TestKpi.new,TestKpi.new,TestKpi.new) {}
34
+ end
35
+
36
+ it "should require at least one element when initializing" do
37
+ assert_raises(ArgumentError) do
38
+ KPI::Report::Merged.new() {}
39
+ end
40
+ end
41
+
42
+ it "should require objects of the same type when initializing" do
43
+ assert_raises(ArgumentError) do
44
+ KPI::Report::Merged.new(TestKpi.new,AnotherReport.new) {}
45
+ end
46
+ end
47
+
48
+ it "should require block when initializing" do
49
+ assert_raises(Exception) do
50
+ KPI::Report::Merged.new(TestKpi.new)
51
+ end
52
+ end
53
+ end
54
+
55
+ describe "when two reports given for average" do
56
+ before do
57
+ report1 = TestKpi.new(2)
58
+ report2 = TestKpi.new(8)
59
+
60
+ @average = KPI::Report::Merged.new(report1, report2) do |*entries|
61
+ average = entries.map{|e| KPI::Entry.new(*e).value }.sum / entries.size
62
+ ["Average $$", average, "$$ (average)"]
63
+ end
64
+ end
65
+
66
+ it "should calculate value using block given in initializer when asking for KPI" do
67
+ assert_equal 5, @average.test_kpi[1]
68
+ end
69
+
70
+ it "should change $$ in title to indicator title" do
71
+ assert_equal "Average title", @average.test_kpi[0]
72
+ end
73
+
74
+ it "should change $$ in description to indicator descripiton" do
75
+ assert_equal "description (average)", @average.test_kpi[2]
76
+ end
77
+
78
+ it "should return nil description when no description" do
79
+ assert_nil @average.test_kpi_2[2]
80
+ end
81
+
82
+ describe "entries" do
83
+ it "should return enumerator with entries" do
84
+ assert_kind_of Enumerable, @average.entries
85
+ end
86
+
87
+ it "should pack average entries to enumerator" do
88
+ assert @average.entries.all? { |e| e.instance_of?(KPI::Entry) }
89
+ end
90
+
91
+ it "should have each average entry for each indicator" do
92
+ assert_equal TestKpi.defined_kpis.size, @average.entries.to_a.size
93
+ end
94
+
95
+ it "should calculate averages for each indicator" do
96
+ assert_equal [5,10], @average.entries.map(&:value)
97
+ end
98
+ end
99
+ end
100
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: kpi
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.4.1
5
+ version: 0.5.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Artur Roszczyk
@@ -92,6 +92,7 @@ files:
92
92
  - app/models/kpi/entry.rb
93
93
  - app/models/kpi/report/base.rb
94
94
  - app/models/kpi/report/dynamic_definitions.rb
95
+ - app/models/kpi/report/merged.rb
95
96
  - app/models/kpi/report/suppress_memoization.rb
96
97
  - lib/engine.rb
97
98
  - lib/generators/kpi/USAGE
@@ -103,6 +104,7 @@ files:
103
104
  - README.rdoc
104
105
  - test/test_helper.rb
105
106
  - test/unit/kpi/report/base_test.rb
107
+ - test/unit/kpi/report/merged_test.rb
106
108
  has_rdoc: true
107
109
  homepage: http://github.com/sevos/kpi
108
110
  licenses:
@@ -117,7 +119,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
117
119
  requirements:
118
120
  - - ">="
119
121
  - !ruby/object:Gem::Version
120
- hash: -3262081361924611010
122
+ hash: -2742020933560976689
121
123
  segments:
122
124
  - 0
123
125
  version: "0"
@@ -137,3 +139,4 @@ summary: Key Performance Indicators for Rails 3.x
137
139
  test_files:
138
140
  - test/test_helper.rb
139
141
  - test/unit/kpi/report/base_test.rb
142
+ - test/unit/kpi/report/merged_test.rb