142 lines
7.6 KiB
Markdown
142 lines
7.6 KiB
Markdown
# Business Case
|
||
|
||
## Metadata
|
||
| Key | Value |
|
||
| --- | --- |
|
||
| ID | BC-001 |
|
||
| CrossReference | [SA-001] |
|
||
| Language | en |
|
||
| Domain | it |
|
||
|
||
## Version History
|
||
| Date | Status | Author | Reviewer | Change | Commit |
|
||
| --- | --- | --- | --- | --- | --- |
|
||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | S01 (AI as stand-in, autonomous mode) | Initial version | [dcef5e6] |
|
||
|
||
---
|
||
|
||
## Executive Summary
|
||
|
||
Day 45 of the Udemy course "100 Days of Code: The Complete Python Pro Bootcamp" teaches web scraping with Requests and BeautifulSoup. This project turns the day's assignment into a small, readable and tested Python repository: parsing a local HTML file, scraping the Hacker News front page, and scraping Empire's "100 Greatest Movies" list into a numbered `movies.txt`. The repository is documented with a README and a three-language wiki (English, Danish, Bahasa Malaysia) that shows a screenshot per lecture step and explains what each step taught.
|
||
|
||
## Methodological and Standards Foundation
|
||
|
||
The project follows the SQA and QC framework mounted at `framework/` (plan-first gate, one reviewed artifact per step) and Larman's *Applying UML and Patterns* where a model is needed. Product quality is described with ISO/IEC 25010:2023 characteristics. Source code follows the `coding-conventions` (Python) and `clean-architecture` skills, with Doxygen comments in the source.
|
||
|
||
## Problem Statement
|
||
|
||
- The course assignment ships only a stub (`main.py`) and a sample HTML file, so every participant ends with a throw-away script that is hard to run, test or compare.
|
||
- A solution that only works against a live site breaks when the site changes; the assignment therefore pins an Internet Archive snapshot.
|
||
- Course lessons give no written record of what each step taught, which makes later review difficult.
|
||
|
||
## Business Opportunity
|
||
|
||
A clean reference repository lets the course participant revisit the lessons, lets other coursists compare solutions, and lets GitHub visitors find a small, dependency-light scraping example with tests and multi-language documentation.
|
||
|
||
## Objectives
|
||
|
||
1. O1: Deliver the three lecture exercises (parse HTML, Hacker News, 100 movies) as importable Python functions that keep the assignment's names.
|
||
2. O2: Generate `movies.txt` with the movies numbered `1) Title` in ascending order from the Wayback Machine snapshot (alternative: the live Empire URL).
|
||
3. O3: Provide tests with pytest that run offline against saved fixtures.
|
||
4. O4: Provide a README with set-up of a local `.venv`, how to run the project and the tests.
|
||
5. O5: Provide a wiki in English, Danish and Bahasa Malaysia with one screenshot and one "what we gained" explanation per lecture step.
|
||
6. O6: Set the repository description and topics, and install the shared CI workflows of `TirSystem/github-action`.
|
||
|
||
## Scope
|
||
|
||
### In Scope
|
||
|
||
- Python package under `src/`, tests under `tests/`, documents under `docs/`.
|
||
- `pyproject.toml`, `constants.py`, Python `.gitignore`, `Doxyfile`, Doxygen comments.
|
||
- Lecture steps: parsing HTML and making soup, finding and selecting elements, scraping Hacker News, scraping ethics note, 100 movies.
|
||
- README from the framework template; wiki pages in en, da and ms; screenshots per step.
|
||
- Repository description and topics on the git host; workflows for quality checks, English comments, code metrics, wiki publishing and milestone publishing.
|
||
|
||
### Out of Scope
|
||
|
||
- Scraping behind authentication or of copyrighted content beyond the course list titles.
|
||
- A graphical or web interface.
|
||
- Any use of the credentials in `.env` inside the project (personal use only, never imported, tested or committed).
|
||
- Runtime dependencies other than those the assignment needs (`requests`, `beautifulsoup4`).
|
||
|
||
## Expected Benefits
|
||
|
||
### Tangible Benefits
|
||
|
||
- A runnable, tested repository with a generated `movies.txt`.
|
||
- A wiki in three languages that documents every lecture step with screenshots.
|
||
- CI evidence (lint, type check, tests) on every pull request.
|
||
|
||
### Intangible Benefits
|
||
|
||
- Faster revision of the Day 45 material.
|
||
- A reusable pattern for later "100 Days" projects.
|
||
|
||
## Strategic Alignment
|
||
|
||
The project supports the participant's goal of completing the bootcamp with documented, reviewable work, and the framework's goal of exercising the SQA and QC process on a real, small project.
|
||
|
||
## Success Criteria
|
||
|
||
| # | Criterion | Target | Measure |
|
||
| --- | --- | --- | --- |
|
||
| 1 | Tests pass offline | 100 % of pytest tests green | `python -m pytest` in CI and locally |
|
||
| 2 | `movies.txt` complete | 100 numbered lines, ascending | test on the generated file |
|
||
| 3 | Wiki completeness | every page exists in en, da and ms | `check-languages` style page-set comparison |
|
||
| 4 | Screenshot coverage | one screenshot per lecture step in README and each wiki language | review count |
|
||
| 5 | Runtime dependencies | only `requests` and `beautifulsoup4` | `pyproject.toml` review |
|
||
| 6 | Repository metadata | description and at least 5 topics set | host API read-back |
|
||
|
||
## Risks
|
||
|
||
| Risk | Impact | Mitigation |
|
||
| --- | --- | --- |
|
||
| Live sites change markup (Hacker News, Empire) | Scrapers return nothing | Parse functions take HTML text; tests use saved fixtures; Wayback URL pinned |
|
||
| Wayback Machine unavailable | Cannot fetch the list | Fall back to the live Empire URL named in the request |
|
||
| Scraping too often loads a server | Unethical use | One request per run, a `User-Agent`, respect `robots.txt`, no loops |
|
||
| Token in `.env` leaks | Account compromise | `.env` is git-ignored, never imported; tokens are only read by shell commands for the git host API |
|
||
| Translations drift from English | Inconsistent wiki | English is authoritative; same page set checked per pull request |
|
||
| Git host repository name differs from the remote (`Tirsvad-Udemy-100_days_of_code` vs `Tirsvad-Udemy-100-days-of-code/045-scrape-movies`) | Metadata set on the wrong repository | Confirm the target before the API call (see Open Issues in the Project Plan) |
|
||
|
||
## Assumptions
|
||
|
||
- Python 3.13 or newer is installed; `venv` is available.
|
||
- The git host `git.tirsystem.com` is reachable and the token in `.env` is valid.
|
||
- S01 is Product Owner, developer and reviewer; in autonomous mode the AI acts as the stand-in reviewer and records it.
|
||
- The runners of `git.tirsystem.com` are available for the workflows.
|
||
|
||
## Constraints
|
||
|
||
- Python greater than 3.13 (3.13 or newer), `venv`, `pytest`, `pyproject.toml`, constants in `constants.py`.
|
||
- Folder structure `src/`, `tests/`, `docs/`.
|
||
- One branch and one pull request per milestone.
|
||
- No attribution lines in commit messages or pull request descriptions.
|
||
- Do not edit `framework/`.
|
||
|
||
## Cost–Benefit Assessment
|
||
|
||
| Costs | Benefits |
|
||
| --- | --- |
|
||
| Author time of S01 for plan acceptance and review of the summary | Reusable, tested reference repository |
|
||
| Runner minutes for CI | Automatic quality evidence |
|
||
| Translation effort for da and ms | Documentation readable by more coursists |
|
||
|
||
The assessment is qualitative: the project is a learning exercise with no revenue.
|
||
|
||
## Stakeholders
|
||
|
||
| Stakeholder ID (SA) | Interest in this project |
|
||
| --- | --- |
|
||
| S01 | Completes and reviews the assignment; owns the product |
|
||
| S02 | Reads, runs and compares the code |
|
||
| S03 | Finds the repository by description and topics and judges it by README |
|
||
|
||
## Recommendation
|
||
|
||
Proceed — the scope is small, the inputs are known, and the process is exercised end to end.
|
||
|
||
---
|
||
|
||
[SA-001]: ./stakeholder-analysis.md
|
||
[dcef5e6]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/045-scrape-movies/commit/dcef5e6e6e7ec16162817d3ec0ce1b303e0a3a63
|