Module: Rbdantic::BaseModel::DSL::ClassMethods

Defined in:
lib/rbdantic/base/dsl.rb

Instance Method Summary collapse

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, **options)
  field_info = FieldInfo.from_dsl(name, type, , **options)
  (@__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_validatorsObject



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(**options)
  @__rbdantic_model_config__ ||= ModelConfig.new
  options.empty? ? @__rbdantic_model_config__ : @__rbdantic_model_config__ = @__rbdantic_model_config__.with(**options)
end

#model_fieldsObject 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(**options); JsonSchema::Generator.generate(self, **options); end

#model_rebuildObject

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_validatorsObject



15
# File 'lib/rbdantic/base/dsl.rb', line 15

def model_validators; @__rbdantic_model_validators__ ||= []; end