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,96 @@
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 iteration examples.
9
+ class AboutIteration
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
+ # Each is a method on arrays.
16
+ # assert_equal __, [].methods.include?(:each)
17
+ # Predict: [].methods.include?(:each)
18
+ each_is_a_method_on_arrays_one: :fill_me_in,
19
+ # Iterating with each.
20
+ # array = [1, 2, 3]
21
+ # sum = 0
22
+ # array.each do |item|
23
+ # sum += item
24
+ # end
25
+ # assert_equal __, sum
26
+ # Predict: sum
27
+ iterating_with_each_one: :fill_me_in,
28
+ # Each can use curly brace blocks too.
29
+ # array = [1, 2, 3]
30
+ # sum = 0
31
+ # array.each { |item| sum += item }
32
+ # assert_equal __, sum
33
+ # Predict: sum
34
+ each_can_use_curly_brace_blocks_too_one: :fill_me_in,
35
+ # Break works with each style iterations.
36
+ # array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
37
+ # sum = 0
38
+ # array.each do |item|
39
+ # break if item > 3
40
+ # sum += item
41
+ # end
42
+ # assert_equal __, sum
43
+ # Predict: sum
44
+ break_works_with_each_style_iterations_one: :fill_me_in,
45
+ # Collect transforms elements of an array.
46
+ # array = [1, 2, 3]
47
+ # new_array = array.collect { |item| item + 10 }
48
+ # assert_equal __, new_array
49
+ # NOTE: 'map' is another name for the 'collect' operation
50
+ # another_array = array.map { |item| item + 10 }
51
+ # assert_equal __, another_array
52
+ # Predict: new_array
53
+ collect_transforms_elements_of_an_array_one: :fill_me_in,
54
+ # Predict: another_array
55
+ collect_transforms_elements_of_an_array_two: :fill_me_in,
56
+ # Select selects certain items from an array.
57
+ # array = [1, 2, 3, 4, 5, 6]
58
+ # even_numbers = array.select { |item| (item % 2) == 0 }
59
+ # assert_equal __, even_numbers
60
+ # NOTE: 'find_all' is another name for the 'select' operation
61
+ # more_even_numbers = array.find_all { |item| (item % 2) == 0 }
62
+ # assert_equal __, more_even_numbers
63
+ # Predict: even_numbers
64
+ select_selects_certain_items_from_an_array_one: :fill_me_in,
65
+ # Predict: more_even_numbers
66
+ select_selects_certain_items_from_an_array_two: :fill_me_in,
67
+ # Find locates the first element matching a criteria.
68
+ # array = ["Jim", "Bill", "Clarence", "Doug", "Eli"]
69
+ # assert_equal __, array.find { |item| item.size > 4 }
70
+ # Predict: array.find { |item| item.size > 4 }
71
+ find_locates_the_first_element_matching_a_criteria_one: :fill_me_in,
72
+ # Inject will blow your mind.
73
+ # result = [2, 3, 4].inject(0) { |sum, item| sum + item }
74
+ # assert_equal __, result
75
+ # result2 = [2, 3, 4].inject(1) { |product, item| product * item }
76
+ # assert_equal __, result2
77
+ # Predict: result
78
+ inject_will_blow_your_mind_one: :fill_me_in,
79
+ # Predict: result2
80
+ inject_will_blow_your_mind_two: :fill_me_in,
81
+ # All iteration methods work on any collection not just arrays.
82
+ # result = (1..3).map { |item| item + 10 }
83
+ # assert_equal __, result
84
+ # Files act like a collection of lines
85
+ # with_example_file do |file|
86
+ # upcase_lines = file.map { |line| line.strip.upcase }
87
+ # assert_equal __, upcase_lines
88
+ # end
89
+ # Predict: result
90
+ all_iteration_methods_work_on_any_collection_not_just_arrays_one: :fill_me_in,
91
+ # Predict: upcase_lines
92
+ all_iteration_methods_work_on_any_collection_not_just_arrays_two: :fill_me_in
93
+ }
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,26 @@
1
+ # About Iteration
2
+
3
+ Replace each `:fill_me_in` in `about_iteration.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 `AboutIterationTest`.
12
+
13
+ ```ruby
14
+ require 'tempfile'
15
+
16
+ def with_example_file
17
+ Tempfile.create('rkoans-iteration') do |file|
18
+ file.write("this\nis\na\ntest\n")
19
+ file.rewind
20
+ yield file
21
+ end
22
+ end
23
+ ```
24
+
25
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
26
+ CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
@@ -0,0 +1,6 @@
1
+ # Hint
2
+
3
+ Trace each collection operation separately. The file example contains four lines: this, is, a, test. A file enumerates lines, including their line endings.
4
+
5
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
6
+ CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
@@ -0,0 +1,56 @@
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 keyword arguments examples.
9
+ class AboutKeywordArguments
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
+ # Keyword arguments.
16
+ # assert_equal __, method_with_keyword_arguments.class
17
+ # assert_equal __, method_with_keyword_arguments
18
+ # assert_equal __, method_with_keyword_arguments(one: 'one')
19
+ # assert_equal __, method_with_keyword_arguments(two: 2)
20
+ # Predict: method_with_keyword_arguments.class
21
+ keyword_arguments_one: :fill_me_in,
22
+ # Predict: method_with_keyword_arguments
23
+ keyword_arguments_two: :fill_me_in,
24
+ # Predict: method_with_keyword_arguments(one: 'one')
25
+ keyword_arguments_three: :fill_me_in,
26
+ # Predict: method_with_keyword_arguments(two: 2)
27
+ keyword_arguments_four: :fill_me_in,
28
+ # Keyword arguments with wrong number of arguments.
29
+ # exception = assert_raise (___) do
30
+ # method_with_keyword_arguments_with_mandatory_argument
31
+ # end
32
+ # assert_match(/__/, exception.message)
33
+ # Predict: exception class from: method_with_keyword_arguments_with_mandatory_argument
34
+ keyword_arguments_with_wrong_number_of_arguments_one: :fill_me_in,
35
+ # Predict: exception.message
36
+ keyword_arguments_with_wrong_number_of_arguments_two: :fill_me_in,
37
+ # Mandatory keyword arguments.
38
+ # assert_equal __, method_with_mandatory_keyword_arguments(one: 'one')
39
+ # assert_equal __, method_with_mandatory_keyword_arguments(two: 2, one: 1)
40
+ # Predict: method_with_mandatory_keyword_arguments(one: 'one')
41
+ mandatory_keyword_arguments_one: :fill_me_in,
42
+ # Predict: method_with_mandatory_keyword_arguments(two: 2, one: 1)
43
+ mandatory_keyword_arguments_two: :fill_me_in,
44
+ # Mandatory keyword arguments without mandatory argument.
45
+ # exception = assert_raise(___) do
46
+ # method_with_mandatory_keyword_arguments
47
+ # end
48
+ # assert_match(/__/, exception.message)
49
+ # Predict: exception class from: method_with_mandatory_keyword_arguments
50
+ mandatory_keyword_arguments_without_mandatory_argument_one: :fill_me_in,
51
+ # Predict: exception.message
52
+ mandatory_keyword_arguments_without_mandatory_argument_two: :fill_me_in
53
+ }
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,28 @@
1
+ # About Keyword Arguments
2
+
3
+ Replace each `:fill_me_in` in `about_keyword_arguments.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 `AboutKeywordArgumentsTest`.
12
+
13
+ ```ruby
14
+ def method_with_keyword_arguments(one: 1, two: 'two')
15
+ [one, two]
16
+ end
17
+
18
+ def method_with_keyword_arguments_with_mandatory_argument(one, two: 2, three: 3)
19
+ [one, two, three]
20
+ end
21
+
22
+ def method_with_mandatory_keyword_arguments(one:, two: 'two')
23
+ [one, two]
24
+ end
25
+ ```
26
+
27
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
28
+ CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
@@ -0,0 +1,7 @@
1
+ # Hint
2
+
3
+ Separate positional arguments from keyword arguments. Defaults apply only to
4
+ omitted keywords; a required keyword still has to be supplied by name.
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,112 @@
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 message passing examples.
9
+ class AboutMessagePassing
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
+ # Methods can be invoked more dynamically.
16
+ # mc = MessageCatcher.new
17
+ # assert mc.send("caught?")
18
+ # assert_equal __, mc.send("caught" + "?") # What do you need to add to the first string?
19
+ # assert_equal __, mc.send("CAUGHT?".downcase)
20
+ # Predict: mc.send("caught" + "?")
21
+ methods_can_be_invoked_more_dynamically_one: :fill_me_in,
22
+ # Predict: mc.send("CAUGHT?".downcase)
23
+ methods_can_be_invoked_more_dynamically_two: :fill_me_in,
24
+ # Send with underscores will also send messages.
25
+ # mc = MessageCatcher.new
26
+ # assert_equal __, mc.__send__(:caught?)
27
+ # Predict: mc.__send__(:caught?)
28
+ send_with_underscores_will_also_send_messages_one: :fill_me_in,
29
+ # Classes can be asked if they know how to respond.
30
+ # mc = MessageCatcher.new
31
+ # assert_equal __, mc.respond_to?(:caught?)
32
+ # assert_equal __, mc.respond_to?(:does_not_exist)
33
+ # Predict: mc.respond_to?(:caught?)
34
+ classes_can_be_asked_if_they_know_how_to_respond_one: :fill_me_in,
35
+ # Predict: mc.respond_to?(:does_not_exist)
36
+ classes_can_be_asked_if_they_know_how_to_respond_two: :fill_me_in,
37
+ # Sending a message with arguments.
38
+ # mc = MessageCatcher.new
39
+ # assert_equal __, mc.add_a_payload
40
+ # assert_equal __, mc.send(:add_a_payload)
41
+ # assert_equal __, mc.add_a_payload(3, 4, nil, 6)
42
+ # assert_equal __, mc.send(:add_a_payload, 3, 4, nil, 6)
43
+ # Predict: mc.add_a_payload
44
+ sending_a_message_with_arguments_one: :fill_me_in,
45
+ # Predict: mc.send(:add_a_payload)
46
+ sending_a_message_with_arguments_two: :fill_me_in,
47
+ # Predict: mc.add_a_payload(3, 4, nil, 6)
48
+ sending_a_message_with_arguments_three: :fill_me_in,
49
+ # Predict: mc.send(:add_a_payload, 3, 4, nil, 6)
50
+ sending_a_message_with_arguments_four: :fill_me_in,
51
+ # Sending undefined messages to a typical object results in errors.
52
+ # typical = TypicalObject.new
53
+ # exception = assert_raise(___) do
54
+ # typical.foobar
55
+ # end
56
+ # assert_match(/foobar/, exception.message)
57
+ # Predict: exception class from: typical.foobar
58
+ sending_undefined_messages_to_a_typical_object_results_in_errors_one: :fill_me_in,
59
+ # Calling method missing causes the no method error.
60
+ # typical = TypicalObject.new
61
+ # exception = assert_raise(___) do
62
+ # typical.__send__(:method_missing, :foobar)
63
+ # end
64
+ # assert_match(/foobar/, exception.message)
65
+ # Predict: exception class from: typical.__send__(:method_missing, :foobar)
66
+ calling_method_missing_causes_the_no_method_error_one: :fill_me_in,
67
+ # All messages are caught.
68
+ # catcher = AllMessageCatcher.new
69
+ # assert_equal __, catcher.foobar
70
+ # assert_equal __, catcher.foobaz(1)
71
+ # assert_equal __, catcher.sum(1,2,3,4,5,6)
72
+ # Predict: catcher.foobar
73
+ all_messages_are_caught_one: :fill_me_in,
74
+ # Predict: catcher.foobaz(1)
75
+ all_messages_are_caught_two: :fill_me_in,
76
+ # Predict: catcher.sum(1,2,3,4,5,6)
77
+ all_messages_are_caught_three: :fill_me_in,
78
+ # Catching messages makes respond to lie.
79
+ # catcher = AllMessageCatcher.new
80
+ # assert_nothing_raised do
81
+ # catcher.any_method
82
+ # end
83
+ # assert_equal __, catcher.respond_to?(:any_method)
84
+ # Predict: catcher.respond_to?(:any_method)
85
+ catching_messages_makes_respond_to_lie_one: :fill_me_in,
86
+ # Foo method are caught.
87
+ # catcher = WellBehavedFooCatcher.new
88
+ # assert_equal __, catcher.foo_bar
89
+ # assert_equal __, catcher.foo_baz
90
+ # Predict: catcher.foo_bar
91
+ foo_method_are_caught_one: :fill_me_in,
92
+ # Predict: catcher.foo_baz
93
+ foo_method_are_caught_two: :fill_me_in,
94
+ # Non foo messages are treated normally.
95
+ # catcher = WellBehavedFooCatcher.new
96
+ # assert_raise(___) do
97
+ # catcher.normal_undefined_method
98
+ # end
99
+ # Predict: exception class from: catcher.normal_undefined_method
100
+ non_foo_messages_are_treated_normally_one: :fill_me_in,
101
+ # Explicitly implementing respond to lets objects tell the truth.
102
+ # catcher = WellBehavedFooCatcher.new
103
+ # assert_equal __, catcher.respond_to?(:foo_bar)
104
+ # assert_equal __, catcher.respond_to?(:something_else)
105
+ # Predict: catcher.respond_to?(:foo_bar)
106
+ explicitly_implementing_respond_to_lets_objects_tell_the_truth_one: :fill_me_in,
107
+ # Predict: catcher.respond_to?(:something_else)
108
+ explicitly_implementing_respond_to_lets_objects_tell_the_truth_two: :fill_me_in
109
+ }
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,59 @@
1
+ # About Message Passing
2
+
3
+ Replace each `:fill_me_in` in `about_message_passing.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 `AboutMessagePassingTest`.
12
+
13
+ ```ruby
14
+ class MessageCatcher
15
+ def caught?
16
+ true
17
+ end
18
+ end
19
+
20
+ class MessageCatcher
21
+ def add_a_payload(*args)
22
+ args
23
+ end
24
+ end
25
+
26
+ class TypicalObject
27
+ end
28
+
29
+ class AllMessageCatcher
30
+ def method_missing(method_name, *args, &block)
31
+ "Someone called #{method_name} with <#{args.join(", ")}>"
32
+ end
33
+ end
34
+
35
+ class WellBehavedFooCatcher
36
+ def method_missing(method_name, *args, &block)
37
+ if method_name.to_s[0,3] == "foo"
38
+ "Foo to you too"
39
+ else
40
+ super(method_name, *args, &block)
41
+ end
42
+ end
43
+ end
44
+
45
+ class WellBehavedFooCatcher
46
+ private
47
+
48
+ def respond_to_missing?(method_name, include_private = false)
49
+ if method_name.to_s[0,3] == "foo"
50
+ true
51
+ else
52
+ super(method_name, include_private)
53
+ end
54
+ end
55
+ end
56
+ ```
57
+
58
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
59
+ 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 method call sends a message. `send` and `__send__` accept a computed name.
4
+ `method_missing` can handle unknown messages; `respond_to_missing?` lets
5
+ introspection describe the same supported messages.
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,104 @@
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 methods examples.
9
+ class AboutMethods
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
+ # Calling global methods.
16
+ # assert_equal __, my_global_method(2,3)
17
+ # Predict: my_global_method(2,3)
18
+ calling_global_methods_one: :fill_me_in,
19
+ # Calling global methods without parentheses.
20
+ # result = my_global_method 2, 3
21
+ # assert_equal __, result
22
+ # Predict: result
23
+ calling_global_methods_without_parentheses_one: :fill_me_in,
24
+ # Sometimes missing parentheses are ambiguous.
25
+ # assert_equal __, eval("my_global_method(2, 3)")
26
+ # Predict: eval("my_global_method(2, 3)")
27
+ sometimes_missing_parentheses_are_ambiguous_one: :fill_me_in,
28
+ # Calling global methods with wrong number of arguments.
29
+ # exception = assert_raise(___) do
30
+ # my_global_method
31
+ # end
32
+ # assert_match(/__/, exception.message)
33
+ # exception = assert_raise(___) do
34
+ # my_global_method(1,2,3)
35
+ # end
36
+ # assert_match(/__/, exception.message)
37
+ # Predict: exception class from: my_global_method
38
+ calling_global_methods_with_wrong_number_of_arguments_one: :fill_me_in,
39
+ # Predict: exception.message
40
+ calling_global_methods_with_wrong_number_of_arguments_two: :fill_me_in,
41
+ # Predict: exception class from: my_global_method(1,2,3)
42
+ calling_global_methods_with_wrong_number_of_arguments_three: :fill_me_in,
43
+ # Predict: exception.message
44
+ calling_global_methods_with_wrong_number_of_arguments_four: :fill_me_in,
45
+ # Calling with default values.
46
+ # assert_equal [1, __], method_with_defaults(1)
47
+ # assert_equal [1, __], method_with_defaults(1, 2)
48
+ # Predict: method_with_defaults(1)
49
+ calling_with_default_values_one: :fill_me_in,
50
+ # Predict: method_with_defaults(1, 2)
51
+ calling_with_default_values_two: :fill_me_in,
52
+ # Calling with variable arguments.
53
+ # assert_equal __, method_with_var_args.class
54
+ # assert_equal __, method_with_var_args
55
+ # assert_equal __, method_with_var_args(:one)
56
+ # assert_equal __, method_with_var_args(:one, :two)
57
+ # Predict: method_with_var_args.class
58
+ calling_with_variable_arguments_one: :fill_me_in,
59
+ # Predict: method_with_var_args
60
+ calling_with_variable_arguments_two: :fill_me_in,
61
+ # Predict: method_with_var_args(:one)
62
+ calling_with_variable_arguments_three: :fill_me_in,
63
+ # Predict: method_with_var_args(:one, :two)
64
+ calling_with_variable_arguments_four: :fill_me_in,
65
+ # Method with explicit return.
66
+ # assert_equal __, method_with_explicit_return
67
+ # Predict: method_with_explicit_return
68
+ method_with_explicit_return_one: :fill_me_in,
69
+ # Method without explicit return.
70
+ # assert_equal __, method_without_explicit_return
71
+ # Predict: method_without_explicit_return
72
+ method_without_explicit_return_one: :fill_me_in,
73
+ # Calling methods in same class.
74
+ # assert_equal __, my_method_in_the_same_class(3,4)
75
+ # Predict: my_method_in_the_same_class(3,4)
76
+ calling_methods_in_same_class_one: :fill_me_in,
77
+ # Calling methods in same class with explicit receiver.
78
+ # assert_equal __, self.my_method_in_the_same_class(3,4)
79
+ # Predict: self.my_method_in_the_same_class(3,4)
80
+ calling_methods_in_same_class_with_explicit_receiver_one: :fill_me_in,
81
+ # Calling private methods without receiver.
82
+ # assert_equal __, my_private_method
83
+ # Predict: my_private_method
84
+ calling_private_methods_without_receiver_one: :fill_me_in,
85
+ # Calling private methods with an explicit receiver.
86
+ # assert_equal __, self.my_private_method
87
+ # Predict: self.my_private_method
88
+ calling_private_methods_with_an_explicit_receiver_one: :fill_me_in,
89
+ # Calling methods in other objects require explicit receiver.
90
+ # rover = Dog.new
91
+ # assert_equal __, rover.name
92
+ # Predict: rover.name
93
+ calling_methods_in_other_objects_require_explicit_receiver_one: :fill_me_in,
94
+ # Calling private methods in other objects.
95
+ # rover = Dog.new
96
+ # assert_raise(___) do
97
+ # rover.tail
98
+ # end
99
+ # Predict: exception class from: rover.tail
100
+ calling_private_methods_in_other_objects_one: :fill_me_in
101
+ }
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,55 @@
1
+ # About Methods
2
+
3
+ Replace each `:fill_me_in` in `about_methods.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 `AboutMethodsTest`.
12
+
13
+ ```ruby
14
+ class Dog
15
+ def name
16
+ "Fido"
17
+ end
18
+
19
+ private
20
+
21
+ def tail
22
+ "tail"
23
+ end
24
+ end
25
+
26
+ def method_with_defaults(a, b=:default_value)
27
+ [a, b]
28
+ end
29
+
30
+ def method_with_var_args(*args)
31
+ args
32
+ end
33
+
34
+ def method_with_explicit_return
35
+ :a_non_return_value
36
+ return :return_value
37
+ :another_non_return_value
38
+ end
39
+
40
+ def method_without_explicit_return
41
+ :a_non_return_value
42
+ :return_value
43
+ end
44
+
45
+ def my_method_in_the_same_class(a, b)
46
+ a * b
47
+ end
48
+
49
+ def my_private_method
50
+ "a secret"
51
+ end
52
+ ```
53
+
54
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
55
+ CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
@@ -0,0 +1,8 @@
1
+ # Hint
2
+
3
+ Observe defaults, splats, explicit returns, and the final expression of a method.
4
+ Parentheses can disambiguate method arguments. Modern Ruby permits `self` when
5
+ calling a private method, but another object cannot call that method directly.
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
+ # Predictions for modules examples.
9
+ class AboutModules
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
+ # Cant instantiate modules.
16
+ # assert_raise(___) do
17
+ # Nameable.new
18
+ # end
19
+ # Predict: exception class from: Nameable.new
20
+ cant_instantiate_modules_one: :fill_me_in,
21
+ # Normal methods are available in the object.
22
+ # fido = Dog.new
23
+ # assert_equal __, fido.bark
24
+ # Predict: fido.bark
25
+ normal_methods_are_available_in_the_object_one: :fill_me_in,
26
+ # Module methods can affect instance variables in the object.
27
+ # fido = Dog.new
28
+ # assert_equal __, fido.name
29
+ # fido.set_name("Rover")
30
+ # assert_equal __, fido.name
31
+ # Predict: fido.name
32
+ module_methods_can_affect_instance_variables_in_the_object_one: :fill_me_in,
33
+ # Predict: fido.name
34
+ module_methods_can_affect_instance_variables_in_the_object_two: :fill_me_in,
35
+ # Classes can override module methods.
36
+ # fido = Dog.new
37
+ # assert_equal __, fido.here
38
+ # Predict: fido.here
39
+ classes_can_override_module_methods_one: :fill_me_in
40
+ }
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,44 @@
1
+ # About Modules
2
+
3
+ Replace each `:fill_me_in` in `about_modules.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 `AboutModulesTest`.
12
+
13
+ ```ruby
14
+ module Nameable
15
+ def set_name(new_name)
16
+ @name = new_name
17
+ end
18
+
19
+ def here
20
+ :in_module
21
+ end
22
+ end
23
+
24
+ class Dog
25
+ include Nameable
26
+
27
+ attr_reader :name
28
+
29
+ def initialize
30
+ @name = "Fido"
31
+ end
32
+
33
+ def bark
34
+ "WOOF"
35
+ end
36
+
37
+ def here
38
+ :in_object
39
+ end
40
+ end
41
+ ```
42
+
43
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
44
+ CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
@@ -0,0 +1,8 @@
1
+ # Hint
2
+
3
+ Including a module makes its instance methods available to the receiving
4
+ class. A class method definition with the same name takes precedence over an
5
+ included instance method. Modules themselves are not instantiated with `new`.
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.