Commit b5f7f68
authored
chore: test Academy exercises (#2097)
This is a proof of concept how we could test exercises in the academy:
- Exercises target real world websites, so they can easily break without
us knowing
- We could test them e.g. weekly, so it's not too noisy
- The solution should be as simple as possible, and capable running both
JavaScript and Python
- While working on the PoC I actually discovered one exercise which is
broken 95% of time due to aggressive anti-scraping protections, so I
changed it
- The test can be executed with `bats -r --print-output-on-failure .`
- Bats is a simple testing framework based on Bash, which allows to run
arbitrary programs and evaluate their output -
https://github.com/bats-core/bats-core Not sure yet how to get it inside
the CI, but on macOS it's just `brew install bats`
Todo:
- [x] Implement Python exercise
- [x] Implement JS exercise
- [x] Implement GitHub Action
- [x] Discuss with the team whether we want this
- [x] Document the solution
- [x] Port the rest of the exercises
- [x] Change the YAML to do just crons
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Adds a monthly GitHub Action and Bats-based suite to run Academy
JS/Python exercise solutions, embeds solutions into lessons, and updates
docs/ignore files.
>
> - **CI**:
> - Add monthly and manual workflow `.github/workflows/test-academy.yml`
to run Academy exercises via Node (npm) and Python (uv).
> - **Testing**:
> - Introduce Bats-based tests for Academy exercises:
`sources/academy/**/exercises/test.bats` (JS & Python) executing
solutions and asserting outputs.
> - New npm script `test:academy` and dev dependency `bats`.
> - **Docs/Academy content**:
> - Embed executable exercise solutions using `CodeBlock` +
`!!raw-loader` across JS/Python lessons (`04–12`), replacing inline
snippets.
> - Update several exercises (e.g., switch example from AliExpress to
LEGO) and add multiple new solution files
(Cheerio/BeautifulSoup/Crawlee).
> - **Repo**:
> - Update `.gitignore` to exclude exercise artifacts (`storage`,
`node_modules`, `package*.json`, `dataset.json`).
> - Document testing process in `CONTRIBUTING.md` (broken links check +
Academy exercises CI).
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
118a550. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->1 parent 7068ad7 commit b5f7f68
61 files changed
Lines changed: 1332 additions & 932 deletions
File tree
- .github/workflows
- sources/academy/webscraping
- scraping_basics_javascript
- exercises
- scraping_basics_python
- exercises
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
335 | 335 | | |
336 | 336 | | |
337 | 337 | | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
338 | 344 | | |
339 | 345 | | |
340 | 346 | | |
| |||
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
40 | 40 | | |
41 | 41 | | |
42 | 42 | | |
| 43 | + | |
43 | 44 | | |
44 | 45 | | |
45 | 46 | | |
| |||
48 | 49 | | |
49 | 50 | | |
50 | 51 | | |
| 52 | + | |
51 | 53 | | |
52 | 54 | | |
53 | 55 | | |
| |||
Lines changed: 6 additions & 15 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
8 | 9 | | |
9 | 10 | | |
| 11 | + | |
10 | 12 | | |
11 | 13 | | |
12 | 14 | | |
| |||
184 | 186 | | |
185 | 187 | | |
186 | 188 | | |
187 | | - | |
| 189 | + | |
188 | 190 | | |
189 | | - | |
| 191 | + | |
190 | 192 | | |
191 | 193 | | |
192 | | - | |
| 194 | + | |
193 | 195 | | |
194 | 196 | | |
195 | 197 | | |
196 | 198 | | |
197 | | - | |
198 | | - | |
199 | | - | |
200 | | - | |
201 | | - | |
202 | | - | |
203 | | - | |
204 | | - | |
205 | | - | |
206 | | - | |
207 | | - | |
208 | | - | |
| 199 | + | |
209 | 200 | | |
210 | 201 | | |
211 | 202 | | |
| |||
Lines changed: 5 additions & 32 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
8 | 9 | | |
9 | 10 | | |
| 11 | + | |
| 12 | + | |
10 | 13 | | |
11 | 14 | | |
12 | 15 | | |
| |||
183 | 186 | | |
184 | 187 | | |
185 | 188 | | |
186 | | - | |
187 | | - | |
188 | | - | |
189 | | - | |
190 | | - | |
191 | | - | |
192 | | - | |
193 | | - | |
194 | | - | |
195 | | - | |
196 | | - | |
197 | | - | |
198 | | - | |
199 | | - | |
200 | | - | |
201 | | - | |
| 189 | + | |
202 | 190 | | |
203 | 191 | | |
204 | 192 | | |
| |||
207 | 195 | | |
208 | 196 | | |
209 | 197 | | |
210 | | - | |
211 | | - | |
212 | | - | |
213 | | - | |
214 | | - | |
215 | | - | |
216 | | - | |
217 | | - | |
218 | | - | |
219 | | - | |
220 | | - | |
221 | | - | |
222 | | - | |
223 | | - | |
224 | | - | |
225 | | - | |
| 198 | + | |
226 | 199 | | |
Lines changed: 7 additions & 70 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
8 | 9 | | |
9 | 10 | | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
10 | 14 | | |
11 | 15 | | |
12 | 16 | | |
| |||
238 | 242 | | |
239 | 243 | | |
240 | 244 | | |
241 | | - | |
242 | | - | |
243 | | - | |
244 | | - | |
245 | | - | |
246 | | - | |
247 | | - | |
248 | | - | |
249 | | - | |
250 | | - | |
251 | | - | |
252 | | - | |
253 | | - | |
254 | | - | |
255 | | - | |
256 | | - | |
257 | | - | |
258 | | - | |
259 | | - | |
260 | | - | |
261 | | - | |
262 | | - | |
263 | | - | |
264 | | - | |
265 | | - | |
266 | | - | |
267 | | - | |
268 | | - | |
269 | | - | |
270 | | - | |
| 245 | + | |
271 | 246 | | |
272 | 247 | | |
273 | 248 | | |
| |||
288 | 263 | | |
289 | 264 | | |
290 | 265 | | |
291 | | - | |
292 | | - | |
293 | | - | |
294 | | - | |
295 | | - | |
296 | | - | |
297 | | - | |
298 | | - | |
299 | | - | |
300 | | - | |
301 | | - | |
302 | | - | |
303 | | - | |
304 | | - | |
305 | | - | |
306 | | - | |
307 | | - | |
308 | | - | |
309 | | - | |
310 | | - | |
311 | | - | |
| 266 | + | |
312 | 267 | | |
313 | 268 | | |
314 | 269 | | |
| |||
330 | 285 | | |
331 | 286 | | |
332 | 287 | | |
333 | | - | |
334 | | - | |
335 | | - | |
336 | | - | |
337 | | - | |
338 | | - | |
339 | | - | |
340 | | - | |
341 | | - | |
342 | | - | |
343 | | - | |
344 | | - | |
345 | | - | |
346 | | - | |
347 | | - | |
348 | | - | |
349 | | - | |
350 | | - | |
351 | | - | |
| 288 | + | |
352 | 289 | | |
0 commit comments