bidu-house 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +69 -0
- data/LICENSE +22 -0
- data/README.md +2 -0
- data/Rakefile +7 -0
- data/house.gemspec +32 -0
- data/lib/active_record/relation_ext.rb +19 -0
- data/lib/bidu/house/class_methods.rb +19 -0
- data/lib/bidu/house/concern.rb +10 -0
- data/lib/bidu/house/error_report.rb +51 -0
- data/lib/bidu/house/report_builder.rb +21 -0
- data/lib/bidu/house/status.rb +27 -0
- data/lib/bidu/house/status_builder.rb +35 -0
- data/lib/bidu/house/version.rb +5 -0
- data/lib/bidu/house.rb +17 -0
- data/lib/bidu/period_parser.rb +32 -0
- data/lib/bidu.rb +3 -0
- data/lib/json_parser/type_cast_ext.rb +7 -0
- data/spec/lib/active_record/relation_spec.rb +44 -0
- data/spec/lib/bidu/house/error_report_spec.rb +194 -0
- data/spec/lib/bidu/house/report_builder_spec.rb +72 -0
- data/spec/lib/bidu/house/status_builder_spec.rb +83 -0
- data/spec/lib/bidu/house/status_spec.rb +132 -0
- data/spec/lib/bidu/period_parser_spec.rb +27 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/support/fixture_helpers.rb +19 -0
- data/spec/support/models/document.rb +4 -0
- data/spec/support/schema.rb +10 -0
- metadata +213 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bf8431dbc896d4009687b3896a2d11f268d48a18
|
4
|
+
data.tar.gz: 295a7b922f4af26fb58e8a5b4d59ce6cba59c512
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 94962c145b428b9a261b5df1871586a556d15553ebdd97ef1c36fa2f1ba3e171e3e21672f60df3a624329c05dc72375dac38dd4f042c6840dc95710def42ec16
|
7
|
+
data.tar.gz: f596699a632c86fd136b50312db1490528b6d9bdfadde67405a9a19add49122fb9130d0009c3cf2d9c347bb4af044577baba07fe96075e15d1d199c3e7cdc6b8
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
bidu-house (0.1.0)
|
5
|
+
activesupport
|
6
|
+
bidu-core_ext
|
7
|
+
concern_builder
|
8
|
+
json_parser (~> 1.1)
|
9
|
+
|
10
|
+
GEM
|
11
|
+
remote: https://rubygems.org/
|
12
|
+
specs:
|
13
|
+
activemodel (4.2.3)
|
14
|
+
activesupport (= 4.2.3)
|
15
|
+
builder (~> 3.1)
|
16
|
+
activerecord (4.2.3)
|
17
|
+
activemodel (= 4.2.3)
|
18
|
+
activesupport (= 4.2.3)
|
19
|
+
arel (~> 6.0)
|
20
|
+
activesupport (4.2.3)
|
21
|
+
i18n (~> 0.7)
|
22
|
+
json (~> 1.7, >= 1.7.7)
|
23
|
+
minitest (~> 5.1)
|
24
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
25
|
+
tzinfo (~> 1.1)
|
26
|
+
arel (6.0.0)
|
27
|
+
bidu-core_ext (1.0.0)
|
28
|
+
activesupport
|
29
|
+
builder (3.2.2)
|
30
|
+
concern_builder (0.0.1)
|
31
|
+
activesupport
|
32
|
+
diff-lcs (1.2.5)
|
33
|
+
docile (1.1.5)
|
34
|
+
i18n (0.7.0)
|
35
|
+
json (1.8.3)
|
36
|
+
json_parser (1.1.0)
|
37
|
+
activesupport
|
38
|
+
concern_builder
|
39
|
+
minitest (5.7.0)
|
40
|
+
rake (10.4.2)
|
41
|
+
rspec (2.99.0)
|
42
|
+
rspec-core (~> 2.99.0)
|
43
|
+
rspec-expectations (~> 2.99.0)
|
44
|
+
rspec-mocks (~> 2.99.0)
|
45
|
+
rspec-core (2.99.2)
|
46
|
+
rspec-expectations (2.99.2)
|
47
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
48
|
+
rspec-mocks (2.99.4)
|
49
|
+
simplecov (0.10.0)
|
50
|
+
docile (~> 1.1.0)
|
51
|
+
json (~> 1.8)
|
52
|
+
simplecov-html (~> 0.10.0)
|
53
|
+
simplecov-html (0.10.0)
|
54
|
+
sqlite3 (1.3.10)
|
55
|
+
thread_safe (0.3.5)
|
56
|
+
tzinfo (1.2.2)
|
57
|
+
thread_safe (~> 0.1)
|
58
|
+
|
59
|
+
PLATFORMS
|
60
|
+
ruby
|
61
|
+
|
62
|
+
DEPENDENCIES
|
63
|
+
activerecord
|
64
|
+
bidu-house!
|
65
|
+
bundler (~> 1.6)
|
66
|
+
rake
|
67
|
+
rspec (~> 2.14)
|
68
|
+
simplecov
|
69
|
+
sqlite3
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 Bidu Corretora
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
|
data/README.md
ADDED
data/Rakefile
ADDED
data/house.gemspec
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'bidu/house/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = 'bidu-house'
|
8
|
+
gem.version = Bidu::House::VERSION
|
9
|
+
gem.authors = ["Bidu Dev's Team"]
|
10
|
+
gem.email = ["dev@bidu.com.br"]
|
11
|
+
gem.homepage = 'https://github.com/Bidu/house'
|
12
|
+
gem.description = 'Gem for easy health check'
|
13
|
+
gem.summary = gem.description
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|gem|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_runtime_dependency 'activesupport'
|
21
|
+
gem.add_runtime_dependency 'concern_builder'
|
22
|
+
gem.add_runtime_dependency 'bidu-core_ext'
|
23
|
+
gem.add_runtime_dependency 'json_parser', '~> 1.1'
|
24
|
+
|
25
|
+
gem.add_development_dependency "activerecord"
|
26
|
+
gem.add_development_dependency "sqlite3"
|
27
|
+
|
28
|
+
gem.add_development_dependency "bundler", "~> 1.6"
|
29
|
+
gem.add_development_dependency "rake"
|
30
|
+
gem.add_development_dependency "rspec", "~> 2.14"
|
31
|
+
gem.add_development_dependency 'simplecov'
|
32
|
+
end
|
@@ -0,0 +1,19 @@
|
|
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
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Bidu
|
2
|
+
module House
|
3
|
+
module ClassMethods
|
4
|
+
|
5
|
+
def status_report(*attr_names)
|
6
|
+
id = attr_names.first
|
7
|
+
options = {
|
8
|
+
id: id
|
9
|
+
}.merge(attr_names.extract_options!)
|
10
|
+
|
11
|
+
self.status_builder.add_report_config(id, options)
|
12
|
+
end
|
13
|
+
|
14
|
+
def status_builder
|
15
|
+
@status_builder ||= Bidu::House::StatusBuilder.new
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,51 @@
|
|
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.map(&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
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Bidu
|
2
|
+
module House
|
3
|
+
class ReportBuilder
|
4
|
+
def build(key, parameters = {})
|
5
|
+
params = parameters.slice(:period, :threshold)
|
6
|
+
config = configs[key].merge(params)
|
7
|
+
Bidu::House::ErrorReport.new(config)
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_config(key, config)
|
11
|
+
configs[key] = config
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def configs
|
17
|
+
@configs ||= {}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Bidu
|
2
|
+
module House
|
3
|
+
class Status
|
4
|
+
attr_reader :reports
|
5
|
+
|
6
|
+
def initialize(reports)
|
7
|
+
@reports = reports
|
8
|
+
end
|
9
|
+
|
10
|
+
def status
|
11
|
+
reports.any? { |r| r.error? } ? :error : :ok
|
12
|
+
end
|
13
|
+
|
14
|
+
def as_json
|
15
|
+
{
|
16
|
+
status: status
|
17
|
+
}.merge(reports_jsons)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def reports_jsons
|
23
|
+
reports.map(&:as_json).as_hash(reports.map(&:id))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Bidu
|
2
|
+
module House
|
3
|
+
class StatusBuilder
|
4
|
+
def build(key, parameters = {})
|
5
|
+
Bidu::House::Status.new(reports_for(key, parameters))
|
6
|
+
end
|
7
|
+
|
8
|
+
def add_report_config(key, config)
|
9
|
+
status_key = config.delete(:on) || :default
|
10
|
+
report_builder.add_config(key, config)
|
11
|
+
config_for(status_key) << key
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def report_builder
|
17
|
+
@report_builder ||= Bidu::House::ReportBuilder.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def reports_for(key, parameters)
|
21
|
+
config_for(key).map do |report_key|
|
22
|
+
report_builder.build(report_key, parameters)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def configs
|
27
|
+
@configs ||= {}
|
28
|
+
end
|
29
|
+
|
30
|
+
def config_for(key)
|
31
|
+
configs[key] ||= []
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/bidu/house.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'active_record/relation_ext'
|
2
|
+
require 'concern_builder'
|
3
|
+
require 'bidu/core_ext'
|
4
|
+
require 'bidu/period_parser'
|
5
|
+
require 'json_parser'
|
6
|
+
require 'json_parser/type_cast_ext'
|
7
|
+
|
8
|
+
module Bidu
|
9
|
+
module House
|
10
|
+
require 'bidu/house/concern'
|
11
|
+
require 'bidu/house/error_report'
|
12
|
+
require 'bidu/house/status'
|
13
|
+
require 'bidu/house/report_builder'
|
14
|
+
require 'bidu/house/status_builder'
|
15
|
+
require 'bidu/house/class_methods'
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Bidu
|
2
|
+
class PeriodParser
|
3
|
+
class << self
|
4
|
+
def parse(period)
|
5
|
+
return unless period
|
6
|
+
return period if period.is_a?(Integer)
|
7
|
+
new(period).to_seconds
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(period)
|
12
|
+
@period = period
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_seconds
|
16
|
+
return unless period.match(/^\d+(years|months|days|hours|minutes|seconds)?/)
|
17
|
+
type.blank? ? value.seconds : value.public_send(type)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
attr_reader :period
|
23
|
+
|
24
|
+
def value
|
25
|
+
@period_value ||= period.gsub(/\D+/, '').to_i
|
26
|
+
end
|
27
|
+
|
28
|
+
def type
|
29
|
+
@period_type ||= period.gsub(/\d+/, '')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/bidu.rb
ADDED
@@ -0,0 +1,44 @@
|
|
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
|
@@ -0,0 +1,194 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Bidu::House::ErrorReport do
|
4
|
+
let(:errors) { 1 }
|
5
|
+
let(:successes) { 1 }
|
6
|
+
let(:old_errors) { 2 }
|
7
|
+
let(:threshold) { 0.02 }
|
8
|
+
let(:period) { 1.day }
|
9
|
+
let(:external_key) { :external_id }
|
10
|
+
let(:options) do
|
11
|
+
{
|
12
|
+
period: period,
|
13
|
+
threshold: threshold,
|
14
|
+
scope: :with_error,
|
15
|
+
clazz: Document,
|
16
|
+
external_key: external_key
|
17
|
+
}
|
18
|
+
end
|
19
|
+
let(:subject) { described_class.new(options) }
|
20
|
+
before do
|
21
|
+
Document.all.each(&:destroy)
|
22
|
+
successes.times { Document.create status: :success }
|
23
|
+
errors.times do |i|
|
24
|
+
Document.create status: :error, external_id: 10 * successes + i, outter_external_id: i
|
25
|
+
end
|
26
|
+
old_errors.times { Document.create status: :error, created_at: 2.days.ago, updated_at: 2.days.ago }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#status' do
|
30
|
+
context 'when are more errors than the allowed by the threshold' do
|
31
|
+
let(:errors) { 1 }
|
32
|
+
let(:successes) { 3 }
|
33
|
+
it { expect(subject.status).to eq(:error) }
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'when the threshold is 0 and there are no errors' do
|
37
|
+
let(:errors) { 0 }
|
38
|
+
let(:threshold) { 0 }
|
39
|
+
it { expect(subject.status).to eq(:ok) }
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'when the threshold is 100% and there is 100% error' do
|
43
|
+
let(:successes) { 0 }
|
44
|
+
let(:threshold) { 1 }
|
45
|
+
it { expect(subject.status).to eq(:ok) }
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'when there are no documents' do
|
49
|
+
let(:successes) { 0 }
|
50
|
+
let(:errors) { 0 }
|
51
|
+
it { expect(subject.status).to eq(:ok) }
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'when there are older errors out of the period' do
|
55
|
+
let(:threshold) { 0.6 }
|
56
|
+
|
57
|
+
it 'ignores the older errros' do
|
58
|
+
expect(subject.status).to eq(:ok)
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'when passing a bigger period' do
|
62
|
+
let(:period) { 3.days }
|
63
|
+
|
64
|
+
it 'consider the older errros' do
|
65
|
+
expect(subject.status).to eq(:error)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe 'percentage' do
|
72
|
+
context 'when there are 25% erros' do
|
73
|
+
let(:errors) { 1 }
|
74
|
+
let(:successes) { 3 }
|
75
|
+
it { expect(subject.percentage).to eq(0.25) }
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'when there are no errors' do
|
79
|
+
let(:errors) { 0 }
|
80
|
+
let(:threshold) { 0 }
|
81
|
+
it { expect(subject.percentage).to eq(0) }
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'when there is 100% error' do
|
85
|
+
let(:successes) { 0 }
|
86
|
+
let(:threshold) { 1 }
|
87
|
+
it { expect(subject.percentage).to eq(1) }
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'when there are no documents' do
|
91
|
+
let(:successes) { 0 }
|
92
|
+
let(:errors) { 0 }
|
93
|
+
it { expect(subject.percentage).to eq(0) }
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'when there are older errors out of the period' do
|
97
|
+
let(:old_errors) { 2 }
|
98
|
+
|
99
|
+
it 'ignores the older errros' do
|
100
|
+
expect(subject.percentage).to eq(0.5)
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'when passing a bigger period' do
|
104
|
+
let(:period) { 3.days }
|
105
|
+
|
106
|
+
it 'consider the older errros' do
|
107
|
+
expect(subject.percentage).to eq(0.75)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe '#scoped' do
|
114
|
+
context 'when there are 25% erros' do
|
115
|
+
let(:errors) { 1 }
|
116
|
+
let(:successes) { 3 }
|
117
|
+
it 'returns only the scoped documents' do
|
118
|
+
expect(subject.scoped.count).to eq(1)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context 'when there are no errors' do
|
123
|
+
let(:errors) { 0 }
|
124
|
+
let(:threshold) { 0 }
|
125
|
+
it { expect(subject.scoped).to be_empty }
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'when there are no documents' do
|
129
|
+
let(:successes) { 0 }
|
130
|
+
let(:errors) { 0 }
|
131
|
+
it { expect(subject.scoped).to be_empty }
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'when there are older errors out of the period' do
|
135
|
+
let(:old_errors) { 2 }
|
136
|
+
|
137
|
+
it 'ignores the older errros' do
|
138
|
+
expect(subject.scoped.count).to eq(1)
|
139
|
+
end
|
140
|
+
|
141
|
+
context 'when passing a bigger period' do
|
142
|
+
let(:period) { 3.days }
|
143
|
+
|
144
|
+
it 'consider the older errros' do
|
145
|
+
expect(subject.scoped.count).to eq(3)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe '#error?' do
|
152
|
+
context 'when errors percentage overcames threshold' do
|
153
|
+
it { expect(subject.error?).to be_truthy }
|
154
|
+
end
|
155
|
+
|
156
|
+
context 'when errors percentage does not overcames threshold' do
|
157
|
+
let(:errors) { 0 }
|
158
|
+
it { expect(subject.error?).to be_falsey }
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
describe '#as_json' do
|
163
|
+
context 'when there are 75% erros' do
|
164
|
+
let(:errors) { 3 }
|
165
|
+
let(:successes) { 1 }
|
166
|
+
let(:ids_expected) { [10, 11, 12] }
|
167
|
+
let(:expected) do
|
168
|
+
{ ids: ids_expected, percentage: 0.75 }
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'returns the external keys and error percentage' do
|
172
|
+
expect(subject.as_json).to eq(expected)
|
173
|
+
end
|
174
|
+
|
175
|
+
context 'when configurated with different external key' do
|
176
|
+
let(:external_key) { :outter_external_id }
|
177
|
+
let(:ids_expected) { [0, 1, 2] }
|
178
|
+
|
179
|
+
it 'returns the correct external keys' do
|
180
|
+
expect(subject.as_json).to eq(expected)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
context 'when configurated without external key' do
|
185
|
+
before { options.delete(:external_key) }
|
186
|
+
let(:ids_expected) { Document.with_error.where('created_at > ?', 30.hours.ago).map(&:id) }
|
187
|
+
|
188
|
+
it 'returns the ids as default id' do
|
189
|
+
expect(subject.as_json).to eq(expected)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Bidu::House::ReportBuilder do
|
4
|
+
let(:errors) { 1 }
|
5
|
+
let(:successes) { 3 }
|
6
|
+
let(:old_errors) { 2 }
|
7
|
+
let(:key) { :errors }
|
8
|
+
let(:threshold) { 0.02 }
|
9
|
+
let(:period) { 1.day }
|
10
|
+
let(:external_key) { :external_id }
|
11
|
+
let(:config) do
|
12
|
+
{
|
13
|
+
period: period,
|
14
|
+
threshold: threshold,
|
15
|
+
external_key: :external_id,
|
16
|
+
scope: :with_error,
|
17
|
+
id: key,
|
18
|
+
clazz: Document
|
19
|
+
}
|
20
|
+
end
|
21
|
+
let(:parameters) { {} }
|
22
|
+
let(:report) { subject.build(key, parameters) }
|
23
|
+
before do
|
24
|
+
subject.add_config(key, config)
|
25
|
+
Document.all.each(&:destroy)
|
26
|
+
successes.times { |i| Document.create status: :success, external_id: 30+i }
|
27
|
+
errors.times { |i| Document.create status: :error, external_id: 10+i }
|
28
|
+
old_errors.times do |i|
|
29
|
+
Document.create status: :error, external_id: 20+i, created_at: 2.days.ago, updated_at: 2.days.ago
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#build' do
|
34
|
+
let(:ids) { [ 10 ] }
|
35
|
+
it do
|
36
|
+
expect(report).to be_a(Bidu::House::ErrorReport)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'builds the report using the given configuration' do
|
40
|
+
expect(report.as_json).to eq( ids: ids, percentage: 0.25 )
|
41
|
+
expect(report.error?).to be_truthy
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when passing a custom threshold parameter' do
|
45
|
+
let(:parameters) { { threshold: 1 } }
|
46
|
+
|
47
|
+
it 'uses custom threshold parameter' do
|
48
|
+
expect(report.error?).to be_falsey
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'when passing a custom period parameter' do
|
53
|
+
let(:parameters) { { threshold: 0.4, period: 10.days } }
|
54
|
+
|
55
|
+
it 'uses custom period parameter' do
|
56
|
+
expect(report.error?).to be_truthy
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'when passing a custom other parameters' do
|
61
|
+
let(:parameters) do
|
62
|
+
{ scope: :with_success, clazz: Bidu::House::ErrorReport, external_key: :id, id: :failures }
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'ignores the non customizable parameters' do
|
66
|
+
expect(report.as_json).to eq( ids: ids, percentage: 0.25 )
|
67
|
+
expect(report.error?).to be_truthy
|
68
|
+
expect(report.id).to eq(:errors)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Bidu::House::StatusBuilder do
|
4
|
+
let(:errors) { 1 }
|
5
|
+
let(:successes) { 3 }
|
6
|
+
let(:old_errors) { 2 }
|
7
|
+
let(:key) { :errors }
|
8
|
+
let(:threshold) { 0.02 }
|
9
|
+
let(:period) { 1.day }
|
10
|
+
let(:external_key) { :external_id }
|
11
|
+
let(:config) do
|
12
|
+
{
|
13
|
+
period: period,
|
14
|
+
threshold: threshold,
|
15
|
+
scope: :with_error,
|
16
|
+
clazz: Document,
|
17
|
+
id: :failures,
|
18
|
+
external_key: :external_id,
|
19
|
+
on: key
|
20
|
+
}
|
21
|
+
end
|
22
|
+
let(:parameters) { {} }
|
23
|
+
let(:status) { subject.build(key, parameters) }
|
24
|
+
before do
|
25
|
+
subject.add_report_config(key, config)
|
26
|
+
Document.all.each(&:destroy)
|
27
|
+
successes.times { |i| Document.create status: :success, external_id: 30+i }
|
28
|
+
errors.times { |i| Document.create status: :error, external_id: 10+i }
|
29
|
+
old_errors.times do |i|
|
30
|
+
Document.create status: :error, external_id: 20+i, created_at: 2.days.ago, updated_at: 2.days.ago
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#build' do
|
35
|
+
let(:ids) { [ 10 ] }
|
36
|
+
let(:status_expected) { :error }
|
37
|
+
let(:percentage) { 0.25 }
|
38
|
+
let(:json_expected) do
|
39
|
+
{
|
40
|
+
status: status_expected,
|
41
|
+
failures: {
|
42
|
+
ids: ids,
|
43
|
+
percentage: percentage
|
44
|
+
}
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
it do
|
49
|
+
expect(status).to be_a(Bidu::House::Status)
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'when not specifying where to report' do
|
53
|
+
let(:key) {}
|
54
|
+
|
55
|
+
it 'register report under default' do
|
56
|
+
expect(subject.build(:default).as_json).to eq(json_expected)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'builds the report using the given configuration' do
|
61
|
+
expect(status.as_json).to eq(json_expected)
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'when passing a custom threshold parameter' do
|
65
|
+
let(:parameters) { { threshold: 1 } }
|
66
|
+
let(:status_expected) { :ok }
|
67
|
+
|
68
|
+
it 'uses custom threshold parameter' do
|
69
|
+
expect(status.as_json).to eq(json_expected)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'when passing a custom period parameter' do
|
74
|
+
let(:ids) { [ 10, 20, 21 ] }
|
75
|
+
let(:percentage) { 0.5 }
|
76
|
+
let(:parameters) { { threshold: 0.4, period: 10.days } }
|
77
|
+
|
78
|
+
it 'uses custom period parameter' do
|
79
|
+
expect(status.as_json).to eq(json_expected)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Bidu::House::Status do
|
4
|
+
let(:threshold) { 0.02 }
|
5
|
+
let(:period) { 1.day }
|
6
|
+
let(:report_options) do
|
7
|
+
{
|
8
|
+
period: period,
|
9
|
+
threshold: threshold,
|
10
|
+
scope: :with_error,
|
11
|
+
clazz: Document,
|
12
|
+
id: :errors
|
13
|
+
}
|
14
|
+
end
|
15
|
+
let(:success_options) do
|
16
|
+
report_options.merge(
|
17
|
+
scope: :with_success,
|
18
|
+
id: :success
|
19
|
+
)
|
20
|
+
end
|
21
|
+
let(:errors) { 0 }
|
22
|
+
let(:successes) { 1 }
|
23
|
+
let(:error_report) { Bidu::House::ErrorReport.new(report_options) }
|
24
|
+
let(:success_report) do
|
25
|
+
Bidu::House::ErrorReport.new(success_options)
|
26
|
+
end
|
27
|
+
let(:reports) { [ error_report ] }
|
28
|
+
let(:subject) { described_class.new(reports) }
|
29
|
+
before do
|
30
|
+
Document.all.each(&:destroy)
|
31
|
+
errors.times { Document.create status: :error }
|
32
|
+
successes.times { Document.create status: :success }
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#as_json' do
|
36
|
+
let(:status_json) { subject.as_json }
|
37
|
+
let(:status) { status_json[:status] }
|
38
|
+
|
39
|
+
context 'when report is ok' do
|
40
|
+
it 'returns a json with ok' do
|
41
|
+
expect(status).to eq(:ok)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'returns the report json' do
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'when report is not ok' do
|
50
|
+
let(:errors) { 1 }
|
51
|
+
|
52
|
+
it 'returns a json with error' do
|
53
|
+
expect(status).to eq(:error)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'when there are both success and error reports' do
|
58
|
+
let(:success_report) do
|
59
|
+
Bidu::House::ErrorReport.new(report_options.merge(scope: :with_success))
|
60
|
+
end
|
61
|
+
let(:reports) { [ success_report, error_report ] }
|
62
|
+
|
63
|
+
it 'returns a json with error' do
|
64
|
+
expect(status).to eq(:error)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '#status' do
|
70
|
+
context 'when report is ok' do
|
71
|
+
it do
|
72
|
+
expect(subject.status).to eq(:ok)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'when report is not ok' do
|
77
|
+
let(:errors) { 1 }
|
78
|
+
|
79
|
+
it do
|
80
|
+
expect(subject.status).to eq(:error)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'when there are both success and error reports' do
|
85
|
+
let(:reports) { [ success_report, error_report ] }
|
86
|
+
|
87
|
+
it do
|
88
|
+
expect(subject.status).to eq(:error)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe '#as_json' do
|
94
|
+
let(:errors) { 3 }
|
95
|
+
let(:ids) { Document.with_error.map(&:id) }
|
96
|
+
let(:expected) do
|
97
|
+
{
|
98
|
+
status: :error,
|
99
|
+
errors: {
|
100
|
+
ids: ids,
|
101
|
+
percentage: 0.75
|
102
|
+
}
|
103
|
+
}
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'creates a summary of the reports' do
|
107
|
+
expect(subject.as_json).to eq(expected)
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'when there are both success and error reports' do
|
111
|
+
let(:success_ids) { Document.with_success.map(&:id) }
|
112
|
+
let(:expected) do
|
113
|
+
{
|
114
|
+
status: :error,
|
115
|
+
errors: {
|
116
|
+
ids: ids,
|
117
|
+
percentage: 0.75
|
118
|
+
},
|
119
|
+
success: {
|
120
|
+
ids: success_ids,
|
121
|
+
percentage: 0.25
|
122
|
+
}
|
123
|
+
}
|
124
|
+
end
|
125
|
+
let(:reports) { [ success_report, error_report ] }
|
126
|
+
|
127
|
+
it 'creates a summary of all the reports' do
|
128
|
+
expect(subject.as_json).to eq(expected)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Bidu::PeriodParser do
|
4
|
+
shared_examples 'a class who knows how to parse time' do |tests|
|
5
|
+
tests.each do |string, expected|
|
6
|
+
it "parses #{string} into #{expected} seconds" do
|
7
|
+
expect(described_class.parse(string)).to eq(expected)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
it_behaves_like 'a class who knows how to parse time', {
|
13
|
+
'3' => 3.seconds,
|
14
|
+
'3seconds' => 3.seconds,
|
15
|
+
'3minutes' => 3.minutes,
|
16
|
+
'3hours' => 3.hours,
|
17
|
+
'3days' => 3.days,
|
18
|
+
'3months' => 3.months,
|
19
|
+
'3years' => 3.years
|
20
|
+
}
|
21
|
+
|
22
|
+
context 'when value is already a period' do
|
23
|
+
it 'returns the value itself' do
|
24
|
+
expect(described_class.parse(3.minutes)).to eq(3.minutes)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start
|
3
|
+
|
4
|
+
require 'bidu/house'
|
5
|
+
|
6
|
+
require 'active_record'
|
7
|
+
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
|
8
|
+
|
9
|
+
support_files = File.expand_path("spec/support/**/*.rb")
|
10
|
+
Dir[support_files].each { |file| require file }
|
11
|
+
|
12
|
+
RSpec.configure do |config|
|
13
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
14
|
+
config.run_all_when_everything_filtered = true
|
15
|
+
config.filter_run :focus
|
16
|
+
config.filter_run_excluding :integration unless ENV['ALL']
|
17
|
+
|
18
|
+
config.order = 'random'
|
19
|
+
|
20
|
+
config.before do
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
|
3
|
+
module FixtureHelpers
|
4
|
+
def load_fixture_file(filename)
|
5
|
+
File.read (['./spec/', 'fixtures', filename].join('/'))
|
6
|
+
end
|
7
|
+
|
8
|
+
def load_json_fixture_file(filename)
|
9
|
+
cached_json_fixture_file(filename)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def cached_json_fixture_file(filename)
|
15
|
+
ActiveSupport::JSON.decode(load_fixture_file(filename))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
RSpec.configuration.include FixtureHelpers
|
metadata
ADDED
@@ -0,0 +1,213 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bidu-house
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Bidu Dev's Team
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-07-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: concern_builder
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bidu-core_ext
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: json_parser
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.1'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.1'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: activerecord
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: sqlite3
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: bundler
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.6'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.6'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rake
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rspec
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ~>
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '2.14'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ~>
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '2.14'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: simplecov
|
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'
|
153
|
+
description: Gem for easy health check
|
154
|
+
email:
|
155
|
+
- dev@bidu.com.br
|
156
|
+
executables: []
|
157
|
+
extensions: []
|
158
|
+
extra_rdoc_files: []
|
159
|
+
files:
|
160
|
+
- .gitignore
|
161
|
+
- .rspec
|
162
|
+
- Gemfile
|
163
|
+
- Gemfile.lock
|
164
|
+
- LICENSE
|
165
|
+
- README.md
|
166
|
+
- Rakefile
|
167
|
+
- house.gemspec
|
168
|
+
- lib/active_record/relation_ext.rb
|
169
|
+
- lib/bidu.rb
|
170
|
+
- lib/bidu/house.rb
|
171
|
+
- lib/bidu/house/class_methods.rb
|
172
|
+
- lib/bidu/house/concern.rb
|
173
|
+
- lib/bidu/house/error_report.rb
|
174
|
+
- lib/bidu/house/report_builder.rb
|
175
|
+
- lib/bidu/house/status.rb
|
176
|
+
- lib/bidu/house/status_builder.rb
|
177
|
+
- lib/bidu/house/version.rb
|
178
|
+
- lib/bidu/period_parser.rb
|
179
|
+
- lib/json_parser/type_cast_ext.rb
|
180
|
+
- spec/lib/active_record/relation_spec.rb
|
181
|
+
- spec/lib/bidu/house/error_report_spec.rb
|
182
|
+
- spec/lib/bidu/house/report_builder_spec.rb
|
183
|
+
- spec/lib/bidu/house/status_builder_spec.rb
|
184
|
+
- spec/lib/bidu/house/status_spec.rb
|
185
|
+
- spec/lib/bidu/period_parser_spec.rb
|
186
|
+
- spec/spec_helper.rb
|
187
|
+
- spec/support/fixture_helpers.rb
|
188
|
+
- spec/support/models/document.rb
|
189
|
+
- spec/support/schema.rb
|
190
|
+
homepage: https://github.com/Bidu/house
|
191
|
+
licenses: []
|
192
|
+
metadata: {}
|
193
|
+
post_install_message:
|
194
|
+
rdoc_options: []
|
195
|
+
require_paths:
|
196
|
+
- lib
|
197
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - '>='
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
203
|
+
requirements:
|
204
|
+
- - '>='
|
205
|
+
- !ruby/object:Gem::Version
|
206
|
+
version: '0'
|
207
|
+
requirements: []
|
208
|
+
rubyforge_project:
|
209
|
+
rubygems_version: 2.4.6
|
210
|
+
signing_key:
|
211
|
+
specification_version: 4
|
212
|
+
summary: Gem for easy health check
|
213
|
+
test_files: []
|