From a1e22b59557263dfe14347702e262c94845abeff Mon Sep 17 00:00:00 2001 From: Jim Coble Date: Thu, 7 May 2015 13:33:25 -0400 Subject: [PATCH 01/10] Upgrade ddr-models dependency to 1.14.2; closes #1340. Change TIF image files to satisfy Travis. --- Gemfile | 2 +- Gemfile.lock | 16 ++++++++-------- .../controllers/components_controller_spec.rb | 4 ++-- spec/controllers/items_controller_spec.rb | 4 ++-- spec/factories/component_factories.rb | 2 +- spec/factories/test_model_factories.rb | 4 ++-- spec/fixtures/image1.tiff | Bin 63538 -> 0 bytes spec/fixtures/image2.tiff | Bin 63216 -> 0 bytes spec/fixtures/image3.tiff | Bin 64732 -> 0 bytes spec/fixtures/image4.tiff | Bin 62152 -> 0 bytes spec/fixtures/imageA.tif | Bin 0 -> 230714 bytes spec/fixtures/imageB.tif | Bin 0 -> 230714 bytes spec/fixtures/library-devil.tiff | Bin 10032 -> 0 bytes spec/helpers/application_helper_spec.rb | 4 ++-- spec/scripts/batch_processor_spec.rb | 2 +- spec/scripts/manifest_maker_spec.rb | 18 +++++++++--------- .../collections_controller_spec_helper.rb | 12 ++++++------ 17 files changed, 34 insertions(+), 34 deletions(-) delete mode 100755 spec/fixtures/image1.tiff delete mode 100755 spec/fixtures/image2.tiff delete mode 100755 spec/fixtures/image3.tiff delete mode 100755 spec/fixtures/image4.tiff create mode 100644 spec/fixtures/imageA.tif create mode 100644 spec/fixtures/imageB.tif delete mode 100644 spec/fixtures/library-devil.tiff diff --git a/Gemfile b/Gemfile index 8e10571a..245a90bb 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,7 @@ source 'http://rubygems.org' gem 'rails', '~> 4.1.6' gem 'hydra-head', '~> 7.2.0' gem 'ddr-alerts', '~> 1.0.0' -gem 'ddr-models', '~> 1.13.2' +gem 'ddr-models', '~> 1.14.2' gem 'rubydora', '>= 1.8.1' gem 'devise' gem 'deprecation' diff --git a/Gemfile.lock b/Gemfile.lock index 5a76ce1e..c9f8b178 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -86,18 +86,18 @@ GEM rails (~> 4.1.6) ddr-antivirus (1.3.2) activesupport (~> 4.0) - ddr-models (1.13.2) + ddr-models (1.14.2) active-fedora (~> 7.0) ddr-antivirus (~> 1.3.1) devise (~> 3.4) - ezid-client (~> 1.0) + ezid-client (~> 1.1, >= 1.1.1) grouper-rest-client hydra-core (~> 7.2) hydra-validations (~> 0.5) net-ldap (~> 0.11) omniauth-shibboleth (~> 1.2.0) rails (~> 4.1.6) - rdf-vocab (= 0.7.0) + rdf-vocab (~> 0.8) resque (~> 1.25) deprecation (0.1.0) activesupport @@ -118,7 +118,7 @@ GEM nokogiri (>= 1.4.3) erubis (2.7.0) execjs (2.2.2) - ezid-client (1.1.0) + ezid-client (1.1.1) factory_girl (4.5.0) activesupport (>= 3.0.0) factory_girl_rails (4.5.0) @@ -251,7 +251,7 @@ GEM rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) rake (10.4.2) - rdf (1.1.7) + rdf (1.1.12) link_header (~> 0.0, >= 0.0.8) rdf-aggregate-repo (1.1.0) rdf (>= 1.1) @@ -290,8 +290,8 @@ GEM rdf-turtle (1.1.5) ebnf (~> 0.3, >= 0.3.6) rdf (~> 1.1, >= 1.1.4) - rdf-vocab (0.7.0) - linkeddata + rdf-vocab (0.8.1) + rdf (~> 1.1, >= 1.1.10) rdf-xsd (1.1.2) rdf (~> 1.1) redis (3.2.0) @@ -418,7 +418,7 @@ DEPENDENCIES coveralls database_cleaner ddr-alerts (~> 1.0.0) - ddr-models (~> 1.13.2) + ddr-models (~> 1.14.2) deprecation devise equivalent-xml diff --git a/spec/controllers/components_controller_spec.rb b/spec/controllers/components_controller_spec.rb index c847c598..ca1cee6b 100644 --- a/spec/controllers/components_controller_spec.rb +++ b/spec/controllers/components_controller_spec.rb @@ -3,7 +3,7 @@ def create_component opts={} checksum, checksum_type = opts.values_at(:checksum, :checksum_type) - post :create, parent_id: item.pid, content: {file: fixture_file_upload('image1.tiff', 'image/tiff'), checksum: checksum, checksum_type: checksum_type} + post :create, parent_id: item.pid, content: {file: fixture_file_upload('imageA.tif', 'image/tiff'), checksum: checksum, checksum_type: checksum_type} end describe ComponentsController, type: :controller, components: true do @@ -60,7 +60,7 @@ def create_component opts={} end it "should store the original file name" do create_component - expect(assigns(:current_object).original_filename).to eq("image1.tiff") + expect(assigns(:current_object).original_filename).to eq("imageA.tif") end it "should grant edit permission to the user" do create_component diff --git a/spec/controllers/items_controller_spec.rb b/spec/controllers/items_controller_spec.rb index 1c06f6aa..b9bdefb9 100644 --- a/spec/controllers/items_controller_spec.rb +++ b/spec/controllers/items_controller_spec.rb @@ -7,7 +7,7 @@ def create_item def create_item_and_component opts={} checksum, checksum_type = opts.values_at(:checksum, :checksum_type) - post :create, parent_id: collection.pid, descMetadata: {title: ["New Item"]}, content: {file: fixture_file_upload('image1.tiff', 'image/tiff'), checksum: checksum, checksum_type: checksum_type} + post :create, parent_id: collection.pid, descMetadata: {title: ["New Item"]}, content: {file: fixture_file_upload('imageA.tif', 'image/tiff'), checksum: checksum, checksum_type: checksum_type} end describe ItemsController, type: :controller, items: true do @@ -75,7 +75,7 @@ def create_item_and_component opts={} end it "should store the original file name" do create_item_and_component - expect(assigns(:current_object).children.first.original_filename).to eq("image1.tiff") + expect(assigns(:current_object).children.first.original_filename).to eq("imageA.tif") end it "should grant edit permission to the user" do create_item_and_component diff --git a/spec/factories/component_factories.rb b/spec/factories/component_factories.rb index 3f606384..64af6155 100644 --- a/spec/factories/component_factories.rb +++ b/spec/factories/component_factories.rb @@ -4,7 +4,7 @@ title [ "Test Component" ] sequence(:identifier) { |n| [ "cmp%05d" % n ] } after(:build) do |c| - c.upload File.new(File.join(Rails.root, "spec", "fixtures", "library-devil.tiff")) + c.upload File.new(File.join(Rails.root, "spec", "fixtures", "imageA.tif")) end trait :has_parent do diff --git a/spec/factories/test_model_factories.rb b/spec/factories/test_model_factories.rb index 106a047f..1ceb5962 100644 --- a/spec/factories/test_model_factories.rb +++ b/spec/factories/test_model_factories.rb @@ -56,7 +56,7 @@ class TestModelOmnibus < TestModel title [ "DulHydra Test Content Object" ] sequence(:identifier) { |n| [ "testcontent%05d" % n ] } after(:build) do |c| - c.upload File.new(File.join(Rails.root, "spec", "fixtures", "library-devil.tiff")) + c.upload File.new(File.join(Rails.root, "spec", "fixtures", "imageA.tif")) end factory :test_content_with_fixity_check do @@ -68,7 +68,7 @@ class TestModelOmnibus < TestModel title [ "DulHydra Test Omnibus Object" ] sequence(:identifier) { |n| [ "test%05d" % n ] } after(:build) do |c| - c.upload File.new(File.join(Rails.root, "spec", "fixtures", "library-devil.tiff")) + c.upload File.new(File.join(Rails.root, "spec", "fixtures", "imageA.tif")) end end diff --git a/spec/fixtures/image1.tiff b/spec/fixtures/image1.tiff deleted file mode 100755 index 63e79350dd8cf35f4389c62deef8b1dcd0860fb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63538 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 diff --git a/spec/fixtures/image4.tiff b/spec/fixtures/image4.tiff deleted file mode 100755 index 040d3a52f1d7e9c77494e19f22fc2c2be8de6145..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62152 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 diff --git a/spec/fixtures/imageA.tif b/spec/fixtures/imageA.tif new file mode 100644 index 0000000000000000000000000000000000000000..82de5101fa4304f843cb2ad3a1f97db814b241f2 GIT binary patch literal 230714 zcmeI)O^BXn6$apMl2m4+*n(EHi!O@`8!U>ru~Jd9P+SNu#6`ep0tQ3_U0dS9T^G7_ zp-UGEx)4okEsEk_Y)PhV8r!rbX&R%M{HMvx#4}|qB`uSg=Q;Cpp1Gz8dGpQpobNr? zeKVBF%uDv(Fqn^|w7Q{{Eq7f4lR@rur4P6gL*P7dIKV8aEub9XB5EE0`{-f9avG2s=pP1QHjcvY}SR~eorDC;MFxK=Tec3J)eCNW=8y6Sbd+L|x zX1;gw$bozmF!U|;v|tIG zAPT5z*>08loxi?t@%d{n{q*dgzWn@_Dre`i!4+sh7l2!(E1P)F8yDuzJaOUh{+Bvq zbvy)uF))L469+!#t<7DTKl8f_fBD+K^l&W%0ycO9dCc}~rmZfYczx!PlWP&8nQs>e z>HyzN`Hyoi=Vz|?fc*B#t-~Y19{A%lX`?rZe<1t&-V^H(oR?TeAR>q$Ho6PtU;pIK z|GNybcdfHP#8JLd8??Z}{LT21hIP)%%iUHWLWyX+tybXKAG~^7TTj>!frw_cX>Rf7 zpF4bcLz42MD-?);ws=KXwSIgFc0b(t6P^&8Cve#e8pzHXVat?9dbecd}2 zGUY*E|GcKvy=Azse@-dwZHM^&lv|3I`&Zwea@z*3(Gz_CU}BSf|KJ+6v|+68?`|u$ z@9%CX+d3cd^Ea07wx7ST&V|f;IX@rC&qvDa)25r{=htnzNZe4ifS)g#Eo$E86^IY% ze*W|3jmMo4AV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pkTUg-E$--pEWNNbXHnshY z>)H70)YA2X@y=~=y*(Z~b1?o~dVKNByOyrE#r3$~FmzPP?~ zYRBY`xZV-hcfIB8`^`vP>-Rpq@4()BKey`(Uz+?6RYPja literal 0 HcmV?d00001 diff --git a/spec/fixtures/imageB.tif b/spec/fixtures/imageB.tif new file mode 100644 index 0000000000000000000000000000000000000000..e9998ffdfb123bf0d207f4d07fe1ede972db142b GIT binary patch literal 230714 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 XyLN2;`Lz$;y<^+8Kiu@AAD8|I6it&o literal 0 HcmV?d00001 diff --git a/spec/fixtures/library-devil.tiff b/spec/fixtures/library-devil.tiff deleted file mode 100644 index 571143cf6de21f75ac2df448cf944e3514268583..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10032 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 W_+0k&>&N=9Uq3fM@uvU~CHx;%4yTp? diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index 87f4e8c0..ae3ad638 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -22,10 +22,10 @@ let(:object) { TestContent.new(pid: 'test:1') } before { allow(helper).to receive(:current_object) { object } } context "object has content" do - before { object.upload File.new(File.join(Rails.root, "spec", "fixtures", "library-devil.tiff")) } + before { object.upload File.new(File.join(Rails.root, "spec", "fixtures", "imageA.tif")) } context "object has original filename" do it "should return the original file name" do - expect(helper.original_filename_info).to include(value: 'library-devil.tiff', context: 'info') + expect(helper.original_filename_info).to include(value: 'imageA.tif', context: 'info') end end context "object does not have original filename" do diff --git a/spec/scripts/batch_processor_spec.rb b/spec/scripts/batch_processor_spec.rb index 16631e9f..909f37ca 100644 --- a/spec/scripts/batch_processor_spec.rb +++ b/spec/scripts/batch_processor_spec.rb @@ -139,7 +139,7 @@ module DulHydra::Batch::Scripts let(:batch) { FactoryGirl.create(:batch_with_basic_update_batch_object) } let(:repo_object) do r_obj = TestModelOmnibus.new(:pid => batch.batch_objects.first.pid, :label => 'Object Label') - r_obj.add_file("#{Rails.root}/spec/fixtures/library-devil.tiff", Ddr::Datastreams::CONTENT) + r_obj.add_file("#{Rails.root}/spec/fixtures/imageA.tif", Ddr::Datastreams::CONTENT) r_obj.save r_obj end diff --git a/spec/scripts/manifest_maker_spec.rb b/spec/scripts/manifest_maker_spec.rb index c7e72f0a..e02d63c1 100644 --- a/spec/scripts/manifest_maker_spec.rb +++ b/spec/scripts/manifest_maker_spec.rb @@ -17,8 +17,8 @@ module DulHydra::Batch::Scripts end it "should create an appropriate manifest file" do expect(manifest.datastream_extension('content')).to eql(ext) - expect(object_identifiers).to include('image1') - expect(object_identifiers).to include('image2') + expect(object_identifiers).to include('imageA') + expect(object_identifiers).to include('imageB') expect(object_identifiers).to_not include('sample') expect(content_locations).to eql(file_locations) end @@ -27,23 +27,23 @@ module DulHydra::Batch::Scripts describe ManifestMaker do let(:test_dir) { Dir.mktmpdir("dul_hydra_test") } let(:source_path) { File.join(test_dir, 'source') } - let(:ext) { '.tiff' } + let(:ext) { '.tif' } let(:file_locations) { Hash.new } let(:manifest_file) { File.join(test_dir, 'manifest.yml') } let(:log_dir) { test_dir } before do FileUtils.mkdir(source_path) - FileUtils.cp File.join(Rails.root, 'spec', 'fixtures', 'image1.tiff'), source_path + FileUtils.cp File.join(Rails.root, 'spec', 'fixtures', 'imageA.tif'), source_path FileUtils.cp File.join(Rails.root, 'spec', 'fixtures', 'sample.pdf'), source_path - file_locations['image1'] = File.join(source_path, 'image1.tiff') + file_locations['imageA'] = File.join(source_path, 'imageA.tif') end after do FileUtils.remove_dir test_dir end context "non-recursive" do before do - FileUtils.cp File.join(Rails.root, 'spec', 'fixtures', 'image2.tiff'), source_path - file_locations['image2'] = File.join(source_path, 'image2.tiff') + FileUtils.cp File.join(Rails.root, 'spec', 'fixtures', 'imageB.tif'), source_path + file_locations['imageB'] = File.join(source_path, 'imageB.tif') end context "execute" do let(:mm) { DulHydra::Batch::Scripts::ManifestMaker.new(:dirpath => source_path, :manifest => manifest_file, :log_dir => log_dir, :extension => ext) } @@ -57,8 +57,8 @@ module DulHydra::Batch::Scripts let(:source_path_subdir) { File.join(source_path, 'subdir') } before do FileUtils.mkdir(source_path_subdir) - FileUtils.cp File.join(Rails.root, 'spec', 'fixtures', 'image2.tiff'), source_path_subdir - file_locations['image2'] = File.join(source_path_subdir, 'image2.tiff') + FileUtils.cp File.join(Rails.root, 'spec', 'fixtures', 'imageB.tif'), source_path_subdir + file_locations['imageB'] = File.join(source_path_subdir, 'imageB.tif') end context "execute" do let(:mm) { DulHydra::Batch::Scripts::ManifestMaker.new(:dirpath => source_path, :manifest => manifest_file, :log_dir => log_dir, :extension => ext) } diff --git a/spec/support/collections_controller_spec_helper.rb b/spec/support/collections_controller_spec_helper.rb index 4295c454..0a8c9fb3 100644 --- a/spec/support/collections_controller_spec_helper.rb +++ b/spec/support/collections_controller_spec_helper.rb @@ -5,11 +5,11 @@ def component_solr_doc_array end def component_solr_hash_array - [ {"system_create_dtsi"=>"2015-04-07T19:04:19Z", "system_modified_dtsi"=>"2015-04-07T19:04:22Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Component", "id"=>"changeme:514", "object_profile_ssm"=>["{\"datastreams\":{\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-04-07T19:04:22Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":420,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:514+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"5b8d8c31c079c71122da52b6279270be81c9985a6bed87ea1e6aa0f242d39e20\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:22Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":157,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:514+descMetadata+descMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"e7947a36309c4c07305f0d8dd1f1a796b3bc8bb1fe9b820b81ef9e9651cdf228\"},\"rightsMetadata\":{},\"properties\":{},\"thumbnail\":{\"dsLabel\":\"Thumbnail for this object\",\"dsVersionID\":\"thumbnail.0\",\"dsCreateDate\":\"2015-04-07T19:04:20Z\",\"dsState\":\"A\",\"dsMIME\":\"image/png\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":9857,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:514+thumbnail+thumbnail.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"6fef8f418dd099081e5208113d02898f6cca11c5ff1f32f8bfb9b0cecdef72d4\"},\"adminMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"adminMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:22Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":101,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:514+adminMetadata+adminMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"f10b62bb1da58236e2a5dae38db75c30c07e888eb37db7a73ca795d5c6981e13\"},\"content\":{\"dsLabel\":\"library-devil.tiff\",\"dsVersionID\":\"content.0\",\"dsCreateDate\":\"2015-04-07T19:04:19Z\",\"dsState\":\"A\",\"dsMIME\":\"image/tiff\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":10032,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:514+content+content.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"dea56f15b309e47b74fa24797f85245dda0ca3d274644a96804438bbd659555a\"},\"structMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"structMetadata.1\",\"dsCreateDate\":\"2015-04-07T19:04:22Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":314,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:514+structMetadata+structMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"9037f07124368677f8ea8f527a18f525cea9439d1e11e7bc342acc0ccb0b4617\"}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-04-07T19:04:19Z\",\"objLastModDate\":\"2015-04-07T19:04:19Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A514/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A514/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "identifier_tesim"=>["cmp00001"], "title_tesim"=>["Test Component"], "admin_metadata__original_filename_ssi"=>"library-devil.tiff", "struct_metadata__file_use_ssi"=>"master", "struct_metadata__order_isi"=>1, "struct_metadata__file_group_ssi"=>"cmp00001", "has_model_ssim"=>["info:fedora/afmodel:Component"], "is_part_of_ssim"=>["info:fedora/changeme:511"], "title_ssi"=>"Test Component", "internal_uri_ssi"=>"info:fedora/changeme:514", "identifier_ssi"=>"cmp00001", "last_virus_check_on_dtsi"=>"2015-04-07T19:04:18.943Z", "last_virus_check_outcome_ssim"=>["failure"], "content_size_isi"=>10032, "content_size_human_ssim"=>["9.8 KB"], "content_media_type_ssim"=>["image/tiff"], "collection_uri_ssim"=>["info:fedora/changeme:510"], "_version_"=>1497821047093723136, "timestamp"=>"2015-04-07T19:04:23.186Z"}, - {"system_create_dtsi"=>"2015-04-07T19:04:21Z", "system_modified_dtsi"=>"2015-04-07T19:04:23Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Component", "id"=>"changeme:515", "object_profile_ssm"=>["{\"datastreams\":{\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-04-07T19:04:23Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":420,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:515+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"758386d73cd1b43c2618ab1df3e1d9cba117a6ea32e76a8509d9fc950471ab90\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:23Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":157,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:515+descMetadata+descMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"c24a0133854c88d62d59482daabd1da96a627eb51f47b96ae4055d5417dc405e\"},\"rightsMetadata\":{},\"properties\":{},\"thumbnail\":{\"dsLabel\":\"Thumbnail for this object\",\"dsVersionID\":\"thumbnail.0\",\"dsCreateDate\":\"2015-04-07T19:04:22Z\",\"dsState\":\"A\",\"dsMIME\":\"image/png\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":9857,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:515+thumbnail+thumbnail.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"109ba9b2501e6e3f4311f991336565ada86f7ffba0ec4c4fb479b57c2c8e189a\"},\"adminMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"adminMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:23Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":101,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:515+adminMetadata+adminMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"d2514424ca763012f9de68d7b6b9c7102fffdbe59b1797023e7459e6d1881392\"},\"content\":{\"dsLabel\":\"library-devil.tiff\",\"dsVersionID\":\"content.0\",\"dsCreateDate\":\"2015-04-07T19:04:21Z\",\"dsState\":\"A\",\"dsMIME\":\"image/tiff\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":10032,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:515+content+content.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"dea56f15b309e47b74fa24797f85245dda0ca3d274644a96804438bbd659555a\"},\"structMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"structMetadata.1\",\"dsCreateDate\":\"2015-04-07T19:04:23Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":314,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:515+structMetadata+structMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"3fd6a044254f7f955851599cae9ce31e685939922f9c61d2cfc9586ae496ce81\"}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-04-07T19:04:21Z\",\"objLastModDate\":\"2015-04-07T19:04:21Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A515/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A515/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "identifier_tesim"=>["cmp00002"], "title_tesim"=>["Test Component"], "admin_metadata__original_filename_ssi"=>"library-devil.tiff", "struct_metadata__file_use_ssi"=>"master", "struct_metadata__order_isi"=>1, "struct_metadata__file_group_ssi"=>"cmp00002", "has_model_ssim"=>["info:fedora/afmodel:Component"], "is_part_of_ssim"=>["info:fedora/changeme:511"], "title_ssi"=>"Test Component", "internal_uri_ssi"=>"info:fedora/changeme:515", "identifier_ssi"=>"cmp00002", "last_virus_check_on_dtsi"=>"2015-04-07T19:04:21.152Z", "last_virus_check_outcome_ssim"=>["failure"], "content_size_isi"=>10032, "content_size_human_ssim"=>["9.8 KB"], "content_media_type_ssim"=>["image/tiff"], "collection_uri_ssim"=>["info:fedora/changeme:510"], "_version_"=>1497821047634788352, "timestamp"=>"2015-04-07T19:04:23.702Z"}, - {"system_create_dtsi"=>"2015-04-07T19:04:24Z", "system_modified_dtsi"=>"2015-04-07T19:04:27Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Component", "id"=>"changeme:516", "object_profile_ssm"=>["{\"datastreams\":{\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-04-07T19:04:27Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":420,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:516+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"c9c1d50dbdde0df59d63b54b978067f60190e1c474d807b31ed676905e0534b4\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:27Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":157,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:516+descMetadata+descMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"49e8f968051349da13e581d4f5a648d44ddbe0496da872c9805d31abc7a0a450\"},\"rightsMetadata\":{},\"properties\":{},\"thumbnail\":{\"dsLabel\":\"Thumbnail for this object\",\"dsVersionID\":\"thumbnail.0\",\"dsCreateDate\":\"2015-04-07T19:04:24Z\",\"dsState\":\"A\",\"dsMIME\":\"image/png\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":9857,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:516+thumbnail+thumbnail.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"665c3e947b69ed94570e3714bbbe86e7ff154a1d45d4ed268e81c7c0ccbd97f0\"},\"adminMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"adminMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:27Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":101,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:516+adminMetadata+adminMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"88e58ece18c7865154a6be823144818c45a4c2af5b65f5b846f68757fdcfbb64\"},\"content\":{\"dsLabel\":\"library-devil.tiff\",\"dsVersionID\":\"content.0\",\"dsCreateDate\":\"2015-04-07T19:04:24Z\",\"dsState\":\"A\",\"dsMIME\":\"image/tiff\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":10032,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:516+content+content.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"dea56f15b309e47b74fa24797f85245dda0ca3d274644a96804438bbd659555a\"},\"structMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"structMetadata.1\",\"dsCreateDate\":\"2015-04-07T19:04:27Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":314,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:516+structMetadata+structMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"1f785f34f0b0165542341cc07b280eb6dee43543163f180c16c034598d249d60\"}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-04-07T19:04:24Z\",\"objLastModDate\":\"2015-04-07T19:04:24Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A516/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A516/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "identifier_tesim"=>["cmp00003"], "title_tesim"=>["Test Component"], "admin_metadata__original_filename_ssi"=>"library-devil.tiff", "struct_metadata__file_use_ssi"=>"master", "struct_metadata__order_isi"=>1, "struct_metadata__file_group_ssi"=>"cmp00003", "has_model_ssim"=>["info:fedora/afmodel:Component"], "is_part_of_ssim"=>["info:fedora/changeme:512"], "title_ssi"=>"Test Component", "internal_uri_ssi"=>"info:fedora/changeme:516", "identifier_ssi"=>"cmp00003", "last_virus_check_on_dtsi"=>"2015-04-07T19:04:24.063Z", "last_virus_check_outcome_ssim"=>["failure"], "content_size_isi"=>10032, "content_size_human_ssim"=>["9.8 KB"], "content_media_type_ssim"=>["image/tiff"], "collection_uri_ssim"=>["info:fedora/changeme:510"], "_version_"=>1497821051641397248, "timestamp"=>"2015-04-07T19:04:27.523Z"}, - {"system_create_dtsi"=>"2015-04-07T19:04:25Z", "system_modified_dtsi"=>"2015-04-07T19:04:27Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Component", "id"=>"changeme:517", "object_profile_ssm"=>["{\"datastreams\":{\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-04-07T19:04:27Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":420,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:517+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"1536f5fa25fb5a3f9d5f629dd085ae40956dc2ee06ce626ae962b875fd56fbff\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:27Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":157,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:517+descMetadata+descMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"247c2af6d5f682ecad7f9370a7abeea563656402b2d13a877807a61ed45ade6f\"},\"rightsMetadata\":{},\"properties\":{},\"thumbnail\":{\"dsLabel\":\"Thumbnail for this object\",\"dsVersionID\":\"thumbnail.0\",\"dsCreateDate\":\"2015-04-07T19:04:26Z\",\"dsState\":\"A\",\"dsMIME\":\"image/png\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":9857,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:517+thumbnail+thumbnail.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"713a6448548728d2856799961d5c0f8bd287cc93b2a95f1621551f48206e3e89\"},\"adminMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"adminMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:27Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":101,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:517+adminMetadata+adminMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"e006faca08b08a6a43e584bbc9277ecc1987652dd666c8d576a00d8091216664\"},\"content\":{\"dsLabel\":\"library-devil.tiff\",\"dsVersionID\":\"content.0\",\"dsCreateDate\":\"2015-04-07T19:04:26Z\",\"dsState\":\"A\",\"dsMIME\":\"image/tiff\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":10032,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:517+content+content.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"dea56f15b309e47b74fa24797f85245dda0ca3d274644a96804438bbd659555a\"},\"structMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"structMetadata.1\",\"dsCreateDate\":\"2015-04-07T19:04:27Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":314,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:517+structMetadata+structMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"a983b38d8affd0b850599e512e6d0bfe2c4375204cde04b2463cedb7e6c09b9a\"}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-04-07T19:04:25Z\",\"objLastModDate\":\"2015-04-07T19:04:25Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A517/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A517/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "identifier_tesim"=>["cmp00004"], "title_tesim"=>["Test Component"], "admin_metadata__original_filename_ssi"=>"library-devil.tiff", "struct_metadata__file_use_ssi"=>"master", "struct_metadata__order_isi"=>1, "struct_metadata__file_group_ssi"=>"cmp00004", "has_model_ssim"=>["info:fedora/afmodel:Component"], "is_part_of_ssim"=>["info:fedora/changeme:512"], "title_ssi"=>"Test Component", "internal_uri_ssi"=>"info:fedora/changeme:517", "identifier_ssi"=>"cmp00004", "last_virus_check_on_dtsi"=>"2015-04-07T19:04:25.619Z", "last_virus_check_outcome_ssim"=>["failure"], "content_size_isi"=>10032, "content_size_human_ssim"=>["9.8 KB"], "content_media_type_ssim"=>["image/tiff"], "collection_uri_ssim"=>["info:fedora/changeme:510"], "_version_"=>1497821052104867840, "timestamp"=>"2015-04-07T19:04:27.965Z"}, - {"system_create_dtsi"=>"2015-04-07T19:04:28Z", "system_modified_dtsi"=>"2015-04-07T19:04:31Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Component", "id"=>"changeme:518", "object_profile_ssm"=>["{\"datastreams\":{\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-04-07T19:04:31Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":420,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:518+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"4bc9c24e4a469ae085bdaf9ac990a33e660279796f68ee9940b6b6fdf8d19701\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:31Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":157,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:518+descMetadata+descMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"c43193e5cf5b7d0e85f4e3c30e9bd36be71cac82cbae34e22456fdf335f200ec\"},\"rightsMetadata\":{},\"properties\":{},\"thumbnail\":{\"dsLabel\":\"Thumbnail for this object\",\"dsVersionID\":\"thumbnail.0\",\"dsCreateDate\":\"2015-04-07T19:04:29Z\",\"dsState\":\"A\",\"dsMIME\":\"image/png\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":9857,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:518+thumbnail+thumbnail.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"acd21ac6beab40a2cdab445944e9c0c83f3bf3ebfbff35b55c464d0f4814415f\"},\"adminMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"adminMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:31Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":101,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:518+adminMetadata+adminMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"300fba68947c3312f5ea8dbf5d98c3a32b8d3378aa404dbdc7cf655473a94d31\"},\"content\":{\"dsLabel\":\"library-devil.tiff\",\"dsVersionID\":\"content.0\",\"dsCreateDate\":\"2015-04-07T19:04:28Z\",\"dsState\":\"A\",\"dsMIME\":\"image/tiff\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":10032,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:518+content+content.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"dea56f15b309e47b74fa24797f85245dda0ca3d274644a96804438bbd659555a\"},\"structMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"structMetadata.1\",\"dsCreateDate\":\"2015-04-07T19:04:31Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":314,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:518+structMetadata+structMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"e4f593a45f677657ac2232bc519072a2c6643ef87dda1d3ec3bf70634c12b474\"}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-04-07T19:04:28Z\",\"objLastModDate\":\"2015-04-07T19:04:28Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A518/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A518/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "identifier_tesim"=>["cmp00005"], "title_tesim"=>["Test Component"], "admin_metadata__original_filename_ssi"=>"library-devil.tiff", "struct_metadata__file_use_ssi"=>"master", "struct_metadata__order_isi"=>1, "struct_metadata__file_group_ssi"=>"cmp00005", "has_model_ssim"=>["info:fedora/afmodel:Component"], "is_part_of_ssim"=>["info:fedora/changeme:513"], "title_ssi"=>"Test Component", "internal_uri_ssi"=>"info:fedora/changeme:518", "identifier_ssi"=>"cmp00005", "last_virus_check_on_dtsi"=>"2015-04-07T19:04:28.238Z", "last_virus_check_outcome_ssim"=>["failure"], "content_size_isi"=>10032, "content_size_human_ssim"=>["9.8 KB"], "content_media_type_ssim"=>["image/tiff"], "collection_uri_ssim"=>["info:fedora/changeme:510"], "_version_"=>1497821056138739712, "timestamp"=>"2015-04-07T19:04:31.812Z"}, - {"system_create_dtsi"=>"2015-04-07T19:04:30Z", "system_modified_dtsi"=>"2015-04-07T19:04:32Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Component", "id"=>"changeme:519", "object_profile_ssm"=>["{\"datastreams\":{\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-04-07T19:04:31Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":420,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:519+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"6ed5f7315fb72f4a24c1d1d22805843d327caad135bfb39f2348b969e0c8b773\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:31Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":157,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:519+descMetadata+descMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"2d8ac941c9131db2290fe0f7b5a60d6abfb7c5ce3022c71d96ac67eb9de0bfc3\"},\"rightsMetadata\":{},\"properties\":{},\"thumbnail\":{\"dsLabel\":\"Thumbnail for this object\",\"dsVersionID\":\"thumbnail.0\",\"dsCreateDate\":\"2015-04-07T19:04:30Z\",\"dsState\":\"A\",\"dsMIME\":\"image/png\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":9857,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:519+thumbnail+thumbnail.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"384c244d65a0969cca2c17ee8a7d4df07f50a8d757ad0e10ed066adcf44875f3\"},\"adminMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"adminMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:31Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":101,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:519+adminMetadata+adminMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"70721f5824f9588005b3c5e13e32f83f92744deeb3ee0f35fcd7048f11e6d7a1\"},\"content\":{\"dsLabel\":\"library-devil.tiff\",\"dsVersionID\":\"content.0\",\"dsCreateDate\":\"2015-04-07T19:04:30Z\",\"dsState\":\"A\",\"dsMIME\":\"image/tiff\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":10032,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:519+content+content.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"dea56f15b309e47b74fa24797f85245dda0ca3d274644a96804438bbd659555a\"},\"structMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"structMetadata.1\",\"dsCreateDate\":\"2015-04-07T19:04:32Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":314,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:519+structMetadata+structMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"87f30e39f9dd10c972b8e2fcb906c904c4db007629d2f67e793c7e9b36d9f61b\"}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-04-07T19:04:30Z\",\"objLastModDate\":\"2015-04-07T19:04:30Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A519/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A519/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "identifier_tesim"=>["cmp00006"], "title_tesim"=>["Test Component"], "admin_metadata__original_filename_ssi"=>"library-devil.tiff", "struct_metadata__file_use_ssi"=>"master", "struct_metadata__order_isi"=>1, "struct_metadata__file_group_ssi"=>"cmp00006", "has_model_ssim"=>["info:fedora/afmodel:Component"], "is_part_of_ssim"=>["info:fedora/changeme:513"], "title_ssi"=>"Test Component", "internal_uri_ssi"=>"info:fedora/changeme:519", "identifier_ssi"=>"cmp00006", "last_virus_check_on_dtsi"=>"2015-04-07T19:04:29.92Z", "last_virus_check_outcome_ssim"=>["failure"], "content_size_isi"=>10032, "content_size_human_ssim"=>["9.8 KB"], "content_media_type_ssim"=>["image/tiff"], "collection_uri_ssim"=>["info:fedora/changeme:510"], "_version_"=>1497821056614793216, "timestamp"=>"2015-04-07T19:04:32.265Z"} + [ {"system_create_dtsi"=>"2015-04-07T19:04:19Z", "system_modified_dtsi"=>"2015-04-07T19:04:22Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Component", "id"=>"changeme:514", "object_profile_ssm"=>["{\"datastreams\":{\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-04-07T19:04:22Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":420,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:514+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"5b8d8c31c079c71122da52b6279270be81c9985a6bed87ea1e6aa0f242d39e20\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:22Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":157,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:514+descMetadata+descMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"e7947a36309c4c07305f0d8dd1f1a796b3bc8bb1fe9b820b81ef9e9651cdf228\"},\"rightsMetadata\":{},\"properties\":{},\"thumbnail\":{\"dsLabel\":\"Thumbnail for this object\",\"dsVersionID\":\"thumbnail.0\",\"dsCreateDate\":\"2015-04-07T19:04:20Z\",\"dsState\":\"A\",\"dsMIME\":\"image/png\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":9857,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:514+thumbnail+thumbnail.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"6fef8f418dd099081e5208113d02898f6cca11c5ff1f32f8bfb9b0cecdef72d4\"},\"adminMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"adminMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:22Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":101,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:514+adminMetadata+adminMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"f10b62bb1da58236e2a5dae38db75c30c07e888eb37db7a73ca795d5c6981e13\"},\"content\":{\"dsLabel\":\"imageA.tif\",\"dsVersionID\":\"content.0\",\"dsCreateDate\":\"2015-04-07T19:04:19Z\",\"dsState\":\"A\",\"dsMIME\":\"image/tiff\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":230714,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:514+content+content.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"8b9c3b1eba7a83977eea128cc208e341416aa4a0979e36d8abeeb57790ddc8db\"},\"structMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"structMetadata.1\",\"dsCreateDate\":\"2015-04-07T19:04:22Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":314,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:514+structMetadata+structMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"9037f07124368677f8ea8f527a18f525cea9439d1e11e7bc342acc0ccb0b4617\"}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-04-07T19:04:19Z\",\"objLastModDate\":\"2015-04-07T19:04:19Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A514/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A514/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "identifier_tesim"=>["cmp00001"], "title_tesim"=>["Test Component"], "admin_metadata__original_filename_ssi"=>"imageA.tif", "struct_metadata__file_use_ssi"=>"master", "struct_metadata__order_isi"=>1, "struct_metadata__file_group_ssi"=>"cmp00001", "has_model_ssim"=>["info:fedora/afmodel:Component"], "is_part_of_ssim"=>["info:fedora/changeme:511"], "title_ssi"=>"Test Component", "internal_uri_ssi"=>"info:fedora/changeme:514", "identifier_ssi"=>"cmp00001", "last_virus_check_on_dtsi"=>"2015-04-07T19:04:18.943Z", "last_virus_check_outcome_ssim"=>["failure"], "content_size_isi"=>10032, "content_size_human_ssim"=>["9.8 KB"], "content_media_type_ssim"=>["image/tiff"], "collection_uri_ssim"=>["info:fedora/changeme:510"], "_version_"=>1497821047093723136, "timestamp"=>"2015-04-07T19:04:23.186Z"}, + {"system_create_dtsi"=>"2015-04-07T19:04:21Z", "system_modified_dtsi"=>"2015-04-07T19:04:23Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Component", "id"=>"changeme:515", "object_profile_ssm"=>["{\"datastreams\":{\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-04-07T19:04:23Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":420,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:515+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"758386d73cd1b43c2618ab1df3e1d9cba117a6ea32e76a8509d9fc950471ab90\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:23Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":157,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:515+descMetadata+descMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"c24a0133854c88d62d59482daabd1da96a627eb51f47b96ae4055d5417dc405e\"},\"rightsMetadata\":{},\"properties\":{},\"thumbnail\":{\"dsLabel\":\"Thumbnail for this object\",\"dsVersionID\":\"thumbnail.0\",\"dsCreateDate\":\"2015-04-07T19:04:22Z\",\"dsState\":\"A\",\"dsMIME\":\"image/png\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":9857,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:515+thumbnail+thumbnail.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"109ba9b2501e6e3f4311f991336565ada86f7ffba0ec4c4fb479b57c2c8e189a\"},\"adminMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"adminMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:23Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":101,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:515+adminMetadata+adminMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"d2514424ca763012f9de68d7b6b9c7102fffdbe59b1797023e7459e6d1881392\"},\"content\":{\"dsLabel\":\"imageA.tif\",\"dsVersionID\":\"content.0\",\"dsCreateDate\":\"2015-04-07T19:04:21Z\",\"dsState\":\"A\",\"dsMIME\":\"image/tiff\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":230714,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:515+content+content.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"8b9c3b1eba7a83977eea128cc208e341416aa4a0979e36d8abeeb57790ddc8db\"},\"structMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"structMetadata.1\",\"dsCreateDate\":\"2015-04-07T19:04:23Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":314,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:515+structMetadata+structMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"3fd6a044254f7f955851599cae9ce31e685939922f9c61d2cfc9586ae496ce81\"}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-04-07T19:04:21Z\",\"objLastModDate\":\"2015-04-07T19:04:21Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A515/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A515/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "identifier_tesim"=>["cmp00002"], "title_tesim"=>["Test Component"], "admin_metadata__original_filename_ssi"=>"imageA.tif", "struct_metadata__file_use_ssi"=>"master", "struct_metadata__order_isi"=>1, "struct_metadata__file_group_ssi"=>"cmp00002", "has_model_ssim"=>["info:fedora/afmodel:Component"], "is_part_of_ssim"=>["info:fedora/changeme:511"], "title_ssi"=>"Test Component", "internal_uri_ssi"=>"info:fedora/changeme:515", "identifier_ssi"=>"cmp00002", "last_virus_check_on_dtsi"=>"2015-04-07T19:04:21.152Z", "last_virus_check_outcome_ssim"=>["failure"], "content_size_isi"=>10032, "content_size_human_ssim"=>["9.8 KB"], "content_media_type_ssim"=>["image/tiff"], "collection_uri_ssim"=>["info:fedora/changeme:510"], "_version_"=>1497821047634788352, "timestamp"=>"2015-04-07T19:04:23.702Z"}, + {"system_create_dtsi"=>"2015-04-07T19:04:24Z", "system_modified_dtsi"=>"2015-04-07T19:04:27Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Component", "id"=>"changeme:516", "object_profile_ssm"=>["{\"datastreams\":{\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-04-07T19:04:27Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":420,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:516+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"c9c1d50dbdde0df59d63b54b978067f60190e1c474d807b31ed676905e0534b4\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:27Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":157,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:516+descMetadata+descMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"49e8f968051349da13e581d4f5a648d44ddbe0496da872c9805d31abc7a0a450\"},\"rightsMetadata\":{},\"properties\":{},\"thumbnail\":{\"dsLabel\":\"Thumbnail for this object\",\"dsVersionID\":\"thumbnail.0\",\"dsCreateDate\":\"2015-04-07T19:04:24Z\",\"dsState\":\"A\",\"dsMIME\":\"image/png\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":9857,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:516+thumbnail+thumbnail.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"665c3e947b69ed94570e3714bbbe86e7ff154a1d45d4ed268e81c7c0ccbd97f0\"},\"adminMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"adminMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:27Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":101,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:516+adminMetadata+adminMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"88e58ece18c7865154a6be823144818c45a4c2af5b65f5b846f68757fdcfbb64\"},\"content\":{\"dsLabel\":\"imageA.tif\",\"dsVersionID\":\"content.0\",\"dsCreateDate\":\"2015-04-07T19:04:24Z\",\"dsState\":\"A\",\"dsMIME\":\"image/tiff\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":230714,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:516+content+content.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"8b9c3b1eba7a83977eea128cc208e341416aa4a0979e36d8abeeb57790ddc8db\"},\"structMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"structMetadata.1\",\"dsCreateDate\":\"2015-04-07T19:04:27Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":314,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:516+structMetadata+structMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"1f785f34f0b0165542341cc07b280eb6dee43543163f180c16c034598d249d60\"}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-04-07T19:04:24Z\",\"objLastModDate\":\"2015-04-07T19:04:24Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A516/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A516/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "identifier_tesim"=>["cmp00003"], "title_tesim"=>["Test Component"], "admin_metadata__original_filename_ssi"=>"imageA.tif", "struct_metadata__file_use_ssi"=>"master", "struct_metadata__order_isi"=>1, "struct_metadata__file_group_ssi"=>"cmp00003", "has_model_ssim"=>["info:fedora/afmodel:Component"], "is_part_of_ssim"=>["info:fedora/changeme:512"], "title_ssi"=>"Test Component", "internal_uri_ssi"=>"info:fedora/changeme:516", "identifier_ssi"=>"cmp00003", "last_virus_check_on_dtsi"=>"2015-04-07T19:04:24.063Z", "last_virus_check_outcome_ssim"=>["failure"], "content_size_isi"=>10032, "content_size_human_ssim"=>["9.8 KB"], "content_media_type_ssim"=>["image/tiff"], "collection_uri_ssim"=>["info:fedora/changeme:510"], "_version_"=>1497821051641397248, "timestamp"=>"2015-04-07T19:04:27.523Z"}, + {"system_create_dtsi"=>"2015-04-07T19:04:25Z", "system_modified_dtsi"=>"2015-04-07T19:04:27Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Component", "id"=>"changeme:517", "object_profile_ssm"=>["{\"datastreams\":{\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-04-07T19:04:27Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":420,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:517+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"1536f5fa25fb5a3f9d5f629dd085ae40956dc2ee06ce626ae962b875fd56fbff\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:27Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":157,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:517+descMetadata+descMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"247c2af6d5f682ecad7f9370a7abeea563656402b2d13a877807a61ed45ade6f\"},\"rightsMetadata\":{},\"properties\":{},\"thumbnail\":{\"dsLabel\":\"Thumbnail for this object\",\"dsVersionID\":\"thumbnail.0\",\"dsCreateDate\":\"2015-04-07T19:04:26Z\",\"dsState\":\"A\",\"dsMIME\":\"image/png\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":9857,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:517+thumbnail+thumbnail.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"713a6448548728d2856799961d5c0f8bd287cc93b2a95f1621551f48206e3e89\"},\"adminMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"adminMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:27Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":101,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:517+adminMetadata+adminMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"e006faca08b08a6a43e584bbc9277ecc1987652dd666c8d576a00d8091216664\"},\"content\":{\"dsLabel\":\"imageA.tif\",\"dsVersionID\":\"content.0\",\"dsCreateDate\":\"2015-04-07T19:04:26Z\",\"dsState\":\"A\",\"dsMIME\":\"image/tiff\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":230714,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:517+content+content.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"8b9c3b1eba7a83977eea128cc208e341416aa4a0979e36d8abeeb57790ddc8db\"},\"structMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"structMetadata.1\",\"dsCreateDate\":\"2015-04-07T19:04:27Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":314,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:517+structMetadata+structMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"a983b38d8affd0b850599e512e6d0bfe2c4375204cde04b2463cedb7e6c09b9a\"}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-04-07T19:04:25Z\",\"objLastModDate\":\"2015-04-07T19:04:25Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A517/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A517/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "identifier_tesim"=>["cmp00004"], "title_tesim"=>["Test Component"], "admin_metadata__original_filename_ssi"=>"imageA.tif", "struct_metadata__file_use_ssi"=>"master", "struct_metadata__order_isi"=>1, "struct_metadata__file_group_ssi"=>"cmp00004", "has_model_ssim"=>["info:fedora/afmodel:Component"], "is_part_of_ssim"=>["info:fedora/changeme:512"], "title_ssi"=>"Test Component", "internal_uri_ssi"=>"info:fedora/changeme:517", "identifier_ssi"=>"cmp00004", "last_virus_check_on_dtsi"=>"2015-04-07T19:04:25.619Z", "last_virus_check_outcome_ssim"=>["failure"], "content_size_isi"=>10032, "content_size_human_ssim"=>["9.8 KB"], "content_media_type_ssim"=>["image/tiff"], "collection_uri_ssim"=>["info:fedora/changeme:510"], "_version_"=>1497821052104867840, "timestamp"=>"2015-04-07T19:04:27.965Z"}, + {"system_create_dtsi"=>"2015-04-07T19:04:28Z", "system_modified_dtsi"=>"2015-04-07T19:04:31Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Component", "id"=>"changeme:518", "object_profile_ssm"=>["{\"datastreams\":{\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-04-07T19:04:31Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":420,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:518+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"4bc9c24e4a469ae085bdaf9ac990a33e660279796f68ee9940b6b6fdf8d19701\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:31Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":157,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:518+descMetadata+descMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"c43193e5cf5b7d0e85f4e3c30e9bd36be71cac82cbae34e22456fdf335f200ec\"},\"rightsMetadata\":{},\"properties\":{},\"thumbnail\":{\"dsLabel\":\"Thumbnail for this object\",\"dsVersionID\":\"thumbnail.0\",\"dsCreateDate\":\"2015-04-07T19:04:29Z\",\"dsState\":\"A\",\"dsMIME\":\"image/png\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":9857,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:518+thumbnail+thumbnail.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"acd21ac6beab40a2cdab445944e9c0c83f3bf3ebfbff35b55c464d0f4814415f\"},\"adminMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"adminMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:31Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":101,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:518+adminMetadata+adminMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"300fba68947c3312f5ea8dbf5d98c3a32b8d3378aa404dbdc7cf655473a94d31\"},\"content\":{\"dsLabel\":\"imageA.tif\",\"dsVersionID\":\"content.0\",\"dsCreateDate\":\"2015-04-07T19:04:28Z\",\"dsState\":\"A\",\"dsMIME\":\"image/tiff\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":230714,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:518+content+content.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"8b9c3b1eba7a83977eea128cc208e341416aa4a0979e36d8abeeb57790ddc8db\"},\"structMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"structMetadata.1\",\"dsCreateDate\":\"2015-04-07T19:04:31Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":314,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:518+structMetadata+structMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"e4f593a45f677657ac2232bc519072a2c6643ef87dda1d3ec3bf70634c12b474\"}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-04-07T19:04:28Z\",\"objLastModDate\":\"2015-04-07T19:04:28Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A518/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A518/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "identifier_tesim"=>["cmp00005"], "title_tesim"=>["Test Component"], "admin_metadata__original_filename_ssi"=>"imageA.tif", "struct_metadata__file_use_ssi"=>"master", "struct_metadata__order_isi"=>1, "struct_metadata__file_group_ssi"=>"cmp00005", "has_model_ssim"=>["info:fedora/afmodel:Component"], "is_part_of_ssim"=>["info:fedora/changeme:513"], "title_ssi"=>"Test Component", "internal_uri_ssi"=>"info:fedora/changeme:518", "identifier_ssi"=>"cmp00005", "last_virus_check_on_dtsi"=>"2015-04-07T19:04:28.238Z", "last_virus_check_outcome_ssim"=>["failure"], "content_size_isi"=>10032, "content_size_human_ssim"=>["9.8 KB"], "content_media_type_ssim"=>["image/tiff"], "collection_uri_ssim"=>["info:fedora/changeme:510"], "_version_"=>1497821056138739712, "timestamp"=>"2015-04-07T19:04:31.812Z"}, + {"system_create_dtsi"=>"2015-04-07T19:04:30Z", "system_modified_dtsi"=>"2015-04-07T19:04:32Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Component", "id"=>"changeme:519", "object_profile_ssm"=>["{\"datastreams\":{\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-04-07T19:04:31Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":420,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:519+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"6ed5f7315fb72f4a24c1d1d22805843d327caad135bfb39f2348b969e0c8b773\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:31Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":157,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:519+descMetadata+descMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"2d8ac941c9131db2290fe0f7b5a60d6abfb7c5ce3022c71d96ac67eb9de0bfc3\"},\"rightsMetadata\":{},\"properties\":{},\"thumbnail\":{\"dsLabel\":\"Thumbnail for this object\",\"dsVersionID\":\"thumbnail.0\",\"dsCreateDate\":\"2015-04-07T19:04:30Z\",\"dsState\":\"A\",\"dsMIME\":\"image/png\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":9857,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:519+thumbnail+thumbnail.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"384c244d65a0969cca2c17ee8a7d4df07f50a8d757ad0e10ed066adcf44875f3\"},\"adminMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"adminMetadata.3\",\"dsCreateDate\":\"2015-04-07T19:04:31Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":101,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:519+adminMetadata+adminMetadata.3\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"70721f5824f9588005b3c5e13e32f83f92744deeb3ee0f35fcd7048f11e6d7a1\"},\"content\":{\"dsLabel\":\"imageA.tif\",\"dsVersionID\":\"content.0\",\"dsCreateDate\":\"2015-04-07T19:04:30Z\",\"dsState\":\"A\",\"dsMIME\":\"image/tiff\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":230714,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:519+content+content.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"8b9c3b1eba7a83977eea128cc208e341416aa4a0979e36d8abeeb57790ddc8db\"},\"structMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"structMetadata.1\",\"dsCreateDate\":\"2015-04-07T19:04:32Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":314,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:519+structMetadata+structMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"87f30e39f9dd10c972b8e2fcb906c904c4db007629d2f67e793c7e9b36d9f61b\"}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-04-07T19:04:30Z\",\"objLastModDate\":\"2015-04-07T19:04:30Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A519/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A519/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "identifier_tesim"=>["cmp00006"], "title_tesim"=>["Test Component"], "admin_metadata__original_filename_ssi"=>"imageA.tif", "struct_metadata__file_use_ssi"=>"master", "struct_metadata__order_isi"=>1, "struct_metadata__file_group_ssi"=>"cmp00006", "has_model_ssim"=>["info:fedora/afmodel:Component"], "is_part_of_ssim"=>["info:fedora/changeme:513"], "title_ssi"=>"Test Component", "internal_uri_ssi"=>"info:fedora/changeme:519", "identifier_ssi"=>"cmp00006", "last_virus_check_on_dtsi"=>"2015-04-07T19:04:29.92Z", "last_virus_check_outcome_ssim"=>["failure"], "content_size_isi"=>10032, "content_size_human_ssim"=>["9.8 KB"], "content_media_type_ssim"=>["image/tiff"], "collection_uri_ssim"=>["info:fedora/changeme:510"], "_version_"=>1497821056614793216, "timestamp"=>"2015-04-07T19:04:32.265Z"} ] end From b47658176466186f95282c0d8313e5c05c525fcf Mon Sep 17 00:00:00 2001 From: Jim Coble Date: Tue, 19 May 2015 15:05:21 -0400 Subject: [PATCH 02/10] update version --- lib/dul_hydra/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dul_hydra/version.rb b/lib/dul_hydra/version.rb index 70cdb808..cc48f8af 100644 --- a/lib/dul_hydra/version.rb +++ b/lib/dul_hydra/version.rb @@ -1,3 +1,3 @@ module DulHydra - VERSION = "3.2.0.rc2" + VERSION = "3.2.0.post" end From 713991e9e756c461ee1d656068968285295a5e68 Mon Sep 17 00:00:00 2001 From: Jim Coble Date: Tue, 26 May 2015 08:37:41 -0400 Subject: [PATCH 03/10] Upgrade ddr-models to 1.15.0; closes #1348 --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 245a90bb..4e2d5a48 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,7 @@ source 'http://rubygems.org' gem 'rails', '~> 4.1.6' gem 'hydra-head', '~> 7.2.0' gem 'ddr-alerts', '~> 1.0.0' -gem 'ddr-models', '~> 1.14.2' +gem 'ddr-models', '~> 1.15.0' gem 'rubydora', '>= 1.8.1' gem 'devise' gem 'deprecation' diff --git a/Gemfile.lock b/Gemfile.lock index c9f8b178..92bab9a2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -86,7 +86,7 @@ GEM rails (~> 4.1.6) ddr-antivirus (1.3.2) activesupport (~> 4.0) - ddr-models (1.14.2) + ddr-models (1.15.0) active-fedora (~> 7.0) ddr-antivirus (~> 1.3.1) devise (~> 3.4) @@ -290,7 +290,7 @@ GEM rdf-turtle (1.1.5) ebnf (~> 0.3, >= 0.3.6) rdf (~> 1.1, >= 1.1.4) - rdf-vocab (0.8.1) + rdf-vocab (0.8.3) rdf (~> 1.1, >= 1.1.10) rdf-xsd (1.1.2) rdf (~> 1.1) @@ -418,7 +418,7 @@ DEPENDENCIES coveralls database_cleaner ddr-alerts (~> 1.0.0) - ddr-models (~> 1.14.2) + ddr-models (~> 1.15.0) deprecation devise equivalent-xml From 8caa19fee0d88b0fc9a0f90005225ed0020aad59 Mon Sep 17 00:00:00 2001 From: Jim Coble Date: Tue, 26 May 2015 16:47:27 -0400 Subject: [PATCH 04/10] Update gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 6296a43a..ea743925 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,9 @@ # Environment configs /config/environments/*.rb +# Ignore certain translation files +/config/locales/admin_set.yml + # SimpleCov / Coveralls /coverage From 580ab3cd2720a948be3fc71313635258ed89dedc Mon Sep 17 00:00:00 2001 From: Jim Coble Date: Fri, 5 Jun 2015 10:50:09 -0400 Subject: [PATCH 05/10] Upgrade ddr-models to 1.16.0; closes #1350 --- Gemfile | 2 +- Gemfile.lock | 6 +++--- spec/scripts/batch_fixity_check_spec.rb | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 4e2d5a48..8e7c60ae 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,7 @@ source 'http://rubygems.org' gem 'rails', '~> 4.1.6' gem 'hydra-head', '~> 7.2.0' gem 'ddr-alerts', '~> 1.0.0' -gem 'ddr-models', '~> 1.15.0' +gem 'ddr-models', '~> 1.16.0' gem 'rubydora', '>= 1.8.1' gem 'devise' gem 'deprecation' diff --git a/Gemfile.lock b/Gemfile.lock index 92bab9a2..d9f87f0e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -86,7 +86,7 @@ GEM rails (~> 4.1.6) ddr-antivirus (1.3.2) activesupport (~> 4.0) - ddr-models (1.15.0) + ddr-models (1.16.0) active-fedora (~> 7.0) ddr-antivirus (~> 1.3.1) devise (~> 3.4) @@ -131,7 +131,7 @@ GEM rest-client (>= 1.6.1) haml (4.0.6) tilt - hashie (3.4.1) + hashie (3.4.2) hike (1.2.3) hooks (0.3.6) uber (~> 0.0.4) @@ -418,7 +418,7 @@ DEPENDENCIES coveralls database_cleaner ddr-alerts (~> 1.0.0) - ddr-models (~> 1.15.0) + ddr-models (~> 1.16.0) deprecation devise equivalent-xml diff --git a/spec/scripts/batch_fixity_check_spec.rb b/spec/scripts/batch_fixity_check_spec.rb index 79e53d63..7ce7d7bb 100644 --- a/spec/scripts/batch_fixity_check_spec.rb +++ b/spec/scripts/batch_fixity_check_spec.rb @@ -30,7 +30,7 @@ module Scripts end describe "the report" do let(:csv) { CSV.read(report.path, headers: true) } - let(:datastreams_with_content) { ["DC", "RELS-EXT", "descMetadata", "content", "thumbnail", "multiresImage", "adminMetadata", "structMetadata"] } + let(:datastreams_with_content) { ["DC", "RELS-EXT", "descMetadata", "content", "thumbnail", "adminMetadata", "structMetadata"] } before do @objects = FactoryGirl.create_list(:component, 5) bfc.execute From b028a81e99abaf00000b22c7ef4d773ff6cccd30 Mon Sep 17 00:00:00 2001 From: David Chandek-Stark Date: Fri, 5 Jun 2015 13:31:50 -0400 Subject: [PATCH 06/10] Restrict installation of therubyracer to production as a workaround of OSX gcc version headaches. --- Gemfile | 2 +- Gemfile.lock | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 4e2d5a48..6c6bc34d 100644 --- a/Gemfile +++ b/Gemfile @@ -16,7 +16,7 @@ gem 'resque-pool', '0.3.0' gem 'nest', '1.1.2' # ExecJS runtime -gem 'therubyracer', '~> 0.11.3', :require => 'v8' +gem 'therubyracer', '~> 0.11.3', require: 'v8', group: :production # For mapping file extensions to MIME types gem 'mime-types', '~> 1.19' diff --git a/Gemfile.lock b/Gemfile.lock index 92bab9a2..bafdab4b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -443,3 +443,6 @@ DEPENDENCIES sqlite3 therubyracer (~> 0.11.3) uglifier (~> 1.3.0) + +BUNDLED WITH + 1.10.2 From 547c5919aef9b8990d4a20e913ef41a4a1bee730 Mon Sep 17 00:00:00 2001 From: Jim Coble Date: Fri, 17 Apr 2015 15:55:55 -0400 Subject: [PATCH 07/10] Implement simple ingest format; closes #1326 --- Gemfile | 3 + Gemfile.lock | 8 +- app/models/filesystem.rb | 31 +++++ app/models/simple_ingest_checksum.rb | 32 +++++ app/models/simple_ingest_metadata.rb | 94 ++++++++++++++ .../build_batch_from_folder_ingest.rb | 102 ++++++++++++++++ app/services/inspect_simple_ingest.rb | 66 ++++++++++ app/services/model_simple_ingest_content.rb | 22 ++++ app/services/scan_filesystem.rb | 59 +++++++++ config/locales/en.yml | 2 + ...172238_change_value_from_string_to_text.rb | 11 ++ db/schema.rb | 4 +- lib/dul_hydra.rb | 1 + .../batch/scripts/process_simple_ingest.rb | 84 +++++++++++++ lib/dul_hydra/error.rb | 9 ++ lib/tasks/dul_hydra.rake | 10 ++ .../simple_ingest/bad-headers-metadata.txt | 3 + .../simple_ingest/example/bagit.txt | 2 + .../example/data/itemA/image1.tiff | Bin 0 -> 63538 bytes .../simple_ingest/example/data/metadata.txt | 4 + .../simple_ingest/example/manifest-sha256.txt | 1 + .../simple_ingest/manifest-sha256.txt | 5 + .../batch_ingest/simple_ingest/metadata.txt | 3 + spec/models/filesystem_spec.rb | 80 ++++++++++++ spec/models/simple_ingest_checksum_spec.rb | 16 +++ spec/models/simple_ingest_metadata_spec.rb | 63 ++++++++++ spec/scripts/process_simple_ingest_spec.rb | 57 +++++++++ .../build_batch_from_folder_ingest_spec.rb | 115 ++++++++++++++++++ spec/services/inspect_simple_ingest_spec.rb | 70 +++++++++++ .../model_simple_ingest_content_spec.rb | 58 +++++++++ spec/services/scan_filesystem_spec.rb | 37 ++++++ spec/spec_helper.rb | 1 + spec/support/ingest_folder_helper.rb | 66 ++++++++++ 33 files changed, 1114 insertions(+), 5 deletions(-) create mode 100644 app/models/filesystem.rb create mode 100644 app/models/simple_ingest_checksum.rb create mode 100644 app/models/simple_ingest_metadata.rb create mode 100644 app/services/build_batch_from_folder_ingest.rb create mode 100644 app/services/inspect_simple_ingest.rb create mode 100644 app/services/model_simple_ingest_content.rb create mode 100644 app/services/scan_filesystem.rb create mode 100644 db/migrate/20150608172238_change_value_from_string_to_text.rb create mode 100644 lib/dul_hydra/batch/scripts/process_simple_ingest.rb create mode 100644 lib/dul_hydra/error.rb create mode 100644 spec/fixtures/batch_ingest/simple_ingest/bad-headers-metadata.txt create mode 100644 spec/fixtures/batch_ingest/simple_ingest/example/bagit.txt create mode 100755 spec/fixtures/batch_ingest/simple_ingest/example/data/itemA/image1.tiff create mode 100644 spec/fixtures/batch_ingest/simple_ingest/example/data/metadata.txt create mode 100644 spec/fixtures/batch_ingest/simple_ingest/example/manifest-sha256.txt create mode 100644 spec/fixtures/batch_ingest/simple_ingest/manifest-sha256.txt create mode 100644 spec/fixtures/batch_ingest/simple_ingest/metadata.txt create mode 100644 spec/models/filesystem_spec.rb create mode 100644 spec/models/simple_ingest_checksum_spec.rb create mode 100644 spec/models/simple_ingest_metadata_spec.rb create mode 100644 spec/scripts/process_simple_ingest_spec.rb create mode 100644 spec/services/build_batch_from_folder_ingest_spec.rb create mode 100644 spec/services/inspect_simple_ingest_spec.rb create mode 100644 spec/services/model_simple_ingest_content_spec.rb create mode 100644 spec/services/scan_filesystem_spec.rb diff --git a/Gemfile b/Gemfile index 83f98332..1160324b 100644 --- a/Gemfile +++ b/Gemfile @@ -25,6 +25,9 @@ gem 'mime-types', '~> 1.19' gem 'rubyzip', '< 1.0.0' gem 'paperclip', '~> 4.2.0' +# Filesystem representation +gem 'rubytree' + group :development, :test do gem 'sqlite3' gem 'rspec-rails', '~> 3.0.0' diff --git a/Gemfile.lock b/Gemfile.lock index 6fff17c4..5bcf0a45 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -341,6 +341,9 @@ GEM mime-types nokogiri rest-client + rubytree (0.9.4) + json (~> 1.8) + structured_warnings (~> 0.1) rubyzip (0.9.9) sass (3.2.19) sass-rails (4.0.5) @@ -385,6 +388,7 @@ GEM sprockets (>= 2.8, < 4.0) sqlite3 (1.3.10) stomp (1.3.4) + structured_warnings (0.2.0) sxp (0.1.5) term-ansicolor (1.3.0) tins (~> 1.0) @@ -438,11 +442,9 @@ DEPENDENCIES resque-pool (= 0.3.0) rspec-rails (~> 3.0.0) rubydora (>= 1.8.1) + rubytree rubyzip (< 1.0.0) sass-rails (~> 4.0.1) sqlite3 therubyracer (~> 0.11.3) uglifier (~> 1.3.0) - -BUNDLED WITH - 1.10.2 diff --git a/app/models/filesystem.rb b/app/models/filesystem.rb new file mode 100644 index 00000000..5487b3e7 --- /dev/null +++ b/app/models/filesystem.rb @@ -0,0 +1,31 @@ +class Filesystem + + attr_accessor :tree + + def initialize(filepath='/') + @tree = Tree::TreeNode.new(filepath) + end + + def method_missing(sym, *args, &block) + @tree.send(sym, *args, &block) + end + + def self.path_to_node(node, type='full') + if node.is_root? + type == 'full' ? node.name : nil + else + start_idx = type == 'full' ? 0 : 1 + path_nodes = node.parentage.reverse.map(&:name)[start_idx..-1] + path_nodes.empty? ? node.name : File.join(path_nodes, node.name) + end + end + + def self.node_locator(node) + path_to_node(node, 'relative') + end + + def simple_ingest_filesystem? + !tree.each_leaf.any? { |leaf| leaf.node_depth != 2 } + end + +end \ No newline at end of file diff --git a/app/models/simple_ingest_checksum.rb b/app/models/simple_ingest_checksum.rb new file mode 100644 index 00000000..c7d143ed --- /dev/null +++ b/app/models/simple_ingest_checksum.rb @@ -0,0 +1,32 @@ +class SimpleIngestChecksum + + attr_reader :checksum_filepath + + DATA_PREFIX = 'data' + + def initialize(checksum_filepath) + @checksum_filepath = checksum_filepath + @checksum_hash = {} + end + + def checksum(relative_filepath) + checksums[File.join(DATA_PREFIX, relative_filepath)] + end + + private + + def checksums + if @checksum_hash.empty? + begin + File.open(checksum_filepath, 'r') do |file| + file.each_line do |line| + sum, path = line.split + @checksum_hash[path] = sum + end + end + end + end + @checksum_hash + end + +end \ No newline at end of file diff --git a/app/models/simple_ingest_metadata.rb b/app/models/simple_ingest_metadata.rb new file mode 100644 index 00000000..23b03131 --- /dev/null +++ b/app/models/simple_ingest_metadata.rb @@ -0,0 +1,94 @@ +class SimpleIngestMetadata + + attr_reader :metadata_filepath, :metadata_profile + + DATA_PREFIX = 'data' + + # Used in accommodation of case and spacing errors in column headings + NORMALIZED_TERMS = Ddr::Vocab::Vocabulary.term_names(RDF::DC).map(&:downcase).map(&:to_s) + + def initialize(metadata_filepath, metadata_profile) + @metadata_filepath = metadata_filepath + @metadata_profile = metadata_profile + validate_headers + end + + def metadata(locator) + metadata = {} + loc = locator.present? ? File.join(DATA_PREFIX, locator) : DATA_PREFIX + if metadata_grid[loc] + metadata_grid[loc].each do |heading, field_contents| + unless field_contents.blank? + metadata = add_field_to_metadata(metadata, heading, field_contents) + end + end + end + metadata + end + + private + + def add_field_to_metadata(metadata, heading, field_contents) + metadata[heading] ||= [] + metadata[heading] += Array(parse_field_contents(heading, field_contents)) + metadata + end + + def parse_field_contents(heading, field_contents) + if field_contents && repeatable_fields.include?(heading) + field_contents.split(repeating_fields_separator).map(&:strip) + else + field_contents + end + end + + def validate_headers + invalid_headers = [] + as_csv_table.headers[1..-1].each do |header| + invalid_headers << header unless valid_header?(header) + end + unless invalid_headers.empty? + raise ArgumentError, "Invalid metadata terms in header row: #{invalid_headers.join(', ')}" + end + end + + def valid_header?(header) + NORMALIZED_TERMS.include?(normalize_header(header)) + end + + def normalize_header(header) + header.downcase.gsub(/\s+/, "") + end + + def metadata_grid + unless @metadata_grid + @metadata_grid = {} + as_csv_table.each do |row| + locator = row.field(0) + row.delete(0) + @metadata_grid[locator] = row + end + end + @metadata_grid + end + + def as_csv_table + @csv_table ||= CSV.read(metadata_filepath, metadata_profile[:csv]) + end + + def repeating_fields_separator + metadata_profile[:parse][:repeating_fields_separator] + end + + def repeatable_fields + metadata_profile[:parse][:repeatable_fields] + end + + # Accommodate case and spacing errors in column headings + CSV::HeaderConverters[:canonicalize] = lambda{ |h| + NORMALIZED_TERMS.index(h.downcase.gsub(/\s+/, "")) ? + Ddr::Vocab::Vocabulary.term_names(RDF::DC)[NORMALIZED_TERMS.index(h.downcase.gsub(/\s+/, ""))].to_s : + h + } + +end \ No newline at end of file diff --git a/app/services/build_batch_from_folder_ingest.rb b/app/services/build_batch_from_folder_ingest.rb new file mode 100644 index 00000000..bdab34e9 --- /dev/null +++ b/app/services/build_batch_from_folder_ingest.rb @@ -0,0 +1,102 @@ +class BuildBatchFromFolderIngest + + attr_reader :user, :filesystem, :content_modeler, :metadata_provider, :checksum_provider, :batch_name, :batch_description + attr_accessor :batch, :collection_pid + + def initialize(user, filesystem, content_modeler, metadata_provider, checksum_provider, batch_name=nil, batch_description=nil ) + @user = user + @filesystem = filesystem + @content_modeler = content_modeler + @metadata_provider = metadata_provider + @checksum_provider = checksum_provider + @batch_name = batch_name + @batch_description = batch_description + end + + def call + @batch = create_batch + traverse_filesystem + batch.update_attributes(status: DulHydra::Batch::Models::Batch::STATUS_READY) + batch + end + + private + + def create_batch + DulHydra::Batch::Models::Batch.create(user: user, name: batch_name, description: batch_description) + end + + def traverse_filesystem + filesystem.each do |node| + obj = create_object(node) + end + end + + def create_object(node) + object_model = content_modeler.new(node).call + pid = assign_pid(node) if ['Collection', 'Item'].include?(object_model) + self.collection_pid = pid if object_model == 'Collection' + batch_object = DulHydra::Batch::Models::IngestBatchObject.create(batch: batch, model: object_model, pid: pid) + add_relationships(batch_object, node.parent) + add_metadata(batch_object, node) + add_content_datastream(batch_object, node) if object_model == 'Component' + end + + def assign_pid(node) + node.content ||= {} + node.content[:pid] = ActiveFedora::Base.connection_for_pid('0').mint + end + + def add_relationships(batch_object, parent_node) + batch_object.batch_object_relationships << + create_relationship(DulHydra::Batch::Models::BatchObjectRelationship::RELATIONSHIP_ADMIN_POLICY, collection_pid) + case batch_object.model + when 'Item' + batch_object.batch_object_relationships << + create_relationship(DulHydra::Batch::Models::BatchObjectRelationship::RELATIONSHIP_PARENT, parent_node.content[:pid]) + when 'Component' + batch_object.batch_object_relationships << + create_relationship(DulHydra::Batch::Models::BatchObjectRelationship::RELATIONSHIP_PARENT, parent_node.content[:pid]) + end + end + + def add_metadata(batch_object, node) + locator = Filesystem.node_locator(node) + metadata_provider.metadata(locator).each do |key, value| + Array(value).each do |v| + DulHydra::Batch::Models::BatchObjectAttribute.create( + batch_object: batch_object, + datastream: Ddr::Datastreams::DESC_METADATA, + name: key, + operation: DulHydra::Batch::Models::BatchObjectAttribute::OPERATION_ADD, + value: v, + value_type: DulHydra::Batch::Models::BatchObjectAttribute::VALUE_TYPE_STRING + ) + end + end + end + + def add_content_datastream(batch_object, node) + full_filepath = Filesystem.path_to_node(node) + rel_filepath = Filesystem.path_to_node(node, 'relative') + ds = DulHydra::Batch::Models::BatchObjectDatastream.create( + name: Ddr::Datastreams::CONTENT, + operation: DulHydra::Batch::Models::BatchObjectDatastream::OPERATION_ADD, + payload: full_filepath, + payload_type: DulHydra::Batch::Models::BatchObjectDatastream::PAYLOAD_TYPE_FILENAME, + checksum: checksum_provider.checksum(rel_filepath), + checksum_type: Ddr::Datastreams::CHECKSUM_TYPE_SHA256 + ) + batch_object.batch_object_datastreams << ds + end + + def create_relationship(relationship_name, relationship_target_pid) + DulHydra::Batch::Models::BatchObjectRelationship.create( + name: relationship_name, + operation: DulHydra::Batch::Models::BatchObjectRelationship::OPERATION_ADD, + object: relationship_target_pid, + object_type: DulHydra::Batch::Models::BatchObjectRelationship::OBJECT_TYPE_PID + ) + end + +end \ No newline at end of file diff --git a/app/services/inspect_simple_ingest.rb b/app/services/inspect_simple_ingest.rb new file mode 100644 index 00000000..dffdaf8e --- /dev/null +++ b/app/services/inspect_simple_ingest.rb @@ -0,0 +1,66 @@ +class InspectSimpleIngest + + attr_accessor :results + attr_reader :scanner_config, :filepath, :datapath + + Results = Struct.new(:file_count, :exclusions, :content_model_stats, :filesystem) + + def initialize(filepath, scanner_config={}) + @scanner_config = scanner_config + @filepath = filepath + @datapath = File.join(filepath, 'data') + @results = Results.new + end + + def call + inspect_filesystem + results + end + + private + + def load_configuration(config_file) + YAML::load(File.read(config_file)).with_indifferent_access + end + + def inspect_filesystem + validate_datapath + scan_results = ScanFilesystem.new(datapath, scanner_config).call + raise DulHydra::BatchError, "#{datapath} is not a valid simple ingest directory" unless scan_results.filesystem.simple_ingest_filesystem? + results.file_count = file_count(scan_results.filesystem) + results.exclusions = scan_results.exclusions + results.content_model_stats = content_model_stats(scan_results.filesystem) + results.filesystem = scan_results.filesystem + end + + def scanner_configuration + configuration[:scanner] + end + + def validate_datapath + raise DulHydra::BatchError, "#{datapath} not found or is not a directory" unless Dir.exist?(datapath) + raise DulHydra::BatchError, "#{datapath} is not readable" unless File.readable?(datapath) + end + + def file_count(filesystem) + count = 0 + filesystem.each_leaf { |leaf| count += 1 } + count + end + + def content_model_stats(filesystem) + collections = items = components = 0 + filesystem.each do |n| + case ModelSimpleIngestContent.new(n).call + when 'Collection' + collections += 1 + when 'Item' + items += 1 + when 'Component' + components += 1 + end + end + { collections: collections, items: items, components: components } + end + +end diff --git a/app/services/model_simple_ingest_content.rb b/app/services/model_simple_ingest_content.rb new file mode 100644 index 00000000..d5cbfec4 --- /dev/null +++ b/app/services/model_simple_ingest_content.rb @@ -0,0 +1,22 @@ +class ModelSimpleIngestContent + + attr_reader :node + + def initialize(node) + @node = node + end + + def call + raise DulHydra::BatchError, "Node #{node.name} too deep for simple ingest" if node.node_depth > 2 + raise DulHydra::BatchError, "Deepest permitted node #{node.name} has children" if node.node_depth == 2 && node.has_children? + case + when node.is_root? + 'Collection' + when node.node_depth == 1 + 'Item' + when node.node_depth == 2 + 'Component' + end + end + +end \ No newline at end of file diff --git a/app/services/scan_filesystem.rb b/app/services/scan_filesystem.rb new file mode 100644 index 00000000..b5ad488f --- /dev/null +++ b/app/services/scan_filesystem.rb @@ -0,0 +1,59 @@ +class ScanFilesystem + + DEFAULT_OPTIONS = { } + + attr_reader :basepath, :options + attr_accessor :filesystem, :exclusions + + Results = Struct.new(:filesystem, :exclusions) + + # @param basepath [String] the filesystem directory path to scan + # @param options [Hash] the options to use in scanning + # exclude [Array] directory entries to ignore while scanning + def initialize(basepath, options={}) + @basepath = basepath + @filesystem = Filesystem.new(basepath) + @options = DEFAULT_OPTIONS.merge(options) + @exclusions = [] + end + + # @return [Hash] a representation of the relevant portions of the filesystem + def call + scan_files(basepath, filesystem.root) + Results.new(filesystem, exclusions) + end + + private + + def scan_files(dirpath, node) + Dir.foreach(dirpath).each do |entry| + next if ['.', '..'].include?(entry) + if exclude.include?(entry) + exclusions << File.join(dirpath, entry) + else + handle_entry(dirpath, node, entry) + end + end + end + + def handle_entry(dirpath, node, entry) + child_node = Tree::TreeNode.new(entry) + node << child_node + entry_path = File.join(dirpath, entry) + handle_directory(entry_path, child_node) if File.directory?(entry_path) + end + + def handle_directory(dirpath, node) + scan_files(dirpath, node) + # Remove directories that contain no files or only excluded files + unless node.has_children? + node.remove_from_parent! + exclusions << dirpath + end + end + + def exclude + options.fetch(:exclude, []) + end + +end \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index d8880457..266734ab 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -173,6 +173,8 @@ en: submitted: Scanning ... help: parent_id_length: Leave blank or set to 0 to create a separate Item for each file. + standard_ingest: + batch_name: Standard Ingest metadata_file: batch_name: Metadata Update File create_batch: Create Update Batch diff --git a/db/migrate/20150608172238_change_value_from_string_to_text.rb b/db/migrate/20150608172238_change_value_from_string_to_text.rb new file mode 100644 index 00000000..db2f528b --- /dev/null +++ b/db/migrate/20150608172238_change_value_from_string_to_text.rb @@ -0,0 +1,11 @@ +class ChangeValueFromStringToText < ActiveRecord::Migration + + def up + change_column :batch_object_attributes, :value, :text, limit: 65535 + end + + def down + raise ActiveRecord::IrreversibleMigration + end + +end diff --git a/db/schema.rb b/db/schema.rb index 2d76a49c..2a7e9513 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,14 +11,14 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20150224142553) do +ActiveRecord::Schema.define(version: 20150608172238) do create_table "batch_object_attributes", force: true do |t| t.integer "batch_object_id" t.string "datastream" t.string "name" t.string "operation" - t.string "value" + t.text "value", limit: 65535 t.string "value_type" t.datetime "created_at" t.datetime "updated_at" diff --git a/lib/dul_hydra.rb b/lib/dul_hydra.rb index 0889c929..1ef3e26a 100644 --- a/lib/dul_hydra.rb +++ b/lib/dul_hydra.rb @@ -3,6 +3,7 @@ module DulHydra autoload :Configurable, 'dul_hydra/configurable' + autoload :BatchError, 'dul_hydra/error' include DulHydra::Configurable diff --git a/lib/dul_hydra/batch/scripts/process_simple_ingest.rb b/lib/dul_hydra/batch/scripts/process_simple_ingest.rb new file mode 100644 index 00000000..6af6e594 --- /dev/null +++ b/lib/dul_hydra/batch/scripts/process_simple_ingest.rb @@ -0,0 +1,84 @@ +module DulHydra::Batch::Scripts + + class ProcessSimpleIngest + + attr_reader :batch_user, :configuration, :filepath + + CHECKSUM_FILE = 'manifest-sha256.txt' + METADATA_FILE = 'metadata.txt' + DEFAULT_CONFIG_FILE = Rails.root.join('config', 'simple_ingest.yml') + DEFAULT_ARGUMENTS = { config_file: DEFAULT_CONFIG_FILE } + + def initialize(args=DEFAULT_ARGUMENTS) + @batch_user = User.find_by_user_key(args.fetch(:batch_user)) + raise DulHydra::BatchError, "Unable to find user #{args.fetch(:batch_user)}" unless @batch_user.present? + @configuration = load_configuration(args.fetch(:config_file, DEFAULT_CONFIG_FILE)) + @filepath = args.fetch(:filepath) + end + + def execute + inspection_results = inspect_filepath + user_choice = prompt_user + case user_choice + when 'p' + batch = build_batch(inspection_results.filesystem) + puts "Created pending batch #{batch.id} for user #{batch.user.user_key}" + when 'x' + puts "Cancelling operation" + end + end + + private + + def load_configuration(config_file) + YAML::load(File.read(config_file)).symbolize_keys + end + + def inspect_filepath + results = InspectSimpleIngest.new(filepath, configuration[:scanner]).call + puts "Inspected #{results.filesystem.root.name}" + puts "Found #{results.file_count} files" + unless results.exclusions.empty? + puts "Excluding #{results.exclusions.join(', ')}" + end + puts "Content models #{results.content_model_stats}" + results + end + + def prompt_user + options = user_options + options.each { |k, v| puts "#{k} - #{v}" } + get_user_choice(options) + end + + def user_options + options = {} + options['p'] = "Create pending batch" + options['x'] = "Cancel operation" + options + end + + def get_user_choice(options=user_options) + input = "" + while true do + print "Enter #{options.keys.join(', ')} : " + input = STDIN.gets.strip + break if options.keys.include?(input.downcase) + end + input.downcase + end + + def build_batch(filesystem) + batch_builder = BuildBatchFromFolderIngest.new( + batch_user, + filesystem, + ModelSimpleIngestContent, + SimpleIngestMetadata.new(File.join(filepath, 'data', METADATA_FILE), configuration[:metadata]), + SimpleIngestChecksum.new(File.join(filepath, CHECKSUM_FILE)), + "Simple Ingest", + filesystem.root.name) + batch = batch_builder.call + end + + end +end \ No newline at end of file diff --git a/lib/dul_hydra/error.rb b/lib/dul_hydra/error.rb new file mode 100644 index 00000000..0d8776cf --- /dev/null +++ b/lib/dul_hydra/error.rb @@ -0,0 +1,9 @@ +module DulHydra + + # Base class for custom DulHydra exceptions + class Error < StandardError; end + + # Error related to batch operation + class BatchError < Error; end + +end \ No newline at end of file diff --git a/lib/tasks/dul_hydra.rake b/lib/tasks/dul_hydra.rake index c0f36be9..dc149684 100644 --- a/lib/tasks/dul_hydra.rake +++ b/lib/tasks/dul_hydra.rake @@ -27,6 +27,16 @@ namespace :dul_hydra do end namespace :batch do + desc "Creates ingest batch from Simple Ingest Format directory" + task :simple_ingest => :environment do + raise "Must specify folder path. Ex.: FOLDER=/path/to/simple/ingest/folder" unless ENV['FOLDER'] + raise "Must specify batch user. Ex.: BATCH_USER=tom@school.edu" unless ENV['BATCH_USER'] + processor_args = { filepath: ENV['FOLDER'] } + processor_args[:config_file] = ENV['CONFIG_FILE'] if ENV['CONFIG_FILE'] + processor_args[:batch_user] = ENV['BATCH_USER'] + processor = DulHydra::Batch::Scripts::ProcessSimpleIngest.new(processor_args) + processor.execute + end desc "Creates descriptive metadata update batch from folder of METS files" task :mets_folder => :environment do raise "Must specify folder path. Ex.: FOLDER=/path/to/METS/folder" unless ENV['FOLDER'] diff --git a/spec/fixtures/batch_ingest/simple_ingest/bad-headers-metadata.txt b/spec/fixtures/batch_ingest/simple_ingest/bad-headers-metadata.txt new file mode 100644 index 00000000..be678472 --- /dev/null +++ b/spec/fixtures/batch_ingest/simple_ingest/bad-headers-metadata.txt @@ -0,0 +1,3 @@ +locator,identifier,title,bad,subject,subject,alsoBad,dateSubmitted,creator +data/foo,test123,My Title,Description,Alpha; Beta,,,2014-02-03,Jane Smith +data/foo/bar.doc,test12345,Updated Title,"This is some description; this is ""some more"" description.",Alpha; Beta; Gamma,Delta; Epsilon,Jane Doe,2010-01-22,John Doe \ No newline at end of file diff --git a/spec/fixtures/batch_ingest/simple_ingest/example/bagit.txt b/spec/fixtures/batch_ingest/simple_ingest/example/bagit.txt new file mode 100644 index 00000000..c4aebb43 --- /dev/null +++ b/spec/fixtures/batch_ingest/simple_ingest/example/bagit.txt @@ -0,0 +1,2 @@ +BagIt-Version: 0.97 +Tag-File-Character-Encoding: UTF-8 diff --git a/spec/fixtures/batch_ingest/simple_ingest/example/data/itemA/image1.tiff b/spec/fixtures/batch_ingest/simple_ingest/example/data/itemA/image1.tiff new file mode 100755 index 0000000000000000000000000000000000000000..63e79350dd8cf35f4389c62deef8b1dcd0860fb5 GIT binary patch literal 63538 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 N_n;2&pp)p&{{w0 { "identifier" => [ "test123" ], + "title" => [ "My Title" ], + "description" => [ "Description" ], + "subject" => [ "Alpha", "Beta" ], + "dateSubmitted" => [ "2014-02-03" ], + "creator" => [ "Jane Smith" ] }, + 'foo/bar.doc' => { "identifier" => [ "test12345" ], + "title" => [ "Updated Title" ], + "description" => [ "This is some description; this is \"some more\" description." ], + "subject" => [ "Alpha", "Beta", "Gamma", "Delta", "Epsilon" ], + "contributor" => [ "Jane Doe" ], + "dateSubmitted" => [ "2010-01-22" ], + "creator" => [ "John Doe" ] } + } + end + it "should return the correct metadata for a locator" do + expect(sim.metadata('foo')).to eql(expected_metadata[ 'foo' ]) + expect(sim.metadata('foo/bar.doc')).to eql(expected_metadata[ 'foo/bar.doc' ]) + expect(sim.metadata('foo/not.doc')).to be_empty + end + end + +end \ No newline at end of file diff --git a/spec/scripts/process_simple_ingest_spec.rb b/spec/scripts/process_simple_ingest_spec.rb new file mode 100644 index 00000000..4f035e5c --- /dev/null +++ b/spec/scripts/process_simple_ingest_spec.rb @@ -0,0 +1,57 @@ +require 'spec_helper' + +module DulHydra::Batch::Scripts + + RSpec.describe ProcessSimpleIngest, type: :script, batch: true, simple_ingest: true do + + let(:config_hash) do + { scanner: { exclude: [".DS_Store", "Thumbs.db", "metadata.txt"] }, + metadata: + { csv: { encoding: "UTF-8", headers: true, col_sep: "\t" }, + parse: { repeating_fields_separator: ";", + repeatable_fields: ["contributor", "coverage", "creator", "extent", "identifier", + "rightsHolder", "subject", "temporal"] + } + } + } + end + + before { allow_any_instance_of(described_class).to receive(:load_configuration) { config_hash } } + + describe "#initialize" do + context "non-existent user" do + it "should raise a user not found error" do + expect { ProcessSimpleIngest.new({ batch_user: 'noone@nowhere.net' }) }.to raise_error(/Unable to find user/) + end + end + end + + describe "#execute" do + let(:folder_path) { Rails.root.join('spec/fixtures/batch_ingest/simple_ingest/example') } + let(:batch_user) { FactoryGirl.create(:user) } + let(:processor) { described_class.new({ batch_user: batch_user.user_key, filepath: folder_path }) } + before { allow(processor).to receive(:get_user_choice) { 'p' } } + it "should output the filesystem scan results" do + expect { processor.execute }.to output(/Content models {:collections=>1, :items=>1, :components=>1}/).to_stdout + end + it "should produce the appropriate batch" do + processor.execute + batch = DulHydra::Batch::Models::Batch.last + expect(batch.user).to eq(batch_user) + batch_objects = batch.batch_objects + expect(batch_objects.size).to eq(3) + # Collection batch object + expect(batch_objects[0].batch_object_attributes.where(name: 'title').first.value).to eq('Collection Title') + # Item batch object + expect(batch_objects[1].batch_object_attributes.where(name: 'title').first.value).to eq('Item A Title') + # Component batch object + expect(batch_objects[2].batch_object_attributes.where(name: 'title').first.value).to eq('Component 1 Title') + content_ds = batch_objects[2].batch_object_datastreams.where(name: Ddr::Datastreams::CONTENT).first + expect(content_ds.payload).to eq(File.join(folder_path, 'data', 'itemA', 'image1.tiff')) + expect(content_ds.checksum).to eq('bda5fda452d0047c27e9e0048ed59428cb9e6d5d46fe9c27dff5c8e39b75a59e') + end + end + + end + +end \ No newline at end of file diff --git a/spec/services/build_batch_from_folder_ingest_spec.rb b/spec/services/build_batch_from_folder_ingest_spec.rb new file mode 100644 index 00000000..d2de85c3 --- /dev/null +++ b/spec/services/build_batch_from_folder_ingest_spec.rb @@ -0,0 +1,115 @@ +require 'spec_helper' +require 'support/ingest_folder_helper' + +RSpec.describe BuildBatchFromFolderIngest, type: :service, batch: true, simple_ingest: true do + + let(:user) { FactoryGirl.create(:user) } + let(:batch_name) { "Test Ingest Batch" } + let(:batch_description) { "Testing ingest batch building" } + let(:filesystem) { Filesystem.new } + let(:batch_builder) { described_class.new(user, filesystem, content_modeler, metadata_provider, checksum_provider, batch_name, batch_description) } + + context 'simple ingest' do + + let(:content_modeler) { ModelSimpleIngestContent } + let(:metadata_provider) { double("SimpleIngestMetadata") } + let(:checksum_provider) { double("SimpleIngestChecksum") } + + before do + filesystem.tree = filesystem_simple_ingest + allow(metadata_provider).to receive(:metadata) { { } } + allow(metadata_provider).to receive(:metadata).with(nil) { { title: 'Collection Title' } } + allow(metadata_provider).to receive(:metadata).with('[movie.mp4]') { { title: 'Title 1' } } + allow(metadata_provider).to receive(:metadata).with('[file01001.tif]') { { title: 'Title 2' } } + allow(metadata_provider).to receive(:metadata).with('itemA') { { title: 'Title 3' } } + allow(metadata_provider).to receive(:metadata).with('itemB') { { title: 'Title 4' } } + allow(checksum_provider).to receive(:checksum).with('[movie.mp4]/movie.mp4') { '4f7bf7c679ab58da75c021279ae08b59e609801fe3ee8401d7cdb4d0ea3c4697' } + allow(checksum_provider).to receive(:checksum).with('[file01001.tif]/file01001.tif') { '6cba6e3bcefc0454c1ec15ef44b0798e1de7d0d7a776ea341ecf16ea1ea2e162' } + allow(checksum_provider).to receive(:checksum).with('itemA/file01.pdf') { 'e20e0a30eee4e29eea5e1ef6eed422cd33174810a433e688c503a4b805b9c6fa' } + allow(checksum_provider).to receive(:checksum).with('itemA/track01.wav') { 'd72880438ba42224b9dd185e4e8c1b60e6ddf61d977d0b99aed72bb9f964657b' } + allow(checksum_provider).to receive(:checksum).with('itemB/file02.pdf') { 'a2b872e2a3958a1ec7de3afcfd017d323c0a43dcebf0e607ab31acde4799aa8f' } + allow(checksum_provider).to receive(:checksum).with('itemB/track02.wav') { 'dd60f671e6f31c75f11643e98384f71864ee654c6afb9d26cdc6a7c458741d47' } + end + + it "should build an appropriate batch" do + batch = batch_builder.call + + # Batch expectations + expect(batch.id).to be_present + expect(batch.name).to eq(batch_name) + expect(batch.description).to eq(batch_description) + expect(batch.status).to eq(DulHydra::Batch::Models::Batch::STATUS_READY) + + # Batch objects + batch_objects = batch.batch_objects + collections = batch_objects.where(model: 'Collection') + items = batch_objects.where(model: 'Item') + components = batch_objects.where(model: 'Component') + + # All batch object expectations + batch_objects.each do |obj| + expect(obj.type).to eq('DulHydra::Batch::Models::IngestBatchObject') + admin_policy_relationships = obj.batch_object_relationships.where( + name: DulHydra::Batch::Models::BatchObjectRelationship::RELATIONSHIP_ADMIN_POLICY) + expect(admin_policy_relationships.size).to eq(1) + expect(admin_policy_relationships.first.object).to eq(collections.first.pid) + end + + # Collection expectations + expect(collections.count).to eq(1) + expect(collections.first.pid).to be_present + expect(collections.first.batch_object_attributes.where(name: 'title').first.value).to eq('Collection Title') + + # Item expectations + expect(items.count).to eq(4) + item_pids = [] + item_titles = [] + items.each do |obj| + expect(obj.pid).to be_present + item_pids << obj.pid + parent_relationships = obj.batch_object_relationships.where( + name: DulHydra::Batch::Models::BatchObjectRelationship::RELATIONSHIP_PARENT) + expect(parent_relationships.size).to eq(1) + expect(parent_relationships.first.object).to eq(collections.first.pid) + item_titles << obj.batch_object_attributes.where(name: 'title').first.value + end + expect(item_titles).to include('Title 1') + expect(item_titles).to include('Title 2') + expect(item_titles).to include('Title 3') + expect(item_titles).to include('Title 4') + + # Component expectations + expect(components.count).to eq(6) + component_filepaths = [] + component_checksums = [] + components.each do |obj| + # Parent relationship + parent_relationships = obj.batch_object_relationships.where( + name: DulHydra::Batch::Models::BatchObjectRelationship::RELATIONSHIP_PARENT) + expect(parent_relationships.size).to eq(1) + expect(item_pids).to include(parent_relationships.first.object) + # Content datastream + content_datastreams = obj.batch_object_datastreams.where( + name: Ddr::Datastreams::CONTENT) + expect(content_datastreams.size).to eq(1) + expect(content_datastreams.first.checksum_type).to eq(Ddr::Datastreams::CHECKSUM_TYPE_SHA256) + component_filepaths << content_datastreams.first.payload + component_checksums << content_datastreams.first.checksum + end + expect(component_filepaths).to include('/test/directory/[movie.mp4]/movie.mp4') + expect(component_filepaths).to include('/test/directory/[file01001.tif]/file01001.tif') + expect(component_filepaths).to include('/test/directory/itemA/file01.pdf') + expect(component_filepaths).to include('/test/directory/itemA/track01.wav') + expect(component_filepaths).to include('/test/directory/itemB/file02.pdf') + expect(component_filepaths).to include('/test/directory/itemB/track02.wav') + expect(component_checksums).to include('4f7bf7c679ab58da75c021279ae08b59e609801fe3ee8401d7cdb4d0ea3c4697') + expect(component_checksums).to include('6cba6e3bcefc0454c1ec15ef44b0798e1de7d0d7a776ea341ecf16ea1ea2e162') + expect(component_checksums).to include('e20e0a30eee4e29eea5e1ef6eed422cd33174810a433e688c503a4b805b9c6fa') + expect(component_checksums).to include('d72880438ba42224b9dd185e4e8c1b60e6ddf61d977d0b99aed72bb9f964657b') + expect(component_checksums).to include('a2b872e2a3958a1ec7de3afcfd017d323c0a43dcebf0e607ab31acde4799aa8f') + expect(component_checksums).to include('dd60f671e6f31c75f11643e98384f71864ee654c6afb9d26cdc6a7c458741d47') + end + + end + +end \ No newline at end of file diff --git a/spec/services/inspect_simple_ingest_spec.rb b/spec/services/inspect_simple_ingest_spec.rb new file mode 100644 index 00000000..283fbcb5 --- /dev/null +++ b/spec/services/inspect_simple_ingest_spec.rb @@ -0,0 +1,70 @@ +require 'spec_helper' +require 'support/ingest_folder_helper' + +RSpec.describe InspectSimpleIngest, type: :service, batch: true, simple_ingest: true do + + let(:filepath) { "/foo/bar" } + let(:datapath) { File.join(filepath, 'data') } + let(:inspect_simple_ingest) { InspectSimpleIngest.new(filepath, {}) } + let(:filesystem) { Filesystem.new } + let(:scan_results) { ScanFilesystem::Results.new(filesystem, []) } + + before do + allow(Dir).to receive(:exist?) { true } + allow(File).to receive(:readable?).with(datapath) { true } + allow(inspect_simple_ingest).to receive(:load_configuration) { simple_ingest_configuration } + allow_any_instance_of(ScanFilesystem).to receive(:call) { scan_results } + filesystem.tree = filesystem_simple_ingest + end + + describe "simple ingest folder" do + describe "filepath" do + context 'valid filepath' do + it "should not raise an error" do + expect { inspect_simple_ingest.call }.to_not raise_error + end + end + context "filepath does not point to an existing directory" do + before { allow(Dir).to receive(:exist?) { false } } + it "should raise a not found or not directory error" do + expect { inspect_simple_ingest.call }.to raise_error(DulHydra::BatchError, /not found or is not a directory/) + end + end + context "filepath is not readable" do + before do + allow(File).to receive(:readable?).with(datapath) { false } + end + it "should raise a not readable error" do + expect { inspect_simple_ingest.call }.to raise_error(DulHydra::BatchError, /not readable/) + end + end + end + end + + describe "filesystem" do + context "valid for simple ingest" do + it "should report the number of files" do + expect(inspect_simple_ingest.call.file_count).to eq(6) + end + it "should report the excluded files/folders" do + expect(inspect_simple_ingest.call.exclusions).to eq([]) + end + it "should report the content model stats" do + stats = inspect_simple_ingest.call.content_model_stats + expect(stats).to include(collections: 1) + expect(stats).to include(items: 4) + expect(stats).to include(components: 6) + end + it "should report the filesystem object" do + expect(inspect_simple_ingest.call.filesystem).to be_a(Filesystem) + end + end + context "too deep for simple ingest" do + before { filesystem.tree = filesystem_three_deep } + it "should raise a not valid error" do + expect { inspect_simple_ingest.call }.to raise_error(DulHydra::BatchError, /not a valid simple ingest/) + end + end + end + +end \ No newline at end of file diff --git a/spec/services/model_simple_ingest_content_spec.rb b/spec/services/model_simple_ingest_content_spec.rb new file mode 100644 index 00000000..1be226ab --- /dev/null +++ b/spec/services/model_simple_ingest_content_spec.rb @@ -0,0 +1,58 @@ +require 'spec_helper' +require 'support/ingest_folder_helper' + +shared_examples "a properly modeled filesystem node" do + it "should determine the proper content model" do + expect(ModelSimpleIngestContent.new(node).call).to eq(proper_model) + end +end + +RSpec.describe ModelSimpleIngestContent, type: :service, batch: true, simple_ingest: true do + + let(:root_node) { Tree::TreeNode.new('/test/directory') } + let(:nodeA) { Tree::TreeNode.new('A') } + let(:nodeB) { Tree::TreeNode.new('B') } + let(:nodeC) { Tree::TreeNode.new('C') } + let(:nodeD) { Tree::TreeNode.new('D') } + let(:nodeE) { Tree::TreeNode.new('E') } + let(:nodeF) { Tree::TreeNode.new('F') } + + before do + root_node << nodeA + root_node << nodeB << nodeC + root_node << nodeD << nodeE << nodeF + end + context "root node" do + let(:node) { root_node } + let(:proper_model) { 'Collection' } + it_should_behave_like "a properly modeled filesystem node" + end + context "childless node in root node" do + let(:node) { nodeA } + let(:proper_model) { 'Item' } + it_should_behave_like "a properly modeled filesystem node" + end + context "childed node in root node" do + let(:node) { nodeB } + let(:proper_model) { 'Item' } + it_should_behave_like "a properly modeled filesystem node" + end + context "childless node in childed node in root node" do + let(:node) { nodeC } + let(:proper_model) { 'Component' } + it_should_behave_like "a properly modeled filesystem node" + end + context "childed node in childed node in root node" do + let(:node) { nodeE } + it "should raise a deepest node has children error" do + expect { ModelSimpleIngestContent.new(node).call }.to raise_error(DulHydra::BatchError, /Deepest .* has children/) + end + end + context "third-level node" do + let(:node) { nodeF } + it "should raise a node too deep exception" do + expect { ModelSimpleIngestContent.new(node).call }.to raise_error(DulHydra::BatchError, /too deep/) + end + end + +end \ No newline at end of file diff --git a/spec/services/scan_filesystem_spec.rb b/spec/services/scan_filesystem_spec.rb new file mode 100644 index 00000000..57a00d4c --- /dev/null +++ b/spec/services/scan_filesystem_spec.rb @@ -0,0 +1,37 @@ +require 'spec_helper' + +RSpec.describe ScanFilesystem, type: :service, batch: true, simple_ingest: true do + + let(:filepath) { '/test/directory' } + + before do + allow(Dir).to receive(:foreach).with(filepath).and_return( + Enumerator.new { |y| y << "." << ".." << "Thumbs.db" << "movie.mp4" << "file01001.tif" << "images" << "itemA" << "itemB" } + ) + allow(Dir).to receive(:foreach).with(File.join(filepath, 'images')).and_return( + Enumerator.new { |y| y << "." << ".." } + ) + allow(Dir).to receive(:foreach).with(File.join(filepath, 'itemA')).and_return( + Enumerator.new { |y| y << "." << ".." << "file01.pdf" << "track01.wav" } + ) + allow(Dir).to receive(:foreach).with(File.join(filepath, 'itemB')).and_return( + Enumerator.new { |y| y << "." << ".." << "file02.pdf" << "track02.wav" } + ) + allow(File).to receive(:directory?).and_return(false) + allow(File).to receive(:directory?).with(File.join(filepath, 'images')).and_return(true) + allow(File).to receive(:directory?).with(File.join(filepath, 'itemA')).and_return(true) + allow(File).to receive(:directory?).with(File.join(filepath, 'itemB')).and_return(true) + end + + describe "scan" do + let(:scanner) { described_class.new(filepath, { exclude: [ 'Thumbs.db' ] }) } + let(:expected_filesystem) { Filesystem.new.tree = sample_filesystem } + let(:expected_exclusions) { [ File.join(filepath, 'Thumbs.db'), File.join(filepath, 'images') ] } + it "should return the expected results" do + results = scanner.call + expect(results.filesystem.marshal_dump).to eq(expected_filesystem.marshal_dump) + expect(results.exclusions).to match_array(expected_exclusions) + end + end + +end \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index c7355054..5e9b7c58 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -12,6 +12,7 @@ require 'capybara/rails' require 'capybara/rspec' require 'dul_hydra' +require 'dul_hydra/error' require 'database_cleaner' require "ddr/auth/test_helpers" diff --git a/spec/support/ingest_folder_helper.rb b/spec/support/ingest_folder_helper.rb index f47c7a1b..063eaeb4 100644 --- a/spec/support/ingest_folder_helper.rb +++ b/spec/support/ingest_folder_helper.rb @@ -38,3 +38,69 @@ def populate_comparison_hashes(batch_objects) end [ objects, atts, dss, rels ] end + +def simple_ingest_configuration + { + scanner: { + exclude: [ '.DS_Store', 'Thumbs.db' ] + }, + metadata: { + filename: 'ddr-ingest-metadata.txt', + csv: { + encoding: 'UTF-8', + headers: true, + col_sep: '\t' + }, + parse: { + locator_field_count: 1, + repeating_fields_separator: ';', + repeatable_fields: [ 'contributor', 'creator', 'date', 'subject', 'type' ] + } + } + } +end + +def sample_filesystem + root_node = Tree::TreeNode.new('/test/directory') + root_node << Tree::TreeNode.new('movie.mp4') + root_node << Tree::TreeNode.new('file01001.tif') + itemA_node = Tree::TreeNode.new('itemA') + itemA_node << Tree::TreeNode.new('file01.pdf') + itemA_node << Tree::TreeNode.new('track01.wav') + root_node << itemA_node + itemB_node = Tree::TreeNode.new('itemB') + itemB_node << Tree::TreeNode.new('file02.pdf') + itemB_node << Tree::TreeNode.new('track02.wav') + root_node << itemB_node + root_node +end + +def filesystem_simple_ingest + root_node = Tree::TreeNode.new('/test/directory') + itemY_node = Tree::TreeNode.new('[movie.mp4]') + itemY_node << Tree::TreeNode.new('movie.mp4') + root_node << itemY_node + itemZ_node = Tree::TreeNode.new('[file01001.tif]') + itemZ_node << Tree::TreeNode.new('file01001.tif') + root_node << itemZ_node + itemA_node = Tree::TreeNode.new('itemA') + itemA_node << Tree::TreeNode.new('file01.pdf') + itemA_node << Tree::TreeNode.new('track01.wav') + root_node << itemA_node + itemB_node = Tree::TreeNode.new('itemB') + itemB_node << Tree::TreeNode.new('file02.pdf') + itemB_node << Tree::TreeNode.new('track02.wav') + root_node << itemB_node + root_node +end + +def filesystem_three_deep + root_node = Tree::TreeNode.new('/test/directory') + itemA_node = Tree::TreeNode.new('itemA') + root_node << itemA_node + itemB_node = Tree::TreeNode.new('itemB') + itemB_node << Tree::TreeNode.new('file02.pdf') + itemB_node << Tree::TreeNode.new('track02.wav') + itemA_node << itemB_node + root_node +end \ No newline at end of file From 10fc3ec62402f8817d52c9ff7e46f6c580212a2b Mon Sep 17 00:00:00 2001 From: Jim Coble Date: Tue, 9 Jun 2015 16:39:27 -0400 Subject: [PATCH 08/10] set version --- lib/dul_hydra/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dul_hydra/version.rb b/lib/dul_hydra/version.rb index cc48f8af..f2209fb2 100644 --- a/lib/dul_hydra/version.rb +++ b/lib/dul_hydra/version.rb @@ -1,3 +1,3 @@ module DulHydra - VERSION = "3.2.0.post" + VERSION = "3.3.0.rc1" end From 169e7eee654dadcad4c1f22383e4e21dd78d7021 Mon Sep 17 00:00:00 2001 From: Jim Coble Date: Thu, 11 Jun 2015 08:32:07 -0400 Subject: [PATCH 09/10] upgrade ddr-models to 1.16.1 --- Gemfile | 2 +- Gemfile.lock | 4 ++-- app/models/simple_ingest_metadata.rb | 1 + lib/dul_hydra/version.rb | 2 +- spec/fixtures/batch_ingest/simple_ingest/metadata.txt | 1 + spec/models/simple_ingest_metadata_spec.rb | 4 ++++ 6 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 1160324b..877d7a2a 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,7 @@ source 'http://rubygems.org' gem 'rails', '~> 4.1.6' gem 'hydra-head', '~> 7.2.0' gem 'ddr-alerts', '~> 1.0.0' -gem 'ddr-models', '~> 1.16.0' +gem 'ddr-models', '~> 1.16.1' gem 'rubydora', '>= 1.8.1' gem 'devise' gem 'deprecation' diff --git a/Gemfile.lock b/Gemfile.lock index 5bcf0a45..0c63b1a1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -86,7 +86,7 @@ GEM rails (~> 4.1.6) ddr-antivirus (1.3.2) activesupport (~> 4.0) - ddr-models (1.16.0) + ddr-models (1.16.1) active-fedora (~> 7.0) ddr-antivirus (~> 1.3.1) devise (~> 3.4) @@ -422,7 +422,7 @@ DEPENDENCIES coveralls database_cleaner ddr-alerts (~> 1.0.0) - ddr-models (~> 1.16.0) + ddr-models (~> 1.16.1) deprecation devise equivalent-xml diff --git a/app/models/simple_ingest_metadata.rb b/app/models/simple_ingest_metadata.rb index 23b03131..77a83b55 100644 --- a/app/models/simple_ingest_metadata.rb +++ b/app/models/simple_ingest_metadata.rb @@ -65,6 +65,7 @@ def metadata_grid @metadata_grid = {} as_csv_table.each do |row| locator = row.field(0) + locator.sub!(/\/$/,"") # remove trailing slash if present row.delete(0) @metadata_grid[locator] = row end diff --git a/lib/dul_hydra/version.rb b/lib/dul_hydra/version.rb index f2209fb2..8fc64338 100644 --- a/lib/dul_hydra/version.rb +++ b/lib/dul_hydra/version.rb @@ -1,3 +1,3 @@ module DulHydra - VERSION = "3.3.0.rc1" + VERSION = "3.3.0.rc3" end diff --git a/spec/fixtures/batch_ingest/simple_ingest/metadata.txt b/spec/fixtures/batch_ingest/simple_ingest/metadata.txt index afd6a991..5feab72c 100644 --- a/spec/fixtures/batch_ingest/simple_ingest/metadata.txt +++ b/spec/fixtures/batch_ingest/simple_ingest/metadata.txt @@ -1,3 +1,4 @@ locator,identifier,title,description,Subject,subject,contributor,date submitted,creator +data/,test,Top Title,Top Description,,,,,"Spade, Sam" data/foo,test123,My Title,Description,Alpha; Beta,,,2014-02-03,Jane Smith data/foo/bar.doc,test12345,Updated Title,"This is some description; this is ""some more"" description.",Alpha; Beta; Gamma,Delta; Epsilon,Jane Doe,2010-01-22,John Doe \ No newline at end of file diff --git a/spec/models/simple_ingest_metadata_spec.rb b/spec/models/simple_ingest_metadata_spec.rb index 8c4a3be2..77e9a272 100644 --- a/spec/models/simple_ingest_metadata_spec.rb +++ b/spec/models/simple_ingest_metadata_spec.rb @@ -38,6 +38,10 @@ let(:sim) { described_class.new(metadata_filepath, metadata_profile) } let(:expected_metadata) do { + '' => { "identifier" => [ "test" ], + "title" => [ "Top Title" ], + "description" => [ "Top Description" ], + "creator" => [ "Spade, Sam" ] }, 'foo' => { "identifier" => [ "test123" ], "title" => [ "My Title" ], "description" => [ "Description" ], From 8f81e487a59e508a22a6e266fdc3a620111a306e Mon Sep 17 00:00:00 2001 From: Jim Coble Date: Tue, 16 Jun 2015 09:18:15 -0400 Subject: [PATCH 10/10] set version for release --- lib/dul_hydra/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dul_hydra/version.rb b/lib/dul_hydra/version.rb index 8fc64338..b900abe2 100644 --- a/lib/dul_hydra/version.rb +++ b/lib/dul_hydra/version.rb @@ -1,3 +1,3 @@ module DulHydra - VERSION = "3.3.0.rc3" + VERSION = "3.3.0" end