-
Notifications
You must be signed in to change notification settings - Fork 1
/
kuro.py
131 lines (106 loc) · 3.57 KB
/
kuro.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import click
import importlib.util
import os
import subprocess
import sys
from typing import Union
@click.command()
@click.option(
"--diff",
is_flag=True,
help=(
"Create a diff of the changes, in a 'kuro.diff' file. If"
" you approve the changes, run kuro with --apply_diff."
),
)
@click.option(
"--apply_diff",
is_flag=True,
help=("Consume (and delete) an existing 'kuro.diff' file."),
)
@click.option(
"--project_options",
is_flag=True,
help=("Setup options for Kuro/Black on a directory level."),
)
@click.pass_context
def main(
ctx: click.Context, diff: bool, apply_diff: bool, project_options: bool
) -> None:
git_check_command = "git rev-parse --is-inside-work-tree"
if subprocess.check_output(git_check_command.split()).strip() != b"true":
click.echo("\nNot inside of a git repository")
ctx.exit(1)
if project_options:
create_kuro_config()
ctx.exit(0)
if diff and apply_diff:
click.echo("\nYou can't use both --diff and --apply_diff")
ctx.exit(1)
if apply_diff:
consume_diff()
click.echo("\nDone!")
ctx.exit(0)
git_ls_command = "git ls-files --exclude-standard --modified --other *[.py]"
git_ls_files = (
subprocess.check_output(git_ls_command.split())
.decode("utf-8")
.replace("\n", " ")
)
if (len(git_ls_files)) == 0:
click.echo("\nNo files to change.")
ctx.exit(0)
click.echo("\nApplying Black to the following files: \n" + git_ls_files)
BLACK_OPTIONS = check_setup()
kuro_run_command = f"black {git_ls_files} -q"
if BLACK_OPTIONS is not None:
kuro_run_command += f" {BLACK_OPTIONS}"
kuro_diff_command = kuro_run_command + " --diff"
diff_text = subprocess.check_output(kuro_diff_command.split())
if len(diff_text) == 0:
click.echo("\nBlack returned no changes. Good for you!")
ctx.exit(0)
if diff:
with open("kuro.diff", "w") as kuro_diff:
kuro_diff.write(diff_text.decode("utf-8"))
click.echo("\nWrote 'kuro.diff' file.")
ctx.exit(0)
subprocess.run(kuro_run_command.split())
click.echo("\nDone!")
ctx.exit(0)
def check_setup() -> Union[str, None]:
exists = os.path.isfile(".kuro_config")
if exists:
# Use configuration file values
click.echo("\nUsing the local configuration file...")
with open(".kuro_config") as kuro_config:
BLACK_OPTIONS = kuro_config.readline().strip()
return BLACK_OPTIONS
else:
BLACK_OPTIONS = os.getenv("KURO_BLACK_OPTIONS")
if BLACK_OPTIONS is not None:
# Use global configuration values
click.echo("\nUsing the global configuration settings...\n")
return BLACK_OPTIONS
else:
# Run Black with no extra options
return None
def create_kuro_config() -> None:
options = click.prompt("Please enter the Black/Kuro options you desire to set")
with open(".kuro_config", "w") as kuro_config:
kuro_config.write(options)
click.echo("\nLocal options for Kuro/Black set.")
def consume_diff() -> None:
"""
click.echo("\nApplying diff file...")
subprocess.call("patch -p0 < kuro.diff".split())
os.remove("kuro.diff")
"""
click.echo("\nThis option is a bit buggy at the moment... Please ignore it!")
if __name__ == "__main__":
package_name = "black"
spec = importlib.util.find_spec(package_name)
if spec is None:
print(f"Warning! {package_name} is not installed")
sys.exit()
main()