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,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ # SPDX-License-Identifier: CC-BY-NC-SA-3.0
4
+ # Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
5
+ # See THIRD_PARTY_NOTICES.md for attribution and license terms.
6
+
7
+ module Exercises
8
+ # Predicts nil conversions and missing-method behavior.
9
+ class AboutNil
10
+ # Replace each :fill_me_in with the result described by its example.
11
+ # @return [Hash<Symbol, Boolean | String | Class>]
12
+ def self.koans
13
+ {
14
+ # nil.is_a?(Object)
15
+ nil_object: :fill_me_in,
16
+ # exception class raised by nil.some_method_nil_doesnt_know_about
17
+ missing_method_error: :fill_me_in,
18
+ # a nonempty substring of that exception message
19
+ message_fragment: :fill_me_in,
20
+ # nil.nil?
21
+ nil_predicate: :fill_me_in,
22
+ # nil.to_s
23
+ string_value: :fill_me_in,
24
+ # nil.inspect
25
+ inspected_value: :fill_me_in
26
+ }
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,12 @@
1
+ # About Nil
2
+
3
+ Replace each `:fill_me_in` in `about_nil.rb` with the result described by its
4
+ example. Predict whether nil is an object, its supported conversions, and what
5
+ happens when a method it does not know is called.
6
+
7
+ For `missing_method_error`, supply the exception class. For `message_fragment`,
8
+ supply a nonempty string found in the exception's message. Predict a fragment
9
+ rather than the full message so diagnostic formatting can vary.
10
+
11
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
12
+ CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
@@ -0,0 +1,11 @@
1
+ # Hint
2
+
3
+ Nil is an object with methods. Compare `nil.nil?`, `nil.to_s`, and `nil.inspect`
4
+ in IRB, paying attention to an empty string versus a string spelling `nil`.
5
+
6
+ Call `nil.some_method_nil_doesnt_know_about` and inspect the exception's class
7
+ and message. The error names the missing method. Use a nonempty message fragment
8
+ as a string, without regular-expression delimiters.
9
+
10
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
11
+ CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ # SPDX-License-Identifier: CC-BY-NC-SA-3.0
4
+ # Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
5
+ # See THIRD_PARTY_NOTICES.md for attribution and license terms.
6
+
7
+ module Exercises
8
+ # Predicts conversion, inspection, and object identity.
9
+ class AboutObjects
10
+ # Replace each :fill_me_in with the result of its example.
11
+ # @return [Hash<Symbol, Boolean | String | Integer | Class>]
12
+ def self.koans
13
+ {
14
+ # 1.is_a?(Object)
15
+ integer_object: :fill_me_in,
16
+ # 1.5.is_a?(Object)
17
+ float_object: :fill_me_in,
18
+ # 'string'.is_a?(Object)
19
+ string_object: :fill_me_in,
20
+ # nil.is_a?(Object)
21
+ nil_object: :fill_me_in,
22
+ # Object.is_a?(Object)
23
+ class_object: :fill_me_in,
24
+ # 123.to_s
25
+ integer_string: :fill_me_in,
26
+ # nil.to_s
27
+ nil_string: :fill_me_in,
28
+ # 123.inspect
29
+ integer_inspect: :fill_me_in,
30
+ # nil.inspect
31
+ nil_inspect: :fill_me_in,
32
+ # obj = Object.new; obj.object_id.class
33
+ id_type: :fill_me_in,
34
+ # obj = Object.new; another_obj = Object.new; obj.object_id != another_obj.object_id
35
+ distinct_ids: :fill_me_in,
36
+ # 0.object_id
37
+ zero_id: :fill_me_in,
38
+ # 1.object_id
39
+ one_id: :fill_me_in,
40
+ # 2.object_id
41
+ two_id: :fill_me_in,
42
+ # 100.object_id
43
+ hundred_id: :fill_me_in,
44
+ # obj = Object.new; copy = obj.clone; obj != copy
45
+ clone_unequal: :fill_me_in,
46
+ # obj = Object.new; copy = obj.clone; obj.object_id != copy.object_id
47
+ clone_distinct_id: :fill_me_in
48
+ }
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,14 @@
1
+ # About Objects
2
+
3
+ Replace each `:fill_me_in` in `about_objects.rb` with the result of its example.
4
+ Answers include booleans, strings, integers, and the class of an object ID.
5
+
6
+ Explore ordinary values as objects, `to_s` versus `inspect`, identifiers for
7
+ distinct objects, and what happens when a plain object is cloned.
8
+
9
+ The small-integer ID examples observe MRI's representation on this course's
10
+ runtime. Their numeric pattern is an implementation detail; use identity
11
+ comparisons when reasoning about ordinary objects.
12
+
13
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
14
+ CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
@@ -0,0 +1,12 @@
1
+ # Hint
2
+
3
+ Compare `nil.to_s` with `nil.inspect` in IRB. One is a string conversion; the
4
+ other is a representation useful for inspecting a value.
5
+
6
+ An object keeps its ID while it is alive, and distinct live objects have
7
+ distinct IDs. A second variable can point to the same object; `clone` creates
8
+ a different object. Inspect IDs for `0`, `1`, `2`, and `100` to find the pattern
9
+ used for these small integers on MRI.
10
+
11
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
12
+ CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ # SPDX-License-Identifier: CC-BY-NC-SA-3.0
4
+ # Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
5
+ # See THIRD_PARTY_NOTICES.md for attribution and license terms.
6
+
7
+ module Exercises
8
+ # Predictions for open classes examples.
9
+ class AboutOpenClasses
10
+ # Replace each :fill_me_in with the result of the described expression.
11
+ # @return [Hash<Symbol, Object>]
12
+ # This method is an answer table, not a sequence of operations.
13
+ def self.koans
14
+ {
15
+ # As defined dogs do bark.
16
+ # fido = Dog.new
17
+ # assert_equal __, fido.bark
18
+ # Predict: fido.bark
19
+ as_defined_dogs_do_bark_one: :fill_me_in,
20
+ # After reopening dogs can both wag and bark.
21
+ # fido = Dog.new
22
+ # assert_equal __, fido.wag
23
+ # assert_equal __, fido.bark
24
+ # Predict: fido.wag
25
+ after_reopening_dogs_can_both_wag_and_bark_one: :fill_me_in,
26
+ # Predict: fido.bark
27
+ after_reopening_dogs_can_both_wag_and_bark_two: :fill_me_in,
28
+ # Even existing built in classes can be reopened.
29
+ # assert_equal __, 1.answer_to_life_universe_and_everything?
30
+ # assert_equal __, 42.answer_to_life_universe_and_everything?
31
+ # Predict: 1.answer_to_life_universe_and_everything?
32
+ even_existing_built_in_classes_can_be_reopened_one: :fill_me_in,
33
+ # Predict: 42.answer_to_life_universe_and_everything?
34
+ even_existing_built_in_classes_can_be_reopened_two: :fill_me_in
35
+ }
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,34 @@
1
+ # About Open Classes
2
+
3
+ Replace each `:fill_me_in` in `about_open_classes.rb` with the predicted result.
4
+ Each field identifies its example. Run the checks after edits to investigate the
5
+ next prediction. Answers include the Ruby values and exception classes shown by
6
+ the examples. Read the setup comments before evaluating an expression.
7
+
8
+ ## Example definitions
9
+
10
+ These definitions supply the objects and methods used by the prediction examples.
11
+ They run in the check class `AboutOpenClassesTest`.
12
+
13
+ ```ruby
14
+ class Dog
15
+ def bark
16
+ "WOOF"
17
+ end
18
+ end
19
+
20
+ class Dog
21
+ def wag
22
+ "HAPPY"
23
+ end
24
+ end
25
+
26
+ class ::Integer
27
+ def answer_to_life_universe_and_everything?
28
+ self == 42
29
+ end
30
+ end
31
+ ```
32
+
33
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
34
+ CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
@@ -0,0 +1,7 @@
1
+ # Hint
2
+
3
+ Reopening a class adds methods to that same class. Existing instances see
4
+ the new instance methods too. A leading `::` refers to a top-level class.
5
+
6
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
7
+ CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ # SPDX-License-Identifier: CC-BY-NC-SA-3.0
4
+ # Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
5
+ # See THIRD_PARTY_NOTICES.md for attribution and license terms.
6
+
7
+ module Exercises
8
+ # Predictions for pattern matching examples.
9
+ class AboutPatternMatching
10
+ # Replace each :fill_me_in with the result of the described expression.
11
+ # @return [Hash<Symbol, Object>]
12
+ # This method is an answer table, not a sequence of operations.
13
+ def self.koans # rubocop:disable Metrics/MethodLength
14
+ {
15
+ # Pattern may not match.
16
+ # begin
17
+ # case [true, false]
18
+ # in [a, b] if a == b # The condition after pattern is called guard.
19
+ # :match
20
+ # end
21
+ # rescue NoMatchingPatternError => ex
22
+ # What exception has been caught?
23
+ # assert_equal __, ex.class
24
+ # end
25
+ # Predict: ex.class
26
+ pattern_may_not_match_one: :fill_me_in,
27
+ # We can use else.
28
+ # result = case [true, false]
29
+ # in [a, b] if a == b
30
+ # :match
31
+ # else
32
+ # :no_match
33
+ # end
34
+ # assert_equal __, result
35
+ # Predict: result
36
+ we_can_use_else_one: :fill_me_in,
37
+ # Value pattern.
38
+ # assert_equal __, value_pattern(0)
39
+ # assert_equal __, value_pattern(5)
40
+ # assert_equal __, value_pattern(100)
41
+ # assert_equal __, value_pattern('Not a Number!')
42
+ # Predict: value_pattern(0)
43
+ value_pattern_one: :fill_me_in,
44
+ # Predict: value_pattern(5)
45
+ value_pattern_two: :fill_me_in,
46
+ # Predict: value_pattern(100)
47
+ value_pattern_three: :fill_me_in,
48
+ # Predict: value_pattern('Not a Number!')
49
+ value_pattern_four: :fill_me_in,
50
+ # Variable pattern with binding.
51
+ # assert_equal __, variable_pattern_with_binding(1)
52
+ # Predict: variable_pattern_with_binding(1)
53
+ variable_pattern_with_binding_one: :fill_me_in,
54
+ # Variable pattern with pin.
55
+ # assert_equal __, variable_pattern_with_pin(1)
56
+ # Predict: variable_pattern_with_pin(1)
57
+ variable_pattern_with_pin_one: :fill_me_in,
58
+ # Pattern with dropping.
59
+ # assert_equal __, pattern_with_dropping(['I will not be checked', 2])
60
+ # assert_equal __, pattern_with_dropping(['I will not be checked', 'But I will!'])
61
+ # Predict: pattern_with_dropping(['I will not be checked', 2])
62
+ pattern_with_dropping_one: :fill_me_in,
63
+ # Predict: pattern_with_dropping(['I will not be checked', 'But I will!'])
64
+ pattern_with_dropping_two: :fill_me_in,
65
+ # Alternative pattern.
66
+ # assert_equal __, alternative_pattern(0)
67
+ # assert_equal __, alternative_pattern(false)
68
+ # assert_equal __, alternative_pattern(nil)
69
+ # assert_equal __, alternative_pattern(4)
70
+ # Predict: alternative_pattern(0)
71
+ alternative_pattern_one: :fill_me_in,
72
+ # Predict: alternative_pattern(false)
73
+ alternative_pattern_two: :fill_me_in,
74
+ # Predict: alternative_pattern(nil)
75
+ alternative_pattern_three: :fill_me_in,
76
+ # Predict: alternative_pattern(4)
77
+ alternative_pattern_four: :fill_me_in,
78
+ # As pattern.
79
+ # assert_equal __, as_pattern
80
+ # Predict: as_pattern
81
+ as_pattern_one: :fill_me_in,
82
+ # Array pattern.
83
+ # assert_equal __, array_pattern(Deconstructible.new('abcd'))
84
+ # assert_equal __, array_pattern(Deconstructible.new('123'))
85
+ # Predict: array_pattern(Deconstructible.new('abcd'))
86
+ array_pattern_one: :fill_me_in,
87
+ # Predict: array_pattern(Deconstructible.new('123'))
88
+ array_pattern_two: :fill_me_in,
89
+ # Hash pattern.
90
+ # assert_equal __, hash_pattern(LetterAccountant.new('aaabbc'))
91
+ # assert_equal __, hash_pattern(LetterAccountant.new('xyz'))
92
+ # Predict: hash_pattern(LetterAccountant.new('aaabbc'))
93
+ hash_pattern_one: :fill_me_in,
94
+ # Predict: hash_pattern(LetterAccountant.new('xyz'))
95
+ hash_pattern_two: :fill_me_in,
96
+ # Hash pattern with sugar.
97
+ # assert_equal __, hash_pattern_with_sugar(LetterAccountant.new('aaabbc'))
98
+ # assert_equal __, hash_pattern_with_sugar(LetterAccountant.new('xyz'))
99
+ # Predict: hash_pattern_with_sugar(LetterAccountant.new('aaabbc'))
100
+ hash_pattern_with_sugar_one: :fill_me_in,
101
+ # Predict: hash_pattern_with_sugar(LetterAccountant.new('xyz'))
102
+ hash_pattern_with_sugar_two: :fill_me_in
103
+ }
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,124 @@
1
+ # About Pattern Matching
2
+
3
+ Replace each `:fill_me_in` in `about_pattern_matching.rb` with the predicted result.
4
+ Each field identifies its example. Run the checks after edits to investigate the
5
+ next prediction. Answers include the Ruby values and exception classes shown by
6
+ the examples. Read the setup comments before evaluating an expression.
7
+
8
+ ## Example definitions
9
+
10
+ These definitions supply the objects and methods used by the prediction examples.
11
+ They run in the check class `AboutPatternMatchingTest`.
12
+
13
+ ```ruby
14
+ class Deconstructible
15
+ def initialize(str)
16
+ @data = str
17
+ end
18
+
19
+ def deconstruct
20
+ @data&.split('')
21
+ end
22
+ end
23
+
24
+ class LetterAccountant
25
+ def initialize(str)
26
+ @data = str
27
+ end
28
+
29
+ def deconstruct_keys(keys)
30
+ # we will count number of occurrences of each key in our data
31
+ keys.map { |key| [key, @data.count(key.to_s)] }.to_h
32
+ end
33
+ end
34
+
35
+ def value_pattern(variable)
36
+ case variable
37
+ in 0
38
+ :match_exact_value
39
+ in 1..10
40
+ :match_in_range
41
+ in Integer
42
+ :match_with_class
43
+ else
44
+ :no_match
45
+ end
46
+ end
47
+
48
+ def variable_pattern_with_binding(variable)
49
+ case 0
50
+ in variable
51
+ variable
52
+ else
53
+ :no_match
54
+ end
55
+ end
56
+
57
+ def variable_pattern_with_pin(variable)
58
+ case 0
59
+ in ^variable
60
+ variable
61
+ else
62
+ :no_match
63
+ end
64
+ end
65
+
66
+ def pattern_with_dropping(variable)
67
+ case variable
68
+ in [_, 2]
69
+ :match
70
+ else
71
+ :no_match
72
+ end
73
+ end
74
+
75
+ def alternative_pattern(variable)
76
+ case variable
77
+ in 0 | false | nil
78
+ :match
79
+ else
80
+ :no_match
81
+ end
82
+ end
83
+
84
+ def as_pattern
85
+ a = 'First I was afraid'
86
+
87
+ case 'I was petrified'
88
+ in String => a
89
+ a
90
+ else
91
+ :no_match
92
+ end
93
+ end
94
+
95
+ def array_pattern(deconstructible)
96
+ case deconstructible
97
+ in 'a', *res, 'd'
98
+ res
99
+ else
100
+ :no_match
101
+ end
102
+ end
103
+
104
+ def hash_pattern(deconstructible_as_hash)
105
+ case deconstructible_as_hash
106
+ in {a: a, b: b}
107
+ [a, b]
108
+ else
109
+ :no_match
110
+ end
111
+ end
112
+
113
+ def hash_pattern_with_sugar(deconstructible_as_hash)
114
+ case deconstructible_as_hash
115
+ in a:, b:
116
+ [a, b]
117
+ else
118
+ :no_match
119
+ end
120
+ end
121
+ ```
122
+
123
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
124
+ CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
@@ -0,0 +1,8 @@
1
+ # Hint
2
+
3
+ A pattern can match values, classes, arrays, or hashes. A bare variable binds
4
+ a value; a pinned variable checks its existing value. A guard adds a condition
5
+ after the structural match.
6
+
7
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
8
+ CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ # SPDX-License-Identifier: CC-BY-NC-SA-3.0
4
+ # Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
5
+ # See THIRD_PARTY_NOTICES.md for attribution and license terms.
6
+
7
+ module Exercises
8
+ # Records messages while transparently forwarding them to a target.
9
+ class AboutProxyObjectProject
10
+ # Forwards unknown public messages and records their names.
11
+ class Proxy
12
+ attr_reader :messages
13
+
14
+ # @param target [Object] receiver of forwarded messages
15
+ def initialize(target)
16
+ @target = target
17
+ @messages = []
18
+ end
19
+
20
+ # @return [Object] result of the target's public method
21
+ def method_missing(name, ...)
22
+ @target.public_send(name, ...)
23
+ end
24
+
25
+ # @return [Boolean] whether a message has been recorded
26
+ def called?(_name)
27
+ false
28
+ end
29
+
30
+ # @return [Integer] number of recorded calls to a message
31
+ def number_of_times_called(_name)
32
+ 0
33
+ end
34
+
35
+ private
36
+
37
+ # Keeps introspection consistent with the target's public methods.
38
+ def respond_to_missing?(name, include_private = false)
39
+ super
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,10 @@
1
+ # Proxy Object Project
2
+
3
+ Complete `Exercises::AboutProxyObjectProject::Proxy` in `about_proxy_object_project.rb`.
4
+ Forward unknown messages to any target's public methods, preserving positional
5
+ arguments, keywords, blocks and return values. Record message names in order.
6
+ Expose `messages`, `called?(name)` and `number_of_times_called(name)`; reading
7
+ these bookkeeping methods must not add messages. Unsupported messages should
8
+ raise `NoMethodError`. Make `respond_to?` agree with the target's public API.
9
+
10
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md`.
@@ -0,0 +1,5 @@
1
+ # Hint
2
+
3
+ Use `method_missing` with argument forwarding and `respond_to_missing?`. Count only forwarded messages.
4
+
5
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md`.