Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions aws_doc_sdk_examples_tools/metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,19 @@ class Url:
url: Optional[str]


@dataclass
class Person:
name: str
alias: str


@dataclass
class FeedbackCti:
category: str
type: str
item: str


@dataclass
class Excerpt:
description: Optional[str]
Expand Down Expand Up @@ -59,6 +72,10 @@ class Version:
sdkguide: Optional[str] = field(default=None)
# Link to additional topic places.
more_info: List[Url] = field(default_factory=list)
# List of people who have contributed to this example.
authors: List[Person] = field(default_factory=list)
# Feedback and maintenance owner. Primarily for internal use.
owner: Optional[FeedbackCti] = field(default=None)

def validate(self, errors: MetadataErrors, root: Path):
github = self.github
Expand Down
19 changes: 19 additions & 0 deletions aws_doc_sdk_examples_tools/metadata_errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,16 @@ def message(self):
return "lists version which is not listed in sdks.yaml."


@dataclass
class InvalidFeedbackCti(SdkVersionError):
feedback_cti: str = ""

def message(self):
return (
f"has feedback CTI that is missing at least one field: {self.feedback_cti}"
)


@dataclass
class InvalidGithubLink(SdkVersionError):
link: str = ""
Expand Down Expand Up @@ -370,6 +380,15 @@ def message(self):
return f"URL {self.url} is missing a title"


@dataclass
class PersonMissingField(SdkVersionError):
name: str = ""
alias: str = ""

def message(self):
return f"person is missing a field: name: {self.name}, alias: {self.alias}"


@dataclass
class MissingCategoryBody(MetadataParseError):
def message(self):
Expand Down
15 changes: 15 additions & 0 deletions aws_doc_sdk_examples_tools/metadata_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -741,6 +741,21 @@ def test_verify_load_successful():
file=ERRORS_METADATA_PATH,
id="medical-imagingBadFormat",
),
metadata_errors.PersonMissingField(
file=ERRORS_METADATA_PATH,
id="sqs_InvalidOwner",
language="Java",
sdk_version=2,
name="None",
alias="[email protected]",
),
metadata_errors.InvalidFeedbackCti(
file=ERRORS_METADATA_PATH,
id="sqs_InvalidOwner",
language="Java",
sdk_version=2,
feedback_cti="AWS|Documentation|None",
),
],
[
metadata_errors.MissingGithubLink(
Expand Down
19 changes: 19 additions & 0 deletions aws_doc_sdk_examples_tools/test_resources/errors_metadata.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -96,3 +96,22 @@ medical-imagingBadFormat:
- sdk_version: 2
services:
medical-imaging: { TestAction }
sqs_InvalidOwner:
title: Invalid owner
title_abbrev: Invalid owner abbrev
synopsis: This synopsis is just fine.
category: Test
languages:
Java:
versions:
- sdk_version: 2
authors:
- alias: [email protected]
owner:
category: AWS
type: Documentation
excerpts:
- snippet_tags:
- invalid.feedback.cti
services:
sqs:
48 changes: 48 additions & 0 deletions aws_doc_sdk_examples_tools/yaml_mapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
Url,
Version,
Excerpt,
Person,
FeedbackCti,
)
from .sdks import Sdk
from .services import Service
Expand Down Expand Up @@ -204,6 +206,37 @@ def url_from_yaml(
return Url(title, url)


def person_from_yaml(
yaml: Union[None, Dict[str, Optional[str]]]
) -> Optional[Union[Person, MetadataParseError]]:
if yaml is None:
return None
name = yaml.get("name")
alias = yaml.get("alias")

if name is None or alias is None:
return metadata_errors.PersonMissingField(name=str(name), alias=str(alias))

return Person(name, alias)


def feedback_cti_from_yaml(
yaml: Union[None, Dict[str, Optional[str]]]
) -> Optional[Union[FeedbackCti, MetadataParseError]]:
if yaml is None:
return None
category = yaml.get("category")
type = yaml.get("type")
item = yaml.get("item")

if category is None or type is None or item is None:
return metadata_errors.InvalidFeedbackCti(
feedback_cti="|".join([str(category), str(type), str(item)])
)

return FeedbackCti(category, type, item)


def version_from_yaml(
yaml: Dict[str, Any],
cross_content_blocks: Set[str],
Expand Down Expand Up @@ -243,6 +276,19 @@ def version_from_yaml(
elif url is not None:
errors.append(url)

authors: List[Person] = []
for author in yaml.get("authors", []):
author = person_from_yaml(author)
if isinstance(author, Person):
authors.append(author)
elif author is not None:
errors.append(author)

owner = feedback_cti_from_yaml(yaml.get("owner"))
if owner is not None and not isinstance(owner, FeedbackCti):
errors.append(owner)
owner = None

add_services = parse_services(yaml.get("add_services", {}), errors)
if add_services:
errors.append(
Expand All @@ -264,6 +310,8 @@ def version_from_yaml(
github,
sdkguide,
more_info,
authors,
owner,
),
errors,
)