From 0beacb326eb663c3341c07d7f13e9a8c2575bb27 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Mon, 15 Sep 2014 20:34:35 +0200 Subject: [PATCH] Support gzip compressed data files (to be used by new version of cli) --- app/uploaders/bzip2_uploader.rb | 17 --------- app/uploaders/compressed_file_uploader.rb | 32 +++++++++++++++++ app/uploaders/stdin_data_uploader.rb | 2 +- app/uploaders/stdin_timing_uploader.rb | 2 +- app/uploaders/stdout_data_uploader.rb | 2 +- app/uploaders/stdout_timing_uploader.rb | 2 +- spec/fixtures/munch.gz | Bin 0 -> 2457 bytes ...ec.rb => compressed_file_uploader_spec.rb} | 34 ++++++++++++------ 8 files changed, 60 insertions(+), 31 deletions(-) delete mode 100644 app/uploaders/bzip2_uploader.rb create mode 100644 app/uploaders/compressed_file_uploader.rb create mode 100644 spec/fixtures/munch.gz rename spec/uploaders/{bzip2_uploader_spec.rb => compressed_file_uploader_spec.rb} (93%) diff --git a/app/uploaders/bzip2_uploader.rb b/app/uploaders/bzip2_uploader.rb deleted file mode 100644 index 3402ae5..0000000 --- a/app/uploaders/bzip2_uploader.rb +++ /dev/null @@ -1,17 +0,0 @@ -class Bzip2Uploader < BaseUploader - - def decompressed_path - return unless file - - cache_stored_file! unless cached? - - out_path = "#{current_path}.decompressed" - - unless File.exist?(out_path) - system("bzip2 -d -k -c #{current_path} >#{out_path}") - end - - out_path - end - -end diff --git a/app/uploaders/compressed_file_uploader.rb b/app/uploaders/compressed_file_uploader.rb new file mode 100644 index 0000000..d029df3 --- /dev/null +++ b/app/uploaders/compressed_file_uploader.rb @@ -0,0 +1,32 @@ +class CompressedFileUploader < BaseUploader + + def decompressed_path + return unless file + + cache_stored_file! unless cached? + + out_path = "#{current_path}.decompressed" + + unless File.exist?(out_path) + decompress(out_path) + end + + out_path + end + + private + + def decompress(out_path) + header = File.read(current_path, 2).bytes + + case header + when [31, 139] + system("gzip -d -k -c #{current_path} >#{out_path}") + when [66, 90] + system("bzip2 -d -k -c #{current_path} >#{out_path}") + else + raise "unknown compressed file format" + end + end + +end diff --git a/app/uploaders/stdin_data_uploader.rb b/app/uploaders/stdin_data_uploader.rb index f838d12..67c0cb7 100644 --- a/app/uploaders/stdin_data_uploader.rb +++ b/app/uploaders/stdin_data_uploader.rb @@ -1,4 +1,4 @@ -class StdinDataUploader < Bzip2Uploader +class StdinDataUploader < CompressedFileUploader def store_dir store_dir_prefix + diff --git a/app/uploaders/stdin_timing_uploader.rb b/app/uploaders/stdin_timing_uploader.rb index dc845e8..69e0411 100644 --- a/app/uploaders/stdin_timing_uploader.rb +++ b/app/uploaders/stdin_timing_uploader.rb @@ -1 +1 @@ -class StdinTimingUploader < Bzip2Uploader; end +class StdinTimingUploader < CompressedFileUploader; end diff --git a/app/uploaders/stdout_data_uploader.rb b/app/uploaders/stdout_data_uploader.rb index ffe71bd..5da3b71 100644 --- a/app/uploaders/stdout_data_uploader.rb +++ b/app/uploaders/stdout_data_uploader.rb @@ -1,4 +1,4 @@ -class StdoutDataUploader < Bzip2Uploader +class StdoutDataUploader < CompressedFileUploader def store_dir store_dir_prefix + diff --git a/app/uploaders/stdout_timing_uploader.rb b/app/uploaders/stdout_timing_uploader.rb index 513c6d8..ca0609e 100644 --- a/app/uploaders/stdout_timing_uploader.rb +++ b/app/uploaders/stdout_timing_uploader.rb @@ -1 +1 @@ -class StdoutTimingUploader < Bzip2Uploader; end +class StdoutTimingUploader < CompressedFileUploader; end diff --git a/spec/fixtures/munch.gz b/spec/fixtures/munch.gz new file mode 100644 index 0000000000000000000000000000000000000000..d89005eff128d62a9dc0ca0235333edc421b2f50 GIT binary patch literal 2457 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 X$9HA#pYy(PgkJp%vkN=cE+qf}1V)!- literal 0 HcmV?d00001 diff --git a/spec/uploaders/bzip2_uploader_spec.rb b/spec/uploaders/compressed_file_uploader_spec.rb similarity index 93% rename from spec/uploaders/bzip2_uploader_spec.rb rename to spec/uploaders/compressed_file_uploader_spec.rb index 5172258..5cd57f1 100644 --- a/spec/uploaders/bzip2_uploader_spec.rb +++ b/spec/uploaders/compressed_file_uploader_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' -describe Bzip2Uploader do - let(:uploader) { Bzip2Uploader.new(user, :photo) } +describe CompressedFileUploader do + let(:uploader) { CompressedFileUploader.new(user, :photo) } let(:user) { User.new } describe '#decompressed_path' do @@ -14,14 +14,7 @@ describe Bzip2Uploader do end context "when file was stored" do - let(:decompressed_data) { File.read(subject) } - - before do - uploader.store!(File.open('spec/fixtures/munch.bz2')) - end - - it 'returns a path to the decompressed data' do - expect(decompressed_data).to eq(< !! `- ;! `"$$ `? EOS + + context "and it was bzip2" do + before do + uploader.store!(File.open('spec/fixtures/munch.bz2')) + end + + it 'returns a path to the decompressed data' do + path = subject + expect(File.read(path)).to eq(expected_contents) + end + end + + context "and it was gzip" do + before do + uploader.store!(File.open('spec/fixtures/munch.gz')) + end + + it 'returns a path to the decompressed data' do + path = subject + expect(File.read(path)).to eq(expected_contents) + end end end end