ro-crate 0.4.6 → 0.4.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/ro_crate/reader.rb +47 -7
- data/ro_crate.gemspec +1 -1
- data/test/reader_test.rb +20 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 12ec7081b3540a664a8146c27c07ad1ab68f7c6dec49fda79560a4e81588c5d6
|
4
|
+
data.tar.gz: 6e367c3d7b299dbaa095cf74c3715cffa877fed5b1cd89f195e61758c47782b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a659655a5e779cf9ee0f9c662809b82d06c25e57af67bde6954fdc08d6a58ce0b053495b939a764dbf47b91c4298644e23556e02f9ec23d04ce680e746d6ff5f
|
7
|
+
data.tar.gz: 70c036c6fd7692dfdedf466c962bf92d7e92bbe9fe4283fc74a39f8827540f0d828de727ba7b1dde1daa33ee5551554bb52ce87e0637d4d275e6f15574fc8eb9
|
data/Gemfile.lock
CHANGED
data/lib/ro_crate/reader.rb
CHANGED
@@ -3,29 +3,67 @@ module ROCrate
|
|
3
3
|
# A class to handle reading of RO-Crates from Zip files or directories.
|
4
4
|
class Reader
|
5
5
|
##
|
6
|
-
# Reads an RO-Crate from a directory
|
6
|
+
# Reads an RO-Crate from a directory or zip file.
|
7
7
|
#
|
8
|
-
# @param source [String, ::File, Pathname] The
|
8
|
+
# @param source [String, ::File, Pathname, #read] The location of the zip or directory, or an IO-like object containing a zip.
|
9
9
|
# @param target_dir [String, ::File, Pathname] The target directory where the crate should be unzipped (if its a Zip file).
|
10
10
|
# @return [Crate] The RO-Crate.
|
11
11
|
def self.read(source, target_dir: Dir.mktmpdir)
|
12
12
|
raise "Not a directory!" unless ::File.directory?(target_dir)
|
13
|
-
|
13
|
+
begin
|
14
|
+
is_dir = ::File.directory?(source)
|
15
|
+
rescue TypeError
|
16
|
+
is_dir = false
|
17
|
+
end
|
18
|
+
|
19
|
+
if is_dir
|
14
20
|
read_directory(source)
|
15
21
|
else
|
16
22
|
read_zip(source, target_dir: target_dir)
|
17
23
|
end
|
18
24
|
end
|
19
25
|
|
26
|
+
##
|
27
|
+
# Extract the contents of the given Zip file/data to the given directory.
|
28
|
+
#
|
29
|
+
# @param source [String, ::File, Pathname, #read] The location of the zip file, or an IO-like object.
|
30
|
+
# @param target [String, ::File, Pathname] The target directory where the file should be unzipped.
|
31
|
+
def self.unzip_to(source, target)
|
32
|
+
source = Pathname.new(::File.expand_path(source)) if source.is_a?(String)
|
33
|
+
|
34
|
+
if source.is_a?(Pathname) || source.is_a?(::File)
|
35
|
+
unzip_file_to(source, target)
|
36
|
+
else
|
37
|
+
unzip_io_to(source, target)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
##
|
42
|
+
# Extract the given Zip file data to the given directory.
|
43
|
+
#
|
44
|
+
# @param source [#read] An IO-like object containing a Zip file.
|
45
|
+
# @param target [String, ::File, Pathname] The target directory where the file should be unzipped.
|
46
|
+
def self.unzip_io_to(io, target)
|
47
|
+
Dir.chdir(target) do
|
48
|
+
Zip::InputStream.open(io) do |input|
|
49
|
+
while (entry = input.get_next_entry)
|
50
|
+
unless ::File.exist?(entry.name) || entry.name_is_directory?
|
51
|
+
FileUtils::mkdir_p(::File.dirname(entry.name))
|
52
|
+
::File.write(entry.name, input.read)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
20
59
|
##
|
21
60
|
# Extract the contents of the given Zip file to the given directory.
|
22
61
|
#
|
23
62
|
# @param source [String, ::File, Pathname] The location of the zip file.
|
24
63
|
# @param target [String, ::File, Pathname] The target directory where the file should be unzipped.
|
25
|
-
def self.
|
26
|
-
source = ::File.expand_path(source)
|
64
|
+
def self.unzip_file_to(file_or_path, target)
|
27
65
|
Dir.chdir(target) do
|
28
|
-
Zip::File.open(
|
66
|
+
Zip::File.open(file_or_path) do |zipfile|
|
29
67
|
zipfile.each do |entry|
|
30
68
|
unless ::File.exist?(entry.name)
|
31
69
|
FileUtils::mkdir_p(::File.dirname(entry.name))
|
@@ -40,7 +78,7 @@ module ROCrate
|
|
40
78
|
# Reads an RO-Crate from a zip file. It first extracts the Zip file to a temporary directory, and then calls
|
41
79
|
# #read_directory.
|
42
80
|
#
|
43
|
-
# @param source [String, ::File, Pathname] The location of the zip file.
|
81
|
+
# @param source [String, ::File, Pathname, #read] The location of the zip file, or an IO-like object.
|
44
82
|
# @param target_dir [String, ::File, Pathname] The target directory where the crate should be unzipped.
|
45
83
|
# @return [Crate] The RO-Crate.
|
46
84
|
def self.read_zip(source, target_dir: Dir.mktmpdir)
|
@@ -55,6 +93,8 @@ module ROCrate
|
|
55
93
|
# @param source [String, ::File, Pathname] The location of the directory.
|
56
94
|
# @return [Crate] The RO-Crate.
|
57
95
|
def self.read_directory(source)
|
96
|
+
raise "Not a directory!" unless ::File.directory?(source)
|
97
|
+
|
58
98
|
source = ::File.expand_path(source)
|
59
99
|
metadata_file = Dir.entries(source).detect { |entry| entry == ROCrate::Metadata::IDENTIFIER ||
|
60
100
|
entry == ROCrate::Metadata::IDENTIFIER_1_0 }
|
data/ro_crate.gemspec
CHANGED
data/test/reader_test.rb
CHANGED
@@ -195,4 +195,24 @@ class ReaderTest < Test::Unit::TestCase
|
|
195
195
|
assert crate.entries['fish/data/binary.jpg']
|
196
196
|
assert_equal ['./', 'listed_file.txt', 'ro-crate-metadata.jsonld', 'ro-crate-preview.html'], crate.entities.map(&:id).sort
|
197
197
|
end
|
198
|
+
|
199
|
+
test 'reading a zip from various object types' do
|
200
|
+
string_io = StringIO.new
|
201
|
+
string_io.write(::File.read(fixture_file('sparse_directory_crate.zip').path))
|
202
|
+
string_io.rewind
|
203
|
+
assert string_io.is_a?(StringIO)
|
204
|
+
assert_equal 11, ROCrate::Reader.read_zip(string_io).entries.count
|
205
|
+
|
206
|
+
path = Pathname.new(fixture_file('sparse_directory_crate.zip').path)
|
207
|
+
assert path.is_a?(Pathname)
|
208
|
+
assert_equal 11, ROCrate::Reader.read_zip(path).entries.count
|
209
|
+
|
210
|
+
file = ::File.open(fixture_file('sparse_directory_crate.zip').path)
|
211
|
+
assert file.is_a?(::File)
|
212
|
+
assert_equal 11, ROCrate::Reader.read_zip(file).entries.count
|
213
|
+
|
214
|
+
string = fixture_file('sparse_directory_crate.zip').path
|
215
|
+
assert string.is_a?(String)
|
216
|
+
assert_equal 11, ROCrate::Reader.read_zip(string).entries.count
|
217
|
+
end
|
198
218
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ro-crate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Finn Bacall
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-02-
|
11
|
+
date: 2021-02-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|