s3grep 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eae78edbf05a9d1e813b713cbf0f6f01ae1fdd1a38c9af08d7e9e313193a2bc0
4
- data.tar.gz: 643276478a1368e0e1c715e24d422bf3bbeb9c3752cbea3b996606cce57a6901
3
+ metadata.gz: 79fb95abcecc2f5378aa5eed08630cd0bc51203b492ac5466870a7f3fdf337c7
4
+ data.tar.gz: 3f3ef3d4a0ca35dd5c1addc67c3f065144ad1ded162a90d34b19f2ff876ef822
5
5
  SHA512:
6
- metadata.gz: 759897195cc0b5b990e3cc1553af16eb908edba8472cc92236d2cc4a37ee0e98cb5bad1b05b872cc92db6bab11fcdead6a10ebb3e6ea862ef3b28a4cde9f0f94
7
- data.tar.gz: 7065e3e8e118917b503565ef6d3cc4bae1dbd0ee33733af8a8b47071c170184e8007b005a3ce0b0631eadec589be8bc1f6e313918c9c57481603fd42086f3854
6
+ metadata.gz: 0b8ce72335c79d213e5a340e76f3ebc3893983ac82338531dccba00bfa7789911fc300315a05d6f020e9647b96c91487f775e2c8aaebae557aacf0fa391fe3eb
7
+ data.tar.gz: c4f931f374611f239028dca1eb547bd23f4162e7f328c500202f1b10ce363bf4421f9ee0ee3ebb9c467ac5572d28b9679424e3dfd4602d7d9ceb209952c76b9f
data/bin/s3grep CHANGED
@@ -1,10 +1,50 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ require 'optparse'
3
4
  require 's3grep'
5
+ require 'aws-sdk-s3'
4
6
 
5
- regex = Regexp.new(ARGV[0])
7
+ options = {
8
+ ignore_case: false,
9
+ recursive: false,
10
+ file_pattern: /.*/
11
+ }
12
+ OptionParser.new do |opts|
13
+ opts.banner = 'Usage: s3grep [options]'
14
+
15
+ opts.on('-i', '--ignore-case', 'Ignore case') do
16
+ options[:ignore_case] = true
17
+ end
18
+
19
+ opts.on('-r', '--recursive', 'Search for file in folder') do
20
+ options[:recursive] = true
21
+ end
22
+
23
+ opts.on('--include FILE_PATTERN', 'Include matching files') do |v|
24
+ options[:file_pattern] = Regexp.new(v, Regexp::IGNORECASE)
25
+ end
26
+ end.parse!
27
+
28
+ regex_options =
29
+ if options[:ignore_case]
30
+ Regexp::IGNORECASE
31
+ else
32
+ 0
33
+ end
34
+
35
+ regex = Regexp.new(ARGV[0], regex_options)
6
36
  s3_url = ARGV[1]
7
37
 
8
- S3Grep::Search.search(s3_url, Aws::S3::Client.new, regex) do |line_number, line|
9
- puts "#{s3_url}:#{line_number} #{line}"
38
+ aws_s3_client = Aws::S3::Client.new
39
+
40
+ if options[:recursive]
41
+ S3Grep::Directory.glob(s3_url, aws_s3_client, options[:file_pattern]) do |s3_file|
42
+ S3Grep::Search.search(s3_file, aws_s3_client, regex) do |line_number, line|
43
+ puts "#{s3_file}:#{line_number} #{line}"
44
+ end
45
+ end
46
+ else
47
+ S3Grep::Search.search(s3_url, aws_s3_client, regex) do |line_number, line|
48
+ puts "#{s3_url}:#{line_number} #{line}"
49
+ end
10
50
  end
@@ -0,0 +1,68 @@
1
+ require 'aws-sdk-s3'
2
+ require 'cgi'
3
+
4
+ # Purpose search through a directory on S3 for a specified file pattern
5
+ module S3Grep
6
+ class Directory
7
+ attr_reader :s3_url,
8
+ :aws_s3_client
9
+
10
+ def initialize(s3_url, aws_s3_client)
11
+ @s3_url = s3_url
12
+ @aws_s3_client = aws_s3_client
13
+ end
14
+
15
+ def self.glob(s3_url, aws_s3_client, regex, &block)
16
+ new(s3_url, aws_s3_client).glob(regex, &block)
17
+ end
18
+
19
+ def glob(regex)
20
+ each do |s3_file|
21
+ next unless s3_file.match?(regex)
22
+
23
+ yield s3_file
24
+ end
25
+ end
26
+
27
+ def each
28
+ uri = URI(s3_url)
29
+
30
+ max_keys = 1_000
31
+
32
+ prefix = CGI.unescape(uri.path[1..-1] || '')
33
+
34
+ resp = aws_s3_client.list_objects(
35
+ {
36
+ bucket: uri.host,
37
+ prefix: prefix,
38
+ max_keys: max_keys
39
+ }
40
+ )
41
+
42
+ resp.contents.each do |content|
43
+ yield('s3://' + uri.host + '/' + escape_path(content.key))
44
+ end
45
+
46
+ while resp.contents.size == max_keys
47
+ marker = resp.contents.last.key
48
+
49
+ resp = aws_s3_client.list_objects(
50
+ {
51
+ bucket: uri.host,
52
+ prefix: prefix,
53
+ max_keys: max_keys,
54
+ marker: marker
55
+ }
56
+ )
57
+
58
+ resp.contents.each do |content|
59
+ yield('s3://' + uri.host + '/' + escape_path(content.key))
60
+ end
61
+ end
62
+ end
63
+
64
+ def escape_path(s3_path)
65
+ s3_path.split('/').map { |part| CGI.escape(part) }.join('/')
66
+ end
67
+ end
68
+ end
data/lib/s3grep.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  module S3Grep
2
+ autoload :Directory, 's3grep/directory'
2
3
  autoload :Search, 's3grep/search'
3
4
  end
data/s3grep.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 's3grep'
5
- s.version = '0.1.1'
5
+ s.version = '0.1.2'
6
6
  s.licenses = ['MIT']
7
7
  s.summary = 'Search through S3 files'
8
8
  s.description = 'Tools for searching files on S3'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: s3grep
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Doug Youch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-08 00:00:00.000000000 Z
11
+ date: 2022-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-s3
@@ -40,6 +40,7 @@ files:
40
40
  - README.md
41
41
  - bin/s3grep
42
42
  - lib/s3grep.rb
43
+ - lib/s3grep/directory.rb
43
44
  - lib/s3grep/search.rb
44
45
  - s3grep.gemspec
45
46
  - script/console