class Ruson::Base

Public Class Methods

accessors() click to toggle source
# File lib/ruson/base.rb, line 33
def accessors
  @accessors
end
ensure_output_folder_is_defined() click to toggle source

~~~~ Class Methods ~~~~

# File lib/ruson/base.rb, line 71
def self.ensure_output_folder_is_defined
  return if Ruson.output_folder

  raise ArgumentError, 'No output folder defined. You can define it ' \
                       'using Ruson.output_folder = "/path/to/db/folder"'
end
enum(attr, values) click to toggle source
# File lib/ruson/base.rb, line 28
def enum(attr, values)
  define_enum_methods attr.to_s, values.map(&:to_sym)
  add_accessor attr.to_s
end
field(attr, options = {}) click to toggle source
# File lib/ruson/base.rb, line 23
def field(attr, options = {})
  instance_eval("attr_accessor :#{attr.to_s}")
  add_accessor attr.to_s, options
end
new(json, root_key: nil) click to toggle source

~~~~ Instance Methods ~~~~

# File lib/ruson/base.rb, line 79
def initialize(json, root_key: nil)
  params = get_hash_from_json(json)
  params = params[root_key.to_s] unless root_key.nil?

  init_attributes(self.class.accessors, params)
end

Private Class Methods

add_accessor(name, options = {}) click to toggle source
# File lib/ruson/base.rb, line 54
def add_accessor(name, options = {})
  options[:name] = options[:name].try(:to_sym) if options[:name]

  @accessors ||= {}
  @accessors.merge!({ name.to_sym => options })
end
define_enum_methods(name, values) click to toggle source
# File lib/ruson/base.rb, line 39
def define_enum_methods(name, values)
  instance_eval("attr_reader :#{name}")

  define_method "#{name}=" do |v|
    raise ArgumentError, "#{v} is not a valid #{name}" unless values.include? v.to_sym
    eval "@#{name} = :#{v.to_s}"
  end

  values.each do |v|
    define_method "#{v}?" do
      eval "@#{name} == :#{v.to_s}"
    end
  end
end

Public Instance Methods

to_hash() click to toggle source
# File lib/ruson/base.rb, line 86
def to_hash
  res = convert_to_hash(self.class.accessors)

  res.inject({}) do |result, attributes|
    key, value = attributes
    accessor = self.class.accessors[key]
    if accessor && accessor.key?(:name)
      result[accessor[:name]] = value
    else
      result[key] = value
    end
    result
  end
end
to_json(options = {}) click to toggle source
# File lib/ruson/base.rb, line 101
def to_json(options = {})
  hash = to_hash

  options[:exclude].each { |key| hash.delete(key) } if options[:exclude]

  hash.to_json
end

Private Instance Methods

cast_value(value, accessor_options, options = {}) click to toggle source
# File lib/ruson/base.rb, line 111
def cast_value(value, accessor_options, options = {})
  check_nilable(value, accessor_options)
  get_val(value, accessor_options)
end
init_attributes(accessors, params) click to toggle source
# File lib/ruson/base.rb, line 116
def init_attributes(accessors, params)
  update_attributes(accessors, params)

  self.class.attr_accessor(:id)
  set_attribute(:id, params[:id]) if params && params[:id]
end
set_attribute(attr_name, value) click to toggle source
# File lib/ruson/base.rb, line 123
def set_attribute(attr_name, value)
  send("#{attr_name}=".to_sym, value)
end
update_attributes(accessors, params) click to toggle source
# File lib/ruson/base.rb, line 127
def update_attributes(accessors, params)
  accessors.each do |key, options|
    value = params[options[:name]] || params[key] if params

    casted_value = cast_value(value, options)
    set_attribute(key, casted_value)
  end
end