values 1.2.1 → 1.3.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.md CHANGED
@@ -16,6 +16,7 @@ Structs are also mutable:
16
16
  => 2
17
17
 
18
18
  Values fixes both of these:
19
+
19
20
  Point = Value.new(:x, :y)
20
21
  Point.new(1)
21
22
  => ArgumentError: wrong number of arguments, 1 for 2
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.1
1
+ 1.3.0
data/lib/values.rb CHANGED
@@ -14,6 +14,23 @@ class Value
14
14
 
15
15
  const_set :VALUE_ATTRS, fields
16
16
 
17
+ def self.with(hash)
18
+ args = []
19
+ self::VALUE_ATTRS.each do |field|
20
+ val = hash[field]
21
+ if val
22
+ args << val
23
+ else
24
+ raise ArgumentError.new("Missing field: #{field}")
25
+ end
26
+ end
27
+ unexpected_keys = hash.keys - self::VALUE_ATTRS
28
+ if unexpected_keys.any?
29
+ raise ArgumentError.new("Unexpected hash keys: #{unexpected_keys}")
30
+ end
31
+ self.new(*args)
32
+ end
33
+
17
34
  def ==(other)
18
35
  self.eql?(other)
19
36
  end
data/spec/values_spec.rb CHANGED
@@ -50,6 +50,27 @@ describe 'values' do
50
50
  lambda {m.instance_variable_set('@amount',2)}.should raise_error
51
51
  end
52
52
 
53
+ it 'can be instantiated with a hash' do
54
+ Money = Value.new(:amount, :denomination)
55
+ one_dollar = Money.with(:amount => 1, :denomination => 'USD')
56
+ one_dollar.amount.should == 1
57
+ one_dollar.denomination.should == 'USD'
58
+ end
59
+
60
+ it 'errors if you instantiate it from a hash with unrecognised fields' do
61
+ Money = Value.new(:amount, :denomination)
62
+ expect do
63
+ Money.with(:unrecognized_field => 1, :amount => 2, :denomination => 'USD')
64
+ end.to raise_error
65
+ end
66
+
67
+ it 'errors if you instantiate it from a hash with missing fields' do
68
+ Money = Value.new(:amount, :denomination)
69
+ expect do
70
+ Money.with
71
+ end.to raise_error
72
+ end
73
+
53
74
  describe '#hash and equality' do
54
75
  Y = Value.new(:x, :y)
55
76
 
data/values.gemspec CHANGED
@@ -4,23 +4,14 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{values}
8
- s.version = "1.2.1"
7
+ s.name = "values"
8
+ s.version = "1.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Tom Crayford"]
12
- s.date = %q{2011-04-06}
13
- s.description = %q{Simple immutable value objects for ruby.
14
-
15
- Make a new value class: Point = Value.new(:x, :y)
16
- And use it:
17
- p = Point.new(1,0)
18
- p.x
19
- => 1
20
- p.y
21
- => 0
22
- }
23
- s.email = %q{tcrayford@googlemail.com}
12
+ s.date = "2013-01-17"
13
+ 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
+ s.email = "tcrayford@googlemail.com"
24
15
  s.extra_rdoc_files = [
25
16
  "LICENSE.txt",
26
17
  "README.md"
@@ -39,18 +30,17 @@ Gem::Specification.new do |s|
39
30
  "spec/values_spec.rb",
40
31
  "values.gemspec"
41
32
  ]
42
- s.homepage = %q{http://github.com/tcrayford/values}
33
+ s.homepage = "http://github.com/tcrayford/values"
43
34
  s.licenses = ["MIT"]
44
35
  s.require_paths = ["lib"]
45
- s.rubygems_version = %q{1.3.7}
46
- s.summary = %q{Simple immutable value objects for ruby}
36
+ s.rubygems_version = "1.8.15"
37
+ s.summary = "Simple immutable value objects for ruby"
47
38
  s.test_files = [
48
39
  "spec/spec_helper.rb",
49
40
  "spec/values_spec.rb"
50
41
  ]
51
42
 
52
43
  if s.respond_to? :specification_version then
53
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
54
44
  s.specification_version = 3
55
45
 
56
46
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: values
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 27
5
+ prerelease:
5
6
  segments:
6
7
  - 1
7
- - 2
8
- - 1
9
- version: 1.2.1
8
+ - 3
9
+ - 0
10
+ version: 1.3.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Tom Crayford
@@ -14,67 +15,70 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2011-04-06 00:00:00 +01:00
18
- default_executable:
18
+ date: 2013-01-17 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- name: rspec
22
- requirement: &id001 !ruby/object:Gem::Requirement
21
+ version_requirements: &id001 !ruby/object:Gem::Requirement
23
22
  none: false
24
23
  requirements:
25
24
  - - ~>
26
25
  - !ruby/object:Gem::Version
26
+ hash: 3
27
27
  segments:
28
28
  - 2
29
29
  - 3
30
30
  - 0
31
31
  version: 2.3.0
32
- type: :development
33
32
  prerelease: false
34
- version_requirements: *id001
33
+ type: :development
34
+ requirement: *id001
35
+ name: rspec
35
36
  - !ruby/object:Gem::Dependency
36
- name: bundler
37
- requirement: &id002 !ruby/object:Gem::Requirement
37
+ version_requirements: &id002 !ruby/object:Gem::Requirement
38
38
  none: false
39
39
  requirements:
40
40
  - - ~>
41
41
  - !ruby/object:Gem::Version
42
+ hash: 23
42
43
  segments:
43
44
  - 1
44
45
  - 0
45
46
  - 0
46
47
  version: 1.0.0
47
- type: :development
48
48
  prerelease: false
49
- version_requirements: *id002
49
+ type: :development
50
+ requirement: *id002
51
+ name: bundler
50
52
  - !ruby/object:Gem::Dependency
51
- name: jeweler
52
- requirement: &id003 !ruby/object:Gem::Requirement
53
+ version_requirements: &id003 !ruby/object:Gem::Requirement
53
54
  none: false
54
55
  requirements:
55
56
  - - ~>
56
57
  - !ruby/object:Gem::Version
58
+ hash: 7
57
59
  segments:
58
60
  - 1
59
61
  - 5
60
62
  - 2
61
63
  version: 1.5.2
62
- type: :development
63
64
  prerelease: false
64
- version_requirements: *id003
65
+ type: :development
66
+ requirement: *id003
67
+ name: jeweler
65
68
  - !ruby/object:Gem::Dependency
66
- name: rcov
67
- requirement: &id004 !ruby/object:Gem::Requirement
69
+ version_requirements: &id004 !ruby/object:Gem::Requirement
68
70
  none: false
69
71
  requirements:
70
72
  - - ">="
71
73
  - !ruby/object:Gem::Version
74
+ hash: 3
72
75
  segments:
73
76
  - 0
74
77
  version: "0"
75
- type: :development
76
78
  prerelease: false
77
- version_requirements: *id004
79
+ type: :development
80
+ requirement: *id004
81
+ name: rcov
78
82
  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 "
79
83
  email: tcrayford@googlemail.com
80
84
  executables: []
@@ -97,7 +101,6 @@ files:
97
101
  - spec/spec_helper.rb
98
102
  - spec/values_spec.rb
99
103
  - values.gemspec
100
- has_rdoc: true
101
104
  homepage: http://github.com/tcrayford/values
102
105
  licenses:
103
106
  - MIT
@@ -111,7 +114,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
111
114
  requirements:
112
115
  - - ">="
113
116
  - !ruby/object:Gem::Version
114
- hash: 3256064136083469828
117
+ hash: 3
115
118
  segments:
116
119
  - 0
117
120
  version: "0"
@@ -120,13 +123,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
123
  requirements:
121
124
  - - ">="
122
125
  - !ruby/object:Gem::Version
126
+ hash: 3
123
127
  segments:
124
128
  - 0
125
129
  version: "0"
126
130
  requirements: []
127
131
 
128
132
  rubyforge_project:
129
- rubygems_version: 1.3.7
133
+ rubygems_version: 1.8.15
130
134
  signing_key:
131
135
  specification_version: 3
132
136
  summary: Simple immutable value objects for ruby