Class: DirectoryDigest::Digest
- Inherits:
-
Object
- Object
- DirectoryDigest::Digest
- Defined in:
- lib/directory-digest/digest.rb
Overview
DirectoryDigest::Digest - Creates a SHA256 digest of a directory’s content
Instance Attribute Summary collapse
-
#directory_digest ⇒ Object
readonly
Returns the value of attribute directory_digest.
-
#file_digests ⇒ Object
readonly
Returns the value of attribute file_digests.
Class Method Summary collapse
Instance Method Summary collapse
- #!=(other) ⇒ Object
- #==(other) ⇒ Object
- #changes_relative_to(other) ⇒ Object
-
#initialize(directory_digest, file_digests) ⇒ Digest
constructor
A new instance of Digest.
- #to_json ⇒ Object
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_digest ⇒ Object (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_digests ⇒ Object (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_json ⇒ Object
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 |