11import argparse
22import logging
3+ import ssl
4+ from urllib import request
5+ from xml .etree import ElementTree
36
47from snakemd import Document , InlineText , MDList , Paragraph
58from subete import LanguageCollection , Repo
69
710
11+ logger = logging .getLogger (__name__ )
12+
13+
814def main ():
15+ ssl ._create_default_https_context = ssl ._create_unverified_context
916 args = _get_args ()
1017 numeric_level = getattr (logging , args [1 ].upper (), None )
1118 if not isinstance (numeric_level , int ):
@@ -57,7 +64,7 @@ def _get_sample_programs_text() -> str:
5764 """
5865
5966
60- def _generate_program_list (language : LanguageCollection ) -> MDList :
67+ def _generate_program_list (language : LanguageCollection ) -> list :
6168 """
6269 A helper function which generates a list of programs for the README.
6370 :param language: a language collection
@@ -73,7 +80,22 @@ def _generate_program_list(language: LanguageCollection) -> MDList:
7380 program_line .replace (":white_check_mark:" , ":warning:" ) \
7481 .replace_link (program .documentation_url (), program .article_issue_query_url ())
7582 list_items .append (program_line )
76- return MDList (list_items )
83+ return list_items
84+
85+
86+ def _get_complete_program_list () -> list :
87+ """
88+ A helper function which retrieves the entire list of eligible programs from the
89+ documentation website.
90+ """
91+ programs = list ()
92+ logger .info (f"Attempting to open https://sample-programs.therenegadecoder.com/sitemap.xml" )
93+ xml_data = request .urlopen ("https://sample-programs.therenegadecoder.com/sitemap.xml" )
94+ for child in ElementTree .parse (xml_data ).getroot ():
95+ url = child [0 ].text
96+ if "projects" in url and len (url .split ("/" )) == 6 :
97+ programs .append (url .split ("/" )[4 ])
98+ return sorted (programs )
7799
78100
79101def _generate_credit () -> Paragraph :
@@ -87,6 +109,12 @@ def _generate_credit() -> Paragraph:
87109 return p
88110
89111
112+ def _generate_program_list_header (program_list , total_programs ):
113+ i = int (((len (program_list ) / len (total_programs )) * 4 ))
114+ emojis = [":disappointed:" , ":thinking:" , ":relaxed:" , ":smile:" , ":partying_face:" ]
115+ return f"Sample Programs List — { len (program_list )} /{ len (total_programs )} { emojis [i ]} "
116+
117+
90118class ReadMeCatalog :
91119 """
92120 An representation of the collection of READMEs in the Sample Programs repo.
@@ -99,6 +127,7 @@ def __init__(self, repo: Repo):
99127 """
100128 self .repo : Repo = repo
101129 self .pages : dict [str , Document ] = dict ()
130+ self ._programs = _get_complete_program_list ()
102131 self ._build_readmes ()
103132
104133 def _build_readme (self , language : LanguageCollection ) -> None :
@@ -114,9 +143,10 @@ def _build_readme(self, language: LanguageCollection) -> None:
114143 page .add_element (_get_intro_text (language ))
115144
116145 # Sample Programs List
117- page .add_header ("Sample Programs List" , level = 2 )
146+ program_list = _generate_program_list (language )
147+ page .add_header (_generate_program_list_header (program_list , self ._programs ), level = 2 )
118148 page .add_paragraph (_get_sample_programs_text ())
119- page .add_element (_generate_program_list ( language ))
149+ page .add_element (MDList ( program_list ))
120150
121151 # Testing
122152 page .add_header ("Testing" , level = 2 )
0 commit comments