Reformat all code using yapf

This commit is contained in:
Julio Castillo
2022-02-14 12:13:42 +01:00
parent 72a62d10b6
commit e7dd12fa29
9 changed files with 78 additions and 120 deletions

View File

@@ -13,7 +13,6 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
'''Generate tables for Terraform root module files, outputs and variables.
This tool generates nicely formatted Markdown tables from Terraform source
@@ -48,13 +47,10 @@ import urllib.parse
import click
__version__ = '2.1.0'
# TODO(ludomagno): decide if we want to support variables*.tf and outputs*.tf
FILE_DESC_DEFAULTS = {
'main.tf': 'Module-level locals and resources.',
'outputs.tf': 'Module outputs.',
@@ -63,11 +59,8 @@ FILE_DESC_DEFAULTS = {
'versions.tf': 'Version pins.',
}
FILE_RE_MODULES = re.compile(
r'(?sm)module\s*"[^"]+"\s*\{[^\}]*?source\s*=\s*"([^"]+)"'
)
FILE_RE_RESOURCES = re.compile(
r'(?sm)resource\s*"([^"]+)"'
)
r'(?sm)module\s*"[^"]+"\s*\{[^\}]*?source\s*=\s*"([^"]+)"')
FILE_RE_RESOURCES = re.compile(r'(?sm)resource\s*"([^"]+)"')
HEREDOC_RE = re.compile(r'(?sm)^<<\-?END(\s*.*?)\s*END$')
MARK_BEGIN = '<!-- BEGIN TFDOC -->'
MARK_END = '<!-- END TFDOC -->'
@@ -88,8 +81,7 @@ OUT_RE = re.compile(r'''(?smx)
OUT_TEMPLATE = ('description', 'value', 'sensitive')
TAG_RE = re.compile(r'(?sm)^\s*#\stfdoc:([^:]+:\S+)\s+(.*?)\s*$')
UNESCAPED = string.digits + string.ascii_letters + ' .,;:_-'
VAR_ENUM = enum.Enum(
'V', 'OPEN ATTR ATTR_DATA SKIP CLOSE COMMENT TXT')
VAR_ENUM = enum.Enum('V', 'OPEN ATTR ATTR_DATA SKIP CLOSE COMMENT TXT')
VAR_RE = re.compile(r'''(?smx)
# variable open
(?:^\s*variable\s*"([^"]+)"\s*\{\s*$) |
@@ -107,14 +99,12 @@ VAR_RE = re.compile(r'''(?smx)
VAR_RE_TYPE = re.compile(r'([\(\{\}\)])')
VAR_TEMPLATE = ('default', 'description', 'type', 'nullable')
File = collections.namedtuple('File', 'name description modules resources')
Output = collections.namedtuple('Output',
'name description sensitive consumers line')
Variable = collections.namedtuple(
'Variable', 'name description type default required nullable source line')
# parsing functions
@@ -144,7 +134,7 @@ def _parse(body, enum=VAR_ENUM, re=VAR_RE, template=VAR_TEMPLATE):
elif token == enum.ATTR_DATA:
if not item:
continue
context = m.group(m.lastindex-1)
context = m.group(m.lastindex - 1)
item[context].append(data)
elif token == enum.SKIP:
context = token
@@ -170,12 +160,11 @@ def parse_files(basepath, exclude_files=None):
except (IOError, OSError) as e:
raise SystemExit(f'Cannot read file {name}: {e}')
tags = _extract_tags(body)
description = tags.get(
'file:description', FILE_DESC_DEFAULTS.get(shortname))
description = tags.get('file:description',
FILE_DESC_DEFAULTS.get(shortname))
modules = set(
os.path.basename(urllib.parse.urlparse(m).path)
for m in FILE_RE_MODULES.findall(body)
)
for m in FILE_RE_MODULES.findall(body))
resources = set(FILE_RE_RESOURCES.findall(body))
yield File(shortname, description, modules, resources)
@@ -188,11 +177,11 @@ def parse_outputs(basepath):
except (IOError, OSError) as e:
raise SystemExit(f'No outputs file in {basepath}.')
for item in _parse(body, enum=OUT_ENUM, re=OUT_RE, template=OUT_TEMPLATE):
yield Output(name=item['name'],
description=''.join(item['description']),
sensitive=item['sensitive'] != [],
consumers=item['tags'].get('output:consumers', ''),
line=item['line'])
description = ''.join(item['description'])
sensitive = item['sensitive'] != []
consumers = item['tags'].get('output:consumers', '')
yield Output(name=item['name'], description=description,
sensitive=sensitive, consumers=consumers, line=item['line'])
def parse_variables(basepath):
@@ -203,20 +192,18 @@ def parse_variables(basepath):
except (IOError, OSError) as e:
raise SystemExit(f'No variables file in {basepath}.')
for item in _parse(body):
description = ''.join(item['description'])
vtype = '\n'.join(item['type'])
default = HEREDOC_RE.sub(r'\1', '\n'.join(item['default']))
required = not item['default']
vtype = '\n'.join(item['type'])
nullable = item.get('nullable') != ['false']
source = item['tags'].get('variable:source', '')
if not required and default != 'null' and vtype == 'string':
default = f'"{default}"'
yield Variable(name=item['name'],
description=''.join(item['description']),
type=vtype,
default=default,
required=required,
source=item['tags'].get('variable:source', ''),
line=item['line'],
nullable=nullable)
yield Variable(name=item['name'], description=description, type=vtype,
default=default, required=required, source=source,
line=item['line'], nullable=nullable)
# formatting functions
@@ -251,25 +238,19 @@ def format_files(items):
num_resources = sum(len(i.resources) for i in items)
yield '| name | description |{}{}'.format(
' modules |' if num_modules else '',
' resources |' if num_resources else ''
)
yield '|---|---|{}{}'.format(
'---|' if num_modules else '',
'---|' if num_resources else ''
)
' resources |' if num_resources else '')
yield '|---|---|{}{}'.format('---|' if num_modules else '',
'---|' if num_resources else '')
for i in items:
modules = resources = ''
if i.modules:
modules = '<code>%s</code>' % '</code> · <code>'.join(
sorted(i.modules))
modules = '<code>%s</code>' % '</code> · <code>'.join(sorted(i.modules))
if i.resources:
resources = '<code>%s</code>' % '</code> · <code>'.join(
sorted(i.resources))
yield '| [{}](./{}) | {} |{}{}'.format(
i.name, i.name, i.description,
f' {modules} |' if num_modules else '',
f' {resources} |' if num_resources else ''
)
i.name, i.name, i.description, f' {modules} |' if num_modules else '',
f' {resources} |' if num_resources else '')
def format_outputs(items, show_extra=True):
@@ -277,17 +258,13 @@ def format_outputs(items, show_extra=True):
if not items:
return
items.sort(key=lambda i: i.name)
yield '| name | description | sensitive |' + (
' consumers |' if show_extra else ''
)
yield '|---|---|:---:|' + (
'---|' if show_extra else ''
)
yield '| name | description | sensitive |' + (' consumers |'
if show_extra else '')
yield '|---|---|:---:|' + ('---|' if show_extra else '')
for i in items:
consumers = i.consumers or ''
if consumers:
consumers = '<code>%s</code>' % '</code> · <code>'.join(
consumers.split())
consumers = '<code>%s</code>' % '</code> · <code>'.join(consumers.split())
sensitive = '' if i.sensitive else ''
format = f'| [{i.name}](outputs.tf#L{i.line}) | {i.description or ""} | {sensitive} |'
format += f' {consumers} |' if show_extra else ''
@@ -301,11 +278,8 @@ def format_variables(items, show_extra=True):
items.sort(key=lambda i: i.name)
items.sort(key=lambda i: i.required, reverse=True)
yield '| name | description | type | required | default |' + (
' producer |' if show_extra else ''
)
yield '|---|---|:---:|:---:|:---:|' + (
':---:|' if show_extra else ''
)
' producer |' if show_extra else '')
yield '|---|---|:---:|:---:|:---:|' + (':---:|' if show_extra else '')
for i in items:
vars = {
'default': f'<code>{_escape(i.default)}</code>' if i.default else '',
@@ -326,8 +300,7 @@ def format_variables(items, show_extra=True):
vars[k] = f'<code title="{_escape(title)}">{_escape(value)}</code>'
format = (
f'| [{i.name}](variables.tf#L{i.line}) | {i.description or ""} | {vars["type"]} '
f'| {vars["required"]} | {vars["default"]} |'
)
f'| {vars["required"]} | {vars["default"]} |')
format += f' {vars["source"]} |' if show_extra else ''
yield format
@@ -396,7 +369,7 @@ def replace_doc(readme_path, doc, readme=None):
MARK_BEGIN,
doc,
MARK_END,
readme[result['end']:].lstrip()
readme[result['end']:].lstrip(),
]))
except (IOError, OSError) as e:
raise SystemExit(f'Error replacing README {readme_path}: {e}')