directory-digest 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []