class OctocatalogDiff::CatalogDiff::Filter::CompilationDir

Filter out changes that are due to the catalog compilation directory.

Public Instance Methods

filtered?(diff, options = {}) click to toggle source

Public: Filter the diff if the change is due to the catalog compilation directory. Determine this by obtaining the compiilation directory from each of the catalogs (supplied via options) and checking the differences. If the only thing different is the compilation directory, filter it out with a warning.

@param diff [OctocatalogDiff::API::V1::Diff] Difference @param options [Hash] Additional options:

:from_compilation_dir [String] Compilation directory for the "from" catalog
:to_compilation_dir [String] Compilation directory for the "to" catalog

@return [Boolean] true if this difference is a YAML file with identical objects, false otherwise

# File lib/octocatalog-diff/catalog-diff/filter/compilation_dir.rb, line 21
def filtered?(diff, options = {})
  return false unless options[:from_compilation_dir] && options[:to_compilation_dir]
  dir1 = options[:to_compilation_dir]
  dir1_rexp = Regexp.escape(dir1)
  dir2 = options[:from_compilation_dir]
  dir2_rexp = Regexp.escape(dir2)
  dir = Regexp.new("(?:#{dir1_rexp}|#{dir2_rexp})")

  # Check for added/removed resources where the title of the resource includes the compilation directory
  if (diff.addition? || diff.removal?) && diff.title.match(dir)
    message = "Resource #{diff.type}[#{diff.title}]"
    message += ' appears to depend on catalog compilation directory. Suppressed from results.'
    logger.warn message
    return true
  end

  # Check for a change where the difference in a parameter exactly corresponds to the difference in the
  # compilation directory.
  if diff.change?
    o = remove_compilation_dir(diff.old_value, dir2)
    n = remove_compilation_dir(diff.new_value, dir1)

    if o != diff.old_value || n != diff.new_value
      message = "Resource key #{diff.type}[#{diff.title}] #{diff.structure.join(' => ')}"
      message += ' may depend on catalog compilation directory, but there may be differences.'
      message += ' This is included in results for now, but please verify.'
      @logger.warn message
    end

    if o == n
      message = "Resource key #{diff.type}[#{diff.title}] #{diff.structure.join(' => ')}"
      message += ' appears to depend on catalog compilation directory. Suppressed from results.'
      @logger.warn message
      return true
    end
  end

  false
end
remove_compilation_dir(v, dir) click to toggle source
# File lib/octocatalog-diff/catalog-diff/filter/compilation_dir.rb, line 61
def remove_compilation_dir(v, dir)
  value = OctocatalogDiff::Util::Util.deep_dup(v)
  traverse(value) do |e|
    e.gsub!(dir, '') if e.respond_to?(:gsub!)
  end
  value
end
traverse(a) { |a| ... } click to toggle source
# File lib/octocatalog-diff/catalog-diff/filter/compilation_dir.rb, line 69
def traverse(a)
  case a
  when Array
    a.map { |v| traverse(v, &Proc.new) }
  when Hash
    traverse(a.values, &Proc.new)
  else
    yield a
  end
end