optional 0.0.6 → 0.0.7
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.
- data/.travis.yml +6 -0
- data/Gemfile.lock +3 -1
- data/README.md +8 -0
- data/Rakefile +8 -0
- data/lib/optional.rb +7 -1
- data/lib/optional/option/enumerable.rb +1 -1
- data/lib/optional/option/match.rb +2 -2
- data/lib/optional/some.rb +1 -1
- data/optional.gemspec +2 -1
- data/spec/lib/optional/option/enumerable_spec.rb +2 -7
- data/spec/lib/optional/option/match_spec.rb +0 -0
- data/spec/lib/optional/option_spec.rb +2 -2
- data/spec/spec_helper.rb +2 -2
- metadata +77 -46
data/.travis.yml
ADDED
data/Gemfile.lock
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
optional (0.0.
|
4
|
+
optional (0.0.6)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
9
|
diff-lcs (1.2.1)
|
10
10
|
multi_json (1.7.2)
|
11
|
+
rake (10.0.4)
|
11
12
|
rspec (2.13.0)
|
12
13
|
rspec-core (~> 2.13.0)
|
13
14
|
rspec-expectations (~> 2.13.0)
|
@@ -26,5 +27,6 @@ PLATFORMS
|
|
26
27
|
|
27
28
|
DEPENDENCIES
|
28
29
|
optional!
|
30
|
+
rake
|
29
31
|
rspec
|
30
32
|
simplecov
|
data/README.md
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# optional
|
2
2
|
## option types to make nils a thing of the past
|
3
3
|
|
4
|
+
[](https://travis-ci.org/rsslldnphy/optional)
|
5
|
+
[](https://codeclimate.com/github/rsslldnphy/optional)
|
6
|
+
|
4
7
|
Tony Hoare, inventor of the null reference, calls it his "billion-dollar mistake".
|
5
8
|
You will be no stranger to the ubiquitous `NoMethodError: undefined method 'foo' for nil:NilClass`.
|
6
9
|
But it doesn't have to be this way.
|
@@ -114,6 +117,11 @@ You can simply use the `collection` key when rendering the partial - you don't e
|
|
114
117
|
|
115
118
|
<%= render partial: 'hat', collection: @person.hat %>
|
116
119
|
|
120
|
+
You can also use `select` and `reject` to assert things about the value:
|
121
|
+
|
122
|
+
Some[5].select(&:odd?) # => Some[5]
|
123
|
+
Some[5].reject(&:odd?) # => None
|
124
|
+
|
117
125
|
And one last useful example, `flatten`:
|
118
126
|
|
119
127
|
Some[Some[5], None, Some[7]].flatten # => Some[5,7]
|
data/Rakefile
ADDED
data/lib/optional.rb
CHANGED
@@ -42,7 +42,7 @@ module Option
|
|
42
42
|
|
43
43
|
class SomeClause
|
44
44
|
|
45
|
-
def initialize(guard=always, block)
|
45
|
+
def initialize(guard=always, block=lambda{})
|
46
46
|
@guard = guard
|
47
47
|
@block = block
|
48
48
|
end
|
@@ -60,7 +60,7 @@ module Option
|
|
60
60
|
attr_reader :block
|
61
61
|
|
62
62
|
def guard
|
63
|
-
@guard.is_a?(Proc) ? @guard :
|
63
|
+
@guard.is_a?(Proc) ? @guard : (lambda { |x| x == @guard })
|
64
64
|
end
|
65
65
|
|
66
66
|
end
|
data/lib/optional/some.rb
CHANGED
@@ -37,7 +37,7 @@ class Some
|
|
37
37
|
|
38
38
|
def merge(other, &block)
|
39
39
|
other.match do |m|
|
40
|
-
m.some { |v| block.nil? ? Some[
|
40
|
+
m.some { |v| block.nil? ? Some[([value] + [v]).flatten] : Some[block.call(value, v)] }
|
41
41
|
m.none { self }
|
42
42
|
end
|
43
43
|
end
|
data/optional.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'optional'
|
3
|
-
s.version = '0.0.
|
3
|
+
s.version = '0.0.7'
|
4
4
|
s.date = '2013-04-19'
|
5
5
|
s.summary = "Optional values with pattern matching"
|
6
6
|
s.description = "Make nils a thing of the past with Options!"
|
@@ -11,6 +11,7 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.require_paths = ["lib"]
|
12
12
|
s.homepage = 'http://github.com/rsslldnphy/optional'
|
13
13
|
|
14
|
+
s.add_development_dependency "rake"
|
14
15
|
s.add_development_dependency "rspec"
|
15
16
|
s.add_development_dependency "simplecov"
|
16
17
|
|
@@ -43,14 +43,9 @@ describe Option::Enumerable do
|
|
43
43
|
end
|
44
44
|
|
45
45
|
describe "#flat_map" do
|
46
|
-
it 'works as expected over an array of options' do
|
47
|
-
[None, Some[3], None, Some[2]].flat_map do |x|
|
48
|
-
x.map(&:succ)
|
49
|
-
end.should eq [4,3]
|
50
|
-
end
|
51
46
|
|
52
|
-
it '
|
53
|
-
x = Some[stub(y
|
47
|
+
it 'works for a some that returns a nested some' do
|
48
|
+
x = Some[stub(:y => Some[4])]
|
54
49
|
x.flat_map(&:y).should eq Some[4]
|
55
50
|
end
|
56
51
|
end
|
File without changes
|
@@ -33,8 +33,8 @@ describe Option do
|
|
33
33
|
|
34
34
|
it "can take a lambda as a guard to match against" do
|
35
35
|
Some[cat].match do |m|
|
36
|
-
m.some
|
37
|
-
m.some
|
36
|
+
m.some lambda { |pet| pet.name == "DOGGIE!" } do :fishsticks end
|
37
|
+
m.some lambda { |pet| pet.name == "MOGGIE!" } do :canteloupe end
|
38
38
|
end.should eq :canteloupe
|
39
39
|
end
|
40
40
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,62 +1,83 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: optional
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 7
|
10
|
+
version: 0.0.7
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Russell Dunphy
|
9
14
|
- Radek Molenda
|
10
15
|
autorequire:
|
11
16
|
bindir: bin
|
12
17
|
cert_chain: []
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
+
|
19
|
+
date: 2013-04-19 00:00:00 Z
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rake
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
18
25
|
none: false
|
19
|
-
requirements:
|
20
|
-
- -
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
23
33
|
type: :development
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rspec
|
24
37
|
prerelease: false
|
25
|
-
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
26
39
|
none: false
|
27
|
-
requirements:
|
28
|
-
- -
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
none: false
|
35
|
-
requirements:
|
36
|
-
- - ! '>='
|
37
|
-
- !ruby/object:Gem::Version
|
38
|
-
version: '0'
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
39
47
|
type: :development
|
48
|
+
version_requirements: *id002
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: simplecov
|
40
51
|
prerelease: false
|
41
|
-
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
42
53
|
none: false
|
43
|
-
requirements:
|
44
|
-
- -
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
type: :development
|
62
|
+
version_requirements: *id003
|
47
63
|
description: Make nils a thing of the past with Options!
|
48
|
-
email:
|
64
|
+
email:
|
49
65
|
- russell@russelldunphy.com
|
50
66
|
- radek.molenda@gmail.com
|
51
67
|
executables: []
|
68
|
+
|
52
69
|
extensions: []
|
70
|
+
|
53
71
|
extra_rdoc_files: []
|
54
|
-
|
72
|
+
|
73
|
+
files:
|
55
74
|
- .gitignore
|
75
|
+
- .travis.yml
|
56
76
|
- Gemfile
|
57
77
|
- Gemfile.lock
|
58
78
|
- LICENSE.md
|
59
79
|
- README.md
|
80
|
+
- Rakefile
|
60
81
|
- lib/optional.rb
|
61
82
|
- lib/optional/all.rb
|
62
83
|
- lib/optional/none.rb
|
@@ -69,39 +90,49 @@ files:
|
|
69
90
|
- optional.gemspec
|
70
91
|
- spec/lib/optional/none_spec.rb
|
71
92
|
- spec/lib/optional/option/enumerable_spec.rb
|
93
|
+
- spec/lib/optional/option/match_spec.rb
|
72
94
|
- spec/lib/optional/option_spec.rb
|
73
95
|
- spec/lib/optional/some_spec.rb
|
74
96
|
- spec/spec_helper.rb
|
75
97
|
- spec/support/cat.rb
|
76
98
|
homepage: http://github.com/rsslldnphy/optional
|
77
99
|
licenses: []
|
100
|
+
|
78
101
|
post_install_message:
|
79
102
|
rdoc_options: []
|
80
|
-
|
103
|
+
|
104
|
+
require_paths:
|
81
105
|
- lib
|
82
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
107
|
none: false
|
84
|
-
requirements:
|
85
|
-
- -
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
|
88
|
-
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
hash: 3
|
112
|
+
segments:
|
113
|
+
- 0
|
114
|
+
version: "0"
|
115
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
116
|
none: false
|
90
|
-
requirements:
|
91
|
-
- -
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
hash: 3
|
121
|
+
segments:
|
122
|
+
- 0
|
123
|
+
version: "0"
|
94
124
|
requirements: []
|
125
|
+
|
95
126
|
rubyforge_project:
|
96
127
|
rubygems_version: 1.8.25
|
97
128
|
signing_key:
|
98
129
|
specification_version: 3
|
99
130
|
summary: Optional values with pattern matching
|
100
|
-
test_files:
|
131
|
+
test_files:
|
101
132
|
- spec/lib/optional/none_spec.rb
|
102
133
|
- spec/lib/optional/option/enumerable_spec.rb
|
134
|
+
- spec/lib/optional/option/match_spec.rb
|
103
135
|
- spec/lib/optional/option_spec.rb
|
104
136
|
- spec/lib/optional/some_spec.rb
|
105
137
|
- spec/spec_helper.rb
|
106
138
|
- spec/support/cat.rb
|
107
|
-
has_rdoc:
|