Skip to content

Commit 758be94

Browse files
committed
Load aws-doc-sdk-code-examples with 1:1 fidelity.
1 parent f0010d8 commit 758be94

File tree

4 files changed

+149
-37
lines changed

4 files changed

+149
-37
lines changed

aws_doc_sdk_examples_tools/labels/from_doc_gen.py

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
from typing import Dict, Iterable, List, Set
1+
from typing import Dict, Iterable, List, Set, Optional
22

33
from aws_doc_sdk_examples_tools.doc_gen import DocGen
44
from aws_doc_sdk_examples_tools.metadata import Example as DocGenExample
55
from aws_doc_sdk_examples_tools.snippets import Snippet as DocGenSnippet
66
from aws_doc_sdk_examples_tools.sdks import Sdk as DocGenSdk
77
from aws_doc_sdk_examples_tools.services import Service as DocGenService
88

9-
from .labels import Sdk, Service, Example, Snippet, Expanded, Label, Excerpt
9+
from .labels import Sdk, Service, Example, Snippet, Expanded, Label, Excerpt, Link, ApiRef
1010
from . import known_labels
1111

1212

@@ -37,11 +37,26 @@ def _sdk(id: str, doc_gen_sdk: DocGenSdk) -> Iterable[Sdk]:
3737
labels: List[Label] = []
3838
if v.caveat:
3939
labels.append(Label(name="caveat", value=v.caveat))
40+
title_override = None
41+
if v.title_override:
42+
title_override = Expanded(
43+
long=v.title_override.title or "",
44+
short=v.title_override.title_abbrev or "",
45+
)
46+
api_ref = None
47+
if v.api_ref:
48+
api_ref = ApiRef(
49+
uid=v.api_ref.uid,
50+
name=v.api_ref.name,
51+
link_template=v.api_ref.link_template,
52+
)
4053
sdk = Sdk(
4154
language=doc_gen_sdk.property,
4255
version=str(v.version),
4356
name=Expanded(long=v.long, short=v.short),
44-
labels=labels
57+
labels=labels,
58+
title_override=title_override,
59+
api_ref=api_ref
4560
)
4661
yield sdk
4762

@@ -59,13 +74,21 @@ def _service(id: str, doc_gen_service: DocGenService) -> Service :
5974
if doc_gen_service.expanded:
6075
expanded = Expanded(long=doc_gen_service.expanded.long, short=doc_gen_service.expanded.short)
6176

77+
guide: Optional[Link] = None
78+
if doc_gen_service.guide:
79+
guide = Link(
80+
title=doc_gen_service.guide.subtitle,
81+
url=doc_gen_service.guide.url
82+
)
83+
6284
service = Service(
6385
id=id,
6486
sort=doc_gen_service.sort,
6587
name=Expanded(long=doc_gen_service.long, short=doc_gen_service.short),
6688
expanded=expanded,
6789
version=str(doc_gen_service.version),
6890
labels=labels,
91+
guide=guide,
6992
)
7093
return service
7194

@@ -76,14 +99,27 @@ def _examples(examples: Dict[str, DocGenExample]) -> Set[Example]:
7699

77100
def _example(id: str, doc_gen_example: DocGenExample) -> Example:
78101
labels = doc_gen_example_labels(doc_gen_example)
102+
synopsis = []
103+
if doc_gen_example.synopsis:
104+
synopsis.append(doc_gen_example.synopsis)
105+
if doc_gen_example.synopsis_list:
106+
synopsis.extend(doc_gen_example.synopsis_list)
107+
guide_topic: Optional[Link] = None
108+
if doc_gen_example.guide_topic:
109+
guide_topic = Link(
110+
title=doc_gen_example.guide_topic.title,
111+
url=doc_gen_example.guide_topic.url or doc_gen_example.guide_topic.title,
112+
)
79113

80114
example = Example(
81115
id=id,
82-
title=doc_gen_example.title,
83-
title_abbrev=doc_gen_example.title_abbrev,
84-
synopsis=doc_gen_example.synopsis or "",
85-
synopsis_list=doc_gen_example.synopsis_list,
116+
title=Expanded(
117+
long=doc_gen_example.title or "",
118+
short=doc_gen_example.title_abbrev or "",
119+
),
120+
synopsis=synopsis,
86121
labels=labels,
122+
guide_topic=guide_topic
87123
)
88124

89125
return example
@@ -110,6 +146,7 @@ def _snippets(doc_gen_examples: Iterable[DocGenExample], doc_gen_snippets: Dict[
110146
lang = lang.lower()
111147
for version in language.versions:
112148
excerpts: List[Excerpt] = []
149+
113150
if version.block_content:
114151
excerpts.append(Excerpt(description=version.block_content))
115152
for excerpt in version.excerpts:
@@ -119,6 +156,7 @@ def _snippets(doc_gen_examples: Iterable[DocGenExample], doc_gen_snippets: Dict[
119156
doc_gen_snippet = doc_gen_snippets.get(tag, None)
120157
if doc_gen_snippet:
121158
excerpts.append(Excerpt(path=doc_gen_snippet.file, range=(doc_gen_snippet.line_start, doc_gen_snippet.line_end), content=doc_gen_snippet.code))
159+
122160
labels: List[Label] = [
123161
*example_labels,
124162
Label(name=known_labels.SDK, value=f"{lang}:{version.sdk_version}"),

aws_doc_sdk_examples_tools/labels/from_doc_gen_test.py

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from . import from_doc_gen
88
from . import known_labels
9-
from .labels import Sdk, Service, Example, Snippet, Expanded, Label, Excerpt, Context
9+
from .labels import Sdk, Service, Example, Snippet, Expanded, Label, Excerpt, Context, Link, ApiRef
1010

1111

1212
def test_from_doc_gen():
@@ -94,10 +94,11 @@ def test_from_doc_gen():
9494
version="3",
9595
language="javascript",
9696
name=Expanded(long="&JSBlong; V3", short="&JSB; V3"),
97-
# api_ref:
98-
# uid: "AWSJavaScriptSDK",
99-
# name: "&guide-jsb-api;",
100-
# link_template: "AWSJavaScriptSDK/v3/latest/clients/client-{{.Service}}/classes/{{.OperationLower}}command.html",
97+
api_ref=ApiRef(
98+
uid="AWSJavaScriptSDK",
99+
name="&guide-jsb-api;",
100+
link_template="AWSJavaScriptSDK/v3/latest/clients/client-{{.Service}}/classes/{{.OperationLower}}command.html",
101+
),
101102
guide="&guide-jsb-dev;",
102103
),
103104
Sdk(
@@ -118,9 +119,10 @@ def test_from_doc_gen():
118119
version="3",
119120
language="csharp",
120121
name=Expanded(long="&NETlong;", short="&NET;"),
121-
# title_override:
122-
# title: "Additional &NET; code examples",
123-
# title_abbrev: "Additional code examples",
122+
title_override=Expanded(
123+
long="Additional &NET; code examples",
124+
short="Additional code examples",
125+
),
124126
guide="&guide-net-dev;",
125127
),
126128
Sdk(
@@ -166,9 +168,10 @@ def test_from_doc_gen():
166168
),
167169
],
168170
api_ref="AmazonS3/latest/API/Welcome.html",
169-
# guide:
170-
# subtitle: User Guide
171-
# url: AmazonS3/latest/userguide/Welcome.html
171+
guide=Link(
172+
title="User Guide",
173+
url="AmazonS3/latest/userguide/Welcome.html"
174+
)
172175
),
173176
Service(
174177
id="medical-imaging",
@@ -206,16 +209,19 @@ def test_from_doc_gen():
206209
[
207210
Example(
208211
id="medical-imaging_TestExample",
209-
title="Check whether a phone number is opted out using an &AWS; SDK",
210-
title_abbrev="Check whether a phone number is opted out",
211-
synopsis="check whether a phone number is opted out using some of the &AWS; SDKs that are available.",
212-
synopsis_list=[
212+
title=Expanded(
213+
long="Check whether a phone number is opted out using an &AWS; SDK",
214+
short="Check whether a phone number is opted out",
215+
),
216+
synopsis=[
217+
"check whether a phone number is opted out using some of the &AWS; SDKs that are available.",
213218
"Check the one thing.",
214219
"Do some other thing.",
215220
],
216-
# guide_topic:
217-
# title: Test guide topic title
218-
# url: test-guide/url
221+
guide_topic=Link(
222+
title="Test guide topic title",
223+
url="test-guide/url"
224+
),
219225
labels=[
220226
Label(name=known_labels.CATEGORY, value="Usage"),
221227
Label(name=known_labels.SERVICE, value="medical-imaging"),

aws_doc_sdk_examples_tools/labels/labels.py

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ def covers(self, other: "Labeled"):
4646
return self._label_set.covers(other._label_set)
4747

4848

49+
@dataclass
50+
class Link:
51+
title: str
52+
url: str
53+
54+
4955
@dataclass
5056
class Context:
5157
...
@@ -79,8 +85,8 @@ def __hash__(self):
7985

8086
@dataclass
8187
class Expanded:
82-
long: str
83-
short: str
88+
long: str = ""
89+
short: str = ""
8490

8591
def __eq__(self, other: object) -> bool:
8692
return isinstance(other, Expanded) and self.long == other.long and self.short == other.short
@@ -89,11 +95,19 @@ def __hash__(self):
8995
return hash((self.long, self.short))
9096

9197

98+
@dataclass
99+
class ApiRef:
100+
uid: str
101+
name: str
102+
link_template: Optional[str] = None
103+
92104
@dataclass
93105
class Sdk(Labeled):
94106
language: str = ""
95107
version: str = ""
96-
name: Optional[Expanded] = None
108+
name: Expanded = field(default_factory=Expanded)
109+
title_override: Optional[Expanded] = None
110+
api_ref: Optional[ApiRef] = None
97111
guide: str = ""
98112

99113
def __post_init__(self):
@@ -110,12 +124,12 @@ def __hash__(self):
110124
@dataclass
111125
class Service(Labeled):
112126
id: str = ""
113-
name: Optional[Expanded] = None
114-
expanded: Optional[Expanded] = None
127+
name: Expanded = field(default_factory=Expanded)
128+
expanded: Expanded = field(default_factory=Expanded)
115129
sort: str = ""
116130
version: str = ""
117131
api_ref: Optional[str] = None
118-
# guide: Optional[ServiceGuide] = None
132+
guide: Optional[Link] = None
119133

120134
def __post_init__(self):
121135
self.labels = [*self.labels, Label(name=known_labels.SERVICE, value=f"{self.id}")]
@@ -131,13 +145,11 @@ def __hash__(self):
131145
@dataclass
132146
class Example(Labeled):
133147
id: str = ""
134-
title: Optional[str] = ""
135-
title_abbrev: Optional[str] = ""
136-
synopsis: Optional[str] = ""
148+
title: Expanded = field(default_factory=Expanded)
137149
category: Optional[str] = None
138-
# guide_topic: Optional[Url] = None
150+
guide_topic: Optional[Link] = None
139151
# doc_filenames: Optional[DocFilenames] = None
140-
synopsis_list: List[str] = field(default_factory=list)
152+
synopsis: List[str] = field(default_factory=list)
141153

142154
def __eq__(self, other):
143155
return isinstance(other, Example) and self.id == other.id
@@ -152,4 +164,3 @@ def select(items: Iterable[Labeled], for_labels_in: Labeled):
152164
if item.covers(for_labels_in):
153165
return_set.add(item)
154166
return frozenset(return_set)
155-
# return frozenset(item for item in items if item.covers(for_labels_in))
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import argparse
2+
from ast import literal_eval
3+
from pathlib import Path
4+
from time import time
5+
6+
7+
from aws_doc_sdk_examples_tools.doc_gen import DocGen
8+
from .from_doc_gen import from_doc_gen
9+
from .labels import select
10+
11+
12+
def main():
13+
parser = argparse.ArgumentParser()
14+
parser.add_argument(
15+
"--root",
16+
default=f"{Path(__file__).parent.parent.parent}",
17+
help="The root path from which to search for files to check. The default is the root of the git repo (two up from this file).",
18+
)
19+
parser.add_argument(
20+
"--doc_gen_only",
21+
type=literal_eval,
22+
default=True,
23+
help="Only perform extended validation on snippet contents",
24+
required=False,
25+
)
26+
parser.add_argument(
27+
"--strict_titles",
28+
type=literal_eval,
29+
default=False,
30+
help="Strict title requirements: Action examples must not have title/title_abbrev; non-Action examples "
31+
"must have them.",
32+
required=False,
33+
)
34+
args = parser.parse_args()
35+
root_path = Path(args.root).resolve()
36+
37+
doc_gen = DocGen.from_root(root=root_path)
38+
doc_gen.collect_snippets()
39+
40+
labeled = from_doc_gen(doc_gen)
41+
42+
# print(labeled)
43+
print('Services: ', len(labeled['services']))
44+
print('SDKs: ', len(labeled['sdks']))
45+
print('Examples: ', len(labeled['examples']))
46+
print('Snippets: ', len(labeled['snippets']))
47+
48+
for sdk in labeled['sdks']:
49+
before = time()
50+
snippets = select(labeled['snippets'], sdk)
51+
after = time()
52+
elapsed = after - before
53+
print(f"{sdk.language}:{sdk.version} has {len(snippets)} snippets (took {(elapsed * 1000):.2} ms)")
54+
55+
56+
if __name__ == "__main__":
57+
exit(main())

0 commit comments

Comments
 (0)