Skip to content

Commit

Permalink
Fix reading crate with missing hasPart (it is optional)
Browse files Browse the repository at this point in the history
Also test handling of root data entity with non-default ID
  • Loading branch information
fbacall committed Jan 31, 2024
1 parent 9bd21ac commit 33cd735
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 29 deletions.
2 changes: 1 addition & 1 deletion lib/ro_crate/reader.rb
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ def self.initialize_crate(entity_hash, source, crate_class: ROCrate::Crate, cont
# @param entity_hash [Hash] A Hash containing all the entities in the @graph, mapped by their @id.
# @return [Array<ROCrate::File, ROCrate::Directory>] The extracted DataEntity objects.
def self.extract_data_entities(crate, source, entity_hash)
crate.raw_properties['hasPart'].map do |ref|
(crate.raw_properties['hasPart'] || []).map do |ref|
entity_props = entity_hash.delete(ref['@id'])
next unless entity_props
entity_class = ROCrate::DataEntity.specialize(entity_props)
Expand Down
21 changes: 21 additions & 0 deletions test/fixtures/arcp/ro-crate-metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"@context": "https://w3id.org/ro/crate/1.1/context",
"@graph": [
{
"@id": "arcp://name,somethingsomething",
"@type": "Dataset",
"datePublished": "2024-01-31T10:47:17+00:00"

},
{
"@id": "ro-crate-metadata.json",
"@type": "CreativeWork",
"about": {
"@id": "arcp://name,somethingsomething"
},
"conformsTo": {
"@id": "https://w3id.org/ro/crate/1.1"
}
}
]
}
7 changes: 7 additions & 0 deletions test/reader_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,13 @@ class ReaderTest < Test::Unit::TestCase
assert_include e.message, 'not found in crate: file1.txt'
end

test 'tolerates arcp identifier on root data entity (and missing hasPart)' do
crate = ROCrate::Reader.read(fixture_file('arcp').path)

assert_equal 'arcp://name,somethingsomething', crate.id
assert_empty crate.data_entities
end

private

def check_exception(exception_class)
Expand Down
68 changes: 40 additions & 28 deletions test/writer_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -230,36 +230,48 @@ class WriterTest < Test::Unit::TestCase

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

Zip::File.open(file) do |zipfile|
refute zipfile.find_entry('nih:sha-256;3a2c-8d14-a40b-3755-4abc-5af8-a56d-ba3a-e159-d688-c9b3-f169-6751-4b88-fbd2-6a9f;7')
end
Zip::File.open(file) do |zipfile|
refute zipfile.find_entry('nih:sha-256;3a2c-8d14-a40b-3755-4abc-5af8-a56d-ba3a-e159-d688-c9b3-f169-6751-4b88-fbd2-6a9f;7')
end

file.rewind

crate = ROCrate::Reader.read(file)

dir = crate.get('nih:sha-256;f70e-eb2e-89d0-b3dc-5c99-8541-fa4b-6e64-a194-cf9d-ebd8-ca58-24e7-c47a-553f-86fa;c/')
assert dir
assert dir.is_a?(ROCrate::Directory)
assert dir.remote?
assert_empty dir.payload

file = crate.get('nih:sha-256;3a2c-8d14-a40b-3755-4abc-5af8-a56d-ba3a-e159-d688-c9b3-f169-6751-4b88-fbd2-6a9f;7')
assert file
assert file.is_a?(ROCrate::File)
assert file.remote?
assert_empty file.payload

real_file = crate.get('main.nf')
assert real_file
assert real_file.is_a?(ROCrate::File)
refute real_file.remote?
assert_not_empty real_file.payload
refute real_file.payload.values.first.remote?
refute real_file.payload.values.first.directory?
end
end

test 'write crate with arcp root identifier' do
crate = ROCrate::Reader.read(fixture_file('arcp').path)

file.rewind

crate = ROCrate::Reader.read(file)

dir = crate.get('nih:sha-256;f70e-eb2e-89d0-b3dc-5c99-8541-fa4b-6e64-a194-cf9d-ebd8-ca58-24e7-c47a-553f-86fa;c/')
assert dir
assert dir.is_a?(ROCrate::Directory)
assert dir.remote?
assert_empty dir.payload

file = crate.get('nih:sha-256;3a2c-8d14-a40b-3755-4abc-5af8-a56d-ba3a-e159-d688-c9b3-f169-6751-4b88-fbd2-6a9f;7')
assert file
assert file.is_a?(ROCrate::File)
assert file.remote?
assert_empty file.payload

real_file = crate.get('main.nf')
assert real_file
assert real_file.is_a?(ROCrate::File)
refute real_file.remote?
assert_not_empty real_file.payload
refute real_file.payload.values.first.remote?
refute real_file.payload.values.first.directory?
assert_equal 'arcp://name,somethingsomething', crate.id
Dir.mktmpdir do |dir|
ROCrate::Writer.new(crate).write(dir)
Dir.chdir(dir) do
assert File.exist?('ro-crate-metadata.json')
end
end
end
end

0 comments on commit 33cd735

Please sign in to comment.