smart_schema 0.11.0 → 0.12.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
- metadata +60 -71
- data/.gitignore +0 -12
- data/.rspec +0 -3
- data/.rubocop.yml +0 -20
- data/CHANGELOG.md +0 -68
- data/CODE_OF_CONDUCT.md +0 -74
- data/Gemfile +0 -5
- data/Gemfile.lock +0 -106
- data/LICENSE.txt +0 -21
- data/README.md +0 -236
- data/Rakefile +0 -21
- data/bin/console +0 -8
- data/bin/setup +0 -8
- data/lib/smart_core/schema/checker/reconciler/constructor.rb +0 -60
- data/lib/smart_core/schema/checker/reconciler/matcher/options.rb +0 -33
- data/lib/smart_core/schema/checker/reconciler/matcher/result.rb +0 -87
- data/lib/smart_core/schema/checker/reconciler/matcher/result_finalizer.rb +0 -186
- data/lib/smart_core/schema/checker/reconciler/matcher.rb +0 -62
- data/lib/smart_core/schema/checker/reconciler.rb +0 -106
- data/lib/smart_core/schema/checker/rules/base.rb +0 -110
- data/lib/smart_core/schema/checker/rules/extra_keys/failure.rb +0 -24
- data/lib/smart_core/schema/checker/rules/extra_keys/result.rb +0 -37
- data/lib/smart_core/schema/checker/rules/extra_keys/success.rb +0 -30
- data/lib/smart_core/schema/checker/rules/extra_keys.rb +0 -31
- data/lib/smart_core/schema/checker/rules/optional.rb +0 -25
- data/lib/smart_core/schema/checker/rules/options/empty.rb +0 -43
- data/lib/smart_core/schema/checker/rules/options/filled.rb +0 -49
- data/lib/smart_core/schema/checker/rules/options/type.rb +0 -86
- data/lib/smart_core/schema/checker/rules/options.rb +0 -60
- data/lib/smart_core/schema/checker/rules/required.rb +0 -25
- data/lib/smart_core/schema/checker/rules/requirement/optional.rb +0 -36
- data/lib/smart_core/schema/checker/rules/requirement/required.rb +0 -36
- data/lib/smart_core/schema/checker/rules/requirement/result.rb +0 -95
- data/lib/smart_core/schema/checker/rules/requirement.rb +0 -9
- data/lib/smart_core/schema/checker/rules/result/base.rb +0 -44
- data/lib/smart_core/schema/checker/rules/result/failure.rb +0 -41
- data/lib/smart_core/schema/checker/rules/result/success.rb +0 -15
- data/lib/smart_core/schema/checker/rules/result.rb +0 -9
- data/lib/smart_core/schema/checker/rules/type_aliases.rb +0 -57
- data/lib/smart_core/schema/checker/rules/verifier/result.rb +0 -75
- data/lib/smart_core/schema/checker/rules/verifier.rb +0 -74
- data/lib/smart_core/schema/checker/rules.rb +0 -89
- data/lib/smart_core/schema/checker/verifiable_hash.rb +0 -65
- data/lib/smart_core/schema/checker.rb +0 -106
- data/lib/smart_core/schema/dsl.rb +0 -81
- data/lib/smart_core/schema/errors.rb +0 -13
- data/lib/smart_core/schema/key_control.rb +0 -39
- data/lib/smart_core/schema/result.rb +0 -62
- data/lib/smart_core/schema/version.rb +0 -14
- data/lib/smart_core/schema.rb +0 -52
- data/smart_schema.gemspec +0 -42
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# @api private
|
|
4
|
-
# @since 0.1.0
|
|
5
|
-
class SmartCore::Schema::Checker::Rules::Requirement::Result
|
|
6
|
-
# @return [Symbol]
|
|
7
|
-
#
|
|
8
|
-
# @api private
|
|
9
|
-
# @since 0.1.0
|
|
10
|
-
ERROR_CODE = :required_key_not_found
|
|
11
|
-
|
|
12
|
-
# @return [String]
|
|
13
|
-
#
|
|
14
|
-
# @api private
|
|
15
|
-
# @since 0.1.0
|
|
16
|
-
attr_reader :key
|
|
17
|
-
|
|
18
|
-
# @return [SmartCore::Schema::Checker::VerifiableHash]
|
|
19
|
-
#
|
|
20
|
-
# @api private
|
|
21
|
-
# @since 0.1.0
|
|
22
|
-
attr_reader :verifiable_hash
|
|
23
|
-
|
|
24
|
-
# @return [Symbol, NilClass]
|
|
25
|
-
#
|
|
26
|
-
# @api private
|
|
27
|
-
# @since 0.1.0
|
|
28
|
-
attr_reader :error
|
|
29
|
-
|
|
30
|
-
# @return [String, NilClass]
|
|
31
|
-
#
|
|
32
|
-
# @api private
|
|
33
|
-
# @since 0.1.0
|
|
34
|
-
attr_reader :message
|
|
35
|
-
|
|
36
|
-
# @param key [String]
|
|
37
|
-
# @param verifiable_hash [SmartCore::Schema::Checker::VerifiableHash]
|
|
38
|
-
# @param required [Boolean]
|
|
39
|
-
# @param key_exists [Boolean]
|
|
40
|
-
# @return [void]
|
|
41
|
-
#
|
|
42
|
-
# @api private
|
|
43
|
-
# @since 0.1.0
|
|
44
|
-
def initialize(key, verifiable_hash, required:, key_exists:)
|
|
45
|
-
@key = key
|
|
46
|
-
@verifiable_hash = verifiable_hash
|
|
47
|
-
@required = required
|
|
48
|
-
@optional = !required
|
|
49
|
-
@key_exists = key_exists
|
|
50
|
-
@success = required ? key_exists : true
|
|
51
|
-
@failure = required ? !key_exists : false
|
|
52
|
-
@error = (required && !key_exists) ? ERROR_CODE : nil
|
|
53
|
-
@message = (required && !key_exists) ? "Required key :#{key} not found" : nil
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
# @return [Boolean]
|
|
57
|
-
#
|
|
58
|
-
# @api private
|
|
59
|
-
# @since 0.1.0
|
|
60
|
-
def success?
|
|
61
|
-
@success
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
# @return [Boolean]
|
|
65
|
-
#
|
|
66
|
-
# @api private
|
|
67
|
-
# @since 0.1.0
|
|
68
|
-
def failure?
|
|
69
|
-
@failure
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
# @return [Boolean]
|
|
73
|
-
#
|
|
74
|
-
# @api private
|
|
75
|
-
# @since 0.1.0
|
|
76
|
-
def key_exists?
|
|
77
|
-
@key_exists
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
# @return [Boolean]
|
|
81
|
-
#
|
|
82
|
-
# @api private
|
|
83
|
-
# @since 0.1.0
|
|
84
|
-
def optional?
|
|
85
|
-
@optional
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
# @return [Boolean]
|
|
89
|
-
#
|
|
90
|
-
# @api private
|
|
91
|
-
# @since 0.1.0
|
|
92
|
-
def required?
|
|
93
|
-
@required
|
|
94
|
-
end
|
|
95
|
-
end
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# @api private
|
|
4
|
-
# @since 0.1.0
|
|
5
|
-
class SmartCore::Schema::Checker::Rules::Result::Base
|
|
6
|
-
# @return [String]
|
|
7
|
-
#
|
|
8
|
-
# @api public
|
|
9
|
-
# @since 0.1.0
|
|
10
|
-
attr_reader :key
|
|
11
|
-
|
|
12
|
-
# @return [Any]
|
|
13
|
-
#
|
|
14
|
-
# @api public
|
|
15
|
-
# @since 0.1.0
|
|
16
|
-
attr_reader :value
|
|
17
|
-
|
|
18
|
-
# @option key [String]
|
|
19
|
-
# @option value [Any]
|
|
20
|
-
# @return [void]
|
|
21
|
-
#
|
|
22
|
-
# @api private
|
|
23
|
-
# @since 0.1.0
|
|
24
|
-
def initialize(key:, value:)
|
|
25
|
-
@key = key
|
|
26
|
-
@value = value
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# @return [Boolean]
|
|
30
|
-
#
|
|
31
|
-
# @api public
|
|
32
|
-
# @since 0.1.0
|
|
33
|
-
def success?
|
|
34
|
-
false
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# @return [Boolean]
|
|
38
|
-
#
|
|
39
|
-
# @api public
|
|
40
|
-
# @since 0.1.0
|
|
41
|
-
def failure?
|
|
42
|
-
false
|
|
43
|
-
end
|
|
44
|
-
end
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module SmartCore::Schema::Checker::Rules::Result
|
|
4
|
-
# @api private
|
|
5
|
-
# @since 0.1.0
|
|
6
|
-
class Failure < Base
|
|
7
|
-
# @return [Symbol]
|
|
8
|
-
#
|
|
9
|
-
# @api public
|
|
10
|
-
# @since 0.1.0
|
|
11
|
-
attr_reader :error
|
|
12
|
-
|
|
13
|
-
# @return [String]
|
|
14
|
-
#
|
|
15
|
-
# @api public
|
|
16
|
-
# @since 0.1.0
|
|
17
|
-
attr_reader :message
|
|
18
|
-
|
|
19
|
-
# @option key [String]
|
|
20
|
-
# @option value [Any]
|
|
21
|
-
# @option error [Symbol]
|
|
22
|
-
# @option message [String]
|
|
23
|
-
# @return [void]
|
|
24
|
-
#
|
|
25
|
-
# @api private
|
|
26
|
-
# @since 0.1.0
|
|
27
|
-
def initialize(key:, value:, error:, message:)
|
|
28
|
-
super(key: key, value: value)
|
|
29
|
-
@error = error
|
|
30
|
-
@message = message
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# @return [Boolean]
|
|
34
|
-
#
|
|
35
|
-
# @api public
|
|
36
|
-
# @since 0.1.0
|
|
37
|
-
def failure?
|
|
38
|
-
true
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# @api private
|
|
4
|
-
# @since 0.1.0
|
|
5
|
-
# rubocop:disable Style/StaticClass
|
|
6
|
-
class SmartCore::Schema::Checker::Rules
|
|
7
|
-
# @todo rework with smart_type-system
|
|
8
|
-
# @note non-frized constant is used for temporary extendability
|
|
9
|
-
# @return [SmartCore::Types::Primitive]
|
|
10
|
-
#
|
|
11
|
-
# @api private
|
|
12
|
-
# @since 0.1.0
|
|
13
|
-
# @version 0.2.0
|
|
14
|
-
# rubocop:disable Style/MutableConstant
|
|
15
|
-
TYPE_ALIASES = {
|
|
16
|
-
'value.any' => SmartCore::Types::Value::Any.nilable,
|
|
17
|
-
'value.nil' => SmartCore::Types::Value::Nil.nilable,
|
|
18
|
-
'value.string' => SmartCore::Types::Value::String.nilable,
|
|
19
|
-
'value.symbol' => SmartCore::Types::Value::Symbol.nilable,
|
|
20
|
-
'value.text' => SmartCore::Types::Value::Text.nilable,
|
|
21
|
-
'value.integer' => SmartCore::Types::Value::Integer.nilable,
|
|
22
|
-
'value.float' => SmartCore::Types::Value::Float.nilable,
|
|
23
|
-
'value.numeric' => SmartCore::Types::Value::Numeric.nilable,
|
|
24
|
-
'value.big_decimal' => SmartCore::Types::Value::BigDecimal.nilable,
|
|
25
|
-
'value.boolean' => SmartCore::Types::Value::Boolean.nilable,
|
|
26
|
-
'value.array' => SmartCore::Types::Value::Array.nilable,
|
|
27
|
-
'value.hash' => SmartCore::Types::Value::Hash.nilable,
|
|
28
|
-
'value.proc' => SmartCore::Types::Value::Proc.nilable,
|
|
29
|
-
'value.class' => SmartCore::Types::Value::Class.nilable,
|
|
30
|
-
'value.module' => SmartCore::Types::Value::Module.nilable,
|
|
31
|
-
'value.time' => SmartCore::Types::Value::Time.nilable,
|
|
32
|
-
'value.date_time' => SmartCore::Types::Value::DateTime.nilable,
|
|
33
|
-
'value.date' => SmartCore::Types::Value::Date.nilable,
|
|
34
|
-
'value.time_based' => SmartCore::Types::Value::TimeBased.nilable,
|
|
35
|
-
'any' => SmartCore::Types::Value::Any.nilable,
|
|
36
|
-
'nil' => SmartCore::Types::Value::Nil.nilable,
|
|
37
|
-
'string' => SmartCore::Types::Value::String.nilable,
|
|
38
|
-
'symbol' => SmartCore::Types::Value::Symbol.nilable,
|
|
39
|
-
'text' => SmartCore::Types::Value::Text.nilable,
|
|
40
|
-
'integer' => SmartCore::Types::Value::Integer.nilable,
|
|
41
|
-
'float' => SmartCore::Types::Value::Float.nilable,
|
|
42
|
-
'numeric' => SmartCore::Types::Value::Numeric.nilable,
|
|
43
|
-
'big_decimal' => SmartCore::Types::Value::BigDecimal.nilable,
|
|
44
|
-
'boolean' => SmartCore::Types::Value::Boolean.nilable,
|
|
45
|
-
'array' => SmartCore::Types::Value::Array.nilable,
|
|
46
|
-
'hash' => SmartCore::Types::Value::Hash.nilable,
|
|
47
|
-
'proc' => SmartCore::Types::Value::Proc.nilable,
|
|
48
|
-
'class' => SmartCore::Types::Value::Class.nilable,
|
|
49
|
-
'module' => SmartCore::Types::Value::Module.nilable,
|
|
50
|
-
'time' => SmartCore::Types::Value::Time.nilable,
|
|
51
|
-
'date_time' => SmartCore::Types::Value::DateTime.nilable,
|
|
52
|
-
'date' => SmartCore::Types::Value::Date.nilable,
|
|
53
|
-
'time_based' => SmartCore::Types::Value::TimeBased.nilable
|
|
54
|
-
}
|
|
55
|
-
# rubocop:enable Style/MutableConstant
|
|
56
|
-
end
|
|
57
|
-
# rubocop:enable Style/StaticClass
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# @api private
|
|
4
|
-
# @since 0.1.0
|
|
5
|
-
class SmartCore::Schema::Checker::Rules::Verifier::Result
|
|
6
|
-
# @since 0.1.0
|
|
7
|
-
include Enumerable
|
|
8
|
-
|
|
9
|
-
# @return [Array<SmartCore::Schema::Checker::Rules::Result::Base>]
|
|
10
|
-
#
|
|
11
|
-
# @api private
|
|
12
|
-
# @since 0.1.0
|
|
13
|
-
attr_reader :results
|
|
14
|
-
|
|
15
|
-
# @return [SmartCore::Schema::Checker::Rules::Base]
|
|
16
|
-
#
|
|
17
|
-
# @api private
|
|
18
|
-
# @since 0.1.0
|
|
19
|
-
attr_reader :rule
|
|
20
|
-
|
|
21
|
-
# @return [void]
|
|
22
|
-
#
|
|
23
|
-
# @api private
|
|
24
|
-
# @since 0.1.0
|
|
25
|
-
def initialize(rule)
|
|
26
|
-
@rule = rule
|
|
27
|
-
@results = []
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# @return [String]
|
|
31
|
-
#
|
|
32
|
-
# @api private
|
|
33
|
-
# @since 0.1.0
|
|
34
|
-
def key
|
|
35
|
-
rule.schema_key
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# @param result [SmartCore::Schema::Checker::Rules::Result::Base]
|
|
39
|
-
# @return [result]
|
|
40
|
-
#
|
|
41
|
-
# @api private
|
|
42
|
-
# @since 0.1.0
|
|
43
|
-
def add(result)
|
|
44
|
-
result.tap { results << result }
|
|
45
|
-
end
|
|
46
|
-
alias_method :<<, :add
|
|
47
|
-
|
|
48
|
-
# @param block [Block]
|
|
49
|
-
# @yield [result]
|
|
50
|
-
# @yieldparam result [SmartCore::Schema::Checker::Rules::Result::Base]
|
|
51
|
-
# @return [Enumerable]
|
|
52
|
-
#
|
|
53
|
-
# @api private
|
|
54
|
-
# @since 0.1.0
|
|
55
|
-
def each(&block)
|
|
56
|
-
block_given? ? results.each(&block) : results.each
|
|
57
|
-
end
|
|
58
|
-
alias_method :each_result, :each
|
|
59
|
-
|
|
60
|
-
# @return [Boolean]
|
|
61
|
-
#
|
|
62
|
-
# @api public
|
|
63
|
-
# @since 0.1.0
|
|
64
|
-
def success?
|
|
65
|
-
results.all?(&:success?)
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# @return [Boolean]
|
|
69
|
-
#
|
|
70
|
-
# @api public
|
|
71
|
-
# @since 0.1.0
|
|
72
|
-
def failure?
|
|
73
|
-
results.all?(&:failure?)
|
|
74
|
-
end
|
|
75
|
-
end
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# @api private
|
|
4
|
-
# @since 0.1.0
|
|
5
|
-
# @version 0.3.0
|
|
6
|
-
module SmartCore::Schema::Checker::Rules::Verifier
|
|
7
|
-
require_relative 'verifier/result'
|
|
8
|
-
|
|
9
|
-
class << self
|
|
10
|
-
# @param rule [SmartCore::Schema::Checker::Rules::Base]
|
|
11
|
-
# @param matcher_options [SmartCore::Schema::Checker::Reconciler::Matcher::Options]
|
|
12
|
-
# @param verifiable_hash [SmartCore::Schema::Checker::VerifiableHash]
|
|
13
|
-
# @return [SmartCore::Schema::Checker::Rules::Verifier::Result]
|
|
14
|
-
#
|
|
15
|
-
# @api private
|
|
16
|
-
# @since 0.1.0
|
|
17
|
-
# @version 0.3.0
|
|
18
|
-
def verify!(rule, matcher_options, verifiable_hash)
|
|
19
|
-
SmartCore::Schema::Checker::Rules::Verifier::Result.new(rule).tap do |result|
|
|
20
|
-
requirement = result << check_requirement(rule, verifiable_hash)
|
|
21
|
-
next result if requirement.required? && requirement.failure?
|
|
22
|
-
next result if requirement.optional? && requirement.success? && !requirement.key_exists?
|
|
23
|
-
result << check_type(rule, verifiable_hash)
|
|
24
|
-
filled = result << check_filled(rule, verifiable_hash)
|
|
25
|
-
result << check_nested(rule, verifiable_hash) if filled.success?
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
31
|
-
# @param rule [SmartCore::Schema::Checker::Rules::Base]
|
|
32
|
-
# @param verifiable_hash [SmartCore::Schema::Checker::VerifiableHash]
|
|
33
|
-
# @return [SmartCore::Schema::Checker::Rules::Requirement::Result]
|
|
34
|
-
#
|
|
35
|
-
# @api private
|
|
36
|
-
# @since 0.1.0
|
|
37
|
-
def check_requirement(rule, verifiable_hash)
|
|
38
|
-
rule.requirement.validate(verifiable_hash)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
# @param rule [SmartCore::Schema::Checker::Rules::Base]
|
|
42
|
-
# @param verifiable_hash [SmartCore::Schema::Checker::VerifiableHash]
|
|
43
|
-
# @return [SmartCore::Schema::Checker::Rules::Result::Success]
|
|
44
|
-
# @return [SmartCore::Schema::Checker::Rules::Result::Failure]
|
|
45
|
-
#
|
|
46
|
-
# @api private
|
|
47
|
-
# @since 0.1.0
|
|
48
|
-
def check_type(rule, verifiable_hash)
|
|
49
|
-
rule.options.type.validate(verifiable_hash)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# @param rule [SmartCore::Schema::Checker::Rules::Base]
|
|
53
|
-
# @param verifiable_hash [SmartCore::Schema::Checker::VerifiableHash]
|
|
54
|
-
# @return [SmartCore::Schema::Checker::Rules::Result::Success]
|
|
55
|
-
# @return [SmartCore::Schema::Checker::Rules::Result::Failure]
|
|
56
|
-
#
|
|
57
|
-
# @api private
|
|
58
|
-
# @since 0.1.0
|
|
59
|
-
def check_filled(rule, verifiable_hash)
|
|
60
|
-
rule.options.filled.validate(verifiable_hash)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# @param rule [SmartCore::Schema::Checker::Rules::Base]
|
|
64
|
-
# @param verifiable_hash [SmartCore::Schema::Checker::VerifiableHash]
|
|
65
|
-
# @return [NilClass, SmartCore::Schema::Checker::Reconciler::Matcher::Result]
|
|
66
|
-
#
|
|
67
|
-
# @api private
|
|
68
|
-
# @since 0.1.0
|
|
69
|
-
def check_nested(rule, verifiable_hash)
|
|
70
|
-
return unless rule.nested_reconciler
|
|
71
|
-
rule.nested_reconciler.__match!(verifiable_hash.extract(rule.schema_key))
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# @api private
|
|
4
|
-
# @since 0.1.0
|
|
5
|
-
# @version 0.8.0
|
|
6
|
-
class SmartCore::Schema::Checker::Rules
|
|
7
|
-
require_relative 'rules/type_aliases'
|
|
8
|
-
require_relative 'rules/base'
|
|
9
|
-
require_relative 'rules/result'
|
|
10
|
-
require_relative 'rules/optional'
|
|
11
|
-
require_relative 'rules/required'
|
|
12
|
-
require_relative 'rules/extra_keys'
|
|
13
|
-
require_relative 'rules/options'
|
|
14
|
-
require_relative 'rules/requirement'
|
|
15
|
-
require_relative 'rules/verifier'
|
|
16
|
-
|
|
17
|
-
# @since 0.1.0
|
|
18
|
-
include Enumerable
|
|
19
|
-
|
|
20
|
-
# @return [void]
|
|
21
|
-
#
|
|
22
|
-
# @api private
|
|
23
|
-
# @since 0.1.0
|
|
24
|
-
# @version 0.8.0
|
|
25
|
-
def initialize
|
|
26
|
-
@rules = {}
|
|
27
|
-
@cache = SmartCore::Engine::Cache.new
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# @param schema_key [String]
|
|
31
|
-
# @param rule [SmartCore::Schema::Checker::Rules::Base]
|
|
32
|
-
# @return [SmartCore::Schema::Checker::Rules::Base]
|
|
33
|
-
#
|
|
34
|
-
# @api private
|
|
35
|
-
# @since 0.1.0
|
|
36
|
-
# @version 0.8..0
|
|
37
|
-
def []=(schema_key, rule)
|
|
38
|
-
cache.clear
|
|
39
|
-
rules[schema_key] = rule
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
# @param block [Block]
|
|
43
|
-
# @yield [schema_key, rule]
|
|
44
|
-
# @yieldparam schema_key [String]
|
|
45
|
-
# @yieldparam rule [SmartCore::Schema::Checker::Rules::Base]
|
|
46
|
-
# @return [Enumerable]
|
|
47
|
-
#
|
|
48
|
-
# @api private
|
|
49
|
-
# @since 0.1.0
|
|
50
|
-
# @version 0.8.0
|
|
51
|
-
def each(&block)
|
|
52
|
-
block_given? ? rules.each_pair(&block) : rules.each_pair
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
# @param block [Block]
|
|
56
|
-
# @yield [rule]
|
|
57
|
-
# @yieldparam rule [SmartCore::Schema::Checker::Rules::Base]
|
|
58
|
-
# @return [Enumerable]
|
|
59
|
-
#
|
|
60
|
-
# @api private
|
|
61
|
-
# @since 0.1.0
|
|
62
|
-
# @version 0.8.0
|
|
63
|
-
def each_rule(&block)
|
|
64
|
-
block_given? ? rules.each_value(&block) : rules.each_value
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
# @return [Array<String>]
|
|
68
|
-
#
|
|
69
|
-
# @api private
|
|
70
|
-
# @since 0.1.0
|
|
71
|
-
# @version 0.8.0
|
|
72
|
-
def keys
|
|
73
|
-
cache.read(:keys) { rules.keys }
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
private
|
|
77
|
-
|
|
78
|
-
# @return [Hash<String,SmartCore::Schema::Checker::Rules::Base>]
|
|
79
|
-
#
|
|
80
|
-
# @api private
|
|
81
|
-
# @since 0.1.0
|
|
82
|
-
attr_reader :rules
|
|
83
|
-
|
|
84
|
-
# @return [SmartCore::Engine::Cache]
|
|
85
|
-
#
|
|
86
|
-
# @api private
|
|
87
|
-
# @since 0.8.0
|
|
88
|
-
attr_reader :cache
|
|
89
|
-
end
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# @api private
|
|
4
|
-
# @since 0.1.0
|
|
5
|
-
# @version 0.8.0
|
|
6
|
-
class SmartCore::Schema::Checker::VerifiableHash
|
|
7
|
-
# @return [Hash<String|Symbol,Any>]
|
|
8
|
-
#
|
|
9
|
-
# @api private
|
|
10
|
-
# @since 0.1.0
|
|
11
|
-
attr_reader :source
|
|
12
|
-
|
|
13
|
-
# @param source [Hash<String|Symbol,Any>]
|
|
14
|
-
# @return [void]
|
|
15
|
-
#
|
|
16
|
-
# @api private
|
|
17
|
-
# @since 0.1.0
|
|
18
|
-
def initialize(source)
|
|
19
|
-
@source = source
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# @param key [String]
|
|
23
|
-
# @return [SmartCore::Schema::Checker::VerifiableHash]
|
|
24
|
-
#
|
|
25
|
-
# @api private
|
|
26
|
-
# @since 0.8.0
|
|
27
|
-
def extract(key)
|
|
28
|
-
SmartCore::Schema::Checker::VerifiableHash.new(fetch(key))
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# @return [Array<String>]
|
|
32
|
-
#
|
|
33
|
-
# @api private
|
|
34
|
-
# @since 0.1.0
|
|
35
|
-
# @version 0.8.0
|
|
36
|
-
def keys
|
|
37
|
-
SmartCore::Schema::KeyControl.normalize_list(source.keys)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# @param key [String]
|
|
41
|
-
# @return [Boolean]
|
|
42
|
-
#
|
|
43
|
-
# @api private
|
|
44
|
-
# @since 0.1.0
|
|
45
|
-
# @version 0.8.0
|
|
46
|
-
def key?(key)
|
|
47
|
-
source.key?(key) || source.key?(key.to_sym)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# @param key [String]
|
|
51
|
-
# @return [Any]
|
|
52
|
-
#
|
|
53
|
-
# @api private
|
|
54
|
-
# @since 0.1.0
|
|
55
|
-
# @version 0.8.0
|
|
56
|
-
def fetch(key)
|
|
57
|
-
# @note
|
|
58
|
-
# Previously we used exceptional flow "hash.fetch(key) rescue hash.fetch(key.to_sym)".
|
|
59
|
-
# This flow can generate a lot of useless objects during rescuable `KeyError` exception
|
|
60
|
-
# (useless error messages, backtraces, etc, object that was silently suppressed).
|
|
61
|
-
# So, the "if"-#key?-oriented flow is better (generates fewer number of objects statistically)
|
|
62
|
-
source.key?(key) ? source.fetch(key) : source.fetch(key.to_sym)
|
|
63
|
-
end
|
|
64
|
-
alias_method :[], :fetch
|
|
65
|
-
end
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# @api private
|
|
4
|
-
# @since 0.1.0
|
|
5
|
-
# @version 0.9.0
|
|
6
|
-
class SmartCore::Schema::Checker
|
|
7
|
-
require_relative 'checker/verifiable_hash'
|
|
8
|
-
require_relative 'checker/rules'
|
|
9
|
-
require_relative 'checker/reconciler'
|
|
10
|
-
|
|
11
|
-
# @return [void]
|
|
12
|
-
#
|
|
13
|
-
# @api private
|
|
14
|
-
# @since 0.1.0
|
|
15
|
-
# @version 0.9.0
|
|
16
|
-
def initialize
|
|
17
|
-
@reconciler = Reconciler::Constructor.create
|
|
18
|
-
@lock = SmartCore::Engine::ReadWriteLock.new
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# @param verifiable_hash [Hash<String|Symbol,Any>]
|
|
22
|
-
# @return [SmartCore::Schema::Result]
|
|
23
|
-
#
|
|
24
|
-
# @api private
|
|
25
|
-
# @since 0.1.0
|
|
26
|
-
# @version 0.9.0
|
|
27
|
-
def check!(verifiable_hash)
|
|
28
|
-
@lock.read_sync do
|
|
29
|
-
raise(SmartCore::Schema::ArgumentError, <<~ERROR_MESSAGE) unless verifiable_hash.is_a?(Hash)
|
|
30
|
-
Verifiable hash should be a type of ::Hash
|
|
31
|
-
ERROR_MESSAGE
|
|
32
|
-
|
|
33
|
-
reconciler.__match!(VerifiableHash.new(verifiable_hash)).complete!
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# @param checker_invokations [Block]
|
|
38
|
-
# @return [void]
|
|
39
|
-
#
|
|
40
|
-
# @api private
|
|
41
|
-
# @since 0.3.0
|
|
42
|
-
# @version 0.9.0
|
|
43
|
-
def invoke_in_pipe(&checker_invokations)
|
|
44
|
-
@lock.write_sync { instance_eval(&checker_invokations) }
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
# @param strict_mode [NilClass, String, Symbol]
|
|
48
|
-
# @return [void]
|
|
49
|
-
#
|
|
50
|
-
# @api private
|
|
51
|
-
# @since 0.3.0
|
|
52
|
-
# @version 0.9.0
|
|
53
|
-
def set_strict_mode(strict_mode)
|
|
54
|
-
@lock.write_sync { apply_strict_mode(strict_mode) }
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# @param definitions [Block]
|
|
58
|
-
# @return [void]
|
|
59
|
-
#
|
|
60
|
-
# @api private
|
|
61
|
-
# @since 0.1.0
|
|
62
|
-
# @version 0.9.0
|
|
63
|
-
def append_schema_definitions(&definitions)
|
|
64
|
-
@lock.write_sync { add_schema_definitions(&definitions) }
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
# @param another_checker [SmartCore::Schema::Checker]
|
|
68
|
-
# @return [SmartCore::Schema::Checker]
|
|
69
|
-
#
|
|
70
|
-
# @api private
|
|
71
|
-
# @since 0.1.0
|
|
72
|
-
# @version 0.9.0
|
|
73
|
-
def combine_with(another_checker)
|
|
74
|
-
@lock.write_sync { self } # TODO (0.x.0): merge the definitions and return self
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
private
|
|
78
|
-
|
|
79
|
-
# @return [SmartCore::Schema::Checker::Reconciler]
|
|
80
|
-
#
|
|
81
|
-
# @api private
|
|
82
|
-
# @since 0.1.0
|
|
83
|
-
attr_reader :reconciler
|
|
84
|
-
|
|
85
|
-
# @param definitions [Block]
|
|
86
|
-
# @return [void]
|
|
87
|
-
#
|
|
88
|
-
# @api private
|
|
89
|
-
# @since 0.1.0
|
|
90
|
-
def add_schema_definitions(&definitions)
|
|
91
|
-
raise(SmartCore::Schema::ArgumentError, <<~ERROR_MESSAGE) unless block_given?
|
|
92
|
-
Schema definitions is not provided (you should provide Block argument)
|
|
93
|
-
ERROR_MESSAGE
|
|
94
|
-
|
|
95
|
-
Reconciler::Constructor.append_definitions(reconciler, &definitions)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
# @param strict_mode [NilClass, String, Symbol]
|
|
99
|
-
# @return [void]
|
|
100
|
-
#
|
|
101
|
-
# @api private
|
|
102
|
-
# @since 0.3.0
|
|
103
|
-
def apply_strict_mode(strict_mode)
|
|
104
|
-
Reconciler::Constructor.set_strict_mode(reconciler, strict_mode)
|
|
105
|
-
end
|
|
106
|
-
end
|