ro-crate 0.4.6 → 0.4.7
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.
- 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
|