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

1import dataclasses 

2import typing 

3 

4from . import parse, structs 

5 

6 

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) 

14 

15 

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)