ae_easy-qa 0.0.1
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 +7 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/ae_easy/cli/qa.rb +11 -0
- data/lib/ae_easy/qa/validate_rules.rb +66 -0
- data/lib/ae_easy/qa/validate_type.rb +62 -0
- data/lib/ae_easy/qa/validate_value.rb +78 -0
- data/lib/ae_easy/qa/version.rb +5 -0
- data/lib/ae_easy/qa.rb +48 -0
- metadata +111 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 162ba4d965200f38a598f82b2f0fcece1271661aed432dcb144192e298e36f0e
|
4
|
+
data.tar.gz: 3617c675139bff6c03aef23d84aec977f36ba38f5cefad71b0cbd55a93ef6cd5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 499f8a663a16a0916cbeca8b8e0ceb0faef97847281debd19ec4f931e3a9deda204f00fa2d18c06f1dede3576c990cfb685428a6943d7e7207e5b6cf94406453
|
7
|
+
data.tar.gz: 02e39006630eaabb1b7543d73659de897ffec688deaf4721a0631e405d131ccf2de816febbfc85d748e65d40de9bba799e5ccf32ca7e253c48ba0c6b749bde40
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "ae_easy/qa"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
module AeEasy
|
2
|
+
module Qa
|
3
|
+
class ValidateRules
|
4
|
+
attr_reader :data, :errors, :rules
|
5
|
+
attr_accessor :errored_item
|
6
|
+
|
7
|
+
def initialize(data, errors, rules)
|
8
|
+
@data = data
|
9
|
+
@errors = errors
|
10
|
+
@rules = rules['individual_validations']
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
handle_rules
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def handle_rules
|
20
|
+
data.each do |data_hash|
|
21
|
+
reset_errored_item
|
22
|
+
rules.each{|field_to_validate, options|
|
23
|
+
options.each{|validation, value|
|
24
|
+
case validation
|
25
|
+
when 'required'
|
26
|
+
required_check(data_hash, field_to_validate) if value == true
|
27
|
+
when 'type'
|
28
|
+
ValidateType.new(data_hash, field_to_validate, value, rules, errored_item).run if options['required']
|
29
|
+
when 'value'
|
30
|
+
ValidateValue.new(data_hash, field_to_validate, value, errored_item).run if options['required']
|
31
|
+
when 'length'
|
32
|
+
validate_length(data_hash, field_to_validate, value) if options['required']
|
33
|
+
else
|
34
|
+
unknown_validation_error(validation) if validation !~ /format/
|
35
|
+
end
|
36
|
+
}
|
37
|
+
}
|
38
|
+
errors[:errored_items].push(errored_item) if errored_item && !errored_item[:failures].empty?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def required_check(data_hash, field_to_validate)
|
43
|
+
if data_hash[field_to_validate].nil? || (data_hash[field_to_validate].class == String && data_hash[field_to_validate].empty?)
|
44
|
+
add_errored_item(data_hash, field_to_validate, 'required')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def validate_length(data_hash, field_to_validate, length)
|
49
|
+
add_errored_item(data_hash, field_to_validate, 'length') if data_hash[field_to_validate].to_s.length != length
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_errored_item(data_hash, field_to_validate, validation)
|
53
|
+
errored_item[:data] = data_hash if errored_item[:data].nil?
|
54
|
+
errored_item[:failures].push({ field_to_validate.to_sym => validation })
|
55
|
+
end
|
56
|
+
|
57
|
+
def reset_errored_item
|
58
|
+
self.errored_item = { failures: [] }
|
59
|
+
end
|
60
|
+
|
61
|
+
def unknown_validation_error(validation)
|
62
|
+
raise StandardError.new("The validation '#{validation}' is unknown.")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module AeEasy
|
2
|
+
module Qa
|
3
|
+
class ValidateType < ValidateRules
|
4
|
+
attr_reader :data_hash, :field_to_validate, :desired_type, :rules
|
5
|
+
|
6
|
+
def initialize(data_hash, field_to_validate, desired_type, rules, errored_item)
|
7
|
+
@data_hash = data_hash
|
8
|
+
@field_to_validate = field_to_validate
|
9
|
+
@desired_type = desired_type
|
10
|
+
@rules = rules
|
11
|
+
@errored_item = errored_item
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
handle_types
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def handle_types
|
21
|
+
case desired_type
|
22
|
+
when 'String'
|
23
|
+
add_errored_item(data_hash, field_to_validate, 'type') if data_hash[field_to_validate].class != String
|
24
|
+
when 'Integer'
|
25
|
+
add_errored_item(data_hash, field_to_validate, 'type') unless data_hash[field_to_validate].class == Fixnum || data_hash[field_to_validate].to_s =~ /\A\d+(\.\d+)?\z/
|
26
|
+
when 'Float'
|
27
|
+
add_errored_item(data_hash, field_to_validate, 'type') unless data_hash[field_to_validate].class == Float || data_hash[field_to_validate].to_s =~ /\A\d+(\.\d+)?\z/
|
28
|
+
when 'Date'
|
29
|
+
validate_date_type
|
30
|
+
when 'Url'
|
31
|
+
add_errored_item(data_hash, field_to_validate, 'type') if data_hash[field_to_validate] !~ /^(http|https):\/\//
|
32
|
+
else
|
33
|
+
unknown_type_error(desired_type)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def validate_date_type
|
38
|
+
format = rules[field_to_validate]['format']
|
39
|
+
missing_date_format_error if format.nil?
|
40
|
+
date_str = data_hash[field_to_validate]
|
41
|
+
begin
|
42
|
+
date = Time.strptime(date_str, format.gsub('%-m', '%m').gsub('%-d', '%d'))
|
43
|
+
add_errored_item(data_hash, field_to_validate, 'type') if date.strftime(format) != date_str
|
44
|
+
rescue ArgumentError => e
|
45
|
+
if e.to_s =~ /^invalid strptime format/
|
46
|
+
add_errored_item(data_hash, field_to_validate, 'type')
|
47
|
+
else
|
48
|
+
raise StandardError.new(e.to_s)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def unknown_type_error(desired_type)
|
54
|
+
raise StandardError.new("The validation type '#{desired_type}' is unknown.")
|
55
|
+
end
|
56
|
+
|
57
|
+
def missing_date_format_error
|
58
|
+
raise StandardError.new("Date validation is missing a format.")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module AeEasy
|
2
|
+
module Qa
|
3
|
+
class ValidateValue < ValidateRules
|
4
|
+
attr_reader :data_hash, :field_to_validate, :params
|
5
|
+
|
6
|
+
def initialize(data_hash, field_to_validate, params, errored_item)
|
7
|
+
@data_hash = data_hash
|
8
|
+
@field_to_validate = field_to_validate
|
9
|
+
@params = params
|
10
|
+
@errored_item = errored_item
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
condition_exists? ? handle_conditions : main_value_check
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def condition_exists?
|
20
|
+
!params['if'].nil?
|
21
|
+
end
|
22
|
+
|
23
|
+
def handle_conditions
|
24
|
+
field_name = params['if'].keys.first
|
25
|
+
condition_hash = params['if'][field_name]
|
26
|
+
case condition_hash.keys.first
|
27
|
+
when 'value'
|
28
|
+
if(data_hash[field_name] == condition_hash.values.first)
|
29
|
+
main_value_check
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def main_value_check
|
35
|
+
if params['equal']
|
36
|
+
if equal_with_operators?
|
37
|
+
equal_with_operators
|
38
|
+
else
|
39
|
+
add_errored_item(data_hash, field_to_validate, 'value') if(data_hash[field_to_validate] != params['equal'])
|
40
|
+
end
|
41
|
+
elsif params['less_than']
|
42
|
+
add_errored_item(data_hash, field_to_validate, 'value') if !(data_hash[field_to_validate] < params['less_than'])
|
43
|
+
elsif params['greater_than']
|
44
|
+
add_errored_item(data_hash, field_to_validate, 'value') if !(data_hash[field_to_validate] > params['greater_than'])
|
45
|
+
else
|
46
|
+
unknown_value_error
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def equal_with_operators
|
51
|
+
case equal_operator
|
52
|
+
when 'or'
|
53
|
+
add_errored_item(data_hash, field_to_validate, 'value') if !or_statment
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def or_statment
|
58
|
+
eval or_vals.map{|val| "data_hash[field_to_validate] == #{val}" }.join(' || ')
|
59
|
+
end
|
60
|
+
|
61
|
+
def equal_with_operators?
|
62
|
+
params['equal'].class == Hash
|
63
|
+
end
|
64
|
+
|
65
|
+
def equal_operator
|
66
|
+
params['equal'].keys.first
|
67
|
+
end
|
68
|
+
|
69
|
+
def or_vals
|
70
|
+
params['equal']['or']
|
71
|
+
end
|
72
|
+
|
73
|
+
def unknown_value_error
|
74
|
+
raise StandardError.new("The value rule '#{params}' is unknown.")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lib/ae_easy/qa.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'ae_easy/qa/version'
|
2
|
+
require 'ae_easy/qa/validate_rules'
|
3
|
+
require 'ae_easy/qa/validate_type'
|
4
|
+
require 'ae_easy/qa/validate_value'
|
5
|
+
require 'answersengine'
|
6
|
+
|
7
|
+
module AeEasy
|
8
|
+
module Qa
|
9
|
+
class Validate
|
10
|
+
attr_accessor :rules
|
11
|
+
attr_reader :data, :errors
|
12
|
+
|
13
|
+
def initialize(data, options={})
|
14
|
+
load_rules
|
15
|
+
@data = data
|
16
|
+
@errors = { errored_items: [] }
|
17
|
+
end
|
18
|
+
|
19
|
+
def run
|
20
|
+
begin
|
21
|
+
ValidateRules.new(data, errors, rules).run if rules
|
22
|
+
return errors
|
23
|
+
rescue StandardError => e
|
24
|
+
puts "An error has occurred: #{e}"
|
25
|
+
return nil
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_validation(method)
|
30
|
+
instance_eval(&method)
|
31
|
+
end
|
32
|
+
|
33
|
+
def fail_validation
|
34
|
+
self.errors[@name.to_sym] = 'fail'
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def load_rules
|
40
|
+
self.rules = YAML.load(File.open(config_path))['qa'] if File.exists?(config_path)
|
41
|
+
end
|
42
|
+
|
43
|
+
def config_path
|
44
|
+
@config_path ||= File.expand_path('ae_easy.yaml', Dir.pwd)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
metadata
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ae_easy-qa
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- David Lynam
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-05-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: ae_easy-core
|
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: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.16'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.16'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '10.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '10.0'
|
69
|
+
description: AnswersEngine Easy QA gem allows you to ensure the quality of output
|
70
|
+
on Fetch
|
71
|
+
email:
|
72
|
+
- dlynam@gmail.com
|
73
|
+
executables: []
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- bin/console
|
78
|
+
- bin/setup
|
79
|
+
- lib/ae_easy/cli/qa.rb
|
80
|
+
- lib/ae_easy/qa.rb
|
81
|
+
- lib/ae_easy/qa/validate_rules.rb
|
82
|
+
- lib/ae_easy/qa/validate_type.rb
|
83
|
+
- lib/ae_easy/qa/validate_value.rb
|
84
|
+
- lib/ae_easy/qa/version.rb
|
85
|
+
homepage: https://answersengine.com
|
86
|
+
licenses:
|
87
|
+
- MIT
|
88
|
+
metadata:
|
89
|
+
homepage_uri: https://answersengine.com
|
90
|
+
source_code_uri: https://github.com/answersengine/ae_easy-qa
|
91
|
+
post_install_message:
|
92
|
+
rdoc_options: []
|
93
|
+
require_paths:
|
94
|
+
- lib
|
95
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 2.2.2
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
requirements: []
|
106
|
+
rubyforge_project:
|
107
|
+
rubygems_version: 2.7.8
|
108
|
+
signing_key:
|
109
|
+
specification_version: 4
|
110
|
+
summary: AnswersEngine Easy Quality Assurance gem
|
111
|
+
test_files: []
|