directory-digest 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/directory-digest/digest.rb +55 -0
  3. metadata +92 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 15325a9f6d460ad66952d88fa6aeb31dc043a945
4
+ data.tar.gz: d310b35d100c50000d37c599f723a720e5bd0e7e
5
+ SHA512:
6
+ metadata.gz: dda276981d65593ab4074b5491c523acbe5a9c4269b378fd027e3a4d917ba83d3be8f15f87134a1f161535a8bc6514e70143c181529c4d3939431125bd41c51f
7
+ data.tar.gz: cf6c78ad8e977d94cbeeb4282f12be6b610e3135fe3d0433b2218505b573b18c964e02bf57309e7cebc845eaea5447180b83607cbb8bf254549e2dca4b6c8966
@@ -0,0 +1,55 @@
1
+ require 'openssl'
2
+
3
+ module DirectoryDigest
4
+ # DirectoryDigest::Digest - Creates a SHA256 digest of a directory's content
5
+ class Digest
6
+ attr_reader :directory_digest
7
+ attr_reader :file_digests
8
+
9
+ def initialize(directory_digest, file_digests)
10
+ @directory_digest = directory_digest
11
+ @file_digests = file_digests
12
+ end
13
+
14
+ def self.sha256(directory, glob = '**/*', includes = [])
15
+ directory_digest = OpenSSL::Digest::SHA256.new
16
+ file_digests = {}
17
+ Dir["#{directory}/#{glob}"].each do |filename|
18
+ next unless File.file?(filename)
19
+ path = filename[directory.size, 99_999]
20
+ included = true
21
+ includes.each do |include|
22
+ included = include[0] == '+' if include.size > 1 && path =~ /#{include[1, 99_999]}/i
23
+ end
24
+ next unless included
25
+ file_digest = OpenSSL::Digest::SHA256.new
26
+ File.open(filename, 'rb') do |file|
27
+ until file.eof?
28
+ chunk = file.read(4096)
29
+ directory_digest << chunk
30
+ file_digest << chunk
31
+ end
32
+ end
33
+ file_digests[path] = file_digest.hexdigest
34
+ end
35
+ Digest.new(directory_digest.hexdigest, file_digests)
36
+ end
37
+
38
+ def ==(other)
39
+ directory_digest == other.directory_digest
40
+ end
41
+
42
+ def !=(other)
43
+ directory_digest != other.directory_digest
44
+ end
45
+
46
+ def changes_relative_to(other)
47
+ {
48
+ added: file_digests.select { |path, _| !other.file_digests.key?(path) },
49
+ removed: other.file_digests.select { |path, _| !file_digests.key?(path) },
50
+ changed: other.file_digests.select { |path, digest| file_digests.key?(path) && digest != file_digests[path] },
51
+ unchanged: other.file_digests.select { |path, digest| file_digests.key?(path) && digest == file_digests[path] }
52
+ }
53
+ end
54
+ end
55
+ end
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: directory-digest
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Andrew Heald
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-06-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '11.1'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 11.1.2
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '11.1'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 11.1.2
33
+ - !ruby/object:Gem::Dependency
34
+ name: rubocop
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 0.40.0
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 0.40.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.4'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.4'
61
+ description: See the project home page for more information.
62
+ email:
63
+ - andrew@heald.uk
64
+ executables: []
65
+ extensions: []
66
+ extra_rdoc_files: []
67
+ files:
68
+ - lib/directory-digest/digest.rb
69
+ homepage: https://github.com/sappho/gem-directory-digest
70
+ licenses: []
71
+ metadata: {}
72
+ post_install_message:
73
+ rdoc_options: []
74
+ require_paths:
75
+ - lib
76
+ required_ruby_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ requirements: []
87
+ rubyforge_project:
88
+ rubygems_version: 2.5.1
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: Creates a SHA256 digest of all of the files in a directory.
92
+ test_files: []