values 1.5.0 → 1.6.0

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