Class: Woods::Extractors::MailerExtractor

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

Overview

MailerExtractor handles ActionMailer extraction.

Mailers are important for understanding:

  • What triggers emails (traced via dependencies)

  • What data flows into emails

  • Template associations

Examples:

extractor = MailerExtractor.new
units = extractor.extract_all
user_mailer = units.find { |u| u.identifier == "UserMailer" }

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

#initializeMailerExtractor

Returns a new instance of MailerExtractor.



29
30
31
32
# File 'lib/woods/extractors/mailer_extractor.rb', line 29

def initialize
  @mailer_base = defined?(ApplicationMailer) ? ApplicationMailer : ActionMailer::Base
  build_route_helper_map
end

Instance Method Details

#extract_allArray<ExtractedUnit>

Extract all mailers in the application

Returns:



37
38
39
40
41
# File 'lib/woods/extractors/mailer_extractor.rb', line 37

def extract_all
  @mailer_base.descendants.map do |mailer|
    extract_mailer(mailer)
  end.compact
end

#extract_mailer(mailer) ⇒ ExtractedUnit

Extract a single mailer

Parameters:

  • mailer (Class)

    The mailer class

Returns:



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/woods/extractors/mailer_extractor.rb', line 47

def extract_mailer(mailer)
  return nil if mailer.name.nil?
  return nil if mailer == ActionMailer::Base

  file_path = source_file_for(mailer)

  unit = ExtractedUnit.new(
    type: :mailer,
    identifier: mailer.name,
    file_path: file_path
  )

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

  unit.namespace = extract_namespace(mailer)
  unit.source_code = annotate_source(source, mailer)
  unit. = (mailer, source)
  unit.dependencies = extract_dependencies(source)

  # Create chunks for each mail action
  unit.chunks = build_action_chunks(mailer, source)

  unit
rescue StandardError => e
  Rails.logger.error("Failed to extract mailer #{mailer.name}: #{e.message}")
  nil
end