pythonlings 0.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (942) hide show
  1. pythonlings/__init__.py +0 -0
  2. pythonlings/__main__.py +4 -0
  3. pythonlings/app.py +84 -0
  4. pythonlings/cli.py +318 -0
  5. pythonlings/core/__init__.py +0 -0
  6. pythonlings/core/curriculum.py +106 -0
  7. pythonlings/core/docs.py +68 -0
  8. pythonlings/core/exercise.py +33 -0
  9. pythonlings/core/manifest.py +110 -0
  10. pythonlings/core/reset.py +43 -0
  11. pythonlings/core/runner.py +114 -0
  12. pythonlings/core/solutions.py +17 -0
  13. pythonlings/core/state.py +86 -0
  14. pythonlings/curriculum/checks/async/async1.py +4 -0
  15. pythonlings/curriculum/checks/async/async10.py +4 -0
  16. pythonlings/curriculum/checks/async/async2.py +4 -0
  17. pythonlings/curriculum/checks/async/async3.py +4 -0
  18. pythonlings/curriculum/checks/async/async4.py +4 -0
  19. pythonlings/curriculum/checks/async/async5.py +4 -0
  20. pythonlings/curriculum/checks/async/async6.py +4 -0
  21. pythonlings/curriculum/checks/async/async7.py +4 -0
  22. pythonlings/curriculum/checks/async/async8.py +2 -0
  23. pythonlings/curriculum/checks/async/async9.py +4 -0
  24. pythonlings/curriculum/checks/classes/classes1.py +3 -0
  25. pythonlings/curriculum/checks/classes/classes10.py +5 -0
  26. pythonlings/curriculum/checks/classes/classes11.py +5 -0
  27. pythonlings/curriculum/checks/classes/classes12.py +16 -0
  28. pythonlings/curriculum/checks/classes/classes2.py +3 -0
  29. pythonlings/curriculum/checks/classes/classes3.py +4 -0
  30. pythonlings/curriculum/checks/classes/classes4.py +4 -0
  31. pythonlings/curriculum/checks/classes/classes5.py +5 -0
  32. pythonlings/curriculum/checks/classes/classes6.py +4 -0
  33. pythonlings/curriculum/checks/classes/classes7.py +3 -0
  34. pythonlings/curriculum/checks/classes/classes8.py +3 -0
  35. pythonlings/curriculum/checks/classes/classes9.py +4 -0
  36. pythonlings/curriculum/checks/collections/collections1.py +4 -0
  37. pythonlings/curriculum/checks/collections/collections10.py +15 -0
  38. pythonlings/curriculum/checks/collections/collections2.py +4 -0
  39. pythonlings/curriculum/checks/collections/collections3.py +5 -0
  40. pythonlings/curriculum/checks/collections/collections4.py +4 -0
  41. pythonlings/curriculum/checks/collections/collections5.py +5 -0
  42. pythonlings/curriculum/checks/collections/collections6.py +6 -0
  43. pythonlings/curriculum/checks/collections/collections7.py +4 -0
  44. pythonlings/curriculum/checks/collections/collections8.py +5 -0
  45. pythonlings/curriculum/checks/collections/collections9.py +9 -0
  46. pythonlings/curriculum/checks/comprehensions/comprehensions1.py +3 -0
  47. pythonlings/curriculum/checks/comprehensions/comprehensions10.py +5 -0
  48. pythonlings/curriculum/checks/comprehensions/comprehensions2.py +3 -0
  49. pythonlings/curriculum/checks/comprehensions/comprehensions3.py +3 -0
  50. pythonlings/curriculum/checks/comprehensions/comprehensions4.py +6 -0
  51. pythonlings/curriculum/checks/comprehensions/comprehensions5.py +3 -0
  52. pythonlings/curriculum/checks/comprehensions/comprehensions6.py +3 -0
  53. pythonlings/curriculum/checks/comprehensions/comprehensions7.py +4 -0
  54. pythonlings/curriculum/checks/comprehensions/comprehensions8.py +5 -0
  55. pythonlings/curriculum/checks/comprehensions/comprehensions9.py +3 -0
  56. pythonlings/curriculum/checks/conditionals/conditionals1.py +2 -0
  57. pythonlings/curriculum/checks/conditionals/conditionals10.py +10 -0
  58. pythonlings/curriculum/checks/conditionals/conditionals2.py +5 -0
  59. pythonlings/curriculum/checks/conditionals/conditionals3.py +9 -0
  60. pythonlings/curriculum/checks/conditionals/conditionals4.py +7 -0
  61. pythonlings/curriculum/checks/conditionals/conditionals5.py +9 -0
  62. pythonlings/curriculum/checks/conditionals/conditionals6.py +7 -0
  63. pythonlings/curriculum/checks/conditionals/conditionals7.py +7 -0
  64. pythonlings/curriculum/checks/conditionals/conditionals8.py +9 -0
  65. pythonlings/curriculum/checks/conditionals/conditionals9.py +7 -0
  66. pythonlings/curriculum/checks/context_managers/context_managers1.py +15 -0
  67. pythonlings/curriculum/checks/context_managers/context_managers2.py +10 -0
  68. pythonlings/curriculum/checks/context_managers/context_managers3.py +2 -0
  69. pythonlings/curriculum/checks/context_managers/context_managers4.py +3 -0
  70. pythonlings/curriculum/checks/context_managers/context_managers5.py +5 -0
  71. pythonlings/curriculum/checks/context_managers/context_managers6.py +4 -0
  72. pythonlings/curriculum/checks/context_managers/context_managers7.py +16 -0
  73. pythonlings/curriculum/checks/context_managers/context_managers8.py +15 -0
  74. pythonlings/curriculum/checks/dataclasses/dataclasses1.py +3 -0
  75. pythonlings/curriculum/checks/dataclasses/dataclasses2.py +5 -0
  76. pythonlings/curriculum/checks/dataclasses/dataclasses3.py +4 -0
  77. pythonlings/curriculum/checks/dataclasses/dataclasses4.py +3 -0
  78. pythonlings/curriculum/checks/dataclasses/dataclasses5.py +9 -0
  79. pythonlings/curriculum/checks/dataclasses/dataclasses6.py +6 -0
  80. pythonlings/curriculum/checks/dataclasses/dataclasses7.py +6 -0
  81. pythonlings/curriculum/checks/dataclasses/dataclasses8.py +5 -0
  82. pythonlings/curriculum/checks/datetime/datetime1.py +4 -0
  83. pythonlings/curriculum/checks/datetime/datetime2.py +4 -0
  84. pythonlings/curriculum/checks/datetime/datetime3.py +6 -0
  85. pythonlings/curriculum/checks/datetime/datetime4.py +2 -0
  86. pythonlings/curriculum/checks/datetime/datetime5.py +2 -0
  87. pythonlings/curriculum/checks/datetime/datetime6.py +2 -0
  88. pythonlings/curriculum/checks/datetime/datetime7.py +2 -0
  89. pythonlings/curriculum/checks/datetime/datetime8.py +5 -0
  90. pythonlings/curriculum/checks/decorators/decorators1.py +8 -0
  91. pythonlings/curriculum/checks/decorators/decorators10.py +12 -0
  92. pythonlings/curriculum/checks/decorators/decorators2.py +5 -0
  93. pythonlings/curriculum/checks/decorators/decorators3.py +4 -0
  94. pythonlings/curriculum/checks/decorators/decorators4.py +7 -0
  95. pythonlings/curriculum/checks/decorators/decorators5.py +5 -0
  96. pythonlings/curriculum/checks/decorators/decorators6.py +8 -0
  97. pythonlings/curriculum/checks/decorators/decorators7.py +12 -0
  98. pythonlings/curriculum/checks/decorators/decorators8.py +20 -0
  99. pythonlings/curriculum/checks/decorators/decorators9.py +4 -0
  100. pythonlings/curriculum/checks/dictionaries/dictionaries1.py +3 -0
  101. pythonlings/curriculum/checks/dictionaries/dictionaries10.py +5 -0
  102. pythonlings/curriculum/checks/dictionaries/dictionaries2.py +2 -0
  103. pythonlings/curriculum/checks/dictionaries/dictionaries3.py +5 -0
  104. pythonlings/curriculum/checks/dictionaries/dictionaries4.py +5 -0
  105. pythonlings/curriculum/checks/dictionaries/dictionaries5.py +11 -0
  106. pythonlings/curriculum/checks/dictionaries/dictionaries6.py +4 -0
  107. pythonlings/curriculum/checks/dictionaries/dictionaries7.py +5 -0
  108. pythonlings/curriculum/checks/dictionaries/dictionaries8.py +4 -0
  109. pythonlings/curriculum/checks/dictionaries/dictionaries9.py +4 -0
  110. pythonlings/curriculum/checks/enums/enums1.py +4 -0
  111. pythonlings/curriculum/checks/enums/enums2.py +3 -0
  112. pythonlings/curriculum/checks/enums/enums3.py +3 -0
  113. pythonlings/curriculum/checks/enums/enums4.py +2 -0
  114. pythonlings/curriculum/checks/enums/enums5.py +4 -0
  115. pythonlings/curriculum/checks/enums/enums6.py +3 -0
  116. pythonlings/curriculum/checks/exceptions/exceptions1.py +4 -0
  117. pythonlings/curriculum/checks/exceptions/exceptions10.py +39 -0
  118. pythonlings/curriculum/checks/exceptions/exceptions2.py +5 -0
  119. pythonlings/curriculum/checks/exceptions/exceptions3.py +8 -0
  120. pythonlings/curriculum/checks/exceptions/exceptions4.py +5 -0
  121. pythonlings/curriculum/checks/exceptions/exceptions5.py +10 -0
  122. pythonlings/curriculum/checks/exceptions/exceptions6.py +17 -0
  123. pythonlings/curriculum/checks/exceptions/exceptions7.py +15 -0
  124. pythonlings/curriculum/checks/exceptions/exceptions8.py +6 -0
  125. pythonlings/curriculum/checks/exceptions/exceptions9.py +16 -0
  126. pythonlings/curriculum/checks/file_io/file_io1.py +15 -0
  127. pythonlings/curriculum/checks/file_io/file_io10.py +16 -0
  128. pythonlings/curriculum/checks/file_io/file_io2.py +10 -0
  129. pythonlings/curriculum/checks/file_io/file_io3.py +15 -0
  130. pythonlings/curriculum/checks/file_io/file_io4.py +14 -0
  131. pythonlings/curriculum/checks/file_io/file_io5.py +15 -0
  132. pythonlings/curriculum/checks/file_io/file_io6.py +10 -0
  133. pythonlings/curriculum/checks/file_io/file_io7.py +15 -0
  134. pythonlings/curriculum/checks/file_io/file_io8.py +12 -0
  135. pythonlings/curriculum/checks/file_io/file_io9.py +10 -0
  136. pythonlings/curriculum/checks/functional/functional1.py +4 -0
  137. pythonlings/curriculum/checks/functional/functional10.py +7 -0
  138. pythonlings/curriculum/checks/functional/functional2.py +5 -0
  139. pythonlings/curriculum/checks/functional/functional3.py +3 -0
  140. pythonlings/curriculum/checks/functional/functional4.py +4 -0
  141. pythonlings/curriculum/checks/functional/functional5.py +6 -0
  142. pythonlings/curriculum/checks/functional/functional6.py +8 -0
  143. pythonlings/curriculum/checks/functional/functional7.py +8 -0
  144. pythonlings/curriculum/checks/functional/functional8.py +7 -0
  145. pythonlings/curriculum/checks/functional/functional9.py +8 -0
  146. pythonlings/curriculum/checks/functions/functions1.py +9 -0
  147. pythonlings/curriculum/checks/functions/functions10.py +12 -0
  148. pythonlings/curriculum/checks/functions/functions2.py +4 -0
  149. pythonlings/curriculum/checks/functions/functions3.py +6 -0
  150. pythonlings/curriculum/checks/functions/functions4.py +6 -0
  151. pythonlings/curriculum/checks/functions/functions5.py +6 -0
  152. pythonlings/curriculum/checks/functions/functions6.py +8 -0
  153. pythonlings/curriculum/checks/functions/functions7.py +7 -0
  154. pythonlings/curriculum/checks/functions/functions8.py +6 -0
  155. pythonlings/curriculum/checks/functions/functions9.py +7 -0
  156. pythonlings/curriculum/checks/generators/generators1.py +4 -0
  157. pythonlings/curriculum/checks/generators/generators10.py +7 -0
  158. pythonlings/curriculum/checks/generators/generators2.py +3 -0
  159. pythonlings/curriculum/checks/generators/generators3.py +4 -0
  160. pythonlings/curriculum/checks/generators/generators4.py +9 -0
  161. pythonlings/curriculum/checks/generators/generators5.py +10 -0
  162. pythonlings/curriculum/checks/generators/generators6.py +8 -0
  163. pythonlings/curriculum/checks/generators/generators7.py +11 -0
  164. pythonlings/curriculum/checks/generators/generators8.py +8 -0
  165. pythonlings/curriculum/checks/generators/generators9.py +13 -0
  166. pythonlings/curriculum/checks/itertools/itertools1.py +2 -0
  167. pythonlings/curriculum/checks/itertools/itertools2.py +2 -0
  168. pythonlings/curriculum/checks/itertools/itertools3.py +2 -0
  169. pythonlings/curriculum/checks/itertools/itertools4.py +2 -0
  170. pythonlings/curriculum/checks/itertools/itertools5.py +2 -0
  171. pythonlings/curriculum/checks/itertools/itertools6.py +2 -0
  172. pythonlings/curriculum/checks/itertools/itertools7.py +2 -0
  173. pythonlings/curriculum/checks/itertools/itertools8.py +3 -0
  174. pythonlings/curriculum/checks/json/json1.py +3 -0
  175. pythonlings/curriculum/checks/json/json2.py +2 -0
  176. pythonlings/curriculum/checks/json/json3.py +2 -0
  177. pythonlings/curriculum/checks/json/json4.py +2 -0
  178. pythonlings/curriculum/checks/json/json5.py +2 -0
  179. pythonlings/curriculum/checks/json/json6.py +2 -0
  180. pythonlings/curriculum/checks/json/json7.py +3 -0
  181. pythonlings/curriculum/checks/json/json8.py +4 -0
  182. pythonlings/curriculum/checks/lists/lists1.py +2 -0
  183. pythonlings/curriculum/checks/lists/lists10.py +5 -0
  184. pythonlings/curriculum/checks/lists/lists2.py +3 -0
  185. pythonlings/curriculum/checks/lists/lists3.py +4 -0
  186. pythonlings/curriculum/checks/lists/lists4.py +3 -0
  187. pythonlings/curriculum/checks/lists/lists5.py +4 -0
  188. pythonlings/curriculum/checks/lists/lists6.py +3 -0
  189. pythonlings/curriculum/checks/lists/lists7.py +4 -0
  190. pythonlings/curriculum/checks/lists/lists8.py +7 -0
  191. pythonlings/curriculum/checks/lists/lists9.py +4 -0
  192. pythonlings/curriculum/checks/loops/loops1.py +2 -0
  193. pythonlings/curriculum/checks/loops/loops10.py +6 -0
  194. pythonlings/curriculum/checks/loops/loops2.py +2 -0
  195. pythonlings/curriculum/checks/loops/loops3.py +2 -0
  196. pythonlings/curriculum/checks/loops/loops4.py +3 -0
  197. pythonlings/curriculum/checks/loops/loops5.py +2 -0
  198. pythonlings/curriculum/checks/loops/loops6.py +2 -0
  199. pythonlings/curriculum/checks/loops/loops7.py +2 -0
  200. pythonlings/curriculum/checks/loops/loops8.py +2 -0
  201. pythonlings/curriculum/checks/loops/loops9.py +3 -0
  202. pythonlings/curriculum/checks/modules/modules1.py +2 -0
  203. pythonlings/curriculum/checks/modules/modules2.py +2 -0
  204. pythonlings/curriculum/checks/modules/modules3.py +5 -0
  205. pythonlings/curriculum/checks/modules/modules4.py +8 -0
  206. pythonlings/curriculum/checks/modules/modules5.py +7 -0
  207. pythonlings/curriculum/checks/modules/modules6.py +4 -0
  208. pythonlings/curriculum/checks/modules/modules7.py +4 -0
  209. pythonlings/curriculum/checks/modules/modules8.py +15 -0
  210. pythonlings/curriculum/checks/oop_advanced/oop_advanced1.py +4 -0
  211. pythonlings/curriculum/checks/oop_advanced/oop_advanced10.py +3 -0
  212. pythonlings/curriculum/checks/oop_advanced/oop_advanced11.py +3 -0
  213. pythonlings/curriculum/checks/oop_advanced/oop_advanced12.py +4 -0
  214. pythonlings/curriculum/checks/oop_advanced/oop_advanced2.py +4 -0
  215. pythonlings/curriculum/checks/oop_advanced/oop_advanced3.py +3 -0
  216. pythonlings/curriculum/checks/oop_advanced/oop_advanced4.py +3 -0
  217. pythonlings/curriculum/checks/oop_advanced/oop_advanced5.py +3 -0
  218. pythonlings/curriculum/checks/oop_advanced/oop_advanced6.py +2 -0
  219. pythonlings/curriculum/checks/oop_advanced/oop_advanced7.py +3 -0
  220. pythonlings/curriculum/checks/oop_advanced/oop_advanced8.py +3 -0
  221. pythonlings/curriculum/checks/oop_advanced/oop_advanced9.py +4 -0
  222. pythonlings/curriculum/checks/pathlib/pathlib1.py +5 -0
  223. pythonlings/curriculum/checks/pathlib/pathlib2.py +4 -0
  224. pythonlings/curriculum/checks/pathlib/pathlib3.py +6 -0
  225. pythonlings/curriculum/checks/pathlib/pathlib4.py +4 -0
  226. pythonlings/curriculum/checks/pathlib/pathlib5.py +4 -0
  227. pythonlings/curriculum/checks/pathlib/pathlib6.py +5 -0
  228. pythonlings/curriculum/checks/recursion/recursion1.py +5 -0
  229. pythonlings/curriculum/checks/recursion/recursion2.py +5 -0
  230. pythonlings/curriculum/checks/recursion/recursion3.py +6 -0
  231. pythonlings/curriculum/checks/recursion/recursion4.py +6 -0
  232. pythonlings/curriculum/checks/recursion/recursion5.py +7 -0
  233. pythonlings/curriculum/checks/recursion/recursion6.py +7 -0
  234. pythonlings/curriculum/checks/recursion/recursion7.py +7 -0
  235. pythonlings/curriculum/checks/recursion/recursion8.py +15 -0
  236. pythonlings/curriculum/checks/regex/regex1.py +3 -0
  237. pythonlings/curriculum/checks/regex/regex10.py +17 -0
  238. pythonlings/curriculum/checks/regex/regex2.py +3 -0
  239. pythonlings/curriculum/checks/regex/regex3.py +2 -0
  240. pythonlings/curriculum/checks/regex/regex4.py +4 -0
  241. pythonlings/curriculum/checks/regex/regex5.py +4 -0
  242. pythonlings/curriculum/checks/regex/regex6.py +6 -0
  243. pythonlings/curriculum/checks/regex/regex7.py +5 -0
  244. pythonlings/curriculum/checks/regex/regex8.py +6 -0
  245. pythonlings/curriculum/checks/regex/regex9.py +8 -0
  246. pythonlings/curriculum/checks/sets/sets1.py +3 -0
  247. pythonlings/curriculum/checks/sets/sets10.py +15 -0
  248. pythonlings/curriculum/checks/sets/sets2.py +5 -0
  249. pythonlings/curriculum/checks/sets/sets3.py +5 -0
  250. pythonlings/curriculum/checks/sets/sets4.py +3 -0
  251. pythonlings/curriculum/checks/sets/sets5.py +3 -0
  252. pythonlings/curriculum/checks/sets/sets6.py +3 -0
  253. pythonlings/curriculum/checks/sets/sets7.py +5 -0
  254. pythonlings/curriculum/checks/sets/sets8.py +5 -0
  255. pythonlings/curriculum/checks/sets/sets9.py +3 -0
  256. pythonlings/curriculum/checks/strings/strings1.py +3 -0
  257. pythonlings/curriculum/checks/strings/strings10.py +5 -0
  258. pythonlings/curriculum/checks/strings/strings2.py +3 -0
  259. pythonlings/curriculum/checks/strings/strings3.py +3 -0
  260. pythonlings/curriculum/checks/strings/strings4.py +2 -0
  261. pythonlings/curriculum/checks/strings/strings5.py +4 -0
  262. pythonlings/curriculum/checks/strings/strings6.py +3 -0
  263. pythonlings/curriculum/checks/strings/strings7.py +3 -0
  264. pythonlings/curriculum/checks/strings/strings8.py +3 -0
  265. pythonlings/curriculum/checks/strings/strings9.py +3 -0
  266. pythonlings/curriculum/checks/testing/testing1.py +2 -0
  267. pythonlings/curriculum/checks/testing/testing10.py +9 -0
  268. pythonlings/curriculum/checks/testing/testing11.py +7 -0
  269. pythonlings/curriculum/checks/testing/testing12.py +19 -0
  270. pythonlings/curriculum/checks/testing/testing2.py +2 -0
  271. pythonlings/curriculum/checks/testing/testing3.py +12 -0
  272. pythonlings/curriculum/checks/testing/testing4.py +6 -0
  273. pythonlings/curriculum/checks/testing/testing5.py +6 -0
  274. pythonlings/curriculum/checks/testing/testing6.py +14 -0
  275. pythonlings/curriculum/checks/testing/testing7.py +14 -0
  276. pythonlings/curriculum/checks/testing/testing8.py +27 -0
  277. pythonlings/curriculum/checks/testing/testing9.py +14 -0
  278. pythonlings/curriculum/checks/tuples/tuples1.py +3 -0
  279. pythonlings/curriculum/checks/tuples/tuples10.py +6 -0
  280. pythonlings/curriculum/checks/tuples/tuples2.py +3 -0
  281. pythonlings/curriculum/checks/tuples/tuples3.py +4 -0
  282. pythonlings/curriculum/checks/tuples/tuples4.py +3 -0
  283. pythonlings/curriculum/checks/tuples/tuples5.py +4 -0
  284. pythonlings/curriculum/checks/tuples/tuples6.py +5 -0
  285. pythonlings/curriculum/checks/tuples/tuples7.py +3 -0
  286. pythonlings/curriculum/checks/tuples/tuples8.py +4 -0
  287. pythonlings/curriculum/checks/tuples/tuples9.py +5 -0
  288. pythonlings/curriculum/checks/type_hints/type_hints1.py +3 -0
  289. pythonlings/curriculum/checks/type_hints/type_hints2.py +5 -0
  290. pythonlings/curriculum/checks/type_hints/type_hints3.py +5 -0
  291. pythonlings/curriculum/checks/type_hints/type_hints4.py +5 -0
  292. pythonlings/curriculum/checks/type_hints/type_hints5.py +6 -0
  293. pythonlings/curriculum/checks/type_hints/type_hints6.py +7 -0
  294. pythonlings/curriculum/checks/type_hints/type_hints7.py +9 -0
  295. pythonlings/curriculum/checks/type_hints/type_hints8.py +9 -0
  296. pythonlings/curriculum/checks/variables/variables1.py +7 -0
  297. pythonlings/curriculum/checks/variables/variables10.py +4 -0
  298. pythonlings/curriculum/checks/variables/variables2.py +19 -0
  299. pythonlings/curriculum/checks/variables/variables3.py +4 -0
  300. pythonlings/curriculum/checks/variables/variables4.py +2 -0
  301. pythonlings/curriculum/checks/variables/variables5.py +2 -0
  302. pythonlings/curriculum/checks/variables/variables6.py +4 -0
  303. pythonlings/curriculum/checks/variables/variables7.py +3 -0
  304. pythonlings/curriculum/checks/variables/variables8.py +4 -0
  305. pythonlings/curriculum/checks/variables/variables9.py +3 -0
  306. pythonlings/curriculum/exercises/async/async1.py +7 -0
  307. pythonlings/curriculum/exercises/async/async10.py +14 -0
  308. pythonlings/curriculum/exercises/async/async2.py +10 -0
  309. pythonlings/curriculum/exercises/async/async3.py +10 -0
  310. pythonlings/curriculum/exercises/async/async4.py +15 -0
  311. pythonlings/curriculum/exercises/async/async5.py +13 -0
  312. pythonlings/curriculum/exercises/async/async6.py +14 -0
  313. pythonlings/curriculum/exercises/async/async7.py +13 -0
  314. pythonlings/curriculum/exercises/async/async8.py +11 -0
  315. pythonlings/curriculum/exercises/async/async9.py +13 -0
  316. pythonlings/curriculum/exercises/classes/classes1.py +13 -0
  317. pythonlings/curriculum/exercises/classes/classes10.py +22 -0
  318. pythonlings/curriculum/exercises/classes/classes11.py +24 -0
  319. pythonlings/curriculum/exercises/classes/classes12.py +33 -0
  320. pythonlings/curriculum/exercises/classes/classes2.py +13 -0
  321. pythonlings/curriculum/exercises/classes/classes3.py +13 -0
  322. pythonlings/curriculum/exercises/classes/classes4.py +16 -0
  323. pythonlings/curriculum/exercises/classes/classes5.py +18 -0
  324. pythonlings/curriculum/exercises/classes/classes6.py +15 -0
  325. pythonlings/curriculum/exercises/classes/classes7.py +18 -0
  326. pythonlings/curriculum/exercises/classes/classes8.py +14 -0
  327. pythonlings/curriculum/exercises/classes/classes9.py +18 -0
  328. pythonlings/curriculum/exercises/collections/collections1.py +11 -0
  329. pythonlings/curriculum/exercises/collections/collections10.py +37 -0
  330. pythonlings/curriculum/exercises/collections/collections2.py +18 -0
  331. pythonlings/curriculum/exercises/collections/collections3.py +17 -0
  332. pythonlings/curriculum/exercises/collections/collections4.py +26 -0
  333. pythonlings/curriculum/exercises/collections/collections5.py +14 -0
  334. pythonlings/curriculum/exercises/collections/collections6.py +18 -0
  335. pythonlings/curriculum/exercises/collections/collections7.py +20 -0
  336. pythonlings/curriculum/exercises/collections/collections8.py +23 -0
  337. pythonlings/curriculum/exercises/collections/collections9.py +21 -0
  338. pythonlings/curriculum/exercises/comprehensions/comprehensions1.py +10 -0
  339. pythonlings/curriculum/exercises/comprehensions/comprehensions10.py +15 -0
  340. pythonlings/curriculum/exercises/comprehensions/comprehensions2.py +12 -0
  341. pythonlings/curriculum/exercises/comprehensions/comprehensions3.py +12 -0
  342. pythonlings/curriculum/exercises/comprehensions/comprehensions4.py +14 -0
  343. pythonlings/curriculum/exercises/comprehensions/comprehensions5.py +12 -0
  344. pythonlings/curriculum/exercises/comprehensions/comprehensions6.py +12 -0
  345. pythonlings/curriculum/exercises/comprehensions/comprehensions7.py +12 -0
  346. pythonlings/curriculum/exercises/comprehensions/comprehensions8.py +15 -0
  347. pythonlings/curriculum/exercises/comprehensions/comprehensions9.py +13 -0
  348. pythonlings/curriculum/exercises/conditionals/conditionals1.py +15 -0
  349. pythonlings/curriculum/exercises/conditionals/conditionals10.py +18 -0
  350. pythonlings/curriculum/exercises/conditionals/conditionals2.py +13 -0
  351. pythonlings/curriculum/exercises/conditionals/conditionals3.py +18 -0
  352. pythonlings/curriculum/exercises/conditionals/conditionals4.py +20 -0
  353. pythonlings/curriculum/exercises/conditionals/conditionals5.py +17 -0
  354. pythonlings/curriculum/exercises/conditionals/conditionals6.py +15 -0
  355. pythonlings/curriculum/exercises/conditionals/conditionals7.py +18 -0
  356. pythonlings/curriculum/exercises/conditionals/conditionals8.py +20 -0
  357. pythonlings/curriculum/exercises/conditionals/conditionals9.py +12 -0
  358. pythonlings/curriculum/exercises/context_managers/context_managers1.py +18 -0
  359. pythonlings/curriculum/exercises/context_managers/context_managers2.py +19 -0
  360. pythonlings/curriculum/exercises/context_managers/context_managers3.py +24 -0
  361. pythonlings/curriculum/exercises/context_managers/context_managers4.py +30 -0
  362. pythonlings/curriculum/exercises/context_managers/context_managers5.py +30 -0
  363. pythonlings/curriculum/exercises/context_managers/context_managers6.py +26 -0
  364. pythonlings/curriculum/exercises/context_managers/context_managers7.py +30 -0
  365. pythonlings/curriculum/exercises/context_managers/context_managers8.py +45 -0
  366. pythonlings/curriculum/exercises/dataclasses/dataclasses1.py +14 -0
  367. pythonlings/curriculum/exercises/dataclasses/dataclasses2.py +23 -0
  368. pythonlings/curriculum/exercises/dataclasses/dataclasses3.py +21 -0
  369. pythonlings/curriculum/exercises/dataclasses/dataclasses4.py +25 -0
  370. pythonlings/curriculum/exercises/dataclasses/dataclasses5.py +25 -0
  371. pythonlings/curriculum/exercises/dataclasses/dataclasses6.py +21 -0
  372. pythonlings/curriculum/exercises/dataclasses/dataclasses7.py +27 -0
  373. pythonlings/curriculum/exercises/dataclasses/dataclasses8.py +30 -0
  374. pythonlings/curriculum/exercises/datetime/datetime1.py +8 -0
  375. pythonlings/curriculum/exercises/datetime/datetime2.py +9 -0
  376. pythonlings/curriculum/exercises/datetime/datetime3.py +9 -0
  377. pythonlings/curriculum/exercises/datetime/datetime4.py +9 -0
  378. pythonlings/curriculum/exercises/datetime/datetime5.py +10 -0
  379. pythonlings/curriculum/exercises/datetime/datetime6.py +10 -0
  380. pythonlings/curriculum/exercises/datetime/datetime7.py +10 -0
  381. pythonlings/curriculum/exercises/datetime/datetime8.py +11 -0
  382. pythonlings/curriculum/exercises/decorators/decorators1.py +19 -0
  383. pythonlings/curriculum/exercises/decorators/decorators10.py +32 -0
  384. pythonlings/curriculum/exercises/decorators/decorators2.py +22 -0
  385. pythonlings/curriculum/exercises/decorators/decorators3.py +18 -0
  386. pythonlings/curriculum/exercises/decorators/decorators4.py +24 -0
  387. pythonlings/curriculum/exercises/decorators/decorators5.py +25 -0
  388. pythonlings/curriculum/exercises/decorators/decorators6.py +19 -0
  389. pythonlings/curriculum/exercises/decorators/decorators7.py +25 -0
  390. pythonlings/curriculum/exercises/decorators/decorators8.py +25 -0
  391. pythonlings/curriculum/exercises/decorators/decorators9.py +26 -0
  392. pythonlings/curriculum/exercises/dictionaries/dictionaries1.py +6 -0
  393. pythonlings/curriculum/exercises/dictionaries/dictionaries10.py +17 -0
  394. pythonlings/curriculum/exercises/dictionaries/dictionaries2.py +9 -0
  395. pythonlings/curriculum/exercises/dictionaries/dictionaries3.py +16 -0
  396. pythonlings/curriculum/exercises/dictionaries/dictionaries4.py +15 -0
  397. pythonlings/curriculum/exercises/dictionaries/dictionaries5.py +15 -0
  398. pythonlings/curriculum/exercises/dictionaries/dictionaries6.py +18 -0
  399. pythonlings/curriculum/exercises/dictionaries/dictionaries7.py +17 -0
  400. pythonlings/curriculum/exercises/dictionaries/dictionaries8.py +17 -0
  401. pythonlings/curriculum/exercises/dictionaries/dictionaries9.py +25 -0
  402. pythonlings/curriculum/exercises/enums/enums1.py +12 -0
  403. pythonlings/curriculum/exercises/enums/enums2.py +11 -0
  404. pythonlings/curriculum/exercises/enums/enums3.py +14 -0
  405. pythonlings/curriculum/exercises/enums/enums4.py +13 -0
  406. pythonlings/curriculum/exercises/enums/enums5.py +14 -0
  407. pythonlings/curriculum/exercises/enums/enums6.py +15 -0
  408. pythonlings/curriculum/exercises/exceptions/exceptions1.py +15 -0
  409. pythonlings/curriculum/exercises/exceptions/exceptions10.py +19 -0
  410. pythonlings/curriculum/exercises/exceptions/exceptions2.py +12 -0
  411. pythonlings/curriculum/exercises/exceptions/exceptions3.py +13 -0
  412. pythonlings/curriculum/exercises/exceptions/exceptions4.py +17 -0
  413. pythonlings/curriculum/exercises/exceptions/exceptions5.py +20 -0
  414. pythonlings/curriculum/exercises/exceptions/exceptions6.py +13 -0
  415. pythonlings/curriculum/exercises/exceptions/exceptions7.py +15 -0
  416. pythonlings/curriculum/exercises/exceptions/exceptions8.py +17 -0
  417. pythonlings/curriculum/exercises/exceptions/exceptions9.py +20 -0
  418. pythonlings/curriculum/exercises/file_io/file_io1.py +18 -0
  419. pythonlings/curriculum/exercises/file_io/file_io10.py +25 -0
  420. pythonlings/curriculum/exercises/file_io/file_io2.py +16 -0
  421. pythonlings/curriculum/exercises/file_io/file_io3.py +18 -0
  422. pythonlings/curriculum/exercises/file_io/file_io4.py +21 -0
  423. pythonlings/curriculum/exercises/file_io/file_io5.py +19 -0
  424. pythonlings/curriculum/exercises/file_io/file_io6.py +22 -0
  425. pythonlings/curriculum/exercises/file_io/file_io7.py +20 -0
  426. pythonlings/curriculum/exercises/file_io/file_io8.py +18 -0
  427. pythonlings/curriculum/exercises/file_io/file_io9.py +19 -0
  428. pythonlings/curriculum/exercises/functional/functional1.py +7 -0
  429. pythonlings/curriculum/exercises/functional/functional10.py +19 -0
  430. pythonlings/curriculum/exercises/functional/functional2.py +8 -0
  431. pythonlings/curriculum/exercises/functional/functional3.py +11 -0
  432. pythonlings/curriculum/exercises/functional/functional4.py +11 -0
  433. pythonlings/curriculum/exercises/functional/functional5.py +11 -0
  434. pythonlings/curriculum/exercises/functional/functional6.py +14 -0
  435. pythonlings/curriculum/exercises/functional/functional7.py +12 -0
  436. pythonlings/curriculum/exercises/functional/functional8.py +13 -0
  437. pythonlings/curriculum/exercises/functional/functional9.py +15 -0
  438. pythonlings/curriculum/exercises/functions/functions1.py +8 -0
  439. pythonlings/curriculum/exercises/functions/functions10.py +19 -0
  440. pythonlings/curriculum/exercises/functions/functions2.py +9 -0
  441. pythonlings/curriculum/exercises/functions/functions3.py +8 -0
  442. pythonlings/curriculum/exercises/functions/functions4.py +8 -0
  443. pythonlings/curriculum/exercises/functions/functions5.py +11 -0
  444. pythonlings/curriculum/exercises/functions/functions6.py +16 -0
  445. pythonlings/curriculum/exercises/functions/functions7.py +11 -0
  446. pythonlings/curriculum/exercises/functions/functions8.py +10 -0
  447. pythonlings/curriculum/exercises/functions/functions9.py +16 -0
  448. pythonlings/curriculum/exercises/generators/generators1.py +13 -0
  449. pythonlings/curriculum/exercises/generators/generators10.py +16 -0
  450. pythonlings/curriculum/exercises/generators/generators2.py +17 -0
  451. pythonlings/curriculum/exercises/generators/generators3.py +19 -0
  452. pythonlings/curriculum/exercises/generators/generators4.py +12 -0
  453. pythonlings/curriculum/exercises/generators/generators5.py +24 -0
  454. pythonlings/curriculum/exercises/generators/generators6.py +20 -0
  455. pythonlings/curriculum/exercises/generators/generators7.py +14 -0
  456. pythonlings/curriculum/exercises/generators/generators8.py +17 -0
  457. pythonlings/curriculum/exercises/generators/generators9.py +26 -0
  458. pythonlings/curriculum/exercises/itertools/itertools1.py +10 -0
  459. pythonlings/curriculum/exercises/itertools/itertools2.py +8 -0
  460. pythonlings/curriculum/exercises/itertools/itertools3.py +10 -0
  461. pythonlings/curriculum/exercises/itertools/itertools4.py +12 -0
  462. pythonlings/curriculum/exercises/itertools/itertools5.py +9 -0
  463. pythonlings/curriculum/exercises/itertools/itertools6.py +9 -0
  464. pythonlings/curriculum/exercises/itertools/itertools7.py +10 -0
  465. pythonlings/curriculum/exercises/itertools/itertools8.py +18 -0
  466. pythonlings/curriculum/exercises/json/json1.py +10 -0
  467. pythonlings/curriculum/exercises/json/json2.py +9 -0
  468. pythonlings/curriculum/exercises/json/json3.py +10 -0
  469. pythonlings/curriculum/exercises/json/json4.py +13 -0
  470. pythonlings/curriculum/exercises/json/json5.py +9 -0
  471. pythonlings/curriculum/exercises/json/json6.py +10 -0
  472. pythonlings/curriculum/exercises/json/json7.py +10 -0
  473. pythonlings/curriculum/exercises/json/json8.py +12 -0
  474. pythonlings/curriculum/exercises/lists/lists1.py +7 -0
  475. pythonlings/curriculum/exercises/lists/lists10.py +28 -0
  476. pythonlings/curriculum/exercises/lists/lists2.py +13 -0
  477. pythonlings/curriculum/exercises/lists/lists3.py +16 -0
  478. pythonlings/curriculum/exercises/lists/lists4.py +16 -0
  479. pythonlings/curriculum/exercises/lists/lists5.py +16 -0
  480. pythonlings/curriculum/exercises/lists/lists6.py +15 -0
  481. pythonlings/curriculum/exercises/lists/lists7.py +13 -0
  482. pythonlings/curriculum/exercises/lists/lists8.py +15 -0
  483. pythonlings/curriculum/exercises/lists/lists9.py +19 -0
  484. pythonlings/curriculum/exercises/loops/loops1.py +8 -0
  485. pythonlings/curriculum/exercises/loops/loops10.py +22 -0
  486. pythonlings/curriculum/exercises/loops/loops2.py +10 -0
  487. pythonlings/curriculum/exercises/loops/loops3.py +10 -0
  488. pythonlings/curriculum/exercises/loops/loops4.py +12 -0
  489. pythonlings/curriculum/exercises/loops/loops5.py +13 -0
  490. pythonlings/curriculum/exercises/loops/loops6.py +10 -0
  491. pythonlings/curriculum/exercises/loops/loops7.py +13 -0
  492. pythonlings/curriculum/exercises/loops/loops8.py +11 -0
  493. pythonlings/curriculum/exercises/loops/loops9.py +11 -0
  494. pythonlings/curriculum/exercises/modules/modules1.py +10 -0
  495. pythonlings/curriculum/exercises/modules/modules2.py +10 -0
  496. pythonlings/curriculum/exercises/modules/modules3.py +13 -0
  497. pythonlings/curriculum/exercises/modules/modules4.py +18 -0
  498. pythonlings/curriculum/exercises/modules/modules5.py +17 -0
  499. pythonlings/curriculum/exercises/modules/modules6.py +12 -0
  500. pythonlings/curriculum/exercises/modules/modules7.py +16 -0
  501. pythonlings/curriculum/exercises/modules/modules8.py +23 -0
  502. pythonlings/curriculum/exercises/oop_advanced/oop_advanced1.py +11 -0
  503. pythonlings/curriculum/exercises/oop_advanced/oop_advanced10.py +18 -0
  504. pythonlings/curriculum/exercises/oop_advanced/oop_advanced11.py +13 -0
  505. pythonlings/curriculum/exercises/oop_advanced/oop_advanced12.py +12 -0
  506. pythonlings/curriculum/exercises/oop_advanced/oop_advanced2.py +13 -0
  507. pythonlings/curriculum/exercises/oop_advanced/oop_advanced3.py +22 -0
  508. pythonlings/curriculum/exercises/oop_advanced/oop_advanced4.py +12 -0
  509. pythonlings/curriculum/exercises/oop_advanced/oop_advanced5.py +11 -0
  510. pythonlings/curriculum/exercises/oop_advanced/oop_advanced6.py +12 -0
  511. pythonlings/curriculum/exercises/oop_advanced/oop_advanced7.py +14 -0
  512. pythonlings/curriculum/exercises/oop_advanced/oop_advanced8.py +14 -0
  513. pythonlings/curriculum/exercises/oop_advanced/oop_advanced9.py +9 -0
  514. pythonlings/curriculum/exercises/pathlib/pathlib1.py +9 -0
  515. pythonlings/curriculum/exercises/pathlib/pathlib2.py +9 -0
  516. pythonlings/curriculum/exercises/pathlib/pathlib3.py +11 -0
  517. pythonlings/curriculum/exercises/pathlib/pathlib4.py +9 -0
  518. pythonlings/curriculum/exercises/pathlib/pathlib5.py +9 -0
  519. pythonlings/curriculum/exercises/pathlib/pathlib6.py +10 -0
  520. pythonlings/curriculum/exercises/recursion/recursion1.py +12 -0
  521. pythonlings/curriculum/exercises/recursion/recursion2.py +12 -0
  522. pythonlings/curriculum/exercises/recursion/recursion3.py +12 -0
  523. pythonlings/curriculum/exercises/recursion/recursion4.py +12 -0
  524. pythonlings/curriculum/exercises/recursion/recursion5.py +14 -0
  525. pythonlings/curriculum/exercises/recursion/recursion6.py +13 -0
  526. pythonlings/curriculum/exercises/recursion/recursion7.py +20 -0
  527. pythonlings/curriculum/exercises/recursion/recursion8.py +27 -0
  528. pythonlings/curriculum/exercises/regex/regex1.py +16 -0
  529. pythonlings/curriculum/exercises/regex/regex10.py +31 -0
  530. pythonlings/curriculum/exercises/regex/regex2.py +16 -0
  531. pythonlings/curriculum/exercises/regex/regex3.py +16 -0
  532. pythonlings/curriculum/exercises/regex/regex4.py +19 -0
  533. pythonlings/curriculum/exercises/regex/regex5.py +19 -0
  534. pythonlings/curriculum/exercises/regex/regex6.py +23 -0
  535. pythonlings/curriculum/exercises/regex/regex7.py +24 -0
  536. pythonlings/curriculum/exercises/regex/regex8.py +19 -0
  537. pythonlings/curriculum/exercises/regex/regex9.py +22 -0
  538. pythonlings/curriculum/exercises/sets/sets1.py +6 -0
  539. pythonlings/curriculum/exercises/sets/sets10.py +21 -0
  540. pythonlings/curriculum/exercises/sets/sets2.py +12 -0
  541. pythonlings/curriculum/exercises/sets/sets3.py +15 -0
  542. pythonlings/curriculum/exercises/sets/sets4.py +14 -0
  543. pythonlings/curriculum/exercises/sets/sets5.py +14 -0
  544. pythonlings/curriculum/exercises/sets/sets6.py +14 -0
  545. pythonlings/curriculum/exercises/sets/sets7.py +16 -0
  546. pythonlings/curriculum/exercises/sets/sets8.py +16 -0
  547. pythonlings/curriculum/exercises/sets/sets9.py +15 -0
  548. pythonlings/curriculum/exercises/strings/strings1.py +6 -0
  549. pythonlings/curriculum/exercises/strings/strings10.py +11 -0
  550. pythonlings/curriculum/exercises/strings/strings2.py +9 -0
  551. pythonlings/curriculum/exercises/strings/strings3.py +9 -0
  552. pythonlings/curriculum/exercises/strings/strings4.py +8 -0
  553. pythonlings/curriculum/exercises/strings/strings5.py +10 -0
  554. pythonlings/curriculum/exercises/strings/strings6.py +10 -0
  555. pythonlings/curriculum/exercises/strings/strings7.py +10 -0
  556. pythonlings/curriculum/exercises/strings/strings8.py +9 -0
  557. pythonlings/curriculum/exercises/strings/strings9.py +10 -0
  558. pythonlings/curriculum/exercises/testing/testing1.py +16 -0
  559. pythonlings/curriculum/exercises/testing/testing10.py +21 -0
  560. pythonlings/curriculum/exercises/testing/testing11.py +27 -0
  561. pythonlings/curriculum/exercises/testing/testing12.py +51 -0
  562. pythonlings/curriculum/exercises/testing/testing2.py +15 -0
  563. pythonlings/curriculum/exercises/testing/testing3.py +19 -0
  564. pythonlings/curriculum/exercises/testing/testing4.py +19 -0
  565. pythonlings/curriculum/exercises/testing/testing5.py +18 -0
  566. pythonlings/curriculum/exercises/testing/testing6.py +27 -0
  567. pythonlings/curriculum/exercises/testing/testing7.py +27 -0
  568. pythonlings/curriculum/exercises/testing/testing8.py +29 -0
  569. pythonlings/curriculum/exercises/testing/testing9.py +30 -0
  570. pythonlings/curriculum/exercises/tuples/tuples1.py +7 -0
  571. pythonlings/curriculum/exercises/tuples/tuples10.py +26 -0
  572. pythonlings/curriculum/exercises/tuples/tuples2.py +11 -0
  573. pythonlings/curriculum/exercises/tuples/tuples3.py +9 -0
  574. pythonlings/curriculum/exercises/tuples/tuples4.py +8 -0
  575. pythonlings/curriculum/exercises/tuples/tuples5.py +12 -0
  576. pythonlings/curriculum/exercises/tuples/tuples6.py +15 -0
  577. pythonlings/curriculum/exercises/tuples/tuples7.py +14 -0
  578. pythonlings/curriculum/exercises/tuples/tuples8.py +13 -0
  579. pythonlings/curriculum/exercises/tuples/tuples9.py +18 -0
  580. pythonlings/curriculum/exercises/type_hints/type_hints1.py +9 -0
  581. pythonlings/curriculum/exercises/type_hints/type_hints2.py +13 -0
  582. pythonlings/curriculum/exercises/type_hints/type_hints3.py +13 -0
  583. pythonlings/curriculum/exercises/type_hints/type_hints4.py +21 -0
  584. pythonlings/curriculum/exercises/type_hints/type_hints5.py +15 -0
  585. pythonlings/curriculum/exercises/type_hints/type_hints6.py +16 -0
  586. pythonlings/curriculum/exercises/type_hints/type_hints7.py +19 -0
  587. pythonlings/curriculum/exercises/type_hints/type_hints8.py +27 -0
  588. pythonlings/curriculum/exercises/variables/variables1.py +10 -0
  589. pythonlings/curriculum/exercises/variables/variables10.py +14 -0
  590. pythonlings/curriculum/exercises/variables/variables2.py +11 -0
  591. pythonlings/curriculum/exercises/variables/variables3.py +11 -0
  592. pythonlings/curriculum/exercises/variables/variables4.py +9 -0
  593. pythonlings/curriculum/exercises/variables/variables5.py +11 -0
  594. pythonlings/curriculum/exercises/variables/variables6.py +9 -0
  595. pythonlings/curriculum/exercises/variables/variables7.py +10 -0
  596. pythonlings/curriculum/exercises/variables/variables8.py +12 -0
  597. pythonlings/curriculum/exercises/variables/variables9.py +10 -0
  598. pythonlings/curriculum/info.toml +1755 -0
  599. pythonlings/curriculum/solutions/.keep +1 -0
  600. pythonlings/curriculum/solutions/_answers.py +1654 -0
  601. pythonlings/curriculum/solutions/async1.py +2 -0
  602. pythonlings/curriculum/solutions/async10.py +2 -0
  603. pythonlings/curriculum/solutions/async2.py +2 -0
  604. pythonlings/curriculum/solutions/async3.py +2 -0
  605. pythonlings/curriculum/solutions/async4.py +2 -0
  606. pythonlings/curriculum/solutions/async5.py +2 -0
  607. pythonlings/curriculum/solutions/async6.py +2 -0
  608. pythonlings/curriculum/solutions/async7.py +2 -0
  609. pythonlings/curriculum/solutions/async8.py +2 -0
  610. pythonlings/curriculum/solutions/async9.py +2 -0
  611. pythonlings/curriculum/solutions/classes1.py +2 -0
  612. pythonlings/curriculum/solutions/classes10.py +2 -0
  613. pythonlings/curriculum/solutions/classes11.py +2 -0
  614. pythonlings/curriculum/solutions/classes12.py +2 -0
  615. pythonlings/curriculum/solutions/classes2.py +2 -0
  616. pythonlings/curriculum/solutions/classes3.py +2 -0
  617. pythonlings/curriculum/solutions/classes4.py +2 -0
  618. pythonlings/curriculum/solutions/classes5.py +2 -0
  619. pythonlings/curriculum/solutions/classes6.py +2 -0
  620. pythonlings/curriculum/solutions/classes7.py +2 -0
  621. pythonlings/curriculum/solutions/classes8.py +2 -0
  622. pythonlings/curriculum/solutions/classes9.py +2 -0
  623. pythonlings/curriculum/solutions/collections1.py +2 -0
  624. pythonlings/curriculum/solutions/collections10.py +2 -0
  625. pythonlings/curriculum/solutions/collections2.py +2 -0
  626. pythonlings/curriculum/solutions/collections3.py +2 -0
  627. pythonlings/curriculum/solutions/collections4.py +2 -0
  628. pythonlings/curriculum/solutions/collections5.py +2 -0
  629. pythonlings/curriculum/solutions/collections6.py +2 -0
  630. pythonlings/curriculum/solutions/collections7.py +2 -0
  631. pythonlings/curriculum/solutions/collections8.py +2 -0
  632. pythonlings/curriculum/solutions/collections9.py +2 -0
  633. pythonlings/curriculum/solutions/comprehensions1.py +2 -0
  634. pythonlings/curriculum/solutions/comprehensions10.py +2 -0
  635. pythonlings/curriculum/solutions/comprehensions2.py +2 -0
  636. pythonlings/curriculum/solutions/comprehensions3.py +2 -0
  637. pythonlings/curriculum/solutions/comprehensions4.py +2 -0
  638. pythonlings/curriculum/solutions/comprehensions5.py +2 -0
  639. pythonlings/curriculum/solutions/comprehensions6.py +2 -0
  640. pythonlings/curriculum/solutions/comprehensions7.py +2 -0
  641. pythonlings/curriculum/solutions/comprehensions8.py +2 -0
  642. pythonlings/curriculum/solutions/comprehensions9.py +2 -0
  643. pythonlings/curriculum/solutions/conditionals1.py +2 -0
  644. pythonlings/curriculum/solutions/conditionals10.py +2 -0
  645. pythonlings/curriculum/solutions/conditionals2.py +2 -0
  646. pythonlings/curriculum/solutions/conditionals3.py +2 -0
  647. pythonlings/curriculum/solutions/conditionals4.py +2 -0
  648. pythonlings/curriculum/solutions/conditionals5.py +2 -0
  649. pythonlings/curriculum/solutions/conditionals6.py +2 -0
  650. pythonlings/curriculum/solutions/conditionals7.py +2 -0
  651. pythonlings/curriculum/solutions/conditionals8.py +2 -0
  652. pythonlings/curriculum/solutions/conditionals9.py +2 -0
  653. pythonlings/curriculum/solutions/context_managers1.py +2 -0
  654. pythonlings/curriculum/solutions/context_managers2.py +2 -0
  655. pythonlings/curriculum/solutions/context_managers3.py +2 -0
  656. pythonlings/curriculum/solutions/context_managers4.py +2 -0
  657. pythonlings/curriculum/solutions/context_managers5.py +2 -0
  658. pythonlings/curriculum/solutions/context_managers6.py +2 -0
  659. pythonlings/curriculum/solutions/context_managers7.py +2 -0
  660. pythonlings/curriculum/solutions/context_managers8.py +2 -0
  661. pythonlings/curriculum/solutions/dataclasses1.py +2 -0
  662. pythonlings/curriculum/solutions/dataclasses2.py +2 -0
  663. pythonlings/curriculum/solutions/dataclasses3.py +2 -0
  664. pythonlings/curriculum/solutions/dataclasses4.py +2 -0
  665. pythonlings/curriculum/solutions/dataclasses5.py +2 -0
  666. pythonlings/curriculum/solutions/dataclasses6.py +2 -0
  667. pythonlings/curriculum/solutions/dataclasses7.py +2 -0
  668. pythonlings/curriculum/solutions/dataclasses8.py +2 -0
  669. pythonlings/curriculum/solutions/datetime1.py +2 -0
  670. pythonlings/curriculum/solutions/datetime2.py +2 -0
  671. pythonlings/curriculum/solutions/datetime3.py +2 -0
  672. pythonlings/curriculum/solutions/datetime4.py +2 -0
  673. pythonlings/curriculum/solutions/datetime5.py +2 -0
  674. pythonlings/curriculum/solutions/datetime6.py +2 -0
  675. pythonlings/curriculum/solutions/datetime7.py +2 -0
  676. pythonlings/curriculum/solutions/datetime8.py +2 -0
  677. pythonlings/curriculum/solutions/decorators1.py +2 -0
  678. pythonlings/curriculum/solutions/decorators10.py +2 -0
  679. pythonlings/curriculum/solutions/decorators2.py +2 -0
  680. pythonlings/curriculum/solutions/decorators3.py +2 -0
  681. pythonlings/curriculum/solutions/decorators4.py +2 -0
  682. pythonlings/curriculum/solutions/decorators5.py +2 -0
  683. pythonlings/curriculum/solutions/decorators6.py +2 -0
  684. pythonlings/curriculum/solutions/decorators7.py +2 -0
  685. pythonlings/curriculum/solutions/decorators8.py +2 -0
  686. pythonlings/curriculum/solutions/decorators9.py +2 -0
  687. pythonlings/curriculum/solutions/dictionaries1.py +2 -0
  688. pythonlings/curriculum/solutions/dictionaries10.py +2 -0
  689. pythonlings/curriculum/solutions/dictionaries2.py +2 -0
  690. pythonlings/curriculum/solutions/dictionaries3.py +2 -0
  691. pythonlings/curriculum/solutions/dictionaries4.py +2 -0
  692. pythonlings/curriculum/solutions/dictionaries5.py +2 -0
  693. pythonlings/curriculum/solutions/dictionaries6.py +2 -0
  694. pythonlings/curriculum/solutions/dictionaries7.py +2 -0
  695. pythonlings/curriculum/solutions/dictionaries8.py +2 -0
  696. pythonlings/curriculum/solutions/dictionaries9.py +2 -0
  697. pythonlings/curriculum/solutions/enums1.py +2 -0
  698. pythonlings/curriculum/solutions/enums2.py +2 -0
  699. pythonlings/curriculum/solutions/enums3.py +2 -0
  700. pythonlings/curriculum/solutions/enums4.py +2 -0
  701. pythonlings/curriculum/solutions/enums5.py +2 -0
  702. pythonlings/curriculum/solutions/enums6.py +2 -0
  703. pythonlings/curriculum/solutions/exceptions1.py +2 -0
  704. pythonlings/curriculum/solutions/exceptions10.py +2 -0
  705. pythonlings/curriculum/solutions/exceptions2.py +2 -0
  706. pythonlings/curriculum/solutions/exceptions3.py +2 -0
  707. pythonlings/curriculum/solutions/exceptions4.py +2 -0
  708. pythonlings/curriculum/solutions/exceptions5.py +2 -0
  709. pythonlings/curriculum/solutions/exceptions6.py +2 -0
  710. pythonlings/curriculum/solutions/exceptions7.py +2 -0
  711. pythonlings/curriculum/solutions/exceptions8.py +2 -0
  712. pythonlings/curriculum/solutions/exceptions9.py +2 -0
  713. pythonlings/curriculum/solutions/file_io1.py +2 -0
  714. pythonlings/curriculum/solutions/file_io10.py +2 -0
  715. pythonlings/curriculum/solutions/file_io2.py +2 -0
  716. pythonlings/curriculum/solutions/file_io3.py +2 -0
  717. pythonlings/curriculum/solutions/file_io4.py +2 -0
  718. pythonlings/curriculum/solutions/file_io5.py +2 -0
  719. pythonlings/curriculum/solutions/file_io6.py +2 -0
  720. pythonlings/curriculum/solutions/file_io7.py +2 -0
  721. pythonlings/curriculum/solutions/file_io8.py +2 -0
  722. pythonlings/curriculum/solutions/file_io9.py +2 -0
  723. pythonlings/curriculum/solutions/functional1.py +2 -0
  724. pythonlings/curriculum/solutions/functional10.py +2 -0
  725. pythonlings/curriculum/solutions/functional2.py +2 -0
  726. pythonlings/curriculum/solutions/functional3.py +2 -0
  727. pythonlings/curriculum/solutions/functional4.py +2 -0
  728. pythonlings/curriculum/solutions/functional5.py +2 -0
  729. pythonlings/curriculum/solutions/functional6.py +2 -0
  730. pythonlings/curriculum/solutions/functional7.py +2 -0
  731. pythonlings/curriculum/solutions/functional8.py +2 -0
  732. pythonlings/curriculum/solutions/functional9.py +2 -0
  733. pythonlings/curriculum/solutions/functions1.py +2 -0
  734. pythonlings/curriculum/solutions/functions10.py +2 -0
  735. pythonlings/curriculum/solutions/functions2.py +2 -0
  736. pythonlings/curriculum/solutions/functions3.py +2 -0
  737. pythonlings/curriculum/solutions/functions4.py +2 -0
  738. pythonlings/curriculum/solutions/functions5.py +2 -0
  739. pythonlings/curriculum/solutions/functions6.py +2 -0
  740. pythonlings/curriculum/solutions/functions7.py +2 -0
  741. pythonlings/curriculum/solutions/functions8.py +2 -0
  742. pythonlings/curriculum/solutions/functions9.py +2 -0
  743. pythonlings/curriculum/solutions/generators1.py +2 -0
  744. pythonlings/curriculum/solutions/generators10.py +2 -0
  745. pythonlings/curriculum/solutions/generators2.py +2 -0
  746. pythonlings/curriculum/solutions/generators3.py +2 -0
  747. pythonlings/curriculum/solutions/generators4.py +2 -0
  748. pythonlings/curriculum/solutions/generators5.py +2 -0
  749. pythonlings/curriculum/solutions/generators6.py +2 -0
  750. pythonlings/curriculum/solutions/generators7.py +2 -0
  751. pythonlings/curriculum/solutions/generators8.py +2 -0
  752. pythonlings/curriculum/solutions/generators9.py +2 -0
  753. pythonlings/curriculum/solutions/itertools1.py +2 -0
  754. pythonlings/curriculum/solutions/itertools2.py +2 -0
  755. pythonlings/curriculum/solutions/itertools3.py +2 -0
  756. pythonlings/curriculum/solutions/itertools4.py +2 -0
  757. pythonlings/curriculum/solutions/itertools5.py +2 -0
  758. pythonlings/curriculum/solutions/itertools6.py +2 -0
  759. pythonlings/curriculum/solutions/itertools7.py +2 -0
  760. pythonlings/curriculum/solutions/itertools8.py +2 -0
  761. pythonlings/curriculum/solutions/json1.py +2 -0
  762. pythonlings/curriculum/solutions/json2.py +2 -0
  763. pythonlings/curriculum/solutions/json3.py +2 -0
  764. pythonlings/curriculum/solutions/json4.py +2 -0
  765. pythonlings/curriculum/solutions/json5.py +2 -0
  766. pythonlings/curriculum/solutions/json6.py +2 -0
  767. pythonlings/curriculum/solutions/json7.py +2 -0
  768. pythonlings/curriculum/solutions/json8.py +2 -0
  769. pythonlings/curriculum/solutions/lists1.py +2 -0
  770. pythonlings/curriculum/solutions/lists10.py +2 -0
  771. pythonlings/curriculum/solutions/lists2.py +2 -0
  772. pythonlings/curriculum/solutions/lists3.py +2 -0
  773. pythonlings/curriculum/solutions/lists4.py +2 -0
  774. pythonlings/curriculum/solutions/lists5.py +2 -0
  775. pythonlings/curriculum/solutions/lists6.py +2 -0
  776. pythonlings/curriculum/solutions/lists7.py +2 -0
  777. pythonlings/curriculum/solutions/lists8.py +2 -0
  778. pythonlings/curriculum/solutions/lists9.py +2 -0
  779. pythonlings/curriculum/solutions/loops1.py +2 -0
  780. pythonlings/curriculum/solutions/loops10.py +2 -0
  781. pythonlings/curriculum/solutions/loops2.py +2 -0
  782. pythonlings/curriculum/solutions/loops3.py +2 -0
  783. pythonlings/curriculum/solutions/loops4.py +2 -0
  784. pythonlings/curriculum/solutions/loops5.py +2 -0
  785. pythonlings/curriculum/solutions/loops6.py +2 -0
  786. pythonlings/curriculum/solutions/loops7.py +2 -0
  787. pythonlings/curriculum/solutions/loops8.py +2 -0
  788. pythonlings/curriculum/solutions/loops9.py +2 -0
  789. pythonlings/curriculum/solutions/modules1.py +2 -0
  790. pythonlings/curriculum/solutions/modules2.py +2 -0
  791. pythonlings/curriculum/solutions/modules3.py +2 -0
  792. pythonlings/curriculum/solutions/modules4.py +2 -0
  793. pythonlings/curriculum/solutions/modules5.py +2 -0
  794. pythonlings/curriculum/solutions/modules6.py +2 -0
  795. pythonlings/curriculum/solutions/modules7.py +2 -0
  796. pythonlings/curriculum/solutions/modules8.py +2 -0
  797. pythonlings/curriculum/solutions/oop_advanced1.py +2 -0
  798. pythonlings/curriculum/solutions/oop_advanced10.py +2 -0
  799. pythonlings/curriculum/solutions/oop_advanced11.py +2 -0
  800. pythonlings/curriculum/solutions/oop_advanced12.py +2 -0
  801. pythonlings/curriculum/solutions/oop_advanced2.py +2 -0
  802. pythonlings/curriculum/solutions/oop_advanced3.py +2 -0
  803. pythonlings/curriculum/solutions/oop_advanced4.py +2 -0
  804. pythonlings/curriculum/solutions/oop_advanced5.py +2 -0
  805. pythonlings/curriculum/solutions/oop_advanced6.py +2 -0
  806. pythonlings/curriculum/solutions/oop_advanced7.py +2 -0
  807. pythonlings/curriculum/solutions/oop_advanced8.py +2 -0
  808. pythonlings/curriculum/solutions/oop_advanced9.py +2 -0
  809. pythonlings/curriculum/solutions/pathlib1.py +2 -0
  810. pythonlings/curriculum/solutions/pathlib2.py +2 -0
  811. pythonlings/curriculum/solutions/pathlib3.py +2 -0
  812. pythonlings/curriculum/solutions/pathlib4.py +2 -0
  813. pythonlings/curriculum/solutions/pathlib5.py +2 -0
  814. pythonlings/curriculum/solutions/pathlib6.py +2 -0
  815. pythonlings/curriculum/solutions/recursion1.py +2 -0
  816. pythonlings/curriculum/solutions/recursion2.py +2 -0
  817. pythonlings/curriculum/solutions/recursion3.py +2 -0
  818. pythonlings/curriculum/solutions/recursion4.py +2 -0
  819. pythonlings/curriculum/solutions/recursion5.py +2 -0
  820. pythonlings/curriculum/solutions/recursion6.py +2 -0
  821. pythonlings/curriculum/solutions/recursion7.py +2 -0
  822. pythonlings/curriculum/solutions/recursion8.py +2 -0
  823. pythonlings/curriculum/solutions/regex1.py +2 -0
  824. pythonlings/curriculum/solutions/regex10.py +2 -0
  825. pythonlings/curriculum/solutions/regex2.py +2 -0
  826. pythonlings/curriculum/solutions/regex3.py +2 -0
  827. pythonlings/curriculum/solutions/regex4.py +2 -0
  828. pythonlings/curriculum/solutions/regex5.py +2 -0
  829. pythonlings/curriculum/solutions/regex6.py +2 -0
  830. pythonlings/curriculum/solutions/regex7.py +2 -0
  831. pythonlings/curriculum/solutions/regex8.py +2 -0
  832. pythonlings/curriculum/solutions/regex9.py +2 -0
  833. pythonlings/curriculum/solutions/sets1.py +2 -0
  834. pythonlings/curriculum/solutions/sets10.py +2 -0
  835. pythonlings/curriculum/solutions/sets2.py +2 -0
  836. pythonlings/curriculum/solutions/sets3.py +2 -0
  837. pythonlings/curriculum/solutions/sets4.py +2 -0
  838. pythonlings/curriculum/solutions/sets5.py +2 -0
  839. pythonlings/curriculum/solutions/sets6.py +2 -0
  840. pythonlings/curriculum/solutions/sets7.py +2 -0
  841. pythonlings/curriculum/solutions/sets8.py +2 -0
  842. pythonlings/curriculum/solutions/sets9.py +2 -0
  843. pythonlings/curriculum/solutions/strings1.py +2 -0
  844. pythonlings/curriculum/solutions/strings10.py +2 -0
  845. pythonlings/curriculum/solutions/strings2.py +2 -0
  846. pythonlings/curriculum/solutions/strings3.py +2 -0
  847. pythonlings/curriculum/solutions/strings4.py +2 -0
  848. pythonlings/curriculum/solutions/strings5.py +2 -0
  849. pythonlings/curriculum/solutions/strings6.py +2 -0
  850. pythonlings/curriculum/solutions/strings7.py +2 -0
  851. pythonlings/curriculum/solutions/strings8.py +2 -0
  852. pythonlings/curriculum/solutions/strings9.py +2 -0
  853. pythonlings/curriculum/solutions/testing1.py +2 -0
  854. pythonlings/curriculum/solutions/testing10.py +2 -0
  855. pythonlings/curriculum/solutions/testing11.py +2 -0
  856. pythonlings/curriculum/solutions/testing12.py +2 -0
  857. pythonlings/curriculum/solutions/testing2.py +2 -0
  858. pythonlings/curriculum/solutions/testing3.py +2 -0
  859. pythonlings/curriculum/solutions/testing4.py +2 -0
  860. pythonlings/curriculum/solutions/testing5.py +2 -0
  861. pythonlings/curriculum/solutions/testing6.py +2 -0
  862. pythonlings/curriculum/solutions/testing7.py +2 -0
  863. pythonlings/curriculum/solutions/testing8.py +2 -0
  864. pythonlings/curriculum/solutions/testing9.py +2 -0
  865. pythonlings/curriculum/solutions/tuples1.py +2 -0
  866. pythonlings/curriculum/solutions/tuples10.py +2 -0
  867. pythonlings/curriculum/solutions/tuples2.py +2 -0
  868. pythonlings/curriculum/solutions/tuples3.py +2 -0
  869. pythonlings/curriculum/solutions/tuples4.py +2 -0
  870. pythonlings/curriculum/solutions/tuples5.py +2 -0
  871. pythonlings/curriculum/solutions/tuples6.py +2 -0
  872. pythonlings/curriculum/solutions/tuples7.py +2 -0
  873. pythonlings/curriculum/solutions/tuples8.py +2 -0
  874. pythonlings/curriculum/solutions/tuples9.py +2 -0
  875. pythonlings/curriculum/solutions/type_hints1.py +2 -0
  876. pythonlings/curriculum/solutions/type_hints2.py +2 -0
  877. pythonlings/curriculum/solutions/type_hints3.py +2 -0
  878. pythonlings/curriculum/solutions/type_hints4.py +2 -0
  879. pythonlings/curriculum/solutions/type_hints5.py +2 -0
  880. pythonlings/curriculum/solutions/type_hints6.py +2 -0
  881. pythonlings/curriculum/solutions/type_hints7.py +2 -0
  882. pythonlings/curriculum/solutions/type_hints8.py +2 -0
  883. pythonlings/curriculum/solutions/variables1.py +2 -0
  884. pythonlings/curriculum/solutions/variables10.py +2 -0
  885. pythonlings/curriculum/solutions/variables2.py +2 -0
  886. pythonlings/curriculum/solutions/variables3.py +2 -0
  887. pythonlings/curriculum/solutions/variables4.py +2 -0
  888. pythonlings/curriculum/solutions/variables5.py +2 -0
  889. pythonlings/curriculum/solutions/variables6.py +2 -0
  890. pythonlings/curriculum/solutions/variables7.py +2 -0
  891. pythonlings/curriculum/solutions/variables8.py +2 -0
  892. pythonlings/curriculum/solutions/variables9.py +2 -0
  893. pythonlings/docs/NOTICE.md +9 -0
  894. pythonlings/docs/__init__.py +1 -0
  895. pythonlings/docs/index.json +160 -0
  896. pythonlings/docs/topics/__init__.py +1 -0
  897. pythonlings/docs/topics/async.md +97 -0
  898. pythonlings/docs/topics/classes.md +97 -0
  899. pythonlings/docs/topics/collections.md +96 -0
  900. pythonlings/docs/topics/comprehensions.md +97 -0
  901. pythonlings/docs/topics/conditionals.md +88 -0
  902. pythonlings/docs/topics/context_managers.md +97 -0
  903. pythonlings/docs/topics/dataclasses.md +97 -0
  904. pythonlings/docs/topics/datetime.md +97 -0
  905. pythonlings/docs/topics/decorators.md +91 -0
  906. pythonlings/docs/topics/dictionaries.md +96 -0
  907. pythonlings/docs/topics/enums.md +96 -0
  908. pythonlings/docs/topics/exceptions.md +96 -0
  909. pythonlings/docs/topics/file_io.md +96 -0
  910. pythonlings/docs/topics/functional.md +96 -0
  911. pythonlings/docs/topics/functions.md +97 -0
  912. pythonlings/docs/topics/generators.md +97 -0
  913. pythonlings/docs/topics/itertools.md +96 -0
  914. pythonlings/docs/topics/json.md +97 -0
  915. pythonlings/docs/topics/lists.md +97 -0
  916. pythonlings/docs/topics/loops.md +95 -0
  917. pythonlings/docs/topics/modules.md +97 -0
  918. pythonlings/docs/topics/oop_advanced.md +71 -0
  919. pythonlings/docs/topics/pathlib.md +79 -0
  920. pythonlings/docs/topics/recursion.md +73 -0
  921. pythonlings/docs/topics/regex.md +96 -0
  922. pythonlings/docs/topics/sets.md +97 -0
  923. pythonlings/docs/topics/strings.md +96 -0
  924. pythonlings/docs/topics/testing.md +97 -0
  925. pythonlings/docs/topics/tuples.md +97 -0
  926. pythonlings/docs/topics/type_hints.md +97 -0
  927. pythonlings/docs/topics/variables.md +97 -0
  928. pythonlings/pythonlings.tcss +123 -0
  929. pythonlings/screens/__init__.py +0 -0
  930. pythonlings/screens/docs.py +93 -0
  931. pythonlings/screens/topic_picker.py +107 -0
  932. pythonlings/screens/track.py +234 -0
  933. pythonlings/widgets/__init__.py +0 -0
  934. pythonlings/widgets/editor_pane.py +33 -0
  935. pythonlings/widgets/exercise_tree.py +33 -0
  936. pythonlings/widgets/output_panel.py +180 -0
  937. pythonlings/widgets/progress.py +15 -0
  938. pythonlings-0.3.0.dist-info/METADATA +259 -0
  939. pythonlings-0.3.0.dist-info/RECORD +942 -0
  940. pythonlings-0.3.0.dist-info/WHEEL +4 -0
  941. pythonlings-0.3.0.dist-info/entry_points.txt +2 -0
  942. pythonlings-0.3.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,3 @@
1
+ assert isinstance(flat, list), "flat should be a list"
2
+ assert flat == [1, 2, 3, 4, 5, 6, 7, 8, 9], f"expected [1..9] in order, got {flat!r}"
3
+ print("comprehensions9 ✓")
@@ -0,0 +1,2 @@
1
+ assert message == "Let's go outside!", f"Expected \"Let's go outside!\", got {message!r}"
2
+ print("conditionals1 ✓")
@@ -0,0 +1,10 @@
1
+ assert classify(500) == "large positive", f"classify(500) => 'large positive', got {classify(500)!r}"
2
+ assert classify(101) == "large positive", f"classify(101) => 'large positive', got {classify(101)!r}"
3
+ assert classify(100) == "small positive", f"classify(100) => 'small positive', got {classify(100)!r}"
4
+ assert classify(1) == "small positive", f"classify(1) => 'small positive', got {classify(1)!r}"
5
+ assert classify(0) == "zero", f"classify(0) => 'zero', got {classify(0)!r}"
6
+ assert classify(-1) == "small negative", f"classify(-1) => 'small negative', got {classify(-1)!r}"
7
+ assert classify(-100) == "small negative", f"classify(-100) => 'small negative', got {classify(-100)!r}"
8
+ assert classify(-101) == "large negative", f"classify(-101) => 'large negative', got {classify(-101)!r}"
9
+ assert classify(-999) == "large negative", f"classify(-999) => 'large negative', got {classify(-999)!r}"
10
+ print("conditionals10 ✓")
@@ -0,0 +1,5 @@
1
+ assert sign(5) == "positive", f"sign(5) should be 'positive', got {sign(5)!r}"
2
+ assert sign(1) == "positive", f"sign(1) should be 'positive', got {sign(1)!r}"
3
+ assert sign(0) == "non-positive", f"sign(0) should be 'non-positive', got {sign(0)!r}"
4
+ assert sign(-3) == "non-positive", f"sign(-3) should be 'non-positive', got {sign(-3)!r}"
5
+ print("conditionals2 ✓")
@@ -0,0 +1,9 @@
1
+ assert grade(95) == "A", f"grade(95) should be 'A', got {grade(95)!r}"
2
+ assert grade(90) == "A", f"grade(90) should be 'A', got {grade(90)!r}"
3
+ assert grade(85) == "B", f"grade(85) should be 'B', got {grade(85)!r}"
4
+ assert grade(80) == "B", f"grade(80) should be 'B', got {grade(80)!r}"
5
+ assert grade(72) == "C", f"grade(72) should be 'C', got {grade(72)!r}"
6
+ assert grade(70) == "C", f"grade(70) should be 'C', got {grade(70)!r}"
7
+ assert grade(50) == "F", f"grade(50) should be 'F', got {grade(50)!r}"
8
+ assert grade(0) == "F", f"grade(0) should be 'F', got {grade(0)!r}"
9
+ print("conditionals3 ✓")
@@ -0,0 +1,7 @@
1
+ assert compare(1, 2) == "less", f"compare(1, 2) should be 'less', got {compare(1, 2)!r}"
2
+ assert compare(5, 5) == "equal", f"compare(5, 5) should be 'equal', got {compare(5, 5)!r}"
3
+ assert compare(9, 3) == "greater", f"compare(9, 3) should be 'greater', got {compare(9, 3)!r}"
4
+ assert compare(0, 0) == "equal", f"compare(0, 0) should be 'equal', got {compare(0, 0)!r}"
5
+ assert compare(-1, 0) == "less", f"compare(-1, 0) should be 'less', got {compare(-1, 0)!r}"
6
+ assert compare(100, 99) == "greater", f"compare(100, 99) should be 'greater', got {compare(100, 99)!r}"
7
+ print("conditionals4 ✓")
@@ -0,0 +1,9 @@
1
+ assert can_ride(130, True) == True, "tall + ticket => can ride"
2
+ assert can_ride(130, False) == False, "tall but no ticket => cannot ride"
3
+ assert can_ride(100, True) == False, "too short but has ticket => cannot ride"
4
+ assert can_ride(120, True) == True, "exactly 120 + ticket => can ride"
5
+ assert gets_discount(True, False) == True, "student => discount"
6
+ assert gets_discount(False, True) == True, "senior => discount"
7
+ assert gets_discount(True, True) == True, "student + senior => discount"
8
+ assert gets_discount(False, False) == False, "neither => no discount"
9
+ print("conditionals5 ✓")
@@ -0,0 +1,7 @@
1
+ assert is_closed(True) == False, "open shop is not closed"
2
+ assert is_closed(False) == True, "closed shop is closed"
3
+ assert neither_zero(3, 5) == True, "3 and 5 are both non-zero"
4
+ assert neither_zero(0, 5) == False, "a is zero"
5
+ assert neither_zero(3, 0) == False, "b is zero"
6
+ assert neither_zero(0, 0) == False, "both are zero"
7
+ print("conditionals6 ✓")
@@ -0,0 +1,7 @@
1
+ assert ticket_price(3, True) == 0, "under 5 is free"
2
+ assert ticket_price(0, False) == 0, "age 0 is free"
3
+ assert ticket_price(10, True) == 8, "adult member pays 8"
4
+ assert ticket_price(5, True) == 8, "exactly 5 + member pays 8"
5
+ assert ticket_price(10, False) == 12, "adult non-member pays 12"
6
+ assert ticket_price(5, False) == 12, "exactly 5 + non-member pays 12"
7
+ print("conditionals7 ✓")
@@ -0,0 +1,9 @@
1
+ assert describe(0) == "empty", "0 is falsy"
2
+ assert describe("") == "empty", "empty string is falsy"
3
+ assert describe([]) == "empty", "empty list is falsy"
4
+ assert describe(None) == "empty", "None is falsy"
5
+ assert describe(1) == "has content", "1 is truthy"
6
+ assert describe("hello") == "has content", "non-empty string is truthy"
7
+ assert describe([1, 2]) == "has content", "non-empty list is truthy"
8
+ assert describe(0.1) == "has content", "non-zero float is truthy"
9
+ print("conditionals8 ✓")
@@ -0,0 +1,7 @@
1
+ assert absolute(5) == 5, f"absolute(5) should be 5, got {absolute(5)!r}"
2
+ assert absolute(-5) == 5, f"absolute(-5) should be 5, got {absolute(-5)!r}"
3
+ assert absolute(0) == 0, f"absolute(0) should be 0, got {absolute(0)!r}"
4
+ assert absolute(-100) == 100, f"absolute(-100) should be 100, got {absolute(-100)!r}"
5
+ assert absolute(3.5) == 3.5, f"absolute(3.5) should be 3.5, got {absolute(3.5)!r}"
6
+ assert absolute(-3.5) == 3.5, f"absolute(-3.5) should be 3.5, got {absolute(-3.5)!r}"
7
+ print("conditionals9 ✓")
@@ -0,0 +1,15 @@
1
+ import os
2
+
3
+ with open(data_path) as _f:
4
+ _contents = _f.read()
5
+
6
+ assert _contents == "hello, context!", (
7
+ f"file should contain 'hello, context!', got {_contents!r}"
8
+ )
9
+
10
+ try:
11
+ os.remove(data_path)
12
+ except OSError:
13
+ pass
14
+
15
+ print("context_managers1 ✓")
@@ -0,0 +1,10 @@
1
+ import os
2
+
3
+ assert f.closed, "f.closed should be True after the with-block exits"
4
+
5
+ try:
6
+ os.remove(data_path)
7
+ except OSError:
8
+ pass
9
+
10
+ print("context_managers2 ✓")
@@ -0,0 +1,2 @@
1
+ assert t.finished is True, "__exit__ should set finished to True"
2
+ print("context_managers3 ✓")
@@ -0,0 +1,3 @@
1
+ assert ml.items == [1, 2], f"items should be [1, 2], got {ml.items}"
2
+ assert ml.log == ["done"], f"log should be ['done'] after exit, got {ml.log}"
3
+ print("context_managers4 ✓")
@@ -0,0 +1,5 @@
1
+ assert result == {"dsn": "sqlite:///:memory:", "active": True}, (
2
+ f"conn should be the connection dict, got {result!r}"
3
+ )
4
+ assert db.open is False, "__exit__ should set self.open to False"
5
+ print("context_managers5 ✓")
@@ -0,0 +1,4 @@
1
+ assert counter == [1, 2, "finished"], (
2
+ f"counter should be [1, 2, 'finished'] after the with-block, got {counter!r}"
3
+ )
4
+ print("context_managers6 ✓")
@@ -0,0 +1,16 @@
1
+ assert result == "not set", (
2
+ f"ZeroDivisionError should have been suppressed; result={result!r}"
3
+ )
4
+
5
+ # A non-ZeroDivision error must still propagate.
6
+ import sys
7
+
8
+ _propagated = False
9
+ try:
10
+ with SilentZeroDivision():
11
+ raise ValueError("should propagate")
12
+ except ValueError:
13
+ _propagated = True
14
+
15
+ assert _propagated, "ValueError should NOT be suppressed"
16
+ print("context_managers7 ✓")
@@ -0,0 +1,15 @@
1
+ assert in_block_acquired is True, "resource should be acquired inside the with-block"
2
+ assert r.acquired is False, "resource should be released after the with-block"
3
+ assert r.release_log == ["released"], (
4
+ f"release_log should be ['released'], got {r.release_log!r}"
5
+ )
6
+
7
+ # Re-entrant: acquire and release again.
8
+ with ManagedPool(r) as res2:
9
+ pass
10
+
11
+ assert r.acquired is False
12
+ assert r.release_log == ["released", "released"], (
13
+ f"release_log should have two entries after two uses, got {r.release_log!r}"
14
+ )
15
+ print("context_managers8 ✓")
@@ -0,0 +1,3 @@
1
+ assert origin.x == 0 and origin.y == 0
2
+ assert Point(2, 5).x == 2 and Point(2, 5).y == 5
3
+ print("dataclasses1 ✓")
@@ -0,0 +1,5 @@
1
+ assert orange.red == 255
2
+ assert orange.green == 128
3
+ assert orange.blue == 0
4
+ assert description == "R=255 G=128 B=0", f"got {description!r}"
5
+ print("dataclasses2 ✓")
@@ -0,0 +1,4 @@
1
+ assert gravity.value == 9.8
2
+ assert gravity.unit == "m/s²", f"got {gravity.unit!r}"
3
+ assert named.unit == "km/h"
4
+ print("dataclasses3 ✓")
@@ -0,0 +1,3 @@
1
+ assert b1.items == ["apple"], f"b1.items = {b1.items!r}"
2
+ assert b2.items == [], f"b2.items should still be empty, got {b2.items!r}"
3
+ print("dataclasses4 ✓")
@@ -0,0 +1,9 @@
1
+ import dataclasses
2
+
3
+ assert v.x == 1.0 and v.y == 2.0 and v.z == 3.0
4
+ fields = {f.name for f in dataclasses.fields(Vector3)}
5
+ assert fields == {"x", "y", "z"}, f"expected fields x,y,z — got {fields}"
6
+ # The generated __init__ is created by @dataclass; verify it works for keyword args too.
7
+ v2 = Vector3(x=0.0, y=0.0, z=1.0)
8
+ assert v2.z == 1.0
9
+ print("dataclasses5 ✓")
@@ -0,0 +1,6 @@
1
+ assert novel == copy, "two Books with the same fields should be equal"
2
+ assert novel != other, "Books with different fields should not be equal"
3
+ r = repr(novel)
4
+ assert "Dune" in r, f"repr should contain the title, got {r!r}"
5
+ assert "412" in r, f"repr should contain the page count, got {r!r}"
6
+ print("dataclasses6 ✓")
@@ -0,0 +1,6 @@
1
+ assert cfg.host == "localhost"
2
+ assert cfg.port == 8080
3
+ assert mutation_raised, (
4
+ "assigning to a frozen dataclass field should raise FrozenInstanceError"
5
+ )
6
+ print("dataclasses7 ✓")
@@ -0,0 +1,5 @@
1
+ assert rect.area() == 12.0, f"area should be 12.0, got {rect.area()}"
2
+ assert rect.perimeter() == 14.0, f"perimeter should be 14.0, got {rect.perimeter()}"
3
+ assert square.area() == 25.0, f"area should be 25.0, got {square.area()}"
4
+ assert square.perimeter() == 20.0, f"perimeter should be 20.0, got {square.perimeter()}"
5
+ print("dataclasses8 ✓")
@@ -0,0 +1,4 @@
1
+ from datetime import date
2
+
3
+ assert launch_day == date(2026, 5, 23)
4
+ print("datetime1 ok")
@@ -0,0 +1,4 @@
1
+ from datetime import date
2
+
3
+ assert next_week == date(2026, 5, 30)
4
+ print("datetime2 ok")
@@ -0,0 +1,6 @@
1
+ assert meeting.year == 2026
2
+ assert meeting.month == 5
3
+ assert meeting.day == 23
4
+ assert meeting.hour == 9
5
+ assert meeting.minute == 30
6
+ print("datetime3 ok")
@@ -0,0 +1,2 @@
1
+ assert formatted == "23/05/2026"
2
+ print("datetime4 ok")
@@ -0,0 +1,2 @@
1
+ assert is_future is True
2
+ print("datetime5 ok")
@@ -0,0 +1,2 @@
1
+ assert days_between == 22
2
+ print("datetime6 ok")
@@ -0,0 +1,2 @@
1
+ assert appointment.isoformat() == "2026-05-23T14:45:00"
2
+ print("datetime7 ok")
@@ -0,0 +1,5 @@
1
+ from datetime import date
2
+
3
+ assert earliest == date(2024, 1, 1)
4
+ assert latest == date(2026, 5, 23)
5
+ print("datetime8 ok")
@@ -0,0 +1,8 @@
1
+ assert call_it(say_hello) == "hello", (
2
+ f"call_it(say_hello) should return 'hello', got {call_it(say_hello)!r}"
3
+ )
4
+ assert call_it(give_seven) == 7, (
5
+ f"call_it(give_seven) should return 7, got {call_it(give_seven)!r}"
6
+ )
7
+ assert call_it(lambda: 42) == 42
8
+ print("decorators1 ✓")
@@ -0,0 +1,12 @@
1
+ assert slow_square(4) == 16
2
+ assert slow_square(5) == 25
3
+ # Second calls must hit the cache, not recompute
4
+ assert slow_square(4) == 16
5
+ assert slow_square(5) == 25
6
+ assert call_count == 2, (
7
+ f"slow_square should have been called exactly 2 times (once per unique arg), "
8
+ f"but call_count is {call_count}"
9
+ )
10
+ assert (4,) in slow_square.cache, "cache should contain key (4,) for arg 4"
11
+ assert slow_square.cache[(4,)] == 16
12
+ print("decorators10 ✓")
@@ -0,0 +1,5 @@
1
+ assert loud_greet() == "HELLO", (
2
+ f"loud_greet() should return 'HELLO', got {loud_greet()!r}"
3
+ )
4
+ assert shout(lambda: "world")() == "WORLD"
5
+ print("decorators2 ✓")
@@ -0,0 +1,4 @@
1
+ assert get_message() == "[STAMPED] hello", (
2
+ f"get_message() should return '[STAMPED] hello', got {get_message()!r}"
3
+ )
4
+ print("decorators3 ✓")
@@ -0,0 +1,7 @@
1
+ assert get_five() == 10, (
2
+ f"get_five() should return 10, got {get_five()!r}"
3
+ )
4
+ assert get_ten() == 20, (
5
+ f"get_ten() should return 20, got {get_ten()!r}"
6
+ )
7
+ print("decorators4 ✓")
@@ -0,0 +1,5 @@
1
+ assert add(3, 4) == 7, f"add(3, 4) should return 7, got {add(3, 4)!r}"
2
+ assert add(10, -2) == 8
3
+ assert greet("Alice") == "Hello, Alice!"
4
+ assert greet("Bob", greeting="Hi") == "Hi, Bob!"
5
+ print("decorators5 ✓")
@@ -0,0 +1,8 @@
1
+ assert compute(2, 3) == 5
2
+ assert compute.__name__ == "compute", (
3
+ f"__name__ should be 'compute', got {compute.__name__!r}"
4
+ )
5
+ assert compute.__doc__ == "Return the sum of x and y.", (
6
+ f"__doc__ should be preserved, got {compute.__doc__!r}"
7
+ )
8
+ print("decorators6 ✓")
@@ -0,0 +1,12 @@
1
+ assert add.call_count == 0
2
+ add(1, 2)
3
+ assert add.call_count == 1, (
4
+ f"call_count should be 1 after one call, got {add.call_count}"
5
+ )
6
+ add(3, 4)
7
+ add(5, 6)
8
+ assert add.call_count == 3, (
9
+ f"call_count should be 3 after three calls, got {add.call_count}"
10
+ )
11
+ assert add(10, 20) == 30
12
+ print("decorators7 ✓")
@@ -0,0 +1,20 @@
1
+ result = say("hi")
2
+ assert result == "hi", f"say('hi') should return 'hi', got {result!r}"
3
+
4
+ # The function should have been called 3 times (side-effect: last result returned)
5
+ assert identity(99) == 99
6
+ assert identity("abc") == "abc"
7
+
8
+ # Verify repeat with a counter to confirm n calls happen
9
+ call_log = []
10
+
11
+ @repeat(4)
12
+ def tracked(x):
13
+ call_log.append(x)
14
+ return x
15
+
16
+ tracked(1)
17
+ assert len(call_log) == 4, (
18
+ f"repeat(4) should call the function 4 times, got {len(call_log)}"
19
+ )
20
+ print("decorators8 ✓")
@@ -0,0 +1,4 @@
1
+ assert get_value() == "[B][A]42", (
2
+ f"get_value() should return '[B][A]42', got {get_value()!r}"
3
+ )
4
+ print("decorators9 ✓")
@@ -0,0 +1,3 @@
1
+ assert isinstance(ages, dict), "ages should be a dict"
2
+ assert ages == {"alice": 30, "bob": 25}, f"ages should map the two names to their ages, got {ages!r}"
3
+ print("dictionaries1 ✓")
@@ -0,0 +1,5 @@
1
+ assert isinstance(freq, dict), "freq should be a dict"
2
+ assert freq == {"the": 3, "cat": 2, "sat": 1, "on": 1, "mat": 1, "and": 1, "hat": 1}, (
3
+ f"freq wrong: {freq!r}"
4
+ )
5
+ print("dictionaries10 ✓")
@@ -0,0 +1,2 @@
1
+ assert france_capital == "Paris", f"france_capital should be 'Paris', got {france_capital!r}"
2
+ print("dictionaries2 ✓")
@@ -0,0 +1,5 @@
1
+ assert scores.get("diana") == 91, f"scores['diana'] should be 91, got {scores.get('diana')!r}"
2
+ assert scores["alice"] == 88, f"scores['alice'] should be 88 after update, got {scores['alice']!r}"
3
+ assert scores["bob"] == 60, "scores['bob'] should remain 60"
4
+ assert scores["carol"] == 82, "scores['carol'] should remain 82"
5
+ print("dictionaries3 ✓")
@@ -0,0 +1,5 @@
1
+ assert "banana" not in basket, "'banana' should have been removed from basket"
2
+ assert "cherry" not in basket, "'cherry' should have been removed from basket"
3
+ assert cherry_count == 12, f"cherry_count should be 12, got {cherry_count!r}"
4
+ assert basket == {"apple": 5, "date": 7}, f"basket should only have apple and date left, got {basket!r}"
5
+ print("dictionaries4 ✓")
@@ -0,0 +1,11 @@
1
+ assert isinstance(all_items, list), "all_items should be a list"
2
+ assert sorted(all_items) == ["eraser", "notebook", "pen"], f"all_items keys wrong: {all_items!r}"
3
+
4
+ assert isinstance(all_counts, list), "all_counts should be a list"
5
+ assert sorted(all_counts) == [5, 8, 10], f"all_counts values wrong: {all_counts!r}"
6
+
7
+ assert isinstance(all_pairs, list), "all_pairs should be a list"
8
+ assert sorted(all_pairs) == [("eraser", 8), ("notebook", 5), ("pen", 10)], (
9
+ f"all_pairs tuples wrong: {all_pairs!r}"
10
+ )
11
+ print("dictionaries5 ✓")
@@ -0,0 +1,4 @@
1
+ assert timeout == 60, f"timeout should be 60 (from config), got {timeout!r}"
2
+ assert retries == 3, f"retries should be 3 (default), got {retries!r}"
3
+ assert verbose == False, f"verbose should be False (default), got {verbose!r}"
4
+ print("dictionaries6 ✓")
@@ -0,0 +1,5 @@
1
+ assert isinstance(discounted, dict), "discounted should be a dict"
2
+ assert discounted == {"apple": 0.9, "milk": 1.35, "bread": 2.25}, (
3
+ f"discounted wrong: {discounted!r}"
4
+ )
5
+ print("dictionaries7 ✓")
@@ -0,0 +1,4 @@
1
+ assert can_read == True, f"can_read should be True, got {can_read!r}"
2
+ assert can_write == True, f"can_write should be True ('write' is a key), got {can_write!r}"
3
+ assert can_delete == False, f"can_delete should be False, got {can_delete!r}"
4
+ print("dictionaries8 ✓")
@@ -0,0 +1,4 @@
1
+ assert alice_grade == "A", f"alice_grade should be 'A', got {alice_grade!r}"
2
+ assert math_room == 101, f"math_room should be 101, got {math_room!r}"
3
+ assert num_students == 350, f"num_students should be 350, got {num_students!r}"
4
+ print("dictionaries9 ✓")
@@ -0,0 +1,4 @@
1
+ assert Color.RED.value == "red"
2
+ assert Color.BLUE.value == "blue"
3
+ assert favorite is Color.RED
4
+ print("enums1 ok")
@@ -0,0 +1,3 @@
1
+ assert [member.name for member in Status] == ["TODO", "DOING", "DONE"]
2
+ assert [member.value for member in Status] == [1, 2, 3]
3
+ print("enums2 ok")
@@ -0,0 +1,3 @@
1
+ assert selected_name == "HIGH"
2
+ assert selected_value == 5
3
+ print("enums3 ok")
@@ -0,0 +1,2 @@
1
+ assert size_codes == ["S", "M", "L"]
2
+ print("enums4 ok")
@@ -0,0 +1,4 @@
1
+ assert is_terminal(TicketState.OPEN) is False
2
+ assert is_terminal(TicketState.CLOSED) is True
3
+ assert is_terminal(TicketState.CANCELLED) is True
4
+ print("enums5 ok")
@@ -0,0 +1,3 @@
1
+ assert Direction.NORTH.delta() == (0, -1)
2
+ assert Direction.EAST.delta() == (1, 0)
3
+ print("enums6 ok")
@@ -0,0 +1,4 @@
1
+ assert safe_divide(10, 2) == 5.0, f"expected 5.0, got {safe_divide(10, 2)!r}"
2
+ assert safe_divide(7, 0) == "error", f"expected 'error', got {safe_divide(7, 0)!r}"
3
+ assert safe_divide(9, 3) == 3.0, f"expected 3.0, got {safe_divide(9, 3)!r}"
4
+ print("exceptions1 ✓")
@@ -0,0 +1,39 @@
1
+ assert validate_username("Alice") == "alice", f"expected 'alice', got {validate_username('Alice')!r}"
2
+ assert validate_username("User123") == "user123", f"expected 'user123', got {validate_username('User123')!r}"
3
+ assert validate_username("abc") == "abc", "3-char name should be valid"
4
+ assert validate_username("a" * 20) == "a" * 20, "20-char name should be valid"
5
+
6
+ # rule 1: type check
7
+ raised = False
8
+ try:
9
+ validate_username(42)
10
+ except TypeError as e:
11
+ raised = True
12
+ assert "str" in str(e), f"TypeError message should mention 'str', got {e!r}"
13
+ assert raised, "validate_username(42) should raise TypeError"
14
+
15
+ # rule 2: too short
16
+ raised = False
17
+ try:
18
+ validate_username("ab")
19
+ except ValueError as e:
20
+ raised = True
21
+ assert raised, "validate_username('ab') should raise ValueError"
22
+
23
+ # rule 2: too long
24
+ raised = False
25
+ try:
26
+ validate_username("a" * 21)
27
+ except ValueError:
28
+ raised = True
29
+ assert raised, "a 21-char name should raise ValueError"
30
+
31
+ # rule 3: non-alphanumeric
32
+ raised = False
33
+ try:
34
+ validate_username("bad name!")
35
+ except ValueError as e:
36
+ raised = True
37
+ assert "alphanumeric" in str(e), f"ValueError message should mention 'alphanumeric', got {e!r}"
38
+ assert raised, "validate_username('bad name!') should raise ValueError"
39
+ print("exceptions10 ✓")
@@ -0,0 +1,5 @@
1
+ assert parse_number("42") == 42, f"expected 42, got {parse_number('42')!r}"
2
+ assert parse_number("0") == 0, f"expected 0, got {parse_number('0')!r}"
3
+ assert parse_number("abc") == -1, f"expected -1, got {parse_number('abc')!r}"
4
+ assert parse_number("3.14") == -1, f"expected -1, got {parse_number('3.14')!r}"
5
+ print("exceptions2 ✓")
@@ -0,0 +1,8 @@
1
+ assert describe_error("3.14") == 3.14, f"expected 3.14, got {describe_error('3.14')!r}"
2
+ assert describe_error("10") == 10.0, f"expected 10.0, got {describe_error('10')!r}"
3
+
4
+ result = describe_error("hello")
5
+ assert isinstance(result, str), "on bad input, describe_error should return a str"
6
+ assert len(result) > 0, "the returned error string should not be empty"
7
+ assert "hello" in result, f"expected the bad value to appear in the message, got {result!r}"
8
+ print("exceptions3 ✓")
@@ -0,0 +1,5 @@
1
+ assert load_value({"x": 5}, "x") == 10, f"expected 10, got {load_value({'x': 5}, 'x')!r}"
2
+ assert load_value({"x": 5}, "y") == "missing", f"expected 'missing', got {load_value({'x': 5}, 'y')!r}"
3
+ assert load_value({"a": 3, "b": 7}, "b") == 14, f"expected 14, got {load_value({'a': 3, 'b': 7}, 'b')!r}"
4
+ assert load_value({}, "z") == "missing", f"expected 'missing', got {load_value({}, 'z')!r}"
5
+ print("exceptions4 ✓")
@@ -0,0 +1,10 @@
1
+ log.clear()
2
+ result = read_first([10, 20, 30])
3
+ assert result == 10, f"expected 10, got {result!r}"
4
+ assert log == ["done"], f"log should be ['done'] after a successful call, got {log!r}"
5
+
6
+ log.clear()
7
+ result = read_first([])
8
+ assert result is None, f"expected None, got {result!r}"
9
+ assert log == ["done"], f"log should be ['done'] even after an empty list, got {log!r}"
10
+ print("exceptions5 ✓")
@@ -0,0 +1,17 @@
1
+ assert require_positive(5) == 5, f"expected 5, got {require_positive(5)!r}"
2
+ assert require_positive(1) == 1, f"expected 1, got {require_positive(1)!r}"
3
+
4
+ raised = False
5
+ try:
6
+ require_positive(0)
7
+ except ValueError:
8
+ raised = True
9
+ assert raised, "require_positive(0) should raise ValueError"
10
+
11
+ raised = False
12
+ try:
13
+ require_positive(-3)
14
+ except ValueError:
15
+ raised = True
16
+ assert raised, "require_positive(-3) should raise ValueError"
17
+ print("exceptions6 ✓")
@@ -0,0 +1,15 @@
1
+ assert check_age(0) == 0, f"expected 0, got {check_age(0)!r}"
2
+ assert check_age(25) == 25, f"expected 25, got {check_age(25)!r}"
3
+ assert check_age(120) == 120, f"expected 120, got {check_age(120)!r}"
4
+
5
+ for bad in (-1, 121, 200):
6
+ raised = False
7
+ msg_ok = False
8
+ try:
9
+ check_age(bad)
10
+ except ValueError as e:
11
+ raised = True
12
+ msg_ok = "age must be between 0 and 120" in str(e)
13
+ assert raised, f"check_age({bad}) should raise ValueError"
14
+ assert msg_ok, f"ValueError message should say 'age must be between 0 and 120'"
15
+ print("exceptions7 ✓")
@@ -0,0 +1,6 @@
1
+ assert classify_error(lambda: 1 + 1) == "ok", "no exception should return 'ok'"
2
+ assert classify_error(lambda: int("bad")) == "value error", "ValueError should return 'value error'"
3
+ assert classify_error(lambda: 1 + "x") == "type error", "TypeError should return 'type error'"
4
+ assert classify_error(lambda: (_ for _ in ()).throw(RuntimeError("boom"))) == "other error", \
5
+ "other exceptions should return 'other error'"
6
+ print("exceptions8 ✓")