deep_cloneable 2.4.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +30 -32
- data/Appraisals +4 -0
- data/CHANGELOG.md +19 -1
- data/Gemfile +1 -2
- data/Gemfile.lock +2 -2
- data/Rakefile +9 -9
- data/VERSION +1 -1
- data/deep_cloneable.gemspec +12 -7
- data/gemfiles/3.1.gemfile +14 -17
- data/gemfiles/3.2.gemfile +14 -14
- data/gemfiles/4.0.gemfile +14 -14
- data/gemfiles/4.1.gemfile +14 -14
- data/gemfiles/4.2.gemfile +14 -14
- data/gemfiles/5.0.gemfile +13 -13
- data/gemfiles/5.1.gemfile +13 -13
- data/gemfiles/5.2.gemfile +12 -12
- data/gemfiles/6.0.gemfile +15 -0
- data/gemfiles/6.0.gemfile.lock +91 -0
- data/init.rb +1 -1
- data/lib/deep_cloneable.rb +10 -209
- data/lib/deep_cloneable/association_not_found_exception.rb +4 -0
- data/lib/deep_cloneable/deep_clone.rb +194 -0
- data/lib/deep_cloneable/skip_validations.rb +8 -0
- data/readme.md +14 -5
- data/test/test_deep_cloneable.rb +11 -5
- data/test/test_helper.rb +2 -3
- metadata +14 -10
data/readme.md
CHANGED
@@ -6,8 +6,8 @@ This gem gives every ActiveRecord::Base object the possibility to do a deep clon
|
|
6
6
|
|
7
7
|
## Requirements
|
8
8
|
|
9
|
-
* Ruby 1.
|
10
|
-
* Activerecord 3.1, 3.2, 4.0, 4.1, 4.2, 5.0, 5.1, 5.2 (tested)
|
9
|
+
* Ruby 1.9.3, 2.0.0, 2.1.5, 2.2.2, 2.3.0, 2.4.4, 2.5.5 (tested)
|
10
|
+
* Activerecord 3.1, 3.2, 4.0, 4.1, 4.2, 5.0, 5.1, 5.2, 6.0 (tested)
|
11
11
|
* Rails 2.x/3.0 users, please check out the 'rails2.x-3.0' branch
|
12
12
|
|
13
13
|
## Installation
|
@@ -15,10 +15,19 @@ This gem gives every ActiveRecord::Base object the possibility to do a deep clon
|
|
15
15
|
* Add deep_cloneable to your Gemfile:
|
16
16
|
|
17
17
|
```ruby
|
18
|
-
gem 'deep_cloneable', '~>
|
18
|
+
gem 'deep_cloneable', '~> 3.0.0'
|
19
19
|
```
|
20
20
|
|
21
|
-
##
|
21
|
+
## Upgrade details
|
22
|
+
|
23
|
+
### Upgrading from v2
|
24
|
+
|
25
|
+
There are two breaking changes that you might need to pay attention to:
|
26
|
+
|
27
|
+
* When using an optional block (see below), the block used to be evaluated before `deep_cloneable` had performed its changes (inclusions, exclusions, includes). In v3, the block is evaluated after all processing has been done, just before the copy is about to be returned.
|
28
|
+
* When a defined association is not found, `deep_cloneable` raises an exception. The exception class has changed namespace: the class definition used to be `ActiveRecord::Base::DeepCloneable::AssociationNotFoundException` and this has changed to `DeepCloneable::AssociationNotFoundException`.
|
29
|
+
|
30
|
+
### Upgrading from v1
|
22
31
|
|
23
32
|
The `dup` method with arguments has been replaced in deep_cloneable 2 by the method `deep_clone`. Please update your sources accordingly.
|
24
33
|
|
@@ -158,7 +167,7 @@ end
|
|
158
167
|
|
159
168
|
### Skipping missing associations
|
160
169
|
|
161
|
-
By default, deep_cloneable will throw a `
|
170
|
+
By default, deep_cloneable will throw a `DeepCloneable::AssociationNotFoundException` error when an association cannot be found. You can also skip missing associations by specifying `skip_missing_associations` if needed, for example when you have associations on some (but not all) subclasses of an STI model:
|
162
171
|
|
163
172
|
```ruby
|
164
173
|
pirate.deep_clone include: [:parrot, :rum], skip_missing_associations: true
|
data/test/test_deep_cloneable.rb
CHANGED
@@ -242,7 +242,7 @@ class TestDeepCloneable < MiniTest::Unit::TestCase
|
|
242
242
|
@chicken = Animal::Chicken.create :name => 'Chick', :humans => [@human], :planet => @earth
|
243
243
|
@dove = Animal::Dove.create :name => 'Dovey', :planet => @earth
|
244
244
|
|
245
|
-
assert_raises
|
245
|
+
assert_raises ::DeepCloneable::AssociationNotFoundException do
|
246
246
|
@earth.deep_clone(:include => { :birds => :ownerships })
|
247
247
|
end
|
248
248
|
|
@@ -350,18 +350,19 @@ class TestDeepCloneable < MiniTest::Unit::TestCase
|
|
350
350
|
assert_equal deep_clone_parent.errors.messages, :children => ['is invalid']
|
351
351
|
end
|
352
352
|
|
353
|
-
def
|
353
|
+
def test_child_validations_dont_run_on_save_after_clone_without_validation
|
354
354
|
child = ChildWithValidation.new
|
355
355
|
child.save :validate => false
|
356
356
|
parent = ParentWithValidation.create :name => 'John', :children => [child]
|
357
357
|
|
358
358
|
deep_clone_parent = parent.deep_clone :include => :children, :validate => false
|
359
|
+
deep_clone_child = deep_clone_parent.children.first
|
359
360
|
|
360
361
|
assert deep_clone_parent.save
|
361
362
|
assert !deep_clone_parent.new_record?
|
362
|
-
assert !
|
363
|
-
assert !
|
364
|
-
assert_equal
|
363
|
+
assert !deep_clone_child.new_record?
|
364
|
+
assert !deep_clone_child.valid?
|
365
|
+
assert_equal deep_clone_child.errors.messages, :name => ["can't be blank"]
|
365
366
|
end
|
366
367
|
|
367
368
|
def test_self_join_has_many
|
@@ -436,6 +437,11 @@ class TestDeepCloneable < MiniTest::Unit::TestCase
|
|
436
437
|
assert_equal 2, deep_clone.subjects.size
|
437
438
|
end
|
438
439
|
|
440
|
+
def test_should_set_association_to_nil_if_conditionals_fail
|
441
|
+
deep_clone = @jack.deep_clone(:include => { :ship => { :unless => lambda { |ship| ship.name == 'Black Pearl' } } })
|
442
|
+
assert_nil deep_clone.ship
|
443
|
+
end
|
444
|
+
|
439
445
|
def test_should_reject_copies_if_conditionals_are_passed_with_associations
|
440
446
|
deep_clone = @ship.deep_clone(:include => [:pirates => [:treasures, :mateys, { :unless => lambda { |pirate| pirate.name == 'Jack Sparrow' } }]])
|
441
447
|
|
data/test/test_helper.rb
CHANGED
@@ -24,9 +24,8 @@ def load_schema
|
|
24
24
|
db_adapter = ENV['DB']
|
25
25
|
db_adapter ||= 'sqlite3'
|
26
26
|
|
27
|
-
if db_adapter.nil?
|
28
|
-
|
29
|
-
end
|
27
|
+
raise 'No DB Adapter selected. Pass the DB= option to pick one, or install Sqlite or Sqlite3.' if db_adapter.nil?
|
28
|
+
|
30
29
|
ActiveRecord::Base.establish_connection(config[db_adapter])
|
31
30
|
load(File.dirname(__FILE__) + '/schema.rb')
|
32
31
|
end
|
metadata
CHANGED
@@ -1,35 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: deep_cloneable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Reinier de Lange
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "<"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '6'
|
20
17
|
- - ">="
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: 3.1.0
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '7'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
|
-
- - "<"
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '6'
|
30
27
|
- - ">="
|
31
28
|
- !ruby/object:Gem::Version
|
32
29
|
version: 3.1.0
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '7'
|
33
33
|
description: 'Extends the functionality of ActiveRecord::Base#dup to perform a deep
|
34
34
|
clone that includes user specified associations. '
|
35
35
|
email: rjdelange@icloud.com
|
@@ -65,8 +65,13 @@ files:
|
|
65
65
|
- gemfiles/5.1.gemfile.lock
|
66
66
|
- gemfiles/5.2.gemfile
|
67
67
|
- gemfiles/5.2.gemfile.lock
|
68
|
+
- gemfiles/6.0.gemfile
|
69
|
+
- gemfiles/6.0.gemfile.lock
|
68
70
|
- init.rb
|
69
71
|
- lib/deep_cloneable.rb
|
72
|
+
- lib/deep_cloneable/association_not_found_exception.rb
|
73
|
+
- lib/deep_cloneable/deep_clone.rb
|
74
|
+
- lib/deep_cloneable/skip_validations.rb
|
70
75
|
- readme.md
|
71
76
|
- test/database.yml
|
72
77
|
- test/models.rb
|
@@ -92,8 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
92
97
|
- !ruby/object:Gem::Version
|
93
98
|
version: '0'
|
94
99
|
requirements: []
|
95
|
-
|
96
|
-
rubygems_version: 2.7.6
|
100
|
+
rubygems_version: 3.0.2
|
97
101
|
signing_key:
|
98
102
|
specification_version: 4
|
99
103
|
summary: This gem gives every ActiveRecord::Base object the possibility to do a deep
|