diff --git a/config/config.yml b/config/config.yml index 104643c..afc7859 100644 --- a/config/config.yml +++ b/config/config.yml @@ -18,5 +18,8 @@ stages: - name: Postflight class: Postflight file: postflight + - name: GenerateChecksums + class: GenerateChecksums + file: generate_checksums diff --git a/lib/stage/generate_checksums.rb b/lib/stage/generate_checksums.rb new file mode 100644 index 0000000..5b01c92 --- /dev/null +++ b/lib/stage/generate_checksums.rb @@ -0,0 +1,30 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "stage" + +module ChecksumFileGenerator + def self.write(path) + FileUtils.cd(path) do + `md5sum * > checksum.md5` + end + end +end + +class GenerateChecksums < Stage + def run(agenda) + @bar.steps = shipment.objid_directories.count + shipment.objid_directories.each_with_index do |dir, i| + @bar.step! i, dir + remove_existing_checksum_file(dir) + ChecksumFileGenerator.write(dir) + end + end + + private + + def remove_existing_checksum_file(dir) + checksum_file_path = File.join(dir, "checksum.md5") + FileUtils.rm_f(checksum_file_path) if File.exist?(checksum_file_path) + end +end diff --git a/spec/stage/generate_checksums_spec.rb b/spec/stage/generate_checksums_spec.rb new file mode 100644 index 0000000..8124424 --- /dev/null +++ b/spec/stage/generate_checksums_spec.rb @@ -0,0 +1,44 @@ +describe ChecksumFileGenerator do + include_context "uses temp dir" + context ".write" do + it "writes an checksum.md5 file for files in a given directory" do + FileUtils.cp("spec/fixtures/10_10_8_400.jp2", temp_dir_path) + described_class.write(temp_dir_path) + checksum_contents = File.read(File.join(temp_dir_path, "checksum.md5")) + expect(checksum_contents).to include(" 10_10_8_400.jp2") + end + end +end + +describe GenerateChecksums do + include_context "uses temp dir" + let(:barcode) { "39015002231713" } + let(:shipment_path) { "#{temp_dir_path}/test_shipment" } + let(:item_path) { "#{shipment_path}/#{barcode}" } + let(:shipment) { Shipment.new(shipment_path) } + subject do + described_class.new(shipment, config: Config.new({no_progress: true})) + end + + def set_up_shipment + FileUtils.mkdir_p(item_path) + FileUtils.cp("spec/fixtures/10_10_8_400.jp2", item_path) + end + + it "creates a checksum file" do + set_up_shipment + + subject.run! + checksum_contents = File.read(File.join(item_path, "checksum.md5")) + expect(checksum_contents).to include(" 10_10_8_400.jp2") + end + + it "original checksum file is removed before calculating checksum" do + set_up_shipment + FileUtils.touch("#{item_path}/checksum.md5") + subject.run! + checksum_contents = File.read(File.join(item_path, "checksum.md5")) + expect(checksum_contents).to include(" 10_10_8_400.jp2") + expect(checksum_contents).not_to include(" checksum.md5") + end +end