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.
@@ -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
|