smart_schema 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 686b8bd1172752321dd2992f2cbe2aeb5230493142afb019c8c062347f215d97
4
- data.tar.gz: f3395ec6d78bf5e8d6407018bb890e90043a8b730ec52ed1cabc090ab92953e2
3
+ metadata.gz: 0a86fa55dff1a9608dd4bd87eccb26eb9f9cf7ea1fd5699e800754d1c006814d
4
+ data.tar.gz: 1bcdce646a6ea5db5494493c024bff6fbdab390bcc4445d7801047a644c272cd
5
5
  SHA512:
6
- metadata.gz: f64e1350c2422b40e275638b0719b49f0300cb8c7e3e9e7e179029a94afba9d455fd8c8d5c82d83b8a5604eb4df1c2ed4cf3b4dd0af20ecef35628f89bf6fc9b
7
- data.tar.gz: 1fb7354eeb85ae75471fc3075ddcbf6bc50a1b4c8f115a34c045a5a29a689fb7705a776fe006a3a8276c2f7b58796336e126192c3108bd93134cff3a0348e797
6
+ metadata.gz: 17f908f2ddcc72d096093af737b9b80214d3f0cbca2fd7064e95b81036731e9f94205cad5b5a8db25c4eac3b61bb22a1e670f7f3876540b9c73518da5fc279ad
7
+ data.tar.gz: 17361851cca2d1d4380ceb82c8fc3a138203fc075ac5286a1de87ab9e0fcf76dd095b6aa2d61347a89157aea806404ec5cd2347641f313dbb0ad8ac4faacdabc
@@ -1,6 +1,11 @@
1
1
  # Changelog
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
+ # [0.2.0] - 2020-11-09
5
+ ### Added
6
+ - `#errors` now includes `#extra_keys` too (`:extra_key` error code for each extra key);
7
+ - Unfreezed `SmartCore::Schema::Checker::Rules::TYPE_ALIASES` for extendability (until `smart_type-syste` has been integrated);
8
+
4
9
  # [0.1.0] - 2020-08-25
5
10
 
6
11
  - Release :)
@@ -1,25 +1,25 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- smart_schema (0.1.0)
4
+ smart_schema (0.2.0)
5
5
  smart_engine (~> 0.8)
6
6
  smart_types (~> 0.1)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- activesupport (6.0.3.2)
11
+ activesupport (6.0.3.4)
12
12
  concurrent-ruby (~> 1.0, >= 1.0.2)
13
13
  i18n (>= 0.7, < 2)
14
14
  minitest (~> 5.1)
15
15
  tzinfo (~> 1.1)
16
16
  zeitwerk (~> 2.2, >= 2.2.2)
17
- armitage-rubocop (0.89.1)
18
- rubocop (= 0.89.1)
19
- rubocop-performance (= 1.7.1)
20
- rubocop-rails (= 2.7.1)
17
+ armitage-rubocop (1.2.0)
18
+ rubocop (= 1.2.0)
19
+ rubocop-performance (= 1.8.1)
20
+ rubocop-rails (= 2.8.1)
21
21
  rubocop-rake (= 0.5.1)
22
- rubocop-rspec (= 1.43.2)
22
+ rubocop-rspec (= 2.0.0)
23
23
  ast (2.4.1)
24
24
  coderay (1.1.3)
25
25
  concurrent-ruby (1.1.7)
@@ -28,9 +28,9 @@ GEM
28
28
  i18n (1.8.5)
29
29
  concurrent-ruby (~> 1.0)
30
30
  method_source (1.0.0)
31
- minitest (5.14.1)
32
- parallel (1.19.2)
33
- parser (2.7.1.4)
31
+ minitest (5.14.2)
32
+ parallel (1.20.0)
33
+ parser (2.7.2.0)
34
34
  ast (~> 2.4.1)
35
35
  pry (0.13.1)
36
36
  coderay (~> 1.1)
@@ -38,65 +38,67 @@ GEM
38
38
  rack (2.2.3)
39
39
  rainbow (3.0.0)
40
40
  rake (13.0.1)
41
- regexp_parser (1.7.1)
41
+ regexp_parser (1.8.2)
42
42
  rexml (3.2.4)
43
- rspec (3.9.0)
44
- rspec-core (~> 3.9.0)
45
- rspec-expectations (~> 3.9.0)
46
- rspec-mocks (~> 3.9.0)
47
- rspec-core (3.9.2)
48
- rspec-support (~> 3.9.3)
49
- rspec-expectations (3.9.2)
43
+ rspec (3.10.0)
44
+ rspec-core (~> 3.10.0)
45
+ rspec-expectations (~> 3.10.0)
46
+ rspec-mocks (~> 3.10.0)
47
+ rspec-core (3.10.0)
48
+ rspec-support (~> 3.10.0)
49
+ rspec-expectations (3.10.0)
50
50
  diff-lcs (>= 1.2.0, < 2.0)
51
- rspec-support (~> 3.9.0)
52
- rspec-mocks (3.9.1)
51
+ rspec-support (~> 3.10.0)
52
+ rspec-mocks (3.10.0)
53
53
  diff-lcs (>= 1.2.0, < 2.0)
54
- rspec-support (~> 3.9.0)
55
- rspec-support (3.9.3)
56
- rubocop (0.89.1)
54
+ rspec-support (~> 3.10.0)
55
+ rspec-support (3.10.0)
56
+ rubocop (1.2.0)
57
57
  parallel (~> 1.10)
58
- parser (>= 2.7.1.1)
58
+ parser (>= 2.7.1.5)
59
59
  rainbow (>= 2.2.2, < 4.0)
60
- regexp_parser (>= 1.7)
60
+ regexp_parser (>= 1.8)
61
61
  rexml
62
- rubocop-ast (>= 0.3.0, < 1.0)
62
+ rubocop-ast (>= 1.0.1)
63
63
  ruby-progressbar (~> 1.7)
64
64
  unicode-display_width (>= 1.4.0, < 2.0)
65
- rubocop-ast (0.3.0)
66
- parser (>= 2.7.1.4)
67
- rubocop-performance (1.7.1)
68
- rubocop (>= 0.82.0)
69
- rubocop-rails (2.7.1)
65
+ rubocop-ast (1.1.1)
66
+ parser (>= 2.7.1.5)
67
+ rubocop-performance (1.8.1)
68
+ rubocop (>= 0.87.0)
69
+ rubocop-ast (>= 0.4.0)
70
+ rubocop-rails (2.8.1)
70
71
  activesupport (>= 4.2.0)
71
72
  rack (>= 1.1)
72
73
  rubocop (>= 0.87.0)
73
74
  rubocop-rake (0.5.1)
74
75
  rubocop
75
- rubocop-rspec (1.43.2)
76
- rubocop (~> 0.87)
76
+ rubocop-rspec (2.0.0)
77
+ rubocop (~> 1.0)
78
+ rubocop-ast (>= 1.1.0)
77
79
  ruby-progressbar (1.10.1)
78
- simplecov (0.19.0)
80
+ simplecov (0.19.1)
79
81
  docile (~> 1.1)
80
82
  simplecov-html (~> 0.11)
81
- simplecov-html (0.12.2)
83
+ simplecov-html (0.12.3)
82
84
  smart_engine (0.8.0)
83
85
  smart_types (0.1.0)
84
86
  smart_engine (~> 0.6)
85
87
  thread_safe (0.3.6)
86
- tzinfo (1.2.7)
88
+ tzinfo (1.2.8)
87
89
  thread_safe (~> 0.1)
88
90
  unicode-display_width (1.7.0)
89
- zeitwerk (2.4.0)
91
+ zeitwerk (2.4.1)
90
92
 
91
93
  PLATFORMS
92
94
  ruby
93
95
 
94
96
  DEPENDENCIES
95
- armitage-rubocop (~> 0.89)
97
+ armitage-rubocop (~> 1.2)
96
98
  bundler (~> 2.1)
97
99
  pry (~> 0.13)
98
100
  rake (~> 13.0)
99
- rspec (~> 3.9)
101
+ rspec (~> 3.10)
100
102
  simplecov (~> 0.19)
101
103
  smart_schema!
102
104
 
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # SmartCore::Schema [![Gem Version](https://badge.fury.io/rb/smart_schema.svg)](https://badge.fury.io/rb/smart_schema) [![Build Status](https://travis-ci.org/smart-rb/smart_schema.svg?branch=master)](https://travis-ci.org/smart-rb/smart_schema)
2
2
 
3
- `SmartCore::Schema` is a schema validator for `Hash`-like data structures.
3
+ `SmartCore::Schema` is a schema validator for `Hash`-like data structures in declarative DSL-powered style.
4
4
 
5
5
  Provides convenient and concise DSL to define complex schemas in easiest way and public validation interface to achieve a comfortable work with detailed validation result.
6
6
 
@@ -88,7 +88,7 @@ result = MySchema.new.validate(
88
88
 
89
89
  # => outputs:
90
90
  # #<SmartCore::Schema::Result:0x00007ffcd8926990
91
- # @errors={"key.data"=>[:non_filled], "key.value"=>[:invalid_type], "key.nested"=>[:required_key_not_found], "another_key"=>[:non_filled]},
91
+ # @errors={"key.data"=>[:non_filled], "key.value"=>[:invalid_type], "key.nested"=>[:required_key_not_found], "another_key"=>[:non_filled], "third_key"=>[:extra_key]},
92
92
  # @extra_keys=#<Set: {"third_key"}>,
93
93
  # @source={:key=>{:data=>nil, :value=>"1", :name=>"D@iVeR"}, :another_key=>nil, :third_key=>"test"}>
94
94
 
@@ -99,20 +99,28 @@ result.errors # =>
99
99
  "key.data"=>[:non_filled],
100
100
  "key.value"=>[:invalid_type],
101
101
  "key.nested"=>[:required_key_not_found],
102
- "another_key"=>[:non_filled]
102
+ "another_key"=>[:non_filled],
103
+ "third_key"=>[:extra_key]
103
104
  }
104
105
  ```
105
106
 
107
+ Possible errors:
108
+ - `:non_filled` (existing key has nil value);
109
+ - `:invalid_type` (existing key has invalid type);
110
+ - `:required_key_not_found` (required key does not exist);
111
+ - `:extra_key` (a key that does not exist in schema);
112
+
106
113
  ---
107
114
 
108
115
  ## Roadmap
109
116
 
110
- - **(0.2.0)** - schema inheritance;
117
+ - **(0.3.0)** - schema inheritance;
111
118
  - **(0.3.0)** - schema composition (`required(:key).schema(SchemaClass)`) (`compose_with(AnotherSchema)`);
112
- - **(0.4.0)** - error messages (that are consistent with error codes);
113
- - **(0.5.0)** - `smart_type-system` integration;
114
- - **(0.6.0)** - support for another data structures (such as YAML strings, JSON strings, `Struct`, `OpenStruct`s, custom `Object`s and etc);
115
- - **(0.7.0)** - think about pattern matching;
119
+ - **(0.4.0)** - dependable schema checking (sample: if one key exist (or not) we should check another (or not), and vice verca);
120
+ - **(0.5.0)** - error messages (that are consistent with error codes);
121
+ - **(0.6.0)** - `smart_type-system` integration;
122
+ - **(0.7.0)** - support for another data structures (such as YAML strings, JSON strings, `Struct`, `OpenStruct`s, custom `Object`s and etc);
123
+ - **(0.8.0)** - think about pattern matching;
116
124
 
117
125
  ---
118
126
 
@@ -7,7 +7,7 @@ module SmartCore::Schema::Checker::Reconciler::Matcher::ResultFinalizer
7
7
  #
8
8
  # @api private
9
9
  # @since 0.1.0
10
- ERRORS_CONTAINER_BUILDER = -> { Hash.new { |hash, key| hash[key] = [] } }
10
+ ERRORS_CONTAINER_BUILDER = -> { Hash.new { |hash, key| hash[key] = Set.new } }
11
11
 
12
12
  # @return [Proc]
13
13
  #
@@ -15,6 +15,12 @@ module SmartCore::Schema::Checker::Reconciler::Matcher::ResultFinalizer
15
15
  # @since 0.1.0
16
16
  EXTRA_KEYS_CONTAINER_BUILDER = -> { Set.new }
17
17
 
18
+ # @return [Symbol]
19
+ #
20
+ # @api private
21
+ # @since 0.2.0
22
+ EXTRA_KEY_ERROR_CODE = :extra_key
23
+
18
24
  class << self
19
25
  # @param result [SmartCore::Schema::Checker::Reconciler::Matcher::Result]
20
26
  # @return [SmartCore::Schema::Result]
@@ -98,10 +104,12 @@ module SmartCore::Schema::Checker::Reconciler::Matcher::ResultFinalizer
98
104
 
99
105
  # @param errors [Hash]
100
106
  # @param extra_keys [Set]
101
- # @return [Array<Hash<String,Array<Symbol>>,Set<String>]
107
+ # @return [Array<Hash<String,Set<Symbol>>,Set<String>]
102
108
  #
103
109
  # @api private
104
110
  # @since 0.1.0
111
+ # @version 0.2.0
112
+ # rubocop:disable Metrics/AbcSize
105
113
  def compile_errors(errors, extra_keys, initial_error_key = nil)
106
114
  compiled_errors = ERRORS_CONTAINER_BUILDER.call
107
115
  compiled_extra_keys = EXTRA_KEYS_CONTAINER_BUILDER.call
@@ -130,7 +138,12 @@ module SmartCore::Schema::Checker::Reconciler::Matcher::ResultFinalizer
130
138
  end
131
139
  end
132
140
 
141
+ compiled_extra_keys.each do |compiled_extra_key|
142
+ compiled_errors[compiled_extra_key] << EXTRA_KEY_ERROR_CODE
143
+ end
144
+
133
145
  [compiled_errors, compiled_extra_keys]
134
146
  end
147
+ # rubocop:enable Metrics/AbcSize
135
148
  end
136
149
  end
@@ -4,10 +4,13 @@
4
4
  # @since 0.1.0
5
5
  class SmartCore::Schema::Checker::Rules
6
6
  # @todo rework with smart_type-system
7
+ # @note non-frized constant is used for temporary extendability
7
8
  # @return [SmartCore::Types::Primitive]
8
9
  #
9
10
  # @api private
10
11
  # @since 0.1.0
12
+ # @version 0.2.0
13
+ # rubocop:disable Style/MutableConstant
11
14
  TYPE_ALIASES = {
12
15
  'value.any' => SmartCore::Types::Value::Any.nilable,
13
16
  'value.nil' => SmartCore::Types::Value::Nil.nilable,
@@ -47,5 +50,6 @@ class SmartCore::Schema::Checker::Rules
47
50
  'date_time' => SmartCore::Types::Value::DateTime.nilable,
48
51
  'date' => SmartCore::Types::Value::Date.nilable,
49
52
  'time_based' => SmartCore::Types::Value::TimeBased.nilable
50
- }.freeze
53
+ }
54
+ # rubocop:enable Style/MutableConstant
51
55
  end
@@ -5,7 +5,7 @@ module SmartCore
5
5
  # @return [String]
6
6
  #
7
7
  # @api public
8
- # @since 0.1.0
9
- VERSION = '0.1.0'
8
+ # @since 0.2.0
9
+ VERSION = '0.2.0'
10
10
  end
11
11
  end
@@ -34,7 +34,7 @@ Gem::Specification.new do |spec|
34
34
  spec.add_development_dependency 'pry', '~> 0.13'
35
35
  spec.add_development_dependency 'bundler', '~> 2.1'
36
36
  spec.add_development_dependency 'rake', '~> 13.0'
37
- spec.add_development_dependency 'rspec', '~> 3.9'
38
- spec.add_development_dependency 'armitage-rubocop', '~> 0.89'
37
+ spec.add_development_dependency 'rspec', '~> 3.10'
38
+ spec.add_development_dependency 'armitage-rubocop', '~> 1.2'
39
39
  spec.add_development_dependency 'simplecov', '~> 0.19'
40
40
  end
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.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rustam Ibragimov
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-08-25 00:00:00.000000000 Z
11
+ date: 2020-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: smart_engine
@@ -86,28 +86,28 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '3.9'
89
+ version: '3.10'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '3.9'
96
+ version: '3.10'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: armitage-rubocop
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0.89'
103
+ version: '1.2'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0.89'
110
+ version: '1.2'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: simplecov
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -185,7 +185,7 @@ metadata:
185
185
  homepage_uri: https://github.com/smart-rb/smart_schema
186
186
  source_code_uri: https://github.com/smart-rb/smart_schema
187
187
  changelog_uri: https://github.com/smart-rb/smart_schema/blob/master/CHANGELOG.md
188
- post_install_message:
188
+ post_install_message:
189
189
  rdoc_options: []
190
190
  require_paths:
191
191
  - lib
@@ -200,8 +200,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
200
200
  - !ruby/object:Gem::Version
201
201
  version: '0'
202
202
  requirements: []
203
- rubygems_version: 3.1.2
204
- signing_key:
203
+ rubygems_version: 3.1.4
204
+ signing_key:
205
205
  specification_version: 4
206
206
  summary: SmartCore::Schema is a schema validator for Hash-like data structures
207
207
  test_files: []