1
1
import argparse
2
2
import logging
3
+ import ssl
4
+ from urllib import request
5
+ from xml .etree import ElementTree
3
6
4
7
from snakemd import Document , InlineText , MDList , Paragraph
5
8
from subete import LanguageCollection , Repo
6
9
7
10
11
+ logger = logging .getLogger (__name__ )
12
+
13
+
8
14
def main ():
15
+ ssl ._create_default_https_context = ssl ._create_unverified_context
9
16
args = _get_args ()
10
17
numeric_level = getattr (logging , args [1 ].upper (), None )
11
18
if not isinstance (numeric_level , int ):
@@ -57,7 +64,7 @@ def _get_sample_programs_text() -> str:
57
64
"""
58
65
59
66
60
- def _generate_program_list (language : LanguageCollection ) -> MDList :
67
+ def _generate_program_list (language : LanguageCollection ) -> list :
61
68
"""
62
69
A helper function which generates a list of programs for the README.
63
70
:param language: a language collection
@@ -73,7 +80,22 @@ def _generate_program_list(language: LanguageCollection) -> MDList:
73
80
program_line .replace (":white_check_mark:" , ":warning:" ) \
74
81
.replace_link (program .documentation_url (), program .article_issue_query_url ())
75
82
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 )
77
99
78
100
79
101
def _generate_credit () -> Paragraph :
@@ -87,6 +109,12 @@ def _generate_credit() -> Paragraph:
87
109
return p
88
110
89
111
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
+
90
118
class ReadMeCatalog :
91
119
"""
92
120
An representation of the collection of READMEs in the Sample Programs repo.
@@ -99,6 +127,7 @@ def __init__(self, repo: Repo):
99
127
"""
100
128
self .repo : Repo = repo
101
129
self .pages : dict [str , Document ] = dict ()
130
+ self ._programs = _get_complete_program_list ()
102
131
self ._build_readmes ()
103
132
104
133
def _build_readme (self , language : LanguageCollection ) -> None :
@@ -114,9 +143,10 @@ def _build_readme(self, language: LanguageCollection) -> None:
114
143
page .add_element (_get_intro_text (language ))
115
144
116
145
# 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 )
118
148
page .add_paragraph (_get_sample_programs_text ())
119
- page .add_element (_generate_program_list ( language ))
149
+ page .add_element (MDList ( program_list ))
120
150
121
151
# Testing
122
152
page .add_header ("Testing" , level = 2 )
0 commit comments