diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6c3ce38..f42e8f3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -336,12 +336,16 @@ jobs: name: release-artifacts path: dist/ + - name: Package Starter Kits + run: | + make starter-kits + - name: Create GitHub Release env: GH_TOKEN: ${{ github.token }} run: | TAG="${{ github.ref_name }}" - gh release create "$TAG" dist/*.whl dist/*.tar.gz dist/checksums.txt \ + gh release create "$TAG" dist/*.whl dist/*.tar.gz dist/checksums.txt dist/starter-kit-python-*.zip \ --title "$TAG" \ --prerelease \ --generate-notes \ diff --git a/Makefile b/Makefile index b142d39..8adc5d4 100644 --- a/Makefile +++ b/Makefile @@ -125,6 +125,10 @@ bump-version: uv run python scripts/bump_version.py $(VERSION) $(MAKE) lint +# Package all starter kits under starter-kits/ into dist/ +starter-kits: + @uv run python scripts/package_starter_kits.py + # Help target help: @echo "Fastly Compute Python SDK" @@ -163,4 +167,4 @@ help: @echo "" @echo "Available examples: $(EXAMPLES)" -.PHONY: all serve test test-update-snapshots list-examples build-all clean lint lint-fix format format-check help bump-version +.PHONY: all serve test test-update-snapshots list-examples build-all clean lint lint-fix format format-check help bump-version starter-kits diff --git a/pyproject.toml b/pyproject.toml index 6ea7523..7df9845 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,6 +74,7 @@ convention = "google" [tool.ruff.lint.per-file-ignores] "fastly_compute/tests/*" = ["D"] "examples/*" = ["D"] +"starter-kits/*" = ["D"] ".github/*" = ["D"] # What can one say about __main__? "__main__.py" = ["D100"] diff --git a/scripts/package_starter_kits.py b/scripts/package_starter_kits.py new file mode 100644 index 0000000..3d7aa09 --- /dev/null +++ b/scripts/package_starter_kits.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +"""Script to package all starter kits under starter-kits/ into dist/.""" + +import zipfile +from pathlib import Path + + +def package_starter_kits(): + """Discover and package starter kits as zips in dist/ directory""" + # Base directory of the repository (parent of scripts/) + repo_root = Path(__file__).resolve().parent.parent + starter_kits_dir = repo_root / "starter-kits" + dist_dir = repo_root / "dist" + + # Ensure dist/ directory exists + dist_dir.mkdir(parents=True, exist_ok=True) + + if not starter_kits_dir.is_dir(): + print(f"Error: starter-kits directory not found at {starter_kits_dir}") + return + + # Iterate over all subdirectories of starter-kits/ + for kit_dir in starter_kits_dir.iterdir(): + if kit_dir.is_dir(): + kit_name = kit_dir.name + zip_path = dist_dir / f"starter-kit-python-{kit_name}.zip" + print( + f"Packaging starter kit '{kit_name}' to {zip_path.relative_to(repo_root)}..." + ) + + # Create/overwrite the zip archive + with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zipf: + # Walk the files inside the starter kit directory + for file_path in kit_dir.rglob("*"): + if file_path.is_file(): + # Calculate the relative path for the zip archive + arcname = file_path.relative_to(kit_dir) + zipf.write(file_path, arcname) + + +if __name__ == "__main__": + package_starter_kits() diff --git a/starter-kits/default/.gitignore b/starter-kits/default/.gitignore new file mode 100644 index 0000000..440a95e --- /dev/null +++ b/starter-kits/default/.gitignore @@ -0,0 +1,14 @@ +# Python-generated files +__pycache__/ +*.py[oc] +build/ +dist/ +wheels/ +*.egg-info + +# Virtual environments +.venv + +# Fastly Compute +bin/ +pkg/ diff --git a/starter-kits/default/README.md b/starter-kits/default/README.md new file mode 100644 index 0000000..7dd73df --- /dev/null +++ b/starter-kits/default/README.md @@ -0,0 +1,18 @@ +# Fastly Compute Python Starter Kit + +A basic starter kit for running Python applications on Fastly's Compute platform using the [WSGI](https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface) interface and the [Bottle](https://bottlepy.org/) web framework. + +## Requirements + +* [Fastly CLI](https://github.com/fastly/cli) +* [Python >= 3.12](https://www.python.org/) +* [uv](https://docs.astral.sh/uv/) + +## Development + +To build and deploy this application: + +```bash +fastly compute build +fastly compute deploy +``` diff --git a/starter-kits/default/fastly.toml b/starter-kits/default/fastly.toml new file mode 100644 index 0000000..97c963b --- /dev/null +++ b/starter-kits/default/fastly.toml @@ -0,0 +1,8 @@ +# This file describes a Fastly Compute package. To learn more visit: +# https://www.fastly.com/documentation/reference/compute/fastly-toml + +authors = [] +description = "A basic starter kit that demonstrates routing and simple responses in Python." +language = "python" +manifest_version = 3 +name = "fastly-compute-python-app" diff --git a/starter-kits/default/main.py b/starter-kits/default/main.py new file mode 100644 index 0000000..9a38a31 --- /dev/null +++ b/starter-kits/default/main.py @@ -0,0 +1,18 @@ +import platform + +from bottle import Bottle + +from fastly_compute.wsgi import WsgiHttpIncoming + +app = Bottle() + + +@app.route("/") +def index(): + version = platform.python_version() + return f"Welcome to Python {version} on Fastly Compute!" + + +# Create the HTTP handler using WSGI; this adapts the fastly compute +# platform to the WSGI standard for use with a variety of frameworks. +HttpIncoming = WsgiHttpIncoming(app) diff --git a/starter-kits/default/pyproject.toml b/starter-kits/default/pyproject.toml new file mode 100644 index 0000000..b87840f --- /dev/null +++ b/starter-kits/default/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "fastly-compute-python-app" +version = "0.1.0" +description = "A basic starter kit for Python on Fastly Compute" +requires-python = ">=3.12" +dependencies = [ + "bottle>=0.12.25", + "fastly-compute>=0.1.2", +] + +[tool.fastly-compute] +entry = "main"