module Ruson::Persistence

Public Class Methods

included(klass) click to toggle source
# File lib/ruson/persistence.rb, line 3
def self.included(klass)
  klass.extend(ClassMethods)
  klass.extend(Ruson::Json)
end

Public Instance Methods

delete_file_from_disk() click to toggle source
# File lib/ruson/persistence.rb, line 20
def delete_file_from_disk
  FileUtils.rm_f(model_path)
end
destroy() click to toggle source
# File lib/ruson/persistence.rb, line 24
def destroy
  delete_file_from_disk
  true
end
ensure_model_folder_exists() click to toggle source
# File lib/ruson/persistence.rb, line 29
def ensure_model_folder_exists
  return if File.exist?(self.class.model_base_path)

  FileUtils.mkdir_p(self.class.model_base_path)
end
generate_uniq_id() click to toggle source
# File lib/ruson/persistence.rb, line 35
def generate_uniq_id
  ensure_model_folder_exists

  return if id

  id = 0

  Dir.glob(File.join(self.class.model_base_path, '*.json')).each do |path|
    file_id = id_from_file_path(path)

    id = file_id if file_id > id
  end

  self.id = id + 1
end
model_path() click to toggle source
# File lib/ruson/persistence.rb, line 51
def model_path
  File.join(self.class.model_base_path, "#{id}.json")
end
save() click to toggle source
# File lib/ruson/persistence.rb, line 61
def save
  self.class.ensure_output_folder_is_defined
  generate_uniq_id
  write_file_to_disk
  true
end
update(attributes) click to toggle source
# File lib/ruson/persistence.rb, line 68
def update(attributes)
  attributes.symbolize_keys!

  # Takes only accessor for attributes to be updated, avoiding to nullify
  # the other attributes.
  filtered_accessors = self.class.accessors.select do |key, accessor_attrs|
    attributes.key?(key) || attributes.key?(accessor_attrs[:name])
  end

  update_attributes(filtered_accessors, attributes)

  save
end
write_file_to_disk() click to toggle source
# File lib/ruson/persistence.rb, line 55
def write_file_to_disk
  File.open(model_path, 'w') do |file|
    file.write(to_json(exclude: %i[id]))
  end
end