module Dry::Types
def self.Rule(options)
-
(Dry::Logic::Rule)
-
Parameters:
-
options
(Hash
) --
def self.Rule(options) rule_compiler.( options.map { |key, val| Logic::Rule::Predicate.new(Logic::Predicates[:"#{key}?"]).curry(val).to_ast } ).reduce(:and) end
def self.[](name)
-
(Type, Class)
-
Parameters:
-
name
(String, Class
) --
def self.[](name) type_map.fetch_or_store(name) do case name when String result = name.match(TYPE_SPEC_REGEX) if result type_id, member_id = result[1..2] container[type_id].of(self[member_id]) else container[name] end when Class type_name = identifier(name) if container.key?(type_name) self[type_name] else name end end end end
def self.const_missing(const)
- Api: - private
def self.const_missing(const) underscored = Inflector.underscore(const) if type_keys.any? { |key| key.split('.')[0] == underscored } raise NameError, 'dry-types does not define constants for default types. '\ 'You can access the predefined types with [], e.g. Dry::Types["strict.integer"] '\ 'or generate a module with types using Dry::Types.module' else super end end
def self.container
-
(Container{String => Definition})
-
def self.container @container ||= Container.new end
def self.define_constants(namespace, identifiers)
-
(
-)
Parameters:
-
identifiers
(
) -- -
namespace
(Module
) --
def self.define_constants(namespace, identifiers) names = identifiers.map do |id| parts = id.split('.') [Inflector.camelize(parts.pop), parts.map(&Inflector.method(:camelize))] end names.map do |(klass, parts)| mod = parts.reduce(namespace) do |a, e| a.constants.include?(e.to_sym) ? a.const_get(e) : a.const_set(e, Module.new) end mod.const_set(klass, self[identifier((parts + [klass]).join('::'))]) end end
def self.finalize
- Include {Dry::Types.module} instead
def self.finalize warn 'Dry::Types.finalize and configuring namespace is deprecated. Just'\ ' do `include Dry::Types.module` in places where you want to have access'\ ' to built-in types' define_constants(self.namespace, type_keys) end
def self.identifier(klass)
-
(String)
-
Parameters:
-
klass
(#to_s
) --
def self.identifier(klass) Inflector.underscore(klass).tr('/', '.') end
def self.module
-
(Module)
-
def self.module namespace = Module.new define_constants(namespace, type_keys) namespace.extend(BuilderMethods) namespace end
def self.register(name, type = nil, &block)
- Api: - private
Returns:
-
(Container{String => Definition})
-
Parameters:
-
block
(#call, nil
) -- -
type
(Type
) -- -
name
(String
) --
def self.register(name, type = nil, &block) container.register(name, type || block.call) end
def self.registered?(class_or_identifier)
- Api: - private
def self.registered?(class_or_identifier) container.key?(identifier(class_or_identifier)) end
def self.rule_compiler
-
(Dry::Logic::RuleCompiler)
-
def self.rule_compiler @rule_compiler ||= Logic::RuleCompiler.new(Logic::Predicates) end
def self.type_keys
-
(
-)
def self.type_keys container.keys end
def self.type_map
-
(Concurrent::Map)
-
def self.type_map @type_map ||= Concurrent::Map.new end