nil_conditional 1.0.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +25 -18
- data/Rakefile +10 -2
- data/lib/nil_conditional.rb +19 -24
- data/nil_conditional.gemspec +12 -11
- data/spec/nil_conditional_spec.rb +5 -4
- data/spec/nil_spec.rb +4 -5
- data/spec/object_spec.rb +10 -10
- data/spec/spec_helper.rb +0 -3
- metadata +17 -4
- data/spec/local_variables_spec.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0fc18e077b2f985f98ac155b7aa1517b02d2b0ca
|
4
|
+
data.tar.gz: 807b525fb2bb0f95665213975d00b9937a4aa9e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8ab231f5f82c32c5fd62b0b3f8078555049cd3d7dc5eb9a2a422d831f9ee48e32e9e819d12ae572a3ba7018af1843771265ae56a1949538f13c7d95dec35150
|
7
|
+
data.tar.gz: 4e1632f12d50a069259c1ea3165d382fa4c258b6fc48252bf1ac7dc19a20e2e59a85cfdf99629c48867b43d4c0b72a0c3d85722c541d8e6cb828126e59d52ff2
|
data/README.md
CHANGED
@@ -16,8 +16,8 @@ Nil Conditional Operator is inspired by Null Conditional Operator introduced in
|
|
16
16
|
|
17
17
|
## Usage
|
18
18
|
|
19
|
-
Use
|
20
|
-
|
19
|
+
Use `?_` method as Nil Conditional Operator.
|
20
|
+
For example: `logger._?.log('some debug information')`
|
21
21
|
|
22
22
|
```ruby
|
23
23
|
|
@@ -25,53 +25,60 @@ Use preceding double underscore and trailing block for local variables (for ex.
|
|
25
25
|
logger.foo.bar.car.cow
|
26
26
|
NoMethodError: undefined method `foo` for #<NilClass>
|
27
27
|
|
28
|
-
# logger is nil
|
29
|
-
|
28
|
+
# logger is nil
|
29
|
+
logger._?.foo.bar.car.cow
|
30
30
|
=> #<NilConditional>
|
31
31
|
|
32
|
-
#
|
33
|
-
|
32
|
+
# logger exists and all methods are valid
|
33
|
+
logger._?.foo.bar.car.cow
|
34
|
+
=> "moooo"
|
35
|
+
|
36
|
+
# logger exists and all methods are valid
|
37
|
+
logger._?.foo.bar.car.cow
|
34
38
|
=> "moooo"
|
35
39
|
|
36
40
|
# logger exists but doesn't have warn method
|
37
|
-
logger.
|
41
|
+
logger._?.warn('some warning')
|
38
42
|
=> #<NilConditional>
|
39
43
|
|
40
|
-
|
41
|
-
|
44
|
+
# logger exists and have warn method, but foo is invalid
|
45
|
+
logger._?.warn('some warning').foo
|
46
|
+
=> NoMethodError: undefined method `foo`
|
42
47
|
|
43
|
-
|
48
|
+
logger._?.warn('some warning')._?.foo
|
44
49
|
=> #<NilConditional>
|
45
50
|
|
46
51
|
Object.new.non_existent_method
|
47
52
|
NoMethodError: undefined method `non_existent_method` for #<Object>
|
48
53
|
|
49
|
-
Object.new.
|
54
|
+
Object.new._?.non_existent_method
|
50
55
|
=> #<NilConditional>
|
51
56
|
|
52
|
-
Object.new.
|
57
|
+
Object.new._?.non_existent_method.nil?
|
53
58
|
=> true
|
54
|
-
|
55
|
-
__new_object.foo.bar.car_?.cow_?
|
56
|
-
=> nil
|
57
59
|
```
|
58
60
|
|
59
|
-
`NilConditional`
|
61
|
+
`NilConditional` instances always return new NilConditional object if method is missing.
|
60
62
|
These objects are also `eql` to `nil`.
|
61
63
|
|
62
64
|
|
63
65
|
## Changelog
|
64
66
|
|
67
|
+
* Changes from version with major 1
|
68
|
+
|
69
|
+
Previous version used different syntax
|
70
|
+
|
65
71
|
* Changes from version with major 0
|
66
72
|
|
67
|
-
Previous version didn't support methods with special characters and there was no support for local variables
|
68
|
-
Previous version used trailing `_?` as NilConditional operator. Current version uses preceding double underscore character `__`.
|
73
|
+
* Previous version didn't support methods with special characters and there was no support for local variables.
|
74
|
+
* Previous version used trailing `_?` as NilConditional operator. Current version uses preceding double underscore character `__`.
|
69
75
|
|
70
76
|
|
71
77
|
## Discussion
|
72
78
|
|
73
79
|
Feel free to submit ideas via issues and discuss better solution to Nil Conditional Operator in Ruby
|
74
80
|
|
81
|
+
|
75
82
|
## License
|
76
83
|
|
77
84
|
This is free software, licensed under MIT License. See LICENSE.txt file.
|
data/Rakefile
CHANGED
@@ -1,5 +1,13 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
2
|
require 'rspec/core/rake_task'
|
3
|
+
require 'rubocop/rake_task'
|
3
4
|
|
4
5
|
RSpec::Core::RakeTask.new('spec')
|
5
|
-
|
6
|
+
RuboCop::RakeTask.new
|
7
|
+
|
8
|
+
task :test do
|
9
|
+
Rake::Task['spec'].invoke
|
10
|
+
Rake::Task['rubocop'].invoke
|
11
|
+
end
|
12
|
+
|
13
|
+
task default: :test
|
data/lib/nil_conditional.rb
CHANGED
@@ -1,34 +1,29 @@
|
|
1
1
|
# NilConditional Operator in Ruby
|
2
2
|
|
3
|
+
# Patch Object class
|
3
4
|
class Object
|
4
|
-
def
|
5
|
-
|
6
|
-
original = name.to_s.sub(/^__/, '').to_sym
|
7
|
-
|
8
|
-
if block_given? && original =~ /^\w+$/
|
9
|
-
binding = Proc.new.binding
|
10
|
-
if binding.local_variable_defined?(original)
|
11
|
-
var = binding.local_variable_get(original)
|
12
|
-
return var unless var.nil?
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
if respond_to?(original)
|
17
|
-
return_value = block_given? ? send(original, *params, &Proc.new) :
|
18
|
-
send(original, *params)
|
19
|
-
return return_value unless return_value.nil?
|
20
|
-
end
|
21
|
-
|
22
|
-
NilConditional.new
|
23
|
-
else
|
24
|
-
super
|
25
|
-
end
|
5
|
+
def _?
|
6
|
+
NilConditional.new(self)
|
26
7
|
end
|
27
8
|
end
|
28
9
|
|
10
|
+
# Nil Conditional class
|
29
11
|
class NilConditional
|
12
|
+
def initialize(object)
|
13
|
+
@object = object
|
14
|
+
end
|
15
|
+
|
30
16
|
def method_missing(name, *params)
|
31
|
-
|
17
|
+
if @object.respond_to?(name)
|
18
|
+
return_value = nil
|
19
|
+
if block_given?
|
20
|
+
return_value = @object.public_send(name, *params, &Proc.new)
|
21
|
+
else
|
22
|
+
return_value = @object.public_send(name, *params)
|
23
|
+
end
|
24
|
+
return return_value unless return_value.nil?
|
25
|
+
end
|
26
|
+
self.class.new(@object)
|
32
27
|
end
|
33
28
|
|
34
29
|
def nil?
|
@@ -36,7 +31,7 @@ class NilConditional
|
|
36
31
|
end
|
37
32
|
|
38
33
|
def ==(other)
|
39
|
-
return true if other
|
34
|
+
return true if other.nil?
|
40
35
|
super
|
41
36
|
end
|
42
37
|
|
data/nil_conditional.gemspec
CHANGED
@@ -3,20 +3,21 @@ lib = File.expand_path('../lib', __FILE__)
|
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
|
-
spec.name =
|
7
|
-
spec.version = '
|
8
|
-
spec.authors = [
|
9
|
-
spec.email = [
|
10
|
-
spec.summary =
|
11
|
-
spec.homepage =
|
12
|
-
spec.license =
|
6
|
+
spec.name = 'nil_conditional'
|
7
|
+
spec.version = '2.0.0'
|
8
|
+
spec.authors = ['Grzegorz Bizon']
|
9
|
+
spec.email = ['grzegorz.bizon@ntsn.pl']
|
10
|
+
spec.summary = 'Nil Conditional Operator in Ruby'
|
11
|
+
spec.homepage = 'http://github.com/grzesiek/nil-conditional'
|
12
|
+
spec.license = 'MIT'
|
13
13
|
|
14
14
|
spec.files = `git ls-files -z`.split("\x0")
|
15
15
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
16
16
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
|
-
spec.require_paths = [
|
17
|
+
spec.require_paths = ['lib']
|
18
18
|
|
19
|
-
spec.add_development_dependency
|
20
|
-
spec.add_development_dependency
|
21
|
-
spec.add_development_dependency
|
19
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
20
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
21
|
+
spec.add_development_dependency 'rspec', '~> 3.2.0'
|
22
|
+
spec.add_development_dependency 'rubocop', '~> 0.30.0'
|
22
23
|
end
|
@@ -1,15 +1,16 @@
|
|
1
1
|
describe NilConditional do
|
2
2
|
context 'nil value' do
|
3
3
|
it 'should be considered as nil' do
|
4
|
-
expect(NilConditional.new.nil?).to be(true)
|
5
|
-
expect(NilConditional.new).to eq(nil)
|
6
|
-
expect(NilConditional.new).to eql(nil)
|
4
|
+
expect(NilConditional.new(Object.new).nil?).to be(true)
|
5
|
+
expect(NilConditional.new(Object.new)).to eq(nil)
|
6
|
+
expect(NilConditional.new(Object.new)).to eql(nil)
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
10
|
context 'missing method behavior' do
|
11
11
|
it 'return new NilConditional object when method is missing' do
|
12
|
-
|
12
|
+
conditional = NilConditional.new(Object.new)
|
13
|
+
expect(conditional.non_existent_method).to be_a(NilConditional)
|
13
14
|
end
|
14
15
|
end
|
15
16
|
end
|
data/spec/nil_spec.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
describe 'nil object' do
|
2
2
|
context 'local variable' do
|
3
3
|
it 'should return nil conditional if var is nil' do
|
4
|
-
|
5
|
-
expect(__var{}).to be_a(NilConditional)
|
4
|
+
expect(nil._?).to be_a(NilConditional)
|
6
5
|
end
|
7
6
|
end
|
8
7
|
|
@@ -13,11 +12,11 @@ describe 'nil object' do
|
|
13
12
|
|
14
13
|
it 'should return NilConditional instance when method return nil' do
|
15
14
|
expect(Object.nil_test).to be nil
|
16
|
-
expect(Object.new.
|
15
|
+
expect(Object.new._?.nil_test).to be_a(NilConditional)
|
17
16
|
end
|
18
17
|
|
19
|
-
it 'should return NilConditional
|
20
|
-
expect(Object.new.
|
18
|
+
it 'should return NilConditional when method returns nil using block' do
|
19
|
+
expect(Object.new._?.nil_test {}).to be_a(NilConditional)
|
21
20
|
end
|
22
21
|
end
|
23
22
|
end
|
data/spec/object_spec.rb
CHANGED
@@ -4,27 +4,27 @@ describe Object do
|
|
4
4
|
expect { Object.new.test_method }.to raise_error(NoMethodError)
|
5
5
|
end
|
6
6
|
|
7
|
-
it 'should not raise error when receiving
|
8
|
-
expect { Object.new.
|
7
|
+
it 'should not raise error when receiving test_method' do
|
8
|
+
expect { Object.new._?.test_method }.to_not raise_error
|
9
9
|
end
|
10
10
|
|
11
|
-
it 'should return NilConditional instance when received
|
12
|
-
expect(Object.new.
|
11
|
+
it 'should return NilConditional instance when received unknown method' do
|
12
|
+
expect(Object.new._?.test_method).to be_a(NilConditional)
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'should support chained methods with nil conditional' do
|
16
|
-
expect { Object.new.
|
17
|
-
expect(Object.new.
|
16
|
+
expect { Object.new._?.test_method.foo.bar.car.cow }.to_not raise_error
|
17
|
+
expect(Object.new._?.test_method.foo.bar.car.cow).to be_a(NilConditional)
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'should support methods with arguments' do
|
21
|
-
expect { Object.
|
22
|
-
expect(Object.
|
21
|
+
expect { Object._?.test_method_with_args(1, 2, 3) }.to_not raise_error
|
22
|
+
expect(Object._?.test_method_with_args(1, 2, 3)).to be_a(NilConditional)
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'should support methods with blocks' do
|
26
|
-
expect(Object.
|
27
|
-
expect(
|
26
|
+
expect(Object._?.test_with_block { 'test' }).to be_a(NilConditional)
|
27
|
+
expect(%w(a b)._?.delete_if { |i| i == 'b' }).to eq(['a'])
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nil_conditional
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Grzegorz Bizon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 3.2.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubocop
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.30.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.30.0
|
55
69
|
description:
|
56
70
|
email:
|
57
71
|
- grzegorz.bizon@ntsn.pl
|
@@ -68,7 +82,6 @@ files:
|
|
68
82
|
- Rakefile
|
69
83
|
- lib/nil_conditional.rb
|
70
84
|
- nil_conditional.gemspec
|
71
|
-
- spec/local_variables_spec.rb
|
72
85
|
- spec/nil_conditional_spec.rb
|
73
86
|
- spec/nil_spec.rb
|
74
87
|
- spec/object_spec.rb
|
@@ -98,8 +111,8 @@ signing_key:
|
|
98
111
|
specification_version: 4
|
99
112
|
summary: Nil Conditional Operator in Ruby
|
100
113
|
test_files:
|
101
|
-
- spec/local_variables_spec.rb
|
102
114
|
- spec/nil_conditional_spec.rb
|
103
115
|
- spec/nil_spec.rb
|
104
116
|
- spec/object_spec.rb
|
105
117
|
- spec/spec_helper.rb
|
118
|
+
has_rdoc:
|
@@ -1,20 +0,0 @@
|
|
1
|
-
describe 'local variables' do
|
2
|
-
context 'test variable' do
|
3
|
-
it 'should raise error when using non existent test variable' do
|
4
|
-
expect { test_variable }.to raise_error(NameError)
|
5
|
-
end
|
6
|
-
|
7
|
-
it 'should not raise error when using __test_variable{}' do
|
8
|
-
expect { __test_variable{} }.to_not raise_error
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'should return NilConditional instance when using non existent var with preceding __ and trailing block' do
|
12
|
-
expect(__test_variable{}).to be_a(NilConditional)
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'should support chained methods with nil conditional' do
|
16
|
-
expect { __test_variable{}.foo_?.bar_?.car_?.cow_? }.to_not raise_error
|
17
|
-
expect(__test_variable{}.foo_?.bar_?.car_?.cow_?).to be_a(NilConditional)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|