diff --git a/.github/workflows/execute.yml b/.github/workflows/execute.yml new file mode 100644 index 0000000..cfbae9d --- /dev/null +++ b/.github/workflows/execute.yml @@ -0,0 +1,31 @@ +name: Execute + +on: + schedule: + - cron: '0 18 * * *' + push: + branches: + - master + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + - name: Install dependencies + run: pip install -r requirements.txt + - name: Run + run: ./build.py + - name: Commit changes + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: Build + file_pattern: docs/index.html + commit_user_name: GitHub Action + commit_user_email: actions@github.com + commit_author: GitHub Action diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ad4a1f1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,176 @@ +# Created by https://www.toptal.com/developers/gitignore/api/python +# Edit at https://www.toptal.com/developers/gitignore?templates=python + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +### Python Patch ### +# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration +poetry.toml + +# ruff +.ruff_cache/ + +# LSP config files +pyrightconfig.json + +# End of https://www.toptal.com/developers/gitignore/api/python diff --git a/README.md b/README.md index ea7aac2..4f698fa 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,20 @@ -:globe_with_meridians: Ramblings: [theorangeone.net/posts](https://theorangeone.net/posts/) + :octocat: More repos: [git.theorangeone.net](https://git.theorangeone.net/) :pencil: Notes: [notes.theorangeone.net](https://notes.theorangeone.net/) -:wave: Say ["Hi"](https://theorangeone.net/contact/) or ["Thanks"](https://theorangeone.net/support/) ! +:wave: Say ["Hi"](https://theorangeone.net/contact/) or ["Thanks"](https://theorangeone.net/support/)! :shipit: + +## Recent posts + + +- [Exposing Docker's internal DNS with CoreDNS](https://theorangeone.net/posts/expose-docker-internal-dns/) (2024-01-17) +- [Fixing the heater blower in a VW Polo](https://theorangeone.net/posts/vw-polo-heater-blower/) (2024-01-06) +- [State of the Server 2024](https://theorangeone.net/posts/state-of-the-server-2024/) (2024-01-01) +- [Forcing dark mode in Android Auto Maps](https://theorangeone.net/posts/dark-android-auto-maps/) (2023-12-18) +- [On Mondays, I update servers](https://theorangeone.net/posts/monday-server-updates/) (2023-12-04) + +:globe_with_meridians: View more: [theorangeone.net/posts](https://theorangeone.net/posts/) \ No newline at end of file diff --git a/README.md.j2 b/README.md.j2 new file mode 100644 index 0000000..b8a6b70 --- /dev/null +++ b/README.md.j2 @@ -0,0 +1,17 @@ + + +:octocat: More repos: [git.theorangeone.net](https://git.theorangeone.net/) + +:pencil: Notes: [notes.theorangeone.net](https://notes.theorangeone.net/) + +:wave: Say ["Hi"](https://theorangeone.net/contact/) or ["Thanks"](https://theorangeone.net/support/)! + +:shipit: + +## Recent posts + +{% for post in latest_posts %} +- [{{ post.title }}]({{ post.full_url }}) ({{ post.date}}) +{%- endfor %} + +:globe_with_meridians: View more: [theorangeone.net/posts](https://theorangeone.net/posts/) diff --git a/build.py b/build.py new file mode 100755 index 0000000..29a8f0d --- /dev/null +++ b/build.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +import jinja2 +from pathlib import Path +import requests + +PROJECT_DIR = Path(__file__).resolve().parent + +TEMPLATE_FILE = PROJECT_DIR / "README.md.j2" +OUTPUT_FILE = PROJECT_DIR / "README.md" + + +def get_posts() -> list[dict]: + response = requests.get("https://theorangeone.net/api/latest-posts/?page_size=5&format=json") + response.raise_for_status() + return response.json()["results"] + + +def main(): + template = jinja2.Template(TEMPLATE_FILE.read_text()) + + OUTPUT_FILE.write_text(template.render( + latest_posts=get_posts() + )) + +if __name__ == "__main__": + main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b93a7b1 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +jinja2 +requests