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,99 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Rkoans
|
|
4
|
+
# Renders check output, the completed screen, and the session footer.
|
|
5
|
+
class TerminalView
|
|
6
|
+
HELP = <<~TEXT
|
|
7
|
+
Keyboard help
|
|
8
|
+
|
|
9
|
+
l List exercises immediately.
|
|
10
|
+
s Show the current exercise immediately.
|
|
11
|
+
h Show an exercise hint immediately (unfinished current exercise only).
|
|
12
|
+
? Show this help immediately.
|
|
13
|
+
n + Enter Move to the next exercise after the current checks pass.
|
|
14
|
+
q + Enter Quit and preserve your edits.
|
|
15
|
+
Ctrl-C Quit and preserve your edits.
|
|
16
|
+
|
|
17
|
+
Saving your exercise file reruns its checks automatically.
|
|
18
|
+
TEXT
|
|
19
|
+
|
|
20
|
+
# @param catalog [Catalog] ordered exercises used by this component
|
|
21
|
+
def initialize(out:, catalog: Catalog.new)
|
|
22
|
+
@catalog = catalog
|
|
23
|
+
@out = out
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def render(exercise:, result:, completed:, watching:, message: nil)
|
|
27
|
+
clear if watching
|
|
28
|
+
@out.puts "Output\n\n"
|
|
29
|
+
if watching && result.exit_code.zero?
|
|
30
|
+
show_completed(exercise)
|
|
31
|
+
else
|
|
32
|
+
show_checks(exercise, result)
|
|
33
|
+
end
|
|
34
|
+
@out.puts "\n#{message}" if message
|
|
35
|
+
footer(exercise, completed, result.exit_code.zero?) if watching
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def show_message(message, exercise:, completed:, passed:, mode: :current)
|
|
39
|
+
clear
|
|
40
|
+
@out.puts "Output\n\n#{message}"
|
|
41
|
+
footer(exercise, completed, passed, listing: mode == :list) unless mode == :quit
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def show_list(exercise:, completed:, passed:)
|
|
45
|
+
clear
|
|
46
|
+
@out.puts "Exercises\n\n"
|
|
47
|
+
@catalog.ids.each do |id|
|
|
48
|
+
marker = id == exercise.id ? '>' : ' '
|
|
49
|
+
state = completed.include?(id) ? 'done' : 'open'
|
|
50
|
+
@out.puts "#{marker} [#{state}] #{id}"
|
|
51
|
+
end
|
|
52
|
+
footer(exercise, completed, passed, listing: true)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def footer(exercise, completed, passed, listing: false)
|
|
56
|
+
@out.puts progress_line(completed.size)
|
|
57
|
+
@out.puts "Current exercise: #{colorize(exercise.solution, 36)}"
|
|
58
|
+
@out.puts colorize('Watching for saves · Ctrl-C to exit', 36)
|
|
59
|
+
@out.puts "\n#{commands(passed, listing: listing)}"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
def clear
|
|
65
|
+
@out.print "\e[3J\e[2J\e[H" if @out.tty?
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def progress_line(count)
|
|
69
|
+
filled = count * 20 / @catalog.ids.size
|
|
70
|
+
bar = colorize('#' * filled, 32) + colorize('-' * (20 - filled), 31)
|
|
71
|
+
"\nProgress: [#{bar}] #{count}/#{@catalog.ids.size}"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def commands(passed, listing:)
|
|
75
|
+
return 's:show current / n:next (Enter) / q:quit (Enter) / ?:help' if listing
|
|
76
|
+
|
|
77
|
+
passed ? 'n:next (Enter) / l:list / q:quit (Enter) / ?:help' : 'h:hint / l:list / q:quit (Enter) / ?:help'
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def show_completed(exercise)
|
|
81
|
+
@out.puts colorize('Exercise done ✓', 32)
|
|
82
|
+
@out.puts "Solution for comparison: #{colorize(exercise.reference, 36)}"
|
|
83
|
+
@out.puts 'When done experimenting, enter n to move on to the next exercise.'
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def show_checks(exercise, result)
|
|
87
|
+
@out.puts exercise.instructions
|
|
88
|
+
@out.puts "\nEdit: #{exercise.solution}\n\n"
|
|
89
|
+
@out.puts result.output
|
|
90
|
+
@out.puts(result.exit_code.zero? ? colorize('PASS', 32) : colorize('FAIL', 31))
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def colorize(text, code)
|
|
94
|
+
return text unless @out.tty? && !ENV.key?('NO_COLOR')
|
|
95
|
+
|
|
96
|
+
"\e[#{code}m#{text}\e[0m"
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
data/lib/rkoans/version.rb
CHANGED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'digest'
|
|
4
|
+
|
|
5
|
+
module Rkoans
|
|
6
|
+
# Reruns a block after file contents change and saves settle.
|
|
7
|
+
class Watcher
|
|
8
|
+
# @param [String] path
|
|
9
|
+
# @param [Float] interval
|
|
10
|
+
# @param [Float] debounce
|
|
11
|
+
def initialize(path, interval: 0.1, debounce: 0.2)
|
|
12
|
+
@path = path
|
|
13
|
+
@interval = interval
|
|
14
|
+
@debounce = debounce
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Calls the block initially and after saves, until interrupted.
|
|
18
|
+
def run(input: nil)
|
|
19
|
+
keyboard = Keyboard.new(input: input)
|
|
20
|
+
@previous = fingerprint
|
|
21
|
+
@changed_at = nil
|
|
22
|
+
keyboard.with_terminal do
|
|
23
|
+
yield nil
|
|
24
|
+
loop do
|
|
25
|
+
command = keyboard.read(@interval)
|
|
26
|
+
yield command if command
|
|
27
|
+
yield nil if changed?
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def changed?
|
|
35
|
+
current = fingerprint
|
|
36
|
+
if current != @previous
|
|
37
|
+
@previous = current
|
|
38
|
+
@changed_at = monotonic_time
|
|
39
|
+
elsif @changed_at && monotonic_time - @changed_at >= @debounce
|
|
40
|
+
@changed_at = nil
|
|
41
|
+
return true
|
|
42
|
+
end
|
|
43
|
+
false
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @return [String, nil]
|
|
47
|
+
def fingerprint
|
|
48
|
+
Digest::SHA256.file(@path).hexdigest
|
|
49
|
+
rescue Errno::ENOENT
|
|
50
|
+
nil
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# @return [Float]
|
|
54
|
+
def monotonic_time
|
|
55
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
data/lib/rkoans.rb
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
require_relative 'rkoans/error'
|
|
4
|
+
|
|
5
|
+
require_relative 'rkoans/version'
|
|
6
|
+
require_relative 'rkoans/catalog'
|
|
7
|
+
require_relative 'rkoans/exercise'
|
|
8
|
+
require_relative 'rkoans/selection'
|
|
9
|
+
require_relative 'rkoans/progress'
|
|
10
|
+
require_relative 'rkoans/checker'
|
|
11
|
+
require_relative 'rkoans/keyboard'
|
|
12
|
+
require_relative 'rkoans/watcher'
|
|
13
|
+
require_relative 'rkoans/terminal_view'
|
|
14
|
+
require_relative 'rkoans/session'
|
|
15
|
+
require_relative 'rkoans/cli'
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module CommandSupport
|
|
2
|
+
interface _Stream
|
|
3
|
+
def readline: -> String
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
ROOT: String
|
|
7
|
+
COMMAND: Array[String]
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def command: -> Array[String]
|
|
12
|
+
def reference_source: (?String id) -> String
|
|
13
|
+
|
|
14
|
+
def solution: (String directory) -> String
|
|
15
|
+
def run_command: (*String command_name, directory: String) -> [String, Process::Status]
|
|
16
|
+
def with_watcher: (*String message, directory: String) { (_Stream) -> untyped } -> untyped
|
|
17
|
+
def wait_for: (_Stream stream, String text) -> String
|
|
18
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
class CurriculumCopTest
|
|
2
|
+
def test_complete_curriculum_and_missing_asset_diagnostics: -> void
|
|
3
|
+
def test_reports_multiple_curriculum_defects_together: -> void
|
|
4
|
+
def test_invalid_catalog_is_reported_as_an_offense: -> void
|
|
5
|
+
private
|
|
6
|
+
def with_curriculum: { (String directory) -> void } -> void
|
|
7
|
+
def copy_cop: (String root, String directory) -> void
|
|
8
|
+
def offenses: (String directory) -> Array[String]
|
|
9
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# SPDX-License-Identifier: CC-BY-NC-SA-3.0
|
|
2
|
+
# Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
|
|
3
|
+
# See THIRD_PARTY_NOTICES.md for attribution and license terms.
|
|
4
|
+
|
|
5
|
+
module Exercises
|
|
6
|
+
class AboutArrayAssignment
|
|
7
|
+
type answers = {
|
|
8
|
+
names: (Array[String] | :fill_me_in),
|
|
9
|
+
first_name: (String | :fill_me_in),
|
|
10
|
+
last_name: (String | :fill_me_in),
|
|
11
|
+
extra_first: (String | :fill_me_in),
|
|
12
|
+
extra_last: (String | :fill_me_in),
|
|
13
|
+
splat_first: (String | :fill_me_in),
|
|
14
|
+
splat_last: (Array[String] | :fill_me_in),
|
|
15
|
+
short_first: (String | :fill_me_in),
|
|
16
|
+
short_last: (nil | :fill_me_in),
|
|
17
|
+
nested_first: (Array[String] | :fill_me_in),
|
|
18
|
+
nested_last: (String | :fill_me_in),
|
|
19
|
+
single_first: (String | :fill_me_in),
|
|
20
|
+
swapped_first: (String | :fill_me_in),
|
|
21
|
+
swapped_last: (String | :fill_me_in)
|
|
22
|
+
}
|
|
23
|
+
def self.koans: -> answers
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
class AboutArrayAssignmentTest
|
|
28
|
+
def test_non_parallel_assignment: -> void
|
|
29
|
+
def test_parallel_assignments: -> void
|
|
30
|
+
def test_parallel_assignments_with_extra_values: -> void
|
|
31
|
+
def test_parallel_assignments_with_splat_operator: -> void
|
|
32
|
+
def test_parallel_assignments_with_too_few_values: -> void
|
|
33
|
+
def test_parallel_assignments_with_subarrays: -> void
|
|
34
|
+
def test_parallel_assignment_with_one_variable: -> void
|
|
35
|
+
def test_swapping_with_parallel_assignment: -> void
|
|
36
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# SPDX-License-Identifier: CC-BY-NC-SA-3.0
|
|
2
|
+
# Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
|
|
3
|
+
# See THIRD_PARTY_NOTICES.md for attribution and license terms.
|
|
4
|
+
|
|
5
|
+
module Exercises
|
|
6
|
+
class AboutArrays
|
|
7
|
+
type answers = {
|
|
8
|
+
empty_type: (singleton(Array) | :fill_me_in),
|
|
9
|
+
empty_size: (Integer | :fill_me_in),
|
|
10
|
+
second_literal: (Integer | :fill_me_in),
|
|
11
|
+
after_append: (Array[Integer] | :fill_me_in),
|
|
12
|
+
first_index: Symbol,
|
|
13
|
+
first_method: Symbol,
|
|
14
|
+
last_index: Symbol,
|
|
15
|
+
last_method: Symbol,
|
|
16
|
+
negative_last: Symbol,
|
|
17
|
+
negative_third: Symbol,
|
|
18
|
+
slice_one: (Array[Symbol] | :fill_me_in),
|
|
19
|
+
slice_two: (Array[Symbol] | :fill_me_in),
|
|
20
|
+
slice_tail: (Array[Symbol] | :fill_me_in),
|
|
21
|
+
slice_long_tail: (Array[Symbol] | :fill_me_in),
|
|
22
|
+
slice_at_end_zero: (Array[Symbol] | :fill_me_in),
|
|
23
|
+
slice_at_end_long: (Array[Symbol] | :fill_me_in),
|
|
24
|
+
slice_beyond_end: (nil | :fill_me_in),
|
|
25
|
+
range_type: (singleton(Range) | :fill_me_in),
|
|
26
|
+
inclusive_range: (Array[Integer] | :fill_me_in),
|
|
27
|
+
exclusive_range: (Array[Integer] | :fill_me_in),
|
|
28
|
+
inclusive_slice: (Array[Symbol] | :fill_me_in),
|
|
29
|
+
exclusive_slice: (Array[Symbol] | :fill_me_in),
|
|
30
|
+
negative_range_slice: (Array[Symbol] | :fill_me_in),
|
|
31
|
+
after_push: (Array[Integer | Symbol] | :fill_me_in),
|
|
32
|
+
popped_value: Symbol,
|
|
33
|
+
after_pop: (Array[Integer] | :fill_me_in),
|
|
34
|
+
after_unshift: (Array[Integer | Symbol] | :fill_me_in),
|
|
35
|
+
shifted_value: Symbol,
|
|
36
|
+
after_shift: (Array[Integer] | :fill_me_in)
|
|
37
|
+
}
|
|
38
|
+
def self.koans: -> answers
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class AboutArraysTest
|
|
43
|
+
def test_creating_arrays: -> void
|
|
44
|
+
def test_array_literals: -> void
|
|
45
|
+
def test_accessing_array_elements: -> void
|
|
46
|
+
def test_slicing_arrays: -> void
|
|
47
|
+
def test_arrays_and_ranges: -> void
|
|
48
|
+
def test_slicing_with_ranges: -> void
|
|
49
|
+
def test_pushing_and_popping_arrays: -> void
|
|
50
|
+
def test_shifting_arrays: -> void
|
|
51
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# SPDX-License-Identifier: CC-BY-NC-SA-3.0
|
|
2
|
+
# Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
|
|
3
|
+
# See THIRD_PARTY_NOTICES.md for attribution and license terms.
|
|
4
|
+
module Exercises
|
|
5
|
+
class AboutAsserts
|
|
6
|
+
type answers = {
|
|
7
|
+
truth: bool,
|
|
8
|
+
with_message: bool,
|
|
9
|
+
expected_value: Integer?,
|
|
10
|
+
better_expected_value: Integer?,
|
|
11
|
+
filled_value: Integer?
|
|
12
|
+
}
|
|
13
|
+
def self.koans: -> answers
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class AboutAssertsTest
|
|
18
|
+
def test_assert_truth: -> void
|
|
19
|
+
def test_assert_with_message: -> void
|
|
20
|
+
def test_assert_equality: -> void
|
|
21
|
+
def test_a_better_way_of_asserting_equality: -> void
|
|
22
|
+
def test_fill_in_values: -> void
|
|
23
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# SPDX-License-Identifier: CC-BY-NC-SA-3.0
|
|
2
|
+
# Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
|
|
3
|
+
# See THIRD_PARTY_NOTICES.md for attribution and license terms.
|
|
4
|
+
|
|
5
|
+
module Exercises
|
|
6
|
+
class AboutBlocks
|
|
7
|
+
type answers = {
|
|
8
|
+
methods_can_take_blocks_one: (::Integer | :fill_me_in),
|
|
9
|
+
blocks_can_be_defined_with_do_end_too_one: (::Integer | :fill_me_in),
|
|
10
|
+
blocks_can_take_arguments_one: (::String | :fill_me_in),
|
|
11
|
+
methods_can_call_yield_many_times_one: (::Array[::Symbol] | :fill_me_in),
|
|
12
|
+
methods_can_see_if_they_have_been_called_with_a_block_one: (::Symbol | :fill_me_in),
|
|
13
|
+
methods_can_see_if_they_have_been_called_with_a_block_two: (::Symbol | :fill_me_in),
|
|
14
|
+
block_can_affect_variables_in_the_code_where_they_are_created_one: (::Symbol | :fill_me_in),
|
|
15
|
+
blocks_can_be_assigned_to_variables_and_called_explicitly_one: (::Integer | :fill_me_in),
|
|
16
|
+
blocks_can_be_assigned_to_variables_and_called_explicitly_two: (::Integer | :fill_me_in),
|
|
17
|
+
stand_alone_blocks_can_be_passed_to_methods_expecting_blocks_one: (::String | :fill_me_in),
|
|
18
|
+
methods_can_take_an_explicit_block_argument_one: (::Integer | :fill_me_in),
|
|
19
|
+
methods_can_take_an_explicit_block_argument_two: (::Integer | :fill_me_in)
|
|
20
|
+
}
|
|
21
|
+
def self.koans: -> answers
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class AboutBlocksTest
|
|
26
|
+
def method_with_block: [A] () { () -> A } -> A
|
|
27
|
+
def test_methods_can_take_blocks: -> void
|
|
28
|
+
def test_blocks_can_be_defined_with_do_end_too: -> void
|
|
29
|
+
def method_with_block_arguments: [A] () { (String) -> A } -> A
|
|
30
|
+
def test_blocks_can_take_arguments: -> void
|
|
31
|
+
def many_yields: [A] () { (Symbol) -> A } -> A
|
|
32
|
+
def test_methods_can_call_yield_many_times: -> void
|
|
33
|
+
def yield_tester: [A] () ?{ () -> A } -> (A | Symbol)
|
|
34
|
+
def test_methods_can_see_if_they_have_been_called_with_a_block: -> void
|
|
35
|
+
def test_block_can_affect_variables_in_the_code_where_they_are_created: -> void
|
|
36
|
+
def test_blocks_can_be_assigned_to_variables_and_called_explicitly: -> void
|
|
37
|
+
def test_stand_alone_blocks_can_be_passed_to_methods_expecting_blocks: -> void
|
|
38
|
+
def method_with_explicit_block: [A] () { (Integer) -> A } -> A
|
|
39
|
+
def test_methods_can_take_an_explicit_block_argument: -> void
|
|
40
|
+
end
|