swa 0.8.6 → 1.0.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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.beads/.gitignore +18 -0
  3. data/.beads/issues.jsonl +5 -0
  4. data/.rubocop.yml +39 -0
  5. data/AGENTS.md +541 -0
  6. data/CLAUDE.md +5 -0
  7. data/Gemfile +9 -1
  8. data/README.md +0 -5
  9. data/Rakefile +2 -0
  10. data/bin/console +1 -0
  11. data/exe/swa +2 -1
  12. data/lib/swa/athena/catalog.rb +4 -0
  13. data/lib/swa/athena/database.rb +4 -0
  14. data/lib/swa/athena/query_execution.rb +4 -0
  15. data/lib/swa/athena/work_group.rb +4 -0
  16. data/lib/swa/cli/athena_command.rb +93 -42
  17. data/lib/swa/cli/base_command.rb +22 -14
  18. data/lib/swa/cli/cloud_formation_command.rb +11 -4
  19. data/lib/swa/cli/cloudtrail_command.rb +130 -0
  20. data/lib/swa/cli/collection_behaviour.rb +4 -2
  21. data/lib/swa/cli/data_output.rb +12 -11
  22. data/lib/swa/cli/ec2_command.rb +21 -37
  23. data/lib/swa/cli/elb_command.rb +5 -3
  24. data/lib/swa/cli/filter_options.rb +6 -1
  25. data/lib/swa/cli/glue_command.rb +84 -36
  26. data/lib/swa/cli/iam_command.rb +42 -33
  27. data/lib/swa/cli/item_behaviour.rb +4 -2
  28. data/lib/swa/cli/kms_command.rb +26 -5
  29. data/lib/swa/cli/lake_formation_command.rb +72 -11
  30. data/lib/swa/cli/main_command.rb +19 -9
  31. data/lib/swa/cli/s3_command.rb +32 -24
  32. data/lib/swa/cli/selector.rb +4 -0
  33. data/lib/swa/cli/tag_filter_options.rb +6 -2
  34. data/lib/swa/cloud_formation/stack.rb +5 -1
  35. data/lib/swa/cloud_trail/event.rb +49 -0
  36. data/lib/swa/data_presentation.rb +23 -22
  37. data/lib/swa/ec2/image.rb +7 -5
  38. data/lib/swa/ec2/instance.rb +5 -1
  39. data/lib/swa/ec2/key_pair.rb +4 -0
  40. data/lib/swa/ec2/security_group.rb +5 -3
  41. data/lib/swa/ec2/snapshot.rb +6 -4
  42. data/lib/swa/ec2/subnet.rb +5 -3
  43. data/lib/swa/ec2/tagged_resource.rb +4 -0
  44. data/lib/swa/ec2/volume.rb +7 -5
  45. data/lib/swa/ec2/vpc.rb +5 -3
  46. data/lib/swa/elb/load_balancer.rb +4 -0
  47. data/lib/swa/glue/crawl.rb +5 -1
  48. data/lib/swa/glue/crawler.rb +5 -1
  49. data/lib/swa/glue/database.rb +5 -0
  50. data/lib/swa/glue/job.rb +4 -0
  51. data/lib/swa/glue/job_bookmark_entry.rb +4 -0
  52. data/lib/swa/glue/job_run.rb +5 -1
  53. data/lib/swa/glue/partition.rb +5 -1
  54. data/lib/swa/glue/table.rb +4 -0
  55. data/lib/swa/iam/credentials.rb +7 -7
  56. data/lib/swa/iam/group.rb +5 -3
  57. data/lib/swa/iam/instance_profile.rb +5 -3
  58. data/lib/swa/iam/policy.rb +5 -3
  59. data/lib/swa/iam/role.rb +10 -3
  60. data/lib/swa/iam/role_policy.rb +5 -3
  61. data/lib/swa/iam/user.rb +5 -3
  62. data/lib/swa/kms/alias.rb +4 -0
  63. data/lib/swa/kms/key.rb +4 -0
  64. data/lib/swa/lake_formation/data_lake_settings.rb +15 -0
  65. data/lib/swa/lake_formation/permission.rb +5 -1
  66. data/lib/swa/lake_formation/resource_info.rb +4 -0
  67. data/lib/swa/lake_formation/tag.rb +25 -0
  68. data/lib/swa/polyfill.rb +3 -1
  69. data/lib/swa/record.rb +5 -3
  70. data/lib/swa/resource.rb +3 -1
  71. data/lib/swa/s3/bucket.rb +5 -3
  72. data/lib/swa/s3/object.rb +7 -5
  73. data/lib/swa/s3/object_list_entry.rb +4 -0
  74. data/lib/swa/s3/object_version.rb +13 -7
  75. data/lib/swa/version.rb +5 -1
  76. data/lib/swa.rb +2 -0
  77. data/swa.gemspec +29 -25
  78. metadata +63 -29
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/cli/filter_options"
2
4
 
3
5
  module Swa
6
+
4
7
  module CLI
5
8
 
6
9
  module TagFilterOptions
@@ -10,9 +13,9 @@ module Swa
10
13
  include FilterOptions
11
14
 
12
15
  option "--tagged", "KEY[=VALUE]", "with matching tag",
13
- :multivalued => true, :attribute_name => :tag_list
16
+ multivalued: true, attribute_name: :tag_list
14
17
  option "--not-tagged", "KEY[=VALUE]", "WITHOUT matching tag",
15
- :multivalued => true, :attribute_name => :tag_blacklist
18
+ multivalued: true, attribute_name: :tag_blacklist
16
19
 
17
20
  option "--stack", "NAME", "from the named CloudFormation stack"
18
21
 
@@ -54,4 +57,5 @@ module Swa
54
57
  end
55
58
 
56
59
  end
60
+
57
61
  end
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "stackup/stack"
2
4
  require "swa/resource"
3
5
  require "yaml"
4
6
 
5
7
  module Swa
8
+
6
9
  module CloudFormation
7
10
 
8
11
  class Stack < Resource
@@ -47,7 +50,7 @@ module Swa
47
50
 
48
51
  private
49
52
 
50
- alias_method :stack, :aws_resource
53
+ alias stack aws_resource
51
54
 
52
55
  def stackup_stack
53
56
  Stackup::Stack.new(name, stack.client)
@@ -56,4 +59,5 @@ module Swa
56
59
  end
57
60
 
58
61
  end
62
+
59
63
  end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "swa/record"
4
+ require "multi_json"
5
+
6
+ module Swa
7
+
8
+ module CloudTrail
9
+
10
+ class Event < Record
11
+
12
+ def summary
13
+ [
14
+ pad(event_time, 25),
15
+ pad(event_id, 36),
16
+ qualified_event_name
17
+ ].join(" ")
18
+ end
19
+
20
+ delegate :event_id
21
+ delegate :event_name
22
+ delegate :event_source
23
+ delegate :username
24
+
25
+ def event_time
26
+ aws_record.event_time.iso8601
27
+ end
28
+
29
+ def abbreviated_event_source
30
+ event_source.sub(/\.amazonaws\.com\z/, "")
31
+ end
32
+
33
+ def qualified_event_name
34
+ [abbreviated_event_source, event_name].join(":")
35
+ end
36
+
37
+ def id
38
+ event_id
39
+ end
40
+
41
+ def data
42
+ MultiJson.load(aws_record.cloud_trail_event)
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/polyfill"
2
4
 
3
5
  module Swa
@@ -10,31 +12,31 @@ module Swa
10
12
  %("#{value}") if value && !value.empty?
11
13
  end
12
14
 
13
- def pad(s, width)
14
- s = (s || "").to_s
15
- s.ljust(width)
15
+ def pad(str, width)
16
+ str = (str || "").to_s
17
+ str.ljust(width)
16
18
  end
17
19
 
18
- def rpad(s, width)
19
- s = (s || "").to_s
20
- s.rjust(width)
20
+ def rpad(str, width)
21
+ str = (str || "").to_s
22
+ str.rjust(width)
21
23
  end
22
24
 
23
25
  WIDTH_BY_TYPE = {
24
- :availability_zone => 15,
25
- :cidr_block => 18,
26
- :group_id => 11,
27
- :image_id => 12,
28
- :instance_id => 19,
29
- :instance_type => 10,
30
- :private_ip_address => 14,
31
- :public_ip_address => 14,
32
- :snapshot_id => 22,
33
- :subnet_id => 15,
34
- :volume_id => 21,
35
- :volume_type => 9,
36
- :vpc_id => 12
37
- }
26
+ availability_zone: 15,
27
+ cidr_block: 18,
28
+ group_id: 11,
29
+ image_id: 12,
30
+ instance_id: 19,
31
+ instance_type: 10,
32
+ private_ip_address: 14,
33
+ public_ip_address: 14,
34
+ snapshot_id: 22,
35
+ subnet_id: 15,
36
+ volume_id: 21,
37
+ volume_type: 9,
38
+ vpc_id: 12
39
+ }.freeze
38
40
 
39
41
  def field(resource, field_name, type = field_name)
40
42
  width = WIDTH_BY_TYPE.fetch(type.to_sym)
@@ -42,11 +44,10 @@ module Swa
42
44
  pad(value, width)
43
45
  end
44
46
 
45
-
46
47
  def stringify_keys(data)
47
48
  case data
48
49
  when Hash
49
- data.map { |k,v| [k.to_s, stringify_keys(v)] }.to_h
50
+ data.to_h { |k, v| [k.to_s, stringify_keys(v)] }
50
51
  when Array
51
52
  data.map { |v| stringify_keys(v) }
52
53
  else
data/lib/swa/ec2/image.rb CHANGED
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/resource"
2
4
  require "swa/ec2/tagged_resource"
3
5
 
4
6
  module Swa
7
+
5
8
  module EC2
6
9
 
7
10
  class Image < Resource
@@ -29,19 +32,18 @@ module Swa
29
32
 
30
33
  def delete
31
34
  ebs_snapshot_ids = ami.block_device_mappings.map do |mapping|
32
- mapping.ebs.snapshot_id if mapping.ebs
35
+ mapping.ebs&.snapshot_id
33
36
  end.compact
34
37
  deregister
35
38
  ebs_snapshot_ids.each do |snapshot_id|
36
- ami.client.delete_snapshot(:snapshot_id => snapshot_id)
39
+ ami.client.delete_snapshot(snapshot_id: snapshot_id)
37
40
  end
38
41
  end
39
42
 
40
- private
41
-
42
- alias_method :ami, :aws_resource
43
+ alias ami aws_resource
43
44
 
44
45
  end
45
46
 
46
47
  end
48
+
47
49
  end
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "base64"
2
4
  require "swa/resource"
3
5
  require "swa/ec2/tagged_resource"
4
6
 
5
7
  module Swa
8
+
6
9
  module EC2
7
10
 
8
11
  class Instance < Resource
@@ -40,7 +43,7 @@ module Swa
40
43
 
41
44
  private
42
45
 
43
- alias_method :i, :aws_resource
46
+ alias i aws_resource
44
47
 
45
48
  def decorated_key_name
46
49
  "🔑 #{i.key_name}" if i.key_name
@@ -49,4 +52,5 @@ module Swa
49
52
  end
50
53
 
51
54
  end
55
+
52
56
  end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/resource"
2
4
 
3
5
  module Swa
6
+
4
7
  module EC2
5
8
 
6
9
  class KeyPair < Resource
@@ -25,4 +28,5 @@ module Swa
25
28
  end
26
29
 
27
30
  end
31
+
28
32
  end
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/ec2/tagged_resource"
2
4
  require "swa/resource"
3
5
 
4
6
  module Swa
7
+
5
8
  module EC2
6
9
 
7
10
  class SecurityGroup < Resource
@@ -24,11 +27,10 @@ module Swa
24
27
 
25
28
  delegate :delete
26
29
 
27
- private
28
-
29
- alias_method :sg, :aws_resource
30
+ alias sg aws_resource
30
31
 
31
32
  end
32
33
 
33
34
  end
35
+
34
36
  end
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/resource"
2
4
  require "swa/ec2/tagged_resource"
3
5
 
4
6
  module Swa
7
+
5
8
  module EC2
6
9
 
7
10
  class Snapshot < Resource
@@ -16,7 +19,7 @@ module Swa
16
19
  [
17
20
  field(s, :snapshot_id),
18
21
  field(s, :volume_id),
19
- sprintf("%5d", volume_size),
22
+ format("%5d", volume_size),
20
23
  start_time.iso8601,
21
24
  rpad(progress, 4),
22
25
  quoted(description)
@@ -30,11 +33,10 @@ module Swa
30
33
 
31
34
  delegate :delete
32
35
 
33
- private
34
-
35
- alias_method :s, :aws_resource
36
+ alias s aws_resource
36
37
 
37
38
  end
38
39
 
39
40
  end
41
+
40
42
  end
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/ec2/tagged_resource"
2
4
  require "swa/resource"
3
5
 
4
6
  module Swa
7
+
5
8
  module EC2
6
9
 
7
10
  class Subnet < Resource
@@ -26,11 +29,10 @@ module Swa
26
29
  tags["Name"]
27
30
  end
28
31
 
29
- private
30
-
31
- alias_method :subnet, :aws_resource
32
+ alias subnet aws_resource
32
33
 
33
34
  end
34
35
 
35
36
  end
37
+
36
38
  end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/resource"
2
4
 
3
5
  module Swa
6
+
4
7
  module EC2
5
8
 
6
9
  module TaggedResource
@@ -14,4 +17,5 @@ module Swa
14
17
  end
15
18
 
16
19
  end
20
+
17
21
  end
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/resource"
2
4
  require "swa/ec2/tagged_resource"
3
5
 
4
6
  module Swa
7
+
5
8
  module EC2
6
9
 
7
10
  class Volume < Resource
@@ -16,7 +19,7 @@ module Swa
16
19
  [
17
20
  field(v, :volume_id),
18
21
  field(v, :snapshot_id),
19
- sprintf("%5d", v.size),
22
+ format("%5d", v.size),
20
23
  field(v, :volume_type),
21
24
  field(attachment, :instance_id),
22
25
  pad(attachment.device, 9),
@@ -29,16 +32,15 @@ module Swa
29
32
  end
30
33
 
31
34
  def attachment
32
- v.attachments.first || OpenStruct.new
35
+ v.attachments.first || OpenStruct.new # rubocop:disable Style/OpenStructUse
33
36
  end
34
37
 
35
38
  delegate :delete
36
39
 
37
- private
38
-
39
- alias_method :v, :aws_resource
40
+ alias v aws_resource
40
41
 
41
42
  end
42
43
 
43
44
  end
45
+
44
46
  end
data/lib/swa/ec2/vpc.rb CHANGED
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/ec2/tagged_resource"
2
4
  require "swa/resource"
3
5
 
4
6
  module Swa
7
+
5
8
  module EC2
6
9
 
7
10
  class Vpc < Resource
@@ -29,11 +32,10 @@ module Swa
29
32
  "*" if vpc.is_default
30
33
  end
31
34
 
32
- private
33
-
34
- alias_method :vpc, :aws_resource
35
+ alias vpc aws_resource
35
36
 
36
37
  end
37
38
 
38
39
  end
40
+
39
41
  end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/record"
2
4
 
3
5
  module Swa
6
+
4
7
  module ELB
5
8
 
6
9
  class LoadBalancer < Record
@@ -21,4 +24,5 @@ module Swa
21
24
  end
22
25
 
23
26
  end
27
+
24
28
  end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/record"
2
4
 
3
5
  module Swa
6
+
4
7
  module Glue
5
8
 
6
9
  class Crawl < Record
@@ -18,8 +21,9 @@ module Swa
18
21
  delegate :state
19
22
  delegate :start_time
20
23
  delegate :end_time
21
-
24
+
22
25
  end
23
26
 
24
27
  end
28
+
25
29
  end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/record"
2
4
 
3
5
  module Swa
6
+
4
7
  module Glue
5
8
 
6
9
  class Crawler < Record
@@ -21,8 +24,9 @@ module Swa
21
24
  def last_crawl_status
22
25
  aws_record.last_crawl&.status || "NEW"
23
26
  end
24
-
27
+
25
28
  end
26
29
 
27
30
  end
31
+
28
32
  end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/record"
2
4
 
3
5
  module Swa
6
+
4
7
  module Glue
5
8
 
6
9
  class Database < Record
@@ -9,9 +12,11 @@ module Swa
9
12
  name
10
13
  end
11
14
 
15
+ delegate :catalog_id
12
16
  delegate :name
13
17
 
14
18
  end
15
19
 
16
20
  end
21
+
17
22
  end
data/lib/swa/glue/job.rb CHANGED
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/record"
2
4
 
3
5
  module Swa
6
+
4
7
  module Glue
5
8
 
6
9
  class Job < Record
@@ -18,4 +21,5 @@ module Swa
18
21
  end
19
22
 
20
23
  end
24
+
21
25
  end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/record"
2
4
 
3
5
  module Swa
6
+
4
7
  module Glue
5
8
 
6
9
  class JobBookmarkEntry < Record
@@ -14,4 +17,5 @@ module Swa
14
17
  end
15
18
 
16
19
  end
20
+
17
21
  end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/record"
2
4
 
3
5
  module Swa
6
+
4
7
  module Glue
5
8
 
6
9
  class JobRun < Record
@@ -19,8 +22,9 @@ module Swa
19
22
  def started_on
20
23
  aws_record.started_on.iso8601
21
24
  end
22
-
25
+
23
26
  end
24
27
 
25
28
  end
29
+
26
30
  end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/record"
2
4
 
3
5
  module Swa
6
+
4
7
  module Glue
5
8
 
6
9
  class Partition < Record
@@ -19,8 +22,9 @@ module Swa
19
22
  def creation_time
20
23
  aws_record.creation_time.iso8601
21
24
  end
22
-
25
+
23
26
  end
24
27
 
25
28
  end
29
+
26
30
  end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/record"
2
4
 
3
5
  module Swa
6
+
4
7
  module Glue
5
8
 
6
9
  class Table < Record
@@ -14,4 +17,5 @@ module Swa
14
17
  end
15
18
 
16
19
  end
20
+
17
21
  end
@@ -1,20 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Swa
4
+
2
5
  module IAM
3
6
 
4
7
  class Credentials
5
8
 
6
9
  def initialize(attributes = {})
7
- attributes.to_h.each do |k,v|
10
+ attributes.to_h.each do |k, v|
8
11
  send("#{k}=", v)
9
12
  end
10
13
  end
11
14
 
12
- attr_accessor :access_key_id
13
- attr_accessor :secret_access_key
14
- attr_accessor :session_token
15
-
16
- attr_accessor :expires_at
17
- alias :expiration= :expires_at=
15
+ attr_accessor :access_key_id, :secret_access_key, :session_token, :expires_at
16
+ alias expiration= expires_at=
18
17
 
19
18
  def to_env
20
19
  {
@@ -28,4 +27,5 @@ module Swa
28
27
  end
29
28
 
30
29
  end
30
+
31
31
  end
data/lib/swa/iam/group.rb CHANGED
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/resource"
2
4
 
3
5
  module Swa
6
+
4
7
  module IAM
5
8
 
6
9
  class Group < Resource
@@ -19,11 +22,10 @@ module Swa
19
22
  arn
20
23
  end
21
24
 
22
- private
23
-
24
- alias_method :group, :aws_resource
25
+ alias group aws_resource
25
26
 
26
27
  end
27
28
 
28
29
  end
30
+
29
31
  end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "swa/resource"
2
4
 
3
5
  module Swa
6
+
4
7
  module IAM
5
8
 
6
9
  class InstanceProfile < Resource
@@ -16,11 +19,10 @@ module Swa
16
19
  delegate :name
17
20
  delegate :arn
18
21
 
19
- private
20
-
21
- alias_method :profile, :aws_resource
22
+ alias profile aws_resource
22
23
 
23
24
  end
24
25
 
25
26
  end
27
+
26
28
  end
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cgi"
2
4
  require "swa/resource"
3
5
 
4
6
  module Swa
7
+
5
8
  module IAM
6
9
 
7
10
  class Policy < Resource
@@ -21,11 +24,10 @@ module Swa
21
24
  CGI.unescape(policy.default_version.document)
22
25
  end
23
26
 
24
- private
25
-
26
- alias_method :policy, :aws_resource
27
+ alias policy aws_resource
27
28
 
28
29
  end
29
30
 
30
31
  end
32
+
31
33
  end