Class: Epuber::DSL::Object

Inherits:
Object
  • Object
show all
Extended by:
AttributeSupport
Defined in:
lib/epuber/dsl/object.rb

Direct Known Subclasses

Book, TreeObject

Defined Under Namespace

Classes: ValidationError

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from AttributeSupport

attribute, define_method_attr, dsl_attributes, find_root

Constructor Details

#initializeObject

Returns a new instance of Object.



19
20
21
22
23
# File 'lib/epuber/dsl/object.rb', line 19

def initialize
  super
  @attributes_values = {}
  @file_path = nil
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args) ⇒ Object (protected)

Raise exception when there is used some unknown method or attribute

This is just for creating better message in raised exception

Returns:

  • nil



128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/epuber/dsl/object.rb', line 128

def method_missing(name, *args)
  if /([^=]+)=?/ =~ name
    attr_name = ::Regexp.last_match(1)
    location = caller_locations.first
    message = <<~MSG
      Unknown attribute or method `#{attr_name}` for class `#{self.class}` in file `#{location.path}:#{location.lineno}`
    MSG

    raise NameError, message
  else
    super
  end
end

Class Attribute Details

.attributesHash<Symbol, Attribute>

Returns The attributes of the class.

Returns:

  • (Hash<Symbol, Attribute>)

    The attributes of the class.



111
112
113
# File 'lib/epuber/dsl/object.rb', line 111

def attributes
  @attributes
end

Instance Attribute Details

#file_pathString? (readonly)

Returns:

  • (String, nil)


17
18
19
# File 'lib/epuber/dsl/object.rb', line 17

def file_path
  @file_path
end

Class Method Details

.from_file(file_path) ⇒ Self

Creates new instance by parsing ruby code from file

Parameters:

  • file_path (String)

Returns:

  • (Self)


65
66
67
# File 'lib/epuber/dsl/object.rb', line 65

def self.from_file(file_path)
  from_string(::File.new(file_path).read, file_path)
end

.from_string(string, file_path = nil) ⇒ Self

Creates new instance by parsing ruby code from string

Parameters:

  • string (String)

Returns:

  • (Self)


75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/epuber/dsl/object.rb', line 75

def self.from_string(string, file_path = nil)
  obj = if file_path
          eval(string, nil, file_path) # rubocop:disable Security/Eval
        else
          eval(string) # rubocop:disable Security/Eval
        end

  unless obj.is_a?(self)
    msg = "Invalid object #{obj.class}, expected object of class #{self}"

    msg += ", loaded from file #{file_path}" if file_path

    raise StandardError, msg
  end

  obj.instance_eval { @file_path = file_path }
  obj
end

Instance Method Details

#freezeObject

Returns nil.

Returns:

  • nil



33
34
35
36
# File 'lib/epuber/dsl/object.rb', line 33

def freeze
  super
  @attributes_values.freeze
end

#from_file?Bool

Returns is created from file.

Returns:

  • (Bool)

    is created from file



96
97
98
# File 'lib/epuber/dsl/object.rb', line 96

def from_file?
  !file_path.nil?
end

#to_sString

Returns:

  • (String)


27
28
29
# File 'lib/epuber/dsl/object.rb', line 27

def to_s
  "<#{self.class} #{@attributes_values}>"
end

#validateObject

Note:

it only check for required values for now

Validates all values of attributes, if there is some error, StandardError will be raised

Returns:

  • nil



44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/epuber/dsl/object.rb', line 44

def validate
  self.class.dsl_attributes.each do |key, attr|
    value = @attributes_values[key] || attr.converted_value(attr.default_value)

    attr.validate_type(value)

    next unless attr.required? && value.nil?

    raise ValidationError, "missing required attribute `#{key.to_s.singularize}|#{key}`" if attr.singularize?


    raise ValidationError, "missing required attribute `#{key}`"
  end
end