kpi_manager 0.1.0.pre → 0.2.0.pre

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 985c3aca449032e19dd3a05f7e2d487294c5672d
4
- data.tar.gz: 6bf47a080c73fcace81ae070bbb45c418e48d5b2
3
+ metadata.gz: 3c8f55cc566b14da16121391756278ad78e4e884
4
+ data.tar.gz: caed2e8541f8f30178830b7c9303fcf76228b5b3
5
5
  SHA512:
6
- metadata.gz: 88c32c4ebc9a5879f4f3c2760b750aa2575a3c4ca27699234ac3ae37b9f33351596996549ce10bc938880abb93f031d0e619b6cf4b3463d2b12e5c132ceb7d48
7
- data.tar.gz: e506c3ae26086b59c5a14a95e7b5f1efcb650ad04c124990812d8940c257070f63ae97f747375be92e963d6de224384dde6a7ad3ba638853f012627be8fa8506
6
+ metadata.gz: 3dfc53eaa8809ebc952bb8981a8af9a84ee36b1d834610768d332c80ac9e04e4edd293aa9671e6abc9eecdeefdb0ebcbc74dea8ef7c090e65afe31f7c77e8629
7
+ data.tar.gz: c05ad8ad69f2c24ce65cfc6fd5a94552566ae27d28a40d12daf222bf66948a8e8340afbc9a686ea8ac88c89d0d311a9eb37cd3e2daf8d2e5ee7c6e9d15467993
File without changes
File without changes
@@ -10,6 +10,8 @@ module KpiManager
10
10
  @to = to || Time.zone.now
11
11
  @report = []
12
12
 
13
+ @datacache.clear
14
+
13
15
  registered_kpis.each do |kpi_name, kpi_data|
14
16
  @report << [
15
17
  kpi_data[:label],
@@ -21,7 +23,35 @@ module KpiManager
21
23
  ]
22
24
  end
23
25
 
24
- @report
26
+ rr = KpiManager::ReportingResult.new(@report)
27
+ rr.from = @from
28
+ rr.to = @to
29
+ rr
30
+ end
31
+
32
+ def compare(from, to)
33
+ @from = from
34
+ @to = to
35
+ self
36
+ end
37
+
38
+ def with(oth_from, oth_to)
39
+ raise RuntimeError, 'No date range set' unless @from && @to
40
+
41
+ left = self.generate(@from, @to).results
42
+ right = self.generate(oth_from, oth_to).results
43
+
44
+ res = left.zip(right).map do |left, right|
45
+ [
46
+ left[0],
47
+ (right[1].to_f - left[1].to_f) / left[1].to_f * 100
48
+ ]
49
+ end
50
+
51
+ rr = KpiManager::ReportingResult.new(res)
52
+ rr.from = oth_from - @from
53
+ rr.to = oth_to - @to
54
+ rr
25
55
  end
26
56
 
27
57
  private
@@ -0,0 +1,24 @@
1
+ module KpiManager
2
+ class ReportingResult
3
+ attr_accessor :results, :from, :to
4
+
5
+ def initialize(table)
6
+ @results = table
7
+ end
8
+
9
+ def -(other)
10
+ left = self.results
11
+ right = other.results
12
+ res = left.zip(right).map do |left, right|
13
+ [
14
+ left[0],
15
+ (right[1].to_f - left[1].to_f) / left[1].to_f * 100
16
+ ]
17
+ end
18
+ rr = KpiManager::ReportingResult.new(res)
19
+ rr.from = other.from - self.from
20
+ rr.to = other.to - self.to
21
+ rr
22
+ end
23
+ end
24
+ end
@@ -1,3 +1,3 @@
1
1
  module KpiManager
2
- VERSION = '0.1.0.pre'.freeze
2
+ VERSION = '0.2.0.pre'.freeze
3
3
  end
data/lib/kpi_manager.rb CHANGED
@@ -3,9 +3,10 @@ require 'kpi_manager/engine'
3
3
  module KpiManager # :nodoc:
4
4
  end
5
5
 
6
- require 'kpi_manager/dataset'
7
- require 'kpi_manager/kpi'
8
- require 'kpi_manager/report'
6
+ require 'kpi_manager/models/dataset'
7
+ require 'kpi_manager/models/kpi'
8
+ require 'kpi_manager/models/reporting_result'
9
+ require 'kpi_manager/models/report'
9
10
 
10
11
  require 'rails/generators'
11
12
  require 'kpi_manager/generators/kpi_manager_generator'
data/spec/spec_helper.rb CHANGED
@@ -2,6 +2,7 @@ RSpec.configure do |config|
2
2
  require 'simplecov'
3
3
  SimpleCov.start do
4
4
  add_filter '/spec/'
5
+ add_filter '/lib/kpi_manager/generators/'
5
6
  end
6
7
 
7
8
  config.expect_with :rspec do |expectations|
@@ -12,6 +13,10 @@ RSpec.configure do |config|
12
13
  mocks.verify_partial_doubles = true
13
14
  end
14
15
 
16
+ require 'factory_girl_rails'
17
+ require 'faker'
18
+ config.include FactoryGirl::Syntax::Methods
19
+
15
20
  config.shared_context_metadata_behavior = :apply_to_host_groups
16
21
 
17
22
  config.filter_run_when_matching :focus
@@ -19,3 +19,12 @@ end
19
19
  KpiManager::Kpi.add(:average_order, 'Average order', dataset: :bills, references: [:total_earned]) do |dataset, **refs|
20
20
  dataset.count.zero? ? 0 : refs[:total_earned] / dataset.count
21
21
  end
22
+
23
+ KpiManager::Kpi.add(:promotion_used, 'Promotion used', dataset: :bills) do |dataset, **refs|
24
+ dataset.where.not(promotion: nil).count
25
+ end
26
+
27
+ KpiManager::Kpi.add(:average_promotion, 'Average promotion', dataset: :bills) do |dataset, **refs|
28
+ sum = dataset.where.not(promotion: nil).inject(0) { |acc, elem| acc + elem.promotion.percentage }
29
+ dataset.count.zero? ? 0 : sum / dataset.count
30
+ end
@@ -0,0 +1,7 @@
1
+ FactoryGirl.define do
2
+ factory :car do
3
+ brand Faker::Vehicle.manufacture
4
+ model Faker::Commerce.product_name
5
+ price Faker::Commerce.price
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ FactoryGirl.define do
2
+ factory :user do
3
+ firstname Faker::Name.first_name
4
+ lastname Faker::Name.last_name
5
+ email Faker::Internet.email
6
+ birthdate Faker::Date.between(20.years.ago, 10.years.ago)
7
+ created_at Faker::Date.between(2.hours.ago, 10.minutes.ago)
8
+ end
9
+ end
@@ -2,36 +2,80 @@ require 'spec_helper'
2
2
  require 'rails_helper'
3
3
 
4
4
  RSpec.describe KpiManager::Report, :type => :model do
5
- it 'generates a report' do
6
- p206 = Car.create(brand: 'Peugot', model: '206', price: 9890.90)
7
- zoe = Car.create(brand: 'Renault', model: 'Zoé', price: 12500)
8
-
9
- hugo = User.create(
10
- firstname: 'Hugo',
11
- lastname: 'Chevalier',
12
- email: 'email@gmail.com',
13
- birthdate: Date.parse('1989-05-01')
14
- )
15
-
16
- drakhaine = User.create(
17
- firstname: 'Drakhaine',
18
- lastname: 'Arakhnide',
19
- email: 'email@gmail.com',
20
- birthdate: Date.parse('1989-04-24')
21
- )
22
-
23
- hugo.buy_car(p206)
24
- drakhaine.buy_car(zoe, Promotion.create(percentage: 10))
25
-
26
- report = KpiManager::Report.create(name: 'My first report')
27
- report.kpis.create(slug: 'users_count')
28
- report.kpis.create(slug: 'total_earned')
29
- report.kpis.create(slug: 'average_order')
5
+ before(:all) do
6
+ car1 = create(:car, price: 1000.00)
7
+ car2 = create(:car, price: 2000.00)
8
+
9
+ user1 = create(:user, created_at: 10.minutes.ago)
10
+ user2 = create(:user, created_at: 3.minutes.ago)
11
+ old_user = create(:user, created_at: 35.days.ago)
12
+
13
+ old_user.buy_car(car1, Promotion.create(percentage: 30))
14
+ old_user.orders.last.update(created_at: 33.days.ago)
15
+
16
+ user1.buy_car(car1)
17
+ user2.buy_car(car2, Promotion.create(percentage: 10))
18
+
19
+ @report = KpiManager::Report.create(name: 'My first report')
20
+ @report.kpis.create(slug: 'users_count')
21
+ @report.kpis.create(slug: 'total_earned')
22
+ @report.kpis.create(slug: 'average_order')
23
+ @report.kpis.create(slug: 'promotion_used')
24
+ @report.kpis.create(slug: 'average_promotion')
25
+ end
26
+
27
+ it 'generates a report for previous month' do
28
+ # Last month
29
+ expectancy = [
30
+ ["Subscribed users", 1],
31
+ ["Total earned", 700.00],
32
+ ["Average order", 700.00],
33
+ ["Promotion used", 1],
34
+ ["Average promotion", 30]
35
+ ]
36
+ report = @report.generate(60.days.ago, 31.days.ago)
37
+ expect(report.results).to eql(expectancy)
38
+ end
39
+
40
+ it 'generates a report for current month' do
41
+ # Current month
30
42
  expectancy = [
31
43
  ["Subscribed users", 2],
32
- ["Total earned", 21140.9],
33
- ["Average order", 10570.45]
44
+ ["Total earned", 2800.00],
45
+ ["Average order", 1400.00],
46
+ ["Promotion used", 1],
47
+ ["Average promotion", 5]
34
48
  ]
35
- expect(report.generate(Date.yesterday)).to eql(expectancy)
49
+ report = @report.generate(30.days.ago)
50
+ expect(report.results).to eql(expectancy)
51
+ end
52
+
53
+ context 'generating a diff' do
54
+ it 'works with compare().with()' do
55
+ # Diff
56
+ expectancy = [
57
+ ["Subscribed users", 100.0],
58
+ ["Total earned", 300.00],
59
+ ["Average order", 100.00],
60
+ ["Promotion used", 0.0],
61
+ ["Average promotion", -83.33333333333334]
62
+ ]
63
+ report = @report.compare(60.days.ago, 31.days.ago).with(30.days.ago, Time.zone.now)
64
+ expect(report.results).to eql(expectancy)
65
+ end
66
+
67
+ it 'works when subtracting two report results' do
68
+ # Diff
69
+ expectancy = [
70
+ ["Subscribed users", 100.0],
71
+ ["Total earned", 300.00],
72
+ ["Average order", 100.00],
73
+ ["Promotion used", 0.0],
74
+ ["Average promotion", -83.33333333333334]
75
+ ]
76
+ report1 = @report.generate(60.days.ago, 31.days.ago)
77
+ report2 = @report.generate(30.days.ago, Time.zone.now)
78
+ expect((report1 - report2).results).to eql(expectancy)
79
+ end
36
80
  end
37
81
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kpi_manager
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre
4
+ version: 0.2.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hugo Chevalier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-16 00:00:00.000000000 Z
11
+ date: 2016-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -94,6 +94,34 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '3.5'
97
+ - !ruby/object:Gem::Dependency
98
+ name: factory_girl_rails
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 4.8.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 4.8.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: faker
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 1.7.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 1.7.0
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: simplecov
99
127
  requirement: !ruby/object:Gem::Requirement
@@ -136,7 +164,11 @@ dependencies:
136
164
  - - "~>"
137
165
  - !ruby/object:Gem::Version
138
166
  version: 0.46.0
139
- description: Description of KpiManager.
167
+ description: |2
168
+ KpiManager allows to create reports from a back-office.
169
+ KPIs must be defined in the code before they're available in reports editor.
170
+ On v1.0.0, it will be possible to schedule recurrent reporting by email
171
+ and to create report-tied dashboards displaying widgets for each of your KPIs.
140
172
  email:
141
173
  - drakhaine@gmail.com
142
174
  executables: []
@@ -153,15 +185,16 @@ files:
153
185
  - app/views/layouts/kpi_manager/application.html.erb
154
186
  - config/routes.rb
155
187
  - lib/kpi_manager.rb
156
- - lib/kpi_manager/dashboard.rb
157
- - lib/kpi_manager/dataset.rb
158
188
  - lib/kpi_manager/engine.rb
159
189
  - lib/kpi_manager/generators/kpi_manager_generator.rb
160
190
  - lib/kpi_manager/generators/templates/dashboard_migration.rb
161
191
  - lib/kpi_manager/generators/templates/kpi_migration.rb
162
192
  - lib/kpi_manager/generators/templates/report_migration.rb
163
- - lib/kpi_manager/kpi.rb
164
- - lib/kpi_manager/report.rb
193
+ - lib/kpi_manager/models/dashboard.rb
194
+ - lib/kpi_manager/models/dataset.rb
195
+ - lib/kpi_manager/models/kpi.rb
196
+ - lib/kpi_manager/models/report.rb
197
+ - lib/kpi_manager/models/reporting_result.rb
165
198
  - lib/kpi_manager/version.rb
166
199
  - lib/tasks/kpi_manager_tasks.rake
167
200
  - spec/rails_helper.rb
@@ -196,8 +229,10 @@ files:
196
229
  - spec/test_app/db/migrate/20170116205701_create_kpi_manager_report.rb
197
230
  - spec/test_app/db/migrate/20170116205702_create_kpi_manager_kpi.rb
198
231
  - spec/test_app/db/schema.rb
232
+ - spec/test_app/spec/factories/car.rb
233
+ - spec/test_app/spec/factories/user.rb
199
234
  - spec/test_app/spec/kpi_manager_spec.rb
200
- homepage: https://rubygems.org/kpi_manager
235
+ homepage: https://github.com/hchevalier/kpi_manager
201
236
  licenses:
202
237
  - MIT
203
238
  metadata: {}
@@ -220,7 +255,7 @@ rubyforge_project:
220
255
  rubygems_version: 2.4.8
221
256
  signing_key:
222
257
  specification_version: 4
223
- summary: Summary of KpiManager.
258
+ summary: Create recurrent reports from KPIs.
224
259
  test_files:
225
260
  - spec/rails_helper.rb
226
261
  - spec/spec_helper.rb
@@ -254,4 +289,6 @@ test_files:
254
289
  - spec/test_app/db/migrate/20170116205701_create_kpi_manager_report.rb
255
290
  - spec/test_app/db/migrate/20170116205702_create_kpi_manager_kpi.rb
256
291
  - spec/test_app/db/schema.rb
292
+ - spec/test_app/spec/factories/car.rb
293
+ - spec/test_app/spec/factories/user.rb
257
294
  - spec/test_app/spec/kpi_manager_spec.rb