rkoans 0.0.1 → 0.1.0

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 (460) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +13 -0
  3. data/CURRICULUM.md +86 -0
  4. data/README.md +77 -0
  5. data/THIRD_PARTY_NOTICES.md +30 -0
  6. data/exercises/about-array-assignment/about_array_assignment.rb +45 -0
  7. data/exercises/about-array-assignment/brief.md +11 -0
  8. data/exercises/about-array-assignment/hint.md +11 -0
  9. data/exercises/about-arrays/about_arrays.rb +77 -0
  10. data/exercises/about-arrays/brief.md +16 -0
  11. data/exercises/about-arrays/hint.md +13 -0
  12. data/exercises/about-asserts/about_asserts.rb +22 -0
  13. data/exercises/about-asserts/brief.md +22 -0
  14. data/exercises/about-asserts/hint.md +10 -0
  15. data/exercises/about-blocks/about_blocks.rb +76 -0
  16. data/exercises/about-blocks/brief.md +44 -0
  17. data/exercises/about-blocks/hint.md +7 -0
  18. data/exercises/about-class-methods/about_class_methods.rb +105 -0
  19. data/exercises/about-class-methods/brief.md +73 -0
  20. data/exercises/about-class-methods/hint.md +8 -0
  21. data/exercises/about-classes/about_classes.rb +131 -0
  22. data/exercises/about-classes/brief.md +73 -0
  23. data/exercises/about-classes/hint.md +7 -0
  24. data/exercises/about-constants/about_constants.rb +49 -0
  25. data/exercises/about-constants/brief.md +51 -0
  26. data/exercises/about-constants/hint.md +7 -0
  27. data/exercises/about-control-statements/about_control_statements.rb +152 -0
  28. data/exercises/about-control-statements/brief.md +9 -0
  29. data/exercises/about-control-statements/hint.md +7 -0
  30. data/exercises/about-dice-project/about_dice_project.rb +27 -0
  31. data/exercises/about-dice-project/brief.md +12 -0
  32. data/exercises/about-dice-project/hint.md +5 -0
  33. data/exercises/about-exceptions/about_exceptions.rb +84 -0
  34. data/exercises/about-exceptions/brief.md +19 -0
  35. data/exercises/about-exceptions/hint.md +8 -0
  36. data/exercises/about-extra-credit/about_extra_credit.rb +117 -0
  37. data/exercises/about-extra-credit/brief.md +28 -0
  38. data/exercises/about-extra-credit/hint.md +5 -0
  39. data/exercises/about-hashes/about_hashes.rb +160 -0
  40. data/exercises/about-hashes/brief.md +9 -0
  41. data/exercises/about-hashes/hint.md +8 -0
  42. data/exercises/about-inheritance/about_inheritance.rb +63 -0
  43. data/exercises/about-inheritance/brief.md +50 -0
  44. data/exercises/about-inheritance/hint.md +8 -0
  45. data/exercises/about-iteration/about_iteration.rb +96 -0
  46. data/exercises/about-iteration/brief.md +26 -0
  47. data/exercises/about-iteration/hint.md +6 -0
  48. data/exercises/about-keyword-arguments/about_keyword_arguments.rb +56 -0
  49. data/exercises/about-keyword-arguments/brief.md +28 -0
  50. data/exercises/about-keyword-arguments/hint.md +7 -0
  51. data/exercises/about-message-passing/about_message_passing.rb +112 -0
  52. data/exercises/about-message-passing/brief.md +59 -0
  53. data/exercises/about-message-passing/hint.md +8 -0
  54. data/exercises/about-methods/about_methods.rb +104 -0
  55. data/exercises/about-methods/brief.md +55 -0
  56. data/exercises/about-methods/hint.md +8 -0
  57. data/exercises/about-modules/about_modules.rb +43 -0
  58. data/exercises/about-modules/brief.md +44 -0
  59. data/exercises/about-modules/hint.md +8 -0
  60. data/exercises/about-nil/about_nil.rb +29 -0
  61. data/exercises/about-nil/brief.md +12 -0
  62. data/exercises/about-nil/hint.md +11 -0
  63. data/exercises/about-objects/about_objects.rb +51 -0
  64. data/exercises/about-objects/brief.md +14 -0
  65. data/exercises/about-objects/hint.md +12 -0
  66. data/exercises/about-open-classes/about_open_classes.rb +38 -0
  67. data/exercises/about-open-classes/brief.md +34 -0
  68. data/exercises/about-open-classes/hint.md +7 -0
  69. data/exercises/about-pattern-matching/about_pattern_matching.rb +106 -0
  70. data/exercises/about-pattern-matching/brief.md +124 -0
  71. data/exercises/about-pattern-matching/hint.md +8 -0
  72. data/exercises/about-proxy-object-project/about_proxy_object_project.rb +43 -0
  73. data/exercises/about-proxy-object-project/brief.md +10 -0
  74. data/exercises/about-proxy-object-project/hint.md +5 -0
  75. data/exercises/about-regular-expressions/about_regular_expressions.rb +174 -0
  76. data/exercises/about-regular-expressions/brief.md +9 -0
  77. data/exercises/about-regular-expressions/hint.md +8 -0
  78. data/exercises/about-sandwich-code/about_sandwich_code.rb +58 -0
  79. data/exercises/about-sandwich-code/brief.md +14 -0
  80. data/exercises/about-sandwich-code/hint.md +5 -0
  81. data/exercises/about-scope/about_scope.rb +76 -0
  82. data/exercises/about-scope/brief.md +35 -0
  83. data/exercises/about-scope/hint.md +8 -0
  84. data/exercises/about-scoring-project/about_scoring_project.rb +16 -0
  85. data/exercises/about-scoring-project/brief.md +10 -0
  86. data/exercises/about-scoring-project/hint.md +5 -0
  87. data/exercises/about-strings/about_strings.rb +142 -0
  88. data/exercises/about-strings/brief.md +22 -0
  89. data/exercises/about-strings/hint.md +11 -0
  90. data/exercises/about-symbols/about_symbols.rb +53 -0
  91. data/exercises/about-symbols/brief.md +21 -0
  92. data/exercises/about-symbols/hint.md +12 -0
  93. data/exercises/about-to-str/about_to_str.rb +49 -0
  94. data/exercises/about-to-str/brief.md +37 -0
  95. data/exercises/about-to-str/hint.md +7 -0
  96. data/exercises/about-triangle-project/about_triangle_project.rb +15 -0
  97. data/exercises/about-triangle-project/brief.md +11 -0
  98. data/exercises/about-triangle-project/hint.md +5 -0
  99. data/exercises/about-triangle-project-two/about_triangle_project_two.rb +22 -0
  100. data/exercises/about-triangle-project-two/brief.md +10 -0
  101. data/exercises/about-triangle-project-two/hint.md +5 -0
  102. data/exercises/about-true-and-false/about_true_and_false.rb +26 -0
  103. data/exercises/about-true-and-false/brief.md +22 -0
  104. data/exercises/about-true-and-false/hint.md +7 -0
  105. data/exercises/blocks-and-methods/blocks_and_methods.rb +14 -0
  106. data/exercises/blocks-and-methods/brief.md +8 -0
  107. data/exercises/blocks-and-methods/hint.md +6 -0
  108. data/exercises/catalog.json +61 -0
  109. data/exercises/class-state/brief.md +8 -0
  110. data/exercises/class-state/class_state.rb +39 -0
  111. data/exercises/class-state/hint.md +5 -0
  112. data/exercises/closure-capture/brief.md +8 -0
  113. data/exercises/closure-capture/closure_capture.rb +21 -0
  114. data/exercises/closure-capture/hint.md +5 -0
  115. data/exercises/collection-basics/brief.md +8 -0
  116. data/exercises/collection-basics/collection_basics.rb +16 -0
  117. data/exercises/collection-basics/hint.md +6 -0
  118. data/exercises/constant-scope/brief.md +8 -0
  119. data/exercises/constant-scope/constant_scope.rb +18 -0
  120. data/exercises/constant-scope/hint.md +5 -0
  121. data/exercises/core-protocols/brief.md +8 -0
  122. data/exercises/core-protocols/core_protocols.rb +43 -0
  123. data/exercises/core-protocols/hint.md +5 -0
  124. data/exercises/delegation/brief.md +8 -0
  125. data/exercises/delegation/delegation.rb +20 -0
  126. data/exercises/delegation/hint.md +5 -0
  127. data/exercises/dynamic-methods/brief.md +8 -0
  128. data/exercises/dynamic-methods/dynamic_methods.rb +33 -0
  129. data/exercises/dynamic-methods/hint.md +5 -0
  130. data/exercises/exception-flow/brief.md +8 -0
  131. data/exercises/exception-flow/exception_flow.rb +27 -0
  132. data/exercises/exception-flow/hint.md +5 -0
  133. data/exercises/heredoc-layout/brief.md +14 -0
  134. data/exercises/heredoc-layout/heredoc_layout.rb +25 -0
  135. data/exercises/heredoc-layout/hint.md +9 -0
  136. data/exercises/keyword-forwarding/brief.md +8 -0
  137. data/exercises/keyword-forwarding/hint.md +5 -0
  138. data/exercises/keyword-forwarding/keyword_forwarding.rb +27 -0
  139. data/exercises/lazy-enumeration/brief.md +8 -0
  140. data/exercises/lazy-enumeration/hint.md +5 -0
  141. data/exercises/lazy-enumeration/lazy_enumeration.rb +16 -0
  142. data/exercises/literals-and-operators/brief.md +20 -0
  143. data/exercises/literals-and-operators/hint.md +5 -0
  144. data/exercises/literals-and-operators/literals_and_operators.rb +15 -0
  145. data/exercises/method-contracts/brief.md +8 -0
  146. data/exercises/method-contracts/hint.md +5 -0
  147. data/exercises/method-contracts/method_contracts.rb +22 -0
  148. data/exercises/method-lookup/brief.md +8 -0
  149. data/exercises/method-lookup/hint.md +5 -0
  150. data/exercises/method-lookup/method_lookup.rb +26 -0
  151. data/exercises/nonlocal-exit/brief.md +8 -0
  152. data/exercises/nonlocal-exit/hint.md +5 -0
  153. data/exercises/nonlocal-exit/nonlocal_exit.rb +29 -0
  154. data/exercises/numbered-parameters/brief.md +18 -0
  155. data/exercises/numbered-parameters/hint.md +5 -0
  156. data/exercises/numbered-parameters/numbered_parameters.rb +18 -0
  157. data/exercises/numeric-precision/brief.md +8 -0
  158. data/exercises/numeric-precision/hint.md +5 -0
  159. data/exercises/numeric-precision/numeric_precision.rb +17 -0
  160. data/exercises/pattern-matching/brief.md +8 -0
  161. data/exercises/pattern-matching/hint.md +5 -0
  162. data/exercises/pattern-matching/pattern_matching.rb +22 -0
  163. data/exercises/refinement-scope/brief.md +8 -0
  164. data/exercises/refinement-scope/hint.md +5 -0
  165. data/exercises/refinement-scope/refinement_scope.rb +33 -0
  166. data/exercises/regexp-captures/brief.md +8 -0
  167. data/exercises/regexp-captures/hint.md +5 -0
  168. data/exercises/regexp-captures/regexp_captures.rb +25 -0
  169. data/exercises/runtime-context/brief.md +20 -0
  170. data/exercises/runtime-context/hint.md +8 -0
  171. data/exercises/runtime-context/runtime_context.rb +11 -0
  172. data/exercises/shared-rows/brief.md +8 -0
  173. data/exercises/shared-rows/hint.md +7 -0
  174. data/exercises/shared-rows/shared_rows.rb +13 -0
  175. data/exercises/singleton-pattern/brief.md +8 -0
  176. data/exercises/singleton-pattern/hint.md +5 -0
  177. data/exercises/singleton-pattern/singleton_pattern.rb +20 -0
  178. data/exercises/time-and-date/brief.md +8 -0
  179. data/exercises/time-and-date/hint.md +5 -0
  180. data/exercises/time-and-date/time_and_date.rb +21 -0
  181. data/exercises/visibility/brief.md +8 -0
  182. data/exercises/visibility/hint.md +5 -0
  183. data/exercises/visibility/visibility.rb +32 -0
  184. data/lib/rkoans/catalog.rb +31 -0
  185. data/lib/rkoans/checker.rb +62 -0
  186. data/lib/rkoans/cli.rb +79 -0
  187. data/lib/rkoans/error.rb +6 -0
  188. data/lib/rkoans/exercise.rb +50 -0
  189. data/lib/rkoans/keyboard.rb +51 -0
  190. data/lib/rkoans/progress.rb +39 -0
  191. data/lib/rkoans/selection.rb +31 -0
  192. data/lib/rkoans/session.rb +127 -0
  193. data/lib/rkoans/terminal_view.rb +99 -0
  194. data/lib/rkoans/version.rb +1 -1
  195. data/lib/rkoans/watcher.rb +58 -0
  196. data/lib/rkoans.rb +13 -3
  197. data/sig/about_array_assignment_acceptance_test.rbs +3 -0
  198. data/sig/about_arrays_acceptance_test.rbs +3 -0
  199. data/sig/about_asserts_command_test.rbs +4 -0
  200. data/sig/about_blocks_acceptance_test.rbs +3 -0
  201. data/sig/about_class_methods_acceptance_test.rbs +3 -0
  202. data/sig/about_classes_acceptance_test.rbs +3 -0
  203. data/sig/about_constants_acceptance_test.rbs +3 -0
  204. data/sig/about_control_statements_acceptance_test.rbs +3 -0
  205. data/sig/about_dice_project_acceptance_test.rbs +3 -0
  206. data/sig/about_exceptions_acceptance_test.rbs +3 -0
  207. data/sig/about_extra_credit_acceptance_test.rbs +5 -0
  208. data/sig/about_hashes_acceptance_test.rbs +3 -0
  209. data/sig/about_inheritance_acceptance_test.rbs +3 -0
  210. data/sig/about_iteration_acceptance_test.rbs +3 -0
  211. data/sig/about_keyword_arguments_acceptance_test.rbs +3 -0
  212. data/sig/about_message_passing_acceptance_test.rbs +3 -0
  213. data/sig/about_methods_acceptance_test.rbs +3 -0
  214. data/sig/about_modules_acceptance_test.rbs +3 -0
  215. data/sig/about_nil_acceptance_test.rbs +3 -0
  216. data/sig/about_objects_acceptance_test.rbs +3 -0
  217. data/sig/about_open_classes_acceptance_test.rbs +3 -0
  218. data/sig/about_pattern_matching_acceptance_test.rbs +3 -0
  219. data/sig/about_proxy_object_project_acceptance_test.rbs +3 -0
  220. data/sig/about_regular_expressions_acceptance_test.rbs +3 -0
  221. data/sig/about_sandwich_code_acceptance_test.rbs +3 -0
  222. data/sig/about_scope_acceptance_test.rbs +3 -0
  223. data/sig/about_scoring_project_acceptance_test.rbs +3 -0
  224. data/sig/about_strings_acceptance_test.rbs +3 -0
  225. data/sig/about_symbols_acceptance_test.rbs +3 -0
  226. data/sig/about_to_str_acceptance_test.rbs +3 -0
  227. data/sig/about_triangle_project_acceptance_test.rbs +3 -0
  228. data/sig/about_triangle_project_two_acceptance_test.rbs +3 -0
  229. data/sig/about_true_and_false_command_test.rbs +4 -0
  230. data/sig/catalog_error_command_test.rbs +4 -0
  231. data/sig/checker_test.rbs +9 -0
  232. data/sig/class_state_acceptance_test.rbs +3 -0
  233. data/sig/closure_capture_acceptance_test.rbs +3 -0
  234. data/sig/command_support.rbs +18 -0
  235. data/sig/command_test.rbs +5 -0
  236. data/sig/constant_scope_acceptance_test.rbs +3 -0
  237. data/sig/core_protocols_acceptance_test.rbs +3 -0
  238. data/sig/curriculum_cop_test.rbs +9 -0
  239. data/sig/delegation_acceptance_test.rbs +3 -0
  240. data/sig/dynamic_methods_acceptance_test.rbs +3 -0
  241. data/sig/exception_flow_acceptance_test.rbs +3 -0
  242. data/sig/exercise_test.rbs +3 -0
  243. data/sig/exercises/about_array_assignment.rbs +36 -0
  244. data/sig/exercises/about_arrays.rbs +51 -0
  245. data/sig/exercises/about_asserts.rbs +23 -0
  246. data/sig/exercises/about_blocks.rbs +40 -0
  247. data/sig/exercises/about_class_methods.rbs +62 -0
  248. data/sig/exercises/about_classes.rbs +88 -0
  249. data/sig/exercises/about_constants.rbs +53 -0
  250. data/sig/exercises/about_control_statements.rbs +46 -0
  251. data/sig/exercises/about_dice_project.rbs +16 -0
  252. data/sig/exercises/about_exceptions.rbs +36 -0
  253. data/sig/exercises/about_extra_credit.rbs +36 -0
  254. data/sig/exercises/about_hashes.rbs +62 -0
  255. data/sig/exercises/about_inheritance.rbs +50 -0
  256. data/sig/exercises/about_iteration.rbs +37 -0
  257. data/sig/exercises/about_keyword_arguments.rbs +33 -0
  258. data/sig/exercises/about_message_passing.rbs +68 -0
  259. data/sig/exercises/about_methods.rbs +68 -0
  260. data/sig/exercises/about_modules.rbs +38 -0
  261. data/sig/exercises/about_nil.rbs +23 -0
  262. data/sig/exercises/about_objects.rbs +38 -0
  263. data/sig/exercises/about_open_classes.rbs +31 -0
  264. data/sig/exercises/about_pattern_matching.rbs +65 -0
  265. data/sig/exercises/about_proxy_object_project.rbs +31 -0
  266. data/sig/exercises/about_regular_expressions.rbs +83 -0
  267. data/sig/exercises/about_sandwich_code.rbs +17 -0
  268. data/sig/exercises/about_scope.rbs +59 -0
  269. data/sig/exercises/about_scoring_project.rbs +16 -0
  270. data/sig/exercises/about_strings.rbs +85 -0
  271. data/sig/exercises/about_symbols.rbs +46 -0
  272. data/sig/exercises/about_to_str.rbs +36 -0
  273. data/sig/exercises/about_triangle_project.rbs +11 -0
  274. data/sig/exercises/about_triangle_project_two.rbs +12 -0
  275. data/sig/exercises/about_true_and_false.rbs +27 -0
  276. data/sig/exercises/blocks_and_methods.rbs +11 -0
  277. data/sig/exercises/class_state.rbs +19 -0
  278. data/sig/exercises/closure_capture.rbs +10 -0
  279. data/sig/exercises/collection_basics.rbs +6 -0
  280. data/sig/exercises/collection_basics_test.rbs +4 -0
  281. data/sig/exercises/constant_scope.rbs +11 -0
  282. data/sig/exercises/core_protocols.rbs +20 -0
  283. data/sig/exercises/delegation.rbs +14 -0
  284. data/sig/exercises/dynamic_methods.rbs +13 -0
  285. data/sig/exercises/exception_flow.rbs +11 -0
  286. data/sig/exercises/heredoc_layout.rbs +11 -0
  287. data/sig/exercises/keyword_forwarding.rbs +12 -0
  288. data/sig/exercises/lazy_enumeration.rbs +10 -0
  289. data/sig/exercises/literals_and_operators.rbs +12 -0
  290. data/sig/exercises/method_contracts.rbs +11 -0
  291. data/sig/exercises/method_lookup.rbs +16 -0
  292. data/sig/exercises/nonlocal_exit.rbs +14 -0
  293. data/sig/exercises/numbered_parameters.rbs +11 -0
  294. data/sig/exercises/numeric_precision.rbs +11 -0
  295. data/sig/exercises/pattern_matching.rbs +10 -0
  296. data/sig/exercises/refinement_scope.rbs +18 -0
  297. data/sig/exercises/regexp_captures.rbs +11 -0
  298. data/sig/exercises/runtime_context.rbs +23 -0
  299. data/sig/exercises/shared_rows.rbs +11 -0
  300. data/sig/exercises/singleton_pattern.rbs +14 -0
  301. data/sig/exercises/time_and_date.rbs +11 -0
  302. data/sig/exercises/visibility.rbs +18 -0
  303. data/sig/fixture_support.rbs +11 -0
  304. data/sig/help_hint_command_test.rbs +8 -0
  305. data/sig/heredoc_layout_acceptance_test.rbs +3 -0
  306. data/sig/keyboard_session_test.rbs +9 -0
  307. data/sig/keyword_forwarding_acceptance_test.rbs +3 -0
  308. data/sig/lazy_enumeration_acceptance_test.rbs +3 -0
  309. data/sig/literals_and_operators_acceptance_test.rbs +3 -0
  310. data/sig/method_contracts_acceptance_test.rbs +3 -0
  311. data/sig/method_lookup_acceptance_test.rbs +3 -0
  312. data/sig/nonlocal_exit_acceptance_test.rbs +3 -0
  313. data/sig/numbered_parameters_acceptance_test.rbs +3 -0
  314. data/sig/numeric_precision_acceptance_test.rbs +4 -0
  315. data/sig/packaging_test.rbs +3 -0
  316. data/sig/pattern_matching_acceptance_test.rbs +3 -0
  317. data/sig/reference_solutions_test.rbs +3 -0
  318. data/sig/refinement_scope_acceptance_test.rbs +3 -0
  319. data/sig/regexp_captures_acceptance_test.rbs +4 -0
  320. data/sig/rkoans/catalog.rbs +11 -0
  321. data/sig/rkoans/checker.rbs +22 -0
  322. data/sig/rkoans/cli.rbs +21 -0
  323. data/sig/rkoans/exercise.rbs +18 -0
  324. data/sig/rkoans/keyboard.rbs +13 -0
  325. data/sig/rkoans/progress.rbs +9 -0
  326. data/sig/rkoans/selection.rbs +9 -0
  327. data/sig/rkoans/session.rbs +30 -0
  328. data/sig/rkoans/terminal_view.rbs +24 -0
  329. data/sig/rkoans/watcher.rbs +18 -0
  330. data/sig/rkoans.rbs +2 -0
  331. data/sig/runtime_context_command_test.rbs +4 -0
  332. data/sig/selection_command_test.rbs +5 -0
  333. data/sig/session_command_test.rbs +12 -0
  334. data/sig/session_edge_cases_test.rbs +4 -0
  335. data/sig/shared_rows_acceptance_test.rbs +3 -0
  336. data/sig/singleton_pattern_acceptance_test.rbs +3 -0
  337. data/sig/time_and_date_acceptance_test.rbs +4 -0
  338. data/sig/visibility_acceptance_test.rbs +4 -0
  339. data/sig/watcher_test.rbs +3 -0
  340. data/solutions/about-array-assignment/about_array_assignment.rb +36 -0
  341. data/solutions/about-arrays/about_arrays.rb +53 -0
  342. data/solutions/about-asserts/about_asserts.rb +22 -0
  343. data/solutions/about-blocks/about_blocks.rb +30 -0
  344. data/solutions/about-class-methods/about_class_methods.rb +36 -0
  345. data/solutions/about-classes/about_classes.rb +40 -0
  346. data/solutions/about-constants/about_constants.rb +26 -0
  347. data/solutions/about-control-statements/about_control_statements.rb +35 -0
  348. data/solutions/about-dice-project/about_dice_project.rb +27 -0
  349. data/solutions/about-exceptions/about_exceptions.rb +30 -0
  350. data/solutions/about-extra-credit/about_extra_credit.rb +114 -0
  351. data/solutions/about-hashes/about_hashes.rb +52 -0
  352. data/solutions/about-inheritance/about_inheritance.rb +27 -0
  353. data/solutions/about-iteration/about_iteration.rb +31 -0
  354. data/solutions/about-keyword-arguments/about_keyword_arguments.rb +28 -0
  355. data/solutions/about-message-passing/about_message_passing.rb +38 -0
  356. data/solutions/about-methods/about_methods.rb +39 -0
  357. data/solutions/about-modules/about_modules.rb +23 -0
  358. data/solutions/about-nil/about_nil.rb +23 -0
  359. data/solutions/about-objects/about_objects.rb +34 -0
  360. data/solutions/about-open-classes/about_open_classes.rb +23 -0
  361. data/solutions/about-pattern-matching/about_pattern_matching.rb +39 -0
  362. data/solutions/about-proxy-object-project/about_proxy_object_project.rb +44 -0
  363. data/solutions/about-regular-expressions/about_regular_expressions.rb +60 -0
  364. data/solutions/about-sandwich-code/about_sandwich_code.rb +60 -0
  365. data/solutions/about-scope/about_scope.rb +33 -0
  366. data/solutions/about-scoring-project/about_scoring_project.rb +19 -0
  367. data/solutions/about-strings/about_strings.rb +56 -0
  368. data/solutions/about-symbols/about_symbols.rb +35 -0
  369. data/solutions/about-to-str/about_to_str.rb +24 -0
  370. data/solutions/about-triangle-project/about_triangle_project.rb +19 -0
  371. data/solutions/about-triangle-project-two/about_triangle_project_two.rb +25 -0
  372. data/solutions/about-true-and-false/about_true_and_false.rb +25 -0
  373. data/solutions/blocks-and-methods/blocks_and_methods.rb +14 -0
  374. data/solutions/class-state/class_state.rb +33 -0
  375. data/solutions/closure-capture/closure_capture.rb +12 -0
  376. data/solutions/collection-basics/collection_basics.rb +14 -0
  377. data/solutions/constant-scope/constant_scope.rb +18 -0
  378. data/solutions/core-protocols/core_protocols.rb +44 -0
  379. data/solutions/delegation/delegation.rb +17 -0
  380. data/solutions/dynamic-methods/dynamic_methods.rb +32 -0
  381. data/solutions/exception-flow/exception_flow.rb +34 -0
  382. data/solutions/heredoc-layout/heredoc_layout.rb +24 -0
  383. data/solutions/keyword-forwarding/keyword_forwarding.rb +26 -0
  384. data/solutions/lazy-enumeration/lazy_enumeration.rb +11 -0
  385. data/solutions/literals-and-operators/literals_and_operators.rb +22 -0
  386. data/solutions/method-contracts/method_contracts.rb +18 -0
  387. data/solutions/method-lookup/method_lookup.rb +26 -0
  388. data/solutions/nonlocal-exit/nonlocal_exit.rb +46 -0
  389. data/solutions/numbered-parameters/numbered_parameters.rb +18 -0
  390. data/solutions/numeric-precision/numeric_precision.rb +17 -0
  391. data/solutions/pattern-matching/pattern_matching.rb +17 -0
  392. data/solutions/refinement-scope/refinement_scope.rb +34 -0
  393. data/solutions/regexp-captures/regexp_captures.rb +24 -0
  394. data/solutions/runtime-context/runtime_context.rb +19 -0
  395. data/solutions/shared-rows/shared_rows.rb +13 -0
  396. data/solutions/singleton-pattern/singleton_pattern.rb +19 -0
  397. data/solutions/time-and-date/time_and_date.rb +16 -0
  398. data/solutions/visibility/visibility.rb +34 -0
  399. data/test/exercises/about_array_assignment_test.rb +87 -0
  400. data/test/exercises/about_arrays_test.rb +119 -0
  401. data/test/exercises/about_asserts_test.rb +41 -0
  402. data/test/exercises/about_blocks_test.rb +140 -0
  403. data/test/exercises/about_class_methods_test.rb +232 -0
  404. data/test/exercises/about_classes_test.rb +261 -0
  405. data/test/exercises/about_constants_test.rb +111 -0
  406. data/test/exercises/about_control_statements_test.rb +188 -0
  407. data/test/exercises/about_dice_project_test.rb +40 -0
  408. data/test/exercises/about_exceptions_test.rb +98 -0
  409. data/test/exercises/about_extra_credit_test.rb +74 -0
  410. data/test/exercises/about_hashes_test.rb +163 -0
  411. data/test/exercises/about_inheritance_test.rb +121 -0
  412. data/test/exercises/about_iteration_test.rb +148 -0
  413. data/test/exercises/about_keyword_arguments_test.rb +80 -0
  414. data/test/exercises/about_message_passing_test.rb +230 -0
  415. data/test/exercises/about_methods_test.rb +208 -0
  416. data/test/exercises/about_modules_test.rb +98 -0
  417. data/test/exercises/about_nil_test.rb +35 -0
  418. data/test/exercises/about_objects_test.rb +74 -0
  419. data/test/exercises/about_open_classes_test.rb +60 -0
  420. data/test/exercises/about_pattern_matching_test.rb +257 -0
  421. data/test/exercises/about_proxy_object_project_test.rb +75 -0
  422. data/test/exercises/about_regular_expressions_test.rb +243 -0
  423. data/test/exercises/about_sandwich_code_test.rb +82 -0
  424. data/test/exercises/about_scope_test.rb +123 -0
  425. data/test/exercises/about_scoring_project_test.rb +62 -0
  426. data/test/exercises/about_strings_test.rb +255 -0
  427. data/test/exercises/about_symbols_test.rb +120 -0
  428. data/test/exercises/about_to_str_test.rb +89 -0
  429. data/test/exercises/about_triangle_project_test.rb +29 -0
  430. data/test/exercises/about_triangle_project_two_test.rb +28 -0
  431. data/test/exercises/about_true_and_false_test.rb +43 -0
  432. data/test/exercises/blocks_and_methods_test.rb +22 -0
  433. data/test/exercises/class_state_test.rb +29 -0
  434. data/test/exercises/closure_capture_test.rb +29 -0
  435. data/test/exercises/collection_basics_test.rb +18 -0
  436. data/test/exercises/constant_scope_test.rb +18 -0
  437. data/test/exercises/core_protocols_test.rb +28 -0
  438. data/test/exercises/delegation_test.rb +23 -0
  439. data/test/exercises/dynamic_methods_test.rb +28 -0
  440. data/test/exercises/exception_flow_test.rb +17 -0
  441. data/test/exercises/heredoc_layout_test.rb +18 -0
  442. data/test/exercises/keyword_forwarding_test.rb +22 -0
  443. data/test/exercises/lazy_enumeration_test.rb +15 -0
  444. data/test/exercises/literals_and_operators_test.rb +25 -0
  445. data/test/exercises/method_contracts_test.rb +28 -0
  446. data/test/exercises/method_lookup_test.rb +14 -0
  447. data/test/exercises/nonlocal_exit_test.rb +22 -0
  448. data/test/exercises/numbered_parameters_test.rb +15 -0
  449. data/test/exercises/numeric_precision_test.rb +24 -0
  450. data/test/exercises/pattern_matching_test.rb +18 -0
  451. data/test/exercises/refinement_scope_test.rb +14 -0
  452. data/test/exercises/regexp_captures_test.rb +20 -0
  453. data/test/exercises/runtime_context_test.rb +59 -0
  454. data/test/exercises/shared_rows_test.rb +34 -0
  455. data/test/exercises/singleton_pattern_test.rb +16 -0
  456. data/test/exercises/time_and_date_test.rb +22 -0
  457. data/test/exercises/visibility_test.rb +22 -0
  458. metadata +471 -4
  459. data/Rakefile +0 -12
  460. data/sig/test_rkoans.rbs +0 -3
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rkoans
4
+ # Renders check output, the completed screen, and the session footer.
5
+ class TerminalView
6
+ HELP = <<~TEXT
7
+ Keyboard help
8
+
9
+ l List exercises immediately.
10
+ s Show the current exercise immediately.
11
+ h Show an exercise hint immediately (unfinished current exercise only).
12
+ ? Show this help immediately.
13
+ n + Enter Move to the next exercise after the current checks pass.
14
+ q + Enter Quit and preserve your edits.
15
+ Ctrl-C Quit and preserve your edits.
16
+
17
+ Saving your exercise file reruns its checks automatically.
18
+ TEXT
19
+
20
+ # @param catalog [Catalog] ordered exercises used by this component
21
+ def initialize(out:, catalog: Catalog.new)
22
+ @catalog = catalog
23
+ @out = out
24
+ end
25
+
26
+ def render(exercise:, result:, completed:, watching:, message: nil)
27
+ clear if watching
28
+ @out.puts "Output\n\n"
29
+ if watching && result.exit_code.zero?
30
+ show_completed(exercise)
31
+ else
32
+ show_checks(exercise, result)
33
+ end
34
+ @out.puts "\n#{message}" if message
35
+ footer(exercise, completed, result.exit_code.zero?) if watching
36
+ end
37
+
38
+ def show_message(message, exercise:, completed:, passed:, mode: :current)
39
+ clear
40
+ @out.puts "Output\n\n#{message}"
41
+ footer(exercise, completed, passed, listing: mode == :list) unless mode == :quit
42
+ end
43
+
44
+ def show_list(exercise:, completed:, passed:)
45
+ clear
46
+ @out.puts "Exercises\n\n"
47
+ @catalog.ids.each do |id|
48
+ marker = id == exercise.id ? '>' : ' '
49
+ state = completed.include?(id) ? 'done' : 'open'
50
+ @out.puts "#{marker} [#{state}] #{id}"
51
+ end
52
+ footer(exercise, completed, passed, listing: true)
53
+ end
54
+
55
+ def footer(exercise, completed, passed, listing: false)
56
+ @out.puts progress_line(completed.size)
57
+ @out.puts "Current exercise: #{colorize(exercise.solution, 36)}"
58
+ @out.puts colorize('Watching for saves · Ctrl-C to exit', 36)
59
+ @out.puts "\n#{commands(passed, listing: listing)}"
60
+ end
61
+
62
+ private
63
+
64
+ def clear
65
+ @out.print "\e[3J\e[2J\e[H" if @out.tty?
66
+ end
67
+
68
+ def progress_line(count)
69
+ filled = count * 20 / @catalog.ids.size
70
+ bar = colorize('#' * filled, 32) + colorize('-' * (20 - filled), 31)
71
+ "\nProgress: [#{bar}] #{count}/#{@catalog.ids.size}"
72
+ end
73
+
74
+ def commands(passed, listing:)
75
+ return 's:show current / n:next (Enter) / q:quit (Enter) / ?:help' if listing
76
+
77
+ passed ? 'n:next (Enter) / l:list / q:quit (Enter) / ?:help' : 'h:hint / l:list / q:quit (Enter) / ?:help'
78
+ end
79
+
80
+ def show_completed(exercise)
81
+ @out.puts colorize('Exercise done ✓', 32)
82
+ @out.puts "Solution for comparison: #{colorize(exercise.reference, 36)}"
83
+ @out.puts 'When done experimenting, enter n to move on to the next exercise.'
84
+ end
85
+
86
+ def show_checks(exercise, result)
87
+ @out.puts exercise.instructions
88
+ @out.puts "\nEdit: #{exercise.solution}\n\n"
89
+ @out.puts result.output
90
+ @out.puts(result.exit_code.zero? ? colorize('PASS', 32) : colorize('FAIL', 31))
91
+ end
92
+
93
+ def colorize(text, code)
94
+ return text unless @out.tty? && !ENV.key?('NO_COLOR')
95
+
96
+ "\e[#{code}m#{text}\e[0m"
97
+ end
98
+ end
99
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rkoans
4
- VERSION = '0.0.1'
4
+ VERSION = '0.1.0'
5
5
  end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'digest'
4
+
5
+ module Rkoans
6
+ # Reruns a block after file contents change and saves settle.
7
+ class Watcher
8
+ # @param [String] path
9
+ # @param [Float] interval
10
+ # @param [Float] debounce
11
+ def initialize(path, interval: 0.1, debounce: 0.2)
12
+ @path = path
13
+ @interval = interval
14
+ @debounce = debounce
15
+ end
16
+
17
+ # Calls the block initially and after saves, until interrupted.
18
+ def run(input: nil)
19
+ keyboard = Keyboard.new(input: input)
20
+ @previous = fingerprint
21
+ @changed_at = nil
22
+ keyboard.with_terminal do
23
+ yield nil
24
+ loop do
25
+ command = keyboard.read(@interval)
26
+ yield command if command
27
+ yield nil if changed?
28
+ end
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def changed?
35
+ current = fingerprint
36
+ if current != @previous
37
+ @previous = current
38
+ @changed_at = monotonic_time
39
+ elsif @changed_at && monotonic_time - @changed_at >= @debounce
40
+ @changed_at = nil
41
+ return true
42
+ end
43
+ false
44
+ end
45
+
46
+ # @return [String, nil]
47
+ def fingerprint
48
+ Digest::SHA256.file(@path).hexdigest
49
+ rescue Errno::ENOENT
50
+ nil
51
+ end
52
+
53
+ # @return [Float]
54
+ def monotonic_time
55
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
56
+ end
57
+ end
58
+ end
data/lib/rkoans.rb CHANGED
@@ -1,5 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rkoans
4
- class Error < StandardError; end
5
- end
3
+ require_relative 'rkoans/error'
4
+
5
+ require_relative 'rkoans/version'
6
+ require_relative 'rkoans/catalog'
7
+ require_relative 'rkoans/exercise'
8
+ require_relative 'rkoans/selection'
9
+ require_relative 'rkoans/progress'
10
+ require_relative 'rkoans/checker'
11
+ require_relative 'rkoans/keyboard'
12
+ require_relative 'rkoans/watcher'
13
+ require_relative 'rkoans/terminal_view'
14
+ require_relative 'rkoans/session'
15
+ require_relative 'rkoans/cli'
@@ -0,0 +1,3 @@
1
+ class AboutArrayAssignmentAcceptanceTest
2
+ def test_incorrect_splat_and_missing_value_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutArraysAcceptanceTest
2
+ def test_incorrect_slice_and_pop_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,4 @@
1
+ class AboutAssertsCommandTest
2
+ include CommandSupport
3
+ def test_default_start_introduces_assertions_and_checks_each_answer: -> void
4
+ end
@@ -0,0 +1,3 @@
1
+ class AboutBlocksAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutClassMethodsAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutClassesAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutConstantsAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutControlStatementsAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutDiceProjectAcceptanceTest
2
+ def test_incomplete_implementation_is_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutExceptionsAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,5 @@
1
+ class AboutExtraCreditAcceptanceTest
2
+ def test_incomplete_implementation_is_rejected: -> void
3
+ private
4
+ def incomplete_repairs: -> Array[[String, String]]
5
+ end
@@ -0,0 +1,3 @@
1
+ class AboutHashesAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutInheritanceAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutIterationAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutKeywordArgumentsAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutMessagePassingAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutMethodsAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutModulesAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutNilAcceptanceTest
2
+ def test_incorrect_error_and_empty_message_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutObjectsAcceptanceTest
2
+ def test_incorrect_nil_conversion_and_clone_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutOpenClassesAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutPatternMatchingAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutProxyObjectProjectAcceptanceTest
2
+ def test_incomplete_implementation_is_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutRegularExpressionsAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutSandwichCodeAcceptanceTest
2
+ def test_incomplete_implementation_is_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutScopeAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutScoringProjectAcceptanceTest
2
+ def test_incomplete_implementation_is_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutStringsAcceptanceTest
2
+ def test_incorrect_mutation_and_identity_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutSymbolsAcceptanceTest
2
+ def test_incorrect_identity_and_exception_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutToStrAcceptanceTest
2
+ def test_incorrect_predictions_are_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutTriangleProjectAcceptanceTest
2
+ def test_incomplete_implementation_is_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class AboutTriangleProjectTwoAcceptanceTest
2
+ def test_incomplete_implementation_is_rejected: -> void
3
+ end
@@ -0,0 +1,4 @@
1
+ class AboutTrueAndFalseCommandTest
2
+ include CommandSupport
3
+ def test_truth_values_reject_partial_answers_and_accept_reference: -> void
4
+ end
@@ -0,0 +1,4 @@
1
+ class CatalogErrorCommandTest
2
+ include CommandSupport
3
+ def test_invalid_and_missing_catalogs_exit_cleanly: -> void
4
+ end
@@ -0,0 +1,9 @@
1
+ class CheckerTest
2
+ class TimeoutExercise < Rkoans::Exercise
3
+ @checks: String
4
+ attr_reader checks: String
5
+ def initialize: (directory: String, checks: String) -> void
6
+ end
7
+
8
+ def test_timeout_stops_the_check_and_its_child_process: -> void
9
+ end
@@ -0,0 +1,3 @@
1
+ class ClassStateAcceptanceTest
2
+ def test_incorrect_fix_is_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class ClosureCaptureAcceptanceTest
2
+ def test_incorrect_fix_is_rejected: -> void
3
+ end
@@ -0,0 +1,18 @@
1
+ module CommandSupport
2
+ interface _Stream
3
+ def readline: -> String
4
+ end
5
+
6
+ ROOT: String
7
+ COMMAND: Array[String]
8
+
9
+ private
10
+
11
+ def command: -> Array[String]
12
+ def reference_source: (?String id) -> String
13
+
14
+ def solution: (String directory) -> String
15
+ def run_command: (*String command_name, directory: String) -> [String, Process::Status]
16
+ def with_watcher: (*String message, directory: String) { (_Stream) -> untyped } -> untyped
17
+ def wait_for: (_Stream stream, String text) -> String
18
+ end
@@ -0,0 +1,5 @@
1
+ class CommandTest
2
+ include FixtureSupport
3
+ def test_check_reports_failure_then_success_from_another_directory: -> void
4
+ def test_default_start_watches_atomic_saves_and_preserves_edits_on_restart: -> void
5
+ end
@@ -0,0 +1,3 @@
1
+ class ConstantScopeAcceptanceTest
2
+ def test_incorrect_fix_is_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class CoreProtocolsAcceptanceTest
2
+ def test_incorrect_fix_is_rejected: -> void
3
+ end
@@ -0,0 +1,9 @@
1
+ class CurriculumCopTest
2
+ def test_complete_curriculum_and_missing_asset_diagnostics: -> void
3
+ def test_reports_multiple_curriculum_defects_together: -> void
4
+ def test_invalid_catalog_is_reported_as_an_offense: -> void
5
+ private
6
+ def with_curriculum: { (String directory) -> void } -> void
7
+ def copy_cop: (String root, String directory) -> void
8
+ def offenses: (String directory) -> Array[String]
9
+ end
@@ -0,0 +1,3 @@
1
+ class DelegationAcceptanceTest
2
+ def test_incorrect_fix_is_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class DynamicMethodsAcceptanceTest
2
+ def test_incorrect_fix_is_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class ExceptionFlowAcceptanceTest
2
+ def test_incorrect_fix_is_rejected: -> void
3
+ end
@@ -0,0 +1,3 @@
1
+ class ExerciseTest
2
+ def test_start_preserves_existing_class_named_files: -> void
3
+ end
@@ -0,0 +1,36 @@
1
+ # SPDX-License-Identifier: CC-BY-NC-SA-3.0
2
+ # Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
3
+ # See THIRD_PARTY_NOTICES.md for attribution and license terms.
4
+
5
+ module Exercises
6
+ class AboutArrayAssignment
7
+ type answers = {
8
+ names: (Array[String] | :fill_me_in),
9
+ first_name: (String | :fill_me_in),
10
+ last_name: (String | :fill_me_in),
11
+ extra_first: (String | :fill_me_in),
12
+ extra_last: (String | :fill_me_in),
13
+ splat_first: (String | :fill_me_in),
14
+ splat_last: (Array[String] | :fill_me_in),
15
+ short_first: (String | :fill_me_in),
16
+ short_last: (nil | :fill_me_in),
17
+ nested_first: (Array[String] | :fill_me_in),
18
+ nested_last: (String | :fill_me_in),
19
+ single_first: (String | :fill_me_in),
20
+ swapped_first: (String | :fill_me_in),
21
+ swapped_last: (String | :fill_me_in)
22
+ }
23
+ def self.koans: -> answers
24
+ end
25
+ end
26
+
27
+ class AboutArrayAssignmentTest
28
+ def test_non_parallel_assignment: -> void
29
+ def test_parallel_assignments: -> void
30
+ def test_parallel_assignments_with_extra_values: -> void
31
+ def test_parallel_assignments_with_splat_operator: -> void
32
+ def test_parallel_assignments_with_too_few_values: -> void
33
+ def test_parallel_assignments_with_subarrays: -> void
34
+ def test_parallel_assignment_with_one_variable: -> void
35
+ def test_swapping_with_parallel_assignment: -> void
36
+ end
@@ -0,0 +1,51 @@
1
+ # SPDX-License-Identifier: CC-BY-NC-SA-3.0
2
+ # Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
3
+ # See THIRD_PARTY_NOTICES.md for attribution and license terms.
4
+
5
+ module Exercises
6
+ class AboutArrays
7
+ type answers = {
8
+ empty_type: (singleton(Array) | :fill_me_in),
9
+ empty_size: (Integer | :fill_me_in),
10
+ second_literal: (Integer | :fill_me_in),
11
+ after_append: (Array[Integer] | :fill_me_in),
12
+ first_index: Symbol,
13
+ first_method: Symbol,
14
+ last_index: Symbol,
15
+ last_method: Symbol,
16
+ negative_last: Symbol,
17
+ negative_third: Symbol,
18
+ slice_one: (Array[Symbol] | :fill_me_in),
19
+ slice_two: (Array[Symbol] | :fill_me_in),
20
+ slice_tail: (Array[Symbol] | :fill_me_in),
21
+ slice_long_tail: (Array[Symbol] | :fill_me_in),
22
+ slice_at_end_zero: (Array[Symbol] | :fill_me_in),
23
+ slice_at_end_long: (Array[Symbol] | :fill_me_in),
24
+ slice_beyond_end: (nil | :fill_me_in),
25
+ range_type: (singleton(Range) | :fill_me_in),
26
+ inclusive_range: (Array[Integer] | :fill_me_in),
27
+ exclusive_range: (Array[Integer] | :fill_me_in),
28
+ inclusive_slice: (Array[Symbol] | :fill_me_in),
29
+ exclusive_slice: (Array[Symbol] | :fill_me_in),
30
+ negative_range_slice: (Array[Symbol] | :fill_me_in),
31
+ after_push: (Array[Integer | Symbol] | :fill_me_in),
32
+ popped_value: Symbol,
33
+ after_pop: (Array[Integer] | :fill_me_in),
34
+ after_unshift: (Array[Integer | Symbol] | :fill_me_in),
35
+ shifted_value: Symbol,
36
+ after_shift: (Array[Integer] | :fill_me_in)
37
+ }
38
+ def self.koans: -> answers
39
+ end
40
+ end
41
+
42
+ class AboutArraysTest
43
+ def test_creating_arrays: -> void
44
+ def test_array_literals: -> void
45
+ def test_accessing_array_elements: -> void
46
+ def test_slicing_arrays: -> void
47
+ def test_arrays_and_ranges: -> void
48
+ def test_slicing_with_ranges: -> void
49
+ def test_pushing_and_popping_arrays: -> void
50
+ def test_shifting_arrays: -> void
51
+ end
@@ -0,0 +1,23 @@
1
+ # SPDX-License-Identifier: CC-BY-NC-SA-3.0
2
+ # Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
3
+ # See THIRD_PARTY_NOTICES.md for attribution and license terms.
4
+ module Exercises
5
+ class AboutAsserts
6
+ type answers = {
7
+ truth: bool,
8
+ with_message: bool,
9
+ expected_value: Integer?,
10
+ better_expected_value: Integer?,
11
+ filled_value: Integer?
12
+ }
13
+ def self.koans: -> answers
14
+ end
15
+ end
16
+
17
+ class AboutAssertsTest
18
+ def test_assert_truth: -> void
19
+ def test_assert_with_message: -> void
20
+ def test_assert_equality: -> void
21
+ def test_a_better_way_of_asserting_equality: -> void
22
+ def test_fill_in_values: -> void
23
+ end
@@ -0,0 +1,40 @@
1
+ # SPDX-License-Identifier: CC-BY-NC-SA-3.0
2
+ # Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
3
+ # See THIRD_PARTY_NOTICES.md for attribution and license terms.
4
+
5
+ module Exercises
6
+ class AboutBlocks
7
+ type answers = {
8
+ methods_can_take_blocks_one: (::Integer | :fill_me_in),
9
+ blocks_can_be_defined_with_do_end_too_one: (::Integer | :fill_me_in),
10
+ blocks_can_take_arguments_one: (::String | :fill_me_in),
11
+ methods_can_call_yield_many_times_one: (::Array[::Symbol] | :fill_me_in),
12
+ methods_can_see_if_they_have_been_called_with_a_block_one: (::Symbol | :fill_me_in),
13
+ methods_can_see_if_they_have_been_called_with_a_block_two: (::Symbol | :fill_me_in),
14
+ block_can_affect_variables_in_the_code_where_they_are_created_one: (::Symbol | :fill_me_in),
15
+ blocks_can_be_assigned_to_variables_and_called_explicitly_one: (::Integer | :fill_me_in),
16
+ blocks_can_be_assigned_to_variables_and_called_explicitly_two: (::Integer | :fill_me_in),
17
+ stand_alone_blocks_can_be_passed_to_methods_expecting_blocks_one: (::String | :fill_me_in),
18
+ methods_can_take_an_explicit_block_argument_one: (::Integer | :fill_me_in),
19
+ methods_can_take_an_explicit_block_argument_two: (::Integer | :fill_me_in)
20
+ }
21
+ def self.koans: -> answers
22
+ end
23
+ end
24
+
25
+ class AboutBlocksTest
26
+ def method_with_block: [A] () { () -> A } -> A
27
+ def test_methods_can_take_blocks: -> void
28
+ def test_blocks_can_be_defined_with_do_end_too: -> void
29
+ def method_with_block_arguments: [A] () { (String) -> A } -> A
30
+ def test_blocks_can_take_arguments: -> void
31
+ def many_yields: [A] () { (Symbol) -> A } -> A
32
+ def test_methods_can_call_yield_many_times: -> void
33
+ def yield_tester: [A] () ?{ () -> A } -> (A | Symbol)
34
+ def test_methods_can_see_if_they_have_been_called_with_a_block: -> void
35
+ def test_block_can_affect_variables_in_the_code_where_they_are_created: -> void
36
+ def test_blocks_can_be_assigned_to_variables_and_called_explicitly: -> void
37
+ def test_stand_alone_blocks_can_be_passed_to_methods_expecting_blocks: -> void
38
+ def method_with_explicit_block: [A] () { (Integer) -> A } -> A
39
+ def test_methods_can_take_an_explicit_block_argument: -> void
40
+ end