Class: S3Grep::Search

Inherits:
Object
  • Object
show all
Defined in:
lib/s3grep/search.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(s3_url, aws_s3_client, compression = nil) ⇒ Search

Returns a new instance of Search.



10
11
12
13
14
# File 'lib/s3grep/search.rb', line 10

def initialize(s3_url, aws_s3_client, compression = nil)
  @s3_url = s3_url
  @aws_s3_client = aws_s3_client
  @compression = compression
end

Instance Attribute Details

#aws_s3_clientObject (readonly)

Returns the value of attribute aws_s3_client.



6
7
8
# File 'lib/s3grep/search.rb', line 6

def aws_s3_client
  @aws_s3_client
end

#compressionObject (readonly)

Returns the value of attribute compression.



6
7
8
# File 'lib/s3grep/search.rb', line 6

def compression
  @compression
end

#s3_urlObject (readonly)

Returns the value of attribute s3_url.



6
7
8
# File 'lib/s3grep/search.rb', line 6

def s3_url
  @s3_url
end

Class Method Details

.detect_compression(s3_url) ⇒ Object



20
21
22
23
24
25
# File 'lib/s3grep/search.rb', line 20

def self.detect_compression(s3_url)
  return :gzip if s3_url =~ /\.gz$/i
  return :zip if s3_url =~ /\.zip$/i

  nil
end

.search(s3_url, aws_s3_client, regex, &block) ⇒ Object



16
17
18
# File 'lib/s3grep/search.rb', line 16

def self.search(s3_url, aws_s3_client, regex, &block)
  new(s3_url, aws_s3_client, detect_compression(s3_url)).search(regex, &block)
end

Instance Method Details

#s3_objectObject



37
38
39
40
41
42
43
44
45
46
# File 'lib/s3grep/search.rb', line 37

def s3_object
  uri = URI(s3_url)

  aws_s3_client.get_object(
    {
      bucket: uri.host,
      key: CGI.unescape(uri.path[1..-1])
    }
  )
end

#search(regex) ⇒ Object



27
28
29
30
31
32
33
34
35
# File 'lib/s3grep/search.rb', line 27

def search(regex)
  line_number = 0
  to_io.each do |line|
    line_number += 1
    next unless line.match?(regex)

    yield line_number, line
  end
end

#to_ioObject



48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/s3grep/search.rb', line 48

def to_io
  body = s3_object.body

  if compression == :gzip
    Zlib::GzipReader.new(body)
  elsif compression == :zip
    require 'zip'
    zip = Zip::File.open_buffer(body)
    zip.entries.first.get_input_stream
  else
    body
  end
end