Class: Woods::Extractors::ControllerExtractor

Inherits:
Object
  • Object
show all
Includes:
AstSourceExtraction, RouteHelperResolver, SharedDependencyScanner, SharedUtilityMethods
Defined in:
lib/woods/extractors/controller_extractor.rb

Overview

ControllerExtractor handles ActionController extraction with:

  • Route mapping (which HTTP endpoints hit which actions)

  • Before/after action filter chain resolution

  • Per-action chunking for precise retrieval

  • Concern inlining

Controllers are chunked more aggressively than models because queries are often action-specific (“how does the create action work”).

Examples:

extractor = ControllerExtractor.new
units = extractor.extract_all
registrations = units.find { |u| u.identifier == "Users::RegistrationsController" }

Constant Summary

Constants included from RouteHelperResolver

RouteHelperResolver::IGNORED_HELPER_PREFIXES

Constants included from SharedDependencyScanner

SharedDependencyScanner::FORM_ACTION_HELPER, SharedDependencyScanner::ROUTE_HELPER_PATTERN

Instance Method Summary collapse

Methods included from RouteHelperResolver

#build_route_helper_map, #resolve_route_helper, #safe_rails_application_routes

Methods included from SharedDependencyScanner

#extract_constantize_targets, #scan_common_dependencies, #scan_form_dependencies, #scan_job_dependencies, #scan_mailer_dependencies, #scan_model_dependencies, #scan_navigation_dependencies, #scan_service_dependencies

Methods included from SharedUtilityMethods

#app_source?, #condition_label, #count_loc, #detect_entry_points, #extract_action_filter_actions, #extract_callback_conditions, #extract_class_methods, #extract_class_name, #extract_custom_errors, #extract_initialize_params, #extract_namespace, #extract_parent_class, #extract_public_methods, #resolve_source_location, #skip_file?

Constructor Details

#initializeControllerExtractor

Returns a new instance of ControllerExtractor.



31
32
33
34
# File 'lib/woods/extractors/controller_extractor.rb', line 31

def initialize
  @routes_map = build_routes_map
  build_route_helper_map
end

Instance Method Details

#extract_allArray<ExtractedUnit>

Extract all controllers in the application

Returns:



39
40
41
42
43
44
45
46
47
# File 'lib/woods/extractors/controller_extractor.rb', line 39

def extract_all
  controllers = ApplicationController.descendants

  controllers = (controllers + ActionController::API.descendants).uniq if defined?(ActionController::API)

  controllers.map do |controller|
    extract_controller(controller)
  end.compact
end

#extract_controller(controller) ⇒ ExtractedUnit

Extract a single controller

Parameters:

  • controller (Class)

    The controller class

Returns:



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

def extract_controller(controller)
  unit = ExtractedUnit.new(
    type: :controller,
    identifier: controller.name,
    file_path: source_file_for(controller)
  )

  source_path = unit.file_path
  source = source_path && File.exist?(source_path) ? File.read(source_path) : ''

  unit.namespace = extract_namespace(controller)
  unit.source_code = build_composite_source(controller, source)
  unit. = (controller, source)
  unit.dependencies = extract_dependencies(controller, source)

  # Controllers benefit from per-action chunks
  unit.chunks = build_action_chunks(controller, unit)

  unit
rescue StandardError => e
  Rails.logger.error("[Woods] Failed to extract controller #{controller.name}: #{e.class}: #{e.message}")
  Rails.logger.error("[Woods]   #{e.backtrace&.first(5)&.join("\n  ")}")
  nil
end