Skip to content

ajitagupta/python-engineering-lab

Repository files navigation

Python Engineering Lab

Python Engineering Lab — engineering concepts assembled one piece at a time

A learning-in-public project. I'm a software engineer consolidating my Python and backend fundamentals by implementing one engineering concept at a time — from scratch, by hand, understanding rather than copying — and writing down what I actually learned along the way.

The concepts aren't isolated exercises. Together they build one API — a workout / training tracker — that grows more capable with every step. Concept 01 is a bare REST endpoint; by concept 10 the same API validates input, is covered by tests, persists to a database, supports search, filtering and pagination, imports CSV files, runs scheduled background jobs, caches reads, and parses free-form text into workouts. Ten concepts, one growing codebase.

The project: a workout tracker API

The running example logs workouts — runs, swims, rides, badminton, strength sessions, rest days. A deliberately small domain, chosen so the engineering stays in focus. A few decisions recur throughout:

  • A workout has a sport, and optionally a distance_km and duration_min.
  • Different sports need different fields: a run needs both distance and duration; strength and badminton need only duration; a rest day needs neither ("conditional validation").
  • Absent optional fields are stored as NULL / None, which forces careful handling of missing values throughout the stack.

How this lab works

  • One concept per folder, numbered in order (01-..., 02-...).
  • I write the first version myself before looking at any reference — the point is understanding, not copying.
  • Each concept builds on the previous one's code; the API is cumulative.
  • Each folder has its own README with run instructions and honest notes on what tripped me up and what I deliberately left for later.

Architecture

A theme that pays off repeatedly: separation of concerns. From concept 04 on, all database code lives in a db.py data-access layer, and the Flask routes call those functions rather than touching SQL directly. Routes handle HTTP; db.py handles storage. That split is what lets later concepts — like a background job reading the database from outside any request — reuse the same functions cleanly.

Getting started

You'll need Python 3.12 or newer.

git clone https://github.com/ajitagupta/python-engineering-lab.git
cd python-engineering-lab
python -m venv .venv
.venv\Scripts\activate          # macOS/Linux: source .venv/bin/activate

Then open the README inside whichever concept folder you want to run — each lists its own dependencies. Reading them in order shows the API take shape.

Roadmap

Each concept adds one capability to the same workout-tracker API.

Concept What it adds Skill Folder
01 — REST API List and create workouts over HTTP Flask routes, HTTP methods, JSON 01-rest-api
02 — Validation & Error Handling Reject bad input with clear errors Validation, 400/404, conditional rules 02-validation-error-handling
03 — Pytest API Tests A test suite proving the API works pytest, test client, fixtures 03-pytest-api-tests
04 — SQLite Persistence Store workouts in a database SQL, a data-access layer, sqlite3 04-sqlite-persistence
05 — Search & Filtering Filter by sport, distance, duration Query parameters, dynamic SQL 05-search-filtering
06 — Pagination Return results in pages with metadata LIMIT/OFFSET, response metadata 06-pagination
07 — File Uploads Bulk-import from CSV, all-or-nothing Multipart uploads, CSV parsing 07-file-upload
08 — Background Scheduler Log a summary periodically, on a timer Scheduled jobs, background threads 08-background-scheduler
09 — Caching Serve repeated reads from a cache Cache strategies, invalidation 09-caching
10 — Data Parsing & Extraction Parse free-form text into workouts Regular expressions, extraction 10-data-parsing

All ten concepts complete. ✅

Tech

Python 3.12 · Flask — the web framework — and APScheduler for background jobs are the only third-party dependencies. Everything else is the standard library: SQLite (sqlite3), CSV parsing (csv, io), and regular expressions (re), plus pytest for tests. Dependencies were added only as each concept needed them.


A finished learning project. Progress over speed — one concept genuinely understood beats five rushed.

About

Learning to build backend applications by implementing backend patterns in Python using Flask, pytest, SQLite, APScheduler

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Languages