value 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.
- data/README +3 -0
- data/Rakefile +9 -0
- data/lib/value/version.rb +5 -0
- data/lib/value.rb +49 -0
- data/test/unit/value.rb +82 -0
- metadata +117 -0
data/README
ADDED
data/Rakefile
ADDED
data/lib/value.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
class Value
|
4
|
+
autoload :Version, 'value/version'
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def values(*values)
|
8
|
+
if values.empty?
|
9
|
+
raise RuntimeError,
|
10
|
+
'no values have been set for class: %p' % self if not defined? @values
|
11
|
+
@values
|
12
|
+
else
|
13
|
+
@values ||= []
|
14
|
+
@values.concat values.map{ |value| value.to_sym }.tap{ |symbols|
|
15
|
+
attr_reader(*symbols)
|
16
|
+
protected(*symbols)
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(*arguments)
|
23
|
+
raise ArgumentError,
|
24
|
+
'wrong number of arguments (%d for %d)' %
|
25
|
+
[arguments.length, self.class.values.length] if
|
26
|
+
arguments.length != self.class.values.length
|
27
|
+
self.class.values.each_with_index do |value, index|
|
28
|
+
instance_variable_set :"@#{value}", arguments[index]
|
29
|
+
end
|
30
|
+
freeze
|
31
|
+
end
|
32
|
+
|
33
|
+
def ==(other)
|
34
|
+
self.class == other.class and
|
35
|
+
self.class.values.all?{ |value| send(value) == other.send(value) }
|
36
|
+
end
|
37
|
+
|
38
|
+
alias eql? ==
|
39
|
+
|
40
|
+
def hash
|
41
|
+
self.class.hash ^ self.class.values.map{ |value| send(value) }.hash
|
42
|
+
end
|
43
|
+
|
44
|
+
def inspect
|
45
|
+
'%s.new(%s)' %
|
46
|
+
[self.class,
|
47
|
+
self.class.values.map{ |value| send(value).inspect }.join(', ')]
|
48
|
+
end
|
49
|
+
end
|
data/test/unit/value.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
Expectations do
|
4
|
+
expect RuntimeError.new(/\Ano values have been set for class: /) do
|
5
|
+
Class.new(Value).values
|
6
|
+
end
|
7
|
+
|
8
|
+
expect [:a, :b, :c] do
|
9
|
+
Class.new(Value).values(:a, :b, :c)
|
10
|
+
end
|
11
|
+
|
12
|
+
expect [:a, :b, :c] do
|
13
|
+
Class.new(Value).tap{ |c| c.values :a, :b }.values(:c)
|
14
|
+
end
|
15
|
+
|
16
|
+
expect ArgumentError.new('wrong number of arguments (0 for 1)') do
|
17
|
+
Class.new(Value).tap{ |c| c.values :a }.new
|
18
|
+
end
|
19
|
+
|
20
|
+
expect ArgumentError.new('wrong number of arguments (2 for 1)') do
|
21
|
+
Class.new(Value).tap{ |c| c.values :a }.new(1, 2)
|
22
|
+
end
|
23
|
+
|
24
|
+
expect Class.new(Value) do |c|
|
25
|
+
c.tap{ |c| c.values :a }.new(1)
|
26
|
+
end
|
27
|
+
|
28
|
+
expect true do
|
29
|
+
Class.new(Value).tap{ |c| c.values :a }.new(1).frozen?
|
30
|
+
end
|
31
|
+
|
32
|
+
expect NoMethodError do
|
33
|
+
Class.new(Value).tap{ |c| c.values :a }.new(1).a
|
34
|
+
end
|
35
|
+
|
36
|
+
expect 1 do
|
37
|
+
Class.new(Value).tap{ |c| c.values :a }.new(1).instance_eval{ a }
|
38
|
+
end
|
39
|
+
|
40
|
+
expect 1 do
|
41
|
+
Class.new(Value).tap{ |c| c.values :a }.new(1).instance_variable_get(:@a)
|
42
|
+
end
|
43
|
+
|
44
|
+
expect true do
|
45
|
+
c = Class.new(Value).tap{ |c| c.values :a, :b, :c }
|
46
|
+
c.new(1, 2, 3) == c.new(1, 2, 3)
|
47
|
+
end
|
48
|
+
|
49
|
+
expect false do
|
50
|
+
c = Class.new(Value).tap{ |c| c.values :a, :b, :c }
|
51
|
+
c.new(1, 2, 3) == c.new(2, 3, 1)
|
52
|
+
end
|
53
|
+
|
54
|
+
expect true do
|
55
|
+
c = Class.new(Value).tap{ |c| c.values :a, :b, :c }
|
56
|
+
c.new(1, 2, 3).eql? c.new(1, 2, 3)
|
57
|
+
end
|
58
|
+
|
59
|
+
expect false do
|
60
|
+
c = Class.new(Value).tap{ |c| c.values :a, :b, :c }
|
61
|
+
c.new(1, 2, 3).eql? c.new(2, 3, 1)
|
62
|
+
end
|
63
|
+
|
64
|
+
expect true do
|
65
|
+
c = Class.new(Value).tap{ |c| c.values :a, :b, :c }
|
66
|
+
c.new(1, 2, 3).hash == c.new(1, 2, 3).hash
|
67
|
+
end
|
68
|
+
|
69
|
+
expect false do
|
70
|
+
c = Class.new(Value).tap{ |c| c.values :a, :b, :c }
|
71
|
+
c.new(1, 2, 3).hash == c.new(2, 3, 1).hash
|
72
|
+
end
|
73
|
+
|
74
|
+
expect false do
|
75
|
+
c = Class.new(Value).tap{ |c| c.values :a, :b, :c }
|
76
|
+
c.new(1, 2, 3).hash == [1, 2, 3].hash
|
77
|
+
end
|
78
|
+
|
79
|
+
expect(/\A#<Class:0x[[:xdigit:]]+>\.new\(1, 2, 3\)\z/) do
|
80
|
+
Class.new(Value).tap{ |c| c.values :a, :b, :c }.new(1, 2, 3).inspect
|
81
|
+
end
|
82
|
+
end
|
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: value
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Nikolai Weibull
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-09-05 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: lookout
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 2
|
32
|
+
- 0
|
33
|
+
version: "2.0"
|
34
|
+
type: :development
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rbtags
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 27
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
- 1
|
48
|
+
- 0
|
49
|
+
version: 0.1.0
|
50
|
+
type: :development
|
51
|
+
version_requirements: *id002
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: yard
|
54
|
+
prerelease: false
|
55
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ~>
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
hash: 3
|
61
|
+
segments:
|
62
|
+
- 0
|
63
|
+
- 7
|
64
|
+
- 0
|
65
|
+
version: 0.7.0
|
66
|
+
type: :development
|
67
|
+
version_requirements: *id003
|
68
|
+
description: " Value\n\n Value is a library for defining value objects in Ruby.\n"
|
69
|
+
email: now@bitwi.se
|
70
|
+
executables: []
|
71
|
+
|
72
|
+
extensions: []
|
73
|
+
|
74
|
+
extra_rdoc_files: []
|
75
|
+
|
76
|
+
files:
|
77
|
+
- lib/value/version.rb
|
78
|
+
- lib/value.rb
|
79
|
+
- test/unit/value.rb
|
80
|
+
- README
|
81
|
+
- Rakefile
|
82
|
+
has_rdoc: true
|
83
|
+
homepage: http://github.com/now/value
|
84
|
+
licenses: []
|
85
|
+
|
86
|
+
post_install_message:
|
87
|
+
rdoc_options: []
|
88
|
+
|
89
|
+
require_paths:
|
90
|
+
- lib
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
hash: 3
|
97
|
+
segments:
|
98
|
+
- 0
|
99
|
+
version: "0"
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
hash: 3
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
version: "0"
|
109
|
+
requirements: []
|
110
|
+
|
111
|
+
rubyforge_project:
|
112
|
+
rubygems_version: 1.3.7
|
113
|
+
signing_key:
|
114
|
+
specification_version: 3
|
115
|
+
summary: Value is a library for defining value objects in Ruby.
|
116
|
+
test_files: []
|
117
|
+
|