-
Notifications
You must be signed in to change notification settings - Fork 0
/
document-action-inputs.py
131 lines (106 loc) · 3.97 KB
/
document-action-inputs.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 yaml
import os
from tomark import Tomark
import markdown
SHARED_FIELDS = {
"action",
"github-token",
"namespace",
"workspace",
"api-key",
"grai-app-url",
"client-host",
"client-port",
"grai-user",
"grai-password",
}
SHARED_EXAMPLE_DEFAULTS = {
"namespace": "my_apps_grai_namespace",
"api-key": "my_grai_api_key",
"action": "tests",
}
class IndentDumper(yaml.Dumper):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def increase_indent(self, flow=False, indentless=False):
return super(IndentDumper, self).increase_indent(flow, False)
class BuildDocResults:
def __init__(self, doc_settings, ignored_fields=None):
self.doc_settings = doc_settings
self.folder = self.doc_settings["folder"]
self.ignored_fields = (
ignored_fields if ignored_fields is not None else SHARED_FIELDS
)
file = os.path.join(self.folder, "action.yaml")
self.data = yaml.safe_load(open(file))
self.table_data = self.build_table_data()
self.action_example = self.build_action_example()
@staticmethod
def build_record(field_name, field_vals):
record = {
"Field": field_name,
"Required": "yes" if field_vals.get("required", False) else "no",
"Default": field_vals.get("default", ""),
"Description": field_vals.get("description", ""),
}
return {k: v if v is not None else "" for k, v in record.items()}
def build_table_data(self):
inputs = self.data["inputs"]
table_data = []
for key, vals in inputs.items():
if key in self.ignored_fields:
continue
record = self.build_record(key, vals)
table_data.append(record)
return table_data
def build_action_example(self):
with_args = {
key: example
for key, vals in self.data["inputs"].items()
if (example := vals.get("example", None)) is not None
}
with_args = {**SHARED_EXAMPLE_DEFAULTS, **with_args}
steps = [
{"name": "Checkout", "uses": "actions/checkout@v3"},
{
"name": "Run Grai Action",
"uses": f"grai-io/grai-actions/{self.folder}@master",
"with": with_args,
},
]
base = {
f"on": ["pull_request"],
"name": self.doc_settings.get("name", self.doc_settings["folder"]),
"jobs": {
f"test_{self.doc_settings['folder']}": {
"runs-on": "ubuntu-latest",
"steps": steps,
}
},
}
return base
def table_description(self):
return Tomark.table(self.table_data)
with open("./docs/documented.yaml") as f:
documented = yaml.safe_load(f)["ready"]
SENTINEL_STRING = "<!-- Fields Sentinel Section -->"
EXAMPLE_SENTINEL_STRING = "<!-- Example Sentinel Section -->"
for documentation in documented:
docs = BuildDocResults(documentation)
file_string = open(os.path.join(docs.folder, "README.md")).read()
if SENTINEL_STRING not in file_string:
raise Exception(f"Sentinel string not found in {docs.folder}")
result = [obj.strip() for obj in file_string.split(SENTINEL_STRING)]
result[1] = docs.table_description()
result = f"\n\n{SENTINEL_STRING}\n\n".join(result)
result = [obj.strip() for obj in file_string.split(EXAMPLE_SENTINEL_STRING)]
yaml_output = yaml.dump(
docs.action_example, sort_keys=False, allow_unicode=True, Dumper=IndentDumper
)
# For some reason pyyaml is inserting quote literals into the output of on...
yaml_output = yaml_output.replace("'on'", "on")
result[1] = f"```yaml copy\n{yaml_output}\n```"
result = f"\n\n{EXAMPLE_SENTINEL_STRING}\n\n".join(result)
if result != file_string:
with open(os.path.join(docs.folder, "README.md"), "w") as f:
f.write(result)