smart_schema 0.7.0 → 0.8.0
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/CHANGELOG.md +8 -0
- data/Gemfile.lock +54 -57
- data/lib/smart_core/schema/checker/reconciler/matcher/result.rb +11 -10
- data/lib/smart_core/schema/checker/reconciler.rb +17 -26
- data/lib/smart_core/schema/checker/rules/base.rb +10 -21
- data/lib/smart_core/schema/checker/rules/options.rb +9 -5
- data/lib/smart_core/schema/checker/rules.rb +15 -11
- data/lib/smart_core/schema/checker/verifiable_hash.rb +14 -17
- data/lib/smart_core/schema/version.rb +2 -2
- data/smart_schema.gemspec +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9b77c587cbf99773471fe28e8113fe603dd9fc8eba4fd6509d87695976affaef
|
|
4
|
+
data.tar.gz: dfbc216a7537c38b3dd2bb2dec9d7ce1a66f3c8b37528e903372a0519a44319a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 130dbacff8c5765ad68f19dec163111d5e498f8464f1d3f8c954e15b45c6f278b5981373c9619964db316bc57c34d0b11a2b2782dde1eec5d777d672c918cf35
|
|
7
|
+
data.tar.gz: 36cde9131e10e969a7470b26d6a3a8ea6044d27c11e61f50e320073293026f5259ab52b51cbf69c3d72b739e54220258b44da56a98223f0dc63cd8e5813072eb
|
data/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
All notable changes to this project will be documented in this file.
|
|
3
3
|
|
|
4
|
+
# [0.8.0] - 2022-09-30
|
|
5
|
+
## Changed
|
|
6
|
+
- Decreased object allocations and mutex usage
|
|
7
|
+
- the one mutex of `SmartCore::Schema::Checker` is enough cuz this mutex covers the entire validation process);
|
|
8
|
+
- more retained objects in `SmartCore::Schema::Checker::Rules` (cache layer for rule names);
|
|
9
|
+
- Updated development dependencies;
|
|
10
|
+
- Updated `smart_engine` dependency (`0.7` -> `0.8`);
|
|
11
|
+
|
|
4
12
|
# [0.7.0] - 2022-09-28
|
|
5
13
|
## Changed
|
|
6
14
|
- Started the total code refactoring in order to decrease object and memory allocations:
|
data/Gemfile.lock
CHANGED
|
@@ -1,98 +1,95 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
smart_schema (0.
|
|
5
|
-
smart_engine (~> 0.
|
|
4
|
+
smart_schema (0.8.0)
|
|
5
|
+
smart_engine (~> 0.13)
|
|
6
6
|
smart_types (~> 0.4)
|
|
7
7
|
|
|
8
8
|
GEM
|
|
9
9
|
remote: https://rubygems.org/
|
|
10
10
|
specs:
|
|
11
|
-
activesupport (
|
|
11
|
+
activesupport (7.0.4)
|
|
12
12
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
13
13
|
i18n (>= 1.6, < 2)
|
|
14
14
|
minitest (>= 5.1)
|
|
15
15
|
tzinfo (~> 2.0)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
rubocop (= 1.
|
|
19
|
-
rubocop-
|
|
20
|
-
rubocop-
|
|
21
|
-
rubocop-
|
|
22
|
-
|
|
23
|
-
ast (2.4.1)
|
|
16
|
+
armitage-rubocop (1.30.1.1)
|
|
17
|
+
rubocop (= 1.30.1)
|
|
18
|
+
rubocop-performance (= 1.14.2)
|
|
19
|
+
rubocop-rails (= 2.15.0)
|
|
20
|
+
rubocop-rake (= 0.6.0)
|
|
21
|
+
rubocop-rspec (= 2.11.1)
|
|
22
|
+
ast (2.4.2)
|
|
24
23
|
coderay (1.1.3)
|
|
25
|
-
concurrent-ruby (1.1.
|
|
26
|
-
diff-lcs (1.
|
|
27
|
-
docile (1.
|
|
28
|
-
i18n (1.
|
|
24
|
+
concurrent-ruby (1.1.10)
|
|
25
|
+
diff-lcs (1.5.0)
|
|
26
|
+
docile (1.4.0)
|
|
27
|
+
i18n (1.12.0)
|
|
29
28
|
concurrent-ruby (~> 1.0)
|
|
30
29
|
method_source (1.0.0)
|
|
31
|
-
minitest (5.
|
|
32
|
-
parallel (1.
|
|
33
|
-
parser (3.
|
|
30
|
+
minitest (5.16.3)
|
|
31
|
+
parallel (1.22.1)
|
|
32
|
+
parser (3.1.2.1)
|
|
34
33
|
ast (~> 2.4.1)
|
|
35
|
-
pry (0.
|
|
34
|
+
pry (0.14.1)
|
|
36
35
|
coderay (~> 1.1)
|
|
37
36
|
method_source (~> 1.0)
|
|
38
|
-
rack (
|
|
39
|
-
rainbow (3.
|
|
40
|
-
rake (13.0.
|
|
41
|
-
regexp_parser (2.0
|
|
42
|
-
rexml (3.2.
|
|
43
|
-
rspec (3.
|
|
44
|
-
rspec-core (~> 3.
|
|
45
|
-
rspec-expectations (~> 3.
|
|
46
|
-
rspec-mocks (~> 3.
|
|
47
|
-
rspec-core (3.
|
|
48
|
-
rspec-support (~> 3.
|
|
49
|
-
rspec-expectations (3.
|
|
37
|
+
rack (3.0.0)
|
|
38
|
+
rainbow (3.1.1)
|
|
39
|
+
rake (13.0.6)
|
|
40
|
+
regexp_parser (2.6.0)
|
|
41
|
+
rexml (3.2.5)
|
|
42
|
+
rspec (3.11.0)
|
|
43
|
+
rspec-core (~> 3.11.0)
|
|
44
|
+
rspec-expectations (~> 3.11.0)
|
|
45
|
+
rspec-mocks (~> 3.11.0)
|
|
46
|
+
rspec-core (3.11.0)
|
|
47
|
+
rspec-support (~> 3.11.0)
|
|
48
|
+
rspec-expectations (3.11.1)
|
|
50
49
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
51
|
-
rspec-support (~> 3.
|
|
52
|
-
rspec-mocks (3.
|
|
50
|
+
rspec-support (~> 3.11.0)
|
|
51
|
+
rspec-mocks (3.11.1)
|
|
53
52
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
54
|
-
rspec-support (~> 3.
|
|
55
|
-
rspec-support (3.
|
|
56
|
-
rubocop (1.
|
|
53
|
+
rspec-support (~> 3.11.0)
|
|
54
|
+
rspec-support (3.11.1)
|
|
55
|
+
rubocop (1.30.1)
|
|
57
56
|
parallel (~> 1.10)
|
|
58
|
-
parser (>=
|
|
57
|
+
parser (>= 3.1.0.0)
|
|
59
58
|
rainbow (>= 2.2.2, < 4.0)
|
|
60
59
|
regexp_parser (>= 1.8, < 3.0)
|
|
61
|
-
rexml
|
|
62
|
-
rubocop-ast (>= 1.
|
|
60
|
+
rexml (>= 3.2.5, < 4.0)
|
|
61
|
+
rubocop-ast (>= 1.18.0, < 2.0)
|
|
63
62
|
ruby-progressbar (~> 1.7)
|
|
64
|
-
unicode-display_width (>= 1.4.0, <
|
|
65
|
-
rubocop-ast (1.
|
|
66
|
-
parser (>=
|
|
67
|
-
rubocop-performance (1.
|
|
68
|
-
rubocop (>=
|
|
63
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
|
64
|
+
rubocop-ast (1.21.0)
|
|
65
|
+
parser (>= 3.1.1.0)
|
|
66
|
+
rubocop-performance (1.14.2)
|
|
67
|
+
rubocop (>= 1.7.0, < 2.0)
|
|
69
68
|
rubocop-ast (>= 0.4.0)
|
|
70
|
-
rubocop-rails (2.
|
|
69
|
+
rubocop-rails (2.15.0)
|
|
71
70
|
activesupport (>= 4.2.0)
|
|
72
71
|
rack (>= 1.1)
|
|
73
|
-
rubocop (>=
|
|
74
|
-
rubocop-rake (0.
|
|
75
|
-
rubocop
|
|
76
|
-
rubocop-rspec (2.1.0)
|
|
72
|
+
rubocop (>= 1.7.0, < 2.0)
|
|
73
|
+
rubocop-rake (0.6.0)
|
|
77
74
|
rubocop (~> 1.0)
|
|
78
|
-
|
|
75
|
+
rubocop-rspec (2.11.1)
|
|
76
|
+
rubocop (~> 1.19)
|
|
79
77
|
ruby-progressbar (1.11.0)
|
|
80
78
|
simplecov (0.21.2)
|
|
81
79
|
docile (~> 1.1)
|
|
82
80
|
simplecov-html (~> 0.11)
|
|
83
81
|
simplecov_json_formatter (~> 0.1)
|
|
84
82
|
simplecov-html (0.12.3)
|
|
85
|
-
simplecov_json_formatter (0.1.
|
|
86
|
-
smart_engine (0.
|
|
83
|
+
simplecov_json_formatter (0.1.4)
|
|
84
|
+
smart_engine (0.13.0)
|
|
87
85
|
smart_types (0.7.1)
|
|
88
86
|
smart_engine (~> 0.11)
|
|
89
|
-
tzinfo (2.0.
|
|
87
|
+
tzinfo (2.0.5)
|
|
90
88
|
concurrent-ruby (~> 1.0)
|
|
91
|
-
unicode-display_width (
|
|
92
|
-
zeitwerk (2.4.2)
|
|
89
|
+
unicode-display_width (2.3.0)
|
|
93
90
|
|
|
94
91
|
PLATFORMS
|
|
95
|
-
|
|
92
|
+
arm64-darwin-21
|
|
96
93
|
|
|
97
94
|
DEPENDENCIES
|
|
98
95
|
armitage-rubocop (~> 1.7)
|
|
@@ -104,4 +101,4 @@ DEPENDENCIES
|
|
|
104
101
|
smart_schema!
|
|
105
102
|
|
|
106
103
|
BUNDLED WITH
|
|
107
|
-
2.3.
|
|
104
|
+
2.3.17
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# @api private
|
|
4
4
|
# @since 0.1.0
|
|
5
|
+
# @version 0.8.0
|
|
5
6
|
class SmartCore::Schema::Checker::Reconciler::Matcher::Result
|
|
6
7
|
# @return [Hash<String|Symbol,Any>]
|
|
7
8
|
#
|
|
@@ -28,9 +29,9 @@ class SmartCore::Schema::Checker::Reconciler::Matcher::Result
|
|
|
28
29
|
#
|
|
29
30
|
# @api private
|
|
30
31
|
# @since 0.1.0
|
|
32
|
+
# @version 0.8.0
|
|
31
33
|
def initialize(verifiable_hash)
|
|
32
34
|
@verifiable_hash = verifiable_hash
|
|
33
|
-
@lock = SmartCore::Engine::Lock.new
|
|
34
35
|
@contract_keys_results = []
|
|
35
36
|
@extra_keys_results = []
|
|
36
37
|
end
|
|
@@ -46,11 +47,10 @@ class SmartCore::Schema::Checker::Reconciler::Matcher::Result
|
|
|
46
47
|
#
|
|
47
48
|
# @api private
|
|
48
49
|
# @since 0.1.0
|
|
50
|
+
# @version 0.8.0
|
|
49
51
|
def each_result(&block)
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
extra_keys_results.each(&block)
|
|
53
|
-
end
|
|
52
|
+
contract_keys_results.each(&block)
|
|
53
|
+
extra_keys_results.each(&block)
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
# @param result [SmartCore::Schema::Checker::Rules::Verifier::Result]
|
|
@@ -58,8 +58,9 @@ class SmartCore::Schema::Checker::Reconciler::Matcher::Result
|
|
|
58
58
|
#
|
|
59
59
|
# @api private
|
|
60
60
|
# @since 0.1.0
|
|
61
|
+
# @version 0.8.0
|
|
61
62
|
def contract_key_result(result)
|
|
62
|
-
|
|
63
|
+
contract_keys_results << result
|
|
63
64
|
end
|
|
64
65
|
|
|
65
66
|
# @param result [
|
|
@@ -70,17 +71,17 @@ class SmartCore::Schema::Checker::Reconciler::Matcher::Result
|
|
|
70
71
|
#
|
|
71
72
|
# @api private
|
|
72
73
|
# @since 0.1.0
|
|
74
|
+
# @version 0.8.0
|
|
73
75
|
def extra_keys_result(result)
|
|
74
|
-
|
|
76
|
+
extra_keys_results << result
|
|
75
77
|
end
|
|
76
78
|
|
|
77
79
|
# @return [SmartCore::Schema::Result]
|
|
78
80
|
#
|
|
79
81
|
# @api private
|
|
80
82
|
# @since 0.1.0
|
|
83
|
+
# @version 0.8.0
|
|
81
84
|
def complete!
|
|
82
|
-
|
|
83
|
-
SmartCore::Schema::Checker::Reconciler::Matcher::ResultFinalizer.finalize(self)
|
|
84
|
-
end
|
|
85
|
+
SmartCore::Schema::Checker::Reconciler::Matcher::ResultFinalizer.finalize(self)
|
|
85
86
|
end
|
|
86
87
|
end
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# @api private
|
|
4
4
|
# @since 0.1.0
|
|
5
|
-
# @version 0.
|
|
5
|
+
# @version 0.8.0
|
|
6
6
|
class SmartCore::Schema::Checker::Reconciler
|
|
7
7
|
require_relative 'reconciler/constructor'
|
|
8
8
|
require_relative 'reconciler/matcher'
|
|
@@ -15,7 +15,6 @@ class SmartCore::Schema::Checker::Reconciler
|
|
|
15
15
|
def initialize
|
|
16
16
|
@rules = SmartCore::Schema::Checker::Rules.new
|
|
17
17
|
@strict = Constructor::DEFAULT_STRICT_BEHAVIOR
|
|
18
|
-
@lock = SmartCore::Engine::Lock.new
|
|
19
18
|
end
|
|
20
19
|
|
|
21
20
|
# @param verifiable_hash [SmartCore::Schema::Checker::VerifiableHash]
|
|
@@ -23,8 +22,9 @@ class SmartCore::Schema::Checker::Reconciler
|
|
|
23
22
|
#
|
|
24
23
|
# @api private
|
|
25
24
|
# @since 0.1.0
|
|
25
|
+
# @version 0.8.0
|
|
26
26
|
def __match!(verifiable_hash)
|
|
27
|
-
|
|
27
|
+
SmartCore::Schema::Checker::Reconciler::Matcher.match(self, verifiable_hash)
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
# @return [SmartCore::Schema::Checker::Rules::ExtraKeys]
|
|
@@ -39,16 +39,18 @@ class SmartCore::Schema::Checker::Reconciler
|
|
|
39
39
|
#
|
|
40
40
|
# @api private
|
|
41
41
|
# @since 0.1.0
|
|
42
|
+
# @version 0.8.0
|
|
42
43
|
def __contract_rules
|
|
43
|
-
|
|
44
|
+
rules
|
|
44
45
|
end
|
|
45
46
|
|
|
46
47
|
# @return [Boolean]
|
|
47
48
|
#
|
|
48
49
|
# @api private
|
|
49
50
|
# @since 0.3.0
|
|
51
|
+
# @version 0.8.0
|
|
50
52
|
def __strict?
|
|
51
|
-
|
|
53
|
+
@strict
|
|
52
54
|
end
|
|
53
55
|
|
|
54
56
|
# @param schema_key [String, Symbol]
|
|
@@ -57,12 +59,10 @@ class SmartCore::Schema::Checker::Reconciler
|
|
|
57
59
|
#
|
|
58
60
|
# @api public
|
|
59
61
|
# @since 0.1.0
|
|
60
|
-
# @version 0.
|
|
62
|
+
# @version 0.8.0
|
|
61
63
|
def required(schema_key, &nested_definitions)
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
rule.tap { rules[rule.schema_key] = rule }
|
|
65
|
-
end
|
|
64
|
+
rule = SmartCore::Schema::Checker::Rules::Required.new(self, schema_key, &nested_definitions)
|
|
65
|
+
rule.tap { rules[rule.schema_key] = rule }
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
# @param schema_key [String, Symbol]
|
|
@@ -71,12 +71,10 @@ class SmartCore::Schema::Checker::Reconciler
|
|
|
71
71
|
#
|
|
72
72
|
# @api public
|
|
73
73
|
# @since 0.1.0
|
|
74
|
-
# @version 0.
|
|
74
|
+
# @version 0.8.0
|
|
75
75
|
def optional(schema_key, &nested_definitions)
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
rule.tap { rules[rule.schema_key] = rule }
|
|
79
|
-
end
|
|
76
|
+
rule = SmartCore::Schema::Checker::Rules::Optional.new(self, schema_key, &nested_definitions)
|
|
77
|
+
rule.tap { rules[rule.schema_key] = rule }
|
|
80
78
|
end
|
|
81
79
|
|
|
82
80
|
# @param is_strict [Boolean]
|
|
@@ -84,16 +82,18 @@ class SmartCore::Schema::Checker::Reconciler
|
|
|
84
82
|
#
|
|
85
83
|
# @api public
|
|
86
84
|
# @since 0.3.0
|
|
85
|
+
# @version 0.8.0
|
|
87
86
|
def strict!(is_strict = Constructor::DEFAULT_STRICT_BEHAVIOR)
|
|
88
|
-
|
|
87
|
+
@strict = is_strict
|
|
89
88
|
end
|
|
90
89
|
|
|
91
90
|
# @return [void]
|
|
92
91
|
#
|
|
93
92
|
# @api public
|
|
94
93
|
# @since 0.3.0
|
|
94
|
+
# @version 0.8.0
|
|
95
95
|
def non_strict!
|
|
96
|
-
|
|
96
|
+
strict!(Constructor::STRICT_MODES[:non_strict])
|
|
97
97
|
end
|
|
98
98
|
|
|
99
99
|
private
|
|
@@ -103,13 +103,4 @@ class SmartCore::Schema::Checker::Reconciler
|
|
|
103
103
|
# @api private
|
|
104
104
|
# @since 0.1.0
|
|
105
105
|
attr_reader :rules
|
|
106
|
-
|
|
107
|
-
# @param block [Block]
|
|
108
|
-
# @return [Any]
|
|
109
|
-
#
|
|
110
|
-
# @api private
|
|
111
|
-
# @since 0.1.0
|
|
112
|
-
def thread_safe(&block)
|
|
113
|
-
@lock.synchronize(&block)
|
|
114
|
-
end
|
|
115
106
|
end
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# @api private
|
|
4
4
|
# @since 0.1.0
|
|
5
|
-
# @version 0.
|
|
5
|
+
# @version 0.8.0
|
|
6
6
|
class SmartCore::Schema::Checker::Rules::Base
|
|
7
7
|
# @return [String]
|
|
8
8
|
#
|
|
@@ -35,9 +35,8 @@ class SmartCore::Schema::Checker::Rules::Base
|
|
|
35
35
|
#
|
|
36
36
|
# @api private
|
|
37
37
|
# @since 0.1.0
|
|
38
|
-
# @version 0.
|
|
38
|
+
# @version 0.8.0
|
|
39
39
|
def initialize(root_reconciler, schema_key, &nested_definitions)
|
|
40
|
-
@lock = SmartCore::Engine::Lock.new
|
|
41
40
|
@root_reconciler = root_reconciler
|
|
42
41
|
@schema_key = SmartCore::Schema::KeyControl.normalize(schema_key)
|
|
43
42
|
@options = SmartCore::Schema::Checker::Rules::Options.new(self)
|
|
@@ -68,12 +67,11 @@ class SmartCore::Schema::Checker::Rules::Base
|
|
|
68
67
|
#
|
|
69
68
|
# @api public
|
|
70
69
|
# @since 0.1.0
|
|
70
|
+
# @version 0.8.0
|
|
71
71
|
def type(required_type, &nested_definitions)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
define_nested_reconciler(&nested_definitions)
|
|
76
|
-
end
|
|
72
|
+
tap do
|
|
73
|
+
options.type = SmartCore::Schema::Checker::Rules::Options::Type.new(self, required_type)
|
|
74
|
+
define_nested_reconciler(&nested_definitions)
|
|
77
75
|
end
|
|
78
76
|
end
|
|
79
77
|
|
|
@@ -82,12 +80,11 @@ class SmartCore::Schema::Checker::Rules::Base
|
|
|
82
80
|
#
|
|
83
81
|
# @api public
|
|
84
82
|
# @since 0.1.0
|
|
83
|
+
# @version 0.8.0
|
|
85
84
|
def filled(&nested_definitions)
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
define_nested_reconciler(&nested_definitions)
|
|
90
|
-
end
|
|
85
|
+
tap do
|
|
86
|
+
options.filled = SmartCore::Schema::Checker::Rules::Options::Filled.new(self)
|
|
87
|
+
define_nested_reconciler(&nested_definitions)
|
|
91
88
|
end
|
|
92
89
|
end
|
|
93
90
|
|
|
@@ -110,12 +107,4 @@ class SmartCore::Schema::Checker::Rules::Base
|
|
|
110
107
|
|
|
111
108
|
type(:hash).filled
|
|
112
109
|
end
|
|
113
|
-
|
|
114
|
-
# @return [Any]
|
|
115
|
-
#
|
|
116
|
-
# @api private
|
|
117
|
-
# @since 0.1.0
|
|
118
|
-
def thread_safe(&block)
|
|
119
|
-
@lock.synchronize(&block)
|
|
120
|
-
end
|
|
121
110
|
end
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# @api private
|
|
4
4
|
# @since 0.1.0
|
|
5
|
+
# @version 0.8.0
|
|
5
6
|
class SmartCore::Schema::Checker::Rules::Options
|
|
6
7
|
require_relative 'options/empty'
|
|
7
8
|
require_relative 'options/type'
|
|
@@ -15,7 +16,6 @@ class SmartCore::Schema::Checker::Rules::Options
|
|
|
15
16
|
def initialize(rule)
|
|
16
17
|
@type = Empty.new(rule)
|
|
17
18
|
@filled = Empty.new(rule)
|
|
18
|
-
@lock = SmartCore::Engine::Lock.new
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
# @return [SmartCore::Schema::Checker::Rules::Options::Type]
|
|
@@ -23,8 +23,9 @@ class SmartCore::Schema::Checker::Rules::Options
|
|
|
23
23
|
#
|
|
24
24
|
# @api private
|
|
25
25
|
# @since 0.1.0
|
|
26
|
+
# @version 0.8.0
|
|
26
27
|
def type
|
|
27
|
-
@
|
|
28
|
+
@type
|
|
28
29
|
end
|
|
29
30
|
|
|
30
31
|
# @param option [SmartCore::Schema::Checker::Rules::Options::Type]
|
|
@@ -32,8 +33,9 @@ class SmartCore::Schema::Checker::Rules::Options
|
|
|
32
33
|
#
|
|
33
34
|
# @api private
|
|
34
35
|
# @since 0.1.0
|
|
36
|
+
# @version 0.8.0
|
|
35
37
|
def type=(option)
|
|
36
|
-
@
|
|
38
|
+
@type = option
|
|
37
39
|
end
|
|
38
40
|
|
|
39
41
|
# @return [SmartCore::Schema::Checker::Rules::Options::Filled]
|
|
@@ -41,8 +43,9 @@ class SmartCore::Schema::Checker::Rules::Options
|
|
|
41
43
|
#
|
|
42
44
|
# @api private
|
|
43
45
|
# @since 0.1.0
|
|
46
|
+
# @version 0.8.0
|
|
44
47
|
def filled
|
|
45
|
-
@
|
|
48
|
+
@filled
|
|
46
49
|
end
|
|
47
50
|
|
|
48
51
|
# @param option [SmartCore::Schema::Checker::Rules::Options::Filled]
|
|
@@ -50,7 +53,8 @@ class SmartCore::Schema::Checker::Rules::Options
|
|
|
50
53
|
#
|
|
51
54
|
# @api private
|
|
52
55
|
# @since 0.1.0
|
|
56
|
+
# @version 0.8.0
|
|
53
57
|
def filled=(option)
|
|
54
|
-
@
|
|
58
|
+
@filled = option
|
|
55
59
|
end
|
|
56
60
|
end
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# @api private
|
|
4
4
|
# @since 0.1.0
|
|
5
|
+
# @version 0.8.0
|
|
5
6
|
class SmartCore::Schema::Checker::Rules
|
|
6
7
|
require_relative 'rules/type_aliases'
|
|
7
8
|
require_relative 'rules/base'
|
|
@@ -20,9 +21,10 @@ class SmartCore::Schema::Checker::Rules
|
|
|
20
21
|
#
|
|
21
22
|
# @api private
|
|
22
23
|
# @since 0.1.0
|
|
24
|
+
# @version 0.8.0
|
|
23
25
|
def initialize
|
|
24
26
|
@rules = {}
|
|
25
|
-
@
|
|
27
|
+
@cache = SmartCore::Engine::Cache.new
|
|
26
28
|
end
|
|
27
29
|
|
|
28
30
|
# @param schema_key [String]
|
|
@@ -31,8 +33,10 @@ class SmartCore::Schema::Checker::Rules
|
|
|
31
33
|
#
|
|
32
34
|
# @api private
|
|
33
35
|
# @since 0.1.0
|
|
36
|
+
# @version 0.8..0
|
|
34
37
|
def []=(schema_key, rule)
|
|
35
|
-
|
|
38
|
+
cache.clear
|
|
39
|
+
rules[schema_key] = rule
|
|
36
40
|
end
|
|
37
41
|
|
|
38
42
|
# @param block [Block]
|
|
@@ -43,8 +47,9 @@ class SmartCore::Schema::Checker::Rules
|
|
|
43
47
|
#
|
|
44
48
|
# @api private
|
|
45
49
|
# @since 0.1.0
|
|
50
|
+
# @version 0.8.0
|
|
46
51
|
def each(&block)
|
|
47
|
-
|
|
52
|
+
block_given? ? rules.each_pair(&block) : rules.each_pair
|
|
48
53
|
end
|
|
49
54
|
|
|
50
55
|
# @param block [Block]
|
|
@@ -54,16 +59,18 @@ class SmartCore::Schema::Checker::Rules
|
|
|
54
59
|
#
|
|
55
60
|
# @api private
|
|
56
61
|
# @since 0.1.0
|
|
62
|
+
# @version 0.8.0
|
|
57
63
|
def each_rule(&block)
|
|
58
|
-
|
|
64
|
+
block_given? ? rules.each_value(&block) : rules.each_value
|
|
59
65
|
end
|
|
60
66
|
|
|
61
67
|
# @return [Array<String>]
|
|
62
68
|
#
|
|
63
69
|
# @api private
|
|
64
70
|
# @since 0.1.0
|
|
71
|
+
# @version 0.8.0
|
|
65
72
|
def keys
|
|
66
|
-
|
|
73
|
+
cache.read(:keys) { rules.keys }
|
|
67
74
|
end
|
|
68
75
|
|
|
69
76
|
private
|
|
@@ -74,12 +81,9 @@ class SmartCore::Schema::Checker::Rules
|
|
|
74
81
|
# @since 0.1.0
|
|
75
82
|
attr_reader :rules
|
|
76
83
|
|
|
77
|
-
# @
|
|
78
|
-
# @return [Any]
|
|
84
|
+
# @return [SmartCore::Engine::Cache]
|
|
79
85
|
#
|
|
80
86
|
# @api private
|
|
81
|
-
# @since 0.
|
|
82
|
-
|
|
83
|
-
@lock.synchronize(&block)
|
|
84
|
-
end
|
|
87
|
+
# @since 0.8.0
|
|
88
|
+
attr_reader :cache
|
|
85
89
|
end
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# @api private
|
|
4
4
|
# @since 0.1.0
|
|
5
|
-
# @version 0.
|
|
5
|
+
# @version 0.8.0
|
|
6
6
|
class SmartCore::Schema::Checker::VerifiableHash
|
|
7
7
|
# @return [Hash<String|Symbol,Any>]
|
|
8
8
|
#
|
|
@@ -17,24 +17,24 @@ class SmartCore::Schema::Checker::VerifiableHash
|
|
|
17
17
|
# @since 0.1.0
|
|
18
18
|
def initialize(source)
|
|
19
19
|
@source = source
|
|
20
|
-
@lock = SmartCore::Engine::Lock.new
|
|
21
20
|
end
|
|
22
21
|
|
|
23
22
|
# @param key [String]
|
|
24
23
|
# @return [SmartCore::Schema::Checker::VerifiableHash]
|
|
25
24
|
#
|
|
26
25
|
# @api private
|
|
27
|
-
# @since 0.
|
|
26
|
+
# @since 0.8.0
|
|
28
27
|
def extract(key)
|
|
29
|
-
|
|
28
|
+
SmartCore::Schema::Checker::VerifiableHash.new(fetch(key))
|
|
30
29
|
end
|
|
31
30
|
|
|
32
31
|
# @return [Array<String>]
|
|
33
32
|
#
|
|
34
33
|
# @api private
|
|
35
34
|
# @since 0.1.0
|
|
35
|
+
# @version 0.8.0
|
|
36
36
|
def keys
|
|
37
|
-
|
|
37
|
+
SmartCore::Schema::KeyControl.normalize_list(source.keys)
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
# @param key [String]
|
|
@@ -42,8 +42,9 @@ class SmartCore::Schema::Checker::VerifiableHash
|
|
|
42
42
|
#
|
|
43
43
|
# @api private
|
|
44
44
|
# @since 0.1.0
|
|
45
|
+
# @version 0.8.0
|
|
45
46
|
def key?(key)
|
|
46
|
-
|
|
47
|
+
source.key?(key) || source.key?(key.to_sym)
|
|
47
48
|
end
|
|
48
49
|
|
|
49
50
|
# @param key [String]
|
|
@@ -51,18 +52,14 @@ class SmartCore::Schema::Checker::VerifiableHash
|
|
|
51
52
|
#
|
|
52
53
|
# @api private
|
|
53
54
|
# @since 0.1.0
|
|
54
|
-
# @version 0.
|
|
55
|
+
# @version 0.8.0
|
|
55
56
|
def fetch(key)
|
|
56
|
-
#
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
# So, the "if"-#key?-oriented flow is better (generates fewer number of objects statistically).
|
|
63
|
-
source.key?(key) ? source.fetch(key) : source.fetch(key.to_sym)
|
|
64
|
-
end
|
|
65
|
-
# rubocop:enable Style/RedundantBegin
|
|
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)
|
|
66
63
|
end
|
|
67
64
|
alias_method :[], :fetch
|
|
68
65
|
end
|
data/smart_schema.gemspec
CHANGED
|
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
|
|
|
30
30
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
31
31
|
spec.require_paths = ['lib']
|
|
32
32
|
|
|
33
|
-
spec.add_dependency 'smart_engine', '~> 0.
|
|
33
|
+
spec.add_dependency 'smart_engine', '~> 0.13'
|
|
34
34
|
spec.add_dependency 'smart_types', '~> 0.4'
|
|
35
35
|
|
|
36
36
|
spec.add_development_dependency 'pry', '~> 0.13'
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: smart_schema
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.8.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Rustam Ibragimov
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-09-
|
|
11
|
+
date: 2022-09-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: smart_engine
|
|
@@ -16,14 +16,14 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '0.
|
|
19
|
+
version: '0.13'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '0.
|
|
26
|
+
version: '0.13'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: smart_types
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -201,7 +201,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
201
201
|
- !ruby/object:Gem::Version
|
|
202
202
|
version: '0'
|
|
203
203
|
requirements: []
|
|
204
|
-
rubygems_version: 3.3.
|
|
204
|
+
rubygems_version: 3.3.11
|
|
205
205
|
signing_key:
|
|
206
206
|
specification_version: 4
|
|
207
207
|
summary: SmartCore::Schema is a schema validator for Hash-like data structures
|