contracts 0.16.1 → 0.17.1
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/.github/workflows/code_style_checks.yaml +2 -2
 - data/.github/workflows/tests.yaml +7 -13
 - data/.rubocop.yml +34 -8
 - data/.rubocop_todo.yml +7 -4
 - data/CHANGELOG.markdown +2 -0
 - data/Gemfile +8 -4
 - data/README.md +10 -2
 - data/Rakefile +2 -0
 - data/TUTORIAL.md +14 -14
 - data/contracts.gemspec +3 -4
 - data/features/builtin_contracts/keyword_args_with_optional_positional_args.feature +76 -0
 - data/features/builtin_contracts/none.feature +15 -9
 - data/features/support/env.rb +2 -0
 - data/lib/contracts/attrs.rb +2 -0
 - data/lib/contracts/builtin_contracts.rb +43 -10
 - data/lib/contracts/call_with.rb +52 -30
 - data/lib/contracts/core.rb +3 -1
 - data/lib/contracts/decorators.rb +5 -2
 - data/lib/contracts/engine/base.rb +4 -3
 - data/lib/contracts/engine/eigenclass.rb +3 -2
 - data/lib/contracts/engine/target.rb +2 -0
 - data/lib/contracts/engine.rb +2 -0
 - data/lib/contracts/errors.rb +3 -0
 - data/lib/contracts/formatters.rb +17 -10
 - data/lib/contracts/invariants.rb +8 -4
 - data/lib/contracts/method_handler.rb +19 -9
 - data/lib/contracts/method_reference.rb +4 -2
 - data/lib/contracts/support.rb +4 -2
 - data/lib/contracts/validators.rb +6 -2
 - data/lib/contracts/version.rb +3 -1
 - data/lib/contracts.rb +31 -39
 - data/spec/builtin_contracts_spec.rb +9 -13
 - data/spec/contracts_spec.rb +12 -9
 - data/spec/fixtures/fixtures.rb +11 -16
 - data/spec/override_validators_spec.rb +3 -3
 - data/spec/ruby_version_specific/contracts_spec_2.0.rb +2 -2
 - data/spec/validators_spec.rb +1 -1
 - metadata +11 -9
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 8a151d83a8b03910e5dd1171c384e0ea8a01ff9437d81140f995358d888ac0fa
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: b92d01b9dd8702b866e004c41834781885d8178b1ceacb1e5166982243a13a49
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 94df8b86d22522b7c573f9cd7b3ee425568b024d7d3a88701759a2b47cdce691bd9ce7ec45710e7e8dafb993c7aa1cb93d6d9a0110d3c4effeece4b24fda29a9
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: dbbddaf090e48b52cde302f6a6b5b89fc84045e9c392ef1d34ddcfb2e149f65c3da825b8140ebd4b3d36672ed933b841e1c59b9e684098bb3144762bcd7b4b50
         
     | 
| 
         @@ -22,22 +22,16 @@ jobs: 
     | 
|
| 
       22 
22 
     | 
    
         
             
                    os:
         
     | 
| 
       23 
23 
     | 
    
         
             
                      - ubuntu
         
     | 
| 
       24 
24 
     | 
    
         
             
                    ruby:
         
     | 
| 
       25 
     | 
    
         
            -
                      - " 
     | 
| 
       26 
     | 
    
         
            -
                      - " 
     | 
| 
       27 
     | 
    
         
            -
                      - " 
     | 
| 
       28 
     | 
    
         
            -
                      - " 
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
                      - " 
     | 
| 
       31 
     | 
    
         
            -
                      - "2.7"
         
     | 
| 
       32 
     | 
    
         
            -
                    test_command: ["bundle exec rspec && bundle exec cucumber"]
         
     | 
| 
       33 
     | 
    
         
            -
                    include:
         
     | 
| 
       34 
     | 
    
         
            -
                      - os: ubuntu
         
     | 
| 
       35 
     | 
    
         
            -
                        ruby: "2.4.2"
         
     | 
| 
       36 
     | 
    
         
            -
                        test_command: "bundle exec rspec"
         
     | 
| 
      
 25 
     | 
    
         
            +
                      - "3.3"
         
     | 
| 
      
 26 
     | 
    
         
            +
                      - "3.2"
         
     | 
| 
      
 27 
     | 
    
         
            +
                      - "3.1"
         
     | 
| 
      
 28 
     | 
    
         
            +
                      - "3.0"
         
     | 
| 
      
 29 
     | 
    
         
            +
                    test_command:
         
     | 
| 
      
 30 
     | 
    
         
            +
                      - "bundle exec rspec && bundle exec cucumber"
         
     | 
| 
       37 
31 
     | 
    
         
             
                runs-on: ${{ matrix.os }}-latest
         
     | 
| 
       38 
32 
     | 
    
         
             
                steps:
         
     | 
| 
       39 
33 
     | 
    
         
             
                  - name: Checkout
         
     | 
| 
       40 
     | 
    
         
            -
                    uses: actions/checkout@ 
     | 
| 
      
 34 
     | 
    
         
            +
                    uses: actions/checkout@v4
         
     | 
| 
       41 
35 
     | 
    
         
             
                  - name: Setup Ruby
         
     | 
| 
       42 
36 
     | 
    
         
             
                    uses: ruby/setup-ruby@v1
         
     | 
| 
       43 
37 
     | 
    
         
             
                    with:
         
     | 
    
        data/.rubocop.yml
    CHANGED
    
    | 
         @@ -1,12 +1,17 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            inherit_from: .rubocop_todo.yml
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            AllCops:
         
     | 
| 
       4 
     | 
    
         
            -
              TargetRubyVersion:  
     | 
| 
      
 4 
     | 
    
         
            +
              TargetRubyVersion: 3.0
         
     | 
| 
       5 
5 
     | 
    
         
             
              DisplayCopNames: true
         
     | 
| 
      
 6 
     | 
    
         
            +
              NewCops: disable
         
     | 
| 
       6 
7 
     | 
    
         
             
              Exclude:
         
     | 
| 
      
 8 
     | 
    
         
            +
                - "benchmarks/**/*"
         
     | 
| 
       7 
9 
     | 
    
         
             
                - "tmp/**/*"
         
     | 
| 
       8 
10 
     | 
    
         
             
                - "vendor/**/*"
         
     | 
| 
      
 11 
     | 
    
         
            +
                - "script/**/*.rb"
         
     | 
| 
      
 12 
     | 
    
         
            +
                - "spec/fixtures/*.rb"
         
     | 
| 
       9 
13 
     | 
    
         
             
                - "spec/ruby_version_specific/*.rb"
         
     | 
| 
      
 14 
     | 
    
         
            +
                - "spec/*.rb"
         
     | 
| 
       10 
15 
     | 
    
         | 
| 
       11 
16 
     | 
    
         
             
            # forces method defs to have params in parens
         
     | 
| 
       12 
17 
     | 
    
         
             
            Style/MethodDefParentheses:
         
     | 
| 
         @@ -38,7 +43,7 @@ Lint/UnusedMethodArgument: 
     | 
|
| 
       38 
43 
     | 
    
         
             
              Enabled: false
         
     | 
| 
       39 
44 
     | 
    
         | 
| 
       40 
45 
     | 
    
         
             
            # changes x ** 2 to x**2
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
      
 46 
     | 
    
         
            +
            Layout/SpaceAroundOperators:
         
     | 
| 
       42 
47 
     | 
    
         
             
              Enabled: false
         
     | 
| 
       43 
48 
     | 
    
         | 
| 
       44 
49 
     | 
    
         
             
            # doesn't allow vars starting with _
         
     | 
| 
         @@ -56,10 +61,10 @@ Style/Documentation: 
     | 
|
| 
       56 
61 
     | 
    
         | 
| 
       57 
62 
     | 
    
         
             
            # enforces line length of 80
         
     | 
| 
       58 
63 
     | 
    
         
             
            # TODO enable
         
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
      
 64 
     | 
    
         
            +
            Layout/LineLength:
         
     | 
| 
       60 
65 
     | 
    
         
             
              Enabled: false
         
     | 
| 
       61 
66 
     | 
    
         | 
| 
       62 
     | 
    
         
            -
            # triggered by Contract ({ :name => String, :age =>  
     | 
| 
      
 67 
     | 
    
         
            +
            # triggered by Contract ({ :name => String, :age => Integer }) => nil
         
     | 
| 
       63 
68 
     | 
    
         
             
            Lint/ParenthesesAsGroupedExpression:
         
     | 
| 
       64 
69 
     | 
    
         
             
              Enabled: false
         
     | 
| 
       65 
70 
     | 
    
         | 
| 
         @@ -101,7 +106,7 @@ Lint/DuplicateMethods: 
     | 
|
| 
       101 
106 
     | 
    
         
             
            Style/TrivialAccessors:
         
     | 
| 
       102 
107 
     | 
    
         
             
              Enabled: false
         
     | 
| 
       103 
108 
     | 
    
         | 
| 
       104 
     | 
    
         
            -
             
     | 
| 
      
 109 
     | 
    
         
            +
            Layout/MultilineOperationIndentation:
         
     | 
| 
       105 
110 
     | 
    
         
             
              EnforcedStyle: indented
         
     | 
| 
       106 
111 
     | 
    
         | 
| 
       107 
112 
     | 
    
         
             
            # Asks you to use %w{array of words} if possible.
         
     | 
| 
         @@ -111,12 +116,12 @@ Style/WordArray: 
     | 
|
| 
       111 
116 
     | 
    
         | 
| 
       112 
117 
     | 
    
         
             
            # conflicts with contracts
         
     | 
| 
       113 
118 
     | 
    
         
             
            # we define contracts like `Baz = 1`
         
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
      
 119 
     | 
    
         
            +
            Naming/ConstantName:
         
     | 
| 
       115 
120 
     | 
    
         
             
              Enabled: false
         
     | 
| 
       116 
121 
     | 
    
         | 
| 
       117 
122 
     | 
    
         
             
            # `Contract` violates this, otherwise a good cop (enforces snake_case method names)
         
     | 
| 
       118 
123 
     | 
    
         
             
            # TODO possible to get this enabled but ignore `Contract`?
         
     | 
| 
       119 
     | 
    
         
            -
             
     | 
| 
      
 124 
     | 
    
         
            +
            Naming/MethodName:
         
     | 
| 
       120 
125 
     | 
    
         
             
              Enabled: false
         
     | 
| 
       121 
126 
     | 
    
         | 
| 
       122 
127 
     | 
    
         
             
            # checks for !!
         
     | 
| 
         @@ -129,9 +134,30 @@ Metrics/ParameterLists: 
     | 
|
| 
       129 
134 
     | 
    
         
             
              Enabled: false
         
     | 
| 
       130 
135 
     | 
    
         | 
| 
       131 
136 
     | 
    
         
             
            # Checks that braces used for hash literals have or don't have surrounding space depending on configuration.
         
     | 
| 
       132 
     | 
    
         
            -
             
     | 
| 
      
 137 
     | 
    
         
            +
            Layout/SpaceInsideHashLiteralBraces:
         
     | 
| 
       133 
138 
     | 
    
         
             
              Enabled: false
         
     | 
| 
       134 
139 
     | 
    
         | 
| 
       135 
140 
     | 
    
         
             
            # TODO enable
         
     | 
| 
       136 
141 
     | 
    
         
             
            Style/SpecialGlobalVars:
         
     | 
| 
       137 
142 
     | 
    
         
             
              Enabled: false
         
     | 
| 
      
 143 
     | 
    
         
            +
             
     | 
| 
      
 144 
     | 
    
         
            +
            Style/IfUnlessModifier:
         
     | 
| 
      
 145 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
            Naming/MemoizedInstanceVariableName:
         
     | 
| 
      
 148 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 149 
     | 
    
         
            +
             
     | 
| 
      
 150 
     | 
    
         
            +
            Layout/FirstHashElementIndentation:
         
     | 
| 
      
 151 
     | 
    
         
            +
              EnforcedStyle: consistent
         
     | 
| 
      
 152 
     | 
    
         
            +
             
     | 
| 
      
 153 
     | 
    
         
            +
            Layout/HashAlignment:
         
     | 
| 
      
 154 
     | 
    
         
            +
              EnforcedColonStyle: table
         
     | 
| 
      
 155 
     | 
    
         
            +
             
     | 
| 
      
 156 
     | 
    
         
            +
            Style/TrailingCommaInHashLiteral:
         
     | 
| 
      
 157 
     | 
    
         
            +
              EnforcedStyleForMultiline: consistent_comma
         
     | 
| 
      
 158 
     | 
    
         
            +
             
     | 
| 
      
 159 
     | 
    
         
            +
            Style/TrailingCommaInArrayLiteral:
         
     | 
| 
      
 160 
     | 
    
         
            +
              EnforcedStyleForMultiline: consistent_comma
         
     | 
| 
      
 161 
     | 
    
         
            +
             
     | 
| 
      
 162 
     | 
    
         
            +
            Style/TrailingCommaInArguments:
         
     | 
| 
      
 163 
     | 
    
         
            +
              EnforcedStyleForMultiline: consistent_comma
         
     | 
    
        data/.rubocop_todo.yml
    CHANGED
    
    | 
         @@ -6,6 +6,9 @@ 
     | 
|
| 
       6 
6 
     | 
    
         
             
            # Note that changes in the inspected code, or installation of new
         
     | 
| 
       7 
7 
     | 
    
         
             
            # versions of RuboCop, may require this file to be generated again.
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
      
 9 
     | 
    
         
            +
            require:
         
     | 
| 
      
 10 
     | 
    
         
            +
              - rubocop-performance
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
       9 
12 
     | 
    
         
             
            # Offense count: 2
         
     | 
| 
       10 
13 
     | 
    
         
             
            Lint/NonLocalExitFromIterator:
         
     | 
| 
       11 
14 
     | 
    
         
             
              Exclude:
         
     | 
| 
         @@ -32,14 +35,14 @@ Style/Alias: 
     | 
|
| 
       32 
35 
     | 
    
         
             
            # Offense count: 1
         
     | 
| 
       33 
36 
     | 
    
         
             
            # Cop supports --auto-correct.
         
     | 
| 
       34 
37 
     | 
    
         
             
            # Configuration parameters: AllowAdjacentOneLineDefs.
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
      
 38 
     | 
    
         
            +
            Layout/EmptyLineBetweenDefs:
         
     | 
| 
       36 
39 
     | 
    
         
             
              Exclude:
         
     | 
| 
       37 
40 
     | 
    
         
             
                - 'benchmarks/wrap_test.rb'
         
     | 
| 
       38 
41 
     | 
    
         | 
| 
       39 
42 
     | 
    
         
             
            # Offense count: 1
         
     | 
| 
       40 
43 
     | 
    
         
             
            # Cop supports --auto-correct.
         
     | 
| 
       41 
44 
     | 
    
         
             
            # Configuration parameters: AllowForAlignment, ForceEqualSignAlignment.
         
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
      
 45 
     | 
    
         
            +
            Layout/ExtraSpacing:
         
     | 
| 
       43 
46 
     | 
    
         
             
              Exclude:
         
     | 
| 
       44 
47 
     | 
    
         
             
                - 'spec/builtin_contracts_spec.rb'
         
     | 
| 
       45 
48 
     | 
    
         | 
| 
         @@ -58,7 +61,7 @@ Style/IfInsideElse: 
     | 
|
| 
       58 
61 
     | 
    
         
             
            # Cop supports --auto-correct.
         
     | 
| 
       59 
62 
     | 
    
         
             
            # Configuration parameters: EnforcedStyle, SupportedStyles.
         
     | 
| 
       60 
63 
     | 
    
         
             
            # SupportedStyles: symmetrical, new_line, same_line
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
      
 64 
     | 
    
         
            +
            Layout/MultilineHashBraceLayout:
         
     | 
| 
       62 
65 
     | 
    
         
             
              Exclude:
         
     | 
| 
       63 
66 
     | 
    
         
             
                - 'spec/contracts_spec.rb'
         
     | 
| 
       64 
67 
     | 
    
         
             
                - 'spec/fixtures/fixtures.rb'
         
     | 
| 
         @@ -130,6 +133,6 @@ Style/TrailingUnderscoreVariable: 
     | 
|
| 
       130 
133 
     | 
    
         | 
| 
       131 
134 
     | 
    
         
             
            # Offense count: 1
         
     | 
| 
       132 
135 
     | 
    
         
             
            # Cop supports --auto-correct.
         
     | 
| 
       133 
     | 
    
         
            -
            Style/ 
     | 
| 
      
 136 
     | 
    
         
            +
            Style/RedundantInterpolation:
         
     | 
| 
       134 
137 
     | 
    
         
             
              Exclude:
         
     | 
| 
       135 
138 
     | 
    
         
             
                - 'lib/contracts/formatters.rb'
         
     | 
    
        data/CHANGELOG.markdown
    CHANGED
    
    | 
         @@ -1,6 +1,8 @@ 
     | 
|
| 
       1 
1 
     | 
    
         | 
| 
       2 
2 
     | 
    
         
             
            ## [v0.16.1] - 2021-04-17
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
      
 4 
     | 
    
         
            +
            [v0.16.1]: https://github.com/egonSchiele/contracts.ruby/compare/v0.16.0...v0.16.1
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
       4 
6 
     | 
    
         
             
            - Enhancement: Pretty-print contracts in error messages - [Corey Farwell](https://github.com/frewsxcv) [#289](https://github.com/egonSchiele/contracts.ruby/pull/289)
         
     | 
| 
       5 
7 
     | 
    
         
             
            - Bugfix: Fix `attr_accessor_with_contract` with multiple attribute names input - [Kevin Yeh](https://github.com/kyeah) [#259](https://github.com/egonSchiele/contracts.ruby/pull/259)
         
     | 
| 
       6 
8 
     | 
    
         
             
            - Bugfix: Fix "stack level too deep" in CI builds - [md-work](https://github.com/md-work) [#283](https://github.com/egonSchiele/contracts.ruby/pull/283)
         
     | 
    
        data/Gemfile
    CHANGED
    
    | 
         @@ -1,17 +1,21 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            source "https://rubygems.org"
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
5 
     | 
    
         
             
            gemspec
         
     | 
| 
       4 
6 
     | 
    
         | 
| 
       5 
7 
     | 
    
         
             
            group :test do
         
     | 
| 
       6 
     | 
    
         
            -
              gem "rspec"
         
     | 
| 
       7 
8 
     | 
    
         
             
              gem "aruba"
         
     | 
| 
       8 
9 
     | 
    
         
             
              gem "cucumber", "~> 1.3.20"
         
     | 
| 
       9 
     | 
    
         
            -
              gem " 
     | 
| 
      
 10 
     | 
    
         
            +
              gem "rspec"
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              gem "rubocop", ">= 1.0.0"
         
     | 
| 
      
 13 
     | 
    
         
            +
              gem "rubocop-performance", ">= 1.0.0"
         
     | 
| 
       10 
14 
     | 
    
         
             
            end
         
     | 
| 
       11 
15 
     | 
    
         | 
| 
       12 
16 
     | 
    
         
             
            group :development do
         
     | 
| 
       13 
     | 
    
         
            -
              gem "relish"
         
     | 
| 
       14 
17 
     | 
    
         
             
              gem "method_profiler"
         
     | 
| 
       15 
     | 
    
         
            -
              gem "ruby-prof"
         
     | 
| 
       16 
18 
     | 
    
         
             
              gem "rake"
         
     | 
| 
      
 19 
     | 
    
         
            +
              gem "relish"
         
     | 
| 
      
 20 
     | 
    
         
            +
              gem "ruby-prof"
         
     | 
| 
       17 
21 
     | 
    
         
             
            end
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -1,11 +1,19 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            This project is looking for a new maintainer! [More details here](https://github.com/egonSchiele/contracts.ruby/issues/249)
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            # contracts.ruby [](https://github.com/egonSchiele/contracts.ruby/actions/workflows/tests.yaml) [](https://gitter.im/egonSchiele/contracts.ruby)
         
     | 
| 
       4 
6 
     | 
    
         | 
| 
       5 
7 
     | 
    
         
             
            Contracts let you clearly – even beautifully – express how your code behaves, and free you from writing tons of boilerplate, defensive code.
         
     | 
| 
       6 
8 
     | 
    
         | 
| 
       7 
9 
     | 
    
         
             
            You can think of contracts as `assert` on steroids.
         
     | 
| 
       8 
10 
     | 
    
         | 
| 
      
 11 
     | 
    
         
            +
            ## 0.17.x = Ruby 3.x only
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            0.17.x only supports Ruby 3.x  
         
     | 
| 
      
 14 
     | 
    
         
            +
            Looking for Ruby 2.x support?  
         
     | 
| 
      
 15 
     | 
    
         
            +
            Use 0.16.x  
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
       9 
17 
     | 
    
         
             
            ## Installation
         
     | 
| 
       10 
18 
     | 
    
         | 
| 
       11 
19 
     | 
    
         
             
                gem install contracts
         
     | 
| 
         @@ -83,7 +91,7 @@ Using contracts.ruby results in very little slowdown. Check out [this blog post] 
     | 
|
| 
       83 
91 
     | 
    
         | 
| 
       84 
92 
     | 
    
         
             
            **Q.** What Rubies can I use this with?
         
     | 
| 
       85 
93 
     | 
    
         | 
| 
       86 
     | 
    
         
            -
            **A.** It's been tested with ` 
     | 
| 
      
 94 
     | 
    
         
            +
            **A.** It's been tested with `3.0` and `3.1`. (In case this list becomes outdated see [`.github/workflows/tests.yaml`](/.github/workflows/tests.yaml))
         
     | 
| 
       87 
95 
     | 
    
         | 
| 
       88 
96 
     | 
    
         
             
            If you're using the library, please [let me know](https://github.com/egonSchiele) what project you're using it on :)
         
     | 
| 
       89 
97 
     | 
    
         | 
    
        data/Rakefile
    CHANGED
    
    
    
        data/TUTORIAL.md
    CHANGED
    
    | 
         @@ -80,8 +80,8 @@ contracts.ruby comes with a lot of built-in contracts, including the following: 
     | 
|
| 
       80 
80 
     | 
    
         | 
| 
       81 
81 
     | 
    
         
             
            * Logical combinations
         
     | 
| 
       82 
82 
     | 
    
         
             
              * [`Maybe`](http://www.rubydoc.info/gems/contracts/Contracts/Builtin/Maybe) – specifies that a value _may be_ nil, e.g. `Maybe[String]` (equivalent to `Or[String,nil]`)
         
     | 
| 
       83 
     | 
    
         
            -
              * [`Or`](http://www.rubydoc.info/gems/contracts/Contracts/Builtin/Or) – passes if any of the given contracts pass, e.g. `Or[ 
     | 
| 
       84 
     | 
    
         
            -
              * [`Xor`](http://www.rubydoc.info/gems/contracts/Contracts/Builtin/Xor) – passes if exactly one of the given contracts pass, e.g. `Xor[ 
     | 
| 
      
 83 
     | 
    
         
            +
              * [`Or`](http://www.rubydoc.info/gems/contracts/Contracts/Builtin/Or) – passes if any of the given contracts pass, e.g. `Or[Integer, Float]`
         
     | 
| 
      
 84 
     | 
    
         
            +
              * [`Xor`](http://www.rubydoc.info/gems/contracts/Contracts/Builtin/Xor) – passes if exactly one of the given contracts pass, e.g. `Xor[Integer, Float]`
         
     | 
| 
       85 
85 
     | 
    
         
             
              * [`And`](http://www.rubydoc.info/gems/contracts/Contracts/Builtin/And) – passes if all contracts pass, e.g. `And[Nat, -> (n) { n.even? }]`
         
     | 
| 
       86 
86 
     | 
    
         
             
              * [`Not`](http://www.rubydoc.info/gems/contracts/Contracts/Builtin/Not) – passes if all contracts fail for the given argument, e.g. `Not[nil]`
         
     | 
| 
       87 
87 
     | 
    
         | 
| 
         @@ -89,7 +89,7 @@ contracts.ruby comes with a lot of built-in contracts, including the following: 
     | 
|
| 
       89 
89 
     | 
    
         
             
              * [`ArrayOf`](http://www.rubydoc.info/gems/contracts/Contracts/Builtin/ArrayOf) – checks that the argument is an array, and all elements pass the given contract, e.g. `ArrayOf[Num]`
         
     | 
| 
       90 
90 
     | 
    
         
             
              * [`SetOf`](http://www.rubydoc.info/gems/contracts/Contracts/Builtin/SetOf) – checks that the argument is a set, and all elements pass the given contract, e.g. `SetOf[Num]`
         
     | 
| 
       91 
91 
     | 
    
         
             
              * [`HashOf`](http://www.rubydoc.info/gems/contracts/Contracts/Builtin/HashOf) – checks that the argument is a hash, and all keys and values pass the given contract, e.g. `HashOf[Symbol => String]` or `HashOf[Symbol,String]`
         
     | 
| 
       92 
     | 
    
         
            -
              * [`StrictHash`](http://www.rubydoc.info/gems/contracts/Contracts/Builtin/StrictHash) – checks that the argument is a hash, and every key passed is present in the given contract, e.g. `StrictHash[{ :description => String, :number =>  
     | 
| 
      
 92 
     | 
    
         
            +
              * [`StrictHash`](http://www.rubydoc.info/gems/contracts/Contracts/Builtin/StrictHash) – checks that the argument is a hash, and every key passed is present in the given contract, e.g. `StrictHash[{ :description => String, :number => Integer }]`
         
     | 
| 
       93 
93 
     | 
    
         
             
              * [`RangeOf`](http://www.rubydoc.info/gems/contracts/Contracts/Builtin/RangeOf) – checks that the argument is a range whose elements (#first and #last) pass the given contract, e.g. `RangeOf[Date]`
         
     | 
| 
       94 
94 
     | 
    
         
             
              * [`Enum`](http://www.rubydoc.info/gems/contracts/Contracts/Builtin/Enum) – checks that the argument is part of a given collection of objects, e.g. `Enum[:a, :b, :c]`
         
     | 
| 
       95 
95 
     | 
    
         | 
| 
         @@ -152,7 +152,7 @@ end 
     | 
|
| 
       152 
152 
     | 
    
         | 
| 
       153 
153 
     | 
    
         
             
            You always need to specify a contract for the return value. In this example, `hello` doesn't return anything, so the contract is `nil`. Now you know that you can use a constant like `nil` as the end of a contract. Valid values for a contract are:
         
     | 
| 
       154 
154 
     | 
    
         | 
| 
       155 
     | 
    
         
            -
            - the name of a class (like `String` or ` 
     | 
| 
      
 155 
     | 
    
         
            +
            - the name of a class (like `String` or `Integer`)
         
     | 
| 
       156 
156 
     | 
    
         
             
            - a constant (like `nil` or `1`)
         
     | 
| 
       157 
157 
     | 
    
         
             
            - a `Proc` that takes a value and returns true or false to indicate whether the contract passed or not
         
     | 
| 
       158 
158 
     | 
    
         
             
            - a class that responds to the `valid?` class method (more on this later)
         
     | 
| 
         @@ -161,32 +161,32 @@ You always need to specify a contract for the return value. In this example, `he 
     | 
|
| 
       161 
161 
     | 
    
         
             
            ### A Double Function
         
     | 
| 
       162 
162 
     | 
    
         | 
| 
       163 
163 
     | 
    
         
             
            ```ruby
         
     | 
| 
       164 
     | 
    
         
            -
            Contract C::Or[ 
     | 
| 
      
 164 
     | 
    
         
            +
            Contract C::Or[Integer, Float] => C::Or[Integer, Float]
         
     | 
| 
       165 
165 
     | 
    
         
             
            def double(x)
         
     | 
| 
       166 
166 
     | 
    
         
             
              2 * x
         
     | 
| 
       167 
167 
     | 
    
         
             
            end
         
     | 
| 
       168 
168 
     | 
    
         
             
            ```
         
     | 
| 
       169 
169 
     | 
    
         | 
| 
       170 
170 
     | 
    
         
             
            Sometimes you want to be able to choose between a few contracts. `Or` takes a variable number of contracts and checks the argument against all of them. If it passes for any of the contracts, then the `Or` contract passes.
         
     | 
| 
       171 
     | 
    
         
            -
            This introduces some new syntax. One of the valid values for a contract is an instance of a class that responds to the `valid?` method. This is what `Or[ 
     | 
| 
      
 171 
     | 
    
         
            +
            This introduces some new syntax. One of the valid values for a contract is an instance of a class that responds to the `valid?` method. This is what `Or[Integer, Float]` is. The longer way to write it would have been:
         
     | 
| 
       172 
172 
     | 
    
         | 
| 
       173 
173 
     | 
    
         
             
            ```ruby
         
     | 
| 
       174 
     | 
    
         
            -
            Contract C::Or.new( 
     | 
| 
      
 174 
     | 
    
         
            +
            Contract C::Or.new(Integer, Float) => C::Or.new(Integer, Float)
         
     | 
| 
       175 
175 
     | 
    
         
             
            ```
         
     | 
| 
       176 
176 
     | 
    
         | 
| 
       177 
177 
     | 
    
         
             
            All the built-in contracts have overridden the square brackets (`[]`) to give the same functionality. So you could write
         
     | 
| 
       178 
178 
     | 
    
         | 
| 
       179 
179 
     | 
    
         
             
            ```ruby
         
     | 
| 
       180 
     | 
    
         
            -
            Contract C::Or[ 
     | 
| 
      
 180 
     | 
    
         
            +
            Contract C::Or[Integer, Float] => C::Or[Integer, Float]
         
     | 
| 
       181 
181 
     | 
    
         
             
            ```
         
     | 
| 
       182 
182 
     | 
    
         | 
| 
       183 
183 
     | 
    
         
             
            or
         
     | 
| 
       184 
184 
     | 
    
         | 
| 
       185 
185 
     | 
    
         
             
            ```ruby
         
     | 
| 
       186 
     | 
    
         
            -
            Contract C::Or.new( 
     | 
| 
      
 186 
     | 
    
         
            +
            Contract C::Or.new(Integer, Float) => C::Or.new(Integer, Float)
         
     | 
| 
       187 
187 
     | 
    
         
             
            ```
         
     | 
| 
       188 
188 
     | 
    
         | 
| 
       189 
     | 
    
         
            -
            whichever you prefer. They both mean the same thing here: make a new instance of `Or` with ` 
     | 
| 
      
 189 
     | 
    
         
            +
            whichever you prefer. They both mean the same thing here: make a new instance of `Or` with `Integer` and `Float`. Use that instance to validate the argument.
         
     | 
| 
       190 
190 
     | 
    
         | 
| 
       191 
191 
     | 
    
         
             
            ### A Product Function
         
     | 
| 
       192 
192 
     | 
    
         | 
| 
         @@ -455,7 +455,7 @@ Now you can use `Person` wherever you would have used `Or[Hash, nil]`. Your code 
     | 
|
| 
       455 
455 
     | 
    
         | 
| 
       456 
456 
     | 
    
         
             
            Contracts are very easy to define. To re-iterate, there are 5 kinds of contracts:
         
     | 
| 
       457 
457 
     | 
    
         | 
| 
       458 
     | 
    
         
            -
            - the name of a class (like `String` or ` 
     | 
| 
      
 458 
     | 
    
         
            +
            - the name of a class (like `String` or `Integer`)
         
     | 
| 
       459 
459 
     | 
    
         
             
            - a constant (like `nil` or `1`)
         
     | 
| 
       460 
460 
     | 
    
         
             
            - a `Proc` that takes a value and returns true or false to indicate whether the contract passed or not
         
     | 
| 
       461 
461 
     | 
    
         
             
            - a class that responds to the `valid?` class method (more on this later)
         
     | 
| 
         @@ -511,7 +511,7 @@ The `Or` contract takes a sequence of contracts, and passes if any of them pass. 
     | 
|
| 
       511 
511 
     | 
    
         
             
            This class inherits from `CallableClass`, which allows us to use `[]` when using the class:
         
     | 
| 
       512 
512 
     | 
    
         | 
| 
       513 
513 
     | 
    
         
             
            ```ruby
         
     | 
| 
       514 
     | 
    
         
            -
            Contract C::Or[ 
     | 
| 
      
 514 
     | 
    
         
            +
            Contract C::Or[Integer, Float] => C::Num
         
     | 
| 
       515 
515 
     | 
    
         
             
            def double(x)
         
     | 
| 
       516 
516 
     | 
    
         
             
              2 * x
         
     | 
| 
       517 
517 
     | 
    
         
             
            end
         
     | 
| 
         @@ -520,7 +520,7 @@ end 
     | 
|
| 
       520 
520 
     | 
    
         
             
            Without `CallableClass`, we would have to use `.new` instead:
         
     | 
| 
       521 
521 
     | 
    
         | 
| 
       522 
522 
     | 
    
         
             
            ```ruby
         
     | 
| 
       523 
     | 
    
         
            -
            Contract C::Or.new( 
     | 
| 
      
 523 
     | 
    
         
            +
            Contract C::Or.new(Integer, Float) => C::Num
         
     | 
| 
       524 
524 
     | 
    
         
             
            def double(x)
         
     | 
| 
       525 
525 
     | 
    
         
             
            # etc
         
     | 
| 
       526 
526 
     | 
    
         
             
            ```
         
     | 
| 
         @@ -723,7 +723,7 @@ class MyBirthday < Struct.new(:day, :month) 
     | 
|
| 
       723 
723 
     | 
    
         
             
              invariant(:day) { 1 <= day && day <= 31 }
         
     | 
| 
       724 
724 
     | 
    
         
             
              invariant(:month) { 1 <= month && month <= 12 }
         
     | 
| 
       725 
725 
     | 
    
         | 
| 
       726 
     | 
    
         
            -
              Contract C::None =>  
     | 
| 
      
 726 
     | 
    
         
            +
              Contract C::None => Integer
         
     | 
| 
       727 
727 
     | 
    
         
             
              def silly_next_day!
         
     | 
| 
       728 
728 
     | 
    
         
             
                self.day += 1
         
     | 
| 
       729 
729 
     | 
    
         
             
              end
         
     | 
    
        data/contracts.gemspec
    CHANGED
    
    | 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            require File.expand_path(File.join(__FILE__, "../lib/contracts/version"))
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
5 
     | 
    
         
             
            Gem::Specification.new do |s|
         
     | 
| 
         @@ -10,8 +12,5 @@ Gem::Specification.new do |s| 
     | 
|
| 
       10 
12 
     | 
    
         
             
              s.files       = `git ls-files`.split("\n")
         
     | 
| 
       11 
13 
     | 
    
         
             
              s.homepage    = "https://github.com/egonSchiele/contracts.ruby"
         
     | 
| 
       12 
14 
     | 
    
         
             
              s.license     = "BSD-2-Clause"
         
     | 
| 
       13 
     | 
    
         
            -
              s. 
     | 
| 
       14 
     | 
    
         
            -
                0.16.x will be the supporting Ruby 2.x and be feature frozen (only fixes will be released)
         
     | 
| 
       15 
     | 
    
         
            -
                For Ruby 3.x use 0.17.x or later (might not be released yet)
         
     | 
| 
       16 
     | 
    
         
            -
              "
         
     | 
| 
      
 15 
     | 
    
         
            +
              s.required_ruby_version = [">= 3.0", "< 4"]
         
     | 
| 
       17 
16 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,76 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            Feature: KeywordArgs when used with optional positional arguments
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              Checks that the argument is an options hash, and all required keyword arguments are present, and all values pass their respective contracts
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              ```ruby
         
     | 
| 
      
 6 
     | 
    
         
            +
              Contract Any, KeywordArgs[:number => Num, :description => Optional[String]] => Any
         
     | 
| 
      
 7 
     | 
    
         
            +
              ```
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              Background:
         
     | 
| 
      
 10 
     | 
    
         
            +
                Given a file named "keyword_args_with_optional_positional_args_usage.rb" with:
         
     | 
| 
      
 11 
     | 
    
         
            +
                """ruby
         
     | 
| 
      
 12 
     | 
    
         
            +
                require "contracts"
         
     | 
| 
      
 13 
     | 
    
         
            +
                C = Contracts
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                class Example
         
     | 
| 
      
 16 
     | 
    
         
            +
                  include Contracts::Core
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                  Contract C::Any, String, C::KeywordArgs[b: C::Optional[String]] => Symbol
         
     | 
| 
      
 19 
     | 
    
         
            +
                  def foo(output, a = 'a', b: 'b')
         
     | 
| 
      
 20 
     | 
    
         
            +
                    p [a, b]
         
     | 
| 
      
 21 
     | 
    
         
            +
                    output
         
     | 
| 
      
 22 
     | 
    
         
            +
                  end
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
                """
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
              Scenario: Accepts arguments when only require arguments filled and valid
         
     | 
| 
      
 27 
     | 
    
         
            +
                Given a file named "accepts_all_filled_valid_args.rb" with:
         
     | 
| 
      
 28 
     | 
    
         
            +
                """ruby
         
     | 
| 
      
 29 
     | 
    
         
            +
                require "./keyword_args_with_optional_positional_args_usage"
         
     | 
| 
      
 30 
     | 
    
         
            +
                puts Example.new.foo(:output)
         
     | 
| 
      
 31 
     | 
    
         
            +
                """
         
     | 
| 
      
 32 
     | 
    
         
            +
                When I run `ruby accepts_all_filled_valid_args.rb`
         
     | 
| 
      
 33 
     | 
    
         
            +
                Then output should contain:
         
     | 
| 
      
 34 
     | 
    
         
            +
                """
         
     | 
| 
      
 35 
     | 
    
         
            +
                ["a", "b"]
         
     | 
| 
      
 36 
     | 
    
         
            +
                output
         
     | 
| 
      
 37 
     | 
    
         
            +
                """
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
              Scenario: Accepts arguments when all filled and valid
         
     | 
| 
      
 40 
     | 
    
         
            +
                Given a file named "accepts_all_filled_valid_args.rb" with:
         
     | 
| 
      
 41 
     | 
    
         
            +
                """ruby
         
     | 
| 
      
 42 
     | 
    
         
            +
                require "./keyword_args_with_optional_positional_args_usage"
         
     | 
| 
      
 43 
     | 
    
         
            +
                puts Example.new.foo(:output, 'c', b: 'd')
         
     | 
| 
      
 44 
     | 
    
         
            +
                """
         
     | 
| 
      
 45 
     | 
    
         
            +
                When I run `ruby accepts_all_filled_valid_args.rb`
         
     | 
| 
      
 46 
     | 
    
         
            +
                Then output should contain:
         
     | 
| 
      
 47 
     | 
    
         
            +
                """
         
     | 
| 
      
 48 
     | 
    
         
            +
                ["c", "d"]
         
     | 
| 
      
 49 
     | 
    
         
            +
                output
         
     | 
| 
      
 50 
     | 
    
         
            +
                """
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
              Scenario: Accepts arguments when only require arguments & optional keyword arguments filled and valid
         
     | 
| 
      
 53 
     | 
    
         
            +
                Given a file named "accepts_all_filled_valid_args.rb" with:
         
     | 
| 
      
 54 
     | 
    
         
            +
                """ruby
         
     | 
| 
      
 55 
     | 
    
         
            +
                require "./keyword_args_with_optional_positional_args_usage"
         
     | 
| 
      
 56 
     | 
    
         
            +
                puts Example.new.foo(:output, b: 'd')
         
     | 
| 
      
 57 
     | 
    
         
            +
                """
         
     | 
| 
      
 58 
     | 
    
         
            +
                When I run `ruby accepts_all_filled_valid_args.rb`
         
     | 
| 
      
 59 
     | 
    
         
            +
                Then output should contain:
         
     | 
| 
      
 60 
     | 
    
         
            +
                """
         
     | 
| 
      
 61 
     | 
    
         
            +
                ["a", "d"]
         
     | 
| 
      
 62 
     | 
    
         
            +
                output
         
     | 
| 
      
 63 
     | 
    
         
            +
                """
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
              Scenario: Accepts arguments when only require arguments & optional positional arguments filled and valid
         
     | 
| 
      
 66 
     | 
    
         
            +
                Given a file named "accepts_all_filled_valid_args.rb" with:
         
     | 
| 
      
 67 
     | 
    
         
            +
                """ruby
         
     | 
| 
      
 68 
     | 
    
         
            +
                require "./keyword_args_with_optional_positional_args_usage"
         
     | 
| 
      
 69 
     | 
    
         
            +
                puts Example.new.foo(:output, 'c')
         
     | 
| 
      
 70 
     | 
    
         
            +
                """
         
     | 
| 
      
 71 
     | 
    
         
            +
                When I run `ruby accepts_all_filled_valid_args.rb`
         
     | 
| 
      
 72 
     | 
    
         
            +
                Then output should contain:
         
     | 
| 
      
 73 
     | 
    
         
            +
                """
         
     | 
| 
      
 74 
     | 
    
         
            +
                ["c", "b"]
         
     | 
| 
      
 75 
     | 
    
         
            +
                output
         
     | 
| 
      
 76 
     | 
    
         
            +
                """
         
     | 
| 
         @@ -26,7 +26,8 @@ Feature: None 
     | 
|
| 
       26 
26 
     | 
    
         
             
                def autorescue
         
     | 
| 
       27 
27 
     | 
    
         
             
                  yield
         
     | 
| 
       28 
28 
     | 
    
         
             
                rescue => e
         
     | 
| 
       29 
     | 
    
         
            -
                   
     | 
| 
      
 29 
     | 
    
         
            +
                  # Since ruby 3.2 the `#inspect` output becomes a bit different
         
     | 
| 
      
 30 
     | 
    
         
            +
                  puts e.inspect.gsub(/^#</, "").gsub(/Error:\"/, "Error: ")
         
     | 
| 
       30 
31 
     | 
    
         
             
                end
         
     | 
| 
       31 
32 
     | 
    
         
             
                """
         
     | 
| 
       32 
33 
     | 
    
         
             
                Given a file named "none_usage.rb" with:
         
     | 
| 
         @@ -42,6 +43,11 @@ Feature: None 
     | 
|
| 
       42 
43 
     | 
    
         
             
                  def self.a_symbol(*args)
         
     | 
| 
       43 
44 
     | 
    
         
             
                    :a_symbol
         
     | 
| 
       44 
45 
     | 
    
         
             
                  end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                  Contract C::None => Symbol
         
     | 
| 
      
 48 
     | 
    
         
            +
                  def a_symbol(*args)
         
     | 
| 
      
 49 
     | 
    
         
            +
                    :a_symbol
         
     | 
| 
      
 50 
     | 
    
         
            +
                  end
         
     | 
| 
       45 
51 
     | 
    
         
             
                end
         
     | 
| 
       46 
52 
     | 
    
         
             
                """
         
     | 
| 
       47 
53 
     | 
    
         | 
| 
         @@ -61,14 +67,14 @@ Feature: None 
     | 
|
| 
       61 
67 
     | 
    
         
             
                Given a file named "anything.rb" with:
         
     | 
| 
       62 
68 
     | 
    
         
             
                """ruby
         
     | 
| 
       63 
69 
     | 
    
         
             
                require "./none_usage"
         
     | 
| 
       64 
     | 
    
         
            -
                autorescue { Example.a_symbol(nil) }
         
     | 
| 
       65 
     | 
    
         
            -
                autorescue { Example.a_symbol(12) }
         
     | 
| 
       66 
     | 
    
         
            -
                autorescue { Example.a_symbol(37.5) }
         
     | 
| 
       67 
     | 
    
         
            -
                autorescue { Example.a_symbol("foo") }
         
     | 
| 
       68 
     | 
    
         
            -
                autorescue { Example.a_symbol(:foo) }
         
     | 
| 
       69 
     | 
    
         
            -
                autorescue { Example.a_symbol({}) }
         
     | 
| 
       70 
     | 
    
         
            -
                autorescue { Example.a_symbol([]) }
         
     | 
| 
       71 
     | 
    
         
            -
                autorescue { Example.a_symbol(Object) }
         
     | 
| 
      
 70 
     | 
    
         
            +
                autorescue { Example.new.a_symbol(nil) }
         
     | 
| 
      
 71 
     | 
    
         
            +
                autorescue { Example.new.a_symbol(12) }
         
     | 
| 
      
 72 
     | 
    
         
            +
                autorescue { Example.new.a_symbol(37.5) }
         
     | 
| 
      
 73 
     | 
    
         
            +
                autorescue { Example.new.a_symbol("foo") }
         
     | 
| 
      
 74 
     | 
    
         
            +
                autorescue { Example.new.a_symbol(:foo) }
         
     | 
| 
      
 75 
     | 
    
         
            +
                autorescue { Example.new.a_symbol({}) }
         
     | 
| 
      
 76 
     | 
    
         
            +
                autorescue { Example.new.a_symbol([]) }
         
     | 
| 
      
 77 
     | 
    
         
            +
                autorescue { Example.new.a_symbol(Object) }
         
     | 
| 
       72 
78 
     | 
    
         
             
                """
         
     | 
| 
       73 
79 
     | 
    
         
             
                When I run `ruby anything.rb`
         
     | 
| 
       74 
80 
     | 
    
         | 
    
        data/features/support/env.rb
    CHANGED