fix 1.0.0.beta4 → 1.0.0.beta5
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/LICENSE.md +1 -1
- data/README.md +49 -36
- data/lib/fix.rb +14 -16
- data/lib/fix/console.rb +32 -0
- data/lib/fix/doc.rb +7 -0
- data/lib/fix/dsl.rb +168 -0
- data/lib/fix/test.rb +44 -0
- data/lib/kernel.rb +23 -2
- metadata +92 -33
- data/lib/fix/context.rb +0 -160
- data/lib/fix/expectation_result_not_found_error.rb +0 -5
- data/lib/fix/it.rb +0 -31
- data/lib/fix/suspicious_success_error.rb +0 -5
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 6f9b6d58547e6b78494ab484447f08c43a2fd233db5ef946c977b0f21fc0311d
         | 
| 4 | 
            +
              data.tar.gz: 0fb204fd7cb1ccf56ddfacfe6737e137c387d5734855e629edae6a5289d2e291
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 67bd36e9816e7f92c0a2534d3d7055a73c5c249182b6b0e7842441c856e0fb6d47e0fb59dbe89b9fbe3124212b98e765cf5f312a14e276017b1dcd29d120002f
         | 
| 7 | 
            +
              data.tar.gz: e58648ee25f43b7d964a2f0782a05724c935b2661dc4c2afa5c71bff51af0baac694ef86a12c911266bb1d4e4ebc50d3f499e05531722d0362be5fc1f1f6bd5e
         | 
    
        data/LICENSE.md
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -1,29 +1,33 @@ | |
| 1 1 | 
             
            # Fix
         | 
| 2 2 |  | 
| 3 | 
            -
            [](https://fixrb.dev/)
         | 
| 4 | 
            +
            [](https://github.com/fixrb/fix/releases)
         | 
| 5 | 
            +
            [](https://rubydoc.info/github/fixrb/fix/main)
         | 
| 6 | 
            +
            [](https://github.com/fixrb/fix/actions?query=workflow%3Aci+branch%3Amain)
         | 
| 7 | 
            +
            [](https://github.com/fixrb/fix/actions?query=workflow%3Arubocop+branch%3Amain)
         | 
| 8 | 
            +
            [](https://github.com/fixrb/fix/raw/main/LICENSE.md)
         | 
| 9 9 |  | 
| 10 | 
            -
             | 
| 10 | 
            +
            
         | 
| 11 11 |  | 
| 12 12 | 
             
            ## Installation
         | 
| 13 13 |  | 
| 14 14 | 
             
            Add this line to your application's Gemfile:
         | 
| 15 15 |  | 
| 16 16 | 
             
            ```ruby
         | 
| 17 | 
            -
            gem  | 
| 17 | 
            +
            gem "fix", ">= 1.0.0.beta5"
         | 
| 18 18 | 
             
            ```
         | 
| 19 19 |  | 
| 20 20 | 
             
            And then execute:
         | 
| 21 21 |  | 
| 22 | 
            -
             | 
| 22 | 
            +
            ```sh
         | 
| 23 | 
            +
            bundle
         | 
| 24 | 
            +
            ```
         | 
| 23 25 |  | 
| 24 26 | 
             
            Or install it yourself as:
         | 
| 25 27 |  | 
| 26 | 
            -
             | 
| 28 | 
            +
            ```sh
         | 
| 29 | 
            +
            gem install fix --pre
         | 
| 30 | 
            +
            ```
         | 
| 27 31 |  | 
| 28 32 | 
             
            ## Example
         | 
| 29 33 |  | 
| @@ -33,31 +37,29 @@ Given this app: | |
| 33 37 | 
             
            # examples/duck/app.rb
         | 
| 34 38 | 
             
            class Duck
         | 
| 35 39 | 
             
              def walks
         | 
| 36 | 
            -
                 | 
| 40 | 
            +
                "Klop klop!"
         | 
| 37 41 | 
             
              end
         | 
| 38 42 |  | 
| 39 43 | 
             
              def swims
         | 
| 40 | 
            -
                 | 
| 44 | 
            +
                "Swoosh..."
         | 
| 41 45 | 
             
              end
         | 
| 42 46 |  | 
| 43 47 | 
             
              def quacks
         | 
| 44 | 
            -
                puts  | 
| 48 | 
            +
                puts "Quaaaaaack!"
         | 
| 45 49 | 
             
              end
         | 
| 46 50 | 
             
            end
         | 
| 47 51 | 
             
            ```
         | 
| 48 52 |  | 
| 49 | 
            -
             | 
| 53 | 
            +
            And this fixed behavior:
         | 
| 50 54 |  | 
| 51 55 | 
             
            ```ruby
         | 
| 52 56 | 
             
            # examples/duck/fix.rb
         | 
| 53 | 
            -
            require_relative 'app'
         | 
| 54 | 
            -
            require_relative '../../lib/fix'
         | 
| 55 57 |  | 
| 56 | 
            -
             | 
| 58 | 
            +
            relative "fix"
         | 
| 57 59 |  | 
| 58 | 
            -
            Fix | 
| 60 | 
            +
            Fix :Duck do
         | 
| 59 61 | 
             
              on :swims do
         | 
| 60 | 
            -
                it { MUST eql  | 
| 62 | 
            +
                it { MUST eql "Swoosh..." }
         | 
| 61 63 | 
             
              end
         | 
| 62 64 |  | 
| 63 65 | 
             
              on :speaks do
         | 
| @@ -65,27 +67,45 @@ Fix(@bird) do | |
| 65 67 | 
             
              end
         | 
| 66 68 |  | 
| 67 69 | 
             
              on :sings do
         | 
| 68 | 
            -
                it { MAY eql  | 
| 70 | 
            +
                it { MAY eql "♪... ♫..." }
         | 
| 69 71 | 
             
              end
         | 
| 70 72 | 
             
            end
         | 
| 71 73 | 
             
            ```
         | 
| 72 74 |  | 
| 73 | 
            -
             | 
| 75 | 
            +
            When I run this test:
         | 
| 76 | 
            +
             | 
| 77 | 
            +
            ```ruby
         | 
| 78 | 
            +
            # examples/duck/test.rb
         | 
| 79 | 
            +
             | 
| 80 | 
            +
            require_relative "app"
         | 
| 81 | 
            +
            require_relative "fix"
         | 
| 82 | 
            +
             | 
| 83 | 
            +
            Fix[:Duck].call(Duck.new)
         | 
| 84 | 
            +
            ```
         | 
| 74 85 |  | 
| 75 86 | 
             
            ```sh
         | 
| 76 | 
            -
            ruby examples/duck/ | 
| 87 | 
            +
            ruby examples/duck/test.rb
         | 
| 77 88 | 
             
            ```
         | 
| 78 89 |  | 
| 90 | 
            +
            I should see this output:
         | 
| 91 | 
            +
             | 
| 79 92 | 
             
            ```txt
         | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 93 | 
            +
            Test #<Duck:0x00007fc5289bcf68> against Duck:
         | 
| 94 | 
            +
            - NoMethodError: undefined method `sings' for #<Duck:0x00007fc5289bcf68>.
         | 
| 95 | 
            +
            - Success: expected to eql "Swoosh...".
         | 
| 96 | 
            +
            - Success: undefined method `speaks' for #<Duck:0x00007fc5289bcf68>.
         | 
| 83 97 | 
             
            ```
         | 
| 84 98 |  | 
| 99 | 
            +
            ## Test suite
         | 
| 100 | 
            +
             | 
| 101 | 
            +
            __Fix__'s specifications are [fixed here](https://github.com/fixrb/fix/blob/main/fix/) and can be tested against __Fix__'s codebase executing [test/](https://github.com/fixrb/fix/blob/main/test/)'s files.
         | 
| 102 | 
            +
             | 
| 85 103 | 
             
            ## Contact
         | 
| 86 104 |  | 
| 87 | 
            -
            * Home page: https://fixrb.dev/
         | 
| 88 | 
            -
            * Source code: https://github.com/fixrb/fix
         | 
| 105 | 
            +
            * Home page: [https://fixrb.dev/](https://fixrb.dev/)
         | 
| 106 | 
            +
            * Source code: [https://github.com/fixrb/fix](https://github.com/fixrb/fix)
         | 
| 107 | 
            +
            * API Doc: [https://rubydoc.info/gems/fix](https://rubydoc.info/gems/fix)
         | 
| 108 | 
            +
            * Twitter: [https://twitter.com/fix\_rb](https://twitter.com/fix\_rb)
         | 
| 89 109 |  | 
| 90 110 | 
             
            ## Versioning
         | 
| 91 111 |  | 
| @@ -93,20 +113,13 @@ __Fix__ follows [Semantic Versioning 2.0](https://semver.org/). | |
| 93 113 |  | 
| 94 114 | 
             
            ## License
         | 
| 95 115 |  | 
| 96 | 
            -
            The gem is available as open source under the terms of the [MIT License](https:// | 
| 116 | 
            +
            The [gem](https://rubygems.org/gems/fix) is available as open source under the terms of the [MIT License](https://github.com/fixrb/fix/raw/main/LICENSE.md).
         | 
| 97 117 |  | 
| 98 118 | 
             
            ***
         | 
| 99 119 |  | 
| 100 120 | 
             
            <p>
         | 
| 101 121 | 
             
              This project is sponsored by:<br />
         | 
| 102 122 | 
             
              <a href="https://sashite.com/"><img
         | 
| 103 | 
            -
                src="https://github.com/fixrb/fix/raw/ | 
| 123 | 
            +
                src="https://github.com/fixrb/fix/raw/main/img/sashite.png"
         | 
| 104 124 | 
             
                alt="Sashite" /></a>
         | 
| 105 125 | 
             
            </p>
         | 
| 106 | 
            -
             | 
| 107 | 
            -
            [travis]: https://travis-ci.org/fixrb/fix
         | 
| 108 | 
            -
            [codeclimate]: https://codeclimate.com/github/fixrb/fix
         | 
| 109 | 
            -
            [gem]: https://rubygems.org/gems/fix
         | 
| 110 | 
            -
            [inchpages]: https://inch-ci.org/github/fixrb/fix
         | 
| 111 | 
            -
            [rubydoc]: https://rubydoc.info/gems/fix/frames
         | 
| 112 | 
            -
            [gitter]: https://gitter.im/fixrb/fix?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge
         | 
    
        data/lib/fix.rb
    CHANGED
    
    | @@ -1,25 +1,23 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            +
            require_relative File.join("fix", "test")
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            require_relative "kernel"
         | 
| 6 | 
            +
             | 
| 3 7 | 
             
            # Namespace for the Fix framework.
         | 
| 4 | 
            -
            #
         | 
| 5 8 | 
             
            module Fix
         | 
| 6 | 
            -
              #  | 
| 9 | 
            +
              # Test a built specification.
         | 
| 7 10 | 
             
              #
         | 
| 8 | 
            -
              # @example  | 
| 9 | 
            -
              #    | 
| 10 | 
            -
              #     it { MUST equal 42 }
         | 
| 11 | 
            -
              #   end
         | 
| 11 | 
            +
              # @example Run _Answer_ specification against `42`.
         | 
| 12 | 
            +
              #   Fix[:Answer].call(42)
         | 
| 12 13 | 
             
              #
         | 
| 13 | 
            -
              # @ | 
| 14 | 
            -
              # | 
| 15 | 
            -
              # @param specs        [Proc]        The set of specs.
         | 
| 14 | 
            +
              # @example Test _Answer_ specification against `42`.
         | 
| 15 | 
            +
              #   Fix[:Answer].matches? { 42 }
         | 
| 16 16 | 
             
              #
         | 
| 17 | 
            -
              # @ | 
| 18 | 
            -
               | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 17 | 
            +
              # @param name [String, Symbol] The name of the specification document.
         | 
| 18 | 
            +
              #
         | 
| 19 | 
            +
              # @return [::Fix::Dsl] The specification document.
         | 
| 20 | 
            +
              def self.[](name)
         | 
| 21 | 
            +
                Test.new(name)
         | 
| 21 22 | 
             
              end
         | 
| 22 23 | 
             
            end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
            require_relative 'kernel'
         | 
| 25 | 
            -
            require_relative File.join('fix', 'context')
         | 
    
        data/lib/fix/console.rb
    ADDED
    
    | @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Fix
         | 
| 4 | 
            +
              # Send log messages to the console.
         | 
| 5 | 
            +
              module Console
         | 
| 6 | 
            +
                # @param name     [String, Symbol]  The name of the specification document.
         | 
| 7 | 
            +
                # @param subject  [#object_id]      The front object to be tested.
         | 
| 8 | 
            +
                #
         | 
| 9 | 
            +
                # @return [nil] Add a message to `$stdout`.
         | 
| 10 | 
            +
                def self.title(name, subject)
         | 
| 11 | 
            +
                  puts "Run #{name} specs against #{subject.inspect}:"
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                # @param report [::Expresenter::Pass] Passed expectation result presenter.
         | 
| 15 | 
            +
                #
         | 
| 16 | 
            +
                # @see https://github.com/fixrb/expresenter
         | 
| 17 | 
            +
                #
         | 
| 18 | 
            +
                # @return [nil] Add a colored message to `$stdout`.
         | 
| 19 | 
            +
                def self.passed_spec(report)
         | 
| 20 | 
            +
                  puts "- #{report.colored_string}"
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                # @param report [::Expresenter::Fail] Failed expectation result presenter.
         | 
| 24 | 
            +
                #
         | 
| 25 | 
            +
                # @see https://github.com/fixrb/expresenter
         | 
| 26 | 
            +
                #
         | 
| 27 | 
            +
                # @raise [SystemExit] Terminate execution immediately with colored message.
         | 
| 28 | 
            +
                def self.failed_spec(report)
         | 
| 29 | 
            +
                  abort "- #{report.colored_string}"
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
            end
         | 
    
        data/lib/fix/doc.rb
    ADDED
    
    
    
        data/lib/fix/dsl.rb
    ADDED
    
    | @@ -0,0 +1,168 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "defi"
         | 
| 4 | 
            +
            require "matchi/helper"
         | 
| 5 | 
            +
            require "spectus"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            require_relative "console"
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            module Fix
         | 
| 10 | 
            +
              # Abstract class for handling the domain-specific language.
         | 
| 11 | 
            +
              class Dsl
         | 
| 12 | 
            +
                include ::Matchi::Helper
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                # Sets a user-defined property.
         | 
| 15 | 
            +
                #
         | 
| 16 | 
            +
                # @example
         | 
| 17 | 
            +
                #   require "fix"
         | 
| 18 | 
            +
                #
         | 
| 19 | 
            +
                #   Fix.describe "Name stories" do
         | 
| 20 | 
            +
                #     let(:name) { "Bob" }
         | 
| 21 | 
            +
                #
         | 
| 22 | 
            +
                #     it { expect(name).to eq "Bob" }
         | 
| 23 | 
            +
                #
         | 
| 24 | 
            +
                #     context "with last name" do
         | 
| 25 | 
            +
                #       let(:name) { "#{super()} Smith" }
         | 
| 26 | 
            +
                #
         | 
| 27 | 
            +
                #       it { expect(name).to eq "Bob Smith" }
         | 
| 28 | 
            +
                #     end
         | 
| 29 | 
            +
                #   end
         | 
| 30 | 
            +
                #
         | 
| 31 | 
            +
                #   # Output to the console
         | 
| 32 | 
            +
                #   #   Success: expected to eq "Bob".
         | 
| 33 | 
            +
                #   #   Success: expected to eq "Bob Smith".
         | 
| 34 | 
            +
                #
         | 
| 35 | 
            +
                # @param name   [String, Symbol] The name of the property.
         | 
| 36 | 
            +
                # @param block  [Proc] The content of the method to define.
         | 
| 37 | 
            +
                #
         | 
| 38 | 
            +
                # @return [Symbol] A private method that define the block content.
         | 
| 39 | 
            +
                #
         | 
| 40 | 
            +
                # @api public
         | 
| 41 | 
            +
                def self.let(name, &block)
         | 
| 42 | 
            +
                  private_class_method define_singleton_method(name, &block)
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                def self.with(**kwargs, &block)
         | 
| 46 | 
            +
                  klass = ::Class.new(self)
         | 
| 47 | 
            +
                  kwargs.each { |name, value| klass.let(name) { value } }
         | 
| 48 | 
            +
                  klass.instance_eval(&block)
         | 
| 49 | 
            +
                  klass
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                # Defines an example group that describes a unit to be tested.
         | 
| 53 | 
            +
                #
         | 
| 54 | 
            +
                # @example
         | 
| 55 | 
            +
                #   require "fix"
         | 
| 56 | 
            +
                #
         | 
| 57 | 
            +
                #   Fix.on String do
         | 
| 58 | 
            +
                #     on "+" do
         | 
| 59 | 
            +
                #       it("concats") { expect("foo" + "bar").to eq "foobar" }
         | 
| 60 | 
            +
                #     end
         | 
| 61 | 
            +
                #   end
         | 
| 62 | 
            +
                #
         | 
| 63 | 
            +
                #   # Output to the console
         | 
| 64 | 
            +
                #   #   Success: expected to eq "foobar".
         | 
| 65 | 
            +
                #
         | 
| 66 | 
            +
                # @param const [Module, String] A module to include in block context.
         | 
| 67 | 
            +
                # @param block [Proc] The block to define the specs.
         | 
| 68 | 
            +
                #
         | 
| 69 | 
            +
                # @api public
         | 
| 70 | 
            +
                def self.on(method_name, *args, **kwargs, &block)
         | 
| 71 | 
            +
                  klass = ::Class.new(self)
         | 
| 72 | 
            +
                  klass.const_get(:SPECS) << klass
         | 
| 73 | 
            +
                  const_set("Child#{block.object_id}", klass)
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                  klass.define_singleton_method(:challenges) do
         | 
| 76 | 
            +
                    super() + [::Defi.send(method_name, *args, **kwargs)]
         | 
| 77 | 
            +
                  end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                  klass.instance_eval(&block)
         | 
| 80 | 
            +
                  klass
         | 
| 81 | 
            +
                end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                # Defines a concrete test case.
         | 
| 84 | 
            +
                #
         | 
| 85 | 
            +
                # The test is performed by the block supplied to `&block`.
         | 
| 86 | 
            +
                #
         | 
| 87 | 
            +
                # @example The integer after 41
         | 
| 88 | 
            +
                #   require "fix"
         | 
| 89 | 
            +
                #
         | 
| 90 | 
            +
                #   Fix(:AnswerToEverything) { it { MUST be 42 } }.call(42)
         | 
| 91 | 
            +
                #
         | 
| 92 | 
            +
                #   # Output to the console
         | 
| 93 | 
            +
                #   #   Success: expected to be 42.
         | 
| 94 | 
            +
                #
         | 
| 95 | 
            +
                # @example A division by zero
         | 
| 96 | 
            +
                #   require "fix"
         | 
| 97 | 
            +
                #
         | 
| 98 | 
            +
                #   Fix :Integer do
         | 
| 99 | 
            +
                #     it { MUST be_an_instance_of Integer }
         | 
| 100 | 
            +
                #
         | 
| 101 | 
            +
                #     on :/, 0 do
         | 
| 102 | 
            +
                #       it { MUST raise_exception ZeroDivisionError }
         | 
| 103 | 
            +
                #     end
         | 
| 104 | 
            +
                #   end
         | 
| 105 | 
            +
                #
         | 
| 106 | 
            +
                #   Fix[:Integer].call(41)
         | 
| 107 | 
            +
                #
         | 
| 108 | 
            +
                #   # Output to the console
         | 
| 109 | 
            +
                #   #   Success: expected 41 to be an instance of Integer.
         | 
| 110 | 
            +
                #   #   Success: divided by 0.
         | 
| 111 | 
            +
                #
         | 
| 112 | 
            +
                # It can be used inside a {.describe} or {.context} section.
         | 
| 113 | 
            +
                #
         | 
| 114 | 
            +
                # @param block [Proc] An expectation to evaluate.
         | 
| 115 | 
            +
                #
         | 
| 116 | 
            +
                # @raise (see ExpectationTarget::Base#result)
         | 
| 117 | 
            +
                # @return (see ExpectationTarget::Base#result)
         | 
| 118 | 
            +
                #
         | 
| 119 | 
            +
                # @api public
         | 
| 120 | 
            +
                def self.it(&block)
         | 
| 121 | 
            +
                  define_method("test_#{block.object_id}", &block)
         | 
| 122 | 
            +
                end
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                def self.its(method_name, *args, **kwargs, &block)
         | 
| 125 | 
            +
                  klass = ::Class.new(self)
         | 
| 126 | 
            +
                  klass.const_get(:SPECS) << klass
         | 
| 127 | 
            +
                  const_set("Child#{block.object_id}", klass)
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                  klass.define_singleton_method(:challenges) do
         | 
| 130 | 
            +
                    super() + [::Defi.send(method_name, *args, **kwargs)]
         | 
| 131 | 
            +
                  end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                  klass.it(&block)
         | 
| 134 | 
            +
                end
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                def self.challenges
         | 
| 137 | 
            +
                  []
         | 
| 138 | 
            +
                end
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                private_class_method :challenges
         | 
| 141 | 
            +
             | 
| 142 | 
            +
                private
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                def initialize(subject)
         | 
| 145 | 
            +
                  @subject = subject
         | 
| 146 | 
            +
                end
         | 
| 147 | 
            +
             | 
| 148 | 
            +
                ::Spectus.methods(false).each do |method_name|
         | 
| 149 | 
            +
                  define_method(method_name.upcase) do |matcher|
         | 
| 150 | 
            +
                    ::Spectus.public_send(method_name, matcher).call do
         | 
| 151 | 
            +
                      self.class.send(:challenges).inject(@subject) do |object, challenge|
         | 
| 152 | 
            +
                        challenge.to(object).call
         | 
| 153 | 
            +
                      end
         | 
| 154 | 
            +
                    end
         | 
| 155 | 
            +
                  end
         | 
| 156 | 
            +
                end
         | 
| 157 | 
            +
             | 
| 158 | 
            +
                def method_missing(method_name, *args, &block)
         | 
| 159 | 
            +
                  self.class.send(method_name)
         | 
| 160 | 
            +
                rescue ::NoMethodError
         | 
| 161 | 
            +
                  super
         | 
| 162 | 
            +
                end
         | 
| 163 | 
            +
             | 
| 164 | 
            +
                def respond_to_missing?(method_name, include_private = false)
         | 
| 165 | 
            +
                  self.class.respond_to?(method_name) || super
         | 
| 166 | 
            +
                end
         | 
| 167 | 
            +
              end
         | 
| 168 | 
            +
            end
         | 
    
        data/lib/fix/test.rb
    ADDED
    
    | @@ -0,0 +1,44 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "expresenter/fail"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            require_relative "console"
         | 
| 6 | 
            +
            require_relative "doc"
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            module Fix
         | 
| 9 | 
            +
              # Module for testing spec documents.
         | 
| 10 | 
            +
              class Test
         | 
| 11 | 
            +
                attr_reader :name
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def initialize(name)
         | 
| 14 | 
            +
                  @name = name
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def call(subject)
         | 
| 18 | 
            +
                  Console.title(name, subject)
         | 
| 19 | 
            +
                  requirements(subject).each { |requirement| test(requirement) }
         | 
| 20 | 
            +
                  exit(true)
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                private
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                def requirements(subject)
         | 
| 26 | 
            +
                  specs.flat_map do |spec|
         | 
| 27 | 
            +
                    example = spec.new(subject)
         | 
| 28 | 
            +
                    example.public_methods(false).map do |public_method|
         | 
| 29 | 
            +
                      example.method(public_method)
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
                  end.shuffle
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                def specs
         | 
| 35 | 
            +
                  Doc.const_get(name).const_get(:SPECS)
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                def test(requirement)
         | 
| 39 | 
            +
                  Console.passed_spec requirement.call
         | 
| 40 | 
            +
                rescue ::Expresenter::Fail => e
         | 
| 41 | 
            +
                  Console.failed_spec e
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
            end
         | 
    
        data/lib/kernel.rb
    CHANGED
    
    | @@ -1,9 +1,30 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            +
            require_relative File.join("fix", "doc")
         | 
| 4 | 
            +
            require_relative File.join("fix", "dsl")
         | 
| 5 | 
            +
            require_relative File.join("fix", "test")
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            # The Kernel module.
         | 
| 3 8 | 
             
            module Kernel
         | 
| 9 | 
            +
              # Specifications are built with this method.
         | 
| 10 | 
            +
              #
         | 
| 11 | 
            +
              # @example Fix 42 such as it must be equal to 42.
         | 
| 12 | 
            +
              #   Fix :Answer do
         | 
| 13 | 
            +
              #     it { MUST equal 42 }
         | 
| 14 | 
            +
              #   end
         | 
| 15 | 
            +
              #
         | 
| 16 | 
            +
              # @param name   [String, Symbol]  The name of the specification document.
         | 
| 17 | 
            +
              # @param block  [Proc]            The specifications.
         | 
| 18 | 
            +
              #
         | 
| 19 | 
            +
              # @return [Class] The specification document.
         | 
| 20 | 
            +
              #
         | 
| 4 21 | 
             
              # rubocop:disable Naming/MethodName
         | 
| 5 | 
            -
              def Fix( | 
| 6 | 
            -
                :: | 
| 22 | 
            +
              def Fix(name, &block)
         | 
| 23 | 
            +
                klass = ::Class.new(::Fix::Dsl)
         | 
| 24 | 
            +
                klass.const_set(:SPECS, [klass])
         | 
| 25 | 
            +
                klass.instance_eval(&block)
         | 
| 26 | 
            +
                ::Fix::Doc.const_set(name, klass)
         | 
| 27 | 
            +
                ::Fix::Test.new(name)
         | 
| 7 28 | 
             
              end
         | 
| 8 29 | 
             
              # rubocop:enable Naming/MethodName
         | 
| 9 30 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: fix
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.0.0. | 
| 4 | 
            +
              version: 1.0.0.beta5
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Cyril Kato
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2021-07-14 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: defi
         | 
| @@ -16,70 +16,84 @@ dependencies: | |
| 16 16 | 
             
                requirements:
         | 
| 17 17 | 
             
                - - "~>"
         | 
| 18 18 | 
             
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            -
                    version: 2.0. | 
| 19 | 
            +
                    version: 2.0.5
         | 
| 20 20 | 
             
              type: :runtime
         | 
| 21 21 | 
             
              prerelease: false
         | 
| 22 22 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 23 | 
             
                requirements:
         | 
| 24 24 | 
             
                - - "~>"
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            -
                    version: 2.0. | 
| 26 | 
            +
                    version: 2.0.5
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            +
              name: matchi
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - "~>"
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: 2.1.1
         | 
| 34 | 
            +
              type: :runtime
         | 
| 35 | 
            +
              prerelease: false
         | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - "~>"
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: 2.1.1
         | 
| 27 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 42 | 
             
              name: spectus
         | 
| 29 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 44 | 
             
                requirements:
         | 
| 31 45 | 
             
                - - "~>"
         | 
| 32 46 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version:  | 
| 47 | 
            +
                    version: 4.0.0
         | 
| 34 48 | 
             
              type: :runtime
         | 
| 35 49 | 
             
              prerelease: false
         | 
| 36 50 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 51 | 
             
                requirements:
         | 
| 38 52 | 
             
                - - "~>"
         | 
| 39 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            -
                    version:  | 
| 54 | 
            +
                    version: 4.0.0
         | 
| 41 55 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 56 | 
             
              name: bundler
         | 
| 43 57 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 58 | 
             
                requirements:
         | 
| 45 | 
            -
                - - " | 
| 59 | 
            +
                - - ">="
         | 
| 46 60 | 
             
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            -
                    version: ' | 
| 61 | 
            +
                    version: '0'
         | 
| 48 62 | 
             
              type: :development
         | 
| 49 63 | 
             
              prerelease: false
         | 
| 50 64 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 65 | 
             
                requirements:
         | 
| 52 | 
            -
                - - " | 
| 66 | 
            +
                - - ">="
         | 
| 53 67 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            -
                    version: ' | 
| 68 | 
            +
                    version: '0'
         | 
| 55 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 56 70 | 
             
              name: rake
         | 
| 57 71 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 72 | 
             
                requirements:
         | 
| 59 | 
            -
                - - " | 
| 73 | 
            +
                - - ">="
         | 
| 60 74 | 
             
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            -
                    version: ' | 
| 75 | 
            +
                    version: '0'
         | 
| 62 76 | 
             
              type: :development
         | 
| 63 77 | 
             
              prerelease: false
         | 
| 64 78 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 79 | 
             
                requirements:
         | 
| 66 | 
            -
                - - " | 
| 80 | 
            +
                - - ">="
         | 
| 67 81 | 
             
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            -
                    version: ' | 
| 82 | 
            +
                    version: '0'
         | 
| 69 83 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            -
              name: rubocop
         | 
| 84 | 
            +
              name: rubocop-md
         | 
| 71 85 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 86 | 
             
                requirements:
         | 
| 73 | 
            -
                - - " | 
| 87 | 
            +
                - - ">="
         | 
| 74 88 | 
             
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            -
                    version: '0 | 
| 89 | 
            +
                    version: '0'
         | 
| 76 90 | 
             
              type: :development
         | 
| 77 91 | 
             
              prerelease: false
         | 
| 78 92 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 93 | 
             
                requirements:
         | 
| 80 | 
            -
                - - " | 
| 94 | 
            +
                - - ">="
         | 
| 81 95 | 
             
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            -
                    version: '0 | 
| 96 | 
            +
                    version: '0'
         | 
| 83 97 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 84 98 | 
             
              name: rubocop-performance
         | 
| 85 99 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -94,34 +108,76 @@ dependencies: | |
| 94 108 | 
             
                - - ">="
         | 
| 95 109 | 
             
                  - !ruby/object:Gem::Version
         | 
| 96 110 | 
             
                    version: '0'
         | 
| 111 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 112 | 
            +
              name: rubocop-rake
         | 
| 113 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 114 | 
            +
                requirements:
         | 
| 115 | 
            +
                - - ">="
         | 
| 116 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 117 | 
            +
                    version: '0'
         | 
| 118 | 
            +
              type: :development
         | 
| 119 | 
            +
              prerelease: false
         | 
| 120 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 121 | 
            +
                requirements:
         | 
| 122 | 
            +
                - - ">="
         | 
| 123 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 124 | 
            +
                    version: '0'
         | 
| 125 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 126 | 
            +
              name: rubocop-rspec
         | 
| 127 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 128 | 
            +
                requirements:
         | 
| 129 | 
            +
                - - ">="
         | 
| 130 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 131 | 
            +
                    version: '0'
         | 
| 132 | 
            +
              type: :development
         | 
| 133 | 
            +
              prerelease: false
         | 
| 134 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 135 | 
            +
                requirements:
         | 
| 136 | 
            +
                - - ">="
         | 
| 137 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 138 | 
            +
                    version: '0'
         | 
| 139 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 140 | 
            +
              name: rubocop-thread_safety
         | 
| 141 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 142 | 
            +
                requirements:
         | 
| 143 | 
            +
                - - ">="
         | 
| 144 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 145 | 
            +
                    version: '0'
         | 
| 146 | 
            +
              type: :development
         | 
| 147 | 
            +
              prerelease: false
         | 
| 148 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 149 | 
            +
                requirements:
         | 
| 150 | 
            +
                - - ">="
         | 
| 151 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 152 | 
            +
                    version: '0'
         | 
| 97 153 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 98 154 | 
             
              name: simplecov
         | 
| 99 155 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 100 156 | 
             
                requirements:
         | 
| 101 | 
            -
                - - " | 
| 157 | 
            +
                - - ">="
         | 
| 102 158 | 
             
                  - !ruby/object:Gem::Version
         | 
| 103 | 
            -
                    version: '0 | 
| 159 | 
            +
                    version: '0'
         | 
| 104 160 | 
             
              type: :development
         | 
| 105 161 | 
             
              prerelease: false
         | 
| 106 162 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 107 163 | 
             
                requirements:
         | 
| 108 | 
            -
                - - " | 
| 164 | 
            +
                - - ">="
         | 
| 109 165 | 
             
                  - !ruby/object:Gem::Version
         | 
| 110 | 
            -
                    version: '0 | 
| 166 | 
            +
                    version: '0'
         | 
| 111 167 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 112 168 | 
             
              name: yard
         | 
| 113 169 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 114 170 | 
             
                requirements:
         | 
| 115 | 
            -
                - - " | 
| 171 | 
            +
                - - ">="
         | 
| 116 172 | 
             
                  - !ruby/object:Gem::Version
         | 
| 117 | 
            -
                    version: '0 | 
| 173 | 
            +
                    version: '0'
         | 
| 118 174 | 
             
              type: :development
         | 
| 119 175 | 
             
              prerelease: false
         | 
| 120 176 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 121 177 | 
             
                requirements:
         | 
| 122 | 
            -
                - - " | 
| 178 | 
            +
                - - ">="
         | 
| 123 179 | 
             
                  - !ruby/object:Gem::Version
         | 
| 124 | 
            -
                    version: '0 | 
| 180 | 
            +
                    version: '0'
         | 
| 125 181 | 
             
            description: Specing framework for Ruby.
         | 
| 126 182 | 
             
            email: contact@cyril.email
         | 
| 127 183 | 
             
            executables: []
         | 
| @@ -131,16 +187,19 @@ files: | |
| 131 187 | 
             
            - LICENSE.md
         | 
| 132 188 | 
             
            - README.md
         | 
| 133 189 | 
             
            - lib/fix.rb
         | 
| 134 | 
            -
            - lib/fix/ | 
| 135 | 
            -
            - lib/fix/ | 
| 136 | 
            -
            - lib/fix/ | 
| 137 | 
            -
            - lib/fix/ | 
| 190 | 
            +
            - lib/fix/console.rb
         | 
| 191 | 
            +
            - lib/fix/doc.rb
         | 
| 192 | 
            +
            - lib/fix/dsl.rb
         | 
| 193 | 
            +
            - lib/fix/test.rb
         | 
| 138 194 | 
             
            - lib/kernel.rb
         | 
| 139 195 | 
             
            homepage: https://fixrb.dev/
         | 
| 140 196 | 
             
            licenses:
         | 
| 141 197 | 
             
            - MIT
         | 
| 142 198 | 
             
            metadata:
         | 
| 199 | 
            +
              bug_tracker_uri: https://github.com/fixrb/fix/issues
         | 
| 200 | 
            +
              documentation_uri: https://rubydoc.info/gems/r_spec-clone
         | 
| 143 201 | 
             
              source_code_uri: https://github.com/fixrb/fix
         | 
| 202 | 
            +
              wiki_uri: https://github.com/fixrb/fix/wiki
         | 
| 144 203 | 
             
            post_install_message: 
         | 
| 145 204 | 
             
            rdoc_options: []
         | 
| 146 205 | 
             
            require_paths:
         | 
| @@ -149,14 +208,14 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 149 208 | 
             
              requirements:
         | 
| 150 209 | 
             
              - - ">="
         | 
| 151 210 | 
             
                - !ruby/object:Gem::Version
         | 
| 152 | 
            -
                  version: 2. | 
| 211 | 
            +
                  version: 2.7.0
         | 
| 153 212 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 154 213 | 
             
              requirements:
         | 
| 155 214 | 
             
              - - ">"
         | 
| 156 215 | 
             
                - !ruby/object:Gem::Version
         | 
| 157 216 | 
             
                  version: 1.3.1
         | 
| 158 217 | 
             
            requirements: []
         | 
| 159 | 
            -
            rubygems_version: 3.1. | 
| 218 | 
            +
            rubygems_version: 3.1.6
         | 
| 160 219 | 
             
            signing_key: 
         | 
| 161 220 | 
             
            specification_version: 4
         | 
| 162 221 | 
             
            summary: Specing framework for Ruby.
         | 
    
        data/lib/fix/context.rb
    DELETED
    
    | @@ -1,160 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'aw'
         | 
| 4 | 
            -
            require 'defi'
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            module Fix
         | 
| 7 | 
            -
              # Wraps the target of challenge.
         | 
| 8 | 
            -
              class Context
         | 
| 9 | 
            -
                RESERVED_KEYWORDS = %i[
         | 
| 10 | 
            -
                  alias
         | 
| 11 | 
            -
                  and
         | 
| 12 | 
            -
                  begin
         | 
| 13 | 
            -
                  break
         | 
| 14 | 
            -
                  case
         | 
| 15 | 
            -
                  catch
         | 
| 16 | 
            -
                  class
         | 
| 17 | 
            -
                  def
         | 
| 18 | 
            -
                  defined?
         | 
| 19 | 
            -
                  do
         | 
| 20 | 
            -
                  else
         | 
| 21 | 
            -
                  elsif
         | 
| 22 | 
            -
                  end
         | 
| 23 | 
            -
                  ensure
         | 
| 24 | 
            -
                  fail
         | 
| 25 | 
            -
                  false
         | 
| 26 | 
            -
                  for
         | 
| 27 | 
            -
                  if
         | 
| 28 | 
            -
                  in
         | 
| 29 | 
            -
                  module
         | 
| 30 | 
            -
                  next
         | 
| 31 | 
            -
                  nil
         | 
| 32 | 
            -
                  not
         | 
| 33 | 
            -
                  or
         | 
| 34 | 
            -
                  raise
         | 
| 35 | 
            -
                  redo
         | 
| 36 | 
            -
                  rescue
         | 
| 37 | 
            -
                  retry
         | 
| 38 | 
            -
                  return
         | 
| 39 | 
            -
                  self
         | 
| 40 | 
            -
                  super
         | 
| 41 | 
            -
                  then
         | 
| 42 | 
            -
                  throw
         | 
| 43 | 
            -
                  true
         | 
| 44 | 
            -
                  undef
         | 
| 45 | 
            -
                  unless
         | 
| 46 | 
            -
                  until
         | 
| 47 | 
            -
                  when
         | 
| 48 | 
            -
                  while
         | 
| 49 | 
            -
                  yield
         | 
| 50 | 
            -
                ].freeze
         | 
| 51 | 
            -
             | 
| 52 | 
            -
                attr_reader :callable
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                def initialize(subject, challenge, before_hooks_counter = 0, *hooks, **lets)
         | 
| 55 | 
            -
                  @subject      = subject
         | 
| 56 | 
            -
                  @callable     = challenge.to(subject)
         | 
| 57 | 
            -
                  @before_hooks = hooks[0, before_hooks_counter]
         | 
| 58 | 
            -
                  @after_hooks  = hooks[before_hooks_counter..-1]
         | 
| 59 | 
            -
                  @lets         = lets
         | 
| 60 | 
            -
                end
         | 
| 61 | 
            -
             | 
| 62 | 
            -
                def before(&block)
         | 
| 63 | 
            -
                  @before_hooks << block
         | 
| 64 | 
            -
                end
         | 
| 65 | 
            -
             | 
| 66 | 
            -
                def after(&block)
         | 
| 67 | 
            -
                  @after_hooks << block
         | 
| 68 | 
            -
                end
         | 
| 69 | 
            -
             | 
| 70 | 
            -
                def let(name, &block)
         | 
| 71 | 
            -
                  raise ::TypeError, "expected a Symbol, got #{name.class}" unless name.is_a?(::Symbol)
         | 
| 72 | 
            -
                  raise ::NameError, "wrong method name `#{name}'" unless name.match(/\A[a-z][a-z0-9_]+[?!]?\z/)
         | 
| 73 | 
            -
                  raise ::NameError, "reserved keyword name `#{name}'" if RESERVED_KEYWORDS.include?(name)
         | 
| 74 | 
            -
                  raise ::NameError, "reserved method name `#{name}'" if respond_to?(name, true) && !@lets.key?(name)
         | 
| 75 | 
            -
             | 
| 76 | 
            -
                  @lets.update(name => block.call)
         | 
| 77 | 
            -
                rescue ::SystemExit => e
         | 
| 78 | 
            -
                  raise SuspiciousSuccessError, "attempt `#{name}' to bypass the tests" if e.success?
         | 
| 79 | 
            -
                  raise e
         | 
| 80 | 
            -
                end
         | 
| 81 | 
            -
             | 
| 82 | 
            -
                def let!(name, &block)
         | 
| 83 | 
            -
                  raise ::TypeError, "expected a Symbol, got #{name.class}" unless name.is_a?(::Symbol)
         | 
| 84 | 
            -
                  raise ::NameError, "wrong method name `#{name}'" unless name.match(/\A[a-z][a-z0-9_]+[?!]?\z/)
         | 
| 85 | 
            -
                  raise ::NameError, "reserved keyword name `#{name}'" if RESERVED_KEYWORDS.include?(name)
         | 
| 86 | 
            -
                  raise ::NameError, "reserved method name `#{name}'" if respond_to?(name, true) && !@lets.key?(name)
         | 
| 87 | 
            -
             | 
| 88 | 
            -
                  @lets.update(name => ::Aw.fork! { block.call })
         | 
| 89 | 
            -
                rescue ::SystemExit => e
         | 
| 90 | 
            -
                  raise SuspiciousSuccessError, "attempt `#{name}' to bypass the tests" if e.success?
         | 
| 91 | 
            -
                  raise e
         | 
| 92 | 
            -
                end
         | 
| 93 | 
            -
             | 
| 94 | 
            -
                # Verify the expectation.
         | 
| 95 | 
            -
                #
         | 
| 96 | 
            -
                # @param block [Proc] A spec to compare against the computed actual value.
         | 
| 97 | 
            -
                #
         | 
| 98 | 
            -
                # @return [::Spectus::Result::Pass, ::Spectus::Result::Fail] Pass or fail.
         | 
| 99 | 
            -
                def it(_message = nil, &block)
         | 
| 100 | 
            -
                  print "#{block.source_location.join(':')}: "
         | 
| 101 | 
            -
                  i = It.new(callable, **@lets)
         | 
| 102 | 
            -
                  @before_hooks.each { |hook| i.instance_eval(&hook) }
         | 
| 103 | 
            -
                  result = i.instance_eval(&block)
         | 
| 104 | 
            -
                  puts result.colored_string
         | 
| 105 | 
            -
                rescue ::Spectus::Result::Fail => result
         | 
| 106 | 
            -
                  abort result.colored_string
         | 
| 107 | 
            -
                ensure
         | 
| 108 | 
            -
                  @after_hooks.each { |hook| i.instance_eval(&hook) }
         | 
| 109 | 
            -
                  raise ExpectationResultNotFoundError, result.class.inspect unless result.is_a?(::Spectus::Result::Common)
         | 
| 110 | 
            -
                end
         | 
| 111 | 
            -
             | 
| 112 | 
            -
                def its(name, *args, **options, &block)
         | 
| 113 | 
            -
                  if callable.raised?
         | 
| 114 | 
            -
                    actual    = callable
         | 
| 115 | 
            -
                    challenge = ::Defi.send(:call)
         | 
| 116 | 
            -
                  else
         | 
| 117 | 
            -
                    actual    = callable.object
         | 
| 118 | 
            -
                    challenge = ::Defi.send(name, *args, **options)
         | 
| 119 | 
            -
                  end
         | 
| 120 | 
            -
             | 
| 121 | 
            -
                  o = Context.new(actual, challenge, @before_hooks.length, *@before_hooks + @after_hooks, **@lets)
         | 
| 122 | 
            -
                  o.it(&block)
         | 
| 123 | 
            -
                end
         | 
| 124 | 
            -
             | 
| 125 | 
            -
                def on(name, *args, **options, &block)
         | 
| 126 | 
            -
                  if callable.raised?
         | 
| 127 | 
            -
                    actual    = callable
         | 
| 128 | 
            -
                    challenge = ::Defi.send(:call)
         | 
| 129 | 
            -
                  else
         | 
| 130 | 
            -
                    actual    = callable.object
         | 
| 131 | 
            -
                    challenge = ::Defi.send(name, *args, **options)
         | 
| 132 | 
            -
                  end
         | 
| 133 | 
            -
             | 
| 134 | 
            -
                  o = Context.new(actual, challenge, @before_hooks.length, *@before_hooks + @after_hooks, **@lets)
         | 
| 135 | 
            -
                  o.instance_eval(&block)
         | 
| 136 | 
            -
                end
         | 
| 137 | 
            -
             | 
| 138 | 
            -
                def with(_message = nil, **new_lets, &block)
         | 
| 139 | 
            -
                  actual    = callable.object
         | 
| 140 | 
            -
                  challenge = ::Defi.send(:itself)
         | 
| 141 | 
            -
             | 
| 142 | 
            -
                  c = Context.new(actual, challenge, @before_hooks.length, *@before_hooks + @after_hooks, **@lets.merge(new_lets))
         | 
| 143 | 
            -
                  c.instance_eval(&block)
         | 
| 144 | 
            -
                end
         | 
| 145 | 
            -
             | 
| 146 | 
            -
                private
         | 
| 147 | 
            -
             | 
| 148 | 
            -
                def method_missing(name, *args, &block)
         | 
| 149 | 
            -
                  @lets.fetch(name) { super }
         | 
| 150 | 
            -
                end
         | 
| 151 | 
            -
             | 
| 152 | 
            -
                def respond_to_missing?(name, include_private = false)
         | 
| 153 | 
            -
                  @lets.key?(name) || super
         | 
| 154 | 
            -
                end
         | 
| 155 | 
            -
              end
         | 
| 156 | 
            -
            end
         | 
| 157 | 
            -
             | 
| 158 | 
            -
            require_relative 'it'
         | 
| 159 | 
            -
            require_relative 'expectation_result_not_found_error'
         | 
| 160 | 
            -
            require_relative 'suspicious_success_error'
         | 
    
        data/lib/fix/it.rb
    DELETED
    
    | @@ -1,31 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'spectus/expectation_target'
         | 
| 4 | 
            -
            require 'matchi/helper'
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            module Fix
         | 
| 7 | 
            -
              # Wraps the target of an expectation.
         | 
| 8 | 
            -
              class It < ::Spectus::ExpectationTarget
         | 
| 9 | 
            -
                include ::Matchi::Helper
         | 
| 10 | 
            -
             | 
| 11 | 
            -
                # Create a new expection target
         | 
| 12 | 
            -
                #
         | 
| 13 | 
            -
                # @param callable [#call] The object to test.
         | 
| 14 | 
            -
                def initialize(callable, **lets)
         | 
| 15 | 
            -
                  raise unless callable.respond_to?(:call)
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                  @callable = callable
         | 
| 18 | 
            -
                  @lets     = lets
         | 
| 19 | 
            -
                end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                private
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                def method_missing(name, *args, &block)
         | 
| 24 | 
            -
                  @lets.fetch(name) { super }
         | 
| 25 | 
            -
                end
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                def respond_to_missing?(name, include_private = false)
         | 
| 28 | 
            -
                  @lets.key?(name) || super
         | 
| 29 | 
            -
                end
         | 
| 30 | 
            -
              end
         | 
| 31 | 
            -
            end
         |