wrapped 0.0.3 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 873be12f072d8e7e8a013579ab7e24abbfca1df4
4
- data.tar.gz: 00b05e0b222ebe45887f5ed05ce3d2fa19d17edf
3
+ metadata.gz: ef031daae3bfd8056b4b709aa3a500ac7197e541
4
+ data.tar.gz: 70978101ccd2d40c521e4dffd6d9f6420a9edb71
5
5
  SHA512:
6
- metadata.gz: 16409b545b1897b69f748e239f432509aa95a13a927713a7c86d6219b6411afcf96406b973cc38c4e6941a322da01d23a42728ecc3730ee26aafd1536c229d74
7
- data.tar.gz: 303cd24a0f03dc9ba83d94c7725a2990c8598b797e3ab1ca9341f45e852a078c2c98f8a3a596459d37407382423f9937187f5033d2caa18ae1cf3c9ca3d4312e
6
+ metadata.gz: d601312592eedffda77e3fa31e8efebfdf226ae06bd4a428213b6acda443cabc414e1af1d7fe4cd239d8abbbd7336d91c25079c0c62fdd83b7eb33b3a11a5c79
7
+ data.tar.gz: 1a8d7a800f1c17a4a1fb0f546864cace441c86c8dbb04e6ab315e9afcf38e02884831487841d8f8c7e415322e8f0ce5b9554cf5b2108820a1cecfde93b3f39c5
data/README.md CHANGED
@@ -6,6 +6,13 @@ your code to find bugs earlier and faster. It works like this: any time you
6
6
  write a method that could produce nil, you instead write a method that produces
7
7
  a wrapped value.
8
8
 
9
+ Warning: Experimental
10
+ ---------------------
11
+
12
+ This library is in an early, experimental phase and may change suddenly and
13
+ drastically. Backwards-compatibility should not be expected between releases,
14
+ and the project may be cancelled at any time.
15
+
9
16
  Example
10
17
  -------
11
18
 
@@ -14,33 +21,39 @@ Here's an example along with how it can help with errors:
14
21
  Say you have a collection of users along with a method for accessing the first
15
22
  user:
16
23
 
17
- class UserCollection
18
- def initialize(users)
19
- @users = users
20
- end
21
-
22
- def first_user
23
- @users.first
24
- end
25
- end
24
+ ```ruby
25
+ class UserCollection
26
+ def initialize(users)
27
+ @users = users
28
+ end
29
+
30
+ def first_user
31
+ @users.first
32
+ end
33
+ end
34
+ ```
26
35
 
27
36
  Now your friend uses your awesome UserCollection code:
28
37
 
29
- class FriendGroups
30
- def initialize(user_collections)
31
- @user_collections = user_collections
32
- end
38
+ ```ruby
39
+ class FriendGroups
40
+ def initialize(user_collections)
41
+ @user_collections = user_collections
42
+ end
33
43
 
34
- def first_names
35
- @user_collections.map do |user_collection|
36
- user_collection.first_user.first_name
37
- end
38
- end
44
+ def first_names
45
+ @user_collections.map do |user_collection|
46
+ user_collection.first_user.first_name
39
47
  end
48
+ end
49
+ end
50
+ ```
40
51
 
41
52
  And then she tries it:
42
53
 
43
- FriendGroups.new([UserCollection.new([])]).first_names
54
+ ```ruby
55
+ FriendGroups.new([UserCollection.new([])]).first_names
56
+ ```
44
57
 
45
58
  ... and it promptly blows up:
46
59
 
@@ -59,15 +72,17 @@ Right.
59
72
  Instead what you want to do is wrap it. Wrap that nil. Make the user know that
60
73
  they have to consider the result.
61
74
 
62
- class UserCollection
63
- def initialize(users)
64
- @users = users
65
- end
66
-
67
- def first_user
68
- @users.first.wrapped
69
- end
70
- end
75
+ ```ruby
76
+ class UserCollection
77
+ def initialize(users)
78
+ @users = users
79
+ end
80
+
81
+ def first_user
82
+ @users.first.wrapped
83
+ end
84
+ end
85
+ ```
71
86
 
72
87
  Now in your documentation you explain that it produces a wrapped value. And
73
88
  people who skip documentation and instead read source code will see that it is
@@ -76,17 +91,19 @@ wrapped.
76
91
  So they unwrap it, because they must. They can't even get a happy path without
77
92
  unwrapping it.
78
93
 
79
- class FriendGroups
80
- def initialize(user_collections)
81
- @user_collections = user_collections
82
- end
94
+ ```ruby
95
+ class FriendGroups
96
+ def initialize(user_collections)
97
+ @user_collections = user_collections
98
+ end
83
99
 
84
- def first_names
85
- @user_collections.map do |user_collection|
86
- user_collection.first_user.unwrap_or('') {|user| user.first_name }
87
- end
88
- end
100
+ def first_names
101
+ @user_collections.map do |user_collection|
102
+ user_collection.first_user.unwrap_or('') {|user| user.first_name }
89
103
  end
104
+ end
105
+ end
106
+ ```
90
107
 
91
108
  Cool Stuff
92
109
  ----------
@@ -99,15 +116,19 @@ wrapped value. By wrapping it you've just made it more powerful!
99
116
 
100
117
  For example:
101
118
 
102
- irb(main):054:0> 1.wrapped.inject(0) {|_, n| n+1}
103
- => 2
104
- irb(main):055:0> nil.wrapped.inject(0) {|_, n| n+1}
105
- => 0
119
+ ```ruby
120
+ irb(main):054:0> 1.wrapped.inject(0) {|_, n| n+1}
121
+ => 2
122
+ irb(main):055:0> nil.wrapped.inject(0) {|_, n| n+1}
123
+ => 0
124
+ ```
106
125
 
107
126
  And then we have `flat_map`, which you can use to produce another wrapped object:
108
127
 
109
- irb> 1.wrapped.flat_map {|n| (n + 1).wrapped}.flat_map {|n| (n*2).wrapped}.unwrap
110
- => 4
128
+ ```ruby
129
+ irb> 1.wrapped.flat_map {|n| (n + 1).wrapped}.flat_map {|n| (n*2).wrapped}.unwrap
130
+ => 4
131
+ ```
111
132
 
112
133
  Those same people who will exclaim things about functors will, at this point,
113
134
  get giddy about monads. I mean, they're right, but they can relax. It's just a
@@ -116,44 +137,51 @@ monad.
116
137
  Those people ("what do you mean, 'those people'?!") may prefer the `fmap`
117
138
  method:
118
139
 
119
- irb> 1.wrapped.fmap {|n| n+1}.unwrap_or(0) {|n| n+4}
120
- => 6
140
+ ```ruby
141
+ irb> 1.wrapped.fmap {|n| n+1}.unwrap_or(0) {|n| n+4}
142
+ => 6
143
+ ```
121
144
 
122
145
  Other Methods
123
146
  -------------
124
147
 
125
148
  Then we added some convenience methods to all of this. Here's a tour:
126
149
 
127
- irb> require 'wrapped'
128
- => true
129
- irb> 1.wrapped.unwrap_or(-1)
130
- => 1
131
- irb> nil.wrapped.unwrap_or(-1)
132
- => -1
133
- irb> 1.wrapped.present {|n| p n }.blank { puts "nothing!" }
134
- 1
135
- => #<Present:0x7fc570aed0e8 @value=1>
136
- irb> nil.wrapped.present {|n| p n }.blank { puts "nothing!" }
137
- nothing!
138
- => #<Blank:0x7fc570ae21c0>
139
- irb> 1.wrapped.unwrap
140
- => 1
141
- irb> nil.wrapped.unwrap
142
- IndexError: Blank has no value
143
- from /home/mike/wrapped/lib/wrapped/types.rb:43:in `unwrap'
144
- from (irb):7
145
- irb> 1.wrapped.present?
146
- => true
147
- irb> nil.wrapped.present?
148
- => false
149
- irb> nil.wrapped.blank?
150
- => true
151
- irb> 1.wrapped.blank?
152
- => false
153
- irb> 1.wrapped.unwrap_or(0) {|n| n * 100}
154
- => 100
155
- irb> nil.wrapped.unwrap_or(0) {|n| n * 100}
156
- => 0
150
+ ```ruby
151
+ irb> require 'wrapped'
152
+ => true
153
+ irb> 1.wrapped.unwrap_or(-1)
154
+ => 1
155
+ irb> nil.wrapped.unwrap_or(-1)
156
+ => -1
157
+ irb> 1.wrapped.present {|n| p n }.blank { puts "nothing!" }
158
+ 1
159
+ => #<Present:0x7fc570aed0e8 @value=1>
160
+ irb> nil.wrapped.present {|n| p n }.blank { puts "nothing!" }
161
+ nothing!
162
+ => #<Blank:0x7fc570ae21c0>
163
+ irb> 1.wrapped.unwrap
164
+ => 1
165
+ irb> nil.wrapped.unwrap
166
+ IndexError: Blank has no value
167
+ from /home/mike/wrapped/lib/wrapped/types.rb:43:in `unwrap'
168
+ from (irb):7
169
+ ```
170
+
171
+ ```ruby
172
+ irb> 1.wrapped.present?
173
+ => true
174
+ irb> nil.wrapped.present?
175
+ => false
176
+ irb> nil.wrapped.blank?
177
+ => true
178
+ irb> 1.wrapped.blank?
179
+ => false
180
+ irb> 1.wrapped.unwrap_or(0) {|n| n * 100}
181
+ => 100
182
+ irb> nil.wrapped.unwrap_or(0) {|n| n * 100}
183
+ => 0
184
+ ```
157
185
 
158
186
  Inspiration
159
187
  -----------
@@ -166,4 +194,4 @@ functor or the option class for more.
166
194
 
167
195
  Copyright
168
196
  ---------
169
- Copyright 2011 - 2014 Mike Burns, Joe Ferris
197
+ Copyright 2011 Mike Burns. Copyright 2014 thoughtbot.
@@ -10,8 +10,12 @@ class Blank
10
10
  # Produce the value that is passed in.
11
11
  #
12
12
  # > w.unwrap_or(0)
13
- def unwrap_or(default)
14
- default
13
+ def unwrap_or(default = nil)
14
+ if block_given?
15
+ yield
16
+ else
17
+ default
18
+ end
15
19
  end
16
20
 
17
21
  # Does nothing, returning itself. This is chainable. See blank for its
@@ -37,7 +41,24 @@ class Blank
37
41
  #
38
42
  # > w.each {|n| puts n }
39
43
  def each
40
- []
44
+ self
45
+ end
46
+
47
+ # Produces itself.
48
+ def select
49
+ self
50
+ end
51
+
52
+ alias_method :find_all, :select
53
+
54
+ # Produces itself.
55
+ def reject
56
+ self
57
+ end
58
+
59
+ # Produces itself.
60
+ def grep(*)
61
+ self
41
62
  end
42
63
 
43
64
  # False; this is not an instance of a wrapped value.
@@ -64,12 +85,15 @@ class Blank
64
85
  self
65
86
  end
66
87
 
88
+ alias_method :collect, :fmap
89
+ alias_method :map, :fmap
90
+
67
91
  # Is this wrapped value equal to the given wrapped value? All blank values
68
92
  # are equal to each other.
69
93
  #
70
94
  # > nil.wrapped == nil.wrapped
71
95
  # > 1.wrapped == nil.wrapped
72
96
  def ==(other)
73
- other.blank?
97
+ other.is_a?(Blank)
74
98
  end
75
99
  end
@@ -14,12 +14,8 @@ class Present
14
14
  #
15
15
  # > w.unwrap_or(0)
16
16
  # > w.unwrap_or("hello") {|s| "Hi, #{s}" }
17
- def unwrap_or(_)
18
- if block_given?
19
- yield unwrap
20
- else
21
- unwrap
22
- end
17
+ def unwrap_or(_default = nil)
18
+ unwrap
23
19
  end
24
20
 
25
21
  # Invoke the block on the value, unwrapped. This method produces the wrapped
@@ -39,7 +35,7 @@ class Present
39
35
  self
40
36
  end
41
37
 
42
- # Produce the singleton list with the unwrapped value as its only member.
38
+ # Produces itself.
43
39
  #
44
40
  # If a block is passed, it is run against the unwrapped value.
45
41
  #
@@ -48,7 +44,27 @@ class Present
48
44
  # > w.each {|n| puts "Found #{n}" }
49
45
  def each
50
46
  yield unwrap if block_given?
51
- [unwrap]
47
+ self
48
+ end
49
+
50
+ # Produces itself if the block evaluates to true. Produces Blank if the block
51
+ # evaluates to false.
52
+ def select
53
+ super.first.wrapped
54
+ end
55
+
56
+ alias_method :find_all, :select
57
+
58
+ # Produces itself if the block evaluates to false. Produces Blank if the block
59
+ # evaluates to true.
60
+ def reject
61
+ super.first.wrapped
62
+ end
63
+
64
+ # Produces itself if the unwrapped value matches the given expression.
65
+ # Produces Blank otherwise.
66
+ def grep(*)
67
+ super.first.wrapped
52
68
  end
53
69
 
54
70
  # The raw value. I doubt you need this method.
@@ -84,14 +100,17 @@ class Present
84
100
  #
85
101
  # This makes it a functor.
86
102
  def fmap
87
- (yield unwrap).wrapped
103
+ Present.new(yield unwrap)
88
104
  end
89
105
 
106
+ alias_method :collect, :fmap
107
+ alias_method :map, :fmap
108
+
90
109
  # Is this wrapped value equal to the given wrapped value?
91
110
  #
92
111
  # > 1.wrapped == 1.wrapped
93
112
  # > nil.wrapped == 2.wrapped
94
113
  def ==(other)
95
- unwrap == other.unwrap_or(nil)
114
+ other.is_a?(Present) && unwrap == other.unwrap_or(nil)
96
115
  end
97
116
  end
@@ -1,3 +1,3 @@
1
1
  module Wrapped
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -1 +1,9 @@
1
1
  require 'wrapped'
2
+
3
+ RSpec::Matchers.define :be_alias_of do |source_method|
4
+ match do |target_method|
5
+ block = lambda { |n| n + 1 }
6
+
7
+ target_method.call(&block) == source_method.call(&block)
8
+ end
9
+ end
@@ -8,16 +8,16 @@ describe Wrapped, 'conversion' do
8
8
  let(:delegator) { SimpleDelegator.new(value).wrapped }
9
9
 
10
10
  it "converts the value to a Present" do
11
- just.should be_instance_of(Present)
11
+ expect(just).to be_instance_of(Present)
12
12
  end
13
13
 
14
14
  it "converts the nil to a Blank" do
15
- nothing.should be_instance_of(Blank)
15
+ expect(nothing).to be_instance_of(Blank)
16
16
  end
17
17
 
18
18
  it "converts a simple delegator to a Present" do
19
- delegator.should be_instance_of(Present)
20
- delegator.unwrap.should be_instance_of(SimpleDelegator)
19
+ expect(delegator).to be_instance_of(Present)
20
+ expect(delegator.unwrap).to be_instance_of(SimpleDelegator)
21
21
  end
22
22
  end
23
23
 
@@ -27,7 +27,7 @@ describe Wrapped, 'accessing' do
27
27
  let(:nothing) { nil.wrapped }
28
28
 
29
29
  it 'produces the value of the wrapped object' do
30
- just.unwrap.should == value
30
+ expect(just.unwrap).to eq(value)
31
31
  end
32
32
 
33
33
  it 'raises an exception when called on the wrapped nil' do
@@ -43,44 +43,41 @@ describe Wrapped, 'callbacks' do
43
43
  it 'calls the proper callback for a wrapped value' do
44
44
  result = false
45
45
  just.present {|v| result = v}
46
- result.should be_true
46
+ expect(result).to be_truthy
47
47
  end
48
48
 
49
49
  it 'calls the proper callback for a wrapped nil' do
50
50
  result = false
51
51
  nothing.blank {result = true}
52
- result.should be_true
52
+ expect(result).to be_truthy
53
53
  end
54
54
 
55
55
  it 'ignores the other callback for a wrapped value' do
56
56
  result = true
57
57
  just.blank { result = false }
58
- result.should be_true
58
+ expect(result).to be_truthy
59
59
  end
60
60
 
61
61
 
62
62
  it 'ignores the other callback for a wrapped nil' do
63
63
  result = true
64
64
  nothing.present { result = false }
65
- result.should be_true
65
+ expect(result).to be_truthy
66
66
  end
67
67
 
68
68
  it 'chains for wrapped values' do
69
69
  result = false
70
70
  just.present { result = true }.blank { result = false }
71
- result.should be_true
71
+ expect(result).to be_truthy
72
72
  end
73
73
 
74
74
  it 'chains for wrapped nils' do
75
75
  result = false
76
76
  nothing.present { result = false }.blank { result = true }
77
- result.should be_true
77
+ expect(result).to be_truthy
78
78
  end
79
79
  end
80
80
 
81
- # This behavior is different from Haskell and Scala.
82
- # It is done this way for consistency with Ruby.
83
- # See the functor description later for `fmap'.
84
81
  describe Wrapped, 'enumerable' do
85
82
  let(:value) { 1 }
86
83
  let(:just) { 1.wrapped }
@@ -89,29 +86,75 @@ describe Wrapped, 'enumerable' do
89
86
  it 'acts over the value for #each on a wrapped value' do
90
87
  result = -1
91
88
  just.each {|v| result = v }
92
- result.should == value
89
+ expect(result).to eq(value)
93
90
  end
94
91
 
95
- it 'produces a singleton array of the value for a wrapped value on #each' do
96
- just.each.should == [value]
92
+ it 'produces itself for #each' do
93
+ expect(just.each).to eq(just)
97
94
  end
98
95
 
99
96
  it 'skips the block for #each on a wrapped nil' do
100
97
  result = -1
101
98
  nothing.each {|v| result = v }
102
- result.should == -1
99
+ expect(result).to eq(-1)
103
100
  end
104
101
 
105
- it 'produces the empty array for a wrapped nil on #each' do
106
- nothing.each.should be_empty
102
+ it 'produces blank for a wrapped nil on #each' do
103
+ expect(nothing.each).to eq(nothing)
107
104
  end
108
105
 
109
106
  it 'maps over the value for a wrapped value' do
110
- just.map {|n| n + 1}.should == [value+1]
107
+ expect(just.map {|n| n + 1}).to eq((value+1).wrapped)
111
108
  end
112
109
 
113
- it 'map produces the empty list for a wrapped nil' do
114
- nothing.map {|n| n + 1}.should == []
110
+ it 'map produces blank' do
111
+ expect(nothing.map {|n| n + 1}).to be_instance_of(Blank)
112
+ end
113
+
114
+ it 'aliases map to collect' do
115
+ expect(just.method(:collect)).to be_alias_of(just.method(:map))
116
+ expect(nothing.method(:collect)).to be_alias_of(nothing.method(:map))
117
+ end
118
+
119
+ it 'select produces present for a value matching the block' do
120
+ expect(just.select { |n| n == value }).to eq(just)
121
+ end
122
+
123
+ it 'select produces blank for a value that does not match the block' do
124
+ expect(just.select { |n| n != value }).to be_instance_of(Blank)
125
+ end
126
+
127
+ it 'select products blank for a blank' do
128
+ expect(nothing.select { true }).to be_instance_of(Blank)
129
+ end
130
+
131
+ it 'aliases select to find_all' do
132
+ expect(just.method(:find_all)).to be_alias_of(just.method(:select))
133
+ expect(nothing.method(:find_all)).to be_alias_of(nothing.method(:select))
134
+ end
135
+
136
+ it 'reject produces present for a value matching the block' do
137
+ expect(just.reject { |n| n != value }).to eq(just)
138
+ end
139
+
140
+ it 'reject produces blank for a value that does not match the block' do
141
+ expect(just.reject { |n| n == value }).to be_instance_of(Blank)
142
+ end
143
+
144
+ it 'reject products blank for a blank' do
145
+ expect(nothing.reject { true }).to be_instance_of(Blank)
146
+ end
147
+
148
+ it 'grep produces present for a value matching the pattern' do
149
+ expect("hello".wrapped.grep(/ello$/)).to eq("hello".wrapped)
150
+ end
151
+
152
+ it 'grep produces blank for a value that does not match the pattern' do
153
+ expect("hello".wrapped.grep(/^ello/)).to be_instance_of(Blank)
154
+ end
155
+
156
+ it 'grep products blank for a blank' do
157
+ expect(nothing.grep(/.*/)).to be_instance_of(Blank)
115
158
  end
116
159
  end
117
160
 
@@ -121,13 +164,13 @@ describe Wrapped, 'queries' do
121
164
  let(:nothing) { nil.wrapped }
122
165
 
123
166
  it 'knows whether it is present' do
124
- just.should be_present
125
- nothing.should_not be_present
167
+ expect(just).to be_present
168
+ expect(nothing).not_to be_present
126
169
  end
127
170
 
128
171
  it 'knows whether it is blank' do
129
- just.should_not be_blank
130
- nothing.should be_blank
172
+ expect(just).not_to be_blank
173
+ expect(nothing).to be_blank
131
174
  end
132
175
  end
133
176
 
@@ -136,20 +179,20 @@ describe Wrapped, 'unwrap_or' do
136
179
  let(:just) { 1.wrapped }
137
180
  let(:nothing) { nil.wrapped }
138
181
 
139
- it 'produces the value for a wrapped value' do
140
- just.unwrap_or(-1).should == value
182
+ it 'produces the value for a wrapped value with an argument' do
183
+ expect(just.unwrap_or(-1)).to eq(value)
141
184
  end
142
185
 
143
- it 'produces the default for a wrapped nil' do
144
- nothing.unwrap_or(-1).should == -1
186
+ it 'produces the argument for a wrapped nil with an argument' do
187
+ expect(nothing.unwrap_or(-1)).to eq(-1)
145
188
  end
146
189
 
147
- it 'produces the value of the block for a wrapped object' do
148
- just.unwrap_or(-1) {|n| n+1}.should == value + 1
190
+ it 'produces the value for a wrapped value with a block' do
191
+ expect(just.unwrap_or { value + 1 }).to eq(value)
149
192
  end
150
193
 
151
- it 'produces the default for a wrapped nil even with a block' do
152
- nothing.unwrap_or(-1) {2}.should == -1
194
+ it 'produces the block result for a wrapped nil with a block' do
195
+ expect(nothing.unwrap_or { 2 }).to eq(2)
153
196
  end
154
197
  end
155
198
 
@@ -159,11 +202,11 @@ describe Wrapped, 'monadic' do
159
202
  let(:nothing) { nil.wrapped }
160
203
 
161
204
  it 'produces the value from #flat_map for a wrapped value' do
162
- just.flat_map {|n| (n+1).wrapped }.unwrap.should == value+1
205
+ expect(just.flat_map {|n| (n+1).wrapped }.unwrap).to eq(value+1)
163
206
  end
164
207
 
165
208
  it 'produces blank from #flat_map for a wrapped nil' do
166
- nothing.flat_map {|n| (n+1).wrapped}.should be_blank
209
+ expect(nothing.flat_map {|n| (n+1).wrapped}).to be_blank
167
210
  end
168
211
  end
169
212
 
@@ -173,32 +216,69 @@ describe Wrapped, 'functor' do
173
216
  let(:nothing) { nil.wrapped }
174
217
 
175
218
  it 'unwraps, applies the block, then re-wraps for a wrapped value' do
176
- just.fmap {|n| n+1}.unwrap.should == value+1
219
+ expect(just.fmap {|n| n+1}.unwrap).to eq(value+1)
177
220
  end
178
221
 
179
222
  it 'produces the blank for a wrapped nil' do
180
- nothing.fmap {|n| n+1}.should be_blank
223
+ expect(nothing.fmap {|n| n+1}).to be_blank
224
+ end
225
+
226
+ it 'obeys the functor law: fmap id == id' do
227
+ expect(fmap(id).(just)).to eq(id.(just))
228
+ end
229
+
230
+ it 'obeys the functor law: fmap (f . g) == fmap f . fmap g' do
231
+ expect(fmap(compose(null, const(nil))).(just)).
232
+ to eq(compose(fmap(null), fmap(const(nil))).(just))
233
+ end
234
+
235
+ def fmap(f)
236
+ lambda { |x| x.fmap(&f) }
237
+ end
238
+
239
+ def const(x)
240
+ lambda { |_| x }
241
+ end
242
+
243
+ def id
244
+ lambda { |x| x }
245
+ end
246
+
247
+ def compose(f, g)
248
+ lambda { |x| f.call(g.call(x)) }
249
+ end
250
+
251
+ def null
252
+ lambda {|x| x.nil? }
181
253
  end
182
254
  end
183
255
 
184
256
  describe Wrapped, 'equality' do
185
257
  it 'is equal with the same wrapped value' do
186
- 1.wrapped.should == 1.wrapped
258
+ expect(1.wrapped).to eq(1.wrapped)
187
259
  end
188
260
 
189
261
  it 'is not equal with a different wrapped value' do
190
- 1.wrapped.should_not == 2.wrapped
262
+ expect(1.wrapped).not_to eq(2.wrapped)
191
263
  end
192
264
 
193
265
  it 'is equal with two wrapped nils' do
194
- nil.wrapped.should == nil.wrapped
266
+ expect(nil.wrapped).to eq(nil.wrapped)
195
267
  end
196
268
 
197
269
  it 'is not equal with a wrapped nil and a wrapped value' do
198
- nil.wrapped.should_not == 1.wrapped
270
+ expect(nil.wrapped).not_to eq(1.wrapped)
199
271
  end
200
272
 
201
273
  it 'is not equal with a wrapped value and a wrapped nil' do
202
- 1.wrapped.should_not == nil.wrapped
274
+ expect(1.wrapped).not_to eq(nil.wrapped)
275
+ end
276
+
277
+ it 'is not equal with a present value and un unwrapped value' do
278
+ expect(1.wrapped).not_to eq(1)
279
+ end
280
+
281
+ it 'is not equal with a blank value and an unwrapped value' do
282
+ expect(nil.wrapped).not_to eq(1)
203
283
  end
204
284
  end
@@ -16,6 +16,6 @@ Gem::Specification.new do |s|
16
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
17
  s.require_paths = ["lib"]
18
18
 
19
- s.add_development_dependency('rspec', '~> 2.3')
20
- s.add_development_dependency('rake')
19
+ s.add_development_dependency("rspec", "~> 3.1.0")
20
+ s.add_development_dependency("rake")
21
21
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wrapped
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Burns
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-29 00:00:00.000000000 Z
11
+ date: 2014-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.3'
19
+ version: 3.1.0
20
20
  type: :development
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.3'
26
+ version: 3.1.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -83,8 +83,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
83
  version: '0'
84
84
  requirements: []
85
85
  rubyforge_project:
86
- rubygems_version: 2.2.2
86
+ rubygems_version: 2.4.2
87
87
  signing_key:
88
88
  specification_version: 4
89
89
  summary: The maybe functor for Ruby
90
- test_files: []
90
+ test_files:
91
+ - spec/spec_helper.rb
92
+ - spec/wrapped_spec.rb