contracts 0.15.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5f95ed9c9dca3e23e9feb707360335388730304e
4
- data.tar.gz: 634613562833a5f69e2171163eb71e64314ae252
3
+ metadata.gz: d2050dfd5418498598d0f857e3fe285daa65908c
4
+ data.tar.gz: 9d5ae5ad04a508233be8ec25b2fb657f2a2b713e
5
5
  SHA512:
6
- metadata.gz: 3e9393b9202596fbd5df5a53c1e4fd963ed9f5d881277f7705415fce911cba40c47ad0cf6ce993b1f94670fb8e5c7ab4ff9bcff9c20990826600969b686f7cce
7
- data.tar.gz: 30bddf252a1e2da5a53223189bae378e834087ba3e1813c5acb8ad96bd62f75878d9bcf1afd4e861d87c63d1195af26ca1f9d89248b7089a54913090b52d1449
6
+ metadata.gz: 714992e52ce0d9bdc52c1a0d0ee0c89b0541559e924d2e63e902f73d253c09343f37e8bec1c082ba5bdae76cf146835f09e252f273a617fd5235108b3d2b9f49
7
+ data.tar.gz: 50518932f7576ddb8a092fa42267321b4502b87a45f96255d2673197075dbdaf9008b3096ce0753cfe57a39a0055c14326dfddeae81ef4ce4243157e55dadd08
@@ -1,3 +1,9 @@
1
+ ## v0.16.0
2
+
3
+ - **Support for Ruby 1.8 has been discontinued** - [Corey Farwell](https://github.com/frewsxcv) [#256](https://github.com/egonSchiele/contracts.ruby/pull/256)
4
+ - Enhancement: Add a `Contracts::Attrs` module containing attribute w/ contracts utilities - [Corey Farwell](https://github.com/frewsxcv) [#255](https://github.com/egonSchiele/contracts.ruby/pull/255)
5
+ - Bugfix: Fix StrictHash contract for extra keys - [Maciej Malecki](https://github.com/smt116) [#254](https://github.com/egonSchiele/contracts.ruby/pull/254)
6
+
1
7
  ## v0.15.0
2
8
  - Bugfix: Func contract's return value isn't enforced with blocks - [Piotr Szmielew](https://github.com/esse) [#251](https://github.com/egonSchiele/contracts.ruby/pull/251)
3
9
  - Bugfx: Fix contracts used in AR-models - [Gert Goet](https://github.com/eval) [#237](https://github.com/egonSchiele/contracts.ruby/pull/237)
data/README.md CHANGED
@@ -81,7 +81,7 @@ Using contracts.ruby results in very little slowdown. Check out [this blog post]
81
81
 
82
82
  **Q.** What Rubies can I use this with?
83
83
 
84
- **A.** It's been tested with `1.8.7`, `1.9.2`, `1.9.3`, `2.0.0`, `2.1`, `2.2`, and `jruby` (both 1.8 and 1.9 modes).
84
+ **A.** It's been tested with `1.9.2`, `1.9.3`, `2.0.0`, `2.1`, `2.2`, and `jruby` (1.9 mode).
85
85
 
86
86
  If you're using the library, please [let me know](https://github.com/egonSchiele) what project you're using it on :)
87
87
 
@@ -97,7 +97,7 @@ Michael Tomer
97
97
 
98
98
  ## Credits
99
99
 
100
- Inspired by [contracts.coffee](http://disnetdev.com/contracts.coffee/).
100
+ Inspired by [contracts.coffee](http://disnet.github.io/contracts.coffee/).
101
101
 
102
102
  Copyright 2012-2015 [Aditya Bhargava](http://adit.io).
103
103
  Major improvements by [Alexey Fedorov](https://github.com/waterlink).
data/Rakefile CHANGED
@@ -7,5 +7,9 @@ else
7
7
  task :default => [:spec]
8
8
  end
9
9
 
10
+ task :add_tag do
11
+ `git tag -a v#{Contracts::VERSION} -m 'v#{Contracts::VERSION}'`
12
+ end
13
+
10
14
  require "rspec/core/rake_task"
11
15
  RSpec::Core::RakeTask.new(:spec)
@@ -606,6 +606,32 @@ Possible validator overrides:
606
606
 
607
607
  Default validators can be found here: [lib/contracts/validators.rb](https://github.com/egonSchiele/contracts.ruby/blob/master/lib/contracts/validators.rb).
608
608
 
609
+ ## Contracts with attributes
610
+
611
+ You can include the `Contracts::Attrs` module in your class/module to get access to attribute utilities:
612
+
613
+ - `attr_reader_with_contract <symbol>..., <contract>`
614
+ - Wraps `attr_reader`, validates contract upon 'getting'
615
+ - `attr_writer_with_contract <symbol>..., <contract>`
616
+ - Wraps `attr_writer`, validates contract upon 'setting'
617
+ - `attr_accessor_with_contract <symbol>..., <contract>`
618
+ - Wraps `attr_accessor`, validates contract upon 'getting' or 'setting'
619
+
620
+ ### Example
621
+
622
+ ```ruby
623
+ class Person
624
+ include Contracts::Core
625
+ include Contracts::Attrs
626
+
627
+ attr_accessor_with_contract :name, String
628
+ end
629
+
630
+ person = Person.new
631
+ person.name = 'Jane'
632
+ person.name = 1.4 # This results in a contract error!
633
+ ```
634
+
609
635
  ## Disabling contracts
610
636
 
611
637
  If you want to disable contracts, set the `NO_CONTRACTS` environment variable. This will disable contracts and you won't have a performance hit. Pattern matching will still work if you disable contracts in this way! With NO_CONTRACTS only pattern-matching contracts are defined.
@@ -1,3 +1,4 @@
1
+ require "contracts/attrs"
1
2
  require "contracts/builtin_contracts"
2
3
  require "contracts/decorators"
3
4
  require "contracts/errors"
@@ -0,0 +1,20 @@
1
+ module Contracts
2
+ module Attrs
3
+ def attr_reader_with_contract(*names, contract)
4
+ Contract Contracts::None => contract
5
+ attr_reader(*names)
6
+ end
7
+
8
+ def attr_writer_with_contract(*names, contract)
9
+ Contract contract => contract
10
+ attr_writer(*names)
11
+ end
12
+
13
+ def attr_accessor_with_contract(*names, contract)
14
+ attr_reader_with_contract(*names, contract)
15
+ attr_writer_with_contract(*names, contract)
16
+ end
17
+ end
18
+
19
+ include Attrs
20
+ end
@@ -405,9 +405,10 @@ module Contracts
405
405
 
406
406
  def valid?(arg)
407
407
  return false unless arg.is_a?(Hash)
408
+ return false unless arg.keys.sort.eql?(contract_hash.keys.sort)
408
409
 
409
- contract_hash.all? do |key, _v|
410
- contract_hash.key?(key) && Contract.valid?(arg[key], contract_hash[key])
410
+ contract_hash.all? do |key, contract|
411
+ contract_hash.key?(key) && Contract.valid?(arg[key], contract)
411
412
  end
412
413
  end
413
414
  end
@@ -4,14 +4,10 @@ module Contracts
4
4
  def method_position(method)
5
5
  return method.method_position if method.is_a?(MethodReference)
6
6
 
7
- if RUBY_VERSION =~ /^1\.8/
8
- if method.respond_to?(:__file__)
9
- method.__file__ + ":" + method.__line__.to_s
10
- else
11
- method.inspect
12
- end
7
+ file, line = method.source_location
8
+ if file.nil? || line.nil?
9
+ ""
13
10
  else
14
- file, line = method.source_location
15
11
  file + ":" + line.to_s
16
12
  end
17
13
  end
@@ -34,8 +30,7 @@ module Contracts
34
30
  end
35
31
 
36
32
  def eigenclass_hierarchy_supported?
37
- return false if RUBY_PLATFORM == "java" && RUBY_VERSION.to_f < 2.0
38
- RUBY_VERSION.to_f > 1.8
33
+ RUBY_PLATFORM != "java" || RUBY_VERSION.to_f >= 2.0
39
34
  end
40
35
 
41
36
  def eigenclass_of(target)
@@ -1,3 +1,3 @@
1
1
  module Contracts
2
- VERSION = "0.15.0"
2
+ VERSION = "0.16.0"
3
3
  end
@@ -0,0 +1,75 @@
1
+ RSpec.describe "Contracts:" do
2
+ describe "Attrs:" do
3
+ class Person
4
+ include Contracts::Core
5
+ include Contracts::Attrs
6
+ include Contracts::Builtin
7
+
8
+ def initialize(name)
9
+ @name_r = name
10
+ @name_w = name
11
+ @name_rw = name
12
+ end
13
+
14
+ attr_reader_with_contract :name_r, String
15
+ attr_writer_with_contract :name_w, String
16
+ attr_accessor_with_contract :name_rw, String
17
+ end
18
+
19
+ context "attr_reader_with_contract" do
20
+ it "getting valid type" do
21
+ expect(Person.new("bob").name_r)
22
+ .to(eq("bob"))
23
+ end
24
+
25
+ it "getting invalid type" do
26
+ expect { Person.new(1.3).name_r }
27
+ .to(raise_error(ReturnContractError))
28
+ end
29
+
30
+ it "setting" do
31
+ expect { Person.new("bob").name_r = "alice" }
32
+ .to(raise_error(NoMethodError))
33
+ end
34
+ end
35
+
36
+ context "attr_writer_with_contract" do
37
+ it "getting" do
38
+ expect { Person.new("bob").name_w }
39
+ .to(raise_error(NoMethodError))
40
+ end
41
+
42
+ it "setting valid type" do
43
+ expect(Person.new("bob").name_w = "alice")
44
+ .to(eq("alice"))
45
+ end
46
+
47
+ it "setting invalid type" do
48
+ expect { Person.new("bob").name_w = 1.2 }
49
+ .to(raise_error(ParamContractError))
50
+ end
51
+ end
52
+
53
+ context "attr_accessor_with_contract" do
54
+ it "getting valid type" do
55
+ expect(Person.new("bob").name_rw)
56
+ .to(eq("bob"))
57
+ end
58
+
59
+ it "getting invalid type" do
60
+ expect { Person.new(1.2).name_rw }
61
+ .to(raise_error(ReturnContractError))
62
+ end
63
+
64
+ it "setting valid type" do
65
+ expect(Person.new("bob").name_rw = "alice")
66
+ .to(eq("alice"))
67
+ end
68
+
69
+ it "setting invalid type" do
70
+ expect { Person.new("bob").name_rw = 1.2 }
71
+ .to(raise_error(ParamContractError))
72
+ end
73
+ end
74
+ end
75
+ end
@@ -448,7 +448,7 @@ RSpec.describe "Contracts:" do
448
448
 
449
449
  context "when given an input with extra keys" do
450
450
  it "raises an error" do
451
- fails { @o.strict_person(:name => "calvin", :age => "10", :soft => true) }
451
+ fails { @o.strict_person(:name => "calvin", :age => 10, :soft => true) }
452
452
  end
453
453
  end
454
454
 
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.15.0
4
+ version: 0.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aditya Bhargava
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-24 00:00:00.000000000 Z
11
+ date: 2017-04-24 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
@@ -68,6 +68,7 @@ files:
68
68
  - features/builtin_contracts/xor.feature
69
69
  - features/support/env.rb
70
70
  - lib/contracts.rb
71
+ - lib/contracts/attrs.rb
71
72
  - lib/contracts/builtin_contracts.rb
72
73
  - lib/contracts/call_with.rb
73
74
  - lib/contracts/core.rb
@@ -88,6 +89,7 @@ files:
88
89
  - script/docs-release
89
90
  - script/docs-staging
90
91
  - script/rubocop.rb
92
+ - spec/attrs_spec.rb
91
93
  - spec/builtin_contracts_spec.rb
92
94
  - spec/contracts_spec.rb
93
95
  - spec/fixtures/fixtures.rb