ae_easy-qa 0.0.21 → 0.0.22
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/lib/ae_easy/qa/save_output.rb +58 -36
- data/lib/ae_easy/qa/validate_internal.rb +39 -14
- data/lib/ae_easy/qa/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b72afb2dc8f9f4fa1511094aafff7f9a41eb21004e73a22a3428c528b5625d1
|
4
|
+
data.tar.gz: 48c731914135716f47ca59007bc708fd9f8552948f8f56d7db761a911a12f98c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca1cf82ef35e66bb1fe09d244a3d36adb4b4c3b58d360d4691a245d122f83034e431a8dfd89d6a9e6281bc9f09fe80f945bc1d7bb7710fccb451aba632e16cfb
|
7
|
+
data.tar.gz: f69ac55402c72d9524ea69a6e427c70f3fd7dd18a61b84bbd153dbcfe06b80d21188e5c921ee5bad33c8416eee81c01a571303a862ab4c62154dd588288303cd
|
@@ -20,7 +20,7 @@ module AeEasy
|
|
20
20
|
|
21
21
|
def run
|
22
22
|
gather_threshold_totals
|
23
|
-
|
23
|
+
gather_validations_to_ignore
|
24
24
|
save_group_errors
|
25
25
|
save_errors
|
26
26
|
save_summary
|
@@ -32,55 +32,77 @@ module AeEasy
|
|
32
32
|
rules.each{|field_to_validate, field_options|
|
33
33
|
field_threshold = return_threshold(field_to_validate, field_options)
|
34
34
|
if field_threshold
|
35
|
+
gather_field_threshold_totals(field_to_validate, field_options)
|
36
|
+
else
|
37
|
+
gather_specific_validation_totals(field_to_validate, field_options)
|
38
|
+
end
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
def gather_field_threshold_totals(field_to_validate, field_options)
|
43
|
+
error_total = errors[:errored_items].inject(0){|total, errored_item|
|
44
|
+
failed_fields = errored_item[:failures].keys.collect{|failure_key|
|
45
|
+
extract_field(failure_key)
|
46
|
+
}.uniq
|
47
|
+
total += 1 if failed_fields.include?(field_to_validate)
|
48
|
+
total
|
49
|
+
}
|
50
|
+
error_totals[field_to_validate] = error_total
|
51
|
+
end
|
52
|
+
|
53
|
+
def gather_specific_validation_totals(field_to_validate, field_options)
|
54
|
+
field_options.each do |validation|
|
55
|
+
potential_failure_name = "#{field_to_validate}_#{validation[0]}_fail"
|
56
|
+
if options['thresholds'] && options['thresholds'][potential_failure_name]
|
35
57
|
error_total = errors[:errored_items].inject(0){|total, errored_item|
|
36
|
-
|
37
|
-
|
38
|
-
}
|
39
|
-
total += 1 if
|
58
|
+
failed_validations = errored_item[:failures].keys.collect{|failure_key|
|
59
|
+
"#{failure_key}_fail"
|
60
|
+
}
|
61
|
+
total += 1 if failed_validations.include?(potential_failure_name)
|
40
62
|
total
|
41
63
|
}
|
42
|
-
error_totals[
|
43
|
-
else
|
44
|
-
field_options.each do |validation|
|
45
|
-
potential_failure_name = "#{field_to_validate}_#{validation[0]}_fail"
|
46
|
-
if options['thresholds'][potential_failure_name]
|
47
|
-
error_total = errors[:errored_items].inject(0){|total, errored_item|
|
48
|
-
failed_validations = errored_item[:failures].keys.collect{|failure_key|
|
49
|
-
"#{failure_key}_fail"
|
50
|
-
}
|
51
|
-
total += 1 if failed_validations.include?(potential_failure_name)
|
52
|
-
total
|
53
|
-
}
|
54
|
-
error_totals[potential_failure_name] = error_total
|
55
|
-
end
|
56
|
-
end
|
64
|
+
error_totals[potential_failure_name] = error_total
|
57
65
|
end
|
58
|
-
|
66
|
+
end
|
59
67
|
end
|
60
68
|
|
61
|
-
def
|
69
|
+
def gather_validations_to_ignore
|
62
70
|
rules.each{|field_to_validate, field_options|
|
63
71
|
field_threshold = return_threshold(field_to_validate, field_options)
|
64
72
|
if field_threshold
|
65
|
-
|
66
|
-
if total_errors
|
67
|
-
success_ratio = (total_items - total_errors).to_f / total_items
|
68
|
-
fields_to_ignore.push(field_to_validate) if success_ratio > field_threshold
|
69
|
-
end
|
73
|
+
gather_fields_to_ignore(field_to_validate, field_threshold)
|
70
74
|
else
|
71
|
-
field_options
|
72
|
-
potential_failure_name = "#{field_to_validate}_#{validation[0]}_fail"
|
73
|
-
total_errors = error_totals[potential_failure_name]
|
74
|
-
if total_errors
|
75
|
-
specific_validation_threshold = options['thresholds'][potential_failure_name].to_f
|
76
|
-
success_ratio = (total_items - total_errors).to_f / total_items
|
77
|
-
specific_validations_to_ignore.push(potential_failure_name) if success_ratio > specific_validation_threshold
|
78
|
-
end
|
79
|
-
end
|
75
|
+
gather_specific_validations_to_ignore(field_to_validate, field_options)
|
80
76
|
end
|
81
77
|
}
|
82
78
|
end
|
83
79
|
|
80
|
+
def gather_fields_to_ignore(field_to_validate, field_threshold)
|
81
|
+
total_errors = error_totals[field_to_validate]
|
82
|
+
if total_errors
|
83
|
+
success_ratio = (total_items - total_errors).to_f / total_items
|
84
|
+
if success_ratio > field_threshold.to_f
|
85
|
+
puts "Ignoring #{field_to_validate}"
|
86
|
+
fields_to_ignore.push(field_to_validate)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def gather_specific_validations_to_ignore(field_to_validate, field_options)
|
92
|
+
field_options.each do |validation|
|
93
|
+
potential_failure_name = "#{field_to_validate}_#{validation[0]}_fail"
|
94
|
+
total_errors = error_totals[potential_failure_name]
|
95
|
+
if total_errors
|
96
|
+
specific_validation_threshold = options['thresholds'][potential_failure_name].to_f
|
97
|
+
success_ratio = (total_items - total_errors).to_f / total_items
|
98
|
+
if success_ratio > specific_validation_threshold
|
99
|
+
puts "Ignoring #{potential_failure_name}"
|
100
|
+
specific_validations_to_ignore.push(potential_failure_name)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
84
106
|
def return_threshold(field_to_validate, field_options)
|
85
107
|
if options['thresholds']
|
86
108
|
options['thresholds'][field_to_validate]
|
@@ -12,23 +12,38 @@ module AeEasy
|
|
12
12
|
def run
|
13
13
|
begin
|
14
14
|
scrapers.each do |scraper_name, collections|
|
15
|
-
ValidateScraper.new(scraper_name, collections, rules, outputs).run
|
15
|
+
ValidateScraper.new(scraper_name, collections, rules, outputs, thresholds).run
|
16
16
|
end
|
17
17
|
rescue StandardError => e
|
18
18
|
puts "An error has occurred: #{e}"
|
19
19
|
return nil
|
20
20
|
end
|
21
21
|
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def thresholds
|
26
|
+
@thresholds ||= begin
|
27
|
+
file_path = File.expand_path('thresholds.yaml', Dir.pwd)
|
28
|
+
if File.exists? file_path
|
29
|
+
YAML.load(File.open(file_path))
|
30
|
+
else
|
31
|
+
nil
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
22
35
|
end
|
23
36
|
|
24
37
|
class ValidateScraper
|
25
|
-
attr_reader :scraper_name, :collections, :rules, :outputs
|
38
|
+
attr_reader :scraper_name, :collections, :rules, :outputs, :options
|
26
39
|
|
27
|
-
def initialize(scraper_name, collections, rules, outputs)
|
40
|
+
def initialize(scraper_name, collections, rules, outputs, thresholds)
|
28
41
|
@scraper_name = scraper_name
|
29
42
|
@collections = collections
|
30
43
|
@rules = rules
|
31
44
|
@outputs = outputs
|
45
|
+
@options = {}
|
46
|
+
options['thresholds'] = thresholds[scraper_name] if thresholds && thresholds[scraper_name]
|
32
47
|
end
|
33
48
|
|
34
49
|
def run
|
@@ -44,41 +59,51 @@ module AeEasy
|
|
44
59
|
private
|
45
60
|
|
46
61
|
def output_scraper
|
47
|
-
puts "
|
62
|
+
puts "validating scraper: #{scraper_name}"
|
48
63
|
end
|
49
64
|
|
50
65
|
def status_ok?
|
51
|
-
|
66
|
+
!collection_response.parsed_response.nil? && collection_response.code == 200
|
52
67
|
end
|
53
68
|
|
54
69
|
def validate_collections
|
55
70
|
collections.each do |collection_name|
|
56
|
-
|
71
|
+
collection = collection_counts.find{|collection_hash| collection_hash['collection'] == collection_name }
|
72
|
+
if collection
|
73
|
+
ValidateCollection.new(scraper_name, collection_name, collection['outputs'], rules, outputs, options).run
|
74
|
+
else
|
75
|
+
puts "collection #{collection_name} is missing"
|
76
|
+
end
|
57
77
|
end
|
58
78
|
end
|
59
79
|
|
60
80
|
def output_response
|
61
|
-
|
81
|
+
if collection_response.parsed_response.nil?
|
82
|
+
puts "collection response is null"
|
83
|
+
else
|
84
|
+
puts collection_response.parsed_response['message']
|
85
|
+
end
|
62
86
|
end
|
63
87
|
|
64
|
-
def
|
65
|
-
collection_counts
|
88
|
+
def collection_counts
|
89
|
+
@collection_counts ||= collection_response.parsed_response
|
66
90
|
end
|
67
91
|
|
68
|
-
def
|
69
|
-
@
|
92
|
+
def collection_response
|
93
|
+
@collection_response || AnswersEngine::Client::ScraperJobOutput.new.collections(scraper_name)
|
70
94
|
end
|
71
95
|
end
|
72
96
|
|
73
97
|
class ValidateCollection
|
74
|
-
attr_reader :scraper_name, :collection_name, :total_records, :rules, :errors, :outputs
|
98
|
+
attr_reader :scraper_name, :collection_name, :total_records, :rules, :errors, :outputs, :options
|
75
99
|
|
76
|
-
def initialize(scraper_name, collection_name, total_records, rules, outputs)
|
100
|
+
def initialize(scraper_name, collection_name, total_records, rules, outputs, options)
|
77
101
|
@scraper_name = scraper_name
|
78
102
|
@collection_name = collection_name
|
79
103
|
@total_records = total_records
|
80
104
|
@rules = rules
|
81
105
|
@outputs = outputs
|
106
|
+
@options = options
|
82
107
|
@errors = { errored_items: [] }
|
83
108
|
end
|
84
109
|
|
@@ -88,7 +113,7 @@ module AeEasy
|
|
88
113
|
ValidateGroups.new(data, scraper_name, collection_name, errors).run
|
89
114
|
ValidateRules.new(data, errors, rules).run if rules
|
90
115
|
end
|
91
|
-
SaveOutput.new(data.count, rules, errors, outputs_collection_name, outputs,
|
116
|
+
SaveOutput.new(data.count, rules, errors, outputs_collection_name, outputs, options).run
|
92
117
|
end
|
93
118
|
|
94
119
|
private
|
data/lib/ae_easy/qa/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ae_easy-qa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.22
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Lynam
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-07-
|
11
|
+
date: 2019-07-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: answersengine
|