class Rake::Funnel::Support::SpecsRemover::ProjectFiles

Public Class Methods

remove_specs_and_references(projects, references, specs) click to toggle source
# File lib/rake/funnel/support/specs_remover.rb, line 12
def remove_specs_and_references(projects, references, specs)
  deleted = remove(projects, references, specs)

  projects = deleted.map { |e| e[:project] }.flatten.uniq
  packages = deleted.map { |e| e[:packages] }.flatten.uniq
  specs = deleted.map { |e| e[:specs] }.flatten.uniq

  [projects, packages, specs]
end

Private Class Methods

normalize(path) click to toggle source
# File lib/rake/funnel/support/specs_remover.rb, line 99
def normalize(path)
  path.gsub('\\', File::SEPARATOR)
end
package_for(reference) click to toggle source
# File lib/rake/funnel/support/specs_remover.rb, line 87
def package_for(reference)
  path = normalize(reference)

  Pathname.new(path).ascend do |p|
    break p.parent.basename.to_s if p.basename.to_s == 'lib'
  end
end
remove(projects, references, specs) click to toggle source
# File lib/rake/funnel/support/specs_remover.rb, line 24
def remove(projects, references, specs) # rubocop:disable Metrics/MethodLength
  Dir[*projects].map do |project|
    Trace.message("Processing #{project} with references #{references} and specs #{specs}")

    removed_references, removed_specs = with_document(project) do |xml|
      [remove_references(references, xml), remove_specs(specs, xml)]
    end

    {
      project: project,
      packages: resolve_package_names(removed_references),
      specs: resolve_paths(project, removed_specs)
    }
  end
end
remove_references(references, xml) click to toggle source
# File lib/rake/funnel/support/specs_remover.rb, line 50
def remove_references(references, xml)
  deleted = references.flat_map do |ref|
    query = "/Project//Reference[starts-with(lower-case(@Include), '#{ref.downcase}')]"
    xml.elements.delete_all(query)
  end

  deleted.each { |d| Trace.message("Removed references: #{d.inspect}") }

  deleted = deleted.flat_map do |d|
    d.get_elements('/HintPath').map(&:text)
  end

  deleted.each { |d| Trace.message("HintPaths: #{d}") }
end
remove_specs(specs, xml) click to toggle source
# File lib/rake/funnel/support/specs_remover.rb, line 65
def remove_specs(specs, xml)
  deleted = specs.map do |glob|
    query = "/Project//Compile[matches(lower-case(@Include), '#{glob}')]"
    xml.elements.delete_all(query)
  end

  deleted
    .flatten
    .map { |d| d.attributes['Include'] }
    .tap { |d| Trace.message("Removed specs: #{d}") }
end
resolve_package_names(references) click to toggle source
# File lib/rake/funnel/support/specs_remover.rb, line 83
def resolve_package_names(references)
  references.map { |r| package_for(r) }.compact
end
resolve_paths(project, files) click to toggle source
# File lib/rake/funnel/support/specs_remover.rb, line 95
def resolve_paths(project, files)
  files.map { |f| File.expand_path(File.join(File.dirname(project), normalize(f))) }
end
save(project, xml) click to toggle source
# File lib/rake/funnel/support/specs_remover.rb, line 77
def save(project, xml)
  File.open(project, 'w+') do |file|
    xml.write(output: file, ie_hack: true)
  end
end
with_document(project) { |xml| ... } click to toggle source
# File lib/rake/funnel/support/specs_remover.rb, line 40
def with_document(project)
  xml = REXML::Document.new(File.read(project), attribute_quote: :quote)

  removed = yield(xml) if block_given?

  save(project, xml) if [removed].flatten.compact.any?

  removed
end