Coverage for meta_tags_parser/snippets.py: 100%
23 statements
« prev ^ index » next coverage.py v7.10.3, created at 2025-09-18 21:46 +0000
« prev ^ index » next coverage.py v7.10.3, created at 2025-09-18 21:46 +0000
1import dataclasses
2import typing
4from . import parse, structs
7def _parse_dimension(dimension_text: str) -> int:
8 cleaned_text: typing.Final[str] = dimension_text.strip()
9 if not cleaned_text:
10 return 0
11 if not cleaned_text.isascii() or not cleaned_text.isdigit():
12 return 0
13 return int(cleaned_text)
16def parse_snippets_from_source(
17 source_code: str,
18 *,
19 options: structs.SettingsFromUser | None = None,
20) -> structs.SnippetGroup:
21 active_options: structs.SettingsFromUser = options or structs.SettingsFromUser()
22 snippets_options: structs.SettingsFromUser = dataclasses.replace(
23 active_options,
24 what_to_parse=(structs.WhatToParse.OPEN_GRAPH, structs.WhatToParse.TWITTER),
25 )
26 parsed_group: typing.Final[structs.TagsGroup] = parse.parse_meta_tags_from_source(
27 source_code,
28 options=snippets_options,
29 )
30 prepared_group_data: dict[str, structs.SocialMediaSnippet] = {}
31 social_name: str
32 parsed_tags: list[structs.OneMetaTag]
33 for social_name, parsed_tags in (
34 ("twitter", parsed_group.twitter),
35 ("open_graph", parsed_group.open_graph),
36 ):
37 prepared_snippet_data: dict[str, typing.Any] = {}
38 one_meta_tag: structs.OneMetaTag
39 for one_meta_tag in parsed_tags:
40 if one_meta_tag.normalized_name not in structs.WHAT_ATTRS_IN_SOCIAL_MEDIA_SNIPPET:
41 continue
42 prepared_snippet_data[one_meta_tag.normalized_name] = (
43 _parse_dimension(one_meta_tag.value) if one_meta_tag.name.startswith("image:") else one_meta_tag.value
44 )
45 prepared_group_data[social_name] = structs.SocialMediaSnippet(**prepared_snippet_data)
46 return structs.SnippetGroup(**prepared_group_data)