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 +4 -4
- data/bin/s3grep +43 -3
- data/lib/s3grep/directory.rb +68 -0
- data/lib/s3grep.rb +1 -0
- data/s3grep.gemspec +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79fb95abcecc2f5378aa5eed08630cd0bc51203b492ac5466870a7f3fdf337c7
|
4
|
+
data.tar.gz: 3f3ef3d4a0ca35dd5c1addc67c3f065144ad1ded162a90d34b19f2ff876ef822
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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
|
-
|
9
|
-
|
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
data/s3grep.gemspec
CHANGED
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.
|
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-
|
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
|