Class: DirectoryDigest::Digest

Inherits:
Object
  • Object
show all
Defined in:
lib/directory-digest/digest.rb

Overview

DirectoryDigest::Digest - Creates a SHA256 digest of a directory’s content

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(directory_digest, file_digests) ⇒ Digest

Returns a new instance of Digest.



10
11
12
13
# File 'lib/directory-digest/digest.rb', line 10

def initialize(directory_digest, file_digests)
  @directory_digest = directory_digest
  @file_digests = file_digests
end

Instance Attribute Details

#directory_digestObject (readonly)

Returns the value of attribute directory_digest.



7
8
9
# File 'lib/directory-digest/digest.rb', line 7

def directory_digest
  @directory_digest
end

#file_digestsObject (readonly)

Returns the value of attribute file_digests.



8
9
10
# File 'lib/directory-digest/digest.rb', line 8

def file_digests
  @file_digests
end

Class Method Details

.from_json(json) ⇒ Object



60
61
62
63
# File 'lib/directory-digest/digest.rb', line 60

def self.from_json(json)
  json = JSON.parse(json)
  Digest.new(json['directory_digest'], json['file_digests'])
end

.sha256(directory, glob = '**/*', includes = []) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/directory-digest/digest.rb', line 15

def self.sha256(directory, glob = '**/*', includes = [])
  directory_digest = OpenSSL::Digest::SHA256.new
  file_digests = {}
  Dir["#{directory}/#{glob}"].each do |filename|
    next unless File.file?(filename)
    path = filename[directory.size, 99_999]
    included = true
    includes.each do |include|
      included = include[0] == '+' if include.size > 1 && path =~ /#{include[1, 99_999]}/i
    end
    next unless included
    file_digest = OpenSSL::Digest::SHA256.new
    File.open(filename, 'rb') do |file|
      until file.eof?
        chunk = file.read(4096)
        directory_digest << chunk
        file_digest << chunk
      end
    end
    file_digests[path] = file_digest.hexdigest
  end
  Digest.new(directory_digest.hexdigest, file_digests)
end

Instance Method Details

#!=(other) ⇒ Object



43
44
45
# File 'lib/directory-digest/digest.rb', line 43

def !=(other)
  directory_digest != other.directory_digest
end

#==(other) ⇒ Object



39
40
41
# File 'lib/directory-digest/digest.rb', line 39

def ==(other)
  directory_digest == other.directory_digest
end

#changes_relative_to(other) ⇒ Object



47
48
49
50
51
52
53
54
# File 'lib/directory-digest/digest.rb', line 47

def changes_relative_to(other)
  {
    added: file_digests.select { |path, _| !other.file_digests.key?(path) },
    removed: other.file_digests.select { |path, _| !file_digests.key?(path) },
    changed: other.file_digests.select { |path, digest| file_digests.key?(path) && digest != file_digests[path] },
    unchanged: other.file_digests.select { |path, digest| file_digests.key?(path) && digest == file_digests[path] }
  }
end

#to_jsonObject



56
57
58
# File 'lib/directory-digest/digest.rb', line 56

def to_json
  JSON.pretty_generate(directory_digest: directory_digest, file_digests: file_digests)
end