kpi 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
@@ -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
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
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
|
-
|
9
|
-
|
10
|
+
def another_kpi
|
11
|
+
return ["another title", 0]
|
12
|
+
end
|
13
|
+
end
|
10
14
|
end
|
11
|
-
end
|
12
15
|
|
13
|
-
|
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.
|
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: -
|
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
|