|
| 1 | +# Maximum PC Builds Archive — Architecture |
| 2 | + |
| 3 | +## Layout |
| 4 | + |
| 5 | +``` |
| 6 | +2018/January/{Budget,Mid-Range,Turbo}.md |
| 7 | +2018/February/… |
| 8 | +… |
| 9 | +2021/October/{AMD Budget, AMD Mid-Range, AMD Turbo, Intel Budget, …}.md |
| 10 | +scraper.py |
| 11 | +requirements.txt |
| 12 | +.github/workflows/update-prices.yml |
| 13 | +``` |
| 14 | + |
| 15 | +Year, then month, then one file per build tier. The AMD and Intel split appears only in the |
| 16 | +years the magazine used it, so the folder shape follows the source rather than imposing a |
| 17 | +uniform scheme. |
| 18 | + |
| 19 | +## Two branches, two artefacts |
| 20 | + |
| 21 | +| Branch | Holds | |
| 22 | +|---|---| |
| 23 | +| `main` | Markdown builds, the scraper, documentation | |
| 24 | +| `gh-pages` | The generated website | |
| 25 | + |
| 26 | +The website is a **derived artefact**. The Markdown files are the source of truth, and the |
| 27 | +published pages are one rendering of them — which is why the currency can differ between the |
| 28 | +two without either being wrong. |
| 29 | + |
| 30 | +## Three representations, deliberately |
| 31 | + |
| 32 | +| Form | Currency | Printed price | Current price | |
| 33 | +|---|---|---|---| |
| 34 | +| PCPartPicker | Any supported | No | Yes, live | |
| 35 | +| Markdown | CAD | Yes | Yes, from the last scrape | |
| 36 | +| Website | USD | Yes | Yes, from the last scrape | |
| 37 | + |
| 38 | +PCPartPicker is a live service and cannot carry a historical figure, which is why the archive |
| 39 | +keeps its own copies. Losing the printed price would leave nothing to compare against, and the |
| 40 | +comparison is the whole point. |
| 41 | + |
| 42 | +The CAD/USD split reflects where each is read rather than an inconsistency. |
| 43 | + |
| 44 | +## Prices are rewritten in place |
| 45 | + |
| 46 | +`scraper.py` runs daily under `update-prices.yml` and edits the current-price column of the |
| 47 | +Markdown files, committing the result. |
| 48 | + |
| 49 | +Two consequences: |
| 50 | + |
| 51 | +- **A build file is accurate as of the last successful run**, not as of the issue date. |
| 52 | +- **The git history is partly a price series.** Every daily commit records what those parts |
| 53 | + cost that day, which is a more interesting dataset than the files themselves and is not |
| 54 | + currently surfaced anywhere. |
| 55 | + |
| 56 | +The printed price column is never touched, which is what keeps the archive honest. |
| 57 | + |
| 58 | +## The scraper depends on someone else's markup |
| 59 | + |
| 60 | +Prices come from PCPartPicker, parsed with BeautifulSoup. PCPartPicker aggregates retailers — |
| 61 | +the scraper does not visit Newegg, Amazon, or Best Buy itself. |
| 62 | + |
| 63 | +That makes one site the single point of failure for the whole price-updating story, and a |
| 64 | +layout change there breaks parsing with no warning. See [Scraper](./scraper.md). |
| 65 | + |
| 66 | +## Provenance |
| 67 | + |
| 68 | +The component selections were published by Maximum PC magazine. This repository records which |
| 69 | +parts each build specified and tracks their prices; it does not reproduce the magazine's |
| 70 | +articles or reviews. |
0 commit comments