kpi 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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