Module: Rbdantic::BaseModel::DSL::ClassMethods
- Defined in:
- lib/rbdantic/base/dsl.rb
Instance Method Summary collapse
- #__build_instance__(attributes, fields_set:, extra_fields:) ⇒ Object
- #field(name, type, metadata = nil, **options) ⇒ Object
- #field_validator(field_name, mode: :after, &block) ⇒ Object
- #field_validators ⇒ Object
- #inherited(subclass) ⇒ Object
- #model_config(**options) ⇒ Object
- #model_fields ⇒ Object (also: #fields)
- #model_json_schema(**options) ⇒ Object
-
#model_rebuild ⇒ Object
Rebuild model fields (useful after inheritance or dynamic changes) Re-creates field accessors and validators.
- #model_validate(data) ⇒ Object
- #model_validator(mode: :after, &block) ⇒ Object
- #model_validators ⇒ Object
Instance Method Details
#__build_instance__(attributes, fields_set:, extra_fields:) ⇒ Object
68 69 70 71 72 73 74 75 |
# File 'lib/rbdantic/base/dsl.rb', line 68 def __build_instance__(attributes, fields_set:, extra_fields:) instance = allocate attributes.each { |name, value| instance.instance_variable_set("@#{name}", value) } instance.instance_variable_set(:@__fields_set__, fields_set.map(&:to_sym).uniq) instance.instance_variable_set(:@__extra_fields__, extra_fields.map(&:to_sym).uniq) instance.freeze if model_config.frozen instance end |
#field(name, type, metadata = nil, **options) ⇒ Object
17 18 19 20 21 22 23 24 25 26 |
# File 'lib/rbdantic/base/dsl.rb', line 17 def field(name, type, = nil, **) field_info = FieldInfo.from_dsl(name, type, , **) (@__rbdantic_fields__ ||= {})[name] = field_info define_method(name) { instance_variable_get("@#{name}") } define_method("#{name}=") do |value| raise FrozenError, "cannot modify frozen #{self.class.name}" if self.class.model_config.frozen assign_field(name, value) end end |
#field_validator(field_name, mode: :after, &block) ⇒ Object
43 44 45 46 |
# File 'lib/rbdantic/base/dsl.rb', line 43 def field_validator(field_name, mode: :after, &block) ((@__rbdantic_field_validators__ ||= {})[field_name] ||= []) << Validators::FieldValidator.new(field_name, mode: mode, &block) end |
#field_validators ⇒ Object
14 |
# File 'lib/rbdantic/base/dsl.rb', line 14 def field_validators; @__rbdantic_field_validators__ ||= {}; end |
#inherited(subclass) ⇒ Object
33 34 35 36 37 38 39 40 41 |
# File 'lib/rbdantic/base/dsl.rb', line 33 def inherited(subclass) subclass.instance_variable_set(:@__rbdantic_fields__, fields.dup) subclass.instance_variable_set(:@__rbdantic_model_config__, model_config.dup) subclass.instance_variable_set(:@__rbdantic_field_validators__, field_validators.each_with_object({}) do |(k, v), h| h[k] = v.dup end) subclass.instance_variable_set(:@__rbdantic_model_validators__, model_validators.dup) super end |
#model_config(**options) ⇒ Object
28 29 30 31 |
# File 'lib/rbdantic/base/dsl.rb', line 28 def model_config(**) @__rbdantic_model_config__ ||= ModelConfig.new .empty? ? @__rbdantic_model_config__ : @__rbdantic_model_config__ = @__rbdantic_model_config__.with(**) end |
#model_fields ⇒ Object Also known as: fields
11 |
# File 'lib/rbdantic/base/dsl.rb', line 11 def model_fields; @__rbdantic_fields__ ||= {}; end |
#model_json_schema(**options) ⇒ Object
65 |
# File 'lib/rbdantic/base/dsl.rb', line 65 def model_json_schema(**); JsonSchema::Generator.generate(self, **); end |
#model_rebuild ⇒ Object
Rebuild model fields (useful after inheritance or dynamic changes) Re-creates field accessors and validators
54 55 56 57 58 59 60 61 62 63 |
# File 'lib/rbdantic/base/dsl.rb', line 54 def model_rebuild fields.each do |name, _| define_method(name) { instance_variable_get("@#{name}") } define_method("#{name}=") do |value| raise FrozenError, "cannot modify frozen #{self.class.name}" if self.class.model_config.frozen assign_field(name, value) end end true end |
#model_validate(data) ⇒ Object
66 |
# File 'lib/rbdantic/base/dsl.rb', line 66 def model_validate(data); new(data); end |
#model_validator(mode: :after, &block) ⇒ Object
48 49 50 |
# File 'lib/rbdantic/base/dsl.rb', line 48 def model_validator(mode: :after, &block) (@__rbdantic_model_validators__ ||= []) << Validators::ModelValidator.new(mode: mode, &block) end |
#model_validators ⇒ Object
15 |
# File 'lib/rbdantic/base/dsl.rb', line 15 def model_validators; @__rbdantic_model_validators__ ||= []; end |