bidu-house 0.1.2 → 0.2.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.
- 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
|