Skip to content

Commit c78797f

Browse files
committed
feat: new terraform_fmt_v2 with better Windows support
1 parent 42919f3 commit c78797f

File tree

7 files changed

+109
-4
lines changed

7 files changed

+109
-4
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
tests/results/*
2+
__pycache__/
3+
*.py[cod]

.pre-commit-hooks.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@
1515
files: (\.tf|\.tfvars)$
1616
exclude: \.terraform/.*$
1717

18+
- id: terraform_fmt_py
19+
name: Terraform fmt
20+
description: Rewrites all Terraform configuration files to a canonical format.
21+
entry: terraform_fmt
22+
language: python
23+
files: (\.tf|\.tfvars)$
24+
exclude: \.terraform/.*$
25+
1826
- id: terraform_docs
1927
name: Terraform docs
2028
description: Inserts input and output documentation into README.md (using terraform-docs).

hooks/__init__.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +0,0 @@
1-
print(
2-
'`terraform_docs_replace` hook is DEPRECATED.'
3-
'For migration instructions see https://github.com/antonbabenko/pre-commit-terraform/issues/248#issuecomment-1290829226'
4-
)

hooks/common.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
from __future__ import annotations
2+
3+
import argparse
4+
import logging
5+
import os
6+
from collections.abc import Sequence
7+
8+
logger = logging.getLogger(__name__)
9+
10+
11+
def setup_logging():
12+
logging.basicConfig(
13+
level={
14+
"error": logging.ERROR,
15+
"warn": logging.WARNING,
16+
"warning": logging.WARNING,
17+
"info": logging.INFO,
18+
"debug": logging.DEBUG,
19+
}[os.environ.get("PRE_COMMIT_TERRAFORM_LOG_LEVEL", "warning").lower()]
20+
)
21+
22+
23+
def parse_env_vars(env_var_strs: list[str]) -> dict[str, str]:
24+
ret = {}
25+
for env_var_str in env_var_strs:
26+
name, val = env_var_str.split("=", 1)
27+
if val.startswith('"') and val.endswith('"'):
28+
val = val[1:-1]
29+
ret[name] = val
30+
return ret
31+
32+
33+
def parse_cmdline(
34+
argv: Sequence[str] | None = None,
35+
) -> tuple[list[str], list[str], list[str], list[str], dict[str, str]]:
36+
parser = argparse.ArgumentParser(
37+
add_help=False, # Allow the use of `-h` for compatiblity with Bash version of the hook
38+
)
39+
parser.add_argument("-a", "--args", action="append", help="Arguments")
40+
parser.add_argument("-h", "--hook-config", action="append", help="Hook Config")
41+
parser.add_argument("-i", "--init-args", "--tf-init-args", action="append", help="Init Args")
42+
parser.add_argument("-e", "--envs", "--env-vars", action="append", help="Environment Variables")
43+
parser.add_argument("FILES", nargs="*", help="Files")
44+
45+
parsed_args = parser.parse_args(argv)
46+
47+
args = parsed_args.args or []
48+
hook_config = parsed_args.hook_config or []
49+
files = parsed_args.FILES or []
50+
tc_init_args = parsed_args.init_args or []
51+
env_vars = parsed_args.envs or []
52+
53+
env_var_dict = parse_env_vars(env_vars)
54+
55+
if hook_config:
56+
raise NotImplementedError("TODO: implement: hook_config")
57+
58+
if tc_init_args:
59+
raise NotImplementedError("TODO: implement: tc_init_args")
60+
61+
return args, hook_config, files, tc_init_args, env_var_dict

hooks/terraform_docs_replace.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
import subprocess
44
import sys
55

6+
print(
7+
'`terraform_docs_replace` hook is DEPRECATED.'
8+
'For migration instructions see https://github.com/antonbabenko/pre-commit-terraform/issues/248#issuecomment-1290829226'
9+
)
10+
611

712
def main(argv=None):
813
parser = argparse.ArgumentParser(

hooks/terraform_fmt.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from __future__ import annotations
2+
3+
import logging
4+
import os
5+
import shlex
6+
import sys
7+
from subprocess import PIPE, run
8+
from typing import Sequence
9+
10+
from .common import parse_cmdline, setup_logging
11+
12+
logger = logging.getLogger(__name__)
13+
14+
15+
def main(argv: Sequence[str] | None = None) -> int:
16+
setup_logging()
17+
logger.debug(sys.version_info)
18+
args, hook_config, files, tf_init_args, env_vars = parse_cmdline(argv)
19+
if os.environ.get("PRE_COMMIT_COLOR") == "never":
20+
args.append("-no-color")
21+
cmd = ["terraform", "fmt", *args, *files]
22+
logger.info("calling %s", shlex.join(cmd))
23+
logger.debug("env_vars: %r", env_vars)
24+
logger.debug("args: %r", args)
25+
completed_process = run(cmd, env={**os.environ, **env_vars}, text=True, stdout=PIPE)
26+
if completed_process.stdout:
27+
print(completed_process.stdout)
28+
return completed_process.returncode
29+
30+
31+
if __name__ == "__main__":
32+
raise SystemExit(main())

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
entry_points={
2929
'console_scripts': [
3030
'terraform_docs_replace = hooks.terraform_docs_replace:main',
31+
'terraform_fmt = hooks.terraform_fmt:main',
3132
],
3233
},
3334
)

0 commit comments

Comments
 (0)