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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/CURRICULUM.md +86 -0
- data/README.md +77 -0
- data/THIRD_PARTY_NOTICES.md +30 -0
- data/exercises/about-array-assignment/about_array_assignment.rb +45 -0
- data/exercises/about-array-assignment/brief.md +11 -0
- data/exercises/about-array-assignment/hint.md +11 -0
- data/exercises/about-arrays/about_arrays.rb +77 -0
- data/exercises/about-arrays/brief.md +16 -0
- data/exercises/about-arrays/hint.md +13 -0
- data/exercises/about-asserts/about_asserts.rb +22 -0
- data/exercises/about-asserts/brief.md +22 -0
- data/exercises/about-asserts/hint.md +10 -0
- data/exercises/about-blocks/about_blocks.rb +76 -0
- data/exercises/about-blocks/brief.md +44 -0
- data/exercises/about-blocks/hint.md +7 -0
- data/exercises/about-class-methods/about_class_methods.rb +105 -0
- data/exercises/about-class-methods/brief.md +73 -0
- data/exercises/about-class-methods/hint.md +8 -0
- data/exercises/about-classes/about_classes.rb +131 -0
- data/exercises/about-classes/brief.md +73 -0
- data/exercises/about-classes/hint.md +7 -0
- data/exercises/about-constants/about_constants.rb +49 -0
- data/exercises/about-constants/brief.md +51 -0
- data/exercises/about-constants/hint.md +7 -0
- data/exercises/about-control-statements/about_control_statements.rb +152 -0
- data/exercises/about-control-statements/brief.md +9 -0
- data/exercises/about-control-statements/hint.md +7 -0
- data/exercises/about-dice-project/about_dice_project.rb +27 -0
- data/exercises/about-dice-project/brief.md +12 -0
- data/exercises/about-dice-project/hint.md +5 -0
- data/exercises/about-exceptions/about_exceptions.rb +84 -0
- data/exercises/about-exceptions/brief.md +19 -0
- data/exercises/about-exceptions/hint.md +8 -0
- data/exercises/about-extra-credit/about_extra_credit.rb +117 -0
- data/exercises/about-extra-credit/brief.md +28 -0
- data/exercises/about-extra-credit/hint.md +5 -0
- data/exercises/about-hashes/about_hashes.rb +160 -0
- data/exercises/about-hashes/brief.md +9 -0
- data/exercises/about-hashes/hint.md +8 -0
- data/exercises/about-inheritance/about_inheritance.rb +63 -0
- data/exercises/about-inheritance/brief.md +50 -0
- data/exercises/about-inheritance/hint.md +8 -0
- data/exercises/about-iteration/about_iteration.rb +96 -0
- data/exercises/about-iteration/brief.md +26 -0
- data/exercises/about-iteration/hint.md +6 -0
- data/exercises/about-keyword-arguments/about_keyword_arguments.rb +56 -0
- data/exercises/about-keyword-arguments/brief.md +28 -0
- data/exercises/about-keyword-arguments/hint.md +7 -0
- data/exercises/about-message-passing/about_message_passing.rb +112 -0
- data/exercises/about-message-passing/brief.md +59 -0
- data/exercises/about-message-passing/hint.md +8 -0
- data/exercises/about-methods/about_methods.rb +104 -0
- data/exercises/about-methods/brief.md +55 -0
- data/exercises/about-methods/hint.md +8 -0
- data/exercises/about-modules/about_modules.rb +43 -0
- data/exercises/about-modules/brief.md +44 -0
- data/exercises/about-modules/hint.md +8 -0
- data/exercises/about-nil/about_nil.rb +29 -0
- data/exercises/about-nil/brief.md +12 -0
- data/exercises/about-nil/hint.md +11 -0
- data/exercises/about-objects/about_objects.rb +51 -0
- data/exercises/about-objects/brief.md +14 -0
- data/exercises/about-objects/hint.md +12 -0
- data/exercises/about-open-classes/about_open_classes.rb +38 -0
- data/exercises/about-open-classes/brief.md +34 -0
- data/exercises/about-open-classes/hint.md +7 -0
- data/exercises/about-pattern-matching/about_pattern_matching.rb +106 -0
- data/exercises/about-pattern-matching/brief.md +124 -0
- data/exercises/about-pattern-matching/hint.md +8 -0
- data/exercises/about-proxy-object-project/about_proxy_object_project.rb +43 -0
- data/exercises/about-proxy-object-project/brief.md +10 -0
- data/exercises/about-proxy-object-project/hint.md +5 -0
- data/exercises/about-regular-expressions/about_regular_expressions.rb +174 -0
- data/exercises/about-regular-expressions/brief.md +9 -0
- data/exercises/about-regular-expressions/hint.md +8 -0
- data/exercises/about-sandwich-code/about_sandwich_code.rb +58 -0
- data/exercises/about-sandwich-code/brief.md +14 -0
- data/exercises/about-sandwich-code/hint.md +5 -0
- data/exercises/about-scope/about_scope.rb +76 -0
- data/exercises/about-scope/brief.md +35 -0
- data/exercises/about-scope/hint.md +8 -0
- data/exercises/about-scoring-project/about_scoring_project.rb +16 -0
- data/exercises/about-scoring-project/brief.md +10 -0
- data/exercises/about-scoring-project/hint.md +5 -0
- data/exercises/about-strings/about_strings.rb +142 -0
- data/exercises/about-strings/brief.md +22 -0
- data/exercises/about-strings/hint.md +11 -0
- data/exercises/about-symbols/about_symbols.rb +53 -0
- data/exercises/about-symbols/brief.md +21 -0
- data/exercises/about-symbols/hint.md +12 -0
- data/exercises/about-to-str/about_to_str.rb +49 -0
- data/exercises/about-to-str/brief.md +37 -0
- data/exercises/about-to-str/hint.md +7 -0
- data/exercises/about-triangle-project/about_triangle_project.rb +15 -0
- data/exercises/about-triangle-project/brief.md +11 -0
- data/exercises/about-triangle-project/hint.md +5 -0
- data/exercises/about-triangle-project-two/about_triangle_project_two.rb +22 -0
- data/exercises/about-triangle-project-two/brief.md +10 -0
- data/exercises/about-triangle-project-two/hint.md +5 -0
- data/exercises/about-true-and-false/about_true_and_false.rb +26 -0
- data/exercises/about-true-and-false/brief.md +22 -0
- data/exercises/about-true-and-false/hint.md +7 -0
- data/exercises/blocks-and-methods/blocks_and_methods.rb +14 -0
- data/exercises/blocks-and-methods/brief.md +8 -0
- data/exercises/blocks-and-methods/hint.md +6 -0
- data/exercises/catalog.json +61 -0
- data/exercises/class-state/brief.md +8 -0
- data/exercises/class-state/class_state.rb +39 -0
- data/exercises/class-state/hint.md +5 -0
- data/exercises/closure-capture/brief.md +8 -0
- data/exercises/closure-capture/closure_capture.rb +21 -0
- data/exercises/closure-capture/hint.md +5 -0
- data/exercises/collection-basics/brief.md +8 -0
- data/exercises/collection-basics/collection_basics.rb +16 -0
- data/exercises/collection-basics/hint.md +6 -0
- data/exercises/constant-scope/brief.md +8 -0
- data/exercises/constant-scope/constant_scope.rb +18 -0
- data/exercises/constant-scope/hint.md +5 -0
- data/exercises/core-protocols/brief.md +8 -0
- data/exercises/core-protocols/core_protocols.rb +43 -0
- data/exercises/core-protocols/hint.md +5 -0
- data/exercises/delegation/brief.md +8 -0
- data/exercises/delegation/delegation.rb +20 -0
- data/exercises/delegation/hint.md +5 -0
- data/exercises/dynamic-methods/brief.md +8 -0
- data/exercises/dynamic-methods/dynamic_methods.rb +33 -0
- data/exercises/dynamic-methods/hint.md +5 -0
- data/exercises/exception-flow/brief.md +8 -0
- data/exercises/exception-flow/exception_flow.rb +27 -0
- data/exercises/exception-flow/hint.md +5 -0
- data/exercises/heredoc-layout/brief.md +14 -0
- data/exercises/heredoc-layout/heredoc_layout.rb +25 -0
- data/exercises/heredoc-layout/hint.md +9 -0
- data/exercises/keyword-forwarding/brief.md +8 -0
- data/exercises/keyword-forwarding/hint.md +5 -0
- data/exercises/keyword-forwarding/keyword_forwarding.rb +27 -0
- data/exercises/lazy-enumeration/brief.md +8 -0
- data/exercises/lazy-enumeration/hint.md +5 -0
- data/exercises/lazy-enumeration/lazy_enumeration.rb +16 -0
- data/exercises/literals-and-operators/brief.md +20 -0
- data/exercises/literals-and-operators/hint.md +5 -0
- data/exercises/literals-and-operators/literals_and_operators.rb +15 -0
- data/exercises/method-contracts/brief.md +8 -0
- data/exercises/method-contracts/hint.md +5 -0
- data/exercises/method-contracts/method_contracts.rb +22 -0
- data/exercises/method-lookup/brief.md +8 -0
- data/exercises/method-lookup/hint.md +5 -0
- data/exercises/method-lookup/method_lookup.rb +26 -0
- data/exercises/nonlocal-exit/brief.md +8 -0
- data/exercises/nonlocal-exit/hint.md +5 -0
- data/exercises/nonlocal-exit/nonlocal_exit.rb +29 -0
- data/exercises/numbered-parameters/brief.md +18 -0
- data/exercises/numbered-parameters/hint.md +5 -0
- data/exercises/numbered-parameters/numbered_parameters.rb +18 -0
- data/exercises/numeric-precision/brief.md +8 -0
- data/exercises/numeric-precision/hint.md +5 -0
- data/exercises/numeric-precision/numeric_precision.rb +17 -0
- data/exercises/pattern-matching/brief.md +8 -0
- data/exercises/pattern-matching/hint.md +5 -0
- data/exercises/pattern-matching/pattern_matching.rb +22 -0
- data/exercises/refinement-scope/brief.md +8 -0
- data/exercises/refinement-scope/hint.md +5 -0
- data/exercises/refinement-scope/refinement_scope.rb +33 -0
- data/exercises/regexp-captures/brief.md +8 -0
- data/exercises/regexp-captures/hint.md +5 -0
- data/exercises/regexp-captures/regexp_captures.rb +25 -0
- data/exercises/runtime-context/brief.md +20 -0
- data/exercises/runtime-context/hint.md +8 -0
- data/exercises/runtime-context/runtime_context.rb +11 -0
- data/exercises/shared-rows/brief.md +8 -0
- data/exercises/shared-rows/hint.md +7 -0
- data/exercises/shared-rows/shared_rows.rb +13 -0
- data/exercises/singleton-pattern/brief.md +8 -0
- data/exercises/singleton-pattern/hint.md +5 -0
- data/exercises/singleton-pattern/singleton_pattern.rb +20 -0
- data/exercises/time-and-date/brief.md +8 -0
- data/exercises/time-and-date/hint.md +5 -0
- data/exercises/time-and-date/time_and_date.rb +21 -0
- data/exercises/visibility/brief.md +8 -0
- data/exercises/visibility/hint.md +5 -0
- data/exercises/visibility/visibility.rb +32 -0
- data/lib/rkoans/catalog.rb +31 -0
- data/lib/rkoans/checker.rb +62 -0
- data/lib/rkoans/cli.rb +79 -0
- data/lib/rkoans/error.rb +6 -0
- data/lib/rkoans/exercise.rb +50 -0
- data/lib/rkoans/keyboard.rb +51 -0
- data/lib/rkoans/progress.rb +39 -0
- data/lib/rkoans/selection.rb +31 -0
- data/lib/rkoans/session.rb +127 -0
- data/lib/rkoans/terminal_view.rb +99 -0
- data/lib/rkoans/version.rb +1 -1
- data/lib/rkoans/watcher.rb +58 -0
- data/lib/rkoans.rb +13 -3
- data/sig/about_array_assignment_acceptance_test.rbs +3 -0
- data/sig/about_arrays_acceptance_test.rbs +3 -0
- data/sig/about_asserts_command_test.rbs +4 -0
- data/sig/about_blocks_acceptance_test.rbs +3 -0
- data/sig/about_class_methods_acceptance_test.rbs +3 -0
- data/sig/about_classes_acceptance_test.rbs +3 -0
- data/sig/about_constants_acceptance_test.rbs +3 -0
- data/sig/about_control_statements_acceptance_test.rbs +3 -0
- data/sig/about_dice_project_acceptance_test.rbs +3 -0
- data/sig/about_exceptions_acceptance_test.rbs +3 -0
- data/sig/about_extra_credit_acceptance_test.rbs +5 -0
- data/sig/about_hashes_acceptance_test.rbs +3 -0
- data/sig/about_inheritance_acceptance_test.rbs +3 -0
- data/sig/about_iteration_acceptance_test.rbs +3 -0
- data/sig/about_keyword_arguments_acceptance_test.rbs +3 -0
- data/sig/about_message_passing_acceptance_test.rbs +3 -0
- data/sig/about_methods_acceptance_test.rbs +3 -0
- data/sig/about_modules_acceptance_test.rbs +3 -0
- data/sig/about_nil_acceptance_test.rbs +3 -0
- data/sig/about_objects_acceptance_test.rbs +3 -0
- data/sig/about_open_classes_acceptance_test.rbs +3 -0
- data/sig/about_pattern_matching_acceptance_test.rbs +3 -0
- data/sig/about_proxy_object_project_acceptance_test.rbs +3 -0
- data/sig/about_regular_expressions_acceptance_test.rbs +3 -0
- data/sig/about_sandwich_code_acceptance_test.rbs +3 -0
- data/sig/about_scope_acceptance_test.rbs +3 -0
- data/sig/about_scoring_project_acceptance_test.rbs +3 -0
- data/sig/about_strings_acceptance_test.rbs +3 -0
- data/sig/about_symbols_acceptance_test.rbs +3 -0
- data/sig/about_to_str_acceptance_test.rbs +3 -0
- data/sig/about_triangle_project_acceptance_test.rbs +3 -0
- data/sig/about_triangle_project_two_acceptance_test.rbs +3 -0
- data/sig/about_true_and_false_command_test.rbs +4 -0
- data/sig/catalog_error_command_test.rbs +4 -0
- data/sig/checker_test.rbs +9 -0
- data/sig/class_state_acceptance_test.rbs +3 -0
- data/sig/closure_capture_acceptance_test.rbs +3 -0
- data/sig/command_support.rbs +18 -0
- data/sig/command_test.rbs +5 -0
- data/sig/constant_scope_acceptance_test.rbs +3 -0
- data/sig/core_protocols_acceptance_test.rbs +3 -0
- data/sig/curriculum_cop_test.rbs +9 -0
- data/sig/delegation_acceptance_test.rbs +3 -0
- data/sig/dynamic_methods_acceptance_test.rbs +3 -0
- data/sig/exception_flow_acceptance_test.rbs +3 -0
- data/sig/exercise_test.rbs +3 -0
- data/sig/exercises/about_array_assignment.rbs +36 -0
- data/sig/exercises/about_arrays.rbs +51 -0
- data/sig/exercises/about_asserts.rbs +23 -0
- data/sig/exercises/about_blocks.rbs +40 -0
- data/sig/exercises/about_class_methods.rbs +62 -0
- data/sig/exercises/about_classes.rbs +88 -0
- data/sig/exercises/about_constants.rbs +53 -0
- data/sig/exercises/about_control_statements.rbs +46 -0
- data/sig/exercises/about_dice_project.rbs +16 -0
- data/sig/exercises/about_exceptions.rbs +36 -0
- data/sig/exercises/about_extra_credit.rbs +36 -0
- data/sig/exercises/about_hashes.rbs +62 -0
- data/sig/exercises/about_inheritance.rbs +50 -0
- data/sig/exercises/about_iteration.rbs +37 -0
- data/sig/exercises/about_keyword_arguments.rbs +33 -0
- data/sig/exercises/about_message_passing.rbs +68 -0
- data/sig/exercises/about_methods.rbs +68 -0
- data/sig/exercises/about_modules.rbs +38 -0
- data/sig/exercises/about_nil.rbs +23 -0
- data/sig/exercises/about_objects.rbs +38 -0
- data/sig/exercises/about_open_classes.rbs +31 -0
- data/sig/exercises/about_pattern_matching.rbs +65 -0
- data/sig/exercises/about_proxy_object_project.rbs +31 -0
- data/sig/exercises/about_regular_expressions.rbs +83 -0
- data/sig/exercises/about_sandwich_code.rbs +17 -0
- data/sig/exercises/about_scope.rbs +59 -0
- data/sig/exercises/about_scoring_project.rbs +16 -0
- data/sig/exercises/about_strings.rbs +85 -0
- data/sig/exercises/about_symbols.rbs +46 -0
- data/sig/exercises/about_to_str.rbs +36 -0
- data/sig/exercises/about_triangle_project.rbs +11 -0
- data/sig/exercises/about_triangle_project_two.rbs +12 -0
- data/sig/exercises/about_true_and_false.rbs +27 -0
- data/sig/exercises/blocks_and_methods.rbs +11 -0
- data/sig/exercises/class_state.rbs +19 -0
- data/sig/exercises/closure_capture.rbs +10 -0
- data/sig/exercises/collection_basics.rbs +6 -0
- data/sig/exercises/collection_basics_test.rbs +4 -0
- data/sig/exercises/constant_scope.rbs +11 -0
- data/sig/exercises/core_protocols.rbs +20 -0
- data/sig/exercises/delegation.rbs +14 -0
- data/sig/exercises/dynamic_methods.rbs +13 -0
- data/sig/exercises/exception_flow.rbs +11 -0
- data/sig/exercises/heredoc_layout.rbs +11 -0
- data/sig/exercises/keyword_forwarding.rbs +12 -0
- data/sig/exercises/lazy_enumeration.rbs +10 -0
- data/sig/exercises/literals_and_operators.rbs +12 -0
- data/sig/exercises/method_contracts.rbs +11 -0
- data/sig/exercises/method_lookup.rbs +16 -0
- data/sig/exercises/nonlocal_exit.rbs +14 -0
- data/sig/exercises/numbered_parameters.rbs +11 -0
- data/sig/exercises/numeric_precision.rbs +11 -0
- data/sig/exercises/pattern_matching.rbs +10 -0
- data/sig/exercises/refinement_scope.rbs +18 -0
- data/sig/exercises/regexp_captures.rbs +11 -0
- data/sig/exercises/runtime_context.rbs +23 -0
- data/sig/exercises/shared_rows.rbs +11 -0
- data/sig/exercises/singleton_pattern.rbs +14 -0
- data/sig/exercises/time_and_date.rbs +11 -0
- data/sig/exercises/visibility.rbs +18 -0
- data/sig/fixture_support.rbs +11 -0
- data/sig/help_hint_command_test.rbs +8 -0
- data/sig/heredoc_layout_acceptance_test.rbs +3 -0
- data/sig/keyboard_session_test.rbs +9 -0
- data/sig/keyword_forwarding_acceptance_test.rbs +3 -0
- data/sig/lazy_enumeration_acceptance_test.rbs +3 -0
- data/sig/literals_and_operators_acceptance_test.rbs +3 -0
- data/sig/method_contracts_acceptance_test.rbs +3 -0
- data/sig/method_lookup_acceptance_test.rbs +3 -0
- data/sig/nonlocal_exit_acceptance_test.rbs +3 -0
- data/sig/numbered_parameters_acceptance_test.rbs +3 -0
- data/sig/numeric_precision_acceptance_test.rbs +4 -0
- data/sig/packaging_test.rbs +3 -0
- data/sig/pattern_matching_acceptance_test.rbs +3 -0
- data/sig/reference_solutions_test.rbs +3 -0
- data/sig/refinement_scope_acceptance_test.rbs +3 -0
- data/sig/regexp_captures_acceptance_test.rbs +4 -0
- data/sig/rkoans/catalog.rbs +11 -0
- data/sig/rkoans/checker.rbs +22 -0
- data/sig/rkoans/cli.rbs +21 -0
- data/sig/rkoans/exercise.rbs +18 -0
- data/sig/rkoans/keyboard.rbs +13 -0
- data/sig/rkoans/progress.rbs +9 -0
- data/sig/rkoans/selection.rbs +9 -0
- data/sig/rkoans/session.rbs +30 -0
- data/sig/rkoans/terminal_view.rbs +24 -0
- data/sig/rkoans/watcher.rbs +18 -0
- data/sig/rkoans.rbs +2 -0
- data/sig/runtime_context_command_test.rbs +4 -0
- data/sig/selection_command_test.rbs +5 -0
- data/sig/session_command_test.rbs +12 -0
- data/sig/session_edge_cases_test.rbs +4 -0
- data/sig/shared_rows_acceptance_test.rbs +3 -0
- data/sig/singleton_pattern_acceptance_test.rbs +3 -0
- data/sig/time_and_date_acceptance_test.rbs +4 -0
- data/sig/visibility_acceptance_test.rbs +4 -0
- data/sig/watcher_test.rbs +3 -0
- data/solutions/about-array-assignment/about_array_assignment.rb +36 -0
- data/solutions/about-arrays/about_arrays.rb +53 -0
- data/solutions/about-asserts/about_asserts.rb +22 -0
- data/solutions/about-blocks/about_blocks.rb +30 -0
- data/solutions/about-class-methods/about_class_methods.rb +36 -0
- data/solutions/about-classes/about_classes.rb +40 -0
- data/solutions/about-constants/about_constants.rb +26 -0
- data/solutions/about-control-statements/about_control_statements.rb +35 -0
- data/solutions/about-dice-project/about_dice_project.rb +27 -0
- data/solutions/about-exceptions/about_exceptions.rb +30 -0
- data/solutions/about-extra-credit/about_extra_credit.rb +114 -0
- data/solutions/about-hashes/about_hashes.rb +52 -0
- data/solutions/about-inheritance/about_inheritance.rb +27 -0
- data/solutions/about-iteration/about_iteration.rb +31 -0
- data/solutions/about-keyword-arguments/about_keyword_arguments.rb +28 -0
- data/solutions/about-message-passing/about_message_passing.rb +38 -0
- data/solutions/about-methods/about_methods.rb +39 -0
- data/solutions/about-modules/about_modules.rb +23 -0
- data/solutions/about-nil/about_nil.rb +23 -0
- data/solutions/about-objects/about_objects.rb +34 -0
- data/solutions/about-open-classes/about_open_classes.rb +23 -0
- data/solutions/about-pattern-matching/about_pattern_matching.rb +39 -0
- data/solutions/about-proxy-object-project/about_proxy_object_project.rb +44 -0
- data/solutions/about-regular-expressions/about_regular_expressions.rb +60 -0
- data/solutions/about-sandwich-code/about_sandwich_code.rb +60 -0
- data/solutions/about-scope/about_scope.rb +33 -0
- data/solutions/about-scoring-project/about_scoring_project.rb +19 -0
- data/solutions/about-strings/about_strings.rb +56 -0
- data/solutions/about-symbols/about_symbols.rb +35 -0
- data/solutions/about-to-str/about_to_str.rb +24 -0
- data/solutions/about-triangle-project/about_triangle_project.rb +19 -0
- data/solutions/about-triangle-project-two/about_triangle_project_two.rb +25 -0
- data/solutions/about-true-and-false/about_true_and_false.rb +25 -0
- data/solutions/blocks-and-methods/blocks_and_methods.rb +14 -0
- data/solutions/class-state/class_state.rb +33 -0
- data/solutions/closure-capture/closure_capture.rb +12 -0
- data/solutions/collection-basics/collection_basics.rb +14 -0
- data/solutions/constant-scope/constant_scope.rb +18 -0
- data/solutions/core-protocols/core_protocols.rb +44 -0
- data/solutions/delegation/delegation.rb +17 -0
- data/solutions/dynamic-methods/dynamic_methods.rb +32 -0
- data/solutions/exception-flow/exception_flow.rb +34 -0
- data/solutions/heredoc-layout/heredoc_layout.rb +24 -0
- data/solutions/keyword-forwarding/keyword_forwarding.rb +26 -0
- data/solutions/lazy-enumeration/lazy_enumeration.rb +11 -0
- data/solutions/literals-and-operators/literals_and_operators.rb +22 -0
- data/solutions/method-contracts/method_contracts.rb +18 -0
- data/solutions/method-lookup/method_lookup.rb +26 -0
- data/solutions/nonlocal-exit/nonlocal_exit.rb +46 -0
- data/solutions/numbered-parameters/numbered_parameters.rb +18 -0
- data/solutions/numeric-precision/numeric_precision.rb +17 -0
- data/solutions/pattern-matching/pattern_matching.rb +17 -0
- data/solutions/refinement-scope/refinement_scope.rb +34 -0
- data/solutions/regexp-captures/regexp_captures.rb +24 -0
- data/solutions/runtime-context/runtime_context.rb +19 -0
- data/solutions/shared-rows/shared_rows.rb +13 -0
- data/solutions/singleton-pattern/singleton_pattern.rb +19 -0
- data/solutions/time-and-date/time_and_date.rb +16 -0
- data/solutions/visibility/visibility.rb +34 -0
- data/test/exercises/about_array_assignment_test.rb +87 -0
- data/test/exercises/about_arrays_test.rb +119 -0
- data/test/exercises/about_asserts_test.rb +41 -0
- data/test/exercises/about_blocks_test.rb +140 -0
- data/test/exercises/about_class_methods_test.rb +232 -0
- data/test/exercises/about_classes_test.rb +261 -0
- data/test/exercises/about_constants_test.rb +111 -0
- data/test/exercises/about_control_statements_test.rb +188 -0
- data/test/exercises/about_dice_project_test.rb +40 -0
- data/test/exercises/about_exceptions_test.rb +98 -0
- data/test/exercises/about_extra_credit_test.rb +74 -0
- data/test/exercises/about_hashes_test.rb +163 -0
- data/test/exercises/about_inheritance_test.rb +121 -0
- data/test/exercises/about_iteration_test.rb +148 -0
- data/test/exercises/about_keyword_arguments_test.rb +80 -0
- data/test/exercises/about_message_passing_test.rb +230 -0
- data/test/exercises/about_methods_test.rb +208 -0
- data/test/exercises/about_modules_test.rb +98 -0
- data/test/exercises/about_nil_test.rb +35 -0
- data/test/exercises/about_objects_test.rb +74 -0
- data/test/exercises/about_open_classes_test.rb +60 -0
- data/test/exercises/about_pattern_matching_test.rb +257 -0
- data/test/exercises/about_proxy_object_project_test.rb +75 -0
- data/test/exercises/about_regular_expressions_test.rb +243 -0
- data/test/exercises/about_sandwich_code_test.rb +82 -0
- data/test/exercises/about_scope_test.rb +123 -0
- data/test/exercises/about_scoring_project_test.rb +62 -0
- data/test/exercises/about_strings_test.rb +255 -0
- data/test/exercises/about_symbols_test.rb +120 -0
- data/test/exercises/about_to_str_test.rb +89 -0
- data/test/exercises/about_triangle_project_test.rb +29 -0
- data/test/exercises/about_triangle_project_two_test.rb +28 -0
- data/test/exercises/about_true_and_false_test.rb +43 -0
- data/test/exercises/blocks_and_methods_test.rb +22 -0
- data/test/exercises/class_state_test.rb +29 -0
- data/test/exercises/closure_capture_test.rb +29 -0
- data/test/exercises/collection_basics_test.rb +18 -0
- data/test/exercises/constant_scope_test.rb +18 -0
- data/test/exercises/core_protocols_test.rb +28 -0
- data/test/exercises/delegation_test.rb +23 -0
- data/test/exercises/dynamic_methods_test.rb +28 -0
- data/test/exercises/exception_flow_test.rb +17 -0
- data/test/exercises/heredoc_layout_test.rb +18 -0
- data/test/exercises/keyword_forwarding_test.rb +22 -0
- data/test/exercises/lazy_enumeration_test.rb +15 -0
- data/test/exercises/literals_and_operators_test.rb +25 -0
- data/test/exercises/method_contracts_test.rb +28 -0
- data/test/exercises/method_lookup_test.rb +14 -0
- data/test/exercises/nonlocal_exit_test.rb +22 -0
- data/test/exercises/numbered_parameters_test.rb +15 -0
- data/test/exercises/numeric_precision_test.rb +24 -0
- data/test/exercises/pattern_matching_test.rb +18 -0
- data/test/exercises/refinement_scope_test.rb +14 -0
- data/test/exercises/regexp_captures_test.rb +20 -0
- data/test/exercises/runtime_context_test.rb +59 -0
- data/test/exercises/shared_rows_test.rb +34 -0
- data/test/exercises/singleton_pattern_test.rb +16 -0
- data/test/exercises/time_and_date_test.rb +22 -0
- data/test/exercises/visibility_test.rb +22 -0
- metadata +471 -4
- data/Rakefile +0 -12
- 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.
|