1
1
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
# SPDX-License-Identifier: Apache-2.0
3
3
4
- import argparse
5
- import config
4
+ import typer
5
+ from typing_extensions import Annotated
6
6
import logging
7
7
import os
8
- import json
9
- from collections import defaultdict
8
+
10
9
from difflib import unified_diff
10
+ from enum import Enum
11
11
from pathlib import Path
12
12
from typing import Optional
13
13
14
- from render import Renderer , MissingMetadataError , RenderStatus
14
+ from render import Renderer , RenderStatus , MissingMetadataError
15
15
from scanner import Scanner
16
16
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
18
25
19
26
logging .basicConfig (level = os .environ .get ("LOGLEVEL" , "INFO" ).upper (), force = True )
20
27
@@ -29,7 +36,6 @@ def prepare_scanner(doc_gen: DocGen) -> Optional[Scanner]:
29
36
failed_list = "\n " .join (f"DocGen Error: { e } " for e in error_strings )
30
37
print (f"Metadata errors encountered:\n \t { failed_list } " )
31
38
return None
32
-
33
39
scanner = Scanner (doc_gen )
34
40
35
41
# Preload cross-content examples
@@ -38,61 +44,70 @@ def prepare_scanner(doc_gen: DocGen) -> Optional[Scanner]:
38
44
return scanner
39
45
40
46
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 :
91
105
logging .basicConfig (level = logging .DEBUG )
92
106
93
- logging .debug (f"Args configuration: { args } " )
107
+ if check :
108
+ dry_run = check
94
109
95
- if args . dry_run :
110
+ if dry_run :
96
111
print ("Dry run, no changes will be made." )
97
112
98
113
skipped = []
@@ -107,29 +122,27 @@ def main():
107
122
return - 1
108
123
109
124
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 (":" )
119
132
id = f"{ language } :{ version } :{ service } "
120
133
try :
121
- renderer .set_example (service , language , int (version ), args . safe )
134
+ renderer .set_example (service . value , language , int (version ), safe )
122
135
123
136
logging .debug ("Rendering %s" , id )
124
137
render_status = renderer .render ()
125
138
logging .debug ("Status %s" , render_status )
126
139
127
140
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 ))
133
146
else :
134
147
renderer .write ()
135
148
written .append (id )
@@ -148,10 +161,10 @@ def main():
148
161
skipped .append (id )
149
162
except MissingMetadataError as mme :
150
163
logging .debug (mme , exc_info = True )
151
- failed .append (id )
164
+ failed .append (( id , None ) )
152
165
except Exception as e :
153
166
logging .error (e , exc_info = True )
154
- failed .append (id )
167
+ failed .append (( id , None ) )
155
168
156
169
skip_list = "\n " .join (f"Skipped { f } " for f in sorted (skipped ))
157
170
logging .debug (skip_list or "(None Skipped)" )
@@ -164,11 +177,11 @@ def main():
164
177
if no_folder :
165
178
no_folder_list = "\n " .join (f"No folder: { f } " for f in sorted (no_folder ))
166
179
print (no_folder_list )
167
- if not args . dry_run :
180
+ if not dry_run :
168
181
done_list = "\n " .join (f"Wrote { f } " for f in sorted (written ))
169
182
print (done_list or "(None Written)" )
170
183
if failed :
171
- if args . diff :
184
+ if diff :
172
185
failed_list = "\n " .join (
173
186
f"Diff: { f [1 ]} " for f in sorted (failed , key = lambda f : f [0 ])
174
187
)
@@ -185,47 +198,3 @@ def make_diff(renderer, id):
185
198
expected = renderer .readme_text .split ("\n " )
186
199
diff = unified_diff (current , expected , f"{ id } /current" , f"{ id } /expected" )
187
200
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