Skip to content

Commit 41fdaab

Browse files
committed
Use latest version of runner in new location.
1 parent e24b6db commit 41fdaab

File tree

1 file changed

+91
-122
lines changed

1 file changed

+91
-122
lines changed

.tools/scanners/runner.py

+91-122
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,27 @@
11
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
# SPDX-License-Identifier: Apache-2.0
33

4-
import argparse
5-
import config
4+
import typer
5+
from typing_extensions import Annotated
66
import logging
77
import os
8-
import json
9-
from collections import defaultdict
8+
109
from difflib import unified_diff
10+
from enum import Enum
1111
from pathlib import Path
1212
from typing import Optional
1313

14-
from render import Renderer, MissingMetadataError, RenderStatus
14+
from render import Renderer, RenderStatus, MissingMetadataError
1515
from scanner import Scanner
1616

17-
from aws_doc_sdk_examples_tools.doc_gen import DocGen, DocGenEncoder
17+
from aws_doc_sdk_examples_tools.doc_gen import DocGen
18+
19+
20+
# Default to not using Rich
21+
if "USE_RICH" not in os.environ:
22+
import typer.core
23+
24+
typer.core.rich = None # type: ignore
1825

1926
logging.basicConfig(level=os.environ.get("LOGLEVEL", "INFO").upper(), force=True)
2027

@@ -29,7 +36,6 @@ def prepare_scanner(doc_gen: DocGen) -> Optional[Scanner]:
2936
failed_list = "\n".join(f"DocGen Error: {e}" for e in error_strings)
3037
print(f"Metadata errors encountered:\n\t{failed_list}")
3138
return None
32-
3339
scanner = Scanner(doc_gen)
3440

3541
# Preload cross-content examples
@@ -38,61 +44,70 @@ def prepare_scanner(doc_gen: DocGen) -> Optional[Scanner]:
3844
return scanner
3945

4046

41-
def main():
42-
# Load all examples immediately for cross references. Trades correctness for speed.
43-
doc_gen = DocGen.from_root(Path(__file__).parent.parent.parent, incremental=True)
44-
45-
languages = doc_gen.languages()
46-
parser = argparse.ArgumentParser()
47-
parser.add_argument(
48-
"--languages",
49-
choices=[*languages] + ["all"],
50-
nargs="+",
51-
help="The languages of the SDK. Choose from: %(choices)s.",
52-
default=["all"],
53-
)
54-
55-
parser.add_argument(
56-
"--services",
57-
choices=[*doc_gen.services.keys()] + ["all"],
58-
nargs="+",
59-
help="The targeted service. Choose from: %(choices)s.",
60-
default=["all"],
61-
)
62-
parser.add_argument(
63-
"--safe",
64-
action="store_true",
65-
help=f"Save a copy of the original README as the 'saved_readme' value specified in config.py ({config.saved_readme}).",
66-
)
67-
parser.add_argument(
68-
"--verbose",
69-
action="store_true",
70-
help="When set, output verbose debugging info.",
71-
)
72-
parser.add_argument(
73-
"--dry-run",
74-
action="store_true",
75-
dest="dry_run",
76-
help="In dry run, compare current vs generated and exit with failure if they do not match.",
77-
default=False, # Change this to default false when we're ready to use this generally.
78-
)
79-
parser.add_argument("--no-dry-run", dest="dry_run", action="store_false")
80-
parser.add_argument("--check", dest="dry_run", action="store_true")
81-
parser.add_argument("--diff", action="store_true", default=False)
82-
args = parser.parse_args()
83-
84-
if "all" in args.languages:
85-
args.languages = [*languages]
86-
87-
if "all" in args.services:
88-
args.services = [*doc_gen.services.keys()]
89-
90-
if args.verbose:
47+
# Load all examples immediately for cross references. Trades correctness for speed.
48+
doc_gen = DocGen.from_root(Path(__file__).parent.parent.parent, incremental=True)
49+
50+
51+
Language = Enum(
52+
"Language", {lang: lang for lang in ([*doc_gen.languages()] + ["all"])}
53+
) # type: ignore
54+
Service = Enum(
55+
"Service", {serv: serv for serv in ([*doc_gen.services.keys()] + ["all"])}
56+
) # type: ignore
57+
58+
59+
def writeme(
60+
languages: Annotated[
61+
list[Language], # type: ignore
62+
typer.Option(
63+
help="The languages of the SDK.",
64+
),
65+
] = [
66+
Language.all.value # type: ignore
67+
], # type: ignore
68+
services: Annotated[
69+
list[Service], # type: ignore
70+
typer.Option(
71+
help="The targeted service.",
72+
),
73+
] = [
74+
Service.all.value # type: ignore
75+
], # type: ignore
76+
safe: Annotated[
77+
bool,
78+
typer.Option(
79+
help="Save a copy of the original README as the 'saved_readme' value specified in config.py ({config.saved_readme})."
80+
),
81+
] = True,
82+
verbose: Annotated[
83+
bool, typer.Option(help="When set, output verbose debugging info.")
84+
] = False,
85+
dry_run: Annotated[
86+
bool,
87+
typer.Option(
88+
help="In dry run, compare current vs generated and exit with failure if they do not match."
89+
),
90+
] = False,
91+
check: Annotated[bool, typer.Option(help="Alias for --dry-run.")] = False,
92+
diff: Annotated[
93+
bool, typer.Option(help="Show a diff of READMEs that have changed.")
94+
] = False,
95+
):
96+
if Language.all in languages: # type: ignore
97+
languages = list(Language) # type: ignore
98+
languages.remove(Language.all) # type: ignore
99+
100+
if Service.all in services: # type: ignore
101+
services = list(Service) # type: ignore
102+
services.remove(Service.all) # type: ignore
103+
104+
if verbose:
91105
logging.basicConfig(level=logging.DEBUG)
92106

93-
logging.debug(f"Args configuration: {args}")
107+
if check:
108+
dry_run = check
94109

95-
if args.dry_run:
110+
if dry_run:
96111
print("Dry run, no changes will be made.")
97112

98113
skipped = []
@@ -107,29 +122,27 @@ def main():
107122
return -1
108123

109124
renderer = Renderer(scanner)
110-
111-
for language_and_version in args.languages:
112-
(language, version) = language_and_version.split(":")
113-
write_language_json(doc_gen, language)
114-
115-
for service in args.services:
116-
for language_and_version in args.languages:
117-
(language, version) = language_and_version.split(":")
118-
write_service_json(doc_gen, service, language)
125+
for service in services:
126+
if service == Service.all: # type: ignore
127+
continue
128+
for language_and_version in languages:
129+
if language_and_version == Language.all: # type: ignore
130+
continue
131+
(language, version) = language_and_version.value.split(":")
119132
id = f"{language}:{version}:{service}"
120133
try:
121-
renderer.set_example(service, language, int(version), args.safe)
134+
renderer.set_example(service.value, language, int(version), safe)
122135

123136
logging.debug("Rendering %s", id)
124137
render_status = renderer.render()
125138
logging.debug("Status %s", render_status)
126139

127140
if render_status == RenderStatus.UPDATED:
128-
if args.dry_run:
129-
diff = None
130-
if args.diff:
131-
diff = make_diff(renderer, id)
132-
failed.append((id, diff))
141+
if dry_run:
142+
diff_text = None
143+
if diff:
144+
diff_text = make_diff(renderer, id)
145+
failed.append((id, diff_text))
133146
else:
134147
renderer.write()
135148
written.append(id)
@@ -148,10 +161,10 @@ def main():
148161
skipped.append(id)
149162
except MissingMetadataError as mme:
150163
logging.debug(mme, exc_info=True)
151-
failed.append(id)
164+
failed.append((id, None))
152165
except Exception as e:
153166
logging.error(e, exc_info=True)
154-
failed.append(id)
167+
failed.append((id, None))
155168

156169
skip_list = "\n".join(f"Skipped {f}" for f in sorted(skipped))
157170
logging.debug(skip_list or "(None Skipped)")
@@ -164,11 +177,11 @@ def main():
164177
if no_folder:
165178
no_folder_list = "\n".join(f"No folder: {f}" for f in sorted(no_folder))
166179
print(no_folder_list)
167-
if not args.dry_run:
180+
if not dry_run:
168181
done_list = "\n".join(f"Wrote {f}" for f in sorted(written))
169182
print(done_list or "(None Written)")
170183
if failed:
171-
if args.diff:
184+
if diff:
172185
failed_list = "\n".join(
173186
f"Diff: {f[1]}" for f in sorted(failed, key=lambda f: f[0])
174187
)
@@ -185,47 +198,3 @@ def make_diff(renderer, id):
185198
expected = renderer.readme_text.split("\n")
186199
diff = unified_diff(current, expected, f"{id}/current", f"{id}/expected")
187200
return "\n".join(diff)
188-
189-
190-
def write_service_json(doc_gen, service_name, language_name):
191-
# Test creating a file
192-
filepath = f"example_json/{language_name}_{service_name}_examples_list.json"
193-
filepath = filepath.lower()
194-
print("Writing serialized versions of DocGen to %s", filepath)
195-
doc_gen.fill_missing_fields()
196-
language_examples = []
197-
for example in doc_gen.examples.values():
198-
for lang_name, language in example.languages.items():
199-
for sdk_version in language.versions:
200-
for svc_name in example.services:
201-
if svc_name == service_name and lang_name == language_name:
202-
language_examples.append(example)
203-
204-
with open(filepath, "w") as example_meta:
205-
example_meta.write(
206-
json.dumps(
207-
{"examples": language_examples},
208-
cls=DocGenEncoder, indent="\t"
209-
)
210-
)
211-
212-
213-
def write_language_json(doc_gen, language_name):
214-
# Test creating a file
215-
filepath = f"example_json/{language_name}_examples_list.json"
216-
filepath = filepath.lower()
217-
print("Writing serialized versions of DocGen to %s", filepath)
218-
219-
language_examples = []
220-
for example in doc_gen.examples.values():
221-
for lang_name, language in example.languages.items():
222-
if lang_name == language_name:
223-
language_examples.append(example)
224-
225-
with open(filepath, "w") as example_meta:
226-
example_meta.write(
227-
json.dumps(
228-
{"examples": language_examples},
229-
cls=DocGenEncoder, indent="\t"
230-
)
231-
)

0 commit comments

Comments
 (0)