Module: Attributor::Type::ClassMethods
- Defined in:
- lib/attributor/type.rb
Instance Method Summary collapse
- #anonymous? ⇒ Boolean
-
#anonymous_type(val = true) ⇒ Object
Allow a type to be marked as if it was anonymous (i.e. not referenceable by name).
-
#check_option!(name, definition) ⇒ Object
HELPER FUNCTIONS.
-
#compile_dsl(options, block) ⇒ Object
By default, non complex types will not have a DSL subdefinition this handles such case.
-
#constructable? ⇒ Boolean
Does this type support the generation of subtypes?.
-
#describe(_root = false, example: nil) ⇒ Object
Default describe for simple types…only their name (stripping the base attributor module).
- #dsl_compiler ⇒ Object
-
#dump(value, **_opts) ⇒ Object
Generic encoding of the attribute.
-
#example(_context = nil, options: {}) ⇒ Object
Default, overridable example function.
- #family ⇒ Object
- #generate_subcontext(context, subname) ⇒ Object
- #id ⇒ Object
-
#load(value, context = Attributor::DEFAULT_ROOT_CONTEXT, **_options) ⇒ Object
Generic decoding and coercion of the attribute.
-
#valid_type?(value) ⇒ Boolean
Default, overridable valid_type? function.
-
#validate(value, context = Attributor::DEFAULT_ROOT_CONTEXT, attribute) ⇒ Object
TODO: refactor this to take just the options instead of the full attribute? TODO: delegate to subclass.
Instance Method Details
#anonymous? ⇒ Boolean
20 21 22 23 24 25 26 |
# File 'lib/attributor/type.rb', line 20 def anonymous? if @_anonymous.nil? name.nil? # if nothing is set, consider it anonymous if the class does not have a name else @_anonymous end end |
#anonymous_type(val = true) ⇒ Object
Allow a type to be marked as if it was anonymous (i.e. not referenceable by name)
16 17 18 |
# File 'lib/attributor/type.rb', line 16 def anonymous_type(val = true) @_anonymous = val end |
#check_option!(name, definition) ⇒ Object
HELPER FUNCTIONS
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/attributor/type.rb', line 74 def check_option!(name, definition) case name when :min raise AttributorException, "Value for option :min does not implement '<='. Got: (#{definition.inspect})" unless definition.respond_to?(:<=) when :max raise AttributorException, "Value for option :max does not implement '>='. Got(#{definition.inspect})" unless definition.respond_to?(:>=) when :regexp # could go for a respoind_to? :=~ here, but that seems overly... cute... and not useful. raise AttributorException, "Value for option :regexp is not a Regexp object. Got (#{definition.inspect})" unless definition.is_a? ::Regexp else return :unknown end :ok end |
#compile_dsl(options, block) ⇒ Object
By default, non complex types will not have a DSL subdefinition this handles such case
99 100 101 102 103 104 |
# File 'lib/attributor/type.rb', line 99 def compile_dsl(, block) raise AttributorException, 'Basic structures cannot take extra block definitions' if block # Simply create a DSL compiler to store the options, and not to parse any DSL sub_definition = dsl_compiler.new() sub_definition end |
#constructable? ⇒ Boolean
Does this type support the generation of subtypes?
11 12 13 |
# File 'lib/attributor/type.rb', line 11 def constructable? false end |
#describe(_root = false, example: nil) ⇒ Object
Default describe for simple types…only their name (stripping the base attributor module)
107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/attributor/type.rb', line 107 def describe(_root = false, example: nil) type_name = Attributor.type_name(self) hash = { name: type_name.gsub(Attributor::MODULE_PREFIX_REGEX, ''), family: family, id: id } hash[:anonymous] = @_anonymous unless @_anonymous.nil? hash[:example] = example if example hash end |
#dsl_compiler ⇒ Object
94 95 96 |
# File 'lib/attributor/type.rb', line 94 def dsl_compiler DSLCompiler end |
#dump(value, **_opts) ⇒ Object
Generic encoding of the attribute
39 40 41 |
# File 'lib/attributor/type.rb', line 39 def dump(value, **_opts) value end |
#example(_context = nil, options: {}) ⇒ Object
Default, overridable example function
68 69 70 |
# File 'lib/attributor/type.rb', line 68 def example(_context = nil, options: {}) raise AttributorException, "#{self} must implement #example" end |
#family ⇒ Object
124 125 126 |
# File 'lib/attributor/type.rb', line 124 def family 'any' end |
#generate_subcontext(context, subname) ⇒ Object
90 91 92 |
# File 'lib/attributor/type.rb', line 90 def generate_subcontext(context, subname) context + [subname] end |
#id ⇒ Object
119 120 121 122 |
# File 'lib/attributor/type.rb', line 119 def id return nil if name.nil? name.gsub('::'.freeze, '-'.freeze) end |
#load(value, context = Attributor::DEFAULT_ROOT_CONTEXT, **_options) ⇒ Object
Generic decoding and coercion of the attribute.
29 30 31 32 33 34 35 36 |
# File 'lib/attributor/type.rb', line 29 def load(value, context = Attributor::DEFAULT_ROOT_CONTEXT, **) return nil if value.nil? unless value.is_a?(native_type) raise Attributor::IncompatibleTypeError.new(context: context, value_type: value.class, type: self) end value end |
#valid_type?(value) ⇒ Boolean
Default, overridable valid_type? function
61 62 63 64 65 |
# File 'lib/attributor/type.rb', line 61 def valid_type?(value) return value.is_a?(native_type) if respond_to?(:native_type) raise AttributorException, "#{self} must implement #valid_type? or #native_type" end |
#validate(value, context = Attributor::DEFAULT_ROOT_CONTEXT, attribute) ⇒ Object
TODO: refactor this to take just the options instead of the full attribute? TODO: delegate to subclass
45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/attributor/type.rb', line 45 def validate(value, context = Attributor::DEFAULT_ROOT_CONTEXT, attribute) # rubocop:disable Style/OptionalArguments errors = [] attribute..each do |option, opt_definition| case option when :max errors << "#{Attributor.humanize_context(context)} value (#{value}) is larger than the allowed max (#{opt_definition.inspect})" unless value <= opt_definition when :min errors << "#{Attributor.humanize_context(context)} value (#{value}) is smaller than the allowed min (#{opt_definition.inspect})" unless value >= opt_definition when :regexp errors << "#{Attributor.humanize_context(context)} value (#{value}) does not match regexp (#{opt_definition.inspect})" unless value =~ opt_definition end end errors end |