Class: RouteSchemerGenerator

Inherits:
Rails::Generators::Base
  • Object
show all
Defined in:
lib/generators/route_schemer/route_schemer_generator.rb

Overview

A Rails generator that creates route schema files for controllers. This generator validates the existence of controllers and their methods, then generates both application-wide and controller-specific route schema files.

Examples:

Generate schema for UserController with index and show actions

rails generate route_schemer User index show

Raises:

  • (ArgumentError)

    If the controller doesn’t exist or specified methods are not defined

Instance Method Summary collapse

Instance Method Details

#create_route_schemer_fileObject



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/generators/route_schemer/route_schemer_generator.rb', line 44

def create_route_schemer_file
  # Define the path based on the nested structure of `controller_name`
  schemer_directory = File.join("app", "route_schemers")

  # Create nested directories if they don't exist
  FileUtils.mkdir_p(schemer_directory) unless Dir.exist?(schemer_directory)

  # Generate the application route schemer file
  application_schemer_file = File.join("app", "route_schemers", "application_route_schemer.rb")
  unless File.exist?(application_schemer_file)
    template "application_route_schemer_template.rb.tt",
             application_schemer_file
  end

  # Generate the schemer file always override
  schemer_file = File.join(schemer_directory, "#{controller_name.demodulize.underscore}_route_schemer.rb")
  template "route_schemer_template.rb.tt", schemer_file
end

#validate_controllerObject



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/generators/route_schemer/route_schemer_generator.rb', line 22

def validate_controller
  # Ensure controller_name is properly formatted (e.g., Foo or Foo::Bar)
  controller_path = File.join("app", "controllers", "#{controller_name.underscore}_controller.rb")
  unless File.exist?(controller_path)
    raise ArgumentError, "Controller #{controller_name} does not exist at #{controller_path}"
  end

  # Attempt to constantize the controller name
  begin
    @controller_class = "#{controller_name}Controller".constantize
  rescue NameError
    raise ArgumentError, "Controller class #{controller_name} could not be found. Ensure it is defined correctly."
  end

  # Validate each method in the controller class
  methods.each do |method|
    unless @controller_class.instance_methods.include?(method.to_sym)
      raise ArgumentError, "Method #{method} is not defined in #{controller_name}"
    end
  end
end