Module: AnonymousActiveRecord

Defined in:
lib/anonymous_active_record.rb,
lib/anonymous_active_record/factory.rb,
lib/anonymous_active_record/version.rb,
lib/anonymous_active_record/generator.rb

Overview

Usage:

klass = AnonymousActiveRecord.generate(columns: ['name']) do
          def flowery_name
            "🌸#{name}🌸"
          end
        end
instance = klass.new(name: 'Darla Charla')
instance.save!
instance.flowery_name # => "🌸Darla Charla🌸"

Defined Under Namespace

Classes: Factory, Generator

Constant Summary collapse

DEFAULT_CONNECTION_PARAMS =
{
  adapter: 'sqlite3',
  encoding: 'utf8',
  database: ':memory:'
}.freeze
VERSION =
'1.0.5'

Class Method Summary collapse

Class Method Details

._factory(source_data: [], table_name: nil, klass_namespaces: [], klass_basename: nil, columns: [], indexes: [], timestamps: true, parent_klass: "ActiveRecord::Base", connection_params: DEFAULT_CONNECTION_PARAMS, &block) ⇒ Object



98
99
100
101
# File 'lib/anonymous_active_record.rb', line 98

def _factory(source_data: [], table_name: nil, klass_namespaces: [], klass_basename: nil, columns: [], indexes: [], timestamps: true, parent_klass: "ActiveRecord::Base", connection_params: DEFAULT_CONNECTION_PARAMS, &block)
  klass = generate(table_name: table_name, klass_namespaces: klass_namespaces, klass_basename: klass_basename, columns: columns, timestamps: timestamps, parent_klass: parent_klass, indexes: indexes, connection_params: connection_params, &block)
  AnonymousActiveRecord::Factory.new(source_data, klass)
end

.factory(source_data: [], table_name: nil, klass_namespaces: [], klass_basename: nil, columns: [], indexes: [], timestamps: true, parent_klass: "ActiveRecord::Base", connection_params: DEFAULT_CONNECTION_PARAMS, &block) ⇒ Object

Initializes instances of a pseudo anonymous class in a particular namespace of your choosing.



85
86
87
88
# File 'lib/anonymous_active_record.rb', line 85

def factory(source_data: [], table_name: nil, klass_namespaces: [], klass_basename: nil, columns: [], indexes: [], timestamps: true, parent_klass: "ActiveRecord::Base", connection_params: DEFAULT_CONNECTION_PARAMS, &block)
  factory = _factory(source_data: source_data, table_name: table_name, klass_namespaces: klass_namespaces, klass_basename: klass_basename, columns: columns, indexes: indexes, timestamps: timestamps, parent_klass: parent_klass, connection_params: connection_params, &block)
  factory.run
end

.factory!(source_data: [], table_name: nil, klass_namespaces: [], klass_basename: nil, columns: [], indexes: [], timestamps: true, parent_klass: "ActiveRecord::Base", connection_params: DEFAULT_CONNECTION_PARAMS, &block) ⇒ Object

Initializes instances of a pseudo anonymous class in a particular namespace of your choosing.



91
92
93
94
# File 'lib/anonymous_active_record.rb', line 91

def factory!(source_data: [], table_name: nil, klass_namespaces: [], klass_basename: nil, columns: [], indexes: [], timestamps: true, parent_klass: "ActiveRecord::Base", connection_params: DEFAULT_CONNECTION_PARAMS, &block)
  factory = _factory(source_data: source_data, table_name: table_name, klass_namespaces: klass_namespaces, klass_basename: klass_basename, columns: columns, indexes: indexes, timestamps: timestamps, parent_klass: parent_klass, connection_params: connection_params, &block)
  factory.run!
end

.generate(table_name: nil, klass_namespaces: [], klass_basename: nil, columns: [], indexes: [], timestamps: true, parent_klass: "ActiveRecord::Base", connection_params: DEFAULT_CONNECTION_PARAMS, &block) ⇒ Object

Defines a pseudo anonymous class in a particular namespace of your choosing.



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/anonymous_active_record.rb', line 47

def generate(table_name: nil, klass_namespaces: [], klass_basename: nil, columns: [], indexes: [], timestamps: true, parent_klass: "ActiveRecord::Base", connection_params: DEFAULT_CONNECTION_PARAMS, &block)
  gen = AnonymousActiveRecord::Generator.new(table_name, klass_namespaces, klass_basename, parent_klass)
  klass = gen.generate(&block)
  connection_params = YAML.load_file(connection_params) if connection_params.is_a?(String)
  klass.establish_connection(connection_params.dup)
  klass.connection.create_table gen.table_name do |t|
    columns.each do |col|
      if col.is_a?(Hash)
        # :name and :type are required at minimum
        name = col.delete(:name)
        type = col.delete(:type)
        t.column(name, type, col)
      elsif col.is_a?(Array)
        t.column col[0], col[-1] || :string
      else
        t.column col, :string
      end
    end
    indexes.each do |idx_options|
      if idx_options.is_a?(Hash)
        column_names = idx_options.delete(:columns)
        t.index column_names, idx_options
      elsif idx_options.is_a?(Array)
        if idx_options.length == 1
          t.index idx_options[0]
        else
          t.index idx_options[0], **idx_options[-1]
        end
      else
        t.index idx_options
      end
    end
    t.timestamps if timestamps
  end
  klass
end