s3grep 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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