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
DEFAULT_PARENT_KLASS =
'ActiveRecord::Base'
VERSION =
'1.0.8'

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



131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/anonymous_active_record.rb', line 131

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.



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/anonymous_active_record.rb', line 96

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.



113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/anonymous_active_record.rb', line 113

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.



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

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)
        if col[-1].is_a?(Hash)
          if col[-1].present?
            t.column col[0], **col[-1]
          else
            t.column col[0], :string
          end
        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)
        if idx_options.length == 1
          t.index idx_options[0]
        elsif idx_options[-1].is_a?(Hash)
          t.index idx_options[0], **idx_options[-1]
        else
          t.index idx_options[0], idx_options[-1]
        end
      else
        t.index idx_options
      end
    end
    t.timestamps if timestamps
  end
  klass
end