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,174 @@
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 regular expressions examples.
9
+ class AboutRegularExpressions
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
+ # A pattern is a regular expression.
16
+ # assert_equal __, /pattern/.class
17
+ # Predict: /pattern/.class
18
+ a_pattern_is_a_regular_expression_one: :fill_me_in,
19
+ # A regexp can search a string for matching content.
20
+ # assert_equal __, "some matching content"[/match/]
21
+ # Predict: "some matching content"[/match/]
22
+ a_regexp_can_search_a_string_for_matching_content_one: :fill_me_in,
23
+ # A failed match returns nil.
24
+ # assert_equal __, "some matching content"[/missing/]
25
+ # Predict: "some matching content"[/missing/]
26
+ a_failed_match_returns_nil_one: :fill_me_in,
27
+ # Question mark means optional.
28
+ # assert_equal __, "abbcccddddeeeee"[/ab?/]
29
+ # assert_equal __, "abbcccddddeeeee"[/az?/]
30
+ # Predict: "abbcccddddeeeee"[/ab?/]
31
+ question_mark_means_optional_one: :fill_me_in,
32
+ # Predict: "abbcccddddeeeee"[/az?/]
33
+ question_mark_means_optional_two: :fill_me_in,
34
+ # Plus means one or more.
35
+ # assert_equal __, "abbcccddddeeeee"[/bc+/]
36
+ # Predict: "abbcccddddeeeee"[/bc+/]
37
+ plus_means_one_or_more_one: :fill_me_in,
38
+ # Asterisk means zero or more.
39
+ # assert_equal __, "abbcccddddeeeee"[/ab*/]
40
+ # assert_equal __, "abbcccddddeeeee"[/az*/]
41
+ # assert_equal __, "abbcccddddeeeee"[/z*/]
42
+ # Predict: "abbcccddddeeeee"[/ab*/]
43
+ asterisk_means_zero_or_more_one: :fill_me_in,
44
+ # Predict: "abbcccddddeeeee"[/az*/]
45
+ asterisk_means_zero_or_more_two: :fill_me_in,
46
+ # Predict: "abbcccddddeeeee"[/z*/]
47
+ asterisk_means_zero_or_more_three: :fill_me_in,
48
+ # The left most match wins.
49
+ # assert_equal __, "abbccc az"[/az*/]
50
+ # Predict: "abbccc az"[/az*/]
51
+ the_left_most_match_wins_one: :fill_me_in,
52
+ # Character classes give options for a character.
53
+ # animals = ["cat", "bat", "rat", "zat"]
54
+ # assert_equal __, animals.select { |a| a[/[cbr]at/] }
55
+ # Predict: animals.select { |a| a[/[cbr]at/] }
56
+ character_classes_give_options_for_a_character_one: :fill_me_in,
57
+ # Slash d is a shortcut for a digit character class.
58
+ # assert_equal __, "the number is 42"[/[0123456789]+/]
59
+ # assert_equal __, "the number is 42"[/\d+/]
60
+ # Predict: "the number is 42"[/[0123456789]+/]
61
+ slash_d_is_a_shortcut_for_a_digit_character_class_one: :fill_me_in,
62
+ # Predict: "the number is 42"[/\d+/]
63
+ slash_d_is_a_shortcut_for_a_digit_character_class_two: :fill_me_in,
64
+ # Character classes can include ranges.
65
+ # assert_equal __, "the number is 42"[/[0-9]+/]
66
+ # Predict: "the number is 42"[/[0-9]+/]
67
+ character_classes_can_include_ranges_one: :fill_me_in,
68
+ # Slash s is a shortcut for a whitespace character class.
69
+ # assert_equal __, "space: \t\n"[/\s+/]
70
+ # Predict: "space: \t\n"[/\s+/]
71
+ slash_s_is_a_shortcut_for_a_whitespace_character_class_one: :fill_me_in,
72
+ # Slash w is a shortcut for a word character class.
73
+ # assert_equal __, "variable_1 = 42"[/[a-zA-Z0-9_]+/]
74
+ # assert_equal __, "variable_1 = 42"[/\w+/]
75
+ # Predict: "variable_1 = 42"[/[a-zA-Z0-9_]+/]
76
+ slash_w_is_a_shortcut_for_a_word_character_class_one: :fill_me_in,
77
+ # Predict: "variable_1 = 42"[/\w+/]
78
+ slash_w_is_a_shortcut_for_a_word_character_class_two: :fill_me_in,
79
+ # Period is a shortcut for any non newline character.
80
+ # assert_equal __, "abc\n123"[/a.+/]
81
+ # Predict: "abc\n123"[/a.+/]
82
+ period_is_a_shortcut_for_any_non_newline_character_one: :fill_me_in,
83
+ # A character class can be negated.
84
+ # assert_equal __, "the number is 42"[/[^0-9]+/]
85
+ # Predict: "the number is 42"[/[^0-9]+/]
86
+ a_character_class_can_be_negated_one: :fill_me_in,
87
+ # Shortcut character classes are negated with capitals.
88
+ # assert_equal __, "the number is 42"[/\D+/]
89
+ # assert_equal __, "space: \t\n"[/\S+/]
90
+ # ... a programmer would most likely do
91
+ # assert_equal __, "variable_1 = 42"[/[^a-zA-Z0-9_]+/]
92
+ # assert_equal __, "variable_1 = 42"[/\W+/]
93
+ # Predict: "the number is 42"[/\D+/]
94
+ shortcut_character_classes_are_negated_with_capitals_one: :fill_me_in,
95
+ # Predict: "space: \t\n"[/\S+/]
96
+ shortcut_character_classes_are_negated_with_capitals_two: :fill_me_in,
97
+ # Predict: "variable_1 = 42"[/[^a-zA-Z0-9_]+/]
98
+ shortcut_character_classes_are_negated_with_capitals_three: :fill_me_in,
99
+ # Predict: "variable_1 = 42"[/\W+/]
100
+ shortcut_character_classes_are_negated_with_capitals_four: :fill_me_in,
101
+ # Slash a anchors to the start of the string.
102
+ # assert_equal __, "start end"[/\Astart/]
103
+ # assert_equal __, "start end"[/\Aend/]
104
+ # Predict: "start end"[/\Astart/]
105
+ slash_a_anchors_to_the_start_of_the_string_one: :fill_me_in,
106
+ # Predict: "start end"[/\Aend/]
107
+ slash_a_anchors_to_the_start_of_the_string_two: :fill_me_in,
108
+ # Slash z anchors to the end of the string.
109
+ # assert_equal __, "start end"[/end\z/]
110
+ # assert_equal __, "start end"[/start\z/]
111
+ # Predict: "start end"[/end\z/]
112
+ slash_z_anchors_to_the_end_of_the_string_one: :fill_me_in,
113
+ # Predict: "start end"[/start\z/]
114
+ slash_z_anchors_to_the_end_of_the_string_two: :fill_me_in,
115
+ # Caret anchors to the start of lines.
116
+ # assert_equal __, "num 42\n2 lines"[/^\d+/]
117
+ # Predict: "num 42\n2 lines"[/^\d+/]
118
+ caret_anchors_to_the_start_of_lines_one: :fill_me_in,
119
+ # Dollar sign anchors to the end of lines.
120
+ # assert_equal __, "2 lines\nnum 42"[/\d+$/]
121
+ # Predict: "2 lines\nnum 42"[/\d+$/]
122
+ dollar_sign_anchors_to_the_end_of_lines_one: :fill_me_in,
123
+ # Slash b anchors to a word boundary.
124
+ # assert_equal __, "bovine vines"[/\bvine./]
125
+ # Predict: "bovine vines"[/\bvine./]
126
+ slash_b_anchors_to_a_word_boundary_one: :fill_me_in,
127
+ # Parentheses group contents.
128
+ # assert_equal __, "ahahaha"[/(ha)+/]
129
+ # Predict: "ahahaha"[/(ha)+/]
130
+ parentheses_group_contents_one: :fill_me_in,
131
+ # Parentheses also capture matched content by number.
132
+ # assert_equal __, "Gray, James"[/(\w+), (\w+)/, 1]
133
+ # assert_equal __, "Gray, James"[/(\w+), (\w+)/, 2]
134
+ # Predict: "Gray, James"[/(\w+), (\w+)/, 1]
135
+ parentheses_also_capture_matched_content_by_number_one: :fill_me_in,
136
+ # Predict: "Gray, James"[/(\w+), (\w+)/, 2]
137
+ parentheses_also_capture_matched_content_by_number_two: :fill_me_in,
138
+ # Variables can also be used to access captures.
139
+ # assert_equal __, "Name: Gray, James"[/(\w+), (\w+)/]
140
+ # assert_equal __, $1
141
+ # assert_equal __, $2
142
+ # Predict: "Name: Gray, James"[/(\w+), (\w+)/]
143
+ variables_can_also_be_used_to_access_captures_one: :fill_me_in,
144
+ # Predict: $1
145
+ variables_can_also_be_used_to_access_captures_two: :fill_me_in,
146
+ # Predict: $2
147
+ variables_can_also_be_used_to_access_captures_three: :fill_me_in,
148
+ # A vertical pipe means or.
149
+ # grays = /(James|Dana|Summer) Gray/
150
+ # assert_equal __, "James Gray"[grays]
151
+ # assert_equal __, "Summer Gray"[grays, 1]
152
+ # assert_equal __, "Jim Gray"[grays, 1]
153
+ # Predict: "James Gray"[grays]
154
+ a_vertical_pipe_means_or_one: :fill_me_in,
155
+ # Predict: "Summer Gray"[grays, 1]
156
+ a_vertical_pipe_means_or_two: :fill_me_in,
157
+ # Predict: "Jim Gray"[grays, 1]
158
+ a_vertical_pipe_means_or_three: :fill_me_in,
159
+ # Scan is like find all.
160
+ # assert_equal __, "one two-three".scan(/\w+/)
161
+ # Predict: "one two-three".scan(/\w+/)
162
+ scan_is_like_find_all_one: :fill_me_in,
163
+ # Sub is like find and replace.
164
+ # assert_equal __, "one two-three".sub(/(t\w*)/) { $1[0, 1] }
165
+ # Predict: "one two-three".sub(/(t\w*)/) { $1[0, 1] }
166
+ sub_is_like_find_and_replace_one: :fill_me_in,
167
+ # Gsub is like find and replace all.
168
+ # assert_equal __, "one two-three".gsub(/(t\w*)/) { $1[0, 1] }
169
+ # Predict: "one two-three".gsub(/(t\w*)/) { $1[0, 1] }
170
+ gsub_is_like_find_and_replace_all_one: :fill_me_in
171
+ }
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,9 @@
1
+ # About Regular Expressions
2
+
3
+ Replace each `:fill_me_in` in `about_regular_expressions.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
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
9
+ CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
@@ -0,0 +1,8 @@
1
+ # Hint
2
+
3
+ Try each pattern on the exact string in the example. Distinguish an empty
4
+ match from no match, and whole-string anchors from line anchors. Captures retain
5
+ the text matched by parenthesized groups.
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,58 @@
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
+ # Explicit open/ensure is the resource-cleanup pattern taught by this lesson.
8
+ # rubocop:disable Style/FileOpen
9
+
10
+ module Exercises
11
+ # Shares file acquisition and cleanup around different operations.
12
+ class AboutSandwichCode
13
+ # @return [Integer] number of lines, including a final line without a newline
14
+ def self.count_lines(path)
15
+ file = File.open(path)
16
+ count = 0
17
+ count += 1 while file.gets
18
+ count
19
+ ensure
20
+ file&.close
21
+ end
22
+
23
+ # @return [String, nil] first line containing e, preserving its line ending
24
+ def self.find_line(path)
25
+ file = File.open(path)
26
+ while (line = file.gets)
27
+ return line if line.include?('e')
28
+ end
29
+ nil
30
+ ensure
31
+ file&.close
32
+ end
33
+
34
+ # Yield an open file and close it on normal return, early exit or exception.
35
+ # @return [Object] the block's result
36
+ def self.file_sandwich(path)
37
+ file = File.open(path)
38
+ yield file
39
+ end
40
+
41
+ # @return [Integer] number of lines using the shared sandwich
42
+ def self.count_lines2(path)
43
+ file_sandwich(path) { |file| file.each_line.count }
44
+ end
45
+
46
+ # @return [String, nil] first matching line using the shared sandwich
47
+ def self.find_line2(_path)
48
+ nil
49
+ end
50
+
51
+ # @return [Integer] number of lines using File.open's built-in sandwich
52
+ def self.count_lines3(path)
53
+ File.open(path) { |file| file.each_line.count }
54
+ end
55
+ end
56
+ end
57
+
58
+ # rubocop:enable Style/FileOpen
@@ -0,0 +1,14 @@
1
+ # Sandwich Code
2
+
3
+ Complete `file_sandwich(path)` and `find_line2(path)` in `about_sandwich_code.rb`.
4
+ The sandwich opens a file, yields it, returns the block's result, and always
5
+ closes the file, even when the block raises or exits early. The second search
6
+ method must use the sandwich to return the first line containing `e`, or `nil`
7
+ when none matches. Keep the line ending when present.
8
+
9
+ Compare the supplied counting and searching methods: explicit `ensure`, a shared
10
+ block helper, and `File.open` with a block all provide resource cleanup. The
11
+ original example has four lines: `this`, `is`, `a`, `test`. Checks create real
12
+ temporary files, so the lesson works from any working directory.
13
+
14
+ 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
+ Put cleanup in ensure. Enumerable#find returns the first matching line or nil.
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`.
@@ -0,0 +1,76 @@
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 scope examples.
9
+ class AboutScope
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
+ # Dog is not available in the current scope.
16
+ # assert_raise(___) do
17
+ # Dog.new
18
+ # end
19
+ # Predict: exception class from: Dog.new
20
+ dog_is_not_available_in_the_current_scope_one: :fill_me_in,
21
+ # You can reference nested classes using the scope operator.
22
+ # fido = Jims::Dog.new
23
+ # rover = Joes::Dog.new
24
+ # assert_equal __, fido.identify
25
+ # assert_equal __, rover.identify
26
+ # assert_equal __, fido.class != rover.class
27
+ # assert_equal __, Jims::Dog != Joes::Dog
28
+ # Predict: fido.identify
29
+ you_can_reference_nested_classes_using_the_scope_operator_one: :fill_me_in,
30
+ # Predict: rover.identify
31
+ you_can_reference_nested_classes_using_the_scope_operator_two: :fill_me_in,
32
+ # Predict: fido.class != rover.class
33
+ you_can_reference_nested_classes_using_the_scope_operator_three: :fill_me_in,
34
+ # Predict: Jims::Dog != Joes::Dog
35
+ you_can_reference_nested_classes_using_the_scope_operator_four: :fill_me_in,
36
+ # Bare bones class names assume the current scope.
37
+ # assert_equal __, AboutScopeTest::String == String
38
+ # Predict: AboutScopeTest::String == String
39
+ bare_bones_class_names_assume_the_current_scope_one: :fill_me_in,
40
+ # Nested string is not the same as the system string.
41
+ # assert_equal __, String == "HI".class
42
+ # Predict: String == "HI".class
43
+ nested_string_is_not_the_same_as_the_system_string_one: :fill_me_in,
44
+ # Use the prefix scope operator to force the global scope.
45
+ # assert_equal __, ::String == "HI".class
46
+ # Predict: ::String == "HI".class
47
+ use_the_prefix_scope_operator_to_force_the_global_scope_one: :fill_me_in,
48
+ # Constants are defined with an initial uppercase letter.
49
+ # assert_equal __, PI
50
+ # Predict: PI
51
+ constants_are_defined_with_an_initial_uppercase_letter_one: :fill_me_in,
52
+ # Class names are just constants.
53
+ # assert_equal __, MyString == ::String
54
+ # assert_equal __, MyString == "HI".class
55
+ # Predict: MyString == ::String
56
+ class_names_are_just_constants_one: :fill_me_in,
57
+ # Predict: MyString == "HI".class
58
+ class_names_are_just_constants_two: :fill_me_in,
59
+ # Constants can be looked up explicitly.
60
+ # assert_equal __, PI == AboutScopeTest.const_get("PI")
61
+ # assert_equal __, MyString == AboutScopeTest.const_get("MyString")
62
+ # Predict: PI == AboutScopeTest.const_get("PI")
63
+ constants_can_be_looked_up_explicitly_one: :fill_me_in,
64
+ # Predict: MyString == AboutScopeTest.const_get("MyString")
65
+ constants_can_be_looked_up_explicitly_two: :fill_me_in,
66
+ # You can get a list of constants for any class or module.
67
+ # assert_equal __, Jims.constants
68
+ # assert_equal __, Object.constants.any?
69
+ # Predict: Jims.constants
70
+ you_can_get_a_list_of_constants_for_any_class_or_module_one: :fill_me_in,
71
+ # Predict: Object.constants.any?
72
+ you_can_get_a_list_of_constants_for_any_class_or_module_two: :fill_me_in
73
+ }
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,35 @@
1
+ # About Scope
2
+
3
+ Replace each `:fill_me_in` in `about_scope.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 `AboutScopeTest`.
12
+
13
+ ```ruby
14
+ module Jims
15
+ class Dog
16
+ def identify
17
+ :jims_dog
18
+ end
19
+ end
20
+ end
21
+
22
+ module Joes
23
+ class Dog
24
+ def identify
25
+ :joes_dog
26
+ end
27
+ end
28
+ end
29
+
30
+ class String
31
+ end
32
+ ```
33
+
34
+ Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
35
+ 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 short constant name is resolved in its surrounding scope. `::` can start
4
+ from the top level. Two nested classes with the same short name can be different
5
+ class objects.
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,16 @@
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
+ # Scores a single Greed roll of up to five six-sided dice.
9
+ class AboutScoringProject
10
+ # @param dice [Array<Integer>] face values between one and six
11
+ # @return [Integer] points, counting each die only once
12
+ def self.score(_dice)
13
+ 0
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ # Scoring Project
2
+
3
+ Implement `Exercises::AboutScoringProject.score(dice)` in `about_scoring_project.rb`.
4
+ Score a roll of zero to five dice: three ones earn 1000, other triples earn
5
+ 100 times their face; leftover ones earn 100 and leftover fives earn 50.
6
+ Other dice earn zero. Each die counts once. Return zero for an empty roll.
7
+
8
+ Examples: `[1, 1, 1, 5, 1]` earns 1150; `[3, 4, 5, 3, 3]` earns 350.
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
+ Count each face, separate triples from remaining dice, then score the remainder.
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`.
@@ -0,0 +1,142 @@
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 the results of quoting, interpolation, mutation, and string operations.
9
+ class AboutStrings
10
+ # Replace each nil with the result of its commented example.
11
+ # @return [Hash<Symbol, String | Integer | Boolean | Array<String> | nil>]
12
+ # The answer table is data, not a sequence of operations.
13
+ def self.koans # rubocop:disable Metrics/MethodLength
14
+ {
15
+ # double quoted strings are strings
16
+ # string = "Hello, World"
17
+ double_quoted_string: nil, # string.is_a?(String)
18
+ # single quoted strings are also strings
19
+ # string = 'Goodbye, World'
20
+ single_quoted_string: nil, # string.is_a?(String)
21
+ # use single quotes to create string with double quotes
22
+ # string = 'He said, "Go Away."'
23
+ quoted_speech: nil, # string
24
+ # use double quotes to create strings with single quotes
25
+ # string = "Don't"
26
+ apostrophe: nil, # string
27
+ # use backslash for those hard cases
28
+ # a = "He said, \"Don't\""
29
+ # b = 'He said, "Don\'t"'
30
+ escaped_quotes_equal: nil, # a == b
31
+ # use flexible quoting to handle really hard cases
32
+ # a = %(flexible quotes can handle both ' and " characters)
33
+ # b = %!flexible quotes can handle both ' and " characters!
34
+ # c = %{flexible quotes can handle both ' and " characters}
35
+ flexible_percent_equal: nil, # a == b
36
+ flexible_braces_equal: nil, # a == c
37
+ # flexible quotes can handle multiple lines
38
+ # long_string = %{
39
+ # It was the best of times,
40
+ # It was the worst of times.
41
+ # }
42
+ multiline_length: nil, # long_string.length
43
+ multiline_lines: nil, # long_string.lines.count
44
+ multiline_first_character: nil, # long_string[0,1]
45
+ # here documents can also handle multiple lines
46
+ # long_string = <<~EOS
47
+ # It was the best of times,
48
+ # It was the worst of times.
49
+ # EOS
50
+ heredoc_length: nil, # long_string.length
51
+ heredoc_lines: nil, # long_string.lines.count
52
+ heredoc_first_character: nil, # long_string[0,1]
53
+ # plus will concatenate two strings
54
+ # string = "Hello, " + "World"
55
+ concatenated: nil, # string
56
+ # plus concatenation will leave the original strings unmodified
57
+ # hi = "Hello, "
58
+ # there = "World"
59
+ # string = hi + there
60
+ plus_original: nil, # hi
61
+ plus_other: nil, # there
62
+ # plus equals will concatenate to the end of a string
63
+ # hi = "Hello, "
64
+ # there = "World"
65
+ # hi += there
66
+ plus_equals_result: nil, # hi
67
+ # plus equals also will leave the original string unmodified
68
+ # original_string = "Hello, "
69
+ # hi = original_string
70
+ # there = "World"
71
+ # hi += there
72
+ plus_equals_original: nil, # original_string
73
+ # the shovel operator will also append content to a string
74
+ # hi = "Hello, "
75
+ # there = "World"
76
+ # hi << there
77
+ append_result: nil, # hi
78
+ append_other: nil, # there
79
+ # the shovel operator modifies the original string
80
+ # original_string = "Hello, "
81
+ # hi = original_string
82
+ # there = "World"
83
+ # hi << there
84
+ # THINK ABOUT IT:
85
+ #
86
+ # Ruby programmers tend to favor the shovel operator (<<) over the
87
+ # plus equals operator (+=) when building up strings. Why?
88
+ appended_original: nil, # original_string
89
+ # double quoted string interpret escape characters
90
+ # string = "\n"
91
+ double_escape_length: nil, # string.size
92
+ # single quoted string do not interpret escape characters
93
+ # string = '\n'
94
+ single_escape_length: nil, # string.size
95
+ # single quotes sometimes interpret escape characters
96
+ # string = '\\\''
97
+ quote_escape_length: nil, # string.size
98
+ quote_escape_text: nil, # string
99
+ # double quoted strings interpolate variables
100
+ # value = 123
101
+ # string = "The value is #{value}"
102
+ interpolated: nil, # string
103
+ # single quoted strings do not interpolate
104
+ # value = 123
105
+ # string = 'The value is #{value}'
106
+ not_interpolated: nil, # string
107
+ # any ruby expression may be interpolated
108
+ # string = "The square root of 5 is #{Math.sqrt(5)}"
109
+ math_interpolation: nil, # string
110
+ # you can get a substring from a string
111
+ # string = "Bacon, lettuce and tomato"
112
+ substring_slice: nil, # string[7,3]
113
+ substring_range: nil, # string[7..9]
114
+ # you can get a single character from a string
115
+ # string = "Bacon, lettuce and tomato"
116
+ # Surprised?
117
+ single_character: nil, # string[1]
118
+ # in modern ruby single characters are represented by strings
119
+ character_literal: nil, # ?a
120
+ character_equals_integer: nil, # ?a == 97
121
+ # strings can be split
122
+ # string = "Sausage Egg Cheese"
123
+ # words = string.split
124
+ split_words: nil, # words
125
+ # strings can be split with different patterns
126
+ # string = "the:rain:in:spain"
127
+ # words = string.split(/:/)
128
+ # NOTE: Patterns are formed from Regular Expressions. Ruby has a
129
+ # powerful Regular Expression library.
130
+ pattern_words: nil, # words
131
+ # strings can be joined
132
+ # words = ["Now", "is", "the", "time"]
133
+ joined_words: nil, # words.join(" ")
134
+ # strings are unique objects
135
+ # a = "a string"
136
+ # b = "a string"
137
+ equal_strings: nil, # a == b
138
+ same_object: nil # a.object_id == b.object_id
139
+ }
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,22 @@
1
+ # Strings: quotes, changes, and identity
2
+
3
+ Replace each `nil` in `koans` with the result predicted by the example above it.
4
+ Use strings for text, integers for lengths and counts, `true` or `false` for
5
+ comparisons, and arrays of strings for split results. Examples are comments so
6
+ you can read and experiment with them without changing the checks.
7
+
8
+ Work through quoting and multiline text, then concatenation and mutation, and
9
+ finally escapes, interpolation, slicing, splitting, joining, and object identity.
10
+ Both kinds of quotes make strings, but they handle escapes and interpolation
11
+ differently. Compare `+`, `+=`, and `<<`: which operations change an existing
12
+ string, and which give the variable another string?
13
+
14
+ The checks use mutable string literals to make those experiments explicit.
15
+ String equality and object identity are different questions. Character literals
16
+ such as `?a` are strings on the Ruby version used here.
17
+
18
+ Save a group of predictions at a time and compare Expected (your prediction)
19
+ with Actual (Ruby's result).
20
+
21
+ Adapted from **Ruby Koans: About Strings** by Jim Weirich and Joe O'Brien.
22
+ Licensed under [CC BY-NC-SA 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/).
@@ -0,0 +1,11 @@
1
+ # Hint: follow the object, not just the variable
2
+
3
+ `+` creates a string; `+=` reassigns the variable to a concatenated string.
4
+ `<<` appends to the existing string, so another variable referring to it sees
5
+ the change. For identity, ask whether two names refer to the same object.
6
+
7
+ Read escape and interpolation examples one character at a time. Multiline text
8
+ includes its newline characters; single quotes preserve most backslashes.
9
+
10
+ Adapted from **Ruby Koans: About Strings** by Jim Weirich and Joe O'Brien.
11
+ Licensed under [CC BY-NC-SA 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/).
@@ -0,0 +1,53 @@
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 symbol identity, conversions, registered names, and supported operations.
9
+ class AboutSymbols
10
+ # Replace each :fill_me_in with the result of its example.
11
+ # @return [Hash<Symbol, Boolean | Symbol | String | Class>]
12
+ def self.koans
13
+ {
14
+ # :ruby.is_a?(Symbol)
15
+ symbol_type: :fill_me_in,
16
+ # :a_symbol == :a_symbol
17
+ same_value: :fill_me_in,
18
+ # :a_symbol == :something_else
19
+ different_value: :fill_me_in,
20
+ # :a_symbol == :a_symbol
21
+ identical_value: :fill_me_in,
22
+ # :a_symbol.equal?(:a_symbol)
23
+ same_object: :fill_me_in,
24
+ # Symbol.all_symbols.map(&:to_s).include?('test_method_names_become_symbols')
25
+ method_name_registered: :fill_me_in,
26
+ # name of the constant declared by the check class
27
+ constant_name: :fill_me_in,
28
+ # Symbol.all_symbols.map(&:to_s).include?('RUBY_CONSTANT')
29
+ constant_registered: :fill_me_in,
30
+ # 'catsAndDogs'.to_sym
31
+ from_string: :fill_me_in,
32
+ # :'cats and dogs'
33
+ with_spaces: :fill_me_in,
34
+ # value = 'and'; :"cats #{value} dogs"
35
+ with_interpolation: :fill_me_in,
36
+ # symbol = :cats; "It is raining #{symbol} and dogs."
37
+ interpolated_text: :fill_me_in,
38
+ # :ruby.is_a?(String)
39
+ string_type: :fill_me_in,
40
+ # :ruby.eql?('ruby')
41
+ equals_string: :fill_me_in,
42
+ # :not_a_string.respond_to?(:each_char)
43
+ each_char: :fill_me_in,
44
+ # :not_a_string.respond_to?(:reverse)
45
+ reverse: :fill_me_in,
46
+ # exception class raised by :cats + :dogs
47
+ concatenation_error: :fill_me_in,
48
+ # ('cats' + 'dogs').to_sym
49
+ dynamically_created: :fill_me_in
50
+ }
51
+ end
52
+ end
53
+ end