virtus 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,16 +1,18 @@
1
1
  language: ruby
2
2
  before_install: gem install bundler
3
3
  bundler_args: --without yard guard benchmarks
4
- script: "bundle exec rake spec"
4
+ script: "bundle exec rake metrics:coverage spec:integration"
5
5
  rvm:
6
6
  - 1.9.3
7
7
  - 2.0.0
8
+ - 2.1.0
8
9
  - jruby-19mode
9
- - rbx-19mode
10
+ - rbx
10
11
  - ruby-head
11
12
  matrix:
12
13
  allow_failures:
13
14
  - rvm: ruby-head
15
+ - rvm: rbx
14
16
  notifications:
15
17
  email:
16
18
  - piotr.solnica@gmail.com
@@ -1,9 +1,17 @@
1
- # v1.0.0 2013-12-10
1
+ # v1.0.2 2014-12-03
2
+
3
+ * [improvement] Don’t override already-defined default values when freezing (amarshall)
4
+ * [improvement] Improved performance of `AttributeSet#each` (Antti)
5
+ * updated axiom-types dependency to ~> 0.1 (solnic)
6
+
7
+ [Compare v1.0.1..v1.0.2](https://github.com/solnic/virtus/compare/v1.0.1...v1.0.2)
8
+
9
+ # v1.0.1 2013-12-10
2
10
 
3
11
  * [feature] re-introduce `ValueObject#with`, which was removed in the past (senny)
4
12
  * [fixed] strict mode for Boolean type (solnic)
5
13
 
6
- [Compare v1.0.0..master](https://github.com/solnic/virtus/compare/v1.0.0...master)
14
+ [Compare v1.0.0..v1.0.1](https://github.com/solnic/virtus/compare/v1.0.0...v1.0.1)
7
15
 
8
16
  # v1.0.0 2013-10-16
9
17
 
@@ -1,24 +1,28 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  group :development do
4
- gem 'rake', '~> 10.1.0'
5
- gem 'rspec', '~> 2.14.1'
6
- gem 'yard', '~> 0.8.7'
4
+ gem 'rake', '~> 10.1.0'
5
+ gem 'rspec', '~> 2.14.1'
6
+ gem 'rspec-core', '~> 2.14.8'
7
+ gem 'yard', '~> 0.8.7'
8
+
9
+ platform :rbx do
10
+ gem 'rubysl-singleton', '~> 2.0.0'
11
+ end
7
12
  end
8
13
 
9
14
  group :yard do
10
- gem 'kramdown', '~> 1.2.0'
15
+ gem 'kramdown', '~> 1.3.2'
11
16
  end
12
17
 
13
18
  group :guard do
14
- gem 'guard', '~> 1.8.1'
15
- gem 'guard-bundler', '~> 1.0.0'
16
- gem 'guard-rspec', '~> 3.0.2'
17
- gem 'guard-rubocop', '~> 0.2.0'
18
- gem 'guard-mutant', '~> 0.0.1'
19
+ gem 'guard', '~> 2.4.0'
20
+ gem 'guard-bundler', '~> 2.0.0'
21
+ gem 'guard-rspec', '~> 4.2.6'
22
+ gem 'guard-rubocop', '~> 1.0.2'
19
23
 
20
24
  # file system change event handling
21
- gem 'listen', '~> 1.3.0'
25
+ gem 'listen', '~> 2.5.0'
22
26
  gem 'rb-fchange', '~> 0.0.6', require: false
23
27
  gem 'rb-fsevent', '~> 0.9.3', require: false
24
28
  gem 'rb-inotify', '~> 0.9.0', require: false
@@ -30,17 +34,24 @@ group :guard do
30
34
  end
31
35
 
32
36
  group :metrics do
33
- gem 'coveralls', '~> 0.6.7'
37
+ gem 'coveralls', '~> 0.7.0'
34
38
  gem 'flay', '~> 2.4.0'
35
- gem 'flog', '~> 4.1.1'
39
+ gem 'flog', '~> 4.2.0'
36
40
  gem 'reek', '~> 1.3.2'
37
- gem 'rubocop', '~> 0.13.0'
38
- gem 'simplecov', '~> 0.7.1'
39
- gem 'yardstick', '~> 0.9.7', git: 'https://github.com/dkubb/yardstick.git'
41
+ gem 'simplecov', '~> 0.8.2'
42
+ gem 'yardstick', '~> 0.9.9'
40
43
 
41
44
  platforms :ruby_19, :ruby_20 do
42
45
  gem 'yard-spellcheck', '~> 0.1.5'
43
46
  end
47
+
48
+ platform :rbx do
49
+ gem 'json', '~> 1.8.1'
50
+ gem 'racc', '~> 1.4'
51
+ gem 'rubysl-logger', '~> 2.0.0'
52
+ gem 'rubysl-open-uri', '~> 2.0.0'
53
+ gem 'rubysl-prettyprint', '~> 2.0.2'
54
+ end
44
55
  end
45
56
 
46
57
  group :benchmarks do
data/README.md CHANGED
@@ -6,12 +6,14 @@ Virtus
6
6
  [![Dependency Status](https://gemnasium.com/solnic/virtus.png)][gemnasium]
7
7
  [![Code Climate](https://codeclimate.com/github/solnic/virtus.png)][codeclimate]
8
8
  [![Coverage Status](https://coveralls.io/repos/solnic/virtus/badge.png?branch=master)][coveralls]
9
+ [![Inline docs](http://inch-pages.github.io/github/solnic/virtus.png)][inchpages]
9
10
 
10
11
  [gem]: https://rubygems.org/gems/virtus
11
12
  [travis]: https://travis-ci.org/solnic/virtus
12
13
  [gemnasium]: https://gemnasium.com/solnic/virtus
13
14
  [codeclimate]: https://codeclimate.com/github/solnic/virtus
14
15
  [coveralls]: https://coveralls.io/r/solnic/virtus
16
+ [inchpages]: http://inch-pages.github.io/github/solnic/virtus
15
17
 
16
18
  This is a partial extraction of the DataMapper [Property
17
19
  API](http://rubydoc.info/github/datamapper/dm-core/master/DataMapper/Property)
@@ -427,48 +429,6 @@ user.set_unique_id('1234-1234')
427
429
  user.unique_id # => '1234-1234'
428
430
  ```
429
431
 
430
- Coercions
431
- ---------
432
-
433
- Virtus uses [Coercible](https://github.com/solnic/coercible) for coercions. This
434
- feature is turned on by default. You can turn it off for all attributes like that:
435
-
436
- ```ruby
437
- # Turn coercions off globally
438
- Virtus.coerce(false)
439
-
440
- # ...or you can turn it off for a single attribute
441
- class User
442
- include Virtus.model
443
-
444
- attribute :name, String, :coerce => false
445
- end
446
- ```
447
-
448
- You can configure coercers too:
449
-
450
- ```ruby
451
- Virtus.coercer do |config|
452
- config.string.boolean_map = { 'yup' => true, 'nope' => false }
453
- end
454
-
455
- # Virtus.coercer instance is used by default for all attributes.
456
- # You *can* override it for a single attribute if you want:
457
-
458
- my_cool_coercer = Coercible::Coercer.new do |config|
459
- # some customization
460
- end
461
-
462
- class User
463
- include Virtus.model
464
-
465
- attribute :name, String, :coercer => my_cool_coercer
466
- end
467
- ```
468
-
469
- Please check out [Coercible README](https://github.com/solnic/coercible/blob/master/README.md)
470
- for more information.
471
-
472
432
  ## Strict Coercion Mode
473
433
 
474
434
  By default Virtus returns the input value even when it couldn't coerce it to the expected type.
@@ -562,27 +522,3 @@ Contributing
562
522
  * Commit, do not mess with Rakefile or version
563
523
  (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
564
524
  * Send me a pull request. Bonus points for topic branches.
565
-
566
- License
567
- -------
568
-
569
- Copyright (c) 2011-2013 Piotr Solnica
570
-
571
- Permission is hereby granted, free of charge, to any person obtaining
572
- a copy of this software and associated documentation files (the
573
- "Software"), to deal in the Software without restriction, including
574
- without limitation the rights to use, copy, modify, merge, publish,
575
- distribute, sublicense, and/or sell copies of the Software, and to
576
- permit persons to whom the Software is furnished to do so, subject to
577
- the following conditions:
578
-
579
- The above copyright notice and this permission notice shall be
580
- included in all copies or substantial portions of the Software.
581
-
582
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
583
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
584
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
585
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
586
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
587
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
588
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -34,6 +34,17 @@ module Virtus
34
34
  descendant.instance_variable_set('@instance_variable_name', "@#{name}")
35
35
  end
36
36
 
37
+ # Return if attribute value is defined
38
+ #
39
+ # @param [Object] instance
40
+ #
41
+ # @return [Boolean]
42
+ #
43
+ # @api public
44
+ def defined?(instance)
45
+ instance.instance_variable_defined?(instance_variable_name)
46
+ end
47
+
37
48
  # Return value of the attribute
38
49
  #
39
50
  # @param [Object] instance
@@ -43,7 +43,7 @@ module Virtus
43
43
  # @api public
44
44
  def each
45
45
  return to_enum unless block_given?
46
- @index.values.uniq.each { |attribute| yield attribute }
46
+ @index.each { |name, attribute| yield attribute if name.kind_of?(Symbol) }
47
47
  self
48
48
  end
49
49
 
@@ -209,7 +209,7 @@ module Virtus
209
209
 
210
210
  # @api private
211
211
  def skip_default?(object, attribute)
212
- attribute.lazy? || object.instance_variable_defined?(attribute.instance_variable_name)
212
+ attribute.lazy? || attribute.defined?(object)
213
213
  end
214
214
 
215
215
  # Merge the attributes into the index
@@ -191,7 +191,7 @@ module Virtus
191
191
  #
192
192
  # @api public
193
193
  def set_default_attributes!
194
- attribute_set.set_defaults(self, proc { |_| false })
194
+ attribute_set.set_defaults(self, proc { |object, attribute| attribute.defined?(object) })
195
195
  self
196
196
  end
197
197
 
@@ -65,7 +65,7 @@ module Virtus
65
65
  def define_hash_method
66
66
  keys = @keys
67
67
  define_method(:hash) do
68
- keys.map { |key| send(key).hash }.reduce(self.class.hash, :^)
68
+ keys.map { |key| send(key) }.push(self.class).hash
69
69
  end
70
70
  end
71
71
 
@@ -1,3 +1,3 @@
1
1
  module Virtus
2
- VERSION = '1.0.1'
2
+ VERSION = '1.0.2'
3
3
  end
@@ -12,7 +12,6 @@ if ENV['COVERAGE'] == 'true'
12
12
  add_filter 'config/'
13
13
  add_filter 'spec'
14
14
  add_filter '.bundle'
15
- minimum_coverage 98
16
15
  end
17
16
  end
18
17
 
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus::Attribute, '#defined?' do
4
+ subject { object.defined?(instance) }
5
+
6
+ let(:object) { described_class.build(String, :name => name) }
7
+
8
+ let(:model) { Class.new { attr_accessor :test } }
9
+ let(:name) { :test }
10
+ let(:instance) { model.new }
11
+
12
+ context 'when the attribute value has not been defined' do
13
+ it { should be(false) }
14
+ end
15
+
16
+ context 'when the attribute value has been defined' do
17
+ before { instance.test = nil }
18
+ it { should be(true) }
19
+ end
20
+ end
@@ -9,6 +9,7 @@ describe Virtus, '#freeze' do
9
9
 
10
10
  attribute :name, String, :default => 'foo', :lazy => true
11
11
  attribute :age, Integer, :default => 30
12
+ attribute :rand, Float, :default => Proc.new { rand }
12
13
  }
13
14
  }
14
15
 
@@ -18,4 +19,16 @@ describe Virtus, '#freeze' do
18
19
 
19
20
  its(:name) { should eql('foo') }
20
21
  its(:age) { should be(30) }
22
+
23
+ it "does not change dynamic default values" do
24
+ original_value = object.rand
25
+ object.freeze
26
+ expect(object.rand).to eq original_value
27
+ end
28
+
29
+ it "does not change default attributes that have been explicitly set" do
30
+ object.rand = 3.14
31
+ object.freeze
32
+ expect(object.rand).to eq 3.14
33
+ end
21
34
  end
@@ -17,8 +17,8 @@ Gem::Specification.new do |gem|
17
17
  gem.test_files = `git ls-files -- {spec}/*`.split("\n")
18
18
  gem.extra_rdoc_files = %w[LICENSE README.md TODO.md]
19
19
 
20
- gem.add_dependency('descendants_tracker', '~> 0.0.1')
21
- gem.add_dependency('equalizer', '~> 0.0.7')
20
+ gem.add_dependency('descendants_tracker', '~> 0.0.3')
21
+ gem.add_dependency('equalizer', '~> 0.0.9')
22
22
  gem.add_dependency('coercible', '~> 1.0')
23
- gem.add_dependency('axiom-types', '~> 0.0.5')
23
+ gem.add_dependency('axiom-types', '~> 0.1')
24
24
  end
metadata CHANGED
@@ -1,46 +1,52 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: virtus
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Piotr Solnica
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-12-10 00:00:00.000000000 Z
12
+ date: 2014-03-12 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: descendants_tracker
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - ~>
18
20
  - !ruby/object:Gem::Version
19
- version: 0.0.1
21
+ version: 0.0.3
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
27
  - - ~>
25
28
  - !ruby/object:Gem::Version
26
- version: 0.0.1
29
+ version: 0.0.3
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: equalizer
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
35
  - - ~>
32
36
  - !ruby/object:Gem::Version
33
- version: 0.0.7
37
+ version: 0.0.9
34
38
  type: :runtime
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
43
  - - ~>
39
44
  - !ruby/object:Gem::Version
40
- version: 0.0.7
45
+ version: 0.0.9
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: coercible
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
51
  - - ~>
46
52
  - !ruby/object:Gem::Version
@@ -48,6 +54,7 @@ dependencies:
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
59
  - - ~>
53
60
  - !ruby/object:Gem::Version
@@ -55,17 +62,19 @@ dependencies:
55
62
  - !ruby/object:Gem::Dependency
56
63
  name: axiom-types
57
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
58
66
  requirements:
59
67
  - - ~>
60
68
  - !ruby/object:Gem::Version
61
- version: 0.0.5
69
+ version: '0.1'
62
70
  type: :runtime
63
71
  prerelease: false
64
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
65
74
  requirements:
66
75
  - - ~>
67
76
  - !ruby/object:Gem::Version
68
- version: 0.0.5
77
+ version: '0.1'
69
78
  description: Attributes on Steroids for Plain Old Ruby Objects
70
79
  email:
71
80
  - piotr.solnica@gmail.com
@@ -163,6 +172,7 @@ files:
163
172
  - spec/unit/virtus/attribute/collection/class_methods/build_spec.rb
164
173
  - spec/unit/virtus/attribute/collection/coerce_spec.rb
165
174
  - spec/unit/virtus/attribute/custom_collection_spec.rb
175
+ - spec/unit/virtus/attribute/defined_spec.rb
166
176
  - spec/unit/virtus/attribute/embedded_value/class_methods/build_spec.rb
167
177
  - spec/unit/virtus/attribute/embedded_value/coerce_spec.rb
168
178
  - spec/unit/virtus/attribute/get_spec.rb
@@ -199,26 +209,27 @@ files:
199
209
  homepage: https://github.com/solnic/virtus
200
210
  licenses:
201
211
  - MIT
202
- metadata: {}
203
212
  post_install_message:
204
213
  rdoc_options: []
205
214
  require_paths:
206
215
  - lib
207
216
  required_ruby_version: !ruby/object:Gem::Requirement
217
+ none: false
208
218
  requirements:
209
- - - '>='
219
+ - - ! '>='
210
220
  - !ruby/object:Gem::Version
211
221
  version: '0'
212
222
  required_rubygems_version: !ruby/object:Gem::Requirement
223
+ none: false
213
224
  requirements:
214
- - - '>='
225
+ - - ! '>='
215
226
  - !ruby/object:Gem::Version
216
227
  version: '0'
217
228
  requirements: []
218
229
  rubyforge_project:
219
- rubygems_version: 2.0.3
230
+ rubygems_version: 1.8.23
220
231
  signing_key:
221
- specification_version: 4
232
+ specification_version: 3
222
233
  summary: Attributes on Steroids for Plain Old Ruby Objects
223
234
  test_files: []
224
235
  has_rdoc:
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 6888ad6cccbdd89e1d41781ceafcc78502aea7d6
4
- data.tar.gz: 6638f3068fdee7c541917a7171501a79be0077ea
5
- SHA512:
6
- metadata.gz: de43cc6cccde89c7009fcb77301e34aa062aea154cfbffc2655efd28d35e41bf0cb0eec547b522cc16861ea66805a7594fa532f2d147366dee5482ae69a9f73f
7
- data.tar.gz: 982101e49074af9ce296b4a647e9855e94dd327d7ab35196fb542201d83503b2c2e75e9d4e074e01e5e1565943f26f05b1784c8cca4501d5b638f6ff1992bbe7