Class: RailsAiBridge::Serializers::Providers::Collaborators::ModelLineFormatter

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_ai_bridge/serializers/providers/collaborators/model_line_formatter.rb

Overview

Formats individual model lines with complexity metadata for AI context documents. Extracts and formats associations, validations, enums, columns, and migration status.

This collaborator handles the complex formatting logic for model entries, providing consistent output across different AI assistant providers. It delegates migration recency checking to ContextSummary for DRY compliance.

Examples:

Basic usage

formatter = ModelLineFormatter.new(context)
line = formatter.format_line('User', model_data)
# => "- **User** (2a, 1v) [enums: status] — has_many :posts"

With migrations context

formatter = ModelLineFormatter.new(context_with_migrations)
line = formatter.format_line('Post', post_data)
# => "- **Post** (3a, 2v) [recently migrated]"

Defined Under Namespace

Classes: AssociationValidationCounts, FormattedColumn, FormattedColumns, FormattingContext, ModelColumns

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(context) ⇒ ModelLineFormatter

Returns a new instance of ModelLineFormatter.

Parameters:

  • context (Hash)

    Introspection context hash containing schema and migrations

Raises:

  • (ArgumentError)

    if context is not a Hash



26
27
28
29
30
# File 'lib/rails_ai_bridge/serializers/providers/collaborators/model_line_formatter.rb', line 26

def initialize(context)
  raise ArgumentError, "Context must be a Hash, got #{context.class}" unless context.is_a?(Hash)

  @context = context
end

Class Method Details

.association_count_section(data) ⇒ String

Builds association and validation count section (class method)

Parameters:

  • data (Hash)

    Model data

Returns:

  • (String)

    Count section or empty string



190
191
192
# File 'lib/rails_ai_bridge/serializers/providers/collaborators/model_line_formatter.rb', line 190

def association_count_section(data)
  AssociationValidationCounts.new(data).to_section
end

.columns_section(data, schema_tables) ⇒ String

Builds columns section with top columns and types (class method)

Parameters:

  • data (Hash)

    Model data

  • schema_tables (Hash)

    Schema tables data

Returns:

  • (String)

    Columns section or empty string



209
210
211
# File 'lib/rails_ai_bridge/serializers/providers/collaborators/model_line_formatter.rb', line 209

def columns_section(data, schema_tables)
  ModelColumns.new(data, schema_tables).to_section
end

.extract_enum_names(enum_data) ⇒ Array<String>

Extracts enum names from enum data (class method)

Parameters:

  • enum_data (Hash)

    Enum definitions

Returns:

  • (Array<String>)

    List of enum names



197
198
199
200
201
202
203
# File 'lib/rails_ai_bridge/serializers/providers/collaborators/model_line_formatter.rb', line 197

def extract_enum_names(enum_data)
  return [] unless enum_data.is_a?(Hash)

  enum_data.filter_map do |name, values|
    name if name && values.present?
  end
end

.format_association(association) ⇒ String

Formats a single association using Ruby 3.2 pattern matching (class method)

Parameters:

  • association (Hash)

    Association definition

Returns:

  • (String)

    Formatted association string



227
228
229
230
231
232
233
234
235
# File 'lib/rails_ai_bridge/serializers/providers/collaborators/model_line_formatter.rb', line 227

def format_association(association)
  return '' unless association.is_a?(Hash)

  type = association[:type]
  name = association[:name]
  return '' if type.to_s.empty? || name.to_s.empty?

  "#{type} :#{name}"
end

.migration_section(data, migrations) ⇒ String

Builds migration section with recently migrated flag (class method)

Parameters:

  • data (Hash)

    Model data

  • migrations (Hash)

    Migrations data

Returns:

  • (String)

    Migration section or empty string



217
218
219
220
221
222
# File 'lib/rails_ai_bridge/serializers/providers/collaborators/model_line_formatter.rb', line 217

def migration_section(data, migrations)
  table_name = data[:table_name]
  return '' unless table_name && ContextSummary.recently_migrated?(table_name, migrations)

  ' [recently migrated]'
end

Instance Method Details

#format_line(name, data) ⇒ String

Formats a single model line with complexity metadata for AI context documents.

This is the main public interface that validates input and orchestrates the complete formatting process. It extracts schema and migration data from the context and delegates to the core formatting method.

The formatted line includes:

  • Model name in bold
  • Association and validation counts (if present)
  • Enum names (if present)
  • Top 3 columns with types (if present)
  • Recently migrated flag (if applicable)
  • Top 3 associations (if present)

Examples:

Basic usage

formatter = ModelLineFormatter.new(context)
line = formatter.format_line('User', user_data)
# => "- **User** (2a, 1v) [enums: status] — has_many :posts"

With validation errors

formatter.format_line(nil, {}) # => raises ArgumentError
formatter.format_line('User', 'invalid') # => raises ArgumentError

Parameters:

  • name (String)

    Model name (e.g., "User", "BlogPost") Must not be nil. Used as the primary identifier in the formatted output.

  • data (Hash)

    Model introspection data containing:

    • :associations [Array] List of association definitions
    • :validations [Array] List of validation definitions
    • :enums [Hash] Enum definitions with keys as enum names
    • :table_name [String] Database table name for the model Must be a Hash, otherwise raises ArgumentError.

Returns:

  • (String)

    Formatted model line ready for markdown output Includes model name, counts, enums, columns, migration status, and associations.

Raises:

  • (ArgumentError)

    if name is nil

  • (ArgumentError)

    if data is not a Hash

See Also:



73
74
75
76
77
78
# File 'lib/rails_ai_bridge/serializers/providers/collaborators/model_line_formatter.rb', line 73

def format_line(name, data)
  raise ArgumentError, 'Model name cannot be nil' unless name
  raise ArgumentError, "Model data must be a Hash, got #{data.class}" unless data.is_a?(Hash)

  format_model_line(name, FormattingContext.from(data, @context))
end