Class: Dry::Schema::DSL
- Inherits:
-
Object
- Object
- Dry::Schema::DSL
- Extended by:
- Initializer
- Defined in:
- lib/dry/schema/dsl.rb
Overview
The schema definition DSL class
The DSL is exposed by:
- `Schema.define`
- `Schema.Params`
- `Schema.JSON`
- `Schema::Params.define` - use with sub-classes
- `Schema::JSON.define` - use with sub-classes
Constant Summary collapse
Class Method Summary collapse
-
.new(**options, &block) ⇒ DSL
Build a new DSL object and evaluate provided block.
Instance Method Summary collapse
-
#[](name) ⇒ Macros::Core
Return a macro with the provided name.
-
#after(key, &block) ⇒ DSL
Method allows steps injection to the processor.
-
#array ⇒ Dry::Types::Array::Member
A shortcut for defining an array type with a member.
-
#before(key, &block) ⇒ DSL
Method allows steps injection to the processor.
-
#call ⇒ Processor, ...
private
Build a processor based on DSL's definitions.
-
#compiler ⇒ Compiler
The rule compiler object.
-
#config ⇒ Config
Configuration object exposed via `#configure` method.
-
#configure(&block) ⇒ DSL
Provide customized configuration for your schema.
-
#custom_type?(name) ⇒ Bool
private
Check if a custom type was set under provided key name.
-
#filter_rules? ⇒ Boolean
private
Check if any filter rules were defined.
- #filter_schema ⇒ Object private
-
#filter_schema_dsl ⇒ Object
private
Build an input schema DSL used by `filter` API.
-
#key(name, macro:, &block) ⇒ Macros::Key
A generic method for defining keys.
-
#macros ⇒ Array
An array with macros defined within the DSL.
-
#merge(other) ⇒ DSL
private
Merge with another dsl.
- #merge_types(op_class, lhs, rhs) ⇒ Object private
-
#new(**options, &block) ⇒ Dry::Types::Safe
private
Return a new DSL instance using the same processor type.
-
#optional(name, &block) ⇒ Macros::Optional
Define an optional key.
-
#parent ⇒ Object
The parent (last from parents) which is used for copying non mergeable configuration.
-
#path ⇒ Path, Array
Path under which the schema is defined.
-
#processor_type ⇒ Compiler
The type of the processor (Params, JSON, or a custom sub-class).
-
#required(name, &block) ⇒ Macros::Required
Define a required key.
-
#resolve_type(spec) ⇒ Dry::Types::Type
private
Resolve type object from the provided spec.
-
#set_type(name, spec) ⇒ Dry::Types::Safe
private
Set a type for the given key name.
-
#steps ⇒ ProcessorSteps
Steps for the processor.
-
#strict_type_schema ⇒ Dry::Types::Schema
private
Return type schema used when composing subschemas.
-
#to_rule ⇒ RuleApplier
Cast this DSL into a rule object.
-
#type_schema ⇒ Dry::Types::Lax
private
Return type schema used by the value coercer.
-
#types ⇒ Object
private
This DSL's type map merged with any parent type maps.
Class Method Details
.new(**options, &block) ⇒ DSL
Build a new DSL object and evaluate provided block
100 101 102 103 104 |
# File 'lib/dry/schema/dsl.rb', line 100 def self.new(**, &block) dsl = super dsl.instance_eval(&block) if block dsl end |
Instance Method Details
#[](name) ⇒ Macros::Core
Return a macro with the provided name
132 133 134 |
# File 'lib/dry/schema/dsl.rb', line 132 def [](name) macros.detect { |macro| macro.name.equal?(name) } end |
#after(key, &block) ⇒ DSL
Method allows steps injection to the processor
275 276 277 278 |
# File 'lib/dry/schema/dsl.rb', line 275 def after(key, &block) steps.after(key, &block) self end |
#array ⇒ Dry::Types::Array::Member
A shortcut for defining an array type with a member
246 247 248 |
# File 'lib/dry/schema/dsl.rb', line 246 def array -> member_type { type_registry["array"].of(resolve_type(member_type)) } end |
#before(key, &block) ⇒ DSL
Method allows steps injection to the processor
260 261 262 263 |
# File 'lib/dry/schema/dsl.rb', line 260 def before(key, &block) steps.before(key, &block) self end |
#call ⇒ Processor, ...
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Build a processor based on DSL's definitions
203 204 205 206 207 208 209 210 211 212 213 214 215 |
# File 'lib/dry/schema/dsl.rb', line 203 def call all_steps = parents.map(&:steps) + [steps] result_steps = all_steps.inject { |result, steps| result.merge(steps) } result_steps[:key_validator] = key_validator if config.validate_keys result_steps[:key_coercer] = key_coercer result_steps[:value_coercer] = value_coercer result_steps[:rule_applier] = rule_applier result_steps[:filter_schema] = filter_schema.rule_applier if filter_rules? processor_type.new(schema_dsl: self, steps: result_steps) end |
#compiler ⇒ Compiler
Returns The rule compiler object.
59 |
# File 'lib/dry/schema/dsl.rb', line 59 option :compiler, default: -> { Compiler.new } |
#config ⇒ Config
Returns Configuration object exposed via `#configure` method.
74 |
# File 'lib/dry/schema/dsl.rb', line 74 option :config, optional: true, default: proc { default_config } |
#configure(&block) ⇒ DSL
Provide customized configuration for your schema
120 121 122 123 |
# File 'lib/dry/schema/dsl.rb', line 120 def configure(&block) config.configure(&block) self end |
#custom_type?(name) ⇒ Bool
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Check if a custom type was set under provided key name
336 337 338 |
# File 'lib/dry/schema/dsl.rb', line 336 def custom_type?(name) !types[name].[:default].equal?(true) end |
#filter_rules? ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Check if any filter rules were defined
373 374 375 376 377 378 379 |
# File 'lib/dry/schema/dsl.rb', line 373 def filter_rules? if instance_variable_defined?("@filter_schema_dsl") && !filter_schema_dsl.macros.empty? return true end parents.any?(&:filter_rules?) end |
#filter_schema ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
357 358 359 |
# File 'lib/dry/schema/dsl.rb', line 357 def filter_schema filter_schema_dsl.call end |
#filter_schema_dsl ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Build an input schema DSL used by `filter` API
366 367 368 |
# File 'lib/dry/schema/dsl.rb', line 366 def filter_schema_dsl @filter_schema_dsl ||= new(parent: parent_filter_schemas) end |
#key(name, macro:, &block) ⇒ Macros::Key
A generic method for defining keys
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
# File 'lib/dry/schema/dsl.rb', line 181 def key(name, macro:, &block) raise ArgumentError, "Key +#{name}+ is not a symbol" unless name.is_a?(::Symbol) set_type(name, Types::Any.(default: true)) macro = macro.new( name: name, compiler: compiler, schema_dsl: self, filter_schema_dsl: filter_schema_dsl ) macro.value(&block) if block macros << macro macro end |
#macros ⇒ Array
Returns An array with macros defined within the DSL.
65 |
# File 'lib/dry/schema/dsl.rb', line 65 option :macros, default: -> { EMPTY_ARRAY.dup } |
#merge(other) ⇒ DSL
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Merge with another dsl
222 223 224 225 226 227 228 229 |
# File 'lib/dry/schema/dsl.rb', line 222 def merge(other) new( parent: parents + other.parents, macros: macros + other.macros, types: types.merge(other.types), steps: steps.merge(other.steps) ) end |
#merge_types(op_class, lhs, rhs) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
389 390 391 |
# File 'lib/dry/schema/dsl.rb', line 389 def merge_types(op_class, lhs, rhs) types_merger.(op_class, lhs, rhs) end |
#new(**options, &block) ⇒ Dry::Types::Safe
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Return a new DSL instance using the same processor type
312 313 314 |
# File 'lib/dry/schema/dsl.rb', line 312 def new(**, &block) self.class.new(**, processor_type: processor_type, config: config, &block) end |
#optional(name, &block) ⇒ Macros::Optional
Define an optional key
This works exactly the same as `required` except that if a key is not present rules will not be applied
168 169 170 |
# File 'lib/dry/schema/dsl.rb', line 168 def optional(name, &block) key(name, macro: Macros::Optional, &block) end |
#parent ⇒ Object
The parent (last from parents) which is used for copying non mergeable configuration
71 |
# File 'lib/dry/schema/dsl.rb', line 71 option :parent, Types::Coercible::Array, default: -> { EMPTY_ARRAY.dup }, as: :parents |
#path ⇒ Path, Array
Returns Path under which the schema is defined.
80 |
# File 'lib/dry/schema/dsl.rb', line 80 option :path, -> *args { Path[*args] if args.any? }, default: proc { EMPTY_ARRAY } |
#processor_type ⇒ Compiler
Returns The type of the processor (Params, JSON, or a custom sub-class).
62 |
# File 'lib/dry/schema/dsl.rb', line 62 option :processor_type, default: -> { Processor } |
#required(name, &block) ⇒ Macros::Required
Define a required key
152 153 154 |
# File 'lib/dry/schema/dsl.rb', line 152 def required(name, &block) key(name, macro: Macros::Required, &block) end |
#resolve_type(spec) ⇒ Dry::Types::Type
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Resolve type object from the provided spec
347 348 349 350 351 352 353 354 |
# File 'lib/dry/schema/dsl.rb', line 347 def resolve_type(spec) case spec when ::Dry::Types::Type then spec when ::Array then spec.map { |s| resolve_type(s) }.reduce(:|) else type_registry[spec] end end |
#set_type(name, spec) ⇒ Dry::Types::Safe
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Set a type for the given key name
324 325 326 327 328 329 |
# File 'lib/dry/schema/dsl.rb', line 324 def set_type(name, spec) type = resolve_type(spec) = {required: true, maybe: type.optional?} @types[name] = type.() end |
#steps ⇒ ProcessorSteps
Returns Steps for the processor.
77 |
# File 'lib/dry/schema/dsl.rb', line 77 option :steps, default: proc { ProcessorSteps.new } |
#strict_type_schema ⇒ Dry::Types::Schema
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Return type schema used when composing subschemas
303 304 305 |
# File 'lib/dry/schema/dsl.rb', line 303 def strict_type_schema type_registry["hash"].schema(types) end |
#to_rule ⇒ RuleApplier
Cast this DSL into a rule object
234 235 236 |
# File 'lib/dry/schema/dsl.rb', line 234 def to_rule call.to_rule end |
#type_schema ⇒ Dry::Types::Lax
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Return type schema used by the value coercer
294 295 296 |
# File 'lib/dry/schema/dsl.rb', line 294 def type_schema strict_type_schema.lax end |
#types ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This DSL's type map merged with any parent type maps
68 |
# File 'lib/dry/schema/dsl.rb', line 68 option :types, default: -> { EMPTY_HASH.dup } |