fnando/check_files

View on GitHub
lib/check_files/checker.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

module CheckFiles
  class Checker
    attr_reader :cache_path, :pattern

    def initialize(pattern)
      @pattern = pattern
      pattern_digest = Digest::SHA1.hexdigest(pattern)
      @cache_path = Rails.root.join("tmp/cache/#{pattern_digest}")
    end

    def current_digest
      entries = Dir[pattern].sort
      entries_digest = Digest::SHA1.hexdigest(entries.join)

      if pattern.end_with?("/*")
        entries_digest
      else
        content_digest = entries.map {|entry| compute_digest(entry) }.join
        Digest::SHA1.hexdigest("#{entries_digest}#{content_digest}")
      end
    end

    def previous_digest
      cache_path.file? && cache_path.read
    end

    def changed?
      prev_digest = previous_digest

      if prev_digest
        prev_digest != current_digest
      else
        update_cache && false
      end
    end

    def update_cache
      FileUtils.mkdir_p(File.dirname(cache_path))
      File.open(cache_path, "w") {|io| io << current_digest }
    end

    def compute_digest(entry)
      content = File.exist?(entry) && File.read(entry)
      Digest::SHA1.hexdigest("#{entry}-#{content}")
    end
  end
end