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

Modules: Version Classes: Factory, Generator

Constant Summary collapse

DEFAULT_CONNECTION_PARAMS =
{
  adapter: "sqlite3",
  encoding: "utf8",
  database: ":memory:",
}.freeze
DEFAULT_PARENT_KLASS =
"ActiveRecord::Base"

Class Method Summary collapse

Class Method Details

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



128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/anonymous_active_record.rb', line 128

def _factory(source_data: [], table_name: nil, klass_namespaces: [], klass_basename: nil, columns: [], indexes: [], timestamps: true, parent_klass: DEFAULT_PARENT_KLASS, 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: DEFAULT_PARENT_KLASS, connection_params: DEFAULT_CONNECTION_PARAMS, &block) ⇒ Object

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



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/anonymous_active_record.rb', line 93

def factory(source_data: [], table_name: nil, klass_namespaces: [], klass_basename: nil, columns: [], indexes: [], timestamps: true, parent_klass: DEFAULT_PARENT_KLASS, 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: DEFAULT_PARENT_KLASS, connection_params: DEFAULT_CONNECTION_PARAMS, &block) ⇒ Object

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



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/anonymous_active_record.rb', line 110

def factory!(source_data: [], table_name: nil, klass_namespaces: [], klass_basename: nil, columns: [], indexes: [], timestamps: true, parent_klass: DEFAULT_PARENT_KLASS, 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: DEFAULT_PARENT_KLASS, connection_params: DEFAULT_CONNECTION_PARAMS, &block) ⇒ Object

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



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
83
84
85
86
87
88
89
90
# File 'lib/anonymous_active_record.rb', line 51

def generate(table_name: nil, klass_namespaces: [], klass_basename: nil, columns: [], indexes: [], timestamps: true, parent_klass: DEFAULT_PARENT_KLASS, 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)
        options = col.extract_options!
        if options.present?
          t.column(*col, **options)
        elsif col.length == 1
          t.column(col[0], :string)
        else
          t.column(col[0], col[-1] || :string)
        end
      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)
        options = idx_options.extract_options!
        t.index(*idx_options, **options)
      else
        t.index(idx_options)
      end
    end
    t.timestamps if timestamps
  end
  klass
end