terradoc 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +7 -0
- data/CHANGELOG.md +9 -1
- data/EXAMPLE.md +9 -8
- data/README.md +33 -1
- data/VERSION.txt +1 -1
- data/lib/terradoc/version.rb +1 -1
- data/lib/terradoc.rb +96 -91
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0deada70047ce96aaebd65a8ba1b59deed1a73e2de26fb52ef555cdc1bd45ab4
|
4
|
+
data.tar.gz: a969849a9d998faffdc452ede71654ebc25b22d69202421da7ae59a2367cdd38
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0bb6e91cfb9999706f47393e06448e224406685d9e521979f63c269bd1bc2e459b78360e7e760b95cdbc11673816af35f71d073ee7a5307aa00366b2c4dbde62
|
7
|
+
data.tar.gz: cdd4007eccd3a48170d35a8ad11688d5f42ee26d9b08a61244e41f5108eb0b0f17ab09784941a5e659c114df9852a702a180fe30ab6a0e5ad7c8398fbd6e86c6
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -5,11 +5,19 @@ All notable changes to this project will be documented in this file.
|
|
5
5
|
|
6
6
|
This changelog was automatically generated using [Caretaker](https://github.com/TerraformToolbox/terradoc) by [Wolf Software](https://github.com/WolfSoftware)
|
7
7
|
|
8
|
+
### [v0.1.5](https://github.com/TerraformToolbox/terradoc/compare/v0.1.4...v0.1.5)
|
9
|
+
|
10
|
+
> Released on March, 18th 2020
|
11
|
+
|
12
|
+
- Update the readme ready for release [`[830805a]`](https://github.com/TerraformToolbox/terradoc/commit/830805a455387532a39abb52bec7b634eb83ab67) [`[TGWolf]`](https://github.com/TGWolf)
|
13
|
+
|
14
|
+
- Fairly big internal review to make use of hcl2json, and additional outputs [`[b528f93]`](https://github.com/TerraformToolbox/terradoc/commit/b528f9385eb98ee4756f7feb9c2a9b481e302ff8) [`[TGWolf]`](https://github.com/TGWolf)
|
15
|
+
|
8
16
|
### [v0.1.4](https://github.com/TerraformToolbox/terradoc/compare/v0.1.3...v0.1.4)
|
9
17
|
|
10
18
|
> Released on March, 18th 2020
|
11
19
|
|
12
|
-
- Remember to remove the debugging output [`[
|
20
|
+
- Remember to remove the debugging output [`[b962a62]`](https://github.com/TerraformToolbox/terradoc/commit/b962a6269494fe5aaee758110356c359a5481240) [`[TGWolf]`](https://github.com/TGWolf)
|
13
21
|
|
14
22
|
### [v0.1.3](https://github.com/TerraformToolbox/terradoc/compare/v0.1.2...v0.1.3)
|
15
23
|
|
data/EXAMPLE.md
CHANGED
@@ -1,24 +1,25 @@
|
|
1
1
|
# Some example README
|
2
2
|
|
3
|
-
##
|
3
|
+
## Data Sources
|
4
4
|
<!--Terradoc-data-sources-start-->
|
5
5
|
<!--Terradoc-data-sources-end-->
|
6
6
|
|
7
|
-
##
|
7
|
+
## Modules
|
8
8
|
<!--Terradoc-modules-start-->
|
9
9
|
<!--Terradoc-modules-end-->
|
10
10
|
|
11
|
-
##
|
11
|
+
## Outputs
|
12
12
|
<!--Terradoc-outputs-start-->
|
13
13
|
<!--Terradoc-outputs-end-->
|
14
14
|
|
15
|
-
##
|
15
|
+
## Providers
|
16
|
+
<!--Terradoc-providers-start-->
|
17
|
+
<!--Terradoc-providers-end-->
|
18
|
+
|
19
|
+
## Resources
|
16
20
|
<!--Terradoc-resources-start-->
|
17
21
|
<!--Terradoc-resources-end-->
|
18
22
|
|
19
|
-
##
|
23
|
+
## Variables
|
20
24
|
<!--Terradoc-variables-start-->
|
21
25
|
<!--Terradoc-variables-end-->
|
22
|
-
|
23
|
-
|
24
|
-
# END
|
data/README.md
CHANGED
@@ -49,7 +49,38 @@ Usage: terradoc
|
|
49
49
|
|
50
50
|
```
|
51
51
|
|
52
|
-
|
52
|
+
### Adding Tags
|
53
|
+
|
54
|
+
There are a number tags that you need to add to your README in order for terradoc to know where to insert the data.
|
55
|
+
|
56
|
+
```
|
57
|
+
# Data Sources
|
58
|
+
<!--Terradoc-data-sources-start-->
|
59
|
+
<!--Terradoc-data-sources-end-->
|
60
|
+
|
61
|
+
# Modules
|
62
|
+
<!--Terradoc-modules-start-->
|
63
|
+
<!--Terradoc-modules-end-->
|
64
|
+
|
65
|
+
# Outputs
|
66
|
+
<!--Terradoc-outputs-start-->
|
67
|
+
<!--Terradoc-outputs-end-->
|
68
|
+
|
69
|
+
# Providers
|
70
|
+
<!--Terradoc-providers-start-->
|
71
|
+
<!--Terradoc-providers-end-->
|
72
|
+
|
73
|
+
# Resources
|
74
|
+
<!--Terradoc-resources-start-->
|
75
|
+
<!--Terradoc-resources-end-->
|
76
|
+
|
77
|
+
# Variables
|
78
|
+
<!--Terradoc-variables-start-->
|
79
|
+
<!--Terradoc-variables-end-->
|
80
|
+
|
81
|
+
```
|
82
|
+
|
83
|
+
Now you can simply run ```terradoc``` and it will generate the output.
|
53
84
|
|
54
85
|
## Contributing to Terradoc
|
55
86
|
|
@@ -77,3 +108,4 @@ For further information please refer to the [contributing](https://github.com/Te
|
|
77
108
|
|
78
109
|
<p align="right"><img src="https://img.shields.io/badge/Created%20By-Wolf-black?style=for-the-badge" /></p>
|
79
110
|
|
111
|
+
|
data/VERSION.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.5
|
data/lib/terradoc/version.rb
CHANGED
data/lib/terradoc.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'terradoc/version'
|
2
2
|
|
3
|
+
require 'json'
|
4
|
+
require 'open3'
|
3
5
|
require 'tty-spinner'
|
4
6
|
|
5
7
|
# -------------------------------------------------------------------------------- #
|
@@ -9,6 +11,10 @@ class Terradoc
|
|
9
11
|
# -------------------------------------------------------------------------------- #
|
10
12
|
# -------------------------------------------------------------------------------- #
|
11
13
|
def initialize(options = {})
|
14
|
+
@command = 'hcl2json'
|
15
|
+
|
16
|
+
raise StandardError.new("Failed to locate #{@command} please install (pip install #{@command})") unless which @command
|
17
|
+
|
12
18
|
@base_path = '.'
|
13
19
|
@base_path = options[:path] unless options[:path].nil?
|
14
20
|
@base_path.chomp!('/')
|
@@ -17,15 +23,12 @@ class Terradoc
|
|
17
23
|
@output_file = 'README.md'
|
18
24
|
@output_file = options[:output] unless options[:output].nil?
|
19
25
|
|
26
|
+
@raw_results = {}
|
20
27
|
@files = []
|
21
28
|
@pattern = "#{@base_path}/*.tf"
|
22
29
|
|
23
30
|
@config = {
|
24
31
|
'data-sources' => {
|
25
|
-
'include' => 'data',
|
26
|
-
'match' => /^(?!data).*/,
|
27
|
-
'regex' => /^data\s*"(?<name>.*?)"\s*".*/,
|
28
|
-
'split' => /(?=data\s*")/,
|
29
32
|
'start' => '<!--Terradoc-data-sources-start-->',
|
30
33
|
'end' => '<!--Terradoc-data-sources-end-->',
|
31
34
|
'raw_results' => [],
|
@@ -33,10 +36,6 @@ class Terradoc
|
|
33
36
|
'data_table' => []
|
34
37
|
},
|
35
38
|
'modules' => {
|
36
|
-
'include' => 'module',
|
37
|
-
'match' => /^(?!module).*/,
|
38
|
-
'regex' => /^module\s*".*"\s*{\s*source\s*=\s*"(?<name>.*?)"/,
|
39
|
-
'split' => /(?=module\s*")/,
|
40
39
|
'start' => '<!--Terradoc-modules-start-->',
|
41
40
|
'end' => '<!--Terradoc-modules-end-->',
|
42
41
|
'raw_results' => [],
|
@@ -44,11 +43,6 @@ class Terradoc
|
|
44
43
|
'data_table' => []
|
45
44
|
},
|
46
45
|
'outputs' => {
|
47
|
-
'include' => 'output',
|
48
|
-
'match' => /^(?!output).*/,
|
49
|
-
'regex' => /^output\s*"(?<name>.*)"\s*{\s*(?<details>.*)\s*}/,
|
50
|
-
'regex_stage_2' => /description\s*=\s*"(?<description>.*?)".*/,
|
51
|
-
'split' => /(?=output\s*")/,
|
52
46
|
'start' => '<!--Terradoc-outputs-start-->',
|
53
47
|
'end' => '<!--Terradoc-outputs-end-->',
|
54
48
|
'raw_results' => [],
|
@@ -56,22 +50,20 @@ class Terradoc
|
|
56
50
|
'data_table' => []
|
57
51
|
},
|
58
52
|
'resources' => {
|
59
|
-
'include' => 'resource',
|
60
|
-
'match' => /^(?!resource).*/,
|
61
|
-
'regex' => /^resource\s*"(?<name>.*?)"\s*".*/,
|
62
|
-
'split' => /(?=resource\s*")/,
|
63
53
|
'start' => '<!--Terradoc-resources-start-->',
|
64
54
|
'end' => '<!--Terradoc-resources-end-->',
|
65
55
|
'raw_results' => [],
|
66
56
|
'sorted_results' => [],
|
67
57
|
'data_table' => []
|
68
58
|
},
|
59
|
+
'providers' => {
|
60
|
+
'start' => '<!--Terradoc-providers-start-->',
|
61
|
+
'end' => '<!--Terradoc-providers-end-->',
|
62
|
+
'raw_results' => [],
|
63
|
+
'sorted_results' => [],
|
64
|
+
'data_table' => []
|
65
|
+
},
|
69
66
|
'variables' => {
|
70
|
-
'include' => 'variable',
|
71
|
-
'match' => /^(?!variable).*/,
|
72
|
-
'regex' => /^variable\s*"(?<name>.*)"\s*{\s*(?<details>.*)\s*}/,
|
73
|
-
'regex_stage_2' => /(description|type|default)\s*=\s*(.*?(?=description|type|default\s*=\s*|$))/,
|
74
|
-
'split' => /(?=variable\s*")/,
|
75
67
|
'start' => '<!--Terradoc-variables-start-->',
|
76
68
|
'end' => '<!--Terradoc-variables-end-->',
|
77
69
|
'raw_results' => [],
|
@@ -83,6 +75,19 @@ class Terradoc
|
|
83
75
|
terradoc_main
|
84
76
|
end
|
85
77
|
|
78
|
+
# -------------------------------------------------------------------------------- #
|
79
|
+
# -------------------------------------------------------------------------------- #
|
80
|
+
def which(cmd)
|
81
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
82
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
83
|
+
exts.each do |ext|
|
84
|
+
exe = File.join(path, "#{cmd}#{ext}")
|
85
|
+
return exe if File.executable?(exe) && !File.directory?(exe)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
return nil
|
89
|
+
end
|
90
|
+
|
86
91
|
# -------------------------------------------------------------------------------- #
|
87
92
|
# -------------------------------------------------------------------------------- #
|
88
93
|
def terradoc_main
|
@@ -90,15 +95,17 @@ class Terradoc
|
|
90
95
|
|
91
96
|
sp1 = spinners.register '[:spinner] Locating files'
|
92
97
|
sp2 = spinners.register '[:spinner] Processing files'
|
93
|
-
sp3 = spinners.register '[:spinner]
|
94
|
-
sp4 = spinners.register '[:spinner]
|
95
|
-
sp5 = spinners.register '[:spinner]
|
98
|
+
sp3 = spinners.register '[:spinner] Processing raw results'
|
99
|
+
sp4 = spinners.register '[:spinner] Sorting the results'
|
100
|
+
sp5 = spinners.register '[:spinner] Generating data tables'
|
101
|
+
sp6 = spinners.register '[:spinner] Writing output'
|
96
102
|
|
97
103
|
sp1.auto_spin
|
98
104
|
sp2.auto_spin
|
99
105
|
sp3.auto_spin
|
100
106
|
sp4.auto_spin
|
101
107
|
sp5.auto_spin
|
108
|
+
sp6.auto_spin
|
102
109
|
|
103
110
|
generate_file_list
|
104
111
|
sp1.success
|
@@ -106,14 +113,17 @@ class Terradoc
|
|
106
113
|
process_files
|
107
114
|
sp2.success
|
108
115
|
|
109
|
-
|
116
|
+
process_raw_results
|
110
117
|
sp3.success
|
111
118
|
|
112
|
-
|
119
|
+
sort_details
|
113
120
|
sp4.success
|
114
121
|
|
115
|
-
|
122
|
+
generate_data_tables
|
116
123
|
sp5.success
|
124
|
+
|
125
|
+
write_output
|
126
|
+
sp6.success
|
117
127
|
end
|
118
128
|
|
119
129
|
# -------------------------------------------------------------------------------- #
|
@@ -128,11 +138,64 @@ class Terradoc
|
|
128
138
|
# -------------------------------------------------------------------------------- #
|
129
139
|
def process_files
|
130
140
|
@files.each do |file|
|
131
|
-
|
132
|
-
|
133
|
-
|
141
|
+
Open3.popen3("hcl2json #{file}") do |_stdin, stdout, _stderr, _wait_thr|
|
142
|
+
stdout_str = stdout.read
|
143
|
+
|
144
|
+
json = JSON.parse(stdout_str)
|
145
|
+
@raw_results = @raw_results.merge(json)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
# -------------------------------------------------------------------------------- #
|
151
|
+
# -------------------------------------------------------------------------------- #
|
152
|
+
def process_raw_results
|
153
|
+
unless @raw_results['data'].nil?
|
154
|
+
@raw_results['data'].each do |key, _value|
|
155
|
+
name = key.gsub('_', '\_')
|
156
|
+
@config['data-sources']['raw_results'] << { :name => name }
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
unless @raw_results['module'].nil?
|
161
|
+
@raw_results['module'].each do |key, value|
|
162
|
+
name = key.gsub('_', '\_')
|
163
|
+
@config['modules']['raw_results'] << { :name => name, :source => value['source'], :version => value['version'] }
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
unless @raw_results['output'].nil?
|
168
|
+
@raw_results['output'].each do |key, value|
|
169
|
+
name = key.gsub('_', '\_')
|
170
|
+
@config['outputs']['raw_results'] << { :name => name, :description => value['description'] }
|
171
|
+
end
|
172
|
+
end
|
134
173
|
|
135
|
-
|
174
|
+
unless @raw_results['provider'].nil?
|
175
|
+
@raw_results['provider'].each do |key, _value|
|
176
|
+
name = key.gsub('_', '\_')
|
177
|
+
@config['providers']['raw_results'] << { :name => name }
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
unless @raw_results['resource'].nil?
|
182
|
+
@raw_results['resource'].each do |key, _value|
|
183
|
+
name = key.gsub('_', '\_')
|
184
|
+
@config['resources']['raw_results'] << { :name => name }
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
unless @raw_results['variable'].nil?
|
189
|
+
@raw_results['variable'].each do |key, value|
|
190
|
+
name = key.gsub('_', '\_')
|
191
|
+
default = value['default'].to_s.gsub('_', '\_')
|
192
|
+
required = if value.key?(:default)
|
193
|
+
'No'
|
194
|
+
else
|
195
|
+
'Yes'
|
196
|
+
end
|
197
|
+
@config['variables']['raw_results'] << { :name => name, :description => value['description'], :type => value['type'], :default => default, :required => required }
|
198
|
+
end
|
136
199
|
end
|
137
200
|
end
|
138
201
|
|
@@ -141,7 +204,6 @@ class Terradoc
|
|
141
204
|
def cleanup_array(array)
|
142
205
|
array = array.uniq { |k| k[:name] } if array.count.positive?
|
143
206
|
array = array.sort_by { |k| k[:name] } if array.count.positive?
|
144
|
-
|
145
207
|
return array
|
146
208
|
end
|
147
209
|
|
@@ -200,7 +262,7 @@ class Terradoc
|
|
200
262
|
|
201
263
|
if @config['variables']['sorted_results'].size.positive?
|
202
264
|
@config['variables']['data_table'] << '| Name | Description | Type | Default | Required? |'
|
203
|
-
@config['variables']['data_table'] << '| ---- | -----------
|
265
|
+
@config['variables']['data_table'] << '| ---- | ----------- |:----:|:-------:|:---------:|'
|
204
266
|
@config['variables']['sorted_results'].each do |item|
|
205
267
|
@config['variables']['data_table'] << "| #{item[:name]} | #{item[:description]} | #{item[:type]} | #{item[:default]} | #{item[:required]} |"
|
206
268
|
end
|
@@ -209,63 +271,6 @@ class Terradoc
|
|
209
271
|
end
|
210
272
|
end
|
211
273
|
|
212
|
-
# -------------------------------------------------------------------------------- #
|
213
|
-
# -------------------------------------------------------------------------------- #
|
214
|
-
def clean_string(str)
|
215
|
-
return str if str.empty?
|
216
|
-
|
217
|
-
return str.strip.gsub(/\"/, '').chomp('.').strip
|
218
|
-
end
|
219
|
-
|
220
|
-
# -------------------------------------------------------------------------------- #
|
221
|
-
# -------------------------------------------------------------------------------- #
|
222
|
-
def process_file(data)
|
223
|
-
@config.each do |key, value|
|
224
|
-
next unless data.include?(value['include'])
|
225
|
-
|
226
|
-
items = data.split(value['split'])
|
227
|
-
items.each do |item|
|
228
|
-
result = {}
|
229
|
-
|
230
|
-
item.strip!
|
231
|
-
next if item.match(value['match'])
|
232
|
-
|
233
|
-
matches = item.match(value['regex'])
|
234
|
-
|
235
|
-
next unless matches.size.positive?
|
236
|
-
next unless matches.names.include?('name')
|
237
|
-
|
238
|
-
result[:name] = matches[:name].gsub('_', '\_')
|
239
|
-
|
240
|
-
if matches.names.include?('details')
|
241
|
-
if key == 'outputs'
|
242
|
-
description = '-'
|
243
|
-
|
244
|
-
parts = item.match(value['regex_stage_2'])
|
245
|
-
description = clean_string(parts[:description]) if parts.size.positive?
|
246
|
-
|
247
|
-
result[:description] = description
|
248
|
-
else
|
249
|
-
matches[:details].scan(value['regex_stage_2']).each do |key2, value2|
|
250
|
-
result[key2.to_sym] = if key2 == 'default'
|
251
|
-
value2
|
252
|
-
else
|
253
|
-
clean_string(value2)
|
254
|
-
end
|
255
|
-
end
|
256
|
-
|
257
|
-
result[:required] = if result.key?(:default)
|
258
|
-
'No'
|
259
|
-
else
|
260
|
-
'Yes'
|
261
|
-
end
|
262
|
-
end
|
263
|
-
end
|
264
|
-
value['raw_results'] << result
|
265
|
-
end
|
266
|
-
end
|
267
|
-
end
|
268
|
-
|
269
274
|
# -------------------------------------------------------------------------------- #
|
270
275
|
# -------------------------------------------------------------------------------- #
|
271
276
|
def load_file(filename)
|