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.
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
- type = edef
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
- client_class = edef["client_class"] || guess_client_class(sdk)
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 get_entity_types sdk
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.each { |row| Utils._deep_transform_keys_in_object!(row, &:to_s) }
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 self._deep_transform_keys_in_object!(object, &block)
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lsaws
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
data/lib/lsaws.rb CHANGED
@@ -9,5 +9,7 @@ module Lsaws
9
9
  end
10
10
 
11
11
  require_relative "lsaws/version"
12
+ require_relative "lsaws/sdk_parser"
12
13
  require_relative "lsaws/cli"
14
+ require_relative "lsaws/utils"
13
15
  require_relative "lsaws/lister"
data/lsaws.yml CHANGED
@@ -39,3 +39,5 @@ kms:
39
39
  - alias_name
40
40
  - target_key_id
41
41
  - last_updated_date
42
+ s3:
43
+ default: buckets
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.1.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-09 00:00:00.000000000 Z
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