Static Page Generator #5

Merged
kumi merged 21 commits from dev into main 2024-07-06 14:07:00 +00:00
3 changed files with 80 additions and 21 deletions
Showing only changes of commit d337e8a207 - Show all commits

View file

@ -0,0 +1,49 @@
name: Build and Deploy Static Site
on:
push:
branches:
- dev
jobs:
build:
container: node:20-bookworm
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Install dependencies
run: |
apt update
apt install -y python3 python3-pip
python3 -m pip install -r requirements.txt --break-system-packages
- name: Generate static site
run: python3 main.py
- name: Deploy to pages branch
run: |
# Configure Git
git config --global user.name "Forgejo"
git config --global user.email "noreply@private.coffee"
# Move generated static site files to a temporary location
mv build ../static_site_temp
# Create a new orphan branch named 'pages'
git checkout --orphan pages-dev
# Remove all files from the working directory
git rm -rf .
# Move the static site files back to the working directory
mv ../static_site_temp/* ./
mv ../static_site_temp/.* ./ 2>/dev/null || true
# Add and commit the static site files
git add .
git commit -m "Deploy static site"
# Force push to the 'pages' branch
git push origin pages --force

View file

@ -3,7 +3,7 @@ name: Build and Deploy Static Site
on: on:
push: push:
branches: branches:
- static - main
jobs: jobs:
build: build:

50
main.py
View file

@ -1,7 +1,6 @@
from jinja2 import Environment, FileSystemLoader, TemplateNotFound from jinja2 import Environment, FileSystemLoader, TemplateNotFound
import json import json
import pathlib import pathlib
import os
import datetime import datetime
import shutil import shutil
@ -14,33 +13,37 @@ from helpers.finances import (
) )
# Configure Jinja2 environment # Configure Jinja2 environment
env = Environment(loader=FileSystemLoader('templates')) env = Environment(loader=FileSystemLoader("templates"))
# Set up the output directory for static files # Set up the output directory for static files
output_dir = pathlib.Path('build') output_dir = pathlib.Path("build")
output_dir.mkdir(exist_ok=True, parents=True) output_dir.mkdir(exist_ok=True, parents=True)
# Define the icon filter # Define the icon filter
def icon(icon_name): def icon(icon_name):
icon_path = pathlib.Path('assets') / f"dist/icons/{icon_name}.svg" icon_path = pathlib.Path("assets") / f"dist/icons/{icon_name}.svg"
try: try:
with open(icon_path, 'r', encoding='utf-8') as file: with open(icon_path, "r", encoding="utf-8") as file:
file_content = file.read() file_content = file.read()
except FileNotFoundError: except FileNotFoundError:
file_content = '' file_content = ""
return file_content return file_content
env.filters['icon'] = icon
env.filters["icon"] = icon
def render_template_to_file(template_name, output_name, **kwargs): def render_template_to_file(template_name, output_name, **kwargs):
try: try:
template = env.get_template(template_name) template = env.get_template(template_name)
output_path = output_dir / output_name output_path = output_dir / output_name
with open(output_path, 'w', encoding='utf-8') as f: with open(output_path, "w", encoding="utf-8") as f:
f.write(template.render(**kwargs)) f.write(template.render(**kwargs))
except TemplateNotFound: except TemplateNotFound:
print(f"Template {template_name} not found.") print(f"Template {template_name} not found.")
def generate_static_site(development_mode=False): def generate_static_site(development_mode=False):
# Common context # Common context
kwargs = {} kwargs = {}
@ -62,8 +65,8 @@ def generate_static_site(development_mode=False):
) )
# Iterate over all templates in the templates directory # Iterate over all templates in the templates directory
templates_path = pathlib.Path('templates') templates_path = pathlib.Path("templates")
for template_file in templates_path.glob('*.html'): for template_file in templates_path.glob("*.html"):
template_name = template_file.stem template_name = template_file.stem
context = kwargs.copy() context = kwargs.copy()
@ -76,12 +79,16 @@ def generate_static_site(development_mode=False):
finances_period = datetime.date(finances_year, finances_month, 1) finances_period = datetime.date(finances_year, finances_month, 1)
finances_period_str = finances_period.strftime("%B %Y") finances_period_str = finances_period.strftime("%B %Y")
finances_table = generate_transparency_table( finances_table = generate_transparency_table(
get_transparency_data(finances, finances_year, finances_month, allow_current) get_transparency_data(
finances, finances_year, finances_month, allow_current
)
)
context.update(
{
"finances": finances_table,
"finances_period": finances_period_str,
}
) )
context.update({
"finances": finances_table,
"finances_period": finances_period_str,
})
if template_name == "transparency": if template_name == "transparency":
finance_data = {} finance_data = {}
@ -94,7 +101,9 @@ def generate_static_site(development_mode=False):
) )
context.update({"finances": finance_data}) context.update({"finances": finance_data})
render_template_to_file(f"{template_name}.html", f"{template_name}.html", **context) render_template_to_file(
f"{template_name}.html", f"{template_name}.html", **context
)
# Generate metrics # Generate metrics
balances = get_transparency_data(finances, allow_current=True)["end_balance"] balances = get_transparency_data(finances, allow_current=True)["end_balance"]
@ -108,21 +117,22 @@ def generate_static_site(development_mode=False):
response += f'privatecoffee_balance{{currency="{currency}"}} {balance}\n' response += f'privatecoffee_balance{{currency="{currency}"}} {balance}\n'
metrics_path = output_dir / "metrics.txt" metrics_path = output_dir / "metrics.txt"
with open(metrics_path, 'w', encoding='utf-8') as f: with open(metrics_path, "w", encoding="utf-8") as f:
f.write(response) f.write(response)
# Copy static assets # Copy static assets
assets_src = pathlib.Path('assets') assets_src = pathlib.Path("assets")
assets_dst = output_dir / 'assets' assets_dst = output_dir / "assets"
if assets_dst.exists(): if assets_dst.exists():
shutil.rmtree(assets_dst) shutil.rmtree(assets_dst)
shutil.copytree(assets_src, assets_dst) shutil.copytree(assets_src, assets_dst)
print("Static site generated successfully.") print("Static site generated successfully.")
if __name__ == "__main__": if __name__ == "__main__":
parser = ArgumentParser(description="Generate the private.coffee static site.") parser = ArgumentParser(description="Generate the private.coffee static site.")
parser.add_argument("--dev", action="store_true", help="Enable development mode") parser.add_argument("--dev", action="store_true", help="Enable development mode")
args = parser.parse_args() args = parser.parse_args()
generate_static_site(development_mode=args.dev) generate_static_site(development_mode=args.dev)