diff --git a/aws_doc_sdk_examples_tools/metadata.py b/aws_doc_sdk_examples_tools/metadata.py index f2a5761..d8cb2f0 100755 --- a/aws_doc_sdk_examples_tools/metadata.py +++ b/aws_doc_sdk_examples_tools/metadata.py @@ -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] @@ -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 diff --git a/aws_doc_sdk_examples_tools/metadata_errors.py b/aws_doc_sdk_examples_tools/metadata_errors.py index f6814ad..2051217 100644 --- a/aws_doc_sdk_examples_tools/metadata_errors.py +++ b/aws_doc_sdk_examples_tools/metadata_errors.py @@ -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 = "" @@ -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): diff --git a/aws_doc_sdk_examples_tools/metadata_test.py b/aws_doc_sdk_examples_tools/metadata_test.py index 13bea5f..81a382b 100644 --- a/aws_doc_sdk_examples_tools/metadata_test.py +++ b/aws_doc_sdk_examples_tools/metadata_test.py @@ -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="author@example.com", + ), + metadata_errors.InvalidFeedbackCti( + file=ERRORS_METADATA_PATH, + id="sqs_InvalidOwner", + language="Java", + sdk_version=2, + feedback_cti="AWS|Documentation|None", + ), ], [ metadata_errors.MissingGithubLink( diff --git a/aws_doc_sdk_examples_tools/test_resources/errors_metadata.yaml b/aws_doc_sdk_examples_tools/test_resources/errors_metadata.yaml index e77bbab..011111e 100644 --- a/aws_doc_sdk_examples_tools/test_resources/errors_metadata.yaml +++ b/aws_doc_sdk_examples_tools/test_resources/errors_metadata.yaml @@ -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: author@example.com + owner: + category: AWS + type: Documentation + excerpts: + - snippet_tags: + - invalid.feedback.cti + services: + sqs: diff --git a/aws_doc_sdk_examples_tools/yaml_mapper.py b/aws_doc_sdk_examples_tools/yaml_mapper.py index 87f909b..bdc8153 100644 --- a/aws_doc_sdk_examples_tools/yaml_mapper.py +++ b/aws_doc_sdk_examples_tools/yaml_mapper.py @@ -9,6 +9,8 @@ Url, Version, Excerpt, + Person, + FeedbackCti, ) from .sdks import Sdk from .services import Service @@ -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], @@ -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( @@ -264,6 +310,8 @@ def version_from_yaml( github, sdkguide, more_info, + authors, + owner, ), errors, )