Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
572074ae73 | ||
|
|
c3e225b049 | ||
|
|
b448cde56d | ||
|
|
c0c3940551 |
@@ -174,3 +174,6 @@ cython_debug/
|
||||
# PyPI configuration file
|
||||
.pypirc
|
||||
|
||||
|
||||
# Doxygen output
|
||||
docs/doxygen/
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
[submodule "framework"]
|
||||
path = framework
|
||||
url = ssh://git@git.tirsystem.com:10022/TirSystem/SQA-QC-Framework.git
|
||||
@@ -0,0 +1,14 @@
|
||||
# Doxygen configuration for the coffee machine. Run: doxygen Doxyfile
|
||||
PROJECT_NAME = "Coffee Machine"
|
||||
PROJECT_BRIEF = "Day 15 of Udemy's 100 Days of Code Python bootcamp"
|
||||
OUTPUT_DIRECTORY = docs/doxygen
|
||||
INPUT = src
|
||||
FILE_PATTERNS = *.py
|
||||
RECURSIVE = YES
|
||||
OPTIMIZE_OUTPUT_JAVA = YES
|
||||
EXTRACT_ALL = YES
|
||||
JAVADOC_AUTOBRIEF = YES
|
||||
GENERATE_HTML = YES
|
||||
GENERATE_LATEX = NO
|
||||
QUIET = YES
|
||||
WARN_IF_UNDOCUMENTED = YES
|
||||
@@ -0,0 +1,43 @@
|
||||
# Artifact Registry
|
||||
|
||||
This project's artifact state. Types, short names and `CrossReference
|
||||
Candidates` come from the framework catalog
|
||||
(`framework/registry/artifact-catalog.md`); this file only records where
|
||||
each document lives in *this* project and the next version to use.
|
||||
|
||||
Delete rows for types you don't use. Add a row the first time you create a
|
||||
document of a type. `Primary File` may contain a glob (e.g.
|
||||
`docs/uc-*/uc.md`); `framework/scripts/find-crossreferences.sh` reads it.
|
||||
|
||||
| Short Name | Artifact Type | Primary File | Next Available Version |
|
||||
| --- | --- | --- | --- |
|
||||
| BC | Business Case | docs/business-case.md | 002 |
|
||||
| SA | Stakeholder Analysis | docs/stakeholder-analysis.md | 002 |
|
||||
| PP | Project Plan | docs/project-plan.md | 002 |
|
||||
| MIL | Milestone / Gateway | docs/milestones/*.md | 004 |
|
||||
|
||||
## Languages
|
||||
|
||||
Set the PO language when the project starts; `project-planning` asks for it
|
||||
if it is missing. A translated artifact is named `<artifact>.<language>.md`
|
||||
(for example `business-case.da.md`); the English file stays the source.
|
||||
|
||||
| Setting | Value |
|
||||
| --- | --- |
|
||||
| PO language | en |
|
||||
| High-level register | IT Executive English |
|
||||
| Technical register | IT Professional English |
|
||||
|
||||
| Artifact types | Register | Also kept as a PO-language file |
|
||||
| --- | --- | --- |
|
||||
| BC, KPI, PP, MIL | IT Executive English | Yes |
|
||||
| SA, BMC, BPMN, UCD, US, UC, SSD, DM, RA, GOV, DICT | IT Professional English | Yes |
|
||||
| OC, SD, DCD, ERD, ADR, TM, RC, QC, source code | IT Professional English | No |
|
||||
|
||||
## Notes
|
||||
|
||||
- "Next Available Version" is the zero-padded (3-digit) version to use the
|
||||
*next* time a new document of that type is created. Increment it only when
|
||||
a brand-new document is created, not when an existing document's
|
||||
`## Version History` gets a row.
|
||||
- `ADR` uses 4 digits (`0001`); `RC` is sequential across all artifact types.
|
||||
@@ -0,0 +1,134 @@
|
||||
# Business Case
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | BC-001 |
|
||||
| CrossReference | [SA-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-05 | Accepted | Jens Tirsvad Nielsen | S01 | Initial version | [c0c3940] |
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
Build a console coffee machine in Python as the Day 15 assignment of Udemy's
|
||||
"100 Days of Code: The Complete Python Pro Bootcamp". The program serves
|
||||
espresso, latte and cappuccino, accepts US coins, tracks water, milk and coffee
|
||||
and prints a report on request. It is published as a readable, runnable
|
||||
reference for other course participants and as a portfolio piece.
|
||||
|
||||
## Methodological and Standards Foundation
|
||||
|
||||
Planning follows the SQA/QC framework mounted at `framework/` (plan first, then
|
||||
code). Quality is described with ISO/IEC 25010:2023 characteristics. Code uses
|
||||
the `coding-conventions` skill and Doxygen comments.
|
||||
|
||||
## Problem Statement
|
||||
|
||||
The assignment specification is long and detail-heavy (resources, coins,
|
||||
refunds, change). Solutions shared by participants vary widely in structure and
|
||||
readability, and a single `main.py` script is hard to test.
|
||||
|
||||
## Business Opportunity
|
||||
|
||||
A small, well-structured and tested solution is a clear example for other
|
||||
participants and for viewers browsing the repository.
|
||||
|
||||
## Objectives
|
||||
|
||||
1. Implement the full assignment behaviour: `report`, `off`, drink selection, resource check, coin processing, change, profit.
|
||||
2. Keep the assignment's function names so participants can compare solutions.
|
||||
3. Cover the behaviour with automated pytest tests.
|
||||
4. Document how to set up a local `.venv` and run the program and tests.
|
||||
5. Publish the repository with a description, topics and README.
|
||||
|
||||
## Scope
|
||||
|
||||
### In Scope
|
||||
|
||||
- Console program under `src/` with a `constants.py` for menu, coins and starting resources.
|
||||
- pytest tests under `tests/`.
|
||||
- `pyproject.toml`, Python `.gitignore`, `Doxyfile`, `README.md`.
|
||||
- Project documents under `docs/`.
|
||||
- Repository description and topics on the git host.
|
||||
|
||||
### Out of Scope
|
||||
|
||||
- Graphical or web interface.
|
||||
- Payment other than the four US coins.
|
||||
- Persistence of resources or profit between runs.
|
||||
- Runtime dependencies.
|
||||
|
||||
## Expected Benefits
|
||||
|
||||
### Tangible Benefits
|
||||
|
||||
- Completed Day 15 assignment.
|
||||
- Runnable code with tests and setup instructions.
|
||||
|
||||
### Intangible Benefits
|
||||
|
||||
- Practice with planning, testing and Python project layout.
|
||||
- A reusable template for later course projects.
|
||||
|
||||
## Strategic Alignment
|
||||
|
||||
Supports the learner's goal of finishing the 100 Days of Code course with
|
||||
professional project hygiene, and the goal of sharing readable solutions.
|
||||
|
||||
## Success Criteria
|
||||
|
||||
| # | Criterion | Target | Measure |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | Assignment behaviours implemented | 100% of listed behaviours | Manual run against the specification |
|
||||
| 2 | Tests pass | All pytest tests green | `python -m pytest` |
|
||||
| 3 | Runtime dependencies | 0 | `pyproject.toml` `dependencies` is empty |
|
||||
| 4 | Setup documented | A new reader can run program and tests from README | README walkthrough |
|
||||
| 5 | Repository metadata | Description and at least 3 topics set | Repository page |
|
||||
|
||||
## Risks
|
||||
|
||||
| Risk | Impact | Mitigation |
|
||||
| --- | --- | --- |
|
||||
| Floating-point rounding in coin totals | Wrong change or refund | Compute money in cents (integers) internally |
|
||||
| Token in `.env` leaks | Account compromise | `.env` is gitignored, never imported or tested by the project |
|
||||
| Scope creep beyond the assignment | Delay | Out of Scope list above |
|
||||
|
||||
## Assumptions
|
||||
|
||||
- Python 3.13 or newer is installed.
|
||||
- The git host repository already exists and is reachable.
|
||||
|
||||
## Constraints
|
||||
|
||||
- Python greater than 3.13 as requested, `venv` for environments, pytest for tests.
|
||||
- Constants live in `constants.py`.
|
||||
- Source files use Doxygen comments.
|
||||
- Nothing is committed or pushed unless the user asks.
|
||||
|
||||
## Cost–Benefit Assessment
|
||||
|
||||
| Costs | Benefits |
|
||||
| --- | --- |
|
||||
| A few hours of the learner's time | Finished, tested, shareable assignment (qualitative; no money involved) |
|
||||
|
||||
## Stakeholders
|
||||
|
||||
| Stakeholder ID (SA) | Interest in this project |
|
||||
| --- | --- |
|
||||
| S01 | Completes the assignment and owns the plan, code and review |
|
||||
| S02 | Reads and runs the code, compares solutions |
|
||||
| S03 | Browses the repository for ideas |
|
||||
|
||||
## Recommendation
|
||||
|
||||
Proceed — the scope is small, well specified and delivers a reusable example.
|
||||
|
||||
---
|
||||
|
||||
[SA-001]: ./stakeholder-analysis.md
|
||||
[c0c3940]: https://git.tirsystem.com/Tirsvad-Udemy-100_days_of_code/015-coffee_machine/commit/c0c3940551db0d7d96492cc734976d0436051ff9
|
||||
@@ -0,0 +1,68 @@
|
||||
# MIL-001 Project Setup
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | MIL-001 |
|
||||
| CrossReference | [BC-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-05 | Accepted | Jens Tirsvad Nielsen | S01 | Initial version | [c0c3940] |
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
Decide whether the project skeleton and tooling are ready for feature work.
|
||||
|
||||
## Deliverable
|
||||
|
||||
Repository skeleton: `src/`, `tests/`, `docs/`, `pyproject.toml`, `.gitignore`, `Doxyfile`, README with venv instructions.
|
||||
|
||||
## Go / No-Go Criteria
|
||||
|
||||
| # | Criterion (objectively checkable) | Go | No-Go |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | `pip install -e .[dev]` succeeds in a fresh `.venv` on Python 3.13+ | Succeeds | Fails |
|
||||
| 2 | `python -m pytest` runs without configuration errors | Runs | Errors |
|
||||
| 3 | README documents `.venv` creation and `python -m pip install --upgrade pip` | Present | Missing |
|
||||
|
||||
## Dependencies
|
||||
|
||||
| Depends on | Reason |
|
||||
| --- | --- |
|
||||
| None | First phase |
|
||||
|
||||
## Traceability
|
||||
|
||||
| Business Case objective / KPI / user story | Reference |
|
||||
| --- | --- |
|
||||
| Objective 4 (documented setup) | [BC-001] |
|
||||
|
||||
## Ownership
|
||||
|
||||
| Role | Stakeholder ID (SA) |
|
||||
| --- | --- |
|
||||
| Owner | S01 |
|
||||
| Approving reviewer | S01 |
|
||||
|
||||
## Target Date
|
||||
|
||||
2026-10-07 — within the short course-assignment timeline in [BC-001].
|
||||
|
||||
## Tasks
|
||||
|
||||
| # | Task | Summary | Needs its own Use Case/User Story? | Reference |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | Create pyproject.toml | Declare the package with `requires-python >=3.13`, an empty runtime dependency list, a `dev` extra with pytest, and pytest config (`testpaths`, `pythonpath = ["src"]`). | No | Objective 4 |
|
||||
| 2 | Verify Python .gitignore | Confirm the existing `.gitignore` ignores `.venv/`, `.env`, `__pycache__/`, `.pytest_cache/` and Doxygen output (`docs/doxygen/`); add what is missing. | No | Objective 4 |
|
||||
| 3 | Add Doxyfile | Create a Doxyfile that scans `src/`, writes HTML to `docs/doxygen/`, and is configured for Python (`OPTIMIZE_OUTPUT_JAVA`, `EXTRACT_ALL`). Source comments use Doxygen style. | No | Objective 4 |
|
||||
| 4 | Create src and tests skeleton | Create `src/coffee_machine/` with `__init__.py`, `constants.py` and `main.py` stubs, and `tests/` with a smoke test, following the `coding-conventions` skill. | No | Objective 1 |
|
||||
| 5 | Write README with setup instructions | Write README.md: project description, how to create and use a local `.venv`, `python -m pip install --upgrade pip`, install, run, test and Doxygen. The README template from the request was not supplied; ask for it before writing. | No | Objective 4 |
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ../business-case.md
|
||||
[c0c3940]: https://git.tirsystem.com/Tirsvad-Udemy-100_days_of_code/015-coffee_machine/commit/c0c3940551db0d7d96492cc734976d0436051ff9
|
||||
@@ -0,0 +1,72 @@
|
||||
# MIL-002 Coffee Machine Core
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | MIL-002 |
|
||||
| CrossReference | [BC-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-05 | Accepted | Jens Tirsvad Nielsen | S01 | Initial version | [c0c3940] |
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
Decide whether the machine behaves as the assignment specification requires.
|
||||
|
||||
## Deliverable
|
||||
|
||||
Working console program in `src/coffee_machine/` implementing report, off, drink selection, resource check, coin processing, change and profit.
|
||||
|
||||
## Go / No-Go Criteria
|
||||
|
||||
| # | Criterion (objectively checkable) | Go | No-Go |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | Typing `report` prints water, milk, coffee and money | Matches spec format | Differs |
|
||||
| 2 | A drink is refused when a resource is insufficient, naming the resource | Refused with message | Served or no message |
|
||||
| 3 | Insufficient coins refund everything with the spec's refund message | Refunded | Drink served |
|
||||
| 4 | Excess coins return correct change and add only the price to profit | Correct | Wrong amount |
|
||||
| 5 | Typing `off` ends the program | Exits | Keeps running |
|
||||
|
||||
## Dependencies
|
||||
|
||||
| Depends on | Reason |
|
||||
| --- | --- |
|
||||
| MIL-001 | Skeleton and tooling must exist |
|
||||
|
||||
## Traceability
|
||||
|
||||
| Business Case objective / KPI / user story | Reference |
|
||||
| --- | --- |
|
||||
| Objectives 1, 2 | [BC-001] |
|
||||
|
||||
## Ownership
|
||||
|
||||
| Role | Stakeholder ID (SA) |
|
||||
| --- | --- |
|
||||
| Owner | S01 |
|
||||
| Approving reviewer | S01 |
|
||||
|
||||
## Target Date
|
||||
|
||||
2026-10-10 — within the short course-assignment timeline in [BC-001].
|
||||
|
||||
## Tasks
|
||||
|
||||
| # | Task | Summary | Needs its own Use Case/User Story? | Reference |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | Define constants | Put `MENU`, `COIN_VALUES` and `INITIAL_RESOURCES` in `constants.py`, from the assignment's starting data. | No | Objective 1 |
|
||||
| 2 | Implement report | Print water (ml), milk (ml), coffee (g) and money ($) in the assignment's format. | No | Objective 1 |
|
||||
| 3 | Implement is_resource_sufficient | Check an order against current resources; print the not-enough-resource message and return False when short. Keep the assignment's function name. | No | Objective 2 |
|
||||
| 4 | Implement process_coins | Ask for quarters, dimes, nickels and pennies and return the total, using integer cents internally to avoid float errors. | No | Objective 1 |
|
||||
| 5 | Implement is_transaction_successful | Compare payment with cost; refund if short, otherwise return change rounded to 2 decimals and add the cost to profit. | No | Objective 1 |
|
||||
| 6 | Implement make_coffee | Deduct the drink's ingredients from resources and print the enjoy message. | No | Objective 1 |
|
||||
| 7 | Implement main loop | Prompt for espresso/latte/cappuccino, handle `report`, `off` and invalid input, and wire the functions together. | No | Objective 1 |
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ../business-case.md
|
||||
[c0c3940]: https://git.tirsystem.com/Tirsvad-Udemy-100_days_of_code/015-coffee_machine/commit/c0c3940551db0d7d96492cc734976d0436051ff9
|
||||
@@ -0,0 +1,69 @@
|
||||
# MIL-003 Quality and Publication
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | MIL-003 |
|
||||
| CrossReference | [BC-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-05 | Accepted | Jens Tirsvad Nielsen | S01 | Initial version | [c0c3940] |
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
Decide whether the project is tested, documented and ready to share.
|
||||
|
||||
## Deliverable
|
||||
|
||||
pytest suite, Doxygen output, finished README, and repository description and topics on the git host.
|
||||
|
||||
## Go / No-Go Criteria
|
||||
|
||||
| # | Criterion (objectively checkable) | Go | No-Go |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | `python -m pytest` passes with all tests green | All pass | Any failure |
|
||||
| 2 | `doxygen Doxyfile` runs without warnings on `src/` | No warnings | Warnings |
|
||||
| 3 | Repository has a description and at least 3 topics | Set | Missing |
|
||||
| 4 | `pyproject.toml` lists no runtime dependencies and `.env` is not imported or tested | Confirmed | Violated |
|
||||
|
||||
## Dependencies
|
||||
|
||||
| Depends on | Reason |
|
||||
| --- | --- |
|
||||
| MIL-002 | Behaviour must exist before it is tested and published |
|
||||
|
||||
## Traceability
|
||||
|
||||
| Business Case objective / KPI / user story | Reference |
|
||||
| --- | --- |
|
||||
| Objectives 3, 4, 5 | [BC-001] |
|
||||
|
||||
## Ownership
|
||||
|
||||
| Role | Stakeholder ID (SA) |
|
||||
| --- | --- |
|
||||
| Owner | S01 |
|
||||
| Approving reviewer | S01 |
|
||||
|
||||
## Target Date
|
||||
|
||||
2026-10-12 — within the short course-assignment timeline in [BC-001].
|
||||
|
||||
## Tasks
|
||||
|
||||
| # | Task | Summary | Needs its own Use Case/User Story? | Reference |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | Write tests for resources and report | pytest tests for `report` output and `is_resource_sufficient` with sufficient and insufficient resources. | No | Objective 3 |
|
||||
| 2 | Write tests for coins and transactions | pytest tests for `process_coins` (mocked input), refund, exact payment, change and profit updates. | No | Objective 3 |
|
||||
| 3 | Write tests for make_coffee and main loop | pytest tests for resource deduction and for `off`, `report` and invalid input handling through mocked `input`. | No | Objective 3 |
|
||||
| 4 | Generate and check Doxygen output | Run `doxygen Doxyfile`; fix undocumented or malformed comments. | No | Objective 4 |
|
||||
| 5 | Set repository description and topics | Use the git host API with the token in `.env` (personal use only, never imported by the project) to set the description and topics, after the user confirms the exact text. | No | Objective 5 |
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ../business-case.md
|
||||
[c0c3940]: https://git.tirsystem.com/Tirsvad-Udemy-100_days_of_code/015-coffee_machine/commit/c0c3940551db0d7d96492cc734976d0436051ff9
|
||||
@@ -0,0 +1,88 @@
|
||||
# Project Plan
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | PP-001 |
|
||||
| CrossReference | [BC-001], [SA-001], [MIL-001], [MIL-002], [MIL-003] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-05 | Accepted | Jens Tirsvad Nielsen | S01 | Initial version | [c0c3940] |
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
Schedule the three phases that take the coffee machine from empty repository to
|
||||
published project, within the short assignment timeline in [BC-001].
|
||||
|
||||
## Planning Assumptions
|
||||
|
||||
- Week 1 starts 2026-10-05; the plan ends by 2026-10-12.
|
||||
- Phase length: two to three days; S01 reviews each phase through a pull request (see [SA-001]).
|
||||
- Each phase is one branch and one pull request.
|
||||
|
||||
## Gateway Schedule
|
||||
|
||||
| Gateway | Document | Window | Decision date | Owner | Stories | Main deliverable | Milestone |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| Project Setup | [MIL-001] | 2026-10-05 to 2026-10-07 | 2026-10-07 | S01 | none | Skeleton, tooling, README | [Milestone 40] |
|
||||
| Coffee Machine Core | [MIL-002] | 2026-10-08 to 2026-10-10 | 2026-10-10 | S01 | none | Working program | [Milestone 41] |
|
||||
| Quality and Publication | [MIL-003] | 2026-10-11 to 2026-10-12 | 2026-10-12 | S01 | none | Tests, Doxygen, published repo | [Milestone 42] |
|
||||
|
||||
```plantuml
|
||||
@startgantt
|
||||
Project starts 2026-10-05
|
||||
[Project Setup] starts 2026-10-05 and ends 2026-10-07
|
||||
[Coffee Machine Core] starts 2026-10-08 and ends 2026-10-10
|
||||
[Quality and Publication] starts 2026-10-11 and ends 2026-10-12
|
||||
[MIL-001 Go/No-Go] happens 2026-10-07
|
||||
[MIL-002 Go/No-Go] happens 2026-10-10
|
||||
[MIL-003 Go/No-Go] happens 2026-10-12
|
||||
@endgantt
|
||||
```
|
||||
|
||||
## Scope Coverage
|
||||
|
||||
| Business Case scope item | Gateway |
|
||||
| --- | --- |
|
||||
| Console program with `constants.py` | [MIL-002] |
|
||||
| pytest tests | [MIL-003] |
|
||||
| `pyproject.toml`, `.gitignore`, `Doxyfile`, README | [MIL-001] |
|
||||
| Project documents | Planning, before [MIL-001] |
|
||||
| Repository description and topics | [MIL-003] |
|
||||
|
||||
## Dependencies
|
||||
|
||||
```
|
||||
MIL-001 -> MIL-002 -> MIL-003
|
||||
```
|
||||
|
||||
A No-Go moves all later dates by the same amount.
|
||||
|
||||
## Plan Risks
|
||||
|
||||
| Risk | Impact | Mitigation |
|
||||
| --- | --- | --- |
|
||||
| README template not supplied | README task blocked | Ask S01 for the template before the task |
|
||||
| Doxygen not installed locally | Cannot verify docs | Document the install step in README |
|
||||
|
||||
## Open Issues
|
||||
|
||||
- The README template referenced in the request ("template below") was not included.
|
||||
- No use cases or user stories are written; tasks are plain technical tasks implementing the assignment specification. S01 can ask for a use case ("Order a drink") if wanted.
|
||||
- Python ">3.13" is read as 3.13 or newer (`>=3.13`).
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ./business-case.md
|
||||
[SA-001]: ./stakeholder-analysis.md
|
||||
[MIL-001]: ./milestones/mil-001-project-setup.md
|
||||
[MIL-002]: ./milestones/mil-002-coffee-machine-core.md
|
||||
[MIL-003]: ./milestones/mil-003-quality-and-publication.md
|
||||
[Milestone 40]: https://git.tirsystem.com/Tirsvad-Udemy-100_days_of_code/015-coffee_machine/milestone/40
|
||||
[Milestone 41]: https://git.tirsystem.com/Tirsvad-Udemy-100_days_of_code/015-coffee_machine/milestone/41
|
||||
[Milestone 42]: https://git.tirsystem.com/Tirsvad-Udemy-100_days_of_code/015-coffee_machine/milestone/42
|
||||
[c0c3940]: https://git.tirsystem.com/Tirsvad-Udemy-100_days_of_code/015-coffee_machine/commit/c0c3940551db0d7d96492cc734976d0436051ff9
|
||||
@@ -0,0 +1,78 @@
|
||||
# Stakeholder Analysis
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | SA-001 |
|
||||
| CrossReference | [BC-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-05 | Accepted | Jens Tirsvad Nielsen | S01 | Initial version | [c0c3940] |
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
Identify who is affected by the coffee machine project and what each needs,
|
||||
using a power/interest grid (Manage Closely, Keep Satisfied, Keep Informed,
|
||||
Monitor).
|
||||
|
||||
## Stakeholder Summary Table
|
||||
|
||||
| ID | Name | Role/Title | Organization | Power Level | Interest Level | Quadrant | Primary Concern (Business Language) |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| S01 | Jens Tirsvad Nielsen | Course participant: Product Owner, developer and reviewer | Self | High | High | Manage Closely | Finish the assignment correctly with clean structure |
|
||||
| S02 | Udemy coursists | Fellow course participants | Udemy course community | Low | High | Keep Informed | Readable, runnable code with the assignment's function names, and README run instructions |
|
||||
| S03 | GitHub viewers | Repository browsers | Public | Low | Low | Monitor | A clear repository description, topics and README, and no runtime dependencies |
|
||||
|
||||
## Power/Interest Classification Rationale
|
||||
|
||||
- **Manage Closely (S01):** decides scope, writes and reviews everything.
|
||||
- **Keep Informed (S02):** cannot change the project but depend on its clarity.
|
||||
- **Monitor (S03):** casual visitors; a good first impression is enough.
|
||||
|
||||
## Primary Concerns and FURPS+ Mapping
|
||||
|
||||
| ID | Concern | FURPS+ attribute |
|
||||
| --- | --- | --- |
|
||||
| S01 | Correct behaviour per specification | Functionality |
|
||||
| S01 | Tested and maintainable | Supportability |
|
||||
| S02 | Easy to read and run | Usability |
|
||||
| S02 | Same function names as the assignment | Functionality |
|
||||
| S03 | Quick understanding of the repository | Usability |
|
||||
| S03 | No dependencies to install | Implementation (+) |
|
||||
|
||||
## Communication Requirements
|
||||
|
||||
| Stakeholder | Channel | Frequency | Deliverable | Phase |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| S01 | Chat and pull request review | Per milestone | Working tree changes, PR | MIL-001 to MIL-003 |
|
||||
| S02 | README | At publication | Run and test instructions | MIL-003 |
|
||||
| S03 | Repository page | At publication | Description, topics, README | MIL-003 |
|
||||
|
||||
## Conflicting Interests and Mitigations
|
||||
|
||||
| Conflict | Mitigation |
|
||||
| --- | --- |
|
||||
| S02 want assignment-style function names; S01 wants testable structure | Keep the assignment's names (`is_resource_sufficient`, `process_coins`, `is_transaction_successful`, `make_coffee`) and make them pure/parameterised so they are testable |
|
||||
|
||||
## Traceability Analysis
|
||||
|
||||
| Stakeholder | Goal / use case | Business Case objective |
|
||||
| --- | --- | --- |
|
||||
| S01 | Operate the machine (order, report, off) | [BC-001] objectives 1, 3 |
|
||||
| S02 | Read and run the code | [BC-001] objectives 2, 4 |
|
||||
| S03 | Browse the repository | [BC-001] objective 5 |
|
||||
|
||||
## Sign-Off
|
||||
|
||||
| Stakeholder | Decision | Date |
|
||||
| --- | --- | --- |
|
||||
| S01 | Pending review | |
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ./business-case.md
|
||||
[c0c3940]: https://git.tirsystem.com/Tirsvad-Udemy-100_days_of_code/015-coffee_machine/commit/c0c3940551db0d7d96492cc734976d0436051ff9
|
||||
Submodule
+1
Submodule framework added at 14d221ec1c
@@ -0,0 +1,32 @@
|
||||
[build-system]
|
||||
requires = ["setuptools>=68"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "coffee-machine"
|
||||
version = "0.1.0"
|
||||
description = "Console coffee machine: Day 15 of Udemy's 100 Days of Code Python bootcamp."
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.13"
|
||||
license = { file = "LICENSE" }
|
||||
dependencies = []
|
||||
|
||||
[project.optional-dependencies]
|
||||
dev = ["pytest>=8", "ruff", "mypy"]
|
||||
|
||||
[project.scripts]
|
||||
coffee-machine = "coffee_machine.main:main"
|
||||
|
||||
[tool.setuptools.packages.find]
|
||||
where = ["src"]
|
||||
|
||||
[tool.pytest.ini_options]
|
||||
testpaths = ["tests"]
|
||||
pythonpath = ["src"]
|
||||
|
||||
[tool.ruff]
|
||||
line-length = 88
|
||||
|
||||
[tool.mypy]
|
||||
strict = true
|
||||
mypy_path = "src"
|
||||
@@ -0,0 +1,4 @@
|
||||
"""!
|
||||
@file __init__.py
|
||||
@brief Console coffee machine package.
|
||||
"""
|
||||
@@ -0,0 +1,8 @@
|
||||
"""!
|
||||
@file __main__.py
|
||||
@brief Allow `python -m coffee_machine`.
|
||||
"""
|
||||
|
||||
from coffee_machine.main import main
|
||||
|
||||
main()
|
||||
@@ -0,0 +1,6 @@
|
||||
"""!
|
||||
@file constants.py
|
||||
@brief Constants for the coffee machine: menu, coins and starting resources.
|
||||
|
||||
The values are added in MIL-002 ("Define constants").
|
||||
"""
|
||||
@@ -0,0 +1,12 @@
|
||||
"""!
|
||||
@file main.py
|
||||
@brief Entry point of the coffee machine.
|
||||
"""
|
||||
|
||||
|
||||
def main() -> None:
|
||||
"""!
|
||||
@brief Run the coffee machine.
|
||||
|
||||
The ordering loop is added in MIL-002 ("Implement main loop").
|
||||
"""
|
||||
@@ -0,0 +1,13 @@
|
||||
"""!
|
||||
@file test_smoke.py
|
||||
@brief Smoke test that the package imports.
|
||||
"""
|
||||
|
||||
from coffee_machine import main as main_module
|
||||
|
||||
|
||||
def test_main_is_callable() -> None:
|
||||
"""!
|
||||
@brief The entry point runs without error.
|
||||
"""
|
||||
main_module.main()
|
||||
Reference in New Issue
Block a user