Packaging Projects - Overview
Module 05 Project Track
The lessons in this module covered the theory. These projects make it concrete: you will build a real Python package, wire up a full CI pipeline, and publish it to TestPyPI. Every requirement maps directly to something engineers do on production packages.
Why These Projects Exist
Reading about poetry.lock and understanding poetry.lock under deadline pressure are different skills. The gap between them is closed by doing the work end-to-end: writing the code, hitting the errors, fixing them, and seeing the package appear on a package index.
These projects are not tutorial-walkthroughs. They specify requirements and give you starter code. How you implement the requirements is up to you. The rubric checks outcomes, not process.
Projects in This Track
| Project | What You Build | Skills Covered |
|---|---|---|
| 01 - Publish Internal Utility Package | pyutils-engineersofai - a typed utility library with 3 modules, full test suite, CI pipeline, and TestPyPI release | src/ layout, pyproject.toml, hatchling, poetry.lock, pytest coverage, changelog, TestPyPI publish, GitLab CI |
Prerequisites
Before starting these projects, you should have completed:
- Lesson 01 -
venvand virtual environments - Lesson 02 -
pipandrequirements.txt - Lesson 03 -
pyproject.tomldeep dive - Lesson 04 - Poetry
- Lesson 05 - Semantic Versioning
- Lesson 06 - Publishing Packages (this lesson covers the TestPyPI workflow you will use)
You also need:
- A TestPyPI account at test.pypi.org (free, separate from pypi.org)
- Poetry installed via
pipx install poetry - A GitLab account (for the CI pipeline requirement)
How Projects Are Assessed
Each project has numbered requirements (R1, R2, ...). Each requirement is independently assessable. The grading scale:
| Score | Meaning |
|---|---|
| Complete | All requirements met and verified |
| Functional | Core requirements (R1–R5) met; stretch requirements (R6–R8) incomplete |
| Partial | Package builds and installs; tests incomplete or coverage below threshold |
| Not started | Project not attempted |
There are no trick requirements. If you can run pip install --index-url https://test.pypi.org/simple/ pyutils-engineersofai and then python -c "from pyutils_engineersofai.strings import slugify; print(slugify('Hello World'))" and get hello-world, you have met the core intent.
Project Environment Setup
# Install Poetry (if not already installed)
pipx install poetry
# Create a TestPyPI account
# https://test.pypi.org/account/register/
# Create a TestPyPI API token
# https://test.pypi.org/manage/account/token/
# Scope: "Entire account" for first publish (switch to project-scoped after first upload)
# Configure Poetry for TestPyPI
poetry config repositories.testpypi https://test.pypi.org/legacy/
poetry config pypi-token.testpypi pypi-xxxxx...
# Verify
poetry config --list | grep testpypi
