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,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,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,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
|