contracts 0.17 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cbf4bff58a593998c5902920fff3c0a808ca5eb97ec9cad3646df370435421c7
4
- data.tar.gz: 02e5cffce164a25ae463b22e9f8b85c810d50c9c2875d09a3e83751afebac012
3
+ metadata.gz: 8a151d83a8b03910e5dd1171c384e0ea8a01ff9437d81140f995358d888ac0fa
4
+ data.tar.gz: b92d01b9dd8702b866e004c41834781885d8178b1ceacb1e5166982243a13a49
5
5
  SHA512:
6
- metadata.gz: c6911f4383b0140c40bc08c838a3044897c3c9ac3c577fae4b3806879cbfed12f044f8ee1336305b1599c10af1bfb5aabe9ae2e8f1f9ffd94774d4de789e8402
7
- data.tar.gz: 25c8ecfe04e846ba55d87b33a43e0a38422440d0a963066ac67217edd8ebc396cbb2309b50704ea6f4dc4609bacbfb3fb3b501ef0a40210fe1877df5c6fbb7f8
6
+ metadata.gz: 94df8b86d22522b7c573f9cd7b3ee425568b024d7d3a88701759a2b47cdce691bd9ce7ec45710e7e8dafb993c7aa1cb93d6d9a0110d3c4effeece4b24fda29a9
7
+ data.tar.gz: dbbddaf090e48b52cde302f6a6b5b89fc84045e9c392ef1d34ddcfb2e149f65c3da825b8140ebd4b3d36672ed933b841e1c59b9e684098bb3144762bcd7b4b50
@@ -22,11 +22,11 @@ jobs:
22
22
  os:
23
23
  - ubuntu
24
24
  ruby:
25
- - "3.0"
25
+ - "3.3"
26
26
  runs-on: ${{ matrix.os }}-latest
27
27
  steps:
28
28
  - name: Checkout
29
- uses: actions/checkout@v2
29
+ uses: actions/checkout@v4
30
30
  - name: Setup Ruby
31
31
  uses: ruby/setup-ruby@v1
32
32
  with:
@@ -22,16 +22,16 @@ jobs:
22
22
  os:
23
23
  - ubuntu
24
24
  ruby:
25
+ - "3.3"
26
+ - "3.2"
27
+ - "3.1"
25
28
  - "3.0"
26
- test_command: ["bundle exec rspec && bundle exec cucumber"]
27
- include:
28
- - os: ubuntu
29
- ruby: "3.0"
30
- test_command: "bundle exec rspec"
29
+ test_command:
30
+ - "bundle exec rspec && bundle exec cucumber"
31
31
  runs-on: ${{ matrix.os }}-latest
32
32
  steps:
33
33
  - name: Checkout
34
- uses: actions/checkout@v2
34
+ uses: actions/checkout@v4
35
35
  - name: Setup Ruby
36
36
  uses: ruby/setup-ruby@v1
37
37
  with:
data/.rubocop.yml CHANGED
@@ -64,7 +64,7 @@ Style/Documentation:
64
64
  Layout/LineLength:
65
65
  Enabled: false
66
66
 
67
- # triggered by Contract ({ :name => String, :age => Fixnum }) => nil
67
+ # triggered by Contract ({ :name => String, :age => Integer }) => nil
68
68
  Lint/ParenthesesAsGroupedExpression:
69
69
  Enabled: false
70
70
 
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
- # contracts.ruby [![GitHub Build Status](https://img.shields.io/github/workflow/status/egonSchiele/contracts.ruby/Tests?style=flat-square)](https://github.com/egonSchiele/contracts.ruby/actions?query=workflow%3ATests) [![Join the chat at https://gitter.im/egonSchiele/contracts.ruby](https://img.shields.io/badge/gitter-join%20chat-brightgreen.svg)](https://gitter.im/egonSchiele/contracts.ruby)
3
+
4
+
5
+ # contracts.ruby [![GitHub Build Status](https://img.shields.io/github/actions/workflow/status/egonSchiele/contracts.ruby/tests.yaml?branch=master&style=flat-square)](https://github.com/egonSchiele/contracts.ruby/actions/workflows/tests.yaml) [![Join the chat at https://gitter.im/egonSchiele/contracts.ruby](https://img.shields.io/badge/gitter-join%20chat-brightgreen.svg)](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 `2.1`, `2.2`, `2.3`, `2.4`, `2.5`, `2.6` and `2.7`.
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/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[Fixnum, Float]`
84
- * [`Xor`](http://www.rubydoc.info/gems/contracts/Contracts/Builtin/Xor) – passes if exactly one of the given contracts pass, e.g. `Xor[Fixnum, Float]`
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 => Fixnum }]`
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 `Fixnum`)
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[Fixnum, Float] => C::Or[Fixnum, Float]
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[Fixnum, Float]` is. The longer way to write it would have been:
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(Fixnum, Float) => C::Or.new(Fixnum, Float)
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[Fixnum, Float] => C::Or[Fixnum, Float]
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(Fixnum, Float) => C::Or.new(Fixnum, Float)
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 `Fixnum` and `Float`. Use that instance to validate the argument.
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 `Fixnum`)
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[Fixnum, Float] => C::Num
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(Fixnum, Float) => C::Num
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 => Fixnum
726
+ Contract C::None => Integer
727
727
  def silly_next_day!
728
728
  self.day += 1
729
729
  end
data/contracts.gemspec CHANGED
@@ -13,8 +13,4 @@ Gem::Specification.new do |s|
13
13
  s.homepage = "https://github.com/egonSchiele/contracts.ruby"
14
14
  s.license = "BSD-2-Clause"
15
15
  s.required_ruby_version = [">= 3.0", "< 4"]
16
- s.post_install_message = "
17
- 0.16.x will be the supporting Ruby 2.x and be feature frozen (only fixes will be released)
18
- For Ruby 3.x use 0.17.x or later (might not be released yet)
19
- "
20
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
- puts e.inspect
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
 
@@ -95,7 +95,7 @@ module Contracts
95
95
 
96
96
  # Takes a variable number of contracts.
97
97
  # The contract passes if any of the contracts pass.
98
- # Example: <tt>Or[Fixnum, Float]</tt>
98
+ # Example: <tt>Or[Integer, Float]</tt>
99
99
  class Or < CallableClass
100
100
  def initialize(*vals)
101
101
  super()
@@ -120,7 +120,7 @@ module Contracts
120
120
 
121
121
  # Takes a variable number of contracts.
122
122
  # The contract passes if exactly one of those contracts pass.
123
- # Example: <tt>Xor[Fixnum, Float]</tt>
123
+ # Example: <tt>Xor[Integer, Float]</tt>
124
124
  class Xor < CallableClass
125
125
  def initialize(*vals)
126
126
  super()
@@ -146,7 +146,7 @@ module Contracts
146
146
 
147
147
  # Takes a variable number of contracts.
148
148
  # The contract passes if all contracts pass.
149
- # Example: <tt>And[Fixnum, Float]</tt>
149
+ # Example: <tt>And[Integer, Float]</tt>
150
150
  class And < CallableClass
151
151
  def initialize(*vals)
152
152
  super()
@@ -12,8 +12,20 @@ module Contracts
12
12
  # Explicitly append blk=nil if nil != Proc contract violation anticipated
13
13
  nil_block_appended = maybe_append_block!(args, blk)
14
14
 
15
- # Explicitly append options={} if Hash contract is present
16
- kargs_appended = maybe_append_options!(args, kargs, blk)
15
+ if @kargs_validator && !@kargs_validator[kargs]
16
+ data = {
17
+ arg: kargs,
18
+ contract: kargs_contract,
19
+ class: klass,
20
+ method: method,
21
+ contracts: self,
22
+ arg_pos: :keyword,
23
+ total_args: args.size,
24
+ return_value: false,
25
+ }
26
+ return ParamContractError.new("as return value", data) if returns
27
+ return unless Contract.failure_callback(data)
28
+ end
17
29
 
18
30
  # Loop forward validating the arguments up to the splat (if there is one)
19
31
  (@args_contract_index || args.size).times do |i|
@@ -84,7 +96,6 @@ module Contracts
84
96
  # If we put the block into args for validating, restore the args
85
97
  # OR if we added a fake nil at the end because a block wasn't passed in.
86
98
  args.slice!(-1) if blk || nil_block_appended
87
- args.slice!(-1) if kargs_appended
88
99
  result = if method.respond_to?(:call)
89
100
  # proc, block, lambda, etc
90
101
  method.call(*args, **kargs, &blk)
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rubocop:disable Lint/RedundantRequireStatement
4
+ # If removed, spec/module_spec fails
3
5
  require "pp"
6
+ # rubocop:enable Lint/RedundantRequireStatement
4
7
 
5
8
  module Contracts
6
9
  # A namespace for classes related to formatting.
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Contracts
4
- VERSION = "0.17"
4
+ VERSION = "0.17.1"
5
5
  end
data/lib/contracts.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "contracts/version"
3
4
  require "contracts/attrs"
4
5
  require "contracts/builtin_contracts"
5
6
  require "contracts/decorators"
@@ -52,7 +53,7 @@ class Contract < Contracts::Decorator
52
53
  end
53
54
  end
54
55
 
55
- attr_reader :args_contracts, :ret_contract, :klass, :method
56
+ attr_reader :args_contracts, :kargs_contract, :ret_contract, :klass, :method
56
57
 
57
58
  def initialize(klass, method, *contracts)
58
59
  super(klass, method)
@@ -69,6 +70,9 @@ class Contract < Contracts::Decorator
69
70
 
70
71
  # internally we just convert that return value syntax back to an array
71
72
  @args_contracts = contracts[0, contracts.size - 1] + contracts[-1].keys
73
+ # Extract contract for keyword arguments
74
+ @kargs_contract = args_contracts.find { |c| c.is_a?(Contracts::Builtin::KeywordArgs) }
75
+ args_contracts.delete(kargs_contract) if kargs_contract
72
76
 
73
77
  @ret_contract = contracts[-1].values[0]
74
78
 
@@ -76,6 +80,8 @@ class Contract < Contracts::Decorator
76
80
  Contract.make_validator(contract)
77
81
  end
78
82
 
83
+ @kargs_validator = kargs_contract ? Contract.make_validator(kargs_contract) : nil
84
+
79
85
  @args_contract_index = args_contracts.index do |contract|
80
86
  contract.is_a? Contracts::Args
81
87
  end
@@ -93,16 +99,6 @@ class Contract < Contracts::Decorator
93
99
 
94
100
  # ====
95
101
 
96
- # == @has_options_contract
97
- last_contract = args_contracts.last
98
- penultimate_contract = args_contracts[-2]
99
- @has_options_contract = if @has_proc_contract
100
- penultimate_contract.is_a?(Contracts::Builtin::KeywordArgs)
101
- else
102
- last_contract.is_a?(Contracts::Builtin::KeywordArgs)
103
- end
104
- # ===
105
-
106
102
  @klass, @method = klass, method
107
103
  end
108
104
 
@@ -255,19 +251,6 @@ class Contract < Contracts::Decorator
255
251
  true
256
252
  end
257
253
 
258
- # Same thing for when we have named params but didn't pass any in.
259
- # returns true if it appended nil
260
- def maybe_append_options! args, kargs, blk
261
- return false unless @has_options_contract
262
-
263
- if @has_proc_contract && args_contracts[-2].is_a?(Contracts::Builtin::KeywordArgs)
264
- args.insert(-2, kargs)
265
- elsif args_contracts[-1].is_a?(Contracts::Builtin::KeywordArgs)
266
- args << kargs
267
- end
268
- true
269
- end
270
-
271
254
  # Used to determine type of failure exception this contract should raise in case of failure
272
255
  def failure_exception
273
256
  if pattern_match?
@@ -30,7 +30,7 @@ RSpec.describe "Contracts:" do
30
30
  end
31
31
 
32
32
  describe "Num:" do
33
- it "should pass for Fixnums" do
33
+ it "should pass for Integers" do
34
34
  passes { @o.double(2) }
35
35
  end
36
36
 
@@ -100,11 +100,11 @@ class GenericExample
100
100
  end
101
101
  end
102
102
 
103
- Contract ({ :name => String, :age => Fixnum }) => nil
103
+ Contract ({ :name => String, :age => Integer }) => nil
104
104
  def person(data)
105
105
  end
106
106
 
107
- Contract C::StrictHash[{ :name => String, :age => Fixnum }] => nil
107
+ Contract C::StrictHash[{ :name => String, :age => Integer }] => nil
108
108
  def strict_person(data)
109
109
  end
110
110
 
@@ -119,7 +119,7 @@ class GenericExample
119
119
  def nested_hash_complex_contracts(data)
120
120
  end
121
121
 
122
- Contract C::KeywordArgs[:name => String, :age => Fixnum] => nil
122
+ Contract C::KeywordArgs[:name => String, :age => Integer] => nil
123
123
  def person_keywordargs(name: "name", age: 10)
124
124
  end
125
125
 
@@ -529,30 +529,30 @@ class MyBirthday
529
529
  @month = month
530
530
  end
531
531
 
532
- Contract C::None => Fixnum
532
+ Contract C::None => Integer
533
533
  def silly_next_day!
534
534
  self.day += 1
535
535
  end
536
536
 
537
- Contract C::None => Fixnum
537
+ Contract C::None => Integer
538
538
  def silly_next_month!
539
539
  self.month += 1
540
540
  end
541
541
 
542
- Contract C::None => Fixnum
542
+ Contract C::None => Integer
543
543
  def clever_next_day!
544
544
  return clever_next_month! if day == 31
545
545
  self.day += 1
546
546
  end
547
547
 
548
- Contract C::None => Fixnum
548
+ Contract C::None => Integer
549
549
  def clever_next_month!
550
550
  return next_year! if month == 12
551
551
  self.month += 1
552
552
  self.day = 1
553
553
  end
554
554
 
555
- Contract C::None => Fixnum
555
+ Contract C::None => Integer
556
556
  def next_year!
557
557
  self.month = 1
558
558
  self.day = 1
@@ -610,7 +610,7 @@ with_enabled_no_contracts do
610
610
  body + "!"
611
611
  end
612
612
 
613
- Contract Fixnum, String => String
613
+ Contract Integer, String => String
614
614
  def on_response(status, body)
615
615
  "error #{status}: #{body}"
616
616
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contracts
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.17'
4
+ version: 0.17.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aditya Bhargava
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-07 00:00:00.000000000 Z
11
+ date: 2024-10-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: This library provides contracts for Ruby. Contracts let you clearly express
14
14
  how your code behaves, and free you from writing tons of boilerplate, defensive
@@ -56,6 +56,7 @@ files:
56
56
  - features/builtin_contracts/hash_of.feature
57
57
  - features/builtin_contracts/int.feature
58
58
  - features/builtin_contracts/keyword_args.feature
59
+ - features/builtin_contracts/keyword_args_with_optional_positional_args.feature
59
60
  - features/builtin_contracts/maybe.feature
60
61
  - features/builtin_contracts/nat.feature
61
62
  - features/builtin_contracts/nat_pos.feature
@@ -111,9 +112,7 @@ homepage: https://github.com/egonSchiele/contracts.ruby
111
112
  licenses:
112
113
  - BSD-2-Clause
113
114
  metadata: {}
114
- post_install_message: "\n 0.16.x will be the supporting Ruby 2.x and be feature
115
- frozen (only fixes will be released)\n For Ruby 3.x use 0.17.x or later (might
116
- not be released yet)\n "
115
+ post_install_message:
117
116
  rdoc_options: []
118
117
  require_paths:
119
118
  - lib
@@ -131,8 +130,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
130
  - !ruby/object:Gem::Version
132
131
  version: '0'
133
132
  requirements: []
134
- rubygems_version: 3.0.3
135
- signing_key:
133
+ rubygems_version: 3.4.10
134
+ signing_key:
136
135
  specification_version: 4
137
136
  summary: Contracts for Ruby.
138
137
  test_files: []