Skip to content
This repository was archived by the owner on May 11, 2022. It is now read-only.

Commit 7e58fe1

Browse files
authored
Added How To Python README Automation (#39)
* Starting the How To Python README code * Created the README header * Added RSS reading * Added YouTube video automation * Removed code snippet article * Added challenge support * Automated all columns * Incremented software version
1 parent 9cee419 commit 7e58fe1

File tree

4 files changed

+108
-2
lines changed

4 files changed

+108
-2
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,5 @@ venv.bak/
109109
# Wiki
110110
/generate_docs/wiki/
111111
/generate_docs/readme/
112+
generate_docs/how_to/README.md
113+
generate_docs/README.md

generate_docs/generator.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from generate_docs.readme import ReadMeCatalog
55
from generate_docs.repo import Repo
66
from generate_docs.wiki import Wiki
7+
from generate_docs.how_to import HowTo
78

89

910
class Generator:
@@ -62,6 +63,12 @@ def main_readmes():
6263
_create_generator().generate_readmes()
6364

6465

66+
def main_how_to():
67+
how_to = HowTo()
68+
how_to.page.output_page("")
69+
70+
6571
if __name__ == '__main__':
6672
main_wiki()
6773
main_readmes()
74+
main_how_to()

generate_docs/how_to.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
from typing import Optional
2+
from bs4 import BeautifulSoup
3+
import requests
4+
import feedparser
5+
6+
from generate_docs.markdown import MarkdownPage
7+
8+
9+
def get_intro_text():
10+
return """Welcome to a collection of Jupyter Notebooks from the
11+
[How to Python](https://therenegadecoder.com/series/how-to-python/) series on The Renegade Coder. For convenience,
12+
you can access all of the articles, videos, challenges, and source code below. Alternatively, I keep
13+
[an enormous article](https://therenegadecoder.com/code/python-code-snippets-for-everyday-problems/) up to date
14+
with all these snippets as well.
15+
"""
16+
17+
18+
def get_series_posts():
19+
index = 1
20+
base = "https://therenegadecoder.com/series/how-to-python/feed/?paged="
21+
feed = []
22+
while (rss := feedparser.parse(f"{base}{index}")).entries:
23+
feed.extend(rss.entries)
24+
index += 1
25+
return feed
26+
27+
28+
def get_youtube_video(entry):
29+
content = entry.content[0].value
30+
soup = BeautifulSoup(content, "html.parser")
31+
target = soup.find("h2", text="Video Summary")
32+
if target:
33+
return target.find_next_sibling().find_all("a")[-1]["href"]
34+
35+
36+
def get_slug(title: str, sep: str):
37+
return title.split(":")[0][:-10].lower().replace(" ", sep)
38+
39+
40+
def get_challenge(title: str):
41+
slug = get_slug(title, "-")
42+
base = "https://github.com/TheRenegadeCoder/how-to-python-code/tree/master/challenges/"
43+
print(f"Trying {base}{slug}")
44+
request = requests.get(f"{base}{slug}")
45+
if request.status_code == 200:
46+
return f"{base}{slug}"
47+
48+
49+
def get_notebook(title: str):
50+
slug = get_slug(title, "_")
51+
base = "https://github.com/TheRenegadeCoder/how-to-python-code/tree/master/notebooks/"
52+
print(f"Trying {base}{slug}.ipynb")
53+
request = requests.get(f"{base}{slug}.ipynb")
54+
if request.status_code == 200:
55+
return f"{base}{slug}.ipynb"
56+
57+
58+
class HowTo:
59+
def __init__(self):
60+
self.page: Optional[MarkdownPage] = None
61+
self.feed: Optional[list] = None
62+
self._load_data()
63+
self._build_readme()
64+
65+
def _load_data(self):
66+
self.feed = get_series_posts()
67+
68+
def _build_readme(self):
69+
self.page = MarkdownPage("README")
70+
71+
# Introduction
72+
self.page.add_content("# How to Python - Source Code")
73+
self.page.add_section_break()
74+
self.page.add_content(get_intro_text())
75+
self.page.add_section_break()
76+
77+
# Article List
78+
self.page.add_table_header("Index", "Title", "Publish Date", "Article", "Video", "Challenge", "Notebook")
79+
self.build_table()
80+
81+
def build_table(self):
82+
index = 1
83+
for entry in self.feed:
84+
if "Code Snippets" not in entry.title:
85+
article = f"[Article]({entry.link})"
86+
youtube_url = get_youtube_video(entry)
87+
youtube = f"[Video]({youtube_url})" if youtube_url else ""
88+
challenge_url = get_challenge(entry.title)
89+
challenge = f"[Challenge]({challenge_url})" if challenge_url else ""
90+
notebook_url = get_notebook(entry.title)
91+
notebook = f"[Notebook]({notebook_url})" if notebook_url else ""
92+
self.page.add_table_row(str(index), entry.title, entry.published, article, youtube, challenge, notebook)
93+
index += 1

setup.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
setuptools.setup(
77
name="generate_docs",
8-
version="2.2.0",
8+
version="2.3.0",
99
author="The Renegade Coder",
1010
author_email="jeremy.grifski@therenegadecoder.com",
1111
description="A docs generation package for the Sample Programs repo",
@@ -14,12 +14,16 @@
1414
url="https://github.com/TheRenegadeCoder/sample-programs-docs-generator",
1515
packages=setuptools.find_packages(),
1616
install_requires=[
17-
"PyYAML~=5.4.1"
17+
"PyYAML~=5.4.1",
18+
"feedparser~=6.0.6",
19+
"beautifulsoup4~=4.9.3",
20+
"requests~=2.25.1"
1821
],
1922
entry_points={
2023
"console_scripts": [
2124
'wikig = generate_docs.generator:main_wiki',
2225
'wikir = generate_docs.generator:main_readmes',
26+
'wikih = generate_docs.generator:main_how_to'
2327
],
2428
},
2529
classifiers=(

0 commit comments

Comments
 (0)