module TableStructure::Schema

Constants

Row

Attributes

context[R]
row_builders[R]

Public Class Methods

create_class(&block) click to toggle source
# File lib/table_structure/schema.rb, line 13
def self.create_class(&block)
  raise ::TableStructure::Error, 'No block has been given.' unless block

  ::Class.new do
    include Schema
    class_eval(&block)
  end
end
included(klass) click to toggle source
# File lib/table_structure/schema.rb, line 5
def self.included(klass)
  klass.extend(DSL::ColumnBuilder)
  klass.extend(DSL::ColumnDefinition)
  klass.extend(DSL::ContextBuilder)
  klass.extend(DSL::RowBuilder)
  klass.extend(ClassMethods)
end
new( name: self.class.name, context: nil, name_prefix: nil, name_suffix: nil, key_prefix: nil, key_suffix: nil, nil_definitions_ignored: false, &block ) click to toggle source
# File lib/table_structure/schema.rb, line 27
def initialize(
  name: self.class.name,
  context: nil,
  name_prefix: nil,
  name_suffix: nil,
  key_prefix: nil,
  key_suffix: nil,
  nil_definitions_ignored: false,
  &block
)
  schema_class = CompositeClass.new.compose(self.class)
  schema_class.compose(Schema.create_class(&block)) if block

  context_builders = schema_class.context_builders

  table_context_builder = context_builders.delete(:table)

  @context = table_context_builder ? table_context_builder.call(context) : context

  @row_context_builder_factory = RowContextBuilderFactory.new(self, context_builders)

  @column_builder_factory = ColumnBuilderFactory.new(
    schema_class.column_builders,
    context: @context,
    name_prefix: name_prefix,
    name_suffix: name_suffix
  )

  @keys_builder = KeysBuilder.new(
    prefix: key_prefix,
    suffix: key_suffix
  )

  @row_builders = schema_class.row_builders

  @columns =
    Definition::Columns::Compiler
    .new(
      name,
      schema_class.column_definitions,
      nil_definitions_ignored: nil_definitions_ignored
    )
    .compile(@context)
end

Public Instance Methods

columns_keys() click to toggle source
# File lib/table_structure/schema.rb, line 72
def columns_keys
  @columns_keys ||= @keys_builder.build(@columns.map(&:keys).flatten)
end
columns_size() click to toggle source
# File lib/table_structure/schema.rb, line 76
def columns_size
  @columns.map(&:size).reduce(0, &:+)
end
contain_name_callable?() click to toggle source
# File lib/table_structure/schema.rb, line 80
def contain_name_callable?
  @columns.any? { |column| column.name_callable? }
end
contain_value_callable?() click to toggle source
# File lib/table_structure/schema.rb, line 84
def contain_value_callable?
  @columns.any? { |column| column.value_callable? }
end
create_data_row_generator() click to toggle source
# File lib/table_structure/schema.rb, line 103
def create_data_row_generator
  ::TableStructure::Utils::CompositeCallable.new.compose(
    @row_context_builder_factory.create_data_builder,
    proc do |context|
      values =
        @columns
        .map { |column| column.values(context, @context) }
        .flatten

      Row.new(columns_keys, values, context)
    end,
    @column_builder_factory.create_data_builder
  )
end
create_header_row_generator() click to toggle source
# File lib/table_structure/schema.rb, line 88
def create_header_row_generator
  ::TableStructure::Utils::CompositeCallable.new.compose(
    @row_context_builder_factory.create_header_builder,
    proc do |context|
      values =
        @columns
        .map { |column| column.names(context, @context) }
        .flatten

      Row.new(columns_keys, values, context)
    end,
    @column_builder_factory.create_header_builder
  )
end