values 1.5.0 → 1.6.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 +7 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +8 -2
- data/README.md +14 -0
- data/Rakefile +2 -54
- data/lib/values.rb +11 -6
- data/spec/values_spec.rb +13 -2
- data/values.gemspec +9 -8
- metadata +74 -96
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5e79f1d3f84ef3b06bad7cecd279e9ba4893e94c
|
4
|
+
data.tar.gz: 60279f29f52d792e06305225595e2aecd5cbfd3a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1232889fc845d9323e338985b3d4843ab272c191e67a772835ca437b389dfc159eb3acc8cda775920af3d5f6b21718e7f3b921d913259294adf21fe733525395
|
7
|
+
data.tar.gz: 014cda4383ee1aed4f78d1105ad24e7b58b7837dd172f22b5271ff9e651ee602619ac64e4c0b421c3d2dd5eae838e1a1400b4f9c3fd6759b1163cd5ad6da5e8a
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -2,6 +2,7 @@ GEM
|
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
4
|
diff-lcs (1.1.3)
|
5
|
+
docile (1.1.5)
|
5
6
|
git (1.2.5)
|
6
7
|
jeweler (1.8.4)
|
7
8
|
bundler (~> 1.0)
|
@@ -9,8 +10,8 @@ GEM
|
|
9
10
|
rake
|
10
11
|
rdoc
|
11
12
|
json (1.7.5)
|
13
|
+
multi_json (1.10.1)
|
12
14
|
rake (0.9.2.2)
|
13
|
-
rcov (0.9.9)
|
14
15
|
rdoc (3.12)
|
15
16
|
json (~> 1.4)
|
16
17
|
rspec (2.11.0)
|
@@ -21,6 +22,11 @@ GEM
|
|
21
22
|
rspec-expectations (2.11.3)
|
22
23
|
diff-lcs (~> 1.1.3)
|
23
24
|
rspec-mocks (2.11.3)
|
25
|
+
simplecov (0.9.2)
|
26
|
+
docile (~> 1.1.0)
|
27
|
+
multi_json (~> 1.0)
|
28
|
+
simplecov-html (~> 0.9.0)
|
29
|
+
simplecov-html (0.9.0)
|
24
30
|
|
25
31
|
PLATFORMS
|
26
32
|
ruby
|
@@ -28,5 +34,5 @@ PLATFORMS
|
|
28
34
|
DEPENDENCIES
|
29
35
|
bundler (~> 1.0)
|
30
36
|
jeweler (~> 1.8.4)
|
31
|
-
rcov
|
32
37
|
rspec (~> 2.11.0)
|
38
|
+
simplecov
|
data/README.md
CHANGED
@@ -45,4 +45,18 @@ p.x
|
|
45
45
|
# => 3
|
46
46
|
```
|
47
47
|
|
48
|
+
Values also supports customization of value classes inheriting from `Value.new`:
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
class Point < Value.new(:x, :y)
|
52
|
+
def to_s
|
53
|
+
"<Point at (#{x}, #{y})>"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
p = Point.new(1, 2)
|
58
|
+
p.to_s
|
59
|
+
# => "<Point at (1, 2)>"
|
60
|
+
```
|
61
|
+
|
48
62
|
Values does NOT have all the features of Struct (nor is it meant to).
|
data/Rakefile
CHANGED
@@ -1,59 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require 'bundler'
|
3
|
-
begin
|
4
|
-
Bundler.setup(:default, :development)
|
5
|
-
rescue Bundler::BundlerError => e
|
6
|
-
$stderr.puts e.message
|
7
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
-
exit e.status_code
|
9
|
-
end
|
10
|
-
require 'rake'
|
1
|
+
require "bundler/gem_tasks"
|
11
2
|
|
12
|
-
require 'jeweler'
|
13
|
-
Jeweler::Tasks.new do |gem|
|
14
|
-
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
15
|
-
gem.name = "values"
|
16
|
-
gem.homepage = "http://github.com/tcrayford/values"
|
17
|
-
gem.license = "MIT"
|
18
|
-
gem.summary = %Q{Simple immutable value objects for ruby}
|
19
|
-
gem.description = %Q{Simple immutable value objects for ruby.
|
20
|
-
|
21
|
-
Make a new value class: Point = Value.new(:x, :y)
|
22
|
-
And use it:
|
23
|
-
p = Point.new(1,0)
|
24
|
-
p.x
|
25
|
-
=> 1
|
26
|
-
p.y
|
27
|
-
=> 0
|
28
|
-
}
|
29
|
-
gem.email = "tcrayford@googlemail.com"
|
30
|
-
gem.authors = ["Tom Crayford"]
|
31
|
-
# Include your dependencies below. Runtime dependencies are required when using your gem,
|
32
|
-
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
33
|
-
# gem.add_runtime_dependency 'jabber4r', '> 0.1'
|
34
|
-
# gem.add_development_dependency 'rspec', '> 1.2.3'
|
35
|
-
end
|
36
|
-
Jeweler::RubygemsDotOrgTasks.new
|
37
|
-
|
38
|
-
require 'rspec/core'
|
39
3
|
require 'rspec/core/rake_task'
|
40
|
-
RSpec::Core::RakeTask.new(:spec)
|
41
|
-
spec.pattern = FileList['spec/**/*_spec.rb']
|
42
|
-
end
|
43
|
-
|
44
|
-
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
45
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
46
|
-
spec.rcov = true
|
47
|
-
end
|
4
|
+
RSpec::Core::RakeTask.new(:spec)
|
48
5
|
|
49
6
|
task :default => :spec
|
50
7
|
|
51
|
-
require 'rake/rdoctask'
|
52
|
-
Rake::RDocTask.new do |rdoc|
|
53
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
54
|
-
|
55
|
-
rdoc.rdoc_dir = 'rdoc'
|
56
|
-
rdoc.title = "values #{version}"
|
57
|
-
rdoc.rdoc_files.include('README*')
|
58
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
59
|
-
end
|
data/lib/values.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
class Value
|
2
|
-
def self.new(*fields)
|
2
|
+
def self.new(*fields, &block)
|
3
3
|
Class.new do
|
4
|
-
attr_reader *fields
|
4
|
+
attr_reader(:hash, *fields)
|
5
5
|
|
6
6
|
define_method(:initialize) do |*values|
|
7
7
|
raise ArgumentError.new("wrong number of arguments, #{values.size} for #{fields.size}") if fields.size != values.size
|
@@ -10,6 +10,8 @@ class Value
|
|
10
10
|
instance_variable_set(:"@#{field}", value)
|
11
11
|
end
|
12
12
|
|
13
|
+
@hash = self.class.hash ^ values.hash
|
14
|
+
|
13
15
|
freeze
|
14
16
|
end
|
15
17
|
|
@@ -21,6 +23,11 @@ class Value
|
|
21
23
|
raise ArgumentError.new("Unexpected hash keys: #{unexpected_keys}")
|
22
24
|
end
|
23
25
|
|
26
|
+
missing_keys = self::VALUE_ATTRS - hash.keys
|
27
|
+
if missing_keys.any?
|
28
|
+
raise ArgumentError.new("Missing hash keys: #{missing_keys} (got keys #{hash.keys})")
|
29
|
+
end
|
30
|
+
|
24
31
|
new(*hash.values_at(*self::VALUE_ATTRS))
|
25
32
|
end
|
26
33
|
|
@@ -32,13 +39,11 @@ class Value
|
|
32
39
|
self.class == other.class && values == other.values
|
33
40
|
end
|
34
41
|
|
35
|
-
def hash
|
36
|
-
values.map(&:hash).inject(0, :+) + self.class.hash
|
37
|
-
end
|
38
|
-
|
39
42
|
def values
|
40
43
|
self.class::VALUE_ATTRS.map { |field| send(field) }
|
41
44
|
end
|
45
|
+
|
46
|
+
class_eval &block if block
|
42
47
|
end
|
43
48
|
end
|
44
49
|
end
|
data/spec/values_spec.rb
CHANGED
@@ -30,6 +30,17 @@ describe 'values' do
|
|
30
30
|
c.inspect.should == 'GraphPoint at 0,0'
|
31
31
|
end
|
32
32
|
|
33
|
+
Line = Value.new(:slope, :y_intercept) do
|
34
|
+
def inspect
|
35
|
+
"<Line: y=#{slope}x+#{y_intercept}>"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'can be customized with a block' do
|
40
|
+
l = Line.new(2, 3)
|
41
|
+
l.inspect.should == '<Line: y=2x+3>'
|
42
|
+
end
|
43
|
+
|
33
44
|
it 'cannot be mutated' do
|
34
45
|
p = Point.new(0,1)
|
35
46
|
expect { p.x = 1 }.to raise_error
|
@@ -67,8 +78,8 @@ describe 'values' do
|
|
67
78
|
|
68
79
|
it 'errors if you instantiate it from a hash with missing fields' do
|
69
80
|
expect do
|
70
|
-
Money.with
|
71
|
-
end.to raise_error
|
81
|
+
Money.with({})
|
82
|
+
end.to raise_error(ArgumentError)
|
72
83
|
end
|
73
84
|
|
74
85
|
it 'does not error when fields are explicitly nil' do
|
data/values.gemspec
CHANGED
@@ -2,14 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
+
# stub: values 1.5.0 ruby lib
|
5
6
|
|
6
7
|
Gem::Specification.new do |s|
|
7
8
|
s.name = "values"
|
8
|
-
s.version = "1.
|
9
|
+
s.version = "1.6.0"
|
9
10
|
|
10
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib"]
|
11
13
|
s.authors = ["Tom Crayford"]
|
12
|
-
s.date = "
|
14
|
+
s.date = "2015-03-01"
|
13
15
|
s.description = "Simple immutable value objects for ruby.\n\n Make a new value class: Point = Value.new(:x, :y)\n And use it:\n p = Point.new(1,0)\n p.x\n => 1\n p.y\n => 0\n "
|
14
16
|
s.email = "tcrayford@googlemail.com"
|
15
17
|
s.extra_rdoc_files = [
|
@@ -32,29 +34,28 @@ Gem::Specification.new do |s|
|
|
32
34
|
]
|
33
35
|
s.homepage = "http://github.com/tcrayford/values"
|
34
36
|
s.licenses = ["MIT"]
|
35
|
-
s.
|
36
|
-
s.rubygems_version = "1.8.15"
|
37
|
+
s.rubygems_version = "2.2.2"
|
37
38
|
s.summary = "Simple immutable value objects for ruby"
|
38
39
|
|
39
40
|
if s.respond_to? :specification_version then
|
40
|
-
s.specification_version =
|
41
|
+
s.specification_version = 4
|
41
42
|
|
42
43
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
43
44
|
s.add_development_dependency(%q<rspec>, ["~> 2.11.0"])
|
44
45
|
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
45
46
|
s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
|
46
|
-
s.add_development_dependency(%q<
|
47
|
+
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
47
48
|
else
|
48
49
|
s.add_dependency(%q<rspec>, ["~> 2.11.0"])
|
49
50
|
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
50
51
|
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
51
|
-
s.add_dependency(%q<
|
52
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
52
53
|
end
|
53
54
|
else
|
54
55
|
s.add_dependency(%q<rspec>, ["~> 2.11.0"])
|
55
56
|
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
56
57
|
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
57
|
-
s.add_dependency(%q<
|
58
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
58
59
|
end
|
59
60
|
end
|
60
61
|
|
metadata
CHANGED
@@ -1,95 +1,83 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: values
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 5
|
9
|
-
- 0
|
10
|
-
version: 1.5.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.6.0
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Tom Crayford
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
hash: 35
|
27
|
-
segments:
|
28
|
-
- 2
|
29
|
-
- 11
|
30
|
-
- 0
|
11
|
+
date: 2015-03-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
31
19
|
version: 2.11.0
|
32
|
-
prerelease: false
|
33
20
|
type: :development
|
34
|
-
requirement: *id001
|
35
|
-
name: rspec
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
version_requirements: &id002 !ruby/object:Gem::Requirement
|
38
|
-
none: false
|
39
|
-
requirements:
|
40
|
-
- - ~>
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
hash: 15
|
43
|
-
segments:
|
44
|
-
- 1
|
45
|
-
- 0
|
46
|
-
version: "1.0"
|
47
21
|
prerelease: false
|
48
|
-
|
49
|
-
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.11.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
50
28
|
name: bundler
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
hash: 63
|
58
|
-
segments:
|
59
|
-
- 1
|
60
|
-
- 8
|
61
|
-
- 4
|
62
|
-
version: 1.8.4
|
63
|
-
prerelease: false
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.0'
|
64
34
|
type: :development
|
65
|
-
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
66
42
|
name: jeweler
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
hash: 3
|
74
|
-
segments:
|
75
|
-
- 0
|
76
|
-
version: "0"
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.8.4
|
48
|
+
type: :development
|
77
49
|
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.8.4
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: simplecov
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
78
62
|
type: :development
|
79
|
-
|
80
|
-
|
81
|
-
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: "Simple immutable value objects for ruby.\n\n Make a new value class:
|
70
|
+
Point = Value.new(:x, :y)\n And use it:\n p = Point.new(1,0)\n p.x\n =>
|
71
|
+
1\n p.y\n => 0\n "
|
82
72
|
email: tcrayford@googlemail.com
|
83
73
|
executables: []
|
84
|
-
|
85
74
|
extensions: []
|
86
|
-
|
87
|
-
extra_rdoc_files:
|
75
|
+
extra_rdoc_files:
|
88
76
|
- LICENSE.txt
|
89
77
|
- README.md
|
90
|
-
files:
|
91
|
-
- .document
|
92
|
-
- .rspec
|
78
|
+
files:
|
79
|
+
- ".document"
|
80
|
+
- ".rspec"
|
93
81
|
- Gemfile
|
94
82
|
- Gemfile.lock
|
95
83
|
- LICENSE.txt
|
@@ -101,37 +89,27 @@ files:
|
|
101
89
|
- spec/values_spec.rb
|
102
90
|
- values.gemspec
|
103
91
|
homepage: http://github.com/tcrayford/values
|
104
|
-
licenses:
|
92
|
+
licenses:
|
105
93
|
- MIT
|
94
|
+
metadata: {}
|
106
95
|
post_install_message:
|
107
96
|
rdoc_options: []
|
108
|
-
|
109
|
-
require_paths:
|
97
|
+
require_paths:
|
110
98
|
- lib
|
111
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
112
|
-
|
113
|
-
requirements:
|
99
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
114
101
|
- - ">="
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
version: "0"
|
120
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
|
-
requirements:
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
123
106
|
- - ">="
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
|
126
|
-
segments:
|
127
|
-
- 0
|
128
|
-
version: "0"
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
129
109
|
requirements: []
|
130
|
-
|
131
110
|
rubyforge_project:
|
132
|
-
rubygems_version:
|
111
|
+
rubygems_version: 2.2.2
|
133
112
|
signing_key:
|
134
|
-
specification_version:
|
113
|
+
specification_version: 4
|
135
114
|
summary: Simple immutable value objects for ruby
|
136
115
|
test_files: []
|
137
|
-
|