class FactoryTrace::Processors::FindUnused

Public Class Methods

call(defined, used) click to toggle source

Finds unused factories and traits

@param [FactoryTrace::Structures::Collection] defined @param [FactoryTrace::Structures::Collection] used

@return [Array<Hash>]

# File lib/factory_trace/processors/find_unused.rb, line 10
def self.call(defined, used)
  mark_as_used(defined, used)

  output = []

  defined.factories.each do |factory|
    output << append_definition_path({code: :unused, factory_names: factory.names}, factory) unless factory.status

    factory.traits.each do |trait|
      output << append_definition_path({code: :unused, factory_names: factory.names, trait_name: trait.name}, trait) unless trait.status
    end
  end

  defined.traits.each do |trait|
    output << append_definition_path({code: :unused, trait_name: trait.name}, trait) unless trait.status
  end

  output.unshift(code: :unused, value: output.size)
  output.unshift(code: :used, value: defined.total - (output.size - 1))

  output
end

Private Class Methods

append_definition_path(hash, object) click to toggle source

@param [Hash] @param [FactoryTrace::Structures::Factory|FactoryTrace::Structures::Trait]

@return [Hash]

# File lib/factory_trace/processors/find_unused.rb, line 112
def self.append_definition_path(hash, object)
  hash[:definition_path] = object.definition_path if object.definition_path
  hash
end
defined_trait_by_name(defined, factory, trait_name) click to toggle source

@param [FactoryTrace::Structures::Collection] defined @param [FactoryTrace::Structures::Factory|nil] factory @param [String] trait_name

@return [Array<Object>]

# File lib/factory_trace/processors/find_unused.rb, line 54
def self.defined_trait_by_name(defined, factory, trait_name)
  if factory
    possible_owner = defined.find_factory_by_names(factory.names)

    while possible_owner
      if (trait = possible_owner.traits.find { |t| t.name == trait_name })
        return [possible_owner, trait]
      end
      possible_owner = defined.find_factory_by_names([possible_owner.parent_name])
    end
  end


  [nil, defined.find_trait_by_name(trait_name)]
end
mark_as_used(defined, used) click to toggle source

@param [FactoryTrace::Structures::Collection] defined @param [FactoryTrace::Structures::Collection] used

# File lib/factory_trace/processors/find_unused.rb, line 37
def self.mark_as_used(defined, used)
  used.factories.each do |used_factory|
    defined_factory = defined.find_factory_by_names(used_factory.names)
    mark_factory(defined_factory, defined, status: :used)

    used_factory.traits.each do |used_trait|
      trait_owner, defined_trait = defined_trait_by_name(defined, used_factory, used_trait.name)
      mark_trait(defined_trait, trait_owner, defined, status: :used)
    end
  end
end
mark_declarations(declaration_names, factory, collection, status:) click to toggle source

@param [Array<String>] declaration_names @param [FactoryTrace::Structures::Factory|nil] factory @param [FactoryTrace::Structures::Collection] collection @param [Symbol] status

# File lib/factory_trace/processors/find_unused.rb, line 98
def self.mark_declarations(declaration_names, factory, collection, status:)
  declaration_names.each do |declaration_name|
    declaration_factory = collection.find_factory_by_names([declaration_name])
    next mark_factory(declaration_factory, collection, status: status) if declaration_factory

    declaration_factory, declaration_trait = defined_trait_by_name(collection, factory, declaration_name)
    mark_trait(declaration_trait, declaration_factory, collection, status: status) if declaration_trait
  end
end
mark_factory(factory, collection, status:) click to toggle source

@param [FactoryTrace::Structures::Factory] factory @param [FactoryTrace::Structures::Collection] collection @param [Symbol] status

# File lib/factory_trace/processors/find_unused.rb, line 73
def self.mark_factory(factory, collection, status:)
  return if factory.has_prioritized_status?(status)

  factory.status = status
  if (parent = collection.find_factory_by_names([factory.parent_name]))
    mark_factory(parent, collection, status: :indirectly_used)
  end
  mark_declarations(factory.declaration_names, factory, collection, status: :indirectly_used)
end
mark_trait(trait, factory, collection, status:) click to toggle source

@param [FactoryTrace::Structures::Trait] trait @param [FactoryTrace::Structures::Factory|nil] factory which trait belongs to @param [FactoryTrace::Structures::Collection] collection @param [Symbol] status

# File lib/factory_trace/processors/find_unused.rb, line 87
def self.mark_trait(trait, factory, collection, status:)
  return if trait.has_prioritized_status?(status)

  trait.status = status
  mark_declarations(trait.declaration_names, factory, collection, status: :indirectly_used)
end