diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/.gitea/workflows/run-tests.yml b/.gitea/workflows/run-tests.yml new file mode 100644 index 0000000..09c22c6 --- /dev/null +++ b/.gitea/workflows/run-tests.yml @@ -0,0 +1,35 @@ +# Continuous integration for the U.S. States Game. +# Read by Gitea Actions. Installs the project with its dev extra, then checks +# style (ruff), types (mypy) and behaviour (pytest). Design: docs/project-plan.md. +--- +name: Run tests + +on: + push: + branches: [main] + pull_request: + +jobs: + run-tests: + name: Lint, type check and test + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Check out the project + uses: actions/checkout@v4.2.2 + - name: Set up Python + uses: actions/setup-python@v5.3.0 + with: + python-version: "3.13" + - name: Install the project and its dev tools + run: | + python -m pip install --upgrade pip + python -m pip install -e ".[dev]" + - name: Check style + run: python -m ruff check . && python -m ruff format --check . + - name: Check types + run: python -m mypy + - name: Check workflow files + run: python -m yamllint .gitea .yamllint + - name: Run the tests + run: python -m pytest diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8f20e68 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# Virtual environments +.venv/ +venv/ +env/ +ENV/ + +# Packaging and build +build/ +dist/ +*.egg-info/ +.eggs/ +pip-wheel-metadata/ + +# Test, coverage and tool caches +.pytest_cache/ +.coverage +.coverage.* +htmlcov/ +.tox/ +.nox/ +.mypy_cache/ +.ruff_cache/ + +# Generated source documentation (Doxygen) +docs/build/ + +# Local credentials, never committed +.env + +# Game output written to the working directory +states_to_learn.csv + +# Editors and OS +.idea/ +.vscode/ +.DS_Store +Thumbs.db diff --git a/.yamllint b/.yamllint new file mode 100644 index 0000000..1470f6b --- /dev/null +++ b/.yamllint @@ -0,0 +1,8 @@ +# yamllint configuration for the workflow files under .gitea/workflows/. +--- +extends: default +rules: + truthy: + allowed-values: ["true", "false", "on"] + line-length: + max: 100 diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 0000000..691fd57 --- /dev/null +++ b/Doxyfile @@ -0,0 +1,22 @@ +# Doxygen configuration for the U.S. States Game. +# Build: doxygen Doxyfile +# Output: docs/build/doxygen/index.html +PROJECT_NAME = "U.S. States Game" +PROJECT_BRIEF = "Name the 50 states on a Turtle map" +OUTPUT_DIRECTORY = docs/build +HTML_OUTPUT = doxygen +INPUT = src +FILE_PATTERNS = *.py +RECURSIVE = YES +EXCLUDE_PATTERNS = */__pycache__/* */data/* +OPTIMIZE_OUTPUT_JAVA = YES +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +JAVADOC_AUTOBRIEF = YES +GENERATE_HTML = YES +GENERATE_LATEX = NO +HAVE_DOT = NO +QUIET = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = YES diff --git a/README.md b/README.md index 083796a..9f63632 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,117 @@ -# 025-us-states-game +# U.S. States Game +A quiz game from Udemy's *100 Days of Code: The Complete Python Pro Bootcamp* (day 25): a Turtle window shows a blank map of the United States, you type state names, and every correct guess appears on the map. When you leave, the states you missed are saved to `states_to_learn.csv`. + +> **Status:** under construction. The tooling and layout are in place; the game logic and the Turtle screen follow in the next milestones. + +## Requirements + +- Python 3.13 or newer, with `tkinter` (Turtle needs it; the python.org installers and the Windows Store build include it) +- `git` +- Optional: [Doxygen](https://www.doxygen.nl/) to build the source documentation + +The game has no runtime dependencies. `pytest` is installed only for development. + +## Set up + +Create a local virtual environment named `.venv` in the project folder, upgrade `pip` and install the project with its test tool. + +### Windows powershell + +```powershell +git clone https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game.git +cd 025-us-states-game +python -m venv .venv +.\.venv\Scripts\Activate.ps1 +python -m pip install --upgrade pip +python -m pip install -e ".[dev]" +``` + +If PowerShell refuses to run the activation script, run `Set-ExecutionPolicy -Scope CurrentUser RemoteSigned` once. + +### Linux debian + +```bash +sudo apt install python3 python3-venv python3-tk git +git clone https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game.git +cd 025-us-states-game +python3 -m venv .venv +source .venv/bin/activate +python -m pip install --upgrade pip +python -m pip install -e ".[dev]" +``` + +### MacOS + +```bash +git clone https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game.git +cd 025-us-states-game +python3 -m venv .venv +source .venv/bin/activate +python -m pip install --upgrade pip +python -m pip install -e ".[dev]" +``` + +## Run + +With the virtual environment active: + +```bash +python -m us_states_game +``` + +Type a state name in the prompt. Type `exit` to quit; the states you did not name are written to `states_to_learn.csv` in the current folder. + +## Run the tests + +```bash +python -m pytest +``` + +The tests need no display. + +## Continuous integration + +`.gitea/workflows/run-tests.yml` runs on every push to `main` and on every pull request: it sets up Python 3.13, installs the project with `python -m pip install -e ".[dev]"`, then runs `ruff`, `mypy`, `yamllint` and `python -m pytest`. + +## Build the source documentation + +The source uses Doxygen comments. With Doxygen installed: + +```bash +doxygen Doxyfile +``` + +Open `docs/build/doxygen/index.html` in a browser. + +## Project layout + +| Path | What it is | +| --- | --- | +| `src/us_states_game/` | The game package: constants, game logic and the Turtle screen | +| `src/us_states_game/data/` | `50_states.csv` and `blank_states_img.gif` from the course | +| `tests/` | pytest tests | +| `docs/` | Project documents: business case, plan, milestones, review records | +| `Doxyfile` | Doxygen configuration | +| `pyproject.toml` | Project configuration | +| `.gitea/workflows/run-tests.yml` | Continuous integration | + +## License + +GNU Affero General Public License v3.0. See [LICENSE](LICENSE). + +## Links + +- [Repository](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game) +- [Issue tracker](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game/issues) +- [Wiki](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game/wiki) + +## Appendix: Project documents + +| Document | What it tells you | +| --- | --- | +| [Business Case](docs/business-case.md) | Why the project exists, its scope and success criteria | +| [Stakeholder Analysis](docs/stakeholder-analysis.md) | Who is involved | +| [Project Plan](docs/project-plan.md) | The gateways and their schedule | +| [Milestones](docs/milestones/) | One document per gateway: Go/No-Go criteria and tasks | +| [Artifact registry](docs/artifact-registry.md) | Where each document type lives | diff --git a/docs/artifact-registry.md b/docs/artifact-registry.md index 3b7ef0f..829dc6b 100644 --- a/docs/artifact-registry.md +++ b/docs/artifact-registry.md @@ -16,7 +16,7 @@ document of a type. `Primary File` may contain a glob (e.g. | PP | Project Plan | docs/project-plan.md | 002 | | MIL | Milestone / Gateway | docs/milestones/*.md | 005 | | ADR | Architecture Decision Record | docs/adr/adr-NNNN-*.md | 0001 | -| RC | SQA Review Record | docs/sqa/reviews/rc-*.md | 007 | +| RC | SQA Review Record | docs/sqa/reviews/rc-*.md | 008 | ## Languages diff --git a/docs/sqa/reviews/rc-001-business-case.md b/docs/sqa/reviews/rc-001-business-case.md index e5b9d45..da34395 100644 --- a/docs/sqa/reviews/rc-001-business-case.md +++ b/docs/sqa/reviews/rc-001-business-case.md @@ -1,68 +1,68 @@ -# SQA Review Record - -## Metadata -| Key | Value | -| --- | --- | -| ID | RC-001 | -| CrossReference | [BC-001], [QC-BC-001] | - -## Version History -| Date | Status | Author | Reviewer | Change | Commit | -| --- | --- | --- | --- | --- | --- | -| 2026-10-13 | Proposed | Claude (AI) for S01 | AI as stand-in for S01 | Initial review record: Go | [b113e6e] | - ---- - -## Artifact Under Review - -- Instance reviewed: [BC-001] -- Checklist used: [QC-BC-001] and [QC-LANG-001] -- Scope: full review -- Language and domain: en / it -- Language reviewer: none (the reviewer reads English and knows the domain, as stand-in for S01) -- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; the author is the same AI) - -## Checklist Results - -| # | Criterion | Status | Evidence/Notes | -| --- | --- | --- | --- | -| 1 | ROI/Cost-Benefit analysis is quantitative, or where qualitative, is explicitly justified | Pass | Cost-Benefit table is qualitative and says why: the project is an exercise with no licence or hosting cost. | -| 2 | Risks are identified with documented impact and mitigation | Pass | Risks table: five risks, each with impact and mitigation. | -| 3 | Success criteria are measurable, stating explicit targets rather than vague aspirations | Pass | Six criteria with target and measure (pytest exit code 0, `check-readme.sh` passes, at least 5 topics). | -| 4 | Scope explicitly separates In Scope vs Out of Scope | Pass | `### In Scope` and `### Out of Scope` subsections. | -| 5 | Stakeholders are cross-referenced to Stakeholder Analysis IDs rather than re-described inline | Pass | Stakeholders table cites S01, S02, S03 and [SA-001]. | -| 6 | Methodology and quality-standard foundation are stated explicitly (e.g. ISO/IEC 25010, Larman) | Pass | Section names the framework, ISO/IEC 25010:2023 and the coding conventions. | -| 7 | Assumptions and constraints are explicit and clearly distinguished from one another | Pass | Separate Assumptions and Constraints sections. | -| 8 | Document supports executive decision-making with a clear, unambiguous recommendation | Pass | Recommendation: Proceed, with rationale. | - -## Language and Domain Results - -| # | Criterion | Status | Evidence/Notes | -| --- | --- | --- | --- | -| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | `Language` = en, `Domain` = it in Metadata. | -| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en`; `it` is in the registry's domain table. | -| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and cells are English. Checked by the stand-in for S01, who reads English. | -| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English: plain objective-level prose with no implementation detail beyond what the scope needs. | -| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists for domain `it` and none is in the plan; the document uses standard Python and software terms consistently (for example `states_to_learn.csv`, `missing_states`, Doxygen). Recorded as a stand-in decision. | -| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All structural vocabulary is English. | -| 7 | No translated twin (`..md`) exists beside the document | Pass | `check-languages.sh` reports no twin. | -| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no earlier accepted version. | -| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer, AI as stand-in for S01, reads English and the software domain; no second language reviewer is named. S01 is the Product Owner and reads both; a person may challenge this in the run summary. | -| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Continuous integration (CI), Architecture Decision Record (ADR) and comma-separated values (CSV) are spelled out where first used in prose; file names and tool names are not abbreviations. | - -## Overall Verdict - -Go - The Business Case is complete against its checklist. Every Mandatory criterion of both checklists passes. - -## Action Items - -| Action | Owner | Due | -| --- | --- | --- | -| None | S01 | | - ---- - -[BC-001]: ../../business-case.md -[QC-BC-001]: ../../../framework/qc/artifacts/qc-business-case.md -[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md -[b113e6e]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game/commit/b113e6eacd12bb08045ecf6f7822837626a7b1f7 +# SQA Review Record + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-001 | +| CrossReference | [BC-001], [QC-BC-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-13 | Proposed | Claude (AI) for S01 | AI as stand-in for S01 | Initial review record: Go | [b113e6e] | + +--- + +## Artifact Under Review + +- Instance reviewed: [BC-001] +- Checklist used: [QC-BC-001] and [QC-LANG-001] +- Scope: full review +- Language and domain: en / it +- Language reviewer: none (the reviewer reads English and knows the domain, as stand-in for S01) +- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; the author is the same AI) + +## Checklist Results + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | ROI/Cost-Benefit analysis is quantitative, or where qualitative, is explicitly justified | Pass | Cost-Benefit table is qualitative and says why: the project is an exercise with no licence or hosting cost. | +| 2 | Risks are identified with documented impact and mitigation | Pass | Risks table: five risks, each with impact and mitigation. | +| 3 | Success criteria are measurable, stating explicit targets rather than vague aspirations | Pass | Six criteria with target and measure (pytest exit code 0, `check-readme.sh` passes, at least 5 topics). | +| 4 | Scope explicitly separates In Scope vs Out of Scope | Pass | `### In Scope` and `### Out of Scope` subsections. | +| 5 | Stakeholders are cross-referenced to Stakeholder Analysis IDs rather than re-described inline | Pass | Stakeholders table cites S01, S02, S03 and [SA-001]. | +| 6 | Methodology and quality-standard foundation are stated explicitly (e.g. ISO/IEC 25010, Larman) | Pass | Section names the framework, ISO/IEC 25010:2023 and the coding conventions. | +| 7 | Assumptions and constraints are explicit and clearly distinguished from one another | Pass | Separate Assumptions and Constraints sections. | +| 8 | Document supports executive decision-making with a clear, unambiguous recommendation | Pass | Recommendation: Proceed, with rationale. | + +## Language and Domain Results + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | `Language` = en, `Domain` = it in Metadata. | +| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en`; `it` is in the registry's domain table. | +| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and cells are English. Checked by the stand-in for S01, who reads English. | +| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English: plain objective-level prose with no implementation detail beyond what the scope needs. | +| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists for domain `it` and none is in the plan; the document uses standard Python and software terms consistently (for example `states_to_learn.csv`, `missing_states`, Doxygen). Recorded as a stand-in decision. | +| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All structural vocabulary is English. | +| 7 | No translated twin (`..md`) exists beside the document | Pass | `check-languages.sh` reports no twin. | +| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no earlier accepted version. | +| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer, AI as stand-in for S01, reads English and the software domain; no second language reviewer is named. S01 is the Product Owner and reads both; a person may challenge this in the run summary. | +| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Continuous integration (CI), Architecture Decision Record (ADR) and comma-separated values (CSV) are spelled out where first used in prose; file names and tool names are not abbreviations. | + +## Overall Verdict + +Go - The Business Case is complete against its checklist. Every Mandatory criterion of both checklists passes. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | S01 | | + +--- + +[BC-001]: ../../business-case.md +[QC-BC-001]: ../../../framework/qc/artifacts/qc-business-case.md +[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md +[b113e6e]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game/commit/b113e6eacd12bb08045ecf6f7822837626a7b1f7 diff --git a/docs/sqa/reviews/rc-002-stakeholder-analysis.md b/docs/sqa/reviews/rc-002-stakeholder-analysis.md index 03655fc..27768aa 100644 --- a/docs/sqa/reviews/rc-002-stakeholder-analysis.md +++ b/docs/sqa/reviews/rc-002-stakeholder-analysis.md @@ -1,68 +1,68 @@ -# SQA Review Record - -## Metadata -| Key | Value | -| --- | --- | -| ID | RC-002 | -| CrossReference | [SA-001], [QC-SA-001] | - -## Version History -| Date | Status | Author | Reviewer | Change | Commit | -| --- | --- | --- | --- | --- | --- | -| 2026-10-13 | Proposed | Claude (AI) for S01 | AI as stand-in for S01 | Initial review record: Go | [b113e6e] | - ---- - -## Artifact Under Review - -- Instance reviewed: [SA-001] -- Checklist used: [QC-SA-001] and [QC-LANG-001] -- Scope: full review -- Language and domain: en / it -- Language reviewer: none (the reviewer reads English and knows the domain, as stand-in for S01) -- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; the author is the same AI) - -## Checklist Results - -| # | Criterion | Status | Evidence/Notes | -| --- | --- | --- | --- | -| 1 | Power/Interest grid is filled for every stakeholder, with no gaps or unclassified entries | Pass | S01, S02, S03 each have power, interest and quadrant. | -| 2 | Each stakeholder is assigned a unique, stable ID (e.g. S01-S11 style) reusable for RACI assignments in other artifacts | Pass | S01, S02, S03; used by the Business Case, plan and milestones. | -| 3 | Roles and organizational context are defined with explicit Power and Interest levels, not just narrative description | Pass | Role, organisation, power and interest in the summary table. | -| 4 | Communication needs (channel, frequency, deliverable type) are mapped to project phases or milestones | Pass | Communication table names milestone for each stakeholder. | -| 5 | Conflicting stakeholder interests are identified with documented mitigation or resolution strategies | Pass | Two conflicts, each with a mitigation. | -| 6 | Stakeholder concerns are explicitly traced to Business Case objectives | Pass | Business Goal Alignment table cites [BC-001] objectives. | -| 7 | Primary concerns are expressed in both business language and a recognized quality-attribute mapping (e.g. FURPS+) | Pass | Concerns table with FURPS+ attribute. | -| 8 | Document is understandable and navigable by non-technical stakeholders reviewing their own entry | Pass | One table row per stakeholder, plain wording. | - -## Language and Domain Results - -| # | Criterion | Status | Evidence/Notes | -| --- | --- | --- | --- | -| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | `Language` = en, `Domain` = it in Metadata. | -| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en`; `it` is in the registry's domain table. | -| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and cells are English. Checked by the stand-in for S01, who reads English. | -| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Professional English: concrete technical terms and checkable statements. | -| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists for domain `it` and none is in the plan; the document uses standard Python and software terms consistently (for example `states_to_learn.csv`, `missing_states`, Doxygen). Recorded as a stand-in decision. | -| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All structural vocabulary is English. | -| 7 | No translated twin (`..md`) exists beside the document | Pass | `check-languages.sh` reports no twin. | -| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no earlier accepted version. | -| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer, AI as stand-in for S01, reads English and the software domain; no second language reviewer is named. S01 is the Product Owner and reads both; a person may challenge this in the run summary. | -| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | The only abbreviations are stakeholder IDs (S01 and so on), defined by the summary table, and FURPS+ (functionality, usability, reliability, performance, supportability plus), named in the method of the Purpose. | - -## Overall Verdict - -Go - The Stakeholder Analysis meets its checklist. Every Mandatory criterion of both checklists passes. - -## Action Items - -| Action | Owner | Due | -| --- | --- | --- | -| None | S01 | | - ---- - -[SA-001]: ../../stakeholder-analysis.md -[QC-SA-001]: ../../../framework/qc/artifacts/qc-stakeholder-analysis.md -[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md -[b113e6e]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game/commit/b113e6eacd12bb08045ecf6f7822837626a7b1f7 +# SQA Review Record + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-002 | +| CrossReference | [SA-001], [QC-SA-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-13 | Proposed | Claude (AI) for S01 | AI as stand-in for S01 | Initial review record: Go | [b113e6e] | + +--- + +## Artifact Under Review + +- Instance reviewed: [SA-001] +- Checklist used: [QC-SA-001] and [QC-LANG-001] +- Scope: full review +- Language and domain: en / it +- Language reviewer: none (the reviewer reads English and knows the domain, as stand-in for S01) +- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; the author is the same AI) + +## Checklist Results + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | Power/Interest grid is filled for every stakeholder, with no gaps or unclassified entries | Pass | S01, S02, S03 each have power, interest and quadrant. | +| 2 | Each stakeholder is assigned a unique, stable ID (e.g. S01-S11 style) reusable for RACI assignments in other artifacts | Pass | S01, S02, S03; used by the Business Case, plan and milestones. | +| 3 | Roles and organizational context are defined with explicit Power and Interest levels, not just narrative description | Pass | Role, organisation, power and interest in the summary table. | +| 4 | Communication needs (channel, frequency, deliverable type) are mapped to project phases or milestones | Pass | Communication table names milestone for each stakeholder. | +| 5 | Conflicting stakeholder interests are identified with documented mitigation or resolution strategies | Pass | Two conflicts, each with a mitigation. | +| 6 | Stakeholder concerns are explicitly traced to Business Case objectives | Pass | Business Goal Alignment table cites [BC-001] objectives. | +| 7 | Primary concerns are expressed in both business language and a recognized quality-attribute mapping (e.g. FURPS+) | Pass | Concerns table with FURPS+ attribute. | +| 8 | Document is understandable and navigable by non-technical stakeholders reviewing their own entry | Pass | One table row per stakeholder, plain wording. | + +## Language and Domain Results + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | `Language` = en, `Domain` = it in Metadata. | +| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en`; `it` is in the registry's domain table. | +| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and cells are English. Checked by the stand-in for S01, who reads English. | +| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Professional English: concrete technical terms and checkable statements. | +| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists for domain `it` and none is in the plan; the document uses standard Python and software terms consistently (for example `states_to_learn.csv`, `missing_states`, Doxygen). Recorded as a stand-in decision. | +| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All structural vocabulary is English. | +| 7 | No translated twin (`..md`) exists beside the document | Pass | `check-languages.sh` reports no twin. | +| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no earlier accepted version. | +| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer, AI as stand-in for S01, reads English and the software domain; no second language reviewer is named. S01 is the Product Owner and reads both; a person may challenge this in the run summary. | +| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | The only abbreviations are stakeholder IDs (S01 and so on), defined by the summary table, and FURPS+ (functionality, usability, reliability, performance, supportability plus), named in the method of the Purpose. | + +## Overall Verdict + +Go - The Stakeholder Analysis meets its checklist. Every Mandatory criterion of both checklists passes. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | S01 | | + +--- + +[SA-001]: ../../stakeholder-analysis.md +[QC-SA-001]: ../../../framework/qc/artifacts/qc-stakeholder-analysis.md +[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md +[b113e6e]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game/commit/b113e6eacd12bb08045ecf6f7822837626a7b1f7 diff --git a/docs/sqa/reviews/rc-003-mil-001.md b/docs/sqa/reviews/rc-003-mil-001.md index 8226d0e..6c6bcbd 100644 --- a/docs/sqa/reviews/rc-003-mil-001.md +++ b/docs/sqa/reviews/rc-003-mil-001.md @@ -1,66 +1,66 @@ -# SQA Review Record - -## Metadata -| Key | Value | -| --- | --- | -| ID | RC-003 | -| CrossReference | [MIL-001], [QC-MIL-001] | - -## Version History -| Date | Status | Author | Reviewer | Change | Commit | -| --- | --- | --- | --- | --- | --- | -| 2026-10-13 | Proposed | Claude (AI) for S01 | AI as stand-in for S01 | Initial review record: Go | [b113e6e] | - ---- - -## Artifact Under Review - -- Instance reviewed: [MIL-001] -- Checklist used: [QC-MIL-001] and [QC-LANG-001] -- Scope: full review -- Language and domain: en / it -- Language reviewer: none (the reviewer reads English and knows the domain, as stand-in for S01) -- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; the author is the same AI) - -## Checklist Results - -| # | Criterion | Status | Evidence/Notes | -| --- | --- | --- | --- | -| 1 | A concrete deliverable is defined for every gate | Pass | Deliverable section: repository tooling, layout, assets, CI and surface | -| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Go / No-Go table with objectively checkable criteria. | -| 3 | Dependencies on other milestones are explicitly mapped | Pass | First milestone; the table says None. | -| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Traceability table cites [BC-001] objectives and success criteria. | -| 5 | Milestone owner and approving reviewer are identified | Pass | Ownership table: owner S01, approving reviewer S01 (stand-in in autonomous mode). | -| 6 | Milestone has a defined target date consistent with project constraints | Pass | 2026-10-13, consistent with the one-working-day duration constraint of [BC-001]. | - -## Language and Domain Results - -| # | Criterion | Status | Evidence/Notes | -| --- | --- | --- | --- | -| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | `Language` = en, `Domain` = it in Metadata. | -| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en`; `it` is in the registry's domain table. | -| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and cells are English. Checked by the stand-in for S01, who reads English. | -| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English: plain objective-level prose with no implementation detail beyond what the scope needs. | -| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists for domain `it` and none is in the plan; the document uses standard Python and software terms consistently (for example `states_to_learn.csv`, `missing_states`, Doxygen). Recorded as a stand-in decision. | -| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All structural vocabulary is English. | -| 7 | No translated twin (`..md`) exists beside the document | Pass | `check-languages.sh` reports no twin. | -| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no earlier accepted version. | -| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer, AI as stand-in for S01, reads English and the software domain; no second language reviewer is named. S01 is the Product Owner and reads both; a person may challenge this in the run summary. | -| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | CI and ADR are spelled out on first use in the milestone documents; Doxygen, pytest and README are tool or file names. | - -## Overall Verdict - -Go - The milestone meets its checklist. Every Mandatory criterion of both checklists passes. - -## Action Items - -| Action | Owner | Due | -| --- | --- | --- | -| None | S01 | | - ---- - -[MIL-001]: ../../milestones/mil-001-baseline-setup.md -[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md -[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md -[b113e6e]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game/commit/b113e6eacd12bb08045ecf6f7822837626a7b1f7 +# SQA Review Record + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-003 | +| CrossReference | [MIL-001], [QC-MIL-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-13 | Proposed | Claude (AI) for S01 | AI as stand-in for S01 | Initial review record: Go | [b113e6e] | + +--- + +## Artifact Under Review + +- Instance reviewed: [MIL-001] +- Checklist used: [QC-MIL-001] and [QC-LANG-001] +- Scope: full review +- Language and domain: en / it +- Language reviewer: none (the reviewer reads English and knows the domain, as stand-in for S01) +- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; the author is the same AI) + +## Checklist Results + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | A concrete deliverable is defined for every gate | Pass | Deliverable section: repository tooling, layout, assets, CI and surface | +| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Go / No-Go table with objectively checkable criteria. | +| 3 | Dependencies on other milestones are explicitly mapped | Pass | First milestone; the table says None. | +| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Traceability table cites [BC-001] objectives and success criteria. | +| 5 | Milestone owner and approving reviewer are identified | Pass | Ownership table: owner S01, approving reviewer S01 (stand-in in autonomous mode). | +| 6 | Milestone has a defined target date consistent with project constraints | Pass | 2026-10-13, consistent with the one-working-day duration constraint of [BC-001]. | + +## Language and Domain Results + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | `Language` = en, `Domain` = it in Metadata. | +| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en`; `it` is in the registry's domain table. | +| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and cells are English. Checked by the stand-in for S01, who reads English. | +| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English: plain objective-level prose with no implementation detail beyond what the scope needs. | +| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists for domain `it` and none is in the plan; the document uses standard Python and software terms consistently (for example `states_to_learn.csv`, `missing_states`, Doxygen). Recorded as a stand-in decision. | +| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All structural vocabulary is English. | +| 7 | No translated twin (`..md`) exists beside the document | Pass | `check-languages.sh` reports no twin. | +| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no earlier accepted version. | +| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer, AI as stand-in for S01, reads English and the software domain; no second language reviewer is named. S01 is the Product Owner and reads both; a person may challenge this in the run summary. | +| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | CI and ADR are spelled out on first use in the milestone documents; Doxygen, pytest and README are tool or file names. | + +## Overall Verdict + +Go - The milestone meets its checklist. Every Mandatory criterion of both checklists passes. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | S01 | | + +--- + +[MIL-001]: ../../milestones/mil-001-baseline-setup.md +[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md +[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md +[b113e6e]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game/commit/b113e6eacd12bb08045ecf6f7822837626a7b1f7 diff --git a/docs/sqa/reviews/rc-004-mil-002.md b/docs/sqa/reviews/rc-004-mil-002.md index b2dc57f..15ef937 100644 --- a/docs/sqa/reviews/rc-004-mil-002.md +++ b/docs/sqa/reviews/rc-004-mil-002.md @@ -1,66 +1,66 @@ -# SQA Review Record - -## Metadata -| Key | Value | -| --- | --- | -| ID | RC-004 | -| CrossReference | [MIL-002], [QC-MIL-001] | - -## Version History -| Date | Status | Author | Reviewer | Change | Commit | -| --- | --- | --- | --- | --- | --- | -| 2026-10-13 | Proposed | Claude (AI) for S01 | AI as stand-in for S01 | Initial review record: Go | [b113e6e] | - ---- - -## Artifact Under Review - -- Instance reviewed: [MIL-002] -- Checklist used: [QC-MIL-001] and [QC-LANG-001] -- Scope: full review -- Language and domain: en / it -- Language reviewer: none (the reviewer reads English and knows the domain, as stand-in for S01) -- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; the author is the same AI) - -## Checklist Results - -| # | Criterion | Status | Evidence/Notes | -| --- | --- | --- | --- | -| 1 | A concrete deliverable is defined for every gate | Pass | Deliverable section: display-free game logic with tests and an ADR | -| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Go / No-Go table with objectively checkable criteria. | -| 3 | Dependencies on other milestones are explicitly mapped | Pass | Depends on MIL-001 with a reason. | -| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Traceability table cites [BC-001] objectives and success criteria. | -| 5 | Milestone owner and approving reviewer are identified | Pass | Ownership table: owner S01, approving reviewer S01 (stand-in in autonomous mode). | -| 6 | Milestone has a defined target date consistent with project constraints | Pass | 2026-10-13, consistent with the one-working-day duration constraint of [BC-001]. | - -## Language and Domain Results - -| # | Criterion | Status | Evidence/Notes | -| --- | --- | --- | --- | -| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | `Language` = en, `Domain` = it in Metadata. | -| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en`; `it` is in the registry's domain table. | -| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and cells are English. Checked by the stand-in for S01, who reads English. | -| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English: plain objective-level prose with no implementation detail beyond what the scope needs. | -| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists for domain `it` and none is in the plan; the document uses standard Python and software terms consistently (for example `states_to_learn.csv`, `missing_states`, Doxygen). Recorded as a stand-in decision. | -| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All structural vocabulary is English. | -| 7 | No translated twin (`..md`) exists beside the document | Pass | `check-languages.sh` reports no twin. | -| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no earlier accepted version. | -| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer, AI as stand-in for S01, reads English and the software domain; no second language reviewer is named. S01 is the Product Owner and reads both; a person may challenge this in the run summary. | -| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | CI and ADR are spelled out on first use in the milestone documents; Doxygen, pytest and README are tool or file names. | - -## Overall Verdict - -Go - The milestone meets its checklist. Every Mandatory criterion of both checklists passes. - -## Action Items - -| Action | Owner | Due | -| --- | --- | --- | -| None | S01 | | - ---- - -[MIL-002]: ../../milestones/mil-002-game-core.md -[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md -[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md -[b113e6e]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game/commit/b113e6eacd12bb08045ecf6f7822837626a7b1f7 +# SQA Review Record + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-004 | +| CrossReference | [MIL-002], [QC-MIL-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-13 | Proposed | Claude (AI) for S01 | AI as stand-in for S01 | Initial review record: Go | [b113e6e] | + +--- + +## Artifact Under Review + +- Instance reviewed: [MIL-002] +- Checklist used: [QC-MIL-001] and [QC-LANG-001] +- Scope: full review +- Language and domain: en / it +- Language reviewer: none (the reviewer reads English and knows the domain, as stand-in for S01) +- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; the author is the same AI) + +## Checklist Results + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | A concrete deliverable is defined for every gate | Pass | Deliverable section: display-free game logic with tests and an ADR | +| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Go / No-Go table with objectively checkable criteria. | +| 3 | Dependencies on other milestones are explicitly mapped | Pass | Depends on MIL-001 with a reason. | +| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Traceability table cites [BC-001] objectives and success criteria. | +| 5 | Milestone owner and approving reviewer are identified | Pass | Ownership table: owner S01, approving reviewer S01 (stand-in in autonomous mode). | +| 6 | Milestone has a defined target date consistent with project constraints | Pass | 2026-10-13, consistent with the one-working-day duration constraint of [BC-001]. | + +## Language and Domain Results + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | `Language` = en, `Domain` = it in Metadata. | +| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en`; `it` is in the registry's domain table. | +| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and cells are English. Checked by the stand-in for S01, who reads English. | +| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English: plain objective-level prose with no implementation detail beyond what the scope needs. | +| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists for domain `it` and none is in the plan; the document uses standard Python and software terms consistently (for example `states_to_learn.csv`, `missing_states`, Doxygen). Recorded as a stand-in decision. | +| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All structural vocabulary is English. | +| 7 | No translated twin (`..md`) exists beside the document | Pass | `check-languages.sh` reports no twin. | +| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no earlier accepted version. | +| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer, AI as stand-in for S01, reads English and the software domain; no second language reviewer is named. S01 is the Product Owner and reads both; a person may challenge this in the run summary. | +| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | CI and ADR are spelled out on first use in the milestone documents; Doxygen, pytest and README are tool or file names. | + +## Overall Verdict + +Go - The milestone meets its checklist. Every Mandatory criterion of both checklists passes. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | S01 | | + +--- + +[MIL-002]: ../../milestones/mil-002-game-core.md +[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md +[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md +[b113e6e]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game/commit/b113e6eacd12bb08045ecf6f7822837626a7b1f7 diff --git a/docs/sqa/reviews/rc-005-mil-003.md b/docs/sqa/reviews/rc-005-mil-003.md index 8881e24..fb27b58 100644 --- a/docs/sqa/reviews/rc-005-mil-003.md +++ b/docs/sqa/reviews/rc-005-mil-003.md @@ -1,66 +1,66 @@ -# SQA Review Record - -## Metadata -| Key | Value | -| --- | --- | -| ID | RC-005 | -| CrossReference | [MIL-003], [QC-MIL-001] | - -## Version History -| Date | Status | Author | Reviewer | Change | Commit | -| --- | --- | --- | --- | --- | --- | -| 2026-10-13 | Proposed | Claude (AI) for S01 | AI as stand-in for S01 | Initial review record: Go | [b113e6e] | - ---- - -## Artifact Under Review - -- Instance reviewed: [MIL-003] -- Checklist used: [QC-MIL-001] and [QC-LANG-001] -- Scope: full review -- Language and domain: en / it -- Language reviewer: none (the reviewer reads English and knows the domain, as stand-in for S01) -- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; the author is the same AI) - -## Checklist Results - -| # | Criterion | Status | Evidence/Notes | -| --- | --- | --- | --- | -| 1 | A concrete deliverable is defined for every gate | Pass | Deliverable section: runnable game on the tested core | -| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Go / No-Go table with objectively checkable criteria. | -| 3 | Dependencies on other milestones are explicitly mapped | Pass | Depends on MIL-002 with a reason. | -| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Traceability table cites [BC-001] objectives and success criteria. | -| 5 | Milestone owner and approving reviewer are identified | Pass | Ownership table: owner S01, approving reviewer S01 (stand-in in autonomous mode). | -| 6 | Milestone has a defined target date consistent with project constraints | Pass | 2026-10-13, consistent with the one-working-day duration constraint of [BC-001]. | - -## Language and Domain Results - -| # | Criterion | Status | Evidence/Notes | -| --- | --- | --- | --- | -| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | `Language` = en, `Domain` = it in Metadata. | -| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en`; `it` is in the registry's domain table. | -| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and cells are English. Checked by the stand-in for S01, who reads English. | -| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English: plain objective-level prose with no implementation detail beyond what the scope needs. | -| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists for domain `it` and none is in the plan; the document uses standard Python and software terms consistently (for example `states_to_learn.csv`, `missing_states`, Doxygen). Recorded as a stand-in decision. | -| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All structural vocabulary is English. | -| 7 | No translated twin (`..md`) exists beside the document | Pass | `check-languages.sh` reports no twin. | -| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no earlier accepted version. | -| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer, AI as stand-in for S01, reads English and the software domain; no second language reviewer is named. S01 is the Product Owner and reads both; a person may challenge this in the run summary. | -| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | CI and ADR are spelled out on first use in the milestone documents; Doxygen, pytest and README are tool or file names. | - -## Overall Verdict - -Go - The milestone meets its checklist. Every Mandatory criterion of both checklists passes. - -## Action Items - -| Action | Owner | Due | -| --- | --- | --- | -| None | S01 | | - ---- - -[MIL-003]: ../../milestones/mil-003-turtle-game.md -[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md -[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md -[b113e6e]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game/commit/b113e6eacd12bb08045ecf6f7822837626a7b1f7 +# SQA Review Record + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-005 | +| CrossReference | [MIL-003], [QC-MIL-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-13 | Proposed | Claude (AI) for S01 | AI as stand-in for S01 | Initial review record: Go | [b113e6e] | + +--- + +## Artifact Under Review + +- Instance reviewed: [MIL-003] +- Checklist used: [QC-MIL-001] and [QC-LANG-001] +- Scope: full review +- Language and domain: en / it +- Language reviewer: none (the reviewer reads English and knows the domain, as stand-in for S01) +- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; the author is the same AI) + +## Checklist Results + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | A concrete deliverable is defined for every gate | Pass | Deliverable section: runnable game on the tested core | +| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Go / No-Go table with objectively checkable criteria. | +| 3 | Dependencies on other milestones are explicitly mapped | Pass | Depends on MIL-002 with a reason. | +| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Traceability table cites [BC-001] objectives and success criteria. | +| 5 | Milestone owner and approving reviewer are identified | Pass | Ownership table: owner S01, approving reviewer S01 (stand-in in autonomous mode). | +| 6 | Milestone has a defined target date consistent with project constraints | Pass | 2026-10-13, consistent with the one-working-day duration constraint of [BC-001]. | + +## Language and Domain Results + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | `Language` = en, `Domain` = it in Metadata. | +| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en`; `it` is in the registry's domain table. | +| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and cells are English. Checked by the stand-in for S01, who reads English. | +| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English: plain objective-level prose with no implementation detail beyond what the scope needs. | +| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists for domain `it` and none is in the plan; the document uses standard Python and software terms consistently (for example `states_to_learn.csv`, `missing_states`, Doxygen). Recorded as a stand-in decision. | +| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All structural vocabulary is English. | +| 7 | No translated twin (`..md`) exists beside the document | Pass | `check-languages.sh` reports no twin. | +| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no earlier accepted version. | +| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer, AI as stand-in for S01, reads English and the software domain; no second language reviewer is named. S01 is the Product Owner and reads both; a person may challenge this in the run summary. | +| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | CI and ADR are spelled out on first use in the milestone documents; Doxygen, pytest and README are tool or file names. | + +## Overall Verdict + +Go - The milestone meets its checklist. Every Mandatory criterion of both checklists passes. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | S01 | | + +--- + +[MIL-003]: ../../milestones/mil-003-turtle-game.md +[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md +[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md +[b113e6e]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game/commit/b113e6eacd12bb08045ecf6f7822837626a7b1f7 diff --git a/docs/sqa/reviews/rc-006-mil-004.md b/docs/sqa/reviews/rc-006-mil-004.md index 2ffcdcf..292640c 100644 --- a/docs/sqa/reviews/rc-006-mil-004.md +++ b/docs/sqa/reviews/rc-006-mil-004.md @@ -1,66 +1,66 @@ -# SQA Review Record - -## Metadata -| Key | Value | -| --- | --- | -| ID | RC-006 | -| CrossReference | [MIL-004], [QC-MIL-001] | - -## Version History -| Date | Status | Author | Reviewer | Change | Commit | -| --- | --- | --- | --- | --- | --- | -| 2026-10-13 | Proposed | Claude (AI) for S01 | AI as stand-in for S01 | Initial review record: Go | [b113e6e] | - ---- - -## Artifact Under Review - -- Instance reviewed: [MIL-004] -- Checklist used: [QC-MIL-001] and [QC-LANG-001] -- Scope: full review -- Language and domain: en / it -- Language reviewer: none (the reviewer reads English and knows the domain, as stand-in for S01) -- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; the author is the same AI) - -## Checklist Results - -| # | Criterion | Status | Evidence/Notes | -| --- | --- | --- | --- | -| 1 | A concrete deliverable is defined for every gate | Pass | Deliverable section: README, Doxygen, screenshots and a three-language wiki | -| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Go / No-Go table with objectively checkable criteria. | -| 3 | Dependencies on other milestones are explicitly mapped | Pass | Depends on MIL-003 with a reason. | -| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Traceability table cites [BC-001] objectives and success criteria. | -| 5 | Milestone owner and approving reviewer are identified | Pass | Ownership table: owner S01, approving reviewer S01 (stand-in in autonomous mode). | -| 6 | Milestone has a defined target date consistent with project constraints | Pass | 2026-10-13, consistent with the one-working-day duration constraint of [BC-001]. | - -## Language and Domain Results - -| # | Criterion | Status | Evidence/Notes | -| --- | --- | --- | --- | -| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | `Language` = en, `Domain` = it in Metadata. | -| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en`; `it` is in the registry's domain table. | -| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and cells are English. Checked by the stand-in for S01, who reads English. | -| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English: plain objective-level prose with no implementation detail beyond what the scope needs. | -| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists for domain `it` and none is in the plan; the document uses standard Python and software terms consistently (for example `states_to_learn.csv`, `missing_states`, Doxygen). Recorded as a stand-in decision. | -| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All structural vocabulary is English. | -| 7 | No translated twin (`..md`) exists beside the document | Pass | `check-languages.sh` reports no twin. | -| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no earlier accepted version. | -| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer, AI as stand-in for S01, reads English and the software domain; no second language reviewer is named. S01 is the Product Owner and reads both; a person may challenge this in the run summary. | -| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | CI and ADR are spelled out on first use in the milestone documents; Doxygen, pytest and README are tool or file names. | - -## Overall Verdict - -Go - The milestone meets its checklist. Every Mandatory criterion of both checklists passes. - -## Action Items - -| Action | Owner | Due | -| --- | --- | --- | -| None | S01 | | - ---- - -[MIL-004]: ../../milestones/mil-004-docs-release.md -[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md -[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md -[b113e6e]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game/commit/b113e6eacd12bb08045ecf6f7822837626a7b1f7 +# SQA Review Record + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-006 | +| CrossReference | [MIL-004], [QC-MIL-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-13 | Proposed | Claude (AI) for S01 | AI as stand-in for S01 | Initial review record: Go | [b113e6e] | + +--- + +## Artifact Under Review + +- Instance reviewed: [MIL-004] +- Checklist used: [QC-MIL-001] and [QC-LANG-001] +- Scope: full review +- Language and domain: en / it +- Language reviewer: none (the reviewer reads English and knows the domain, as stand-in for S01) +- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; the author is the same AI) + +## Checklist Results + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | A concrete deliverable is defined for every gate | Pass | Deliverable section: README, Doxygen, screenshots and a three-language wiki | +| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Go / No-Go table with objectively checkable criteria. | +| 3 | Dependencies on other milestones are explicitly mapped | Pass | Depends on MIL-003 with a reason. | +| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Traceability table cites [BC-001] objectives and success criteria. | +| 5 | Milestone owner and approving reviewer are identified | Pass | Ownership table: owner S01, approving reviewer S01 (stand-in in autonomous mode). | +| 6 | Milestone has a defined target date consistent with project constraints | Pass | 2026-10-13, consistent with the one-working-day duration constraint of [BC-001]. | + +## Language and Domain Results + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | `Language` = en, `Domain` = it in Metadata. | +| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en`; `it` is in the registry's domain table. | +| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and cells are English. Checked by the stand-in for S01, who reads English. | +| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English: plain objective-level prose with no implementation detail beyond what the scope needs. | +| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists for domain `it` and none is in the plan; the document uses standard Python and software terms consistently (for example `states_to_learn.csv`, `missing_states`, Doxygen). Recorded as a stand-in decision. | +| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All structural vocabulary is English. | +| 7 | No translated twin (`..md`) exists beside the document | Pass | `check-languages.sh` reports no twin. | +| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no earlier accepted version. | +| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer, AI as stand-in for S01, reads English and the software domain; no second language reviewer is named. S01 is the Product Owner and reads both; a person may challenge this in the run summary. | +| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | CI and ADR are spelled out on first use in the milestone documents; Doxygen, pytest and README are tool or file names. | + +## Overall Verdict + +Go - The milestone meets its checklist. Every Mandatory criterion of both checklists passes. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | S01 | | + +--- + +[MIL-004]: ../../milestones/mil-004-docs-release.md +[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md +[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md +[b113e6e]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-us-states-game/commit/b113e6eacd12bb08045ecf6f7822837626a7b1f7 diff --git a/docs/sqa/reviews/rc-007-mil-001-code.md b/docs/sqa/reviews/rc-007-mil-001-code.md new file mode 100644 index 0000000..1e67dfc --- /dev/null +++ b/docs/sqa/reviews/rc-007-mil-001-code.md @@ -0,0 +1,81 @@ +# SQA Review Record + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-007 | +| CrossReference | [QC-PY-001], [QC-YML-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-13 | Proposed | Claude (AI) for S01 | AI as stand-in for S01 | Initial review record: Go | pending | + +--- + +## Artifact Under Review + +- Instance reviewed: source and workflow files delivered by MIL-001 (branch mil-001-baseline-setup) +- Checklist used: [QC-PY-001], [QC-YML-001] +- Scope: full review +- Language and domain: n/a (technical type) +- Language reviewer: none +- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; the author is the same AI) + +## Checklist Results + +### QC-PY-001 + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | Packages, modules, functions, variables, classes and constants follow PEP 8 casing (`snake_case`, `PascalCase`, `UPPER_SNAKE`) (Mandatory) | Pass | Constants are UPPER_SNAKE, functions snake_case; ruff rule set N passes. | +| 2 | Names state purpose in the domain's language; no unexplained abbreviations, no single-letter names outside tiny scopes (Mandatory) | Pass | Names state purpose (STATES_TO_LEARN_FILENAME, NUMBER_OF_STATES). | +| 3 | Code is produced by the project's formatter and passes its linter with no unexplained suppressions (Mandatory) | Pass | `ruff format` leaves files unchanged and `ruff check` passes with no suppressions; configured in pyproject.toml. | +| 4 | Every function and method signature is type-annotated, including `-> None` (Mandatory) | Pass | Both test functions are annotated `-> None`; `mypy --strict` passes. | +| 5 | No bare `except:`, no swallowed exceptions; specific exceptions are raised and the cause is kept (`raise ... from`) (Mandatory) | N-A | No exception handling in this milestone's code. | +| 6 | No mutable default arguments and no shadowed builtins (Mandatory) | Pass | No function arguments with defaults; no builtin shadowed. | +| 7 | Files, locks and connections are managed with context managers (Mandatory) | Pass | Tests read the CSV with `Path.read_text`, which closes the file. | +| 8 | Public modules, classes and functions have docstrings that say what, not how (Optional) | Pass | Module docstrings and `##` Doxygen comments on every constant. | +| 9 | Logging uses `logging`, not `print`; no secrets or personal data in log output (Mandatory) | N-A | No logging or output in this milestone's code. | +| 10 | Classes and operations trace to the Design Class Diagram they implement; deviations are recorded (Mandatory) | N-A | No classes or operations; no Design Class Diagram exists for constants. | +| 11 | Tests exist for new behaviour, are named for the behaviour, and do not depend on order or the network (Mandatory) | Pass | tests/test_constants.py: two tests named for the behaviour; no order or network dependence. | +| 12 | Type checker runs in strict mode without errors; `Any` is justified in a comment (Optional) | Pass | `python -m mypy` strict mode reports no issues. | +| 13 | Dependencies are declared and pinned in the project's dependency file, none unused (Optional) | Pass | No runtime dependencies; dev extra lists pytest, ruff, mypy and yamllint with lower bounds. | +| 14 | Each piece of knowledge (a business rule, constant, format, validation or query) is defined in one place; code is merged only where it expresses the same knowledge, not where it merely looks alike (Mandatory) | Pass | Each path, file name and limit is defined once in constants.py. | +| 15 | Imports point inward: business-rule modules import no framework, database, UI or delivery-mechanism code, and there are no import cycles (Mandatory) | Pass | The package has no imports of UI or framework code. | +| 16 | SOLID holds: a class or module has one reason to change; new behaviour is added by extension, not by editing a type test in several places; subclasses honour the contract of their base; protocols are narrow; high-level code depends on protocols or abstract types and receives its implementations (Mandatory) | Pass | One module with one reason to change; no classes. | + +### QC-YML-001 + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | The file parses with a safe YAML loader and has no duplicate keys in any mapping (Mandatory) | Pass | yamllint (PyYAML safe loader) parses the workflow and reports no duplicate keys. | +| 2 | Indentation is 2 spaces everywhere, never tabs; lines end with LF; the file ends with one newline and has no trailing spaces (Mandatory) | Pass | 2-space indentation, LF endings enforced by .gitattributes, yamllint default rules pass. | +| 3 | Passes `yamllint` (or the project's YAML linter) with its configuration committed next to the code and no unexplained `disable` comments (Mandatory) | Pass | `yamllint .gitea .yamllint` passes with the committed .yamllint, no disable comments. | +| 4 | A scalar that YAML would coerce to another type is quoted: `yes`, `no`, `on`, `off`, `null`, `~`, numbers with a leading zero, versions such as `1.10`, and values that contain `: ` or ` #` (Mandatory) | Pass | `python-version: "3.13"` is quoted; `on` is allowed by the yamllint truthy rule for workflows. | +| 5 | Only safe, plain types are used: no language-specific tags (`!!python/object`, `!ruby/object`) and no `!include`-style extension unless the consuming tool documents it (Mandatory) | Pass | Plain mappings, sequences and strings only. | +| 6 | No secret is written in the file: no password, token, key or private connection string; a secret is referenced by name and supplied by the consuming tool (Mandatory) | Pass | No secret in the file; the workflow needs none. | +| 7 | Embedded program text (shell, Python, SQL, `jq`, and so on) in a value is at most five lines; a longer one is moved to a file of its own, in its own language, and the YAML calls it (Mandatory) | Pass | Each `run:` value has at most 2 lines. | +| 8 | A block of keys or values repeated in the file or across files is defined once (an anchor, a template, an include or a reusable unit the consumer supports) (Mandatory) | Pass | No repeated block. | +| 9 | Anchors, aliases and merge keys (`&`, `*`, `<<`) are used only where the consuming tool is known to support them (Mandatory) | Pass | No anchors or aliases. | +| 10 | The file validates against the schema of the consuming tool where one exists, and the schema or tool version is stated (Optional) | N-A | No published schema is checked; the workflow is exercised by the host runner. | +| 11 | A header comment states what the file is for, which tool reads it, and where its decision or design is recorded (Mandatory) | Pass | Header comment states purpose, reader and where the design is recorded. | +| 12 | Key names follow the convention of the consuming tool; one case style is used within the file (kebab-case or snake_case, never mixed) (Mandatory) | Pass | kebab-case keys (`runs-on`, `timeout-minutes`) throughout. | +| 13 | Multi-line strings use a block scalar (`\|` or `>`) and state the chomping indicator (`\|-`, `\|+`) where the trailing newline matters (Optional) | Pass | The `run:` block scalars use `|`; trailing newline does not matter. | +| 14 | The file name is lowercase kebab-case with one extension style (`.yml` or `.yaml`) used throughout the repository (Optional) | Pass | `run-tests.yml` is lowercase kebab-case with the .yml extension. | +| 15 | A change is exercised by a check that runs without the real target: a parse and schema test, or a dry run of the consuming tool (Optional) | N-A | The runner is not available locally; yamllint is the local check. | + +## Overall Verdict + +Go - Mandatory criteria of both checklists pass for the files delivered by MIL-001: constants module, package marker, smoke tests, pyproject and the workflow. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | S01 | | + +--- + +[QC-PY-001]: ../../../framework/qc/code/qc-programming-python.md +[QC-YML-001]: ../../../framework/qc/code/qc-yaml.md diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..3b8e2ee --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,40 @@ +[build-system] +requires = ["setuptools>=68"] +build-backend = "setuptools.build_meta" + +[project] +name = "us-states-game" +version = "0.1.0" +description = "U.S. States Game: name the 50 states on a Turtle map (Udemy 100 Days of Code, day 25)." +readme = "README.md" +requires-python = ">=3.13" +dependencies = [] + +[project.optional-dependencies] +dev = ["pytest>=8", "ruff>=0.6", "mypy>=1.11", "yamllint>=1.35"] + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.setuptools.package-data] +us_states_game = ["data/*.csv", "data/*.gif"] + +[tool.pytest.ini_options] +testpaths = ["tests"] +pythonpath = ["src"] + +[tool.ruff] +line-length = 88 +src = ["src", "tests"] + +[tool.ruff.lint] +select = ["E", "F", "W", "I", "N", "UP", "B", "D"] +ignore = ["D203", "D213"] + +[tool.ruff.lint.per-file-ignores] +"tests/*" = ["D"] + +[tool.mypy] +strict = true +files = ["src", "tests"] +mypy_path = "src" diff --git a/src/us_states_game/__init__.py b/src/us_states_game/__init__.py new file mode 100644 index 0000000..c7d699e --- /dev/null +++ b/src/us_states_game/__init__.py @@ -0,0 +1,5 @@ +"""The U.S. States Game package: name the 50 states on a Turtle map. + +@file __init__.py +@brief Package marker of the game. +""" diff --git a/src/us_states_game/constants.py b/src/us_states_game/constants.py new file mode 100644 index 0000000..99fd7eb --- /dev/null +++ b/src/us_states_game/constants.py @@ -0,0 +1,39 @@ +"""Constants of the U.S. States Game: titles, file names and limits. + +@file constants.py +@brief Titles, file names and limits used by the game. + +Every value the game needs in more than one place lives here, so the +game logic and the Turtle screen never repeat a literal. +""" + +from pathlib import Path + +## Folder of this package. +PACKAGE_DIR = Path(__file__).resolve().parent + +## Folder with the course files the game reads at run time. +DATA_DIR = PACKAGE_DIR / "data" + +## CSV file with the columns state, x and y for all 50 states. +STATES_CSV_PATH = DATA_DIR / "50_states.csv" + +## GIF of the blank U.S. map, registered as a Turtle shape. +MAP_IMAGE_PATH = DATA_DIR / "blank_states_img.gif" + +## File written when the game ends, listing the states the player missed. +STATES_TO_LEARN_FILENAME = "states_to_learn.csv" + +## Column names in the states CSV file. +STATE_COLUMN = "state" +X_COLUMN = "x" +Y_COLUMN = "y" + +## Title of the game window. +SCREEN_TITLE = "U.S. States Game" + +## Number of states the player has to name. +NUMBER_OF_STATES = 50 + +## Text the player types to leave the game early. +EXIT_COMMAND = "exit" diff --git a/src/us_states_game/data/50_states.csv b/src/us_states_game/data/50_states.csv new file mode 100644 index 0000000..fab9c29 --- /dev/null +++ b/src/us_states_game/data/50_states.csv @@ -0,0 +1,51 @@ +state,x,y +Alabama,139,-77 +Alaska,-204,-170 +Arizona,-203,-40 +Arkansas,57,-53 +California,-297,13 +Colorado,-112,20 +Connecticut,297,96 +Delaware,275,42 +Florida,220,-145 +Georgia,182,-75 +Hawaii,-317,-143 +Idaho,-216,122 +Illinois,95,37 +Indiana,133,39 +Iowa,38,65 +Kansas,-17,5 +Kentucky,149,1 +Louisiana,59,-114 +Maine,319,164 +Maryland,288,27 +Massachusetts,312,112 +Michigan,148,101 +Minnesota,23,135 +Mississippi,94,-78 +Missouri,49,6 +Montana,-141,150 +Nebraska,-61,66 +Nevada,-257,56 +New Hampshire,302,127 +New Jersey,282,65 +New Mexico,-128,-43 +New York,236,104 +North Carolina,239,-22 +North Dakota,-44,158 +Ohio,176,52 +Oklahoma,-8,-41 +Oregon,-278,138 +Pennsylvania,238,72 +Rhode Island,318,94 +South Carolina,218,-51 +South Dakota,-44,109 +Tennessee,131,-34 +Texas,-38,-106 +Utah,-189,34 +Vermont,282,154 +Virginia,234,12 +Washington,-257,193 +West Virginia,200,20 +Wisconsin,83,113 +Wyoming,-134,90 \ No newline at end of file diff --git a/src/us_states_game/data/blank_states_img.gif b/src/us_states_game/data/blank_states_img.gif new file mode 100644 index 0000000..361f2d0 Binary files /dev/null and b/src/us_states_game/data/blank_states_img.gif differ diff --git a/tests/test_constants.py b/tests/test_constants.py new file mode 100644 index 0000000..70923b0 --- /dev/null +++ b/tests/test_constants.py @@ -0,0 +1,17 @@ +"""Smoke test: the constants point at the assignment files that ship with the game.""" + +from us_states_game import constants + + +def test_data_files_exist() -> None: + assert constants.STATES_CSV_PATH.is_file() + assert constants.MAP_IMAGE_PATH.is_file() + + +def test_states_csv_has_all_states() -> None: + lines = constants.STATES_CSV_PATH.read_text(encoding="utf-8").strip().splitlines() + assert ( + lines[0] + == f"{constants.STATE_COLUMN},{constants.X_COLUMN},{constants.Y_COLUMN}" + ) + assert len(lines) - 1 == constants.NUMBER_OF_STATES