# cynmeiciel/pylingstutorial architecture

> Architecture diagram of the GitHub repository cynmeiciel/pylingstutorial, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/cynmeiciel/pylingstutorial
- Repository: https://github.com/cynmeiciel/pylingstutorial

## Overview

Pythonlings is a hands-on Python course: learners solve ordered drills, then tackle less-scaffolded challenges and multi-file projects. The main loop is to start the watcher, edit the named drill, and save; the CLI reruns it and advances when it passes and its marker is removed. The README documents separate challenge and project workflows, plus unified progress reporting. Source excerpts show CLI dispatch and project wiring; some links between CLI commands and core helpers are based on their documented responsibilities, since plings/core.py was not sampled.

Main entry points: [`plings/cli.py`](https://github.com/cynmeiciel/pylingstutorial/blob/main/plings/cli.py) (CLI commands), [`projects/01_todo/app.py`](https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/01_todo/app.py) (To-do CLI), [`projects/02_game_of_life/app.py`](https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/02_game_of_life/app.py) (Life CLI), [`projects/03_sudoku/app.py`](https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/03_sudoku/app.py) (Sudoku CLI)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runner["Learning runner"]
  node_cli["CLI commands<br/>[cli.py]"]
  node_runner_core["Exercise runner<br/>[core.py]"]
  node_terminal_ui["Terminal UI<br/>[ui.py]"]
end

subgraph group_curriculum["Course material"]
  node_drills["Ordered drills"]
  node_reference["Reference answers"]
end

subgraph group_challenges["Challenges"]
  node_challenge_runner["Challenge runner<br/>[run.py]"]
  node_challenge_set["Phase 1 problems"]
end

subgraph group_projects["Projects"]
  node_todo_app["To-do CLI<br/>[app.py]"]
  node_todo_logic["Task logic<br/>[core.py]"]
  node_todo_storage["JSON persistence<br/>[storage.py]"]
  node_todo_file[("Task file")]
  node_life_app["Life CLI<br/>[app.py]"]
  node_life_logic["Generation rules<br/>[core.py]"]
  node_life_display["Grid rendering<br/>[display.py]"]
  node_sudoku_app["Sudoku CLI<br/>[app.py]"]
  node_sudoku_logic["Sudoku solver<br/>[core.py]"]
  node_sudoku_display["Board rendering<br/>[display.py]"]
end

node_learner(("Learner"))

node_learner -->|"runs commands"| node_cli
node_cli -->|"loads and runs"| node_runner_core
node_cli -->|"renders output"| node_terminal_ui
node_runner_core -->|"loads and checks"| node_drills
node_learner -->|"edits drills"| node_drills
node_learner -.->|"consults answers"| node_reference
node_learner -->|"runs challenges"| node_challenge_runner
node_challenge_runner -->|"executes files"| node_challenge_set
node_learner -->|"runs app"| node_todo_app
node_todo_app -->|"loads and saves"| node_todo_storage
node_todo_app -->|"applies commands"| node_todo_logic
node_todo_storage -->|"reads and writes"| node_todo_file
node_learner -->|"runs app"| node_life_app
node_life_app -->|"advances grid"| node_life_logic
node_life_app -->|"renders grid"| node_life_display
node_learner -->|"runs app"| node_sudoku_app
node_sudoku_app -->|"solves board"| node_sudoku_logic
node_sudoku_app -->|"renders board"| node_sudoku_display

click node_cli "https://github.com/cynmeiciel/pylingstutorial/blob/main/plings/cli.py"
click node_runner_core "https://github.com/cynmeiciel/pylingstutorial/blob/main/plings/core.py"
click node_terminal_ui "https://github.com/cynmeiciel/pylingstutorial/blob/main/plings/ui.py"
click node_drills "https://github.com/cynmeiciel/pylingstutorial/tree/main/exercises"
click node_reference "https://github.com/cynmeiciel/pylingstutorial/tree/main/solutions"
click node_challenge_runner "https://github.com/cynmeiciel/pylingstutorial/blob/main/challenges/run.py"
click node_challenge_set "https://github.com/cynmeiciel/pylingstutorial/tree/main/challenges/phase1"
click node_todo_app "https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/01_todo/app.py"
click node_todo_logic "https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/01_todo/todo/core.py"
click node_todo_storage "https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/01_todo/todo/storage.py"
click node_life_app "https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/02_game_of_life/app.py"
click node_life_logic "https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/02_game_of_life/life/core.py"
click node_life_display "https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/02_game_of_life/life/display.py"
click node_sudoku_app "https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/03_sudoku/app.py"
click node_sudoku_logic "https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/03_sudoku/sudoku/core.py"
click node_sudoku_display "https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/03_sudoku/sudoku/display.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_cli,node_runner_core,node_terminal_ui toneBlue
class node_drills,node_reference toneAmber
class node_challenge_runner,node_challenge_set toneMint
class node_todo_app,node_todo_logic,node_todo_storage,node_todo_file,node_life_app,node_life_logic,node_life_display,node_sudoku_app,node_sudoku_logic,node_sudoku_display toneRose
class node_learner toneIndigo
```

## Components

### Learning runner

- [CLI commands](https://github.com/cynmeiciel/pylingstutorial/blob/main/plings/cli.py): `plings/cli.py`
- [Exercise runner](https://github.com/cynmeiciel/pylingstutorial/blob/main/plings/core.py): `plings/core.py`
- [Terminal UI](https://github.com/cynmeiciel/pylingstutorial/blob/main/plings/ui.py): `plings/ui.py`

### Course material

- [Ordered drills](https://github.com/cynmeiciel/pylingstutorial/tree/main/exercises): `exercises`
- [Reference answers](https://github.com/cynmeiciel/pylingstutorial/tree/main/solutions): `solutions`

### Challenges

- [Challenge runner](https://github.com/cynmeiciel/pylingstutorial/blob/main/challenges/run.py): `challenges/run.py`
- [Phase 1 problems](https://github.com/cynmeiciel/pylingstutorial/tree/main/challenges/phase1): `challenges/phase1`

### Projects

- [To-do CLI](https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/01_todo/app.py): `projects/01_todo/app.py`
- [Task logic](https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/01_todo/todo/core.py): `projects/01_todo/todo/core.py`
- [JSON persistence](https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/01_todo/todo/storage.py): `projects/01_todo/todo/storage.py`
- **Task file**
- [Life CLI](https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/02_game_of_life/app.py): `projects/02_game_of_life/app.py`
- [Generation rules](https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/02_game_of_life/life/core.py): `projects/02_game_of_life/life/core.py`
- [Grid rendering](https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/02_game_of_life/life/display.py): `projects/02_game_of_life/life/display.py`
- [Sudoku CLI](https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/03_sudoku/app.py): `projects/03_sudoku/app.py`
- [Sudoku solver](https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/03_sudoku/sudoku/core.py): `projects/03_sudoku/sudoku/core.py`
- [Board rendering](https://github.com/cynmeiciel/pylingstutorial/blob/main/projects/03_sudoku/sudoku/display.py): `projects/03_sudoku/sudoku/display.py`

### Other components

- **Learner**

## Connections

- Learner → CLI commands: runs commands
- CLI commands → Exercise runner: loads and runs
- CLI commands → Terminal UI: renders output
- Exercise runner → Ordered drills: loads and checks
- Learner → Ordered drills: edits drills
- Learner → Reference answers: consults answers
- Learner → Challenge runner: runs challenges
- Challenge runner → Phase 1 problems: executes files
- Learner → To-do CLI: runs app
- To-do CLI → JSON persistence: loads and saves
- To-do CLI → Task logic: applies commands
- JSON persistence → Task file: reads and writes
- Learner → Life CLI: runs app
- Life CLI → Generation rules: advances grid
- Life CLI → Grid rendering: renders grid
- Learner → Sudoku CLI: runs app
- Sudoku CLI → Sudoku solver: solves board
- Sudoku CLI → Board rendering: renders board
