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.
@@ -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
@@ -9,5 +9,5 @@ group :development do
9
9
  gem "rspec", "~> 2.11.0"
10
10
  gem "bundler", "~> 1.0"
11
11
  gem "jeweler", "~> 1.8.4"
12
- gem "rcov", ">= 0"
12
+ gem "simplecov", ">= 0"
13
13
  end
@@ -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 'rubygems'
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) do |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
@@ -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
@@ -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
@@ -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.5.0"
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 = "2013-02-22"
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.require_paths = ["lib"]
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 = 3
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<rcov>, [">= 0"])
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<rcov>, [">= 0"])
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<rcov>, [">= 0"])
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
- hash: 3
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
- date: 2013-02-22 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- version_requirements: &id001 !ruby/object:Gem::Requirement
22
- none: false
23
- requirements:
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
- type: :development
49
- requirement: *id002
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
- - !ruby/object:Gem::Dependency
52
- version_requirements: &id003 !ruby/object:Gem::Requirement
53
- none: false
54
- requirements:
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
- requirement: *id003
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
- - !ruby/object:Gem::Dependency
68
- version_requirements: &id004 !ruby/object:Gem::Requirement
69
- none: false
70
- requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
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
- requirement: *id004
80
- name: rcov
81
- 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 "
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
- none: false
113
- requirements:
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
114
101
  - - ">="
115
- - !ruby/object:Gem::Version
116
- hash: 3
117
- segments:
118
- - 0
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
- hash: 3
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: 1.8.15
111
+ rubygems_version: 2.2.2
133
112
  signing_key:
134
- specification_version: 3
113
+ specification_version: 4
135
114
  summary: Simple immutable value objects for ruby
136
115
  test_files: []
137
-