class SequelMapper::Configurations::ConventionalConfiguration

Constants

FactoryNotFoundError

Attributes

datastore[R]
mappings[R]

Public Class Methods

new(datastore) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 19
def initialize(datastore)
  @datastore = datastore
  @overrides = {}
  @subset_queries = {}
  @associations_by_mapping = {}
end

Public Instance Methods

[](mapping_name) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 29
def [](mapping_name)
  mappings[mapping_name]
end
setup_mapping(mapping_name, &block) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 33
def setup_mapping(mapping_name, &block)
  @associations_by_mapping[mapping_name] ||= []

  block.call(
    RelationConfigOptionsProxy.new(
      method(:add_override).to_proc.curry.call(mapping_name),
      method(:add_subset).to_proc.curry.call(mapping_name),
      @associations_by_mapping.fetch(mapping_name),
    )
  ) if block

  # TODO: more madness in this silly config this, kill it with fire.
  explicit_settings = @overrides[mapping_name] ||= {}
  explicit_settings[:factory] ||= raise_if_not_found_factory(mapping_name)

  self
end

Private Instance Methods

add_override(mapping_name, attrs) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 102
def add_override(mapping_name, attrs)
  overrides = @overrides.fetch(mapping_name, {}).merge(attrs)

  @overrides.store(mapping_name, overrides)
end
add_subset(mapping_name, subset_name, block) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 108
def add_subset(mapping_name, subset_name, block)
  @subset_queries.store(
    mapping_name,
    @subset_queries.fetch(mapping_name, {}).merge(
      subset_name => block,
    )
  )
end
association_configurator(mappings, mapping_name) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 117
def association_configurator(mappings, mapping_name)
  ConventionalAssociationConfiguration.new(
    mapping_name,
    mappings,
    datastore,
  )
end
class_to_factory(klass) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 254
def class_to_factory(klass)
  if klass.ancestors.include?(Struct)
    StructFactory.new(klass)
  else
    klass.method(:new)
  end
end
consolidate_overrides(opts) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 178
def consolidate_overrides(opts)
  new_opts = opts.dup

  if new_opts.has_key?(:class_name)
    new_opts.merge!(factory: string_to_factory(new_opts.fetch(:class_name)))
    new_opts.delete(:class_name)
  end

  if new_opts.has_key?(:class)
    new_opts.merge!(factory: class_to_factory(new_opts.fetch(:class)))
    new_opts.delete(:class)
  end

  new_opts
end
default_mapping_args(table_name, mapping_name) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 156
def default_mapping_args(table_name, mapping_name)
  {
    name: mapping_name,
    relation_name: table_name,
    fields: get_fields(table_name),
    primary_key: get_primary_key(table_name),
    factory: ok_if_it_doesnt_exist_factory(mapping_name),
    serializer: hash_coercion_serializer,
    associations: {},
    subsets: subset_queries_proxy(@subset_queries.fetch(mapping_name, {})),
  }
end
generate_associations_config(mappings) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 143
def generate_associations_config(mappings)
  # TODO: the ConventionalAssociationConfiguration takes all the mappings
  # as a dependency and then sends mutating messages to them.
  # This mutation based approach was originally a spike but now just
  # seems totally bananas!
  @associations_by_mapping.each do |mapping_name, associations|
    associations.each do |(assoc_type, assoc_args)|
      association_configurator(mappings, mapping_name)
        .public_send(assoc_type, *assoc_args)
    end
  end
end
generate_mappings() click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 125
def generate_mappings
  Hash[
    tables
      .map { |table_name|
        mapping_name, overrides = overrides_for_table(table_name)

        [
          mapping_name,
          mapping(
            **default_mapping_args(table_name, mapping_name).merge(overrides)
          ),
        ]
      }
  ].tap { |mappings|
    generate_associations_config(mappings)
  }
end
get_fields(table_name) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 194
def get_fields(table_name)
  datastore[table_name].columns
end
get_primary_key(table_name) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 198
def get_primary_key(table_name)
  datastore.schema(table_name)
    .select { |field_name, properties|
      properties.fetch(:primary_key)
    }
    .map { |field_name, _| field_name }
end
hash_coercion_serializer() click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 210
def hash_coercion_serializer
  ->(o) { o.to_h }
end
mapping(name:, relation_name:, primary_key:, factory:, serializer:, fields:, associations:, subsets:) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 218
def mapping(name:, relation_name:, primary_key:, factory:, serializer:, fields:, associations:, subsets:)
  RelationMapping.new(
    name: name,
    namespace: relation_name,
    primary_key: primary_key,
    factory: factory,
    serializer: serializer,
    fields: fields,
    associations: associations,
    subsets: subsets,
  )
end
ok_if_it_doesnt_exist_factory(name) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 247
def ok_if_it_doesnt_exist_factory(name)
  ->(attrs) {
    factory = class_to_factory(string_to_class(name)) rescue nil
    factory && factory.call(attrs)
  }
end
overrides_for_table(table_name) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 169
def overrides_for_table(table_name)
  mapping_name, overrides = @overrides
    .find { |(_mapping_name, config)|
      table_name == config.fetch(:relation_name, nil)
    } || [table_name, @overrides.fetch(table_name, {})]

  [mapping_name, consolidate_overrides(overrides)]
end
raise_if_not_found_factory(name) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 241
def raise_if_not_found_factory(name)
  ->(attrs) {
    class_to_factory(string_to_class(name)).call(attrs)
  }
end
string_to_class(string) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 262
def string_to_class(string)
  klass_name = INFLECTOR.classify(string)

  Object.const_get(klass_name)
end
subset_queries_proxy(subset_map) click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 214
def subset_queries_proxy(subset_map)
  SubsetQueriesProxy.new(subset_map)
end
tables() click to toggle source
# File lib/sequel_mapper/configurations/conventional_configuration.rb, line 206
def tables
  (datastore.tables - [:schema_migrations])
end