hexx 3.0.0 → 3.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 +4 -4
- data/lib/hexx/null.rb +210 -0
- data/lib/hexx/version.rb +1 -1
- data/spec/hexx/null_spec.rb +104 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3e5d03628aadfc3fbfda454f834e2f573658bf6
|
4
|
+
data.tar.gz: 0ddf399a8ff32c8d78e3aa2a245e4e4f2434fc73
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c686b91c627deacdadd1102ea9742d4dea28a5842bec1536a58ffe448939c9d0bd3876a54e59dd9bb27c2cf7324140e20f060c3f63507980c6d1c8bade31367
|
7
|
+
data.tar.gz: 95cadea3c85273d9a0d5431508d7c3c1d98f2dfcd17b563fe06e22560f248f1f35b066d6f81eb55507d800aa9f7a4bf994197dee358adae25438b5daa7daf21e
|
data/lib/hexx/null.rb
ADDED
@@ -0,0 +1,210 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Hexx
|
4
|
+
|
5
|
+
# The Null object class.
|
6
|
+
# @see http://robots.thoughtbot.com/rails-refactoring-example-introduce-null-object
|
7
|
+
# The intro to null object pattern from Dan Croak.
|
8
|
+
# @see http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/
|
9
|
+
# The post of Avdi Grimm on null object falsiness problem.
|
10
|
+
#
|
11
|
+
# Except for some special cases (see examples below) calling any method
|
12
|
+
# returns the +Null+ itself.
|
13
|
+
#
|
14
|
+
# @note (see Hexx::Null.!)
|
15
|
+
# @example (see Hexx::Null.method_missing)
|
16
|
+
# @example (see Hexx::Null.new)
|
17
|
+
# @example (see Hexx::Null.nil?)
|
18
|
+
# @example (see Hexx::Null.eq?)
|
19
|
+
# @example (see Hexx::Null.<=>)
|
20
|
+
# @example (see Hexx::Null.false?)
|
21
|
+
# @example (see Hexx::Null.true?)
|
22
|
+
# @example (see Hexx::Null.!)
|
23
|
+
# @example (see Hexx::Null.to_a)
|
24
|
+
# @example (see Hexx::Null.to_h)
|
25
|
+
# @example (see Hexx::Null.to_s)
|
26
|
+
# @example (see Hexx::Null.to_i)
|
27
|
+
# @example (see Hexx::Null.to_f)
|
28
|
+
# @example (see Hexx::Null.to_c)
|
29
|
+
# @example (see Hexx::Null.to_r)
|
30
|
+
# @example (see Hexx::Null.to_nil)
|
31
|
+
class Null
|
32
|
+
class << self
|
33
|
+
include Comparable
|
34
|
+
|
35
|
+
# The constructor constructs itself.
|
36
|
+
#
|
37
|
+
# @example The +Null+ object constructs itself.
|
38
|
+
# Null.new
|
39
|
+
# # => Null
|
40
|
+
#
|
41
|
+
# @return [Class] +Null+.
|
42
|
+
def new
|
43
|
+
self
|
44
|
+
end
|
45
|
+
|
46
|
+
# Checks if +Null+ is equal to other object.
|
47
|
+
#
|
48
|
+
# @example The +Null+ is equal to +nil+.
|
49
|
+
# Null.eq? nil # => true
|
50
|
+
# Null.eq? Null # => true
|
51
|
+
#
|
52
|
+
# @example The +Null+ differs from non-nil
|
53
|
+
# Null.eq? 0 # => false
|
54
|
+
# Null.eq? false # => false
|
55
|
+
#
|
56
|
+
# @param [Object] other The other object to compare to Null.
|
57
|
+
# @return [Boolean] The result of comparison.
|
58
|
+
def eq?(other)
|
59
|
+
other.nil?
|
60
|
+
end
|
61
|
+
|
62
|
+
# Compares the +Null+ to other object.
|
63
|
+
#
|
64
|
+
# @example The +Null+ is less than non-nil object:
|
65
|
+
# Null < 0 # => true
|
66
|
+
# Null < "" # => true
|
67
|
+
# Null < false # => true
|
68
|
+
#
|
69
|
+
# @param [Object] other The other object to compare to Null.
|
70
|
+
# @return [-1, 0] The result of comparison.
|
71
|
+
def <=>(other)
|
72
|
+
other.nil? ? 0 : -1
|
73
|
+
end
|
74
|
+
|
75
|
+
# Checks if the +Null+ is nil.
|
76
|
+
#
|
77
|
+
# @example The +Null+ is nil.
|
78
|
+
# Null.nil? # => true
|
79
|
+
#
|
80
|
+
# @return [Boolean] +true+.
|
81
|
+
def nil?
|
82
|
+
true
|
83
|
+
end
|
84
|
+
|
85
|
+
# Checks if the +Null+ is falseу.
|
86
|
+
#
|
87
|
+
# @example The +Null+ is falseу.
|
88
|
+
# Null.false? # => true
|
89
|
+
#
|
90
|
+
# @example The +Null+ isn't false in logical operations
|
91
|
+
# false || Null # => Null
|
92
|
+
#
|
93
|
+
# @return [Boolean] +true+.
|
94
|
+
def false?
|
95
|
+
true
|
96
|
+
end
|
97
|
+
|
98
|
+
# Converts nil to true.
|
99
|
+
#
|
100
|
+
# @note In Ruby the only objects that are +false+ are +nil+ and +false+.
|
101
|
+
# Use the double bang before any object that may be the +Null+.
|
102
|
+
#
|
103
|
+
# @example The +Null+ is convertible to +true+.
|
104
|
+
# !Null # => true
|
105
|
+
#
|
106
|
+
# @example Use a double bang before objects that may be the +Null+.
|
107
|
+
# Null && true # => true
|
108
|
+
# !!Null && true # => false
|
109
|
+
#
|
110
|
+
# @return [Boolean] +true+.
|
111
|
+
def !
|
112
|
+
true
|
113
|
+
end
|
114
|
+
|
115
|
+
# Checks if the +Null+ is truthy.
|
116
|
+
#
|
117
|
+
# @example The +Null+ isn't truthy.
|
118
|
+
# Null.true? # => false
|
119
|
+
#
|
120
|
+
# @example The +Null+ is truthy in logical operations.
|
121
|
+
# true && Null # => Null
|
122
|
+
#
|
123
|
+
# @return [Boolean] +false+.
|
124
|
+
def true?
|
125
|
+
false
|
126
|
+
end
|
127
|
+
|
128
|
+
# Converts the +Null+ to the empty string.
|
129
|
+
#
|
130
|
+
# @example The +Null+ is convertible to the empty string.
|
131
|
+
# Null.to_s # => ""
|
132
|
+
#
|
133
|
+
# @return [String] The empty string.
|
134
|
+
def to_s
|
135
|
+
""
|
136
|
+
end
|
137
|
+
|
138
|
+
# Converts the +Null+ to +nil+.
|
139
|
+
#
|
140
|
+
# @example The +Null+ is convertible to +nil+.
|
141
|
+
# Null.to_nil # => nil
|
142
|
+
#
|
143
|
+
# @return [NilClass] +nil+.
|
144
|
+
def to_nil
|
145
|
+
nil
|
146
|
+
end
|
147
|
+
|
148
|
+
# @!method to_a
|
149
|
+
# Converts the +Null+ to the empty array.
|
150
|
+
# @example The +Null+ is convertible to the empty array.
|
151
|
+
# Null.to_a # => []
|
152
|
+
# @return [Array] the empty array.
|
153
|
+
|
154
|
+
# @!method to_i
|
155
|
+
# Converts the +Null+ to zero as an integer.
|
156
|
+
# @example The +Null+ is convertible to zero as an integer.
|
157
|
+
# Null.to_i # => 0
|
158
|
+
# @return [Integer] zero.
|
159
|
+
|
160
|
+
# @!method to_f
|
161
|
+
# Converts the +Null+ to zero as a float.
|
162
|
+
# @example The +Null+ is convertible to zero as a float.
|
163
|
+
# Null.to_f # => 0.0
|
164
|
+
# @return [Float] zero.
|
165
|
+
|
166
|
+
# @!method to_c
|
167
|
+
# Converts the +Null+ to zero as a complex.
|
168
|
+
# @example The +Null+ is convertible to zero as a complex.
|
169
|
+
# Null.to_c # => (0+0i)
|
170
|
+
# @return [Complex] zero.
|
171
|
+
|
172
|
+
# @!method to_r
|
173
|
+
# Converts the +Null+ to zero as a rational.
|
174
|
+
# @example The +Null+ is convertible to zero as a rational.
|
175
|
+
# Null.to_c # => (0/1)
|
176
|
+
# @return [Rational] zero.
|
177
|
+
|
178
|
+
# Checks if a method defined.
|
179
|
+
#
|
180
|
+
# @example The +Null+ responds to any object.
|
181
|
+
# Null.respond_to? arbitrary_method
|
182
|
+
# # => true
|
183
|
+
#
|
184
|
+
# @return [Boolean] +true+.
|
185
|
+
def respond_to?(*)
|
186
|
+
true
|
187
|
+
end
|
188
|
+
|
189
|
+
private
|
190
|
+
|
191
|
+
# @api hide
|
192
|
+
# @example An arbitrary method returns the +Null+ itself.
|
193
|
+
# Null.is_an_eagle_owl? # => Null
|
194
|
+
# Null.is_an_elk? # => Null
|
195
|
+
# Null.fly # => Null
|
196
|
+
# # ... etc.
|
197
|
+
#
|
198
|
+
# @example An arbitrary method called with a block yields the block.
|
199
|
+
# Null.when_fishing { p "I've got it!" }
|
200
|
+
# # => "I've got it!"
|
201
|
+
# # => Null
|
202
|
+
#
|
203
|
+
def method_missing(name, *args, &block)
|
204
|
+
return nil.send(name, *args, &block) if nil.respond_to?(name)
|
205
|
+
block.call if block_given?
|
206
|
+
self
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
data/lib/hexx/version.rb
CHANGED
@@ -0,0 +1,104 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
module Hexx
|
5
|
+
describe Null do
|
6
|
+
|
7
|
+
subject { Null }
|
8
|
+
|
9
|
+
describe ".new" do
|
10
|
+
|
11
|
+
it "constructs itself" do
|
12
|
+
expect(Null.new).to eq Null
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "arbitrary method" do
|
17
|
+
|
18
|
+
it "is defined" do
|
19
|
+
expect(Null).to respond_to :drag_and_drop
|
20
|
+
end
|
21
|
+
|
22
|
+
it "yields a block" do
|
23
|
+
test = double :test, check: nil
|
24
|
+
expect(test).to receive :check
|
25
|
+
Null.when_fishing { test.check }
|
26
|
+
end
|
27
|
+
|
28
|
+
it "returns itself" do
|
29
|
+
expect(Null.is_an_eagle_owl?).to eq Null
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it "equals nil" do
|
34
|
+
expect(Null).to eq nil
|
35
|
+
expect(Null).to be_nil
|
36
|
+
end
|
37
|
+
|
38
|
+
it "equals Null" do
|
39
|
+
expect(Null.eq? Null).to be_truthy
|
40
|
+
end
|
41
|
+
|
42
|
+
it "is less than any other object" do
|
43
|
+
expect(Null).to be < -1
|
44
|
+
expect(Null).to be < false
|
45
|
+
expect(Null).to be < true
|
46
|
+
expect(Null).to be < ""
|
47
|
+
end
|
48
|
+
|
49
|
+
it "is falsey" do
|
50
|
+
expect(Null).to be_falsey
|
51
|
+
expect(Null).not_to be_truthy
|
52
|
+
expect(!Null).to eq true
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#to_a" do
|
56
|
+
|
57
|
+
it "returns the empty array" do
|
58
|
+
expect(Null.to_a).to eq []
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#to_h" do
|
63
|
+
|
64
|
+
it "returns the empty hash" do
|
65
|
+
expect(Null.to_h).to eq({})
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "#to_s" do
|
70
|
+
|
71
|
+
it "returns the empty string" do
|
72
|
+
expect(Null.to_s).to eq ""
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "#to_i" do
|
77
|
+
|
78
|
+
it "returns zero as an integer" do
|
79
|
+
expect(Null.to_i).to eq 0
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "#to_f" do
|
84
|
+
|
85
|
+
it "returns zero as a float" do
|
86
|
+
expect(Null.to_f).to eq 0.0
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "#to_c" do
|
91
|
+
|
92
|
+
it "returns zero as a complex" do
|
93
|
+
expect(Null.to_c).to eq 0.to_c
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#to_r" do
|
98
|
+
|
99
|
+
it "returns zero as a rational" do
|
100
|
+
expect(Null.to_r).to eq 0.to_r
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hexx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kozin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -151,6 +151,7 @@ files:
|
|
151
151
|
- lib/hexx.rb
|
152
152
|
- lib/hexx/models.rb
|
153
153
|
- lib/hexx/models/base_coercer.rb
|
154
|
+
- lib/hexx/null.rb
|
154
155
|
- lib/hexx/service.rb
|
155
156
|
- lib/hexx/service/invalid.rb
|
156
157
|
- lib/hexx/service/message.rb
|
@@ -158,6 +159,7 @@ files:
|
|
158
159
|
- lib/hexx/service/with_callbacks.rb
|
159
160
|
- lib/hexx/version.rb
|
160
161
|
- spec/hexx/models_spec.rb
|
162
|
+
- spec/hexx/null_spec.rb
|
161
163
|
- spec/hexx/service/invalid_spec.rb
|
162
164
|
- spec/hexx/service/message_spec.rb
|
163
165
|
- spec/hexx/service_spec.rb
|
@@ -194,6 +196,7 @@ summary: Service objects for Rails.
|
|
194
196
|
test_files:
|
195
197
|
- spec/spec_helper.rb
|
196
198
|
- spec/hexx/service_spec.rb
|
199
|
+
- spec/hexx/null_spec.rb
|
197
200
|
- spec/hexx/service/message_spec.rb
|
198
201
|
- spec/hexx/service/invalid_spec.rb
|
199
202
|
- spec/hexx/models_spec.rb
|