Sha256: 34efdd674880f1fabd0578832318c6ea546f527a412b43e009b7f2d2d1684536

Contents?: true

Size: 1.97 KB

Versions: 4

Compression:

Stored size: 1.97 KB

Contents

module Spyke
  module Orm
    extend ActiveSupport::Concern

    included do
      define_model_callbacks :create, :update, :save

      class_attribute :include_root
      self.include_root = true

      class_attribute :callback_methods, instance_accessor: false
      self.callback_methods = { create: :post, update: :put }.freeze
    end

    module ClassMethods
      def include_root_in_json(value)
        self.include_root = value
      end

      def method_for(callback, value = nil)
        self.callback_methods = callback_methods.merge(callback => value) if value
        callback_methods[callback]
      end

      def find(id)
        raise ResourceNotFound if id.blank?
        id = strip_slug(id)
        where(id: id).find_one || raise(ResourceNotFound)
      end

      def fetch
        scoped_request :get
      end

      def create(attributes = {})
        record = new(attributes)
        record.save
        record
      end

      def destroy(id = nil)
        new(id: id).destroy
      end

      def strip_slug(id)
        id.to_s.split('-').first
      end
    end

    def to_params
      if param_root
        { param_root => params_not_embedded_in_url }
      else
        params_not_embedded_in_url
      end
    end

    def persisted?
      id?
    end

    def save
      run_callbacks :save do
        callback = persisted? ? :update : :create
        run_callbacks(callback) do
          send self.class.method_for(callback), to_params
        end
      end
    end

    def destroy
      delete
    end

    def update_attributes(new_attributes)
      self.attributes = new_attributes
      save
    end

    def reload
      self.attributes = self.class.find(id).attributes
    end

    private

      def param_root
        if include_root.is_a? String
          include_root
        elsif include_root?
          self.class.model_name.param_key
        end
      end

      def params_not_embedded_in_url
        attributes.to_params.except(*uri.variables)
      end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
spyke-3.1.0 lib/spyke/orm.rb
spyke-3.0.0 lib/spyke/orm.rb
spyke-2.0.1 lib/spyke/orm.rb
spyke-2.0.0 lib/spyke/orm.rb