deep_cloneable 2.4.0 → 3.0.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.
- 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
|