easy_json_matcher 0.1.1 → 0.2.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 +4 -4
- data/lib/easy_json_matcher/schema_generator.rb +1 -1
- data/lib/easy_json_matcher/validator.rb +13 -1
- data/lib/easy_json_matcher/validator.rb~ +99 -0
- data/lib/easy_json_matcher/version.rb +2 -2
- data/lib/easy_json_matcher/version.rb~ +3 -0
- data/test/custom_validations_test.rb +26 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8247cb3e9791930357fc71b2adccd2207722d96c
|
4
|
+
data.tar.gz: a016110a42e4c8b82b0b58e06b9c0a858d20af14
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac9579c176287786a0f09bfe575f9362aa9d3ab723cf8ad6a94c18f546be62ec7f7cb08c1e9052f888129c0547ff8c2c82706e6c52042eb6ebe490acea22549c
|
7
|
+
data.tar.gz: 79cf3770d9f3898dfec75acfff000133e88f2e636e7a9f2ec802fd9386995aad72c73c39836d6584518213b52f2060916a29f0eb570e508ae7857c071be24ecf
|
@@ -1,12 +1,13 @@
|
|
1
1
|
module EasyJSONMatcher
|
2
2
|
class Validator
|
3
3
|
|
4
|
-
attr_reader :content, :required, :errors
|
4
|
+
attr_reader :content, :required, :errors, :custom_validator
|
5
5
|
attr_accessor :key
|
6
6
|
|
7
7
|
def initialize(options: {})
|
8
8
|
@key = options[:key]
|
9
9
|
@required = options[:required]
|
10
|
+
@custom_validator = options[:custom_validator]
|
10
11
|
@errors = []
|
11
12
|
_post_initialise(options)
|
12
13
|
end
|
@@ -24,6 +25,7 @@ module EasyJSONMatcher
|
|
24
25
|
else
|
25
26
|
_validate #Hook
|
26
27
|
end
|
28
|
+
_run_custom_validator if custom_validator
|
27
29
|
_no_errors?
|
28
30
|
end
|
29
31
|
|
@@ -83,6 +85,16 @@ module EasyJSONMatcher
|
|
83
85
|
ValidatorFactory.get_instance(type: type, opts: opts)
|
84
86
|
end
|
85
87
|
|
88
|
+
def _custom_validator?
|
89
|
+
custom_validator
|
90
|
+
end
|
91
|
+
|
92
|
+
def _run_custom_validator
|
93
|
+
if error_message = custom_validator.call(content)
|
94
|
+
errors << error_message
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
86
98
|
def _no_errors?
|
87
99
|
errors.empty?
|
88
100
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module EasyJSONMatcher
|
2
|
+
class Validator
|
3
|
+
|
4
|
+
attr_reader :content, :required, :errors, :custom_validator
|
5
|
+
attr_accessor :key
|
6
|
+
|
7
|
+
def initialize(options: {})
|
8
|
+
@key = options[:key]
|
9
|
+
@required = options[:required]
|
10
|
+
@custom_validator = options[:custom_validator]
|
11
|
+
@errors = []
|
12
|
+
_post_initialise(options)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Hook. Allows further setup to be carried out by subclasses
|
16
|
+
def _post_initialise(options); end
|
17
|
+
|
18
|
+
def valid?(candidate)
|
19
|
+
if key
|
20
|
+
return false unless _check_content_type(candidate)
|
21
|
+
end
|
22
|
+
_set_content(candidate) #Hook
|
23
|
+
if content.nil?
|
24
|
+
_check_required?
|
25
|
+
else
|
26
|
+
_validate #Hook
|
27
|
+
end
|
28
|
+
_run_custom_validator if custom_validator
|
29
|
+
_no_errors?
|
30
|
+
end
|
31
|
+
|
32
|
+
# Hook. Overriden in Node
|
33
|
+
def reset!
|
34
|
+
errors.clear
|
35
|
+
end
|
36
|
+
|
37
|
+
# Hook
|
38
|
+
# Protected method that Validators use to implement their validation logic.
|
39
|
+
# Called by #valid?
|
40
|
+
def _validate
|
41
|
+
raise NotImplementedError.new "Validators must override _validate"
|
42
|
+
end
|
43
|
+
|
44
|
+
# Hook
|
45
|
+
# Protected method that Validators use to set their content from the candidate.
|
46
|
+
def _set_content(candidate)
|
47
|
+
@content = key ? candidate[key] : candidate
|
48
|
+
end
|
49
|
+
|
50
|
+
# Hook.
|
51
|
+
# This method returns the errors that this validator has found in the candidate.
|
52
|
+
def get_errors
|
53
|
+
error_message = {}
|
54
|
+
error_message[key.to_sym] = errors
|
55
|
+
error_message
|
56
|
+
end
|
57
|
+
|
58
|
+
# This method makees sure that the candidate behaves like a Hash, and not a
|
59
|
+
# value or an array.
|
60
|
+
def _check_content_type(candidate)
|
61
|
+
# TODO perhaps this should raise an error instead of returning false?
|
62
|
+
# if the value that has arrived at this point doesn't behave like a Hash then it
|
63
|
+
# is in the wrong place.
|
64
|
+
begin
|
65
|
+
candidate[key]
|
66
|
+
rescue TypeError
|
67
|
+
return false
|
68
|
+
end
|
69
|
+
true
|
70
|
+
end
|
71
|
+
|
72
|
+
def _check_required?
|
73
|
+
if required
|
74
|
+
errors << "Value was not present"
|
75
|
+
return true
|
76
|
+
else
|
77
|
+
return false
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def _create_validator(type:, opts: {})
|
82
|
+
ValidatorFactory.get_instance(type: type, opts: opts)
|
83
|
+
end
|
84
|
+
|
85
|
+
def _custom_validator?
|
86
|
+
custom_validator
|
87
|
+
end
|
88
|
+
|
89
|
+
def _run_custom_validator
|
90
|
+
if error_message = custom_validator.call(content)
|
91
|
+
errors << error_message
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def _no_errors?
|
96
|
+
errors.empty?
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -1,3 +1,3 @@
|
|
1
|
-
module
|
2
|
-
VERSION = "0.
|
1
|
+
module EasyJSONMatcher
|
2
|
+
VERSION = "0.2.1".freeze
|
3
3
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CustomValidationsTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
test 'As a user, I want to be able to specify custom validations' do
|
6
|
+
test_schema = EasyJSONMatcher::SchemaGenerator.new do |s|
|
7
|
+
s.has_string key: :a_string, opts: { custom_validator: ->(candidate) { "String did not say 'hi'" unless candidate == 'hi' } }
|
8
|
+
end.generate_schema
|
9
|
+
|
10
|
+
should_not_validate = {
|
11
|
+
a_string: 'go away'
|
12
|
+
}.to_json
|
13
|
+
|
14
|
+
assert_not(test_schema.valid? should_not_validate)
|
15
|
+
|
16
|
+
should_validate = {
|
17
|
+
a_string: 'hi'
|
18
|
+
}.to_json
|
19
|
+
|
20
|
+
|
21
|
+
test_schema.reset!
|
22
|
+
|
23
|
+
assert(test_schema.valid?(should_validate), test_schema.get_errors)
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: easy_json_matcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- WJD Hamilton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-04-01 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Test your JSON output in Ruby, with a DSL that makes reasoning about
|
14
14
|
your JSON very straightforward. See the Homepage for docs.
|
@@ -34,10 +34,13 @@ files:
|
|
34
34
|
- lib/easy_json_matcher/string_validator.rb
|
35
35
|
- lib/easy_json_matcher/validation_error.rb
|
36
36
|
- lib/easy_json_matcher/validator.rb
|
37
|
+
- lib/easy_json_matcher/validator.rb~
|
37
38
|
- lib/easy_json_matcher/validator_factory.rb
|
38
39
|
- lib/easy_json_matcher/value_validator.rb
|
39
40
|
- lib/easy_json_matcher/version.rb
|
41
|
+
- lib/easy_json_matcher/version.rb~
|
40
42
|
- lib/tasks/jsonapi_matcher_tasks.rake
|
43
|
+
- test/custom_validations_test.rb
|
41
44
|
- test/easy_json_matcher_test.rb
|
42
45
|
- test/error_messages_test.rb
|
43
46
|
- test/global_validation_options_test.rb
|
@@ -73,6 +76,7 @@ signing_key:
|
|
73
76
|
specification_version: 4
|
74
77
|
summary: Easily test your JSON output with templates and Schemas
|
75
78
|
test_files:
|
79
|
+
- test/custom_validations_test.rb
|
76
80
|
- test/easy_json_matcher_test.rb
|
77
81
|
- test/error_messages_test.rb
|
78
82
|
- test/global_validation_options_test.rb
|