lsaws 0.1.0 → 0.2.0
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/Gemfile +3 -0
- data/Gemfile.lock +1378 -0
- data/lib/lsaws/lister.rb +10 -63
- data/lib/lsaws/sdk_parser.rb +68 -0
- data/lib/lsaws/utils.rb +24 -1
- data/lib/lsaws/version.rb +1 -1
- data/lib/lsaws.rb +2 -0
- data/lsaws.yml +2 -0
- metadata +3 -2
data/lib/lsaws/lister.rb
CHANGED
|
@@ -9,17 +9,16 @@ module Lsaws
|
|
|
9
9
|
class Lister
|
|
10
10
|
CONFIG = YAML.load_file(File.join(Lsaws.root, "lsaws.yml"))
|
|
11
11
|
|
|
12
|
+
include Utils
|
|
13
|
+
|
|
12
14
|
def initialize(options)
|
|
13
15
|
@options = options
|
|
14
16
|
end
|
|
15
17
|
|
|
16
|
-
def _prepare_entities(sdk, type)
|
|
18
|
+
def _prepare_entities(sdk, type, &block)
|
|
17
19
|
edef = CONFIG.dig(sdk, type)
|
|
18
|
-
if edef.is_a?(String)
|
|
19
|
-
|
|
20
|
-
edef = CONFIG[sdk][type] # should exist
|
|
21
|
-
raise Error, "unknown entity type: #{type}" unless edef
|
|
22
|
-
end
|
|
20
|
+
return _prepare_entities(sdk, edef, &block) if edef.is_a?(String) # redirect like 'default' -> 'instances'
|
|
21
|
+
|
|
23
22
|
edef ||= {}
|
|
24
23
|
require(edef["require"] || "aws-sdk-#{sdk}")
|
|
25
24
|
|
|
@@ -31,7 +30,8 @@ module Lsaws
|
|
|
31
30
|
end
|
|
32
31
|
params[:max_results] = @options[:max_results] if @options[:max_results]
|
|
33
32
|
|
|
34
|
-
|
|
33
|
+
sdkp = SDKParser.new(sdk)
|
|
34
|
+
client_class = edef["client_class"] || sdkp.client_class_name
|
|
35
35
|
client = Kernel.const_get(client_class).new
|
|
36
36
|
method_name = edef["method"] || (client.respond_to?("describe_#{type}") ? "describe_#{type}" : "list_#{type}")
|
|
37
37
|
unless client.respond_to?(method_name)
|
|
@@ -149,21 +149,8 @@ module Lsaws
|
|
|
149
149
|
proc { |entity| entity.tags.map { |tag| "#{tag.key}=#{tag.value}" }.join(", ") }
|
|
150
150
|
end
|
|
151
151
|
|
|
152
|
-
def get_sdks
|
|
153
|
-
r = []
|
|
154
|
-
Gem.path.each do |p|
|
|
155
|
-
next unless Dir.exist?(p)
|
|
156
|
-
|
|
157
|
-
r.append(*Dir[File.join(p, "gems/aws-sdk-*")].map do |gem_dir|
|
|
158
|
-
a = File.basename(gem_dir).split("-")
|
|
159
|
-
a.size == 4 ? a[2] : nil
|
|
160
|
-
end)
|
|
161
|
-
end
|
|
162
|
-
r.compact.uniq.sort - ["core"]
|
|
163
|
-
end
|
|
164
|
-
|
|
165
152
|
def list_sdks
|
|
166
|
-
_list_array get_sdks
|
|
153
|
+
_list_array SDKParser.get_sdks
|
|
167
154
|
end
|
|
168
155
|
|
|
169
156
|
def _list_array(a)
|
|
@@ -177,47 +164,8 @@ module Lsaws
|
|
|
177
164
|
end
|
|
178
165
|
end
|
|
179
166
|
|
|
180
|
-
def guess_client_class(sdk)
|
|
181
|
-
c = Aws.constants.find { |x| x.to_s.downcase == sdk }
|
|
182
|
-
"Aws::#{c}::Client"
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
def _get_method_rdoc(data, method)
|
|
186
|
-
pos = data =~ /^\s+def\s+#{method}\s*\(/
|
|
187
|
-
return nil unless pos
|
|
188
|
-
|
|
189
|
-
chunk = ""
|
|
190
|
-
bs = 4096
|
|
191
|
-
until chunk["\n\n"]
|
|
192
|
-
chunk = data[pos - bs..pos]
|
|
193
|
-
bs *= 2
|
|
194
|
-
end
|
|
195
|
-
chunk[chunk.rindex("\n\n") + 2..]
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
def get_entity_types(sdk)
|
|
199
|
-
require "aws-sdk-#{sdk}"
|
|
200
|
-
client_class = Kernel.const_get(guess_client_class(sdk))
|
|
201
|
-
methods = client_class
|
|
202
|
-
.instance_methods
|
|
203
|
-
.find_all { |m| m =~ /^(describe|list)_.+s$/ && m !~ /(status|access)$/ }
|
|
204
|
-
|
|
205
|
-
return [] if methods.empty?
|
|
206
|
-
|
|
207
|
-
data = File.read(client_class.instance_method(methods[0]).source_location[0])
|
|
208
|
-
methods.delete_if do |m|
|
|
209
|
-
rdoc = _get_method_rdoc(data, m)
|
|
210
|
-
next unless rdoc
|
|
211
|
-
|
|
212
|
-
required_params = rdoc.scan(/^\s+# @option params \[required, (.+?)\] :(\w+)/)
|
|
213
|
-
required_params.any?
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
methods.map { |m| m.to_s.sub(/^(describe|list)_/, "") }.sort
|
|
217
|
-
end
|
|
218
|
-
|
|
219
167
|
def list_entity_types(sdk)
|
|
220
|
-
_list_array
|
|
168
|
+
_list_array SDKParser.new(sdk).entity_types
|
|
221
169
|
end
|
|
222
170
|
|
|
223
171
|
def _tabulo_guess_max_cols(rows, _cols)
|
|
@@ -273,8 +221,7 @@ module Lsaws
|
|
|
273
221
|
end
|
|
274
222
|
when :yaml
|
|
275
223
|
rows = entities2hashes(sdk, type)
|
|
276
|
-
rows.
|
|
277
|
-
puts rows.to_yaml
|
|
224
|
+
puts rows.map { |row| _deep_transform_keys_in_object(row, &:to_s) }.to_yaml
|
|
278
225
|
else
|
|
279
226
|
warn "[!] unknown format: #{@options[:format]}"
|
|
280
227
|
exit 1
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Lsaws
|
|
4
|
+
class SDKParser
|
|
5
|
+
def self.get_sdks
|
|
6
|
+
r = []
|
|
7
|
+
Gem.path.each do |p|
|
|
8
|
+
next unless Dir.exist?(p)
|
|
9
|
+
|
|
10
|
+
r.append(*Dir[File.join(p, "gems/aws-sdk-*")].map do |gem_dir|
|
|
11
|
+
a = File.basename(gem_dir).split("-")
|
|
12
|
+
a.size == 4 ? a[2] : nil
|
|
13
|
+
end)
|
|
14
|
+
end
|
|
15
|
+
r.compact.uniq.sort - ["core"]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def initialize(sdk)
|
|
19
|
+
@sdk = sdk
|
|
20
|
+
require "aws-sdk-#{sdk}"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def client_class_name
|
|
24
|
+
@client_class_name ||=
|
|
25
|
+
begin
|
|
26
|
+
c = Aws.constants.find { |x| x.to_s.downcase == @sdk }
|
|
27
|
+
"Aws::#{c}::Client"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def client_class
|
|
32
|
+
@client_class ||= Kernel.const_get(client_class_name)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def entity_types
|
|
36
|
+
methods = client_class
|
|
37
|
+
.instance_methods
|
|
38
|
+
.find_all { |m| m =~ /^(describe|list)_.+s$/ && m !~ /(status|access)$/ }
|
|
39
|
+
|
|
40
|
+
return [] if methods.empty?
|
|
41
|
+
|
|
42
|
+
methods.delete_if do |m|
|
|
43
|
+
rdoc = get_method_rdoc(m)
|
|
44
|
+
next(true) unless rdoc
|
|
45
|
+
|
|
46
|
+
required_params = rdoc.scan(/^\s+# @option params \[required, (.+?)\] :(\w+)/)
|
|
47
|
+
required_params.any?
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
methods.map { |m| m.to_s.sub(/^(describe|list)_/, "") }.sort
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def get_method_rdoc(method)
|
|
54
|
+
@source ||= File.read(client_class.instance_method(method).source_location[0])
|
|
55
|
+
|
|
56
|
+
pos = @source =~ /^\s+def\s+#{method}\s*\(/
|
|
57
|
+
return nil unless pos
|
|
58
|
+
|
|
59
|
+
chunk = ""
|
|
60
|
+
bs = 4096
|
|
61
|
+
until chunk["\n\n"]
|
|
62
|
+
chunk = @source[pos - bs..pos]
|
|
63
|
+
bs *= 2
|
|
64
|
+
end
|
|
65
|
+
chunk[chunk.rindex("\n\n") + 2..]
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
data/lib/lsaws/utils.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module Lsaws
|
|
4
4
|
module Utils
|
|
5
5
|
# copypasted from lib/active_support/core_ext/hash/keys.rb
|
|
6
|
-
def
|
|
6
|
+
def _deep_transform_keys_in_object!(object, &block)
|
|
7
7
|
case object
|
|
8
8
|
when Hash
|
|
9
9
|
object.each_key do |key|
|
|
@@ -17,5 +17,28 @@ module Lsaws
|
|
|
17
17
|
object
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
|
+
|
|
21
|
+
def _deep_transform_keys_in_object(object, &block)
|
|
22
|
+
case object
|
|
23
|
+
when Hash
|
|
24
|
+
object.each_with_object(object.class.new) do |(key, value), result|
|
|
25
|
+
result[yield(key)] = _deep_transform_keys_in_object(value, &block)
|
|
26
|
+
end
|
|
27
|
+
when Array
|
|
28
|
+
object.map { |e| _deep_transform_keys_in_object(e, &block) }
|
|
29
|
+
else
|
|
30
|
+
object
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# "2022-11-15 10:49:00 UTC" => "2022-11-15T10:49:00+00:00"
|
|
35
|
+
def to_iso8601(s)
|
|
36
|
+
s.gsub(/([0-9-]{10}) ([0-9:]+{8}) UTC/, '\1T\2+00:00')
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# "2022-11-15T10:49:00+00:00" => "2022-11-15 10:49:00 UTC"
|
|
40
|
+
def from_iso8601(s)
|
|
41
|
+
s.gsub(/([0-9-]{10})T([0-9:]+{8})\+00:00/, '\1 \2 UTC')
|
|
42
|
+
end
|
|
20
43
|
end
|
|
21
44
|
end
|
data/lib/lsaws/version.rb
CHANGED
data/lib/lsaws.rb
CHANGED
data/lsaws.yml
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lsaws
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Andrey "Zed" Zaikin
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-02-
|
|
11
|
+
date: 2023-02-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: aws-sdk-core
|
|
@@ -59,6 +59,7 @@ files:
|
|
|
59
59
|
- lib/lsaws.rb
|
|
60
60
|
- lib/lsaws/cli.rb
|
|
61
61
|
- lib/lsaws/lister.rb
|
|
62
|
+
- lib/lsaws/sdk_parser.rb
|
|
62
63
|
- lib/lsaws/utils.rb
|
|
63
64
|
- lib/lsaws/version.rb
|
|
64
65
|
- lsaws.gemspec
|