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 +7 -0
- data/exe/aws2md +10 -0
- data/lib/aws2md/cli.rb +57 -0
- data/lib/aws2md/table.rb +173 -0
- data/lib/aws2md.rb +2 -0
- metadata +91 -0
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
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
|
data/lib/aws2md/table.rb
ADDED
@@ -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
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: []
|