dry-schema 0.1.0 → 1.0.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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +166 -0
  3. data/LICENSE +1 -1
  4. data/README.md +13 -4
  5. data/config/errors.yml +59 -54
  6. data/lib/dry/schema/compiler.rb +24 -0
  7. data/lib/dry/schema/config.rb +23 -27
  8. data/lib/dry/schema/constants.rb +27 -3
  9. data/lib/dry/schema/dsl.rb +36 -49
  10. data/lib/dry/schema/extensions/hints/compiler_methods.rb +19 -0
  11. data/lib/dry/schema/extensions/hints/message_compiler_methods.rb +84 -0
  12. data/lib/dry/schema/extensions/hints/message_set_methods.rb +44 -0
  13. data/lib/dry/schema/extensions/hints/result_methods.rb +47 -0
  14. data/lib/dry/schema/extensions/hints.rb +56 -0
  15. data/lib/dry/schema/extensions/monads.rb +15 -4
  16. data/lib/dry/schema/extensions.rb +6 -0
  17. data/lib/dry/schema/json.rb +4 -2
  18. data/lib/dry/schema/key.rb +8 -10
  19. data/lib/dry/schema/key_coercer.rb +6 -2
  20. data/lib/dry/schema/key_map.rb +5 -4
  21. data/lib/dry/schema/macros/array.rb +39 -0
  22. data/lib/dry/schema/macros/core.rb +2 -0
  23. data/lib/dry/schema/macros/dsl.rb +149 -4
  24. data/lib/dry/schema/macros/each.rb +12 -1
  25. data/lib/dry/schema/macros/filled.rb +14 -7
  26. data/lib/dry/schema/macros/hash.rb +6 -32
  27. data/lib/dry/schema/macros/key.rb +38 -60
  28. data/lib/dry/schema/macros/maybe.rb +5 -3
  29. data/lib/dry/schema/macros/optional.rb +8 -1
  30. data/lib/dry/schema/macros/required.rb +3 -1
  31. data/lib/dry/schema/macros/schema.rb +46 -0
  32. data/lib/dry/schema/macros/value.rb +18 -2
  33. data/lib/dry/schema/macros.rb +4 -0
  34. data/lib/dry/schema/message/or.rb +54 -0
  35. data/lib/dry/schema/message.rb +56 -72
  36. data/lib/dry/schema/message_compiler/visitor_opts.rb +28 -1
  37. data/lib/dry/schema/message_compiler.rb +85 -74
  38. data/lib/dry/schema/message_set.rb +82 -50
  39. data/lib/dry/schema/messages/abstract.rb +84 -44
  40. data/lib/dry/schema/messages/i18n.rb +45 -9
  41. data/lib/dry/schema/messages/namespaced.rb +22 -5
  42. data/lib/dry/schema/messages/template.rb +68 -0
  43. data/lib/dry/schema/messages/yaml.rb +76 -22
  44. data/lib/dry/schema/messages.rb +19 -24
  45. data/lib/dry/schema/namespaced_rule.rb +37 -0
  46. data/lib/dry/schema/params.rb +4 -2
  47. data/lib/dry/schema/path.rb +102 -0
  48. data/lib/dry/schema/predicate.rb +15 -0
  49. data/lib/dry/schema/predicate_inferrer.rb +116 -23
  50. data/lib/dry/schema/predicate_registry.rb +2 -0
  51. data/lib/dry/schema/processor.rb +70 -39
  52. data/lib/dry/schema/result.rb +16 -31
  53. data/lib/dry/schema/rule_applier.rb +10 -3
  54. data/lib/dry/schema/trace.rb +16 -3
  55. data/lib/dry/schema/type_registry.rb +5 -3
  56. data/lib/dry/schema/types.rb +3 -1
  57. data/lib/dry/schema/value_coercer.rb +10 -4
  58. data/lib/dry/schema/version.rb +3 -1
  59. data/lib/dry/schema.rb +39 -13
  60. data/lib/dry-schema.rb +2 -0
  61. metadata +43 -47
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/equalizer'
1
4
  require 'dry/initializer'
2
5
 
3
6
  module Dry
@@ -7,6 +10,7 @@ module Dry
7
10
  # @api private
8
11
  class ValueCoercer
9
12
  extend Dry::Initializer
13
+ include ::Dry::Equalizer(:type_schema)
10
14
 
11
15
  # @api private
12
16
  param :type_schema
@@ -14,11 +18,13 @@ module Dry
14
18
  # @api private
15
19
  def call(input)
16
20
  if input.success?
17
- type_schema[Hash(input)]
21
+ type_schema[input.to_h]
18
22
  else
19
- type_schema.member_types.reduce(EMPTY_HASH.dup) do |hash, (name, type)|
20
- hash[name] = input.error?(name) ? input[name] : type[input[name]]
21
- hash
23
+ type_schema.each_with_object(EMPTY_HASH.dup) do |key, hash|
24
+ name = key.name
25
+ value = input[name]
26
+
27
+ hash[name] = input.error?(name) ? value : key[value]
22
28
  end
23
29
  end
24
30
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dry
2
4
  module Schema
3
- VERSION = '0.1.0'.freeze
5
+ VERSION = '1.0.0'
4
6
  end
5
7
  end
data/lib/dry/schema.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'dry/core/extensions'
2
4
 
3
5
  require 'dry/schema/constants'
@@ -6,44 +8,68 @@ require 'dry/schema/params'
6
8
  require 'dry/schema/json'
7
9
 
8
10
  module Dry
11
+ # Main interface
12
+ #
13
+ # @api public
9
14
  module Schema
10
15
  extend Dry::Core::Extensions
11
16
 
12
17
  # Define a schema
13
18
  #
19
+ # @example
20
+ # Dry::Schema.define do
21
+ # required(:name).filled(:string)
22
+ # required(:age).value(:integer, gt?: 0)
23
+ # end
24
+ #
25
+ # @param [Hash] options
26
+ #
14
27
  # @return [Processor]
15
28
  #
29
+ # @see DSL.new
30
+ #
16
31
  # @api public
17
- def self.define(options = EMPTY_HASH, &block)
32
+ def self.define(**options, &block)
18
33
  DSL.new(options, &block).call
19
34
  end
20
35
 
21
- # Define a param schema
36
+ # Define a schema suitable for HTTP params
37
+ #
38
+ # This schema type uses `Types::Params` for coercion by default
39
+ #
40
+ # @example
41
+ # Dry::Schema.Params do
42
+ # required(:name).filled(:string)
43
+ # required(:age).value(:integer, gt?: 0)
44
+ # end
22
45
  #
23
46
  # @return [Params]
24
47
  #
48
+ # @see Schema#define
49
+ #
25
50
  # @api public
26
51
  def self.Params(**options, &block)
27
52
  define(**options, processor_type: Params, &block)
28
53
  end
29
54
  singleton_class.send(:alias_method, :Form, :Params)
30
55
 
31
- # Define a JSON schema
56
+ # Define a schema suitable for JSON data
32
57
  #
33
- # @return [JSON]
58
+ # This schema type uses `Types::JSON` for coercion by default
34
59
  #
35
- # @api public
36
- def self.JSON(**options, &block)
37
- define(**options, processor_type: JSON, &block)
38
- end
39
-
40
- # Return configured paths to message files
60
+ # @example
61
+ # Dry::Schema.JSON do
62
+ # required(:name).filled(:string)
63
+ # required(:age).value(:integer, gt?: 0)
64
+ # end
41
65
  #
42
- # @return [Array<String>]
66
+ # @return [Params]
67
+ #
68
+ # @see Schema#define
43
69
  #
44
70
  # @api public
45
- def self.messages_paths
46
- Messages::Abstract.config.paths
71
+ def self.JSON(**options, &block)
72
+ define(**options, processor_type: JSON, &block)
47
73
  end
48
74
  end
49
75
  end
data/lib/dry-schema.rb CHANGED
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'dry/schema'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-30 00:00:00.000000000 Z
11
+ date: 2019-05-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -28,110 +28,92 @@ dependencies:
28
28
  name: dry-configurable
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '0.1'
34
31
  - - ">="
35
32
  - !ruby/object:Gem::Version
36
- version: 0.1.3
33
+ version: 0.8.0
34
+ - - "~>"
35
+ - !ruby/object:Gem::Version
36
+ version: '0.8'
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - "~>"
42
- - !ruby/object:Gem::Version
43
- version: '0.1'
44
41
  - - ">="
45
42
  - !ruby/object:Gem::Version
46
- version: 0.1.3
43
+ version: 0.8.0
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.8'
47
47
  - !ruby/object:Gem::Dependency
48
- name: dry-equalizer
48
+ name: dry-core
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '0.2'
53
+ version: '0.4'
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '0.2'
60
+ version: '0.4'
61
61
  - !ruby/object:Gem::Dependency
62
- name: dry-initializer
62
+ name: dry-equalizer
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '2.4'
67
+ version: '0.2'
68
68
  type: :runtime
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '2.4'
74
+ version: '0.2'
75
75
  - !ruby/object:Gem::Dependency
76
- name: dry-logic
76
+ name: dry-initializer
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- version: 0.5.0
82
79
  - - "~>"
83
80
  - !ruby/object:Gem::Version
84
- version: '0.5'
81
+ version: '3.0'
85
82
  type: :runtime
86
83
  prerelease: false
87
84
  version_requirements: !ruby/object:Gem::Requirement
88
85
  requirements:
89
- - - ">="
90
- - !ruby/object:Gem::Version
91
- version: 0.5.0
92
86
  - - "~>"
93
87
  - !ruby/object:Gem::Version
94
- version: '0.5'
88
+ version: '3.0'
95
89
  - !ruby/object:Gem::Dependency
96
- name: dry-types
90
+ name: dry-logic
97
91
  requirement: !ruby/object:Gem::Requirement
98
92
  requirements:
99
- - - ">="
100
- - !ruby/object:Gem::Version
101
- version: 0.14.0
102
93
  - - "~>"
103
94
  - !ruby/object:Gem::Version
104
- version: '0.14'
95
+ version: '1.0'
105
96
  type: :runtime
106
97
  prerelease: false
107
98
  version_requirements: !ruby/object:Gem::Requirement
108
99
  requirements:
109
- - - ">="
110
- - !ruby/object:Gem::Version
111
- version: 0.14.0
112
100
  - - "~>"
113
101
  - !ruby/object:Gem::Version
114
- version: '0.14'
102
+ version: '1.0'
115
103
  - !ruby/object:Gem::Dependency
116
- name: dry-core
104
+ name: dry-types
117
105
  requirement: !ruby/object:Gem::Requirement
118
106
  requirements:
119
107
  - - "~>"
120
108
  - !ruby/object:Gem::Version
121
- version: '0.2'
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: 0.2.1
109
+ version: '1.0'
125
110
  type: :runtime
126
111
  prerelease: false
127
112
  version_requirements: !ruby/object:Gem::Requirement
128
113
  requirements:
129
114
  - - "~>"
130
115
  - !ruby/object:Gem::Version
131
- version: '0.2'
132
- - - ">="
133
- - !ruby/object:Gem::Version
134
- version: 0.2.1
116
+ version: '1.0'
135
117
  - !ruby/object:Gem::Dependency
136
118
  name: bundler
137
119
  requirement: !ruby/object:Gem::Requirement
@@ -174,7 +156,10 @@ dependencies:
174
156
  - - ">="
175
157
  - !ruby/object:Gem::Version
176
158
  version: '0'
177
- description:
159
+ description: |
160
+ dry-schema provides a DSL for defining schemas with keys and rules that should be applied to
161
+ values. It supports coercion, input sanitization, custom types and localized error messages
162
+ (with or without I18n gem). It's also used as the schema engine in dry-validation.
178
163
  email:
179
164
  - piotr.solnica@gmail.com
180
165
  executables: []
@@ -192,12 +177,18 @@ files:
192
177
  - lib/dry/schema/constants.rb
193
178
  - lib/dry/schema/dsl.rb
194
179
  - lib/dry/schema/extensions.rb
180
+ - lib/dry/schema/extensions/hints.rb
181
+ - lib/dry/schema/extensions/hints/compiler_methods.rb
182
+ - lib/dry/schema/extensions/hints/message_compiler_methods.rb
183
+ - lib/dry/schema/extensions/hints/message_set_methods.rb
184
+ - lib/dry/schema/extensions/hints/result_methods.rb
195
185
  - lib/dry/schema/extensions/monads.rb
196
186
  - lib/dry/schema/json.rb
197
187
  - lib/dry/schema/key.rb
198
188
  - lib/dry/schema/key_coercer.rb
199
189
  - lib/dry/schema/key_map.rb
200
190
  - lib/dry/schema/macros.rb
191
+ - lib/dry/schema/macros/array.rb
201
192
  - lib/dry/schema/macros/core.rb
202
193
  - lib/dry/schema/macros/dsl.rb
203
194
  - lib/dry/schema/macros/each.rb
@@ -207,8 +198,10 @@ files:
207
198
  - lib/dry/schema/macros/maybe.rb
208
199
  - lib/dry/schema/macros/optional.rb
209
200
  - lib/dry/schema/macros/required.rb
201
+ - lib/dry/schema/macros/schema.rb
210
202
  - lib/dry/schema/macros/value.rb
211
203
  - lib/dry/schema/message.rb
204
+ - lib/dry/schema/message/or.rb
212
205
  - lib/dry/schema/message_compiler.rb
213
206
  - lib/dry/schema/message_compiler/visitor_opts.rb
214
207
  - lib/dry/schema/message_set.rb
@@ -216,8 +209,11 @@ files:
216
209
  - lib/dry/schema/messages/abstract.rb
217
210
  - lib/dry/schema/messages/i18n.rb
218
211
  - lib/dry/schema/messages/namespaced.rb
212
+ - lib/dry/schema/messages/template.rb
219
213
  - lib/dry/schema/messages/yaml.rb
214
+ - lib/dry/schema/namespaced_rule.rb
220
215
  - lib/dry/schema/params.rb
216
+ - lib/dry/schema/path.rb
221
217
  - lib/dry/schema/predicate.rb
222
218
  - lib/dry/schema/predicate_inferrer.rb
223
219
  - lib/dry/schema/predicate_registry.rb
@@ -241,15 +237,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
241
237
  requirements:
242
238
  - - ">="
243
239
  - !ruby/object:Gem::Version
244
- version: '0'
240
+ version: '2.4'
245
241
  required_rubygems_version: !ruby/object:Gem::Requirement
246
242
  requirements:
247
243
  - - ">="
248
244
  - !ruby/object:Gem::Version
249
245
  version: '0'
250
246
  requirements: []
251
- rubygems_version: 3.0.2
247
+ rubygems_version: 3.0.3
252
248
  signing_key:
253
249
  specification_version: 4
254
- summary: Schema coercion and validation
250
+ summary: Coercion and validation for data structures
255
251
  test_files: []