Class: BetterSeeder::Builders::Structure

Inherits:
Object
  • Object
show all
Defined in:
lib/better_seeder/builders/structure.rb

Constant Summary collapse

TEMPLATE =
"module %<module_name>s\n  class %<class_name>sStructure < ::BetterSeeder::Structure::Utils\n    # Defines generators for each attribute.\n    def self.structure\n      {\n        # Replace with your attribute generators:\n        attribute_name: [:string, -> { \"your value\" }]\n      }\n    end\n\n    # Optional: Validate generated records using Dry-schema.\n    def self.seed_schema\n      Dry::Schema.Params do\n        # Replace with your validations:\n        required(:attribute_name).filled(:string)\n      end\n    end\n\n    # Specific seeding configuration for %<class_name>s.\n    def self.seed_config\n      {\n        file_name: '%<file_name>s',\n        columns: { excluded: [] },\n        generate_data: true,\n        count: 10,\n        load_data: true,\n        # parents: [ { model: 'MyNamespace::MyModel', column: :my_column } ]\n      }\n    end\n\n    # Optional: Uniqueness constraints.\n    def self.unique_keys\n      []\n    end\n  end\nend\n"

Class Method Summary collapse

Class Method Details

.generate(model_name) ⇒ String

Generates a structure file for the given model name.

Parameters:

  • model_name (String)

    The full model name (e.g., “MyNamespace::MyModel”)

Returns:

  • (String)

    The full path to the generated file.



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/better_seeder/builders/structure.rb', line 52

def self.generate(model_name)
  # Split the model name into module parts and the actual class name.
  parts       = model_name.split('::')
  class_name  = parts.pop
  module_name = parts.empty? ? 'Main' : parts.join('::')

  # Determine the file path.
  # For example, for "MyNamespace::MyModel", the file will be placed in:
  # lib/better_seeder/generators/my_namespace/my_model_structure.rb
  folder_path = File.join(BetterSeeder.configuration.structure_path, *parts.map(&:underscore))
  file_name   = "#{class_name.underscore}_structure.rb"
  full_path   = File.join(folder_path, file_name)

  # Ensure the target directory exists.
  FileUtils.mkdir_p(folder_path)

  # Prepare the file content.
  content = format(TEMPLATE, module_name: module_name, class_name: class_name,
                             file_name: "#{class_name.underscore}_seed")

  # Write the template to the file.
  File.write(full_path, content)
  full_path
end