ro-crate 0.4.8 → 0.4.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +13 -13
  3. data/README.md +39 -0
  4. data/lib/ro_crate/model/contextual_entity.rb +2 -14
  5. data/lib/ro_crate/model/crate.rb +52 -6
  6. data/lib/ro_crate/model/data_entity.rb +6 -5
  7. data/lib/ro_crate/model/directory.rb +3 -5
  8. data/lib/ro_crate/model/entity.rb +65 -6
  9. data/lib/ro_crate/model/entry.rb +2 -2
  10. data/lib/ro_crate/model/file.rb +2 -4
  11. data/lib/ro_crate/model/metadata.rb +9 -1
  12. data/lib/ro_crate/model/organization.rb +1 -1
  13. data/lib/ro_crate/model/preview.rb +3 -15
  14. data/lib/ro_crate/model/preview_generator.rb +40 -0
  15. data/lib/ro_crate/model/remote_entry.rb +1 -12
  16. data/lib/ro_crate/reader.rb +77 -20
  17. data/lib/ro_crate/writer.rb +4 -4
  18. data/lib/ro_crate.rb +2 -1
  19. data/ro_crate.gemspec +3 -3
  20. data/test/crate_test.rb +37 -3
  21. data/test/directory_test.rb +21 -21
  22. data/test/entity_test.rb +135 -0
  23. data/test/fixtures/biobb_hpc_workflows-condapack.zip +0 -0
  24. data/test/fixtures/conflicting_data_directory/info.txt +1 -0
  25. data/test/fixtures/conflicting_data_directory/nested.txt +1 -0
  26. data/test/fixtures/nested_directory.zip +0 -0
  27. data/test/fixtures/ro-crate-galaxy-sortchangecase/LICENSE +176 -0
  28. data/test/fixtures/ro-crate-galaxy-sortchangecase/README.md +6 -0
  29. data/test/fixtures/ro-crate-galaxy-sortchangecase/ro-crate-metadata.json +133 -0
  30. data/test/fixtures/ro-crate-galaxy-sortchangecase/sort-and-change-case.ga +118 -0
  31. data/test/fixtures/ro-crate-galaxy-sortchangecase/test/test1/input.bed +3 -0
  32. data/test/fixtures/ro-crate-galaxy-sortchangecase/test/test1/output_exp.bed +3 -0
  33. data/test/fixtures/ro-crate-galaxy-sortchangecase/test/test1/sort-and-change-case-test.yml +8 -0
  34. data/test/fixtures/sparse_directory_crate/ro-crate-preview.html +60 -59
  35. data/test/reader_test.rb +83 -40
  36. data/test/test_helper.rb +5 -1
  37. data/test/writer_test.rb +59 -2
  38. metadata +26 -8
data/test/reader_test.rb CHANGED
@@ -88,12 +88,12 @@ class ReaderTest < Test::Unit::TestCase
88
88
  test 'reading from zip with directories' do
89
89
  crate = ROCrate::Reader.read_zip(fixture_file('directory.zip'))
90
90
 
91
- assert crate.entries['fish/info.txt']
92
- assert_equal '1234', crate.entries['fish/info.txt'].source.read.chomp
93
- assert crate.entries['fish/root.txt']
94
- assert crate.entries['fish/data/info.txt']
95
- assert crate.entries['fish/data/nested.txt']
96
- assert crate.entries['fish/data/binary.jpg']
91
+ assert crate.payload['fish/info.txt']
92
+ assert_equal '1234', crate.payload['fish/info.txt'].source.read.chomp
93
+ assert crate.payload['fish/root.txt']
94
+ assert crate.payload['fish/data/info.txt']
95
+ assert crate.payload['fish/data/nested.txt']
96
+ assert crate.payload['fish/data/binary.jpg']
97
97
  assert_equal ['./', 'fish/', 'ro-crate-metadata.jsonld', 'ro-crate-preview.html'], crate.entities.map(&:id).sort
98
98
  end
99
99
 
@@ -101,22 +101,22 @@ class ReaderTest < Test::Unit::TestCase
101
101
  Dir.mktmpdir('test-1234-banana') do |dir|
102
102
  crate = ROCrate::Reader.read_zip(fixture_file('directory.zip'), target_dir: dir)
103
103
 
104
- assert crate.entries['fish/info.txt']
105
- assert crate.entries['fish/info.txt'].source.to_s.include?('/test-1234-banana')
104
+ assert crate.payload['fish/info.txt']
105
+ assert crate.payload['fish/info.txt'].source.to_s.include?('/test-1234-banana')
106
106
  end
107
107
  end
108
108
 
109
109
  test 'reading from directory with directories' do
110
110
  crate = ROCrate::Reader.read_directory(fixture_file('directory_crate').path)
111
111
 
112
- assert crate.entries.values.all? { |e| e.is_a?(ROCrate::Entry) }
113
- assert crate.entries['fish/info.txt']
114
- assert_equal '1234', crate.entries['fish/info.txt'].source.read.chomp
115
- refute crate.entries['fish/root.txt'].directory?
116
- assert crate.entries['fish/data'].directory?
117
- assert crate.entries['fish/data/info.txt']
118
- refute crate.entries['fish/data/nested.txt'].remote?
119
- assert crate.entries['fish/data/binary.jpg']
112
+ assert crate.payload.values.all? { |e| e.is_a?(ROCrate::Entry) }
113
+ assert crate.payload['fish/info.txt']
114
+ assert_equal '1234', crate.payload['fish/info.txt'].source.read.chomp
115
+ refute crate.payload['fish/root.txt'].directory?
116
+ assert crate.payload['fish/data'].directory?
117
+ assert crate.payload['fish/data/info.txt']
118
+ refute crate.payload['fish/data/nested.txt'].remote?
119
+ assert crate.payload['fish/data/binary.jpg']
120
120
  assert_equal ['./', 'fish/', 'ro-crate-metadata.jsonld', 'ro-crate-preview.html'], crate.entities.map(&:id).sort
121
121
  end
122
122
 
@@ -162,37 +162,38 @@ class ReaderTest < Test::Unit::TestCase
162
162
  assert ext_file.source.is_a?(ROCrate::RemoteEntry)
163
163
  assert_equal 'http://example.com/external_ref.txt', ext_file.id
164
164
  assert_equal 'file contents', ext_file.source.read
165
+ assert crate.preview.source.source.is_a?(ROCrate::PreviewGenerator)
165
166
  end
166
167
 
167
168
  test 'reading from directory with unlisted files' do
168
169
  crate = ROCrate::Reader.read_directory(fixture_file('sparse_directory_crate').path)
169
170
 
170
- assert_equal 11, crate.entries.count
171
- assert crate.entries['listed_file.txt']
172
- assert crate.entries['unlisted_file.txt']
173
- assert crate.entries['fish']
174
- assert_equal '1234', crate.entries['fish/info.txt'].source.read.chomp
175
- refute crate.entries['fish/root.txt'].directory?
176
- assert crate.entries['fish/data'].directory?
177
- assert crate.entries['fish/data/info.txt']
178
- refute crate.entries['fish/data/nested.txt'].remote?
179
- assert crate.entries['fish/data/binary.jpg']
171
+ assert_equal 11, crate.payload.count
172
+ assert crate.payload['listed_file.txt']
173
+ assert crate.payload['unlisted_file.txt']
174
+ assert crate.payload['fish']
175
+ assert_equal '1234', crate.payload['fish/info.txt'].source.read.chomp
176
+ refute crate.payload['fish/root.txt'].directory?
177
+ assert crate.payload['fish/data'].directory?
178
+ assert crate.payload['fish/data/info.txt']
179
+ refute crate.payload['fish/data/nested.txt'].remote?
180
+ assert crate.payload['fish/data/binary.jpg']
180
181
  assert_equal ['./', 'listed_file.txt', 'ro-crate-metadata.jsonld', 'ro-crate-preview.html'], crate.entities.map(&:id).sort
181
182
  end
182
183
 
183
184
  test 'reading from a zip with unlisted files' do
184
185
  crate = ROCrate::Reader.read_zip(fixture_file('sparse_directory_crate.zip').path)
185
186
 
186
- assert_equal 11, crate.entries.count
187
- assert crate.entries['listed_file.txt']
188
- assert crate.entries['unlisted_file.txt']
189
- assert crate.entries['fish']
190
- assert_equal '1234', crate.entries['fish/info.txt'].source.read.chomp
191
- refute crate.entries['fish/root.txt'].directory?
192
- assert crate.entries['fish/data'].directory?
193
- assert crate.entries['fish/data/info.txt']
194
- refute crate.entries['fish/data/nested.txt'].remote?
195
- assert crate.entries['fish/data/binary.jpg']
187
+ assert_equal 11, crate.payload.count
188
+ assert crate.payload['listed_file.txt']
189
+ assert crate.payload['unlisted_file.txt']
190
+ assert crate.payload['fish']
191
+ assert_equal '1234', crate.payload['fish/info.txt'].source.read.chomp
192
+ refute crate.payload['fish/root.txt'].directory?
193
+ assert crate.payload['fish/data'].directory?
194
+ assert crate.payload['fish/data/info.txt']
195
+ refute crate.payload['fish/data/nested.txt'].remote?
196
+ assert crate.payload['fish/data/binary.jpg']
196
197
  assert_equal ['./', 'listed_file.txt', 'ro-crate-metadata.jsonld', 'ro-crate-preview.html'], crate.entities.map(&:id).sort
197
198
  end
198
199
 
@@ -201,18 +202,60 @@ class ReaderTest < Test::Unit::TestCase
201
202
  string_io.write(::File.read(fixture_file('sparse_directory_crate.zip').path))
202
203
  string_io.rewind
203
204
  assert string_io.is_a?(StringIO)
204
- assert_equal 11, ROCrate::Reader.read_zip(string_io).entries.count
205
+ assert_equal 11, ROCrate::Reader.read_zip(string_io).payload.count
205
206
 
206
207
  path = Pathname.new(fixture_file('sparse_directory_crate.zip').path)
207
208
  assert path.is_a?(Pathname)
208
- assert_equal 11, ROCrate::Reader.read_zip(path).entries.count
209
+ assert_equal 11, ROCrate::Reader.read_zip(path).payload.count
209
210
 
210
211
  file = ::File.open(fixture_file('sparse_directory_crate.zip').path)
211
212
  assert file.is_a?(::File)
212
- assert_equal 11, ROCrate::Reader.read_zip(file).entries.count
213
+ assert_equal 11, ROCrate::Reader.read_zip(file).payload.count
213
214
 
214
215
  string = fixture_file('sparse_directory_crate.zip').path
215
216
  assert string.is_a?(String)
216
- assert_equal 11, ROCrate::Reader.read_zip(string).entries.count
217
+ assert_equal 11, ROCrate::Reader.read_zip(string).payload.count
218
+ end
219
+
220
+ test 'reading from zip where the crate root is nested somewhere within' do
221
+ crate = ROCrate::Reader.read_zip(fixture_file('nested_directory.zip'))
222
+
223
+ assert crate.payload['fish/info.txt']
224
+ assert_equal '1234', crate.payload['fish/info.txt'].source.read.chomp
225
+ assert crate.payload['fish/root.txt']
226
+ assert crate.payload['fish/data/info.txt']
227
+ assert crate.payload['fish/data/nested.txt']
228
+ assert crate.payload['fish/data/binary.jpg']
229
+ assert_equal ['./', 'fish/', 'ro-crate-metadata.json', 'ro-crate-preview.html'], crate.entities.map(&:id).sort
230
+ end
231
+
232
+ test 'reading preserves any additions to @context' do
233
+ crate = ROCrate::Reader.read_directory(fixture_file('ro-crate-galaxy-sortchangecase').path)
234
+
235
+ context = crate.metadata.context
236
+ assert_equal [
237
+ 'https://w3id.org/ro/crate/1.1/context',
238
+ {
239
+ 'TestSuite' => 'https://w3id.org/ro/terms/test#TestSuite',
240
+ 'TestInstance' => 'https://w3id.org/ro/terms/test#TestInstance',
241
+ 'TestService' => 'https://w3id.org/ro/terms/test#TestService',
242
+ 'TestDefinition' => 'https://w3id.org/ro/terms/test#TestDefinition',
243
+ 'PlanemoEngine' => 'https://w3id.org/ro/terms/test#PlanemoEngine',
244
+ 'JenkinsService' => 'https://w3id.org/ro/terms/test#JenkinsService',
245
+ 'TravisService' => 'https://w3id.org/ro/terms/test#TravisService',
246
+ 'GithubService' => 'https://w3id.org/ro/terms/test#GithubService',
247
+ 'instance' => 'https://w3id.org/ro/terms/test#instance',
248
+ 'runsOn' => 'https://w3id.org/ro/terms/test#runsOn',
249
+ 'resource' => 'https://w3id.org/ro/terms/test#resource',
250
+ 'definition' => 'https://w3id.org/ro/terms/test#definition',
251
+ 'engineVersion' => 'https://w3id.org/ro/terms/test#engineVersion'
252
+ }
253
+ ], context
254
+ end
255
+
256
+ test 'existing preview is used even if not mentioned in metadata' do
257
+ crate = ROCrate::Reader.read_zip(fixture_file('biobb_hpc_workflows-condapack.zip').path)
258
+ assert crate.preview.source.source.is_a?(Pathname)
259
+ assert_equal 80526, crate.preview.source.read.length
217
260
  end
218
261
  end
data/test/test_helper.rb CHANGED
@@ -6,5 +6,9 @@ require 'ro_crate'
6
6
  require 'webmock/test_unit'
7
7
 
8
8
  def fixture_file(name, *args)
9
- ::File.open(::File.join(::File.dirname(__FILE__), 'fixtures', name), *args)
9
+ ::File.open(::File.join(fixture_dir, name), *args)
10
+ end
11
+
12
+ def fixture_dir
13
+ ::File.join(::File.dirname(__FILE__), 'fixtures')
10
14
  end
data/test/writer_test.rb CHANGED
@@ -47,8 +47,12 @@ class WriterTest < Test::Unit::TestCase
47
47
  end
48
48
 
49
49
  test 'writing to zip' do
50
+ # Remote entries should not be written, so this 500 error should not affect anything.
51
+ stub_request(:get, 'http://example.com/external_ref.txt').to_return(status: 500)
52
+
50
53
  crate = ROCrate::Crate.new
51
54
  crate.add_file(fixture_file('info.txt'))
55
+ crate.add_file('http://example.com/external_ref.txt')
52
56
  crate.add_file(fixture_file('data.csv'), 'directory/data.csv')
53
57
 
54
58
  Tempfile.create do |file|
@@ -57,6 +61,7 @@ class WriterTest < Test::Unit::TestCase
57
61
  Zip::File.open(file) do |zipfile|
58
62
  assert zipfile.file.exist?(ROCrate::Metadata::IDENTIFIER)
59
63
  assert zipfile.file.exist?(ROCrate::Preview::IDENTIFIER)
64
+ refute zipfile.file.exist?('external_ref.txt')
60
65
  assert_equal 6, zipfile.file.size('info.txt')
61
66
  assert_equal 20, zipfile.file.size('directory/data.csv')
62
67
  end
@@ -124,12 +129,64 @@ class WriterTest < Test::Unit::TestCase
124
129
  actual_files = Dir.chdir(dir) { Dir.glob('**/*') }
125
130
  assert_equal expected_files, actual_files
126
131
  expected_files.each do |file|
127
- next if file == 'ro-crate-metadata.jsonld' # Expected context gets updated.
128
- next if file == 'ro-crate-preview.html' # RO-Crate preview format changed
129
132
  abs_file_path = ::File.join(fixture, file)
130
133
  next if ::File.directory?(abs_file_path)
131
134
  assert_equal ::File.read(abs_file_path), ::File.read(::File.join(dir, file)), "#{file} didn't match"
132
135
  end
133
136
  end
134
137
  end
138
+
139
+ test 'reading/writing multiple times does not change the crate' do
140
+ input_dir = fixture_file('sparse_directory_crate').path
141
+ Dir.mktmpdir do |dir|
142
+ 3.times do |i|
143
+ output_dir = ::File.join(dir, "new_directory_#{i}")
144
+ crate = ROCrate::Reader.read(input_dir)
145
+
146
+ ROCrate::Writer.new(crate).write(output_dir)
147
+ expected_files = Dir.chdir(input_dir) { Dir.glob('**/*') }
148
+ actual_files = Dir.chdir(output_dir) { Dir.glob('**/*') }
149
+ assert_equal expected_files, actual_files
150
+ expected_files.each do |file|
151
+ abs_file_path = ::File.join(input_dir, file)
152
+ next if ::File.directory?(abs_file_path)
153
+ assert_equal ::File.read(abs_file_path), ::File.read(::File.join(output_dir, file)), "#{file} didn't match"
154
+ end
155
+
156
+ input_dir = output_dir
157
+ end
158
+ end
159
+ end
160
+
161
+ test 'writing with conflicting paths in payload obeys specificity rules' do
162
+ crate = ROCrate::Crate.new
163
+
164
+ # Payload from crate
165
+ crate.add_all(fixture_file('directory').path, false)
166
+ Dir.mktmpdir do |dir|
167
+ ROCrate::Writer.new(crate).write(dir)
168
+
169
+ assert_equal "5678\n", ::File.read(::File.join(dir, 'data', 'info.txt'))
170
+ end
171
+
172
+ # Payload from crate + directory
173
+ crate.add_directory(fixture_file('conflicting_data_directory').path.to_s, 'data')
174
+ Dir.mktmpdir do |dir|
175
+ ROCrate::Writer.new(crate).write(dir)
176
+
177
+ assert_equal 'abcd', ::File.read(::File.join(dir, 'data', 'info.txt')), 'Directory payload should take priority over Crate.'
178
+ assert_equal "No, I am nested!\n", ::File.read(::File.join(dir, 'data', 'nested.txt')), 'Directory payload should take priority over Crate.'
179
+ assert ::File.exist?(::File.join(dir, 'data', 'binary.jpg'))
180
+ end
181
+
182
+ # Payload from crate + directory + file
183
+ crate.add_file(StringIO.new('xyz'), 'data/info.txt')
184
+ Dir.mktmpdir do |dir|
185
+ ROCrate::Writer.new(crate).write(dir)
186
+
187
+ assert_equal 'xyz', ::File.read(::File.join(dir, 'data', 'info.txt')), 'File payload should take priority over Crate and Directory.'
188
+ assert_equal "No, I am nested!\n", ::File.read(::File.join(dir, 'data', 'nested.txt')), 'Directory payload should take priority over Crate.'
189
+ assert ::File.exist?(::File.join(dir, 'data', 'binary.jpg'))
190
+ end
191
+ end
135
192
  end
metadata CHANGED
@@ -1,29 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ro-crate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.8
4
+ version: 0.4.12
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-26 00:00:00.000000000 Z
11
+ date: 2021-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '2.7'
20
+ - - "<"
18
21
  - !ruby/object:Gem::Version
19
- version: 2.7.0
22
+ version: '2.9'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '2.7'
30
+ - - "<"
25
31
  - !ruby/object:Gem::Version
26
- version: 2.7.0
32
+ version: '2.9'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: rubyzip
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +78,14 @@ dependencies:
72
78
  requirements:
73
79
  - - "~>"
74
80
  - !ruby/object:Gem::Version
75
- version: 0.16.1
81
+ version: 0.21.2
76
82
  type: :development
77
83
  prerelease: false
78
84
  version_requirements: !ruby/object:Gem::Requirement
79
85
  requirements:
80
86
  - - "~>"
81
87
  - !ruby/object:Gem::Version
82
- version: 0.16.1
88
+ version: 0.21.2
83
89
  - !ruby/object:Gem::Dependency
84
90
  name: yard
85
91
  requirement: !ruby/object:Gem::Requirement
@@ -137,6 +143,7 @@ files:
137
143
  - lib/ro_crate/model/organization.rb
138
144
  - lib/ro_crate/model/person.rb
139
145
  - lib/ro_crate/model/preview.rb
146
+ - lib/ro_crate/model/preview_generator.rb
140
147
  - lib/ro_crate/model/remote_entry.rb
141
148
  - lib/ro_crate/reader.rb
142
149
  - lib/ro_crate/ro-crate-preview.html.erb
@@ -145,6 +152,9 @@ files:
145
152
  - test/crate_test.rb
146
153
  - test/directory_test.rb
147
154
  - test/entity_test.rb
155
+ - test/fixtures/biobb_hpc_workflows-condapack.zip
156
+ - test/fixtures/conflicting_data_directory/info.txt
157
+ - test/fixtures/conflicting_data_directory/nested.txt
148
158
  - test/fixtures/crate-spec1.1/file with spaces.txt
149
159
  - test/fixtures/crate-spec1.1/ro-crate-metadata.json
150
160
  - test/fixtures/data.csv
@@ -165,6 +175,14 @@ files:
165
175
  - test/fixtures/directory_crate/ro-crate-preview.html
166
176
  - test/fixtures/file with spaces.txt
167
177
  - test/fixtures/info.txt
178
+ - test/fixtures/nested_directory.zip
179
+ - test/fixtures/ro-crate-galaxy-sortchangecase/LICENSE
180
+ - test/fixtures/ro-crate-galaxy-sortchangecase/README.md
181
+ - test/fixtures/ro-crate-galaxy-sortchangecase/ro-crate-metadata.json
182
+ - test/fixtures/ro-crate-galaxy-sortchangecase/sort-and-change-case.ga
183
+ - test/fixtures/ro-crate-galaxy-sortchangecase/test/test1/input.bed
184
+ - test/fixtures/ro-crate-galaxy-sortchangecase/test/test1/output_exp.bed
185
+ - test/fixtures/ro-crate-galaxy-sortchangecase/test/test1/sort-and-change-case-test.yml
168
186
  - test/fixtures/spaces/file with spaces.txt
169
187
  - test/fixtures/spaces/ro-crate-metadata.jsonld
170
188
  - test/fixtures/sparse_directory_crate.zip