Class: A2A::Rails::Generators::MigrationGenerator

Inherits:
ActiveRecord::Generators::Base
  • Object
show all
Defined in:
lib/a2a/rails/generators/migration_generator.rb

Instance Method Summary collapse

Instance Method Details

#create_indexes_migrationObject



57
58
59
60
61
62
63
64
65
# File 'lib/a2a/rails/generators/migration_generator.rb', line 57

def create_indexes_migration
  return unless options[:with_indexes]

  migration_template "add_a2a_indexes.rb",
                     "db/migrate/add_#{table_prefix}indexes.rb",
                     migration_version: migration_version

  say "Created indexes migration", :green
end

#create_modelsObject



67
68
69
70
71
72
73
# File 'lib/a2a/rails/generators/migration_generator.rb', line 67

def create_models
  template "task_model.rb", "app/models/#{table_prefix}task.rb"
  template "push_notification_config_model.rb",
           "app/models/#{table_prefix}push_notification_config.rb"

  say "Created A2A models", :green
end

#create_push_notifications_migrationObject



47
48
49
50
51
52
53
54
55
# File 'lib/a2a/rails/generators/migration_generator.rb', line 47

def create_push_notifications_migration
  return if options[:skip_push_notifications]

  migration_template "create_a2a_push_notification_configs.rb",
                     "db/migrate/create_#{table_prefix}push_notification_configs.rb",
                     migration_version: migration_version

  say "Created push notification configs migration", :green
end

#create_tasks_migrationObject



37
38
39
40
41
42
43
44
45
# File 'lib/a2a/rails/generators/migration_generator.rb', line 37

def create_tasks_migration
  return if options[:skip_tasks]

  migration_template "create_a2a_tasks.rb",
                     "db/migrate/create_#{table_prefix}tasks.rb",
                     migration_version: migration_version

  say "Created tasks migration", :green
end

#format_column_options(options) ⇒ Object (private)



213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# File 'lib/a2a/rails/generators/migration_generator.rb', line 213

def format_column_options(options)
  return "" if options.empty?

  formatted_options = options.map do |key, value|
    case value
    when String
      "#{key}: '#{value}'"
    when Symbol
      "#{key}: :#{value}"
    else
      "#{key}: #{value}"
    end
  end

  ", #{formatted_options.join(', ')}"
end

#id_column_definitionObject (private)

Generate appropriate column definitions based on database adapter



193
194
195
196
197
198
199
# File 'lib/a2a/rails/generators/migration_generator.rb', line 193

def id_column_definition
  if postgresql?
    "t.uuid :id, primary_key: true, default: 'gen_random_uuid()'"
  else
    "t.string :id, primary_key: true, limit: 36"
  end
end

#json_column_definition(name, **options) ⇒ Object (private)



209
210
211
# File 'lib/a2a/rails/generators/migration_generator.rb', line 209

def json_column_definition(name, **options)
  "t.#{json_column_type} :#{name}#{format_column_options(options)}"
end

#json_column_typeObject (private)

Helper methods for templates



138
139
140
141
142
143
144
145
# File 'lib/a2a/rails/generators/migration_generator.rb', line 138

def json_column_type
  # Use jsonb for PostgreSQL, json for others
  if postgresql?
    "jsonb"
  else
    "json"
  end
end

#migration_versionObject (private)



105
106
107
108
109
110
111
# File 'lib/a2a/rails/generators/migration_generator.rb', line 105

def migration_version
  if ::Rails.version >= "5.0"
    "[#{::Rails::VERSION::MAJOR}.#{::Rails::VERSION::MINOR}]"
  else
    ""
  end
end

#model_class_name(base_name) ⇒ Object (private)



129
130
131
# File 'lib/a2a/rails/generators/migration_generator.rb', line 129

def model_class_name(base_name)
  "#{table_prefix.classify}#{base_name.classify}"
end

#model_file_name(base_name) ⇒ Object (private)



133
134
135
# File 'lib/a2a/rails/generators/migration_generator.rb', line 133

def model_file_name(base_name)
  "#{table_prefix}#{base_name.underscore}"
end

#mysql?Boolean (private)

Returns:

  • (Boolean)


171
172
173
174
175
176
177
178
179
180
# File 'lib/a2a/rails/generators/migration_generator.rb', line 171

def mysql?
  return false unless defined?(ActiveRecord::Base)

  begin
    adapter_name = ActiveRecord::Base.connection.adapter_name.downcase
    adapter_name.include?("mysql") || adapter_name.include?("trilogy")
  rescue StandardError
    false
  end
end

#postgresql?Boolean (private)

Returns:

  • (Boolean)


160
161
162
163
164
165
166
167
168
169
# File 'lib/a2a/rails/generators/migration_generator.rb', line 160

def postgresql?
  # Try to detect PostgreSQL adapter
  return false unless defined?(ActiveRecord::Base)

  begin
    ActiveRecord::Base.connection.adapter_name.downcase.include?("postgresql")
  rescue StandardError
    false
  end
end

#push_notification_configs_table_nameObject (private)



121
122
123
# File 'lib/a2a/rails/generators/migration_generator.rb', line 121

def push_notification_configs_table_name
  "#{table_prefix}push_notification_configs"
end

#show_post_generation_instructionsObject



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/a2a/rails/generators/migration_generator.rb', line 75

def show_post_generation_instructions
  say "\n#{'=' * 60}", :green
  say "A2A database migrations generated successfully!", :green
  say "=" * 60, :green

  say "\nNext steps:", :yellow
  say "1. Review the generated migrations in db/migrate/"
  say "2. Run 'rails db:migrate' to create the tables"
  say "3. Customize the models in app/models/ if needed"

  say "\nGenerated tables:", :yellow
  say "  #{table_prefix}tasks - Stores A2A task data"
  say "  #{table_prefix}push_notification_configs - Stores push notification settings"

  if options[:with_indexes]
    say "\nPerformance indexes will be created for:"
    say "  - Task lookups by ID and context_id"
    say "  - Task status filtering"
    say "  - Push notification config lookups"
  end

  say "\nConfiguration:", :yellow
  say "Update config/initializers/a2a.rb to use database storage:"
  say "  config.task_storage = :database"

  say "\nFor more information, visit: https://a2a-protocol.org/sdk/ruby/storage/", :blue
end

#sqlite?Boolean (private)

Returns:

  • (Boolean)


182
183
184
185
186
187
188
189
190
# File 'lib/a2a/rails/generators/migration_generator.rb', line 182

def sqlite?
  return false unless defined?(ActiveRecord::Base)

  begin
    ActiveRecord::Base.connection.adapter_name.downcase.include?("sqlite")
  rescue StandardError
    false
  end
end

#table_prefixObject (private)



113
114
115
# File 'lib/a2a/rails/generators/migration_generator.rb', line 113

def table_prefix
  options[:table_prefix]
end

#tasks_table_nameObject (private)



117
118
119
# File 'lib/a2a/rails/generators/migration_generator.rb', line 117

def tasks_table_name
  "#{table_prefix}tasks"
end

#text_column_typeObject (private)



147
148
149
150
# File 'lib/a2a/rails/generators/migration_generator.rb', line 147

def text_column_type
  # Use text for larger content
  "text"
end

#uuid_column_definition(name, **options) ⇒ Object (private)



201
202
203
204
205
206
207
# File 'lib/a2a/rails/generators/migration_generator.rb', line 201

def uuid_column_definition(name, **options)
  if postgresql?
    "t.uuid :#{name}#{format_column_options(options)}"
  else
    "t.string :#{name}, limit: 36#{format_column_options(options)}"
  end
end

#uuid_column_typeObject (private)



152
153
154
155
156
157
158
# File 'lib/a2a/rails/generators/migration_generator.rb', line 152

def uuid_column_type
  if postgresql?
    "uuid"
  else
    "string"
  end
end

#with_indexes?Boolean (private)

Returns:

  • (Boolean)


125
126
127
# File 'lib/a2a/rails/generators/migration_generator.rb', line 125

def with_indexes?
  options[:with_indexes]
end