Skip to content

Commit 33cd735

Browse files
committed
Fix reading crate with missing hasPart (it is optional)
Also test handling of root data entity with non-default ID
1 parent 9bd21ac commit 33cd735

File tree

4 files changed

+69
-29
lines changed

4 files changed

+69
-29
lines changed

lib/ro_crate/reader.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ def self.initialize_crate(entity_hash, source, crate_class: ROCrate::Crate, cont
204204
# @param entity_hash [Hash] A Hash containing all the entities in the @graph, mapped by their @id.
205205
# @return [Array<ROCrate::File, ROCrate::Directory>] The extracted DataEntity objects.
206206
def self.extract_data_entities(crate, source, entity_hash)
207-
crate.raw_properties['hasPart'].map do |ref|
207+
(crate.raw_properties['hasPart'] || []).map do |ref|
208208
entity_props = entity_hash.delete(ref['@id'])
209209
next unless entity_props
210210
entity_class = ROCrate::DataEntity.specialize(entity_props)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"@context": "https://w3id.org/ro/crate/1.1/context",
3+
"@graph": [
4+
{
5+
"@id": "arcp://name,somethingsomething",
6+
"@type": "Dataset",
7+
"datePublished": "2024-01-31T10:47:17+00:00"
8+
9+
},
10+
{
11+
"@id": "ro-crate-metadata.json",
12+
"@type": "CreativeWork",
13+
"about": {
14+
"@id": "arcp://name,somethingsomething"
15+
},
16+
"conformsTo": {
17+
"@id": "https://w3id.org/ro/crate/1.1"
18+
}
19+
}
20+
]
21+
}

test/reader_test.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,13 @@ class ReaderTest < Test::Unit::TestCase
360360
assert_include e.message, 'not found in crate: file1.txt'
361361
end
362362

363+
test 'tolerates arcp identifier on root data entity (and missing hasPart)' do
364+
crate = ROCrate::Reader.read(fixture_file('arcp').path)
365+
366+
assert_equal 'arcp://name,somethingsomething', crate.id
367+
assert_empty crate.data_entities
368+
end
369+
363370
private
364371

365372
def check_exception(exception_class)

test/writer_test.rb

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -230,36 +230,48 @@ class WriterTest < Test::Unit::TestCase
230230

231231
test 'write crate with remote files and directories' do
232232
orig = ROCrate::Reader.read(fixture_file('uri_heavy_crate').path)
233-
Tempfile.create do |file|
234-
ROCrate::Writer.new(orig).write_zip(file)
233+
Tempfile.create do |file|
234+
ROCrate::Writer.new(orig).write_zip(file)
235235

236-
Zip::File.open(file) do |zipfile|
237-
refute zipfile.find_entry('nih:sha-256;3a2c-8d14-a40b-3755-4abc-5af8-a56d-ba3a-e159-d688-c9b3-f169-6751-4b88-fbd2-6a9f;7')
238-
end
236+
Zip::File.open(file) do |zipfile|
237+
refute zipfile.find_entry('nih:sha-256;3a2c-8d14-a40b-3755-4abc-5af8-a56d-ba3a-e159-d688-c9b3-f169-6751-4b88-fbd2-6a9f;7')
238+
end
239+
240+
file.rewind
241+
242+
crate = ROCrate::Reader.read(file)
243+
244+
dir = crate.get('nih:sha-256;f70e-eb2e-89d0-b3dc-5c99-8541-fa4b-6e64-a194-cf9d-ebd8-ca58-24e7-c47a-553f-86fa;c/')
245+
assert dir
246+
assert dir.is_a?(ROCrate::Directory)
247+
assert dir.remote?
248+
assert_empty dir.payload
249+
250+
file = crate.get('nih:sha-256;3a2c-8d14-a40b-3755-4abc-5af8-a56d-ba3a-e159-d688-c9b3-f169-6751-4b88-fbd2-6a9f;7')
251+
assert file
252+
assert file.is_a?(ROCrate::File)
253+
assert file.remote?
254+
assert_empty file.payload
255+
256+
real_file = crate.get('main.nf')
257+
assert real_file
258+
assert real_file.is_a?(ROCrate::File)
259+
refute real_file.remote?
260+
assert_not_empty real_file.payload
261+
refute real_file.payload.values.first.remote?
262+
refute real_file.payload.values.first.directory?
263+
end
264+
end
265+
266+
test 'write crate with arcp root identifier' do
267+
crate = ROCrate::Reader.read(fixture_file('arcp').path)
239268

240-
file.rewind
241-
242-
crate = ROCrate::Reader.read(file)
243-
244-
dir = crate.get('nih:sha-256;f70e-eb2e-89d0-b3dc-5c99-8541-fa4b-6e64-a194-cf9d-ebd8-ca58-24e7-c47a-553f-86fa;c/')
245-
assert dir
246-
assert dir.is_a?(ROCrate::Directory)
247-
assert dir.remote?
248-
assert_empty dir.payload
249-
250-
file = crate.get('nih:sha-256;3a2c-8d14-a40b-3755-4abc-5af8-a56d-ba3a-e159-d688-c9b3-f169-6751-4b88-fbd2-6a9f;7')
251-
assert file
252-
assert file.is_a?(ROCrate::File)
253-
assert file.remote?
254-
assert_empty file.payload
255-
256-
real_file = crate.get('main.nf')
257-
assert real_file
258-
assert real_file.is_a?(ROCrate::File)
259-
refute real_file.remote?
260-
assert_not_empty real_file.payload
261-
refute real_file.payload.values.first.remote?
262-
refute real_file.payload.values.first.directory?
269+
assert_equal 'arcp://name,somethingsomething', crate.id
270+
Dir.mktmpdir do |dir|
271+
ROCrate::Writer.new(crate).write(dir)
272+
Dir.chdir(dir) do
273+
assert File.exist?('ro-crate-metadata.json')
263274
end
275+
end
264276
end
265277
end

0 commit comments

Comments
 (0)