Skip to content

Commit bb848b3

Browse files
committed
Group related classes into Row and Default namespaces
- Row::Definition (was RowDefinition) and Row::Builder (was RowBuilder) now live inside Row class in row.rb - Default::Context (was DefaultContext) now lives inside Default class in default.rb - Remove row_definition.rb, row_builder.rb, default_context.rb
1 parent f02f0f7 commit bb848b3

8 files changed

Lines changed: 148 additions & 160 deletions

File tree

lib/fixturebot.rb

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,9 @@
33
require_relative "fixturebot/version"
44
require_relative "fixturebot/schema"
55
require_relative "fixturebot/key"
6-
require_relative "fixturebot/row"
7-
require_relative "fixturebot/default_context"
86
require_relative "fixturebot/default"
9-
require_relative "fixturebot/row_definition"
7+
require_relative "fixturebot/row"
108
require_relative "fixturebot/definition"
11-
require_relative "fixturebot/row_builder"
129
require_relative "fixturebot/fixture_set"
1310
require_relative "fixturebot/yaml_dumper"
1411
require_relative "fixturebot/cli"

lib/fixturebot/default.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,27 @@ def define_column_methods(table)
1717
end
1818
end
1919
end
20+
21+
class Context
22+
def initialize(record_name:, literal_values: {})
23+
define_name_method(record_name, literal_values)
24+
define_literal_value_methods(literal_values)
25+
end
26+
27+
private
28+
29+
def define_name_method(record_name, literal_values)
30+
define_singleton_method(:name) do
31+
literal_values.key?(:name) ? literal_values[:name] : record_name
32+
end
33+
end
34+
35+
def define_literal_value_methods(literal_values)
36+
literal_values.each do |col, val|
37+
next if col == :name
38+
define_singleton_method(col) { val }
39+
end
40+
end
41+
end
2042
end
2143
end

lib/fixturebot/default_context.rb

Lines changed: 0 additions & 25 deletions
This file was deleted.

lib/fixturebot/definition.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def define_table_method(table)
3030
end
3131

3232
def add_row(table, record_name, block)
33-
row_dsl = RowDefinition.new(table, @schema)
33+
row_dsl = Row::Definition.new(table, @schema)
3434
row_dsl.instance_eval(&block) if block
3535
@rows << Row.new(
3636
table: table.name,

lib/fixturebot/fixture_set.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def initialize(schema, definition)
1111
schema.join_tables.each_key { |name| @tables[name] = {} }
1212

1313
definition.rows.each do |row|
14-
builder = RowBuilder.new(
14+
builder = Row::Builder.new(
1515
row: row,
1616
table: schema.tables[row.table],
1717
defaults: definition.defaults[row.table],

lib/fixturebot/row.rb

Lines changed: 123 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,127 @@
11
# frozen_string_literal: true
22

33
module FixtureBot
4-
Row = Data.define(:table, :name, :literal_values, :association_refs, :tag_refs)
4+
class Row < Data.define(:table, :name, :literal_values, :association_refs, :tag_refs)
5+
class Definition
6+
attr_reader :literal_values, :association_refs, :tag_refs
7+
8+
def initialize(table, schema)
9+
@literal_values = {}
10+
@association_refs = {}
11+
@tag_refs = {}
12+
13+
define_column_methods(table)
14+
define_association_methods(table)
15+
define_join_table_methods(table, schema)
16+
end
17+
18+
private
19+
20+
def define_column_methods(table)
21+
table.columns.each do |col|
22+
define_singleton_method(col) do |value|
23+
@literal_values[col] = value
24+
end
25+
end
26+
end
27+
28+
def define_association_methods(table)
29+
table.belongs_to_associations.each do |assoc|
30+
define_singleton_method(assoc.name) do |ref|
31+
@association_refs[assoc.name] = ref
32+
end
33+
end
34+
end
35+
36+
def define_join_table_methods(table, schema)
37+
schema.join_tables.each_value do |jt|
38+
if jt.left_table == table.name
39+
define_singleton_method(jt.right_table) do |*refs|
40+
@tag_refs[jt.name] = { table: jt.right_table, refs: refs }
41+
end
42+
elsif jt.right_table == table.name
43+
define_singleton_method(jt.left_table) do |*refs|
44+
@tag_refs[jt.name] = { table: jt.left_table, refs: refs }
45+
end
46+
end
47+
end
48+
end
49+
end
50+
51+
class Builder
52+
def initialize(row:, table:, defaults:, join_tables:)
53+
@row = row
54+
@table = table
55+
@defaults = defaults
56+
@join_tables = join_tables
57+
end
58+
59+
def id
60+
@id ||= Key.generate(@row.table, @row.name)
61+
end
62+
63+
def record
64+
result = { id: id }
65+
@table.columns.each do |col|
66+
if @row.literal_values.key?(col)
67+
result[col] = @row.literal_values[col]
68+
elsif foreign_key_values.key?(col)
69+
result[col] = foreign_key_values[col]
70+
elsif defaulted_values.key?(col)
71+
result[col] = defaulted_values[col]
72+
end
73+
end
74+
result
75+
end
76+
77+
def join_rows
78+
@row.tag_refs.flat_map do |join_table_name, tag_info|
79+
jt = @join_tables[join_table_name]
80+
tag_info[:refs].map do |tag_ref|
81+
build_join_row(jt, tag_info[:table], tag_ref)
82+
end
83+
end
84+
end
85+
86+
private
87+
88+
def build_join_row(jt, other_table, tag_ref)
89+
other_id = Key.generate(other_table, tag_ref)
90+
91+
if jt.left_table == @row.table
92+
{
93+
key: :"#{@row.name}_#{tag_ref}",
94+
join_table: jt.name,
95+
row: { jt.left_foreign_key => id, jt.right_foreign_key => other_id }
96+
}
97+
else
98+
{
99+
key: :"#{tag_ref}_#{@row.name}",
100+
join_table: jt.name,
101+
row: { jt.left_foreign_key => other_id, jt.right_foreign_key => id }
102+
}
103+
end
104+
end
105+
106+
def foreign_key_values
107+
@foreign_key_values ||= @row.association_refs.each_with_object({}) do |(assoc_name, ref), hash|
108+
assoc = @table.belongs_to_associations.find { |a| a.name == assoc_name }
109+
hash[assoc.foreign_key] = Key.generate(assoc.table, ref)
110+
end
111+
end
112+
113+
def defaulted_values
114+
@defaulted_values ||= @defaults.each_with_object({}) do |(col, block), result|
115+
next if @row.literal_values.key?(col)
116+
next if foreign_key_values.key?(col)
117+
118+
context = Default::Context.new(
119+
record_name: @row.name,
120+
literal_values: @row.literal_values
121+
)
122+
result[col] = context.instance_eval(&block)
123+
end
124+
end
125+
end
126+
end
5127
end

lib/fixturebot/row_builder.rb

Lines changed: 0 additions & 79 deletions
This file was deleted.

lib/fixturebot/row_definition.rb

Lines changed: 0 additions & 49 deletions
This file was deleted.

0 commit comments

Comments
 (0)