bidu-house 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +20 -4
- data/README.md +4 -4
- data/house.gemspec +2 -1
- data/lib/bidu/house.rb +3 -2
- data/lib/bidu/house/concern.rb +1 -1
- data/lib/bidu/house/report.rb +7 -0
- data/lib/bidu/house/report/error.rb +78 -0
- data/lib/bidu/house/report_builder.rb +7 -4
- data/lib/bidu/house/report_config.rb +37 -0
- data/lib/bidu/house/version.rb +1 -1
- data/spec/lib/bidu/house/{error_report_spec.rb → report/error_spec.rb} +140 -6
- data/spec/lib/bidu/house/report/report_config_spec.rb +39 -0
- data/spec/lib/bidu/house/report_builder_spec.rb +2 -2
- data/spec/lib/bidu/house/status_spec.rb +3 -3
- data/spec/spec_helper.rb +6 -1
- data/spec/support/models/document.rb +2 -0
- data/spec/support/report/dummy.rb +17 -0
- data/spec/support/schema.rb +1 -0
- metadata +23 -7
- data/lib/active_record/relation_ext.rb +0 -19
- data/lib/bidu/house/error_report.rb +0 -51
- data/spec/lib/active_record/relation_spec.rb +0 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25cc0841110cb3f8c649f8a42343f80736c1c910
|
4
|
+
data.tar.gz: e9ef4b32c0651fe1400d053d38ffae6a3a385b27
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e52af0063573133cffdb10b444a236a6081559622b4af79f0bd10227011a73ebdcf11ec6ca296504952d560afe53990428788f3cc9606c2cd2529c4f31d15bc
|
7
|
+
data.tar.gz: 6aa8cfde4107f3a1d4a50fc5aa937a06a672dfd8b8ef95531a5e91a4708987350728120aae37ba5733451b06fb8c7d8541eb32345c8c2468fdbd838e36c24f55
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
bidu-house (0.
|
4
|
+
bidu-house (0.2.0)
|
5
5
|
activesupport
|
6
|
-
bidu-
|
6
|
+
bidu-active_ext
|
7
7
|
concern_builder
|
8
8
|
json_parser (~> 1.1)
|
9
9
|
|
@@ -24,10 +24,14 @@ GEM
|
|
24
24
|
thread_safe (~> 0.3, >= 0.3.4)
|
25
25
|
tzinfo (~> 1.1)
|
26
26
|
arel (6.0.0)
|
27
|
-
bidu-
|
27
|
+
bidu-active_ext (1.0.0)
|
28
|
+
activesupport
|
29
|
+
bidu-core_ext
|
30
|
+
bidu-core_ext (1.2.0)
|
28
31
|
activesupport
|
29
32
|
builder (3.2.2)
|
30
|
-
|
33
|
+
coderay (1.1.0)
|
34
|
+
concern_builder (0.0.2)
|
31
35
|
activesupport
|
32
36
|
diff-lcs (1.2.5)
|
33
37
|
docile (1.1.5)
|
@@ -36,7 +40,14 @@ GEM
|
|
36
40
|
json_parser (1.1.0)
|
37
41
|
activesupport
|
38
42
|
concern_builder
|
43
|
+
method_source (0.8.2)
|
39
44
|
minitest (5.7.0)
|
45
|
+
pry (0.10.1)
|
46
|
+
coderay (~> 1.1.0)
|
47
|
+
method_source (~> 0.8.1)
|
48
|
+
slop (~> 3.4)
|
49
|
+
pry-nav (0.2.4)
|
50
|
+
pry (>= 0.9.10, < 0.11.0)
|
40
51
|
rake (10.4.2)
|
41
52
|
rspec (2.99.0)
|
42
53
|
rspec-core (~> 2.99.0)
|
@@ -51,6 +62,7 @@ GEM
|
|
51
62
|
json (~> 1.8)
|
52
63
|
simplecov-html (~> 0.10.0)
|
53
64
|
simplecov-html (0.10.0)
|
65
|
+
slop (3.6.0)
|
54
66
|
sqlite3 (1.3.10)
|
55
67
|
thread_safe (0.3.5)
|
56
68
|
tzinfo (1.2.2)
|
@@ -63,7 +75,11 @@ DEPENDENCIES
|
|
63
75
|
activerecord
|
64
76
|
bidu-house!
|
65
77
|
bundler (~> 1.6)
|
78
|
+
pry-nav
|
66
79
|
rake
|
67
80
|
rspec (~> 2.14)
|
68
81
|
simplecov
|
69
82
|
sqlite3
|
83
|
+
|
84
|
+
BUNDLED WITH
|
85
|
+
1.10.6
|
data/README.md
CHANGED
@@ -6,10 +6,10 @@ report and making it avaliable in a controller
|
|
6
6
|
|
7
7
|
Getting started
|
8
8
|
---------------
|
9
|
-
1. Add
|
9
|
+
1. Add House to your `Gemfile` and `bundle install`:
|
10
10
|
|
11
11
|
```ruby
|
12
|
-
gem '
|
12
|
+
gem 'bidu-house'
|
13
13
|
```
|
14
14
|
|
15
15
|
|
@@ -51,7 +51,7 @@ with error and render the report
|
|
51
51
|
- period: default search period (default: 1 day)
|
52
52
|
- on: report bucket (default: :default)
|
53
53
|
|
54
|
-
|
54
|
+
4. Run the server and hit the health-check routes
|
55
55
|
|
56
56
|
```
|
57
57
|
wget http://localhost:3000/health-check/status
|
@@ -62,4 +62,4 @@ with error and render the report
|
|
62
62
|
```
|
63
63
|
wget http://localhost:3000/health-check/status?period=3.days&threshold=0.005
|
64
64
|
wget http://localhost:3000/health-check/late-status?period=1.hours&threshold=0.1
|
65
|
-
```
|
65
|
+
```
|
data/house.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |gem|
|
|
19
19
|
|
20
20
|
gem.add_runtime_dependency 'activesupport'
|
21
21
|
gem.add_runtime_dependency 'concern_builder'
|
22
|
-
gem.add_runtime_dependency 'bidu-
|
22
|
+
gem.add_runtime_dependency 'bidu-active_ext'
|
23
23
|
gem.add_runtime_dependency 'json_parser', '~> 1.1'
|
24
24
|
|
25
25
|
gem.add_development_dependency "activerecord"
|
@@ -28,5 +28,6 @@ Gem::Specification.new do |gem|
|
|
28
28
|
gem.add_development_dependency "bundler", "~> 1.6"
|
29
29
|
gem.add_development_dependency "rake"
|
30
30
|
gem.add_development_dependency "rspec", "~> 2.14"
|
31
|
+
gem.add_development_dependency 'pry-nav'
|
31
32
|
gem.add_development_dependency 'simplecov'
|
32
33
|
end
|
data/lib/bidu/house.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'bidu/active_ext'
|
2
2
|
require 'concern_builder'
|
3
3
|
require 'bidu/core_ext'
|
4
4
|
require 'bidu/period_parser'
|
@@ -8,7 +8,8 @@ require 'json_parser/type_cast_ext'
|
|
8
8
|
module Bidu
|
9
9
|
module House
|
10
10
|
require 'bidu/house/concern'
|
11
|
-
require 'bidu/house/
|
11
|
+
require 'bidu/house/report_config'
|
12
|
+
require 'bidu/house/report'
|
12
13
|
require 'bidu/house/status'
|
13
14
|
require 'bidu/house/report_builder'
|
14
15
|
require 'bidu/house/status_builder'
|
data/lib/bidu/house/concern.rb
CHANGED
@@ -0,0 +1,78 @@
|
|
1
|
+
module Bidu
|
2
|
+
module House
|
3
|
+
module Report
|
4
|
+
class Error
|
5
|
+
include JsonParser
|
6
|
+
|
7
|
+
ALLOWED_PARAMETERS=[:period, :threshold]
|
8
|
+
|
9
|
+
attr_reader :json
|
10
|
+
|
11
|
+
json_parse :threshold, type: :float
|
12
|
+
json_parse :period, type: :period
|
13
|
+
json_parse :scope, :id, :clazz, :base_scope, :external_key, case: :snake
|
14
|
+
|
15
|
+
def initialize(options)
|
16
|
+
@json = {
|
17
|
+
external_key: :id,
|
18
|
+
threshold: 0.02,
|
19
|
+
period: 1.day,
|
20
|
+
scope: :with_error,
|
21
|
+
base_scope: :all
|
22
|
+
}.merge(options)
|
23
|
+
end
|
24
|
+
|
25
|
+
def status
|
26
|
+
@status ||= error? ? :error : :ok
|
27
|
+
end
|
28
|
+
|
29
|
+
def percentage
|
30
|
+
@percentage ||= fetch_percentage
|
31
|
+
end
|
32
|
+
|
33
|
+
def scoped
|
34
|
+
@scoped ||= fetch_scoped(last_entries, scope)
|
35
|
+
end
|
36
|
+
|
37
|
+
def error?
|
38
|
+
percentage > threshold
|
39
|
+
end
|
40
|
+
|
41
|
+
def as_json
|
42
|
+
{
|
43
|
+
ids: scoped.pluck(external_key),
|
44
|
+
percentage: percentage
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def fetch_percentage
|
51
|
+
if (scope.is_a?(Symbol))
|
52
|
+
last_entries.percentage(*(scope.to_s.split('.').map(&:to_sym)))
|
53
|
+
else
|
54
|
+
last_entries.percentage(scope)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def fetch_scoped(base, scope)
|
59
|
+
if (scope.is_a?(Symbol))
|
60
|
+
scope.to_s.split('.').inject(base) do |entries, method|
|
61
|
+
entries.public_send(method)
|
62
|
+
end
|
63
|
+
else
|
64
|
+
base.where(scope)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def last_entries
|
69
|
+
@last_entries ||= base.where('updated_at >= ?', period.seconds.ago)
|
70
|
+
end
|
71
|
+
|
72
|
+
def base
|
73
|
+
fetch_scoped(clazz, base_scope)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -2,17 +2,20 @@ module Bidu
|
|
2
2
|
module House
|
3
3
|
class ReportBuilder
|
4
4
|
def build(key, parameters = {})
|
5
|
-
|
6
|
-
config
|
7
|
-
Bidu::House::ErrorReport.new(config)
|
5
|
+
config = config_for(key)
|
6
|
+
config.build(parameters)
|
8
7
|
end
|
9
8
|
|
10
9
|
def add_config(key, config)
|
11
|
-
configs[key] = config
|
10
|
+
configs[key] = Bidu::House::ReportConfig.new(config)
|
12
11
|
end
|
13
12
|
|
14
13
|
private
|
15
14
|
|
15
|
+
def config_for(key)
|
16
|
+
configs[key]
|
17
|
+
end
|
18
|
+
|
16
19
|
def configs
|
17
20
|
@configs ||= {}
|
18
21
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Bidu
|
2
|
+
module House
|
3
|
+
class ReportConfig
|
4
|
+
attr_accessor :config
|
5
|
+
|
6
|
+
delegate :[], :[]=, :merge, to: :config
|
7
|
+
|
8
|
+
def initialize(config)
|
9
|
+
@config = config
|
10
|
+
end
|
11
|
+
|
12
|
+
def build(parameters)
|
13
|
+
params = slice_parameters(parameters)
|
14
|
+
report_class.new(config.merge(params))
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def type
|
20
|
+
self[:type] ||= :error
|
21
|
+
end
|
22
|
+
|
23
|
+
def report_class
|
24
|
+
return type if type.is_a?(Class)
|
25
|
+
@report_class ||= Bidu::House::Report.const_get(type.to_s.camelize)
|
26
|
+
end
|
27
|
+
|
28
|
+
def slice_parameters(parameters)
|
29
|
+
parameters.slice(*allowed_parameters)
|
30
|
+
end
|
31
|
+
|
32
|
+
def allowed_parameters
|
33
|
+
report_class::ALLOWED_PARAMETERS
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/bidu/house/version.rb
CHANGED
@@ -1,29 +1,37 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Bidu::House::
|
3
|
+
describe Bidu::House::Report::Error do
|
4
4
|
let(:errors) { 1 }
|
5
5
|
let(:successes) { 1 }
|
6
6
|
let(:old_errors) { 2 }
|
7
7
|
let(:threshold) { 0.02 }
|
8
8
|
let(:period) { 1.day }
|
9
9
|
let(:external_key) { :external_id }
|
10
|
+
let(:scope) { :with_error }
|
11
|
+
let(:base_scope) { :all }
|
10
12
|
let(:options) do
|
11
13
|
{
|
12
14
|
period: period,
|
13
15
|
threshold: threshold,
|
14
|
-
scope:
|
16
|
+
scope: scope,
|
17
|
+
base_scope: base_scope,
|
15
18
|
clazz: Document,
|
16
19
|
external_key: external_key
|
17
20
|
}
|
18
21
|
end
|
19
22
|
let(:subject) { described_class.new(options) }
|
23
|
+
let(:types) { [:a] }
|
20
24
|
before do
|
21
25
|
Document.all.each(&:destroy)
|
22
|
-
|
23
|
-
|
24
|
-
|
26
|
+
types.each do |type|
|
27
|
+
successes.times { Document.create status: :success, doc_type: type }
|
28
|
+
errors.times do |i|
|
29
|
+
Document.create status: :error, external_id: 10 * successes + i, outter_external_id: i, doc_type: type
|
30
|
+
end
|
31
|
+
old_errors.times do
|
32
|
+
Document.create status: :error, created_at: 2.days.ago, updated_at: 2.days.ago, doc_type: type
|
33
|
+
end
|
25
34
|
end
|
26
|
-
old_errors.times { Document.create status: :error, created_at: 2.days.ago, updated_at: 2.days.ago }
|
27
35
|
end
|
28
36
|
|
29
37
|
describe '#status' do
|
@@ -108,6 +116,68 @@ describe Bidu::House::ErrorReport do
|
|
108
116
|
end
|
109
117
|
end
|
110
118
|
end
|
119
|
+
|
120
|
+
context 'when configuring with a complex scope' do
|
121
|
+
let(:types) { [:a, :b] }
|
122
|
+
let(:old_errors) { 0 }
|
123
|
+
let(:scope) { :'with_error.type_b' }
|
124
|
+
let(:errors) { 1 }
|
125
|
+
let(:successes) { 3 }
|
126
|
+
context 'as symbol' do
|
127
|
+
let(:scope) { :'with_error.type_b' }
|
128
|
+
|
129
|
+
it 'fetches from each scope in order' do
|
130
|
+
expect(subject.percentage).to eq(0.125)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'as string where scope' do
|
135
|
+
let(:scope) { "status = 'error' and doc_type = 'b'" }
|
136
|
+
|
137
|
+
it 'fetches from each scope in order' do
|
138
|
+
expect(subject.percentage).to eq(0.125)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context 'as hash where scope' do
|
143
|
+
let(:scope) { { status: :error, doc_type: :b } }
|
144
|
+
|
145
|
+
it 'fetches from each scope in order' do
|
146
|
+
expect(subject.percentage).to eq(0.125)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
context 'when using a base scope' do
|
152
|
+
let(:types) { [:a, :b, :b, :b] }
|
153
|
+
let(:old_errors) { 0 }
|
154
|
+
let(:errors) { 1 }
|
155
|
+
let(:successes) { 3 }
|
156
|
+
|
157
|
+
context 'as symbol' do
|
158
|
+
let(:base_scope) { :type_b }
|
159
|
+
|
160
|
+
it 'fetches from each scope in order' do
|
161
|
+
expect(subject.percentage).to eq(0.25)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
context 'as where clause' do
|
166
|
+
let(:base_scope) { "doc_type = 'b'" }
|
167
|
+
|
168
|
+
it 'fetches from each scope in order' do
|
169
|
+
expect(subject.percentage).to eq(0.25)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
context 'as hash' do
|
174
|
+
let(:base_scope) { { doc_type: :b } }
|
175
|
+
|
176
|
+
it 'fetches from each scope in order' do
|
177
|
+
expect(subject.percentage).to eq(0.25)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
111
181
|
end
|
112
182
|
|
113
183
|
describe '#scoped' do
|
@@ -146,6 +216,70 @@ describe Bidu::House::ErrorReport do
|
|
146
216
|
end
|
147
217
|
end
|
148
218
|
end
|
219
|
+
|
220
|
+
context 'when configured with a complex scope' do
|
221
|
+
let(:types) { [:a, :b, :b] }
|
222
|
+
let(:old_errors) { 0 }
|
223
|
+
|
224
|
+
context 'as symbol' do
|
225
|
+
let(:scope) { :'with_error.type_b' }
|
226
|
+
|
227
|
+
it 'fetches from each scope in order' do
|
228
|
+
expect(subject.scoped.count).to eq(Document.with_error.type_b.count)
|
229
|
+
expect(subject.scoped.count).to eq(2 * Document.with_error.type_a.count)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
context 'as hash' do
|
234
|
+
let(:scope) { { status: :error, doc_type: :b } }
|
235
|
+
|
236
|
+
it 'fetches from each scope in order' do
|
237
|
+
expect(subject.scoped.count).to eq(Document.with_error.type_b.count)
|
238
|
+
expect(subject.scoped.count).to eq(2 * Document.with_error.type_a.count)
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
context 'as string where scope' do
|
243
|
+
let(:scope) { "status = 'error' and doc_type = 'b'" }
|
244
|
+
|
245
|
+
it 'fetches from each scope in order' do
|
246
|
+
expect(subject.scoped.count).to eq(Document.with_error.type_b.count)
|
247
|
+
expect(subject.scoped.count).to eq(2 * Document.with_error.type_a.count)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
context 'when using a base scope' do
|
253
|
+
let(:types) { [:a, :b, :b, :b] }
|
254
|
+
let(:old_errors) { 0 }
|
255
|
+
|
256
|
+
context 'as symbol' do
|
257
|
+
let(:base_scope) { :type_b }
|
258
|
+
|
259
|
+
it 'fetches from each scope in order' do
|
260
|
+
expect(subject.scoped.count).to eq(Document.with_error.type_b.count)
|
261
|
+
expect(subject.scoped.count).to eq(3 * Document.with_error.type_a.count)
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
context 'as where clause' do
|
266
|
+
let(:base_scope) { "doc_type = 'b'" }
|
267
|
+
|
268
|
+
it 'fetches from each scope in order' do
|
269
|
+
expect(subject.scoped.count).to eq(Document.with_error.type_b.count)
|
270
|
+
expect(subject.scoped.count).to eq(3 * Document.with_error.type_a.count)
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
context 'as hash' do
|
275
|
+
let(:base_scope) { { doc_type: :b } }
|
276
|
+
|
277
|
+
it 'fetches from each scope in order' do
|
278
|
+
expect(subject.scoped.count).to eq(Document.with_error.type_b.count)
|
279
|
+
expect(subject.scoped.count).to eq(3 * Document.with_error.type_a.count)
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
149
283
|
end
|
150
284
|
|
151
285
|
describe '#error?' do
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Bidu::House::ReportConfig do
|
4
|
+
let(:config) { {} }
|
5
|
+
let(:parameters) { {} }
|
6
|
+
let(:subject) { described_class.new(config) }
|
7
|
+
|
8
|
+
describe '#build' do
|
9
|
+
context 'when no config is given' do
|
10
|
+
it do
|
11
|
+
expect(subject.build(parameters)).to be_a(Bidu::House::Report::Error)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'when a dummy type is given' do
|
16
|
+
let(:config) { { type: :dummy } }
|
17
|
+
|
18
|
+
it do
|
19
|
+
expect(subject.build(parameters)).to be_a(Bidu::House::Report::Dummy)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when a class is given as type' do
|
24
|
+
let(:config) { { type: Bidu::House::Report::Dummy } }
|
25
|
+
|
26
|
+
it do
|
27
|
+
expect(subject.build(parameters)).to be_a(Bidu::House::Report::Dummy)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'when a global class is given as type' do
|
32
|
+
let(:config) { { type: Dummy } }
|
33
|
+
|
34
|
+
it do
|
35
|
+
expect(subject.build(parameters)).to be_a(Dummy)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -33,7 +33,7 @@ describe Bidu::House::ReportBuilder do
|
|
33
33
|
describe '#build' do
|
34
34
|
let(:ids) { [ 10 ] }
|
35
35
|
it do
|
36
|
-
expect(report).to be_a(Bidu::House::
|
36
|
+
expect(report).to be_a(Bidu::House::Report::Error)
|
37
37
|
end
|
38
38
|
|
39
39
|
it 'builds the report using the given configuration' do
|
@@ -59,7 +59,7 @@ describe Bidu::House::ReportBuilder do
|
|
59
59
|
|
60
60
|
context 'when passing a custom other parameters' do
|
61
61
|
let(:parameters) do
|
62
|
-
{ scope: :with_success, clazz: Bidu::House::
|
62
|
+
{ scope: :with_success, clazz: Bidu::House::Report::Error, external_key: :id, id: :failures }
|
63
63
|
end
|
64
64
|
|
65
65
|
it 'ignores the non customizable parameters' do
|
@@ -20,9 +20,9 @@ describe Bidu::House::Status do
|
|
20
20
|
end
|
21
21
|
let(:errors) { 0 }
|
22
22
|
let(:successes) { 1 }
|
23
|
-
let(:error_report) { Bidu::House::
|
23
|
+
let(:error_report) { Bidu::House::Report::Error.new(report_options) }
|
24
24
|
let(:success_report) do
|
25
|
-
Bidu::House::
|
25
|
+
Bidu::House::Report::Error.new(success_options)
|
26
26
|
end
|
27
27
|
let(:reports) { [ error_report ] }
|
28
28
|
let(:subject) { described_class.new(reports) }
|
@@ -56,7 +56,7 @@ describe Bidu::House::Status do
|
|
56
56
|
|
57
57
|
context 'when there are both success and error reports' do
|
58
58
|
let(:success_report) do
|
59
|
-
Bidu::House::
|
59
|
+
Bidu::House::Report::Error.new(report_options.merge(scope: :with_success))
|
60
60
|
end
|
61
61
|
let(:reports) { [ success_report, error_report ] }
|
62
62
|
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Bidu
|
2
|
+
module House
|
3
|
+
module Report
|
4
|
+
class Dummy
|
5
|
+
ALLOWED_PARAMETERS=[:period, :threshold]
|
6
|
+
def initialize(options)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Dummy
|
14
|
+
ALLOWED_PARAMETERS=[:period, :threshold]
|
15
|
+
def initialize(options)
|
16
|
+
end
|
17
|
+
end
|
data/spec/support/schema.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bidu-house
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bidu Dev's Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name: bidu-
|
42
|
+
name: bidu-active_ext
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - '>='
|
@@ -136,6 +136,20 @@ dependencies:
|
|
136
136
|
- - ~>
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '2.14'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: pry-nav
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - '>='
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - '>='
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: simplecov
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -165,20 +179,21 @@ files:
|
|
165
179
|
- README.md
|
166
180
|
- Rakefile
|
167
181
|
- house.gemspec
|
168
|
-
- lib/active_record/relation_ext.rb
|
169
182
|
- lib/bidu.rb
|
170
183
|
- lib/bidu/house.rb
|
171
184
|
- lib/bidu/house/class_methods.rb
|
172
185
|
- lib/bidu/house/concern.rb
|
173
|
-
- lib/bidu/house/
|
186
|
+
- lib/bidu/house/report.rb
|
187
|
+
- lib/bidu/house/report/error.rb
|
174
188
|
- lib/bidu/house/report_builder.rb
|
189
|
+
- lib/bidu/house/report_config.rb
|
175
190
|
- lib/bidu/house/status.rb
|
176
191
|
- lib/bidu/house/status_builder.rb
|
177
192
|
- lib/bidu/house/version.rb
|
178
193
|
- lib/bidu/period_parser.rb
|
179
194
|
- lib/json_parser/type_cast_ext.rb
|
180
|
-
- spec/lib/
|
181
|
-
- spec/lib/bidu/house/
|
195
|
+
- spec/lib/bidu/house/report/error_spec.rb
|
196
|
+
- spec/lib/bidu/house/report/report_config_spec.rb
|
182
197
|
- spec/lib/bidu/house/report_builder_spec.rb
|
183
198
|
- spec/lib/bidu/house/status_builder_spec.rb
|
184
199
|
- spec/lib/bidu/house/status_spec.rb
|
@@ -186,6 +201,7 @@ files:
|
|
186
201
|
- spec/spec_helper.rb
|
187
202
|
- spec/support/fixture_helpers.rb
|
188
203
|
- spec/support/models/document.rb
|
204
|
+
- spec/support/report/dummy.rb
|
189
205
|
- spec/support/schema.rb
|
190
206
|
homepage: https://github.com/Bidu/house
|
191
207
|
licenses: []
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'active_record'
|
2
|
-
|
3
|
-
module ActiveRecord
|
4
|
-
class Relation
|
5
|
-
def percentage(*filters)
|
6
|
-
return 0 if count == 0
|
7
|
-
|
8
|
-
if filters.first.is_a?(Symbol)
|
9
|
-
filtered = filters.inject(self) do |relation, scope|
|
10
|
-
relation.public_send(scope)
|
11
|
-
end
|
12
|
-
else
|
13
|
-
filtered = where(*filters)
|
14
|
-
end
|
15
|
-
|
16
|
-
filtered.count * 1.0 / count
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
module Bidu
|
2
|
-
module House
|
3
|
-
class ErrorReport
|
4
|
-
include JsonParser
|
5
|
-
|
6
|
-
attr_reader :json
|
7
|
-
|
8
|
-
json_parse :threshold, type: :float
|
9
|
-
json_parse :period, type: :period
|
10
|
-
json_parse :scope, :id, :clazz, :external_key, case: :snake
|
11
|
-
|
12
|
-
def initialize(options)
|
13
|
-
@json = {
|
14
|
-
external_key: :id,
|
15
|
-
threshold: 0.02,
|
16
|
-
period: 1.day,
|
17
|
-
scope: :with_error
|
18
|
-
}.merge(options)
|
19
|
-
end
|
20
|
-
|
21
|
-
def status
|
22
|
-
@status ||= error? ? :error : :ok
|
23
|
-
end
|
24
|
-
|
25
|
-
def percentage
|
26
|
-
@percentage ||= last_entires.percentage(scope)
|
27
|
-
end
|
28
|
-
|
29
|
-
def scoped
|
30
|
-
@scoped ||= last_entires.public_send(scope)
|
31
|
-
end
|
32
|
-
|
33
|
-
def error?
|
34
|
-
percentage > threshold
|
35
|
-
end
|
36
|
-
|
37
|
-
def as_json
|
38
|
-
{
|
39
|
-
ids: scoped.pluck(external_key),
|
40
|
-
percentage: percentage
|
41
|
-
}
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def last_entires
|
47
|
-
@last_entires ||= clazz.where('updated_at >= ?', period.seconds.ago)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe ActiveRecord::Relation do
|
4
|
-
describe '#percentage' do
|
5
|
-
let(:error_number) { 1 }
|
6
|
-
let(:success_number) { 1 }
|
7
|
-
|
8
|
-
before do
|
9
|
-
Document.all.each(&:destroy)
|
10
|
-
error_number.times { Document.create(status: :error) }
|
11
|
-
success_number.times { Document.create(status: :success) }
|
12
|
-
end
|
13
|
-
|
14
|
-
context 'when there are 50% documents with error' do
|
15
|
-
it do
|
16
|
-
expect(Document.all.percentage(status: :error)).to eq(0.5)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
context 'when there are 25% documents with error' do
|
21
|
-
let(:success_number) { 3 }
|
22
|
-
|
23
|
-
it do
|
24
|
-
expect(Document.all.percentage(status: :error)).to eq(0.25)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context 'when passing a sub scope' do
|
29
|
-
before do
|
30
|
-
Document.create(status: :on_going)
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'does the math inside the scope' do
|
34
|
-
expect(Document.where(status: [:error, :success]).percentage(status: :error)).to eq(0.5)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
context 'when passing a scope name instead of query' do
|
39
|
-
it 'does the math inside the scope' do
|
40
|
-
expect(Document.all.percentage(:with_error)).to eq(0.5)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|