values 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
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