class Rack::Scaffold::Adapters::CoreData

Public Class Methods

===(model) click to toggle source
# File lib/rack/scaffold/adapters/core_data.rb, line 10
def ===(model)
  return true if ::CoreData::DataModel === model

  begin
    !!::CoreData::DataModel.new(model)
  rescue StandardError
    false
  end
end
new(entity, options = {}) click to toggle source
Calls superclass method
# File lib/rack/scaffold/adapters/core_data.rb, line 30
def initialize(entity, options = {})
  adapter = self.class
  klass = adapter.const_get(entity.name.capitalize)
  klass.dataset = entity.name.downcase.pluralize.to_sym

  klass.class_eval do
    alias_method :update!, :update
    alias_method :destroy!, :destroy

    self.strict_param_setting = false
    self.raise_on_save_failure = false

    plugin :json_serializer, naked: true, include: [:url]
    plugin :schema
    plugin :validation_helpers

    if options[:timestamps]
      if options[:timestamps].instance_of? Hash
        plugin :timestamps, options[:timestamps]
      else
        plugin :timestamps, update_on_create: true
      end
    end

    plugin :nested_attributes if options[:nested_attributes]

    def url
      "/#{self.class.table_name}/#{self[primary_key]}"
    end

    entity.relationships.each do |relationship|
      entity_options = { class: adapter.const_get(relationship.destination.capitalize) }

      if relationship.to_many?
        one_to_many relationship.name.to_sym, entity_options
        if options[:nested_attributes]
          nested_attributes relationship.name.to_sym
        end
      else
        many_to_one relationship.name.to_sym, options
      end
    end

    set_schema do
      primary_key :id

      entity.attributes.each do |attribute|
        next if attribute.transient?

        options = {
          null: attribute.optional?,
          index: attribute.indexed?,
          default: attribute.default_value
        }

        type = case attribute.type
               when 'Integer 16' then :int2
               when 'Integer 32' then :int4
               when 'Integer 64' then :int8
               when 'Float' then :float4
               when 'Double' then :float8
               when 'Decimal' then :float8
               when 'Date' then :timestamp
               when 'Boolean' then :boolean
               when 'Binary' then :bytea
               else :varchar
               end

        column attribute.name.to_sym, type, options
      end

      entity.relationships.each do |relationship|
        options = {
          index: true,
          null: relationship.optional?
        }

        unless relationship.to_many?
          column "#{relationship.name}_id".to_sym, :integer, options
        end
      end
    end

    if table_exists?
      missing_columns = schema.columns.reject { |c| columns.include?(c[:name]) }
      db.alter_table table_name do
        missing_columns.each do |options|
          add_column options.delete(:name), options.delete(:type), options
        end
      end
    else
      create_table
    end
  end

  klass.send :define_method, :validate do
    entity.attributes.each do |attribute|
      case attribute.type
      when 'Integer 16', 'Integer 32', 'Integer 64'
        validates_integer attribute.name
      when 'Float', 'Double', 'Decimal'
        validates_numeric attribute.name
      when 'String'
        validates_min_length attribute.minimum_value, attribute.name if attribute.minimum_value
        validates_max_length attribute.maximum_value, attribute.name if attribute.maximum_value
      end
    end
  end

  super(klass)
end
resources(xcdatamodel, options = {}) click to toggle source
# File lib/rack/scaffold/adapters/core_data.rb, line 20
def resources(xcdatamodel, options = {})
  model = ::CoreData::DataModel.new(xcdatamodel)
  model.entities.each do |entity|
    const_set(entity.name.capitalize, Class.new(::Sequel::Model)) unless const_defined?(entity.name.capitalize)
  end

  model.entities.collect { |entity| new(entity, options) }
end

Public Instance Methods

url() click to toggle source
# File lib/rack/scaffold/adapters/core_data.rb, line 56
def url
  "/#{self.class.table_name}/#{self[primary_key]}"
end