aws2md 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 753fbd40122b0d2536ceed52c9784cfc81b8fc3abfc20e6ed4ae2cfd38182be9
4
+ data.tar.gz: 532aa1f8099f3fd59da9d2fcc45c99af84b14bbe087d1522a600f66f45104d9f
5
+ SHA512:
6
+ metadata.gz: 596f0c4f84ba1af95f6bccf6ce8c0200871d079183646bfc9ceccd63fa8b9fcea1eab95400382a26c758f3fd026622dabfa94f274db8cc0b04954ea86a4fd015
7
+ data.tar.gz: 1f4c34c42088aa1753263cc5d6b7a4416bac5ec4c77e3384845a0ca50b3ef470bde49ae40f8c59438d41e3422b01538b5d2c4e448294ffd927ecfae3c73872b7
data/exe/aws2md ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require "aws2md"
5
+ rescue LoadError
6
+ $LOAD_PATH.unshift(File.expand_path("../../lib", __FILE__))
7
+ require "aws2md"
8
+ end
9
+
10
+ Aws2MD::CLI.new.run
data/lib/aws2md/cli.rb ADDED
@@ -0,0 +1,57 @@
1
+ require "json"
2
+ require "optparse"
3
+ require "aws2md/table" # ← テーブルロジック本体を別ファイルにする場合
4
+
5
+ module Aws2MD
6
+ class CLI
7
+ def run
8
+ options = {}
9
+
10
+ OptionParser.new do |opts|
11
+ opts.banner = "Usage: aws2md [options]"
12
+
13
+ opts.on("-o", "--output FORMAT", "Output format (v/h)") do |v|
14
+ unless %w[v h].include?(v)
15
+ raise OptionParser::InvalidArgument, "Invalid output format: #{v}. Must be 'v' or 'h'."
16
+ end
17
+ options[:output] = v
18
+ end
19
+
20
+ opts.on("-h", "--help", "Show help") do
21
+ puts opts
22
+ exit
23
+ end
24
+ end.parse!
25
+
26
+ begin
27
+ if STDIN.tty?
28
+ warn "Error: No input detected. Please pipe JSON data into this command."
29
+ exit 1
30
+ end
31
+
32
+ input = STDIN.read
33
+
34
+ if input.strip.empty?
35
+ warn "Error: Input is empty. Please provide valid JSON via pipe."
36
+ exit 1
37
+ end
38
+
39
+ json = JSON.parse(input)
40
+ rescue JSON::ParserError => e
41
+ warn "Error: Invalid JSON input - #{e.message}"
42
+ exit 1
43
+ end
44
+
45
+ md = case options[:output]
46
+ when "v"
47
+ Aws2MD::VerticalTable.new(json)
48
+ when "h"
49
+ Aws2MD::HorizontalTable.new(json)
50
+ else
51
+ Aws2MD::HorizontalTable.new(json)
52
+ end
53
+
54
+ md.run
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,173 @@
1
+ require "json"
2
+ require "terminal-table"
3
+ require "active_support/all" # .singularize
4
+
5
+ module Aws2MD
6
+ class Table
7
+ def build_table
8
+ raise NotImplementedError.new("NotImplementedError")
9
+ end
10
+
11
+ # @return [[header_keys], [more_keys]]
12
+ # header_keys: Keys whose values are scalars (e.g., String, Number, Boolean)
13
+ # more_keys: Keys whose values are nested structures (e.g., Array, Hash)
14
+ def separate_keys(hash)
15
+ header_keys = []
16
+ more_keys = []
17
+
18
+ hash.each do |k, v|
19
+ if scalar?(v)
20
+ header_keys << k
21
+ else
22
+ more_keys << k
23
+ end
24
+ end
25
+
26
+ [header_keys, more_keys]
27
+ end
28
+
29
+ def scalar?(obj)
30
+ return false if obj.is_a?(Hash)
31
+ return false if obj.is_a?(Array)
32
+
33
+ true
34
+ end
35
+ end
36
+
37
+ class HorizontalTable < Table
38
+ def initialize(json)
39
+ @json = json
40
+ end
41
+
42
+ def print_table_for_hash(header_keys, rows)
43
+ table = Terminal::Table.new :rows => [rows]
44
+ table.headings = header_keys
45
+ table.style = { :border => :markdown }
46
+ puts ""
47
+ puts table
48
+ end
49
+
50
+ def print_table_for_array(header_keys, rows, level, title, i)
51
+ table = Terminal::Table.new :rows => [rows]
52
+ table.headings = header_keys
53
+ table.style = { :border => :markdown }
54
+
55
+ heading = "#" * (level + 1)
56
+
57
+ puts ""
58
+ puts "#{heading} #{title.singularize}.#{i}"
59
+ puts table
60
+ end
61
+
62
+ def build_table(title, current, level = 0)
63
+ unless title.nil?
64
+ puts ""
65
+ heading = "#" * level
66
+ puts "#{heading} #{title}"
67
+ end
68
+
69
+ if current.is_a?(Hash)
70
+ # Keys with scalar values will be used as table columns
71
+ # Other keys will be passed to build_table for recursive processing
72
+ header_keys, more_keys = separate_keys(current)
73
+
74
+ unless header_keys.empty?
75
+ rows = []
76
+ header_keys.each do |key|
77
+ rows << current[key]
78
+ end
79
+
80
+ print_table_for_hash(header_keys, rows)
81
+ end
82
+
83
+ more_keys.each do |key|
84
+ build_table(key, current[key], level + 1)
85
+ end
86
+ else current.is_a?(Array)
87
+ current.each_with_index do |hash, i|
88
+ header_keys, more_keys = separate_keys(hash)
89
+
90
+ rows = []
91
+ header_keys.each do |key|
92
+ rows << hash[key]
93
+ end
94
+
95
+ print_table_for_array(header_keys, rows, level, title, i)
96
+
97
+ more_keys.each do |key|
98
+ build_table(key, hash[key], level + 2)
99
+ end
100
+ end
101
+ end
102
+ end
103
+
104
+ def run
105
+ build_table(nil, @json)
106
+ end
107
+ end
108
+
109
+ class VerticalTable < Table
110
+ def initialize(json)
111
+ @json = json
112
+ end
113
+
114
+ def print_table_for_hash(rows)
115
+ table = Terminal::Table.new :rows => rows
116
+ table.headings = ["Key", "Value"]
117
+ table.style = { :border => :markdown }
118
+ puts ""
119
+ puts table
120
+ end
121
+
122
+ def print_table_for_array(rows, title, level, i)
123
+ table = Terminal::Table.new :rows => rows
124
+ table.headings = ["Key", "Value"]
125
+ table.style = { :border => :markdown }
126
+ heading = "#" * (level + 1)
127
+
128
+ puts ""
129
+ puts "#{heading} #{title.singularize}.#{i}"
130
+ puts table
131
+ end
132
+
133
+ def build_table(title, current, level = 0)
134
+ unless title.nil?
135
+ puts ""
136
+ heading = "#" * level
137
+ puts "#{heading} #{title}"
138
+ end
139
+
140
+ if current.is_a?(Hash)
141
+ header_keys, more_keys = separate_keys(current)
142
+
143
+ unless header_keys.empty?
144
+ rows = header_to_rows(header_keys, current)
145
+ print_table_for_hash(rows)
146
+ end
147
+
148
+ more_keys.each do |key|
149
+ build_table(key, current[key], level + 1)
150
+ end
151
+ else current.is_a?(Array)
152
+ current.each_with_index do |hash, i|
153
+ header_keys, more_keys = separate_keys(hash)
154
+ rows = header_to_rows(header_keys, hash)
155
+
156
+ print_table_for_array(rows, title, level, i)
157
+
158
+ more_keys.each do |key|
159
+ build_table(key, hash[key], level + 2)
160
+ end
161
+ end
162
+ end
163
+ end
164
+
165
+ def header_to_rows(header_keys, hash)
166
+ header_keys.map { |key| [key, hash[key]] }
167
+ end
168
+
169
+ def run
170
+ build_table(nil, @json)
171
+ end
172
+ end
173
+ end
data/lib/aws2md.rb ADDED
@@ -0,0 +1,2 @@
1
+ require "aws2md/cli"
2
+ require "aws2md/table"
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aws2md
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Akira Kure
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2025-05-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: terminal-table
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 4.0.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 4.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '7.1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '7.1'
55
+ description: Display AWS CLI output as Markdown tables (supports both vertical and
56
+ horizontal formats)
57
+ email:
58
+ - kuredev@email.com
59
+ executables:
60
+ - aws2md
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - exe/aws2md
65
+ - lib/aws2md.rb
66
+ - lib/aws2md/cli.rb
67
+ - lib/aws2md/table.rb
68
+ homepage: https://github.com/kuredev/aws2md
69
+ licenses:
70
+ - MIT
71
+ metadata: {}
72
+ post_install_message:
73
+ rdoc_options: []
74
+ require_paths:
75
+ - lib
76
+ required_ruby_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ requirements: []
87
+ rubygems_version: 3.4.10
88
+ signing_key:
89
+ specification_version: 4
90
+ summary: Display AWS CLI output as Markdown tables
91
+ test_files: []