lib/s3grep/search.rb in s3grep-0.1.0 vs lib/s3grep/search.rb in s3grep-0.1.1

- old
+ new

@@ -1,26 +1,34 @@ require 'aws-sdk-s3' +require 'cgi' module S3Grep class Search attr_reader :s3_url, - :aws_s3_client + :aws_s3_client, + :compression - def initialize(s3_url, aws_s3_client) + def initialize(s3_url, aws_s3_client, compression = nil) @s3_url = s3_url @aws_s3_client = aws_s3_client + @compression = compression end def self.search(s3_url, aws_s3_client, regex, &block) - new(s3_url, aws_s3_client).search(regex, &block) + new(s3_url, aws_s3_client, detect_compression(s3_url)).search(regex, &block) end - def search(regex) - body = s3_object.body + def self.detect_compression(s3_url) + return :gzip if s3_url =~ /\.gz$/i + return :zip if s3_url =~ /\.zip$/i + nil + end + + def search(regex) line_number = 0 - body.each do |line| + to_io.each do |line| line_number += 1 next unless line.match?(regex) yield line_number, line end @@ -30,11 +38,25 @@ uri = URI(s3_url) aws_s3_client.get_object( { bucket: uri.host, - key: uri.path[1..-1] + key: CGI.unescape(uri.path[1..-1]) } ) + end + + def to_io + body = s3_object.body + + if compression == :gzip + Zlib::GzipReader.new(body) + elsif compression == :zip + require 'rubyzip' + zip = Zip::File.open_buffer(body) + zip.entries.first.get_input_stream + else + body + end end end end