deep_cloneable 1.3.1 → 1.4.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.
- data/Gemfile +10 -0
- data/Gemfile.lock +100 -0
- data/README.rdoc +7 -0
- data/Rakefile +0 -2
- data/VERSION +1 -1
- data/deep_cloneable.gemspec +21 -10
- data/lib/deep_cloneable.rb +23 -4
- data/test/test_deep_cloneable.rb +9 -0
- data/test/test_helper.rb +3 -1
- metadata +57 -4
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
deep_cloneable (1.3.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
actionmailer (3.2.2)
|
10
|
+
actionpack (= 3.2.2)
|
11
|
+
mail (~> 2.4.0)
|
12
|
+
actionpack (3.2.2)
|
13
|
+
activemodel (= 3.2.2)
|
14
|
+
activesupport (= 3.2.2)
|
15
|
+
builder (~> 3.0.0)
|
16
|
+
erubis (~> 2.7.0)
|
17
|
+
journey (~> 1.0.1)
|
18
|
+
rack (~> 1.4.0)
|
19
|
+
rack-cache (~> 1.1)
|
20
|
+
rack-test (~> 0.6.1)
|
21
|
+
sprockets (~> 2.1.2)
|
22
|
+
activemodel (3.2.2)
|
23
|
+
activesupport (= 3.2.2)
|
24
|
+
builder (~> 3.0.0)
|
25
|
+
activerecord (3.2.2)
|
26
|
+
activemodel (= 3.2.2)
|
27
|
+
activesupport (= 3.2.2)
|
28
|
+
arel (~> 3.0.2)
|
29
|
+
tzinfo (~> 0.3.29)
|
30
|
+
activeresource (3.2.2)
|
31
|
+
activemodel (= 3.2.2)
|
32
|
+
activesupport (= 3.2.2)
|
33
|
+
activesupport (3.2.2)
|
34
|
+
i18n (~> 0.6)
|
35
|
+
multi_json (~> 1.0)
|
36
|
+
arel (3.0.2)
|
37
|
+
builder (3.0.0)
|
38
|
+
erubis (2.7.0)
|
39
|
+
git (1.2.5)
|
40
|
+
hike (1.2.1)
|
41
|
+
i18n (0.6.0)
|
42
|
+
jeweler (1.8.3)
|
43
|
+
bundler (~> 1.0)
|
44
|
+
git (>= 1.2.5)
|
45
|
+
rake
|
46
|
+
rdoc
|
47
|
+
journey (1.0.3)
|
48
|
+
json (1.6.6)
|
49
|
+
mail (2.4.4)
|
50
|
+
i18n (>= 0.4.0)
|
51
|
+
mime-types (~> 1.16)
|
52
|
+
treetop (~> 1.4.8)
|
53
|
+
mime-types (1.18)
|
54
|
+
multi_json (1.2.0)
|
55
|
+
polyglot (0.3.3)
|
56
|
+
rack (1.4.1)
|
57
|
+
rack-cache (1.2)
|
58
|
+
rack (>= 0.4)
|
59
|
+
rack-ssl (1.3.2)
|
60
|
+
rack
|
61
|
+
rack-test (0.6.1)
|
62
|
+
rack (>= 1.0)
|
63
|
+
rails (3.2.2)
|
64
|
+
actionmailer (= 3.2.2)
|
65
|
+
actionpack (= 3.2.2)
|
66
|
+
activerecord (= 3.2.2)
|
67
|
+
activeresource (= 3.2.2)
|
68
|
+
activesupport (= 3.2.2)
|
69
|
+
bundler (~> 1.0)
|
70
|
+
railties (= 3.2.2)
|
71
|
+
railties (3.2.2)
|
72
|
+
actionpack (= 3.2.2)
|
73
|
+
activesupport (= 3.2.2)
|
74
|
+
rack-ssl (~> 1.3.2)
|
75
|
+
rake (>= 0.8.7)
|
76
|
+
rdoc (~> 3.4)
|
77
|
+
thor (~> 0.14.6)
|
78
|
+
rake (0.9.2.2)
|
79
|
+
rdoc (3.12)
|
80
|
+
json (~> 1.4)
|
81
|
+
sprockets (2.1.2)
|
82
|
+
hike (~> 1.2)
|
83
|
+
rack (~> 1.0)
|
84
|
+
tilt (~> 1.1, != 1.3.0)
|
85
|
+
sqlite3 (1.3.5)
|
86
|
+
thor (0.14.6)
|
87
|
+
tilt (1.3.3)
|
88
|
+
treetop (1.4.10)
|
89
|
+
polyglot
|
90
|
+
polyglot (>= 0.3.1)
|
91
|
+
tzinfo (0.3.32)
|
92
|
+
|
93
|
+
PLATFORMS
|
94
|
+
ruby
|
95
|
+
|
96
|
+
DEPENDENCIES
|
97
|
+
deep_cloneable!
|
98
|
+
jeweler
|
99
|
+
rails
|
100
|
+
sqlite3
|
data/README.rdoc
CHANGED
@@ -50,11 +50,18 @@ If this is not an option for you, it is also possible to populate the dictionary
|
|
50
50
|
=== Cloning a model without an attribute or nested multiple attributes
|
51
51
|
pirate.dup :include => :parrot, :except => [:name, { :parrot => [:name] }]
|
52
52
|
|
53
|
+
=== Cloning with a block
|
54
|
+
pirate.dup :include => :parrot do |original, kopy|
|
55
|
+
kopy.cloned_from_id = original.id if kopy.respond_to?(:cloned_from_id)
|
56
|
+
end
|
57
|
+
|
53
58
|
== Contributors
|
54
59
|
|
55
60
|
* Michael He
|
56
61
|
* Indrek Juhkam
|
57
62
|
* Mart Karu
|
63
|
+
* Rolf Timmermans
|
64
|
+
* Ilya Kuzmin
|
58
65
|
|
59
66
|
== Note on Patches/Pull Requests
|
60
67
|
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.4.0
|
data/deep_cloneable.gemspec
CHANGED
@@ -4,20 +4,22 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "1.
|
7
|
+
s.name = "deep_cloneable"
|
8
|
+
s.version = "1.4.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = [
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
11
|
+
s.authors = ["Reinier de Lange"]
|
12
|
+
s.date = "2012-04-02"
|
13
|
+
s.description = "Extends the functionality of ActiveRecord::Base#clone to perform a deep clone that includes user specified associations. "
|
14
|
+
s.email = "r.j.delange@nedforce.nl"
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
17
|
"README.rdoc"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".document",
|
21
|
+
"Gemfile",
|
22
|
+
"Gemfile.lock",
|
21
23
|
"LICENSE",
|
22
24
|
"README.rdoc",
|
23
25
|
"Rakefile",
|
@@ -30,18 +32,27 @@ Gem::Specification.new do |s|
|
|
30
32
|
"test/test_deep_cloneable.rb",
|
31
33
|
"test/test_helper.rb"
|
32
34
|
]
|
33
|
-
s.homepage =
|
34
|
-
s.require_paths = [
|
35
|
-
s.rubygems_version =
|
36
|
-
s.summary =
|
35
|
+
s.homepage = "http://github.com/moiristo/deep_cloneable"
|
36
|
+
s.require_paths = ["lib"]
|
37
|
+
s.rubygems_version = "1.8.21"
|
38
|
+
s.summary = "This gem gives every ActiveRecord::Base object the possibility to do a deep clone."
|
37
39
|
|
38
40
|
if s.respond_to? :specification_version then
|
39
41
|
s.specification_version = 3
|
40
42
|
|
41
43
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
|
+
s.add_runtime_dependency(%q<deep_cloneable>, [">= 0"])
|
45
|
+
s.add_runtime_dependency(%q<rails>, [">= 0"])
|
46
|
+
s.add_runtime_dependency(%q<jeweler>, [">= 0"])
|
42
47
|
else
|
48
|
+
s.add_dependency(%q<deep_cloneable>, [">= 0"])
|
49
|
+
s.add_dependency(%q<rails>, [">= 0"])
|
50
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
43
51
|
end
|
44
52
|
else
|
53
|
+
s.add_dependency(%q<deep_cloneable>, [">= 0"])
|
54
|
+
s.add_dependency(%q<rails>, [">= 0"])
|
55
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
45
56
|
end
|
46
57
|
end
|
47
58
|
|
data/lib/deep_cloneable.rb
CHANGED
@@ -1,7 +1,24 @@
|
|
1
1
|
class ActiveRecord::Base
|
2
2
|
module DeepCloneable
|
3
3
|
@@rails31 = ActiveRecord::VERSION::MAJOR >= 3 && ActiveRecord::VERSION::MINOR > 0
|
4
|
-
|
4
|
+
|
5
|
+
# ActiveRecord::Base has its own dup method for Ruby 1.8.7. We have to
|
6
|
+
# redefine it and put it in a module so that we can override it in a
|
7
|
+
# module and call the original with super().
|
8
|
+
if @@rails31 and !Object.respond_to? :initialize_dup
|
9
|
+
ActiveRecord::Base.class_eval do
|
10
|
+
module Dup
|
11
|
+
def dup
|
12
|
+
copy = super
|
13
|
+
copy.initialize_dup(self)
|
14
|
+
copy
|
15
|
+
end
|
16
|
+
end
|
17
|
+
remove_method :dup
|
18
|
+
include Dup
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
5
22
|
# clones an ActiveRecord model.
|
6
23
|
# if passed the :include option, it will deep clone the given associations
|
7
24
|
# if passed the :except option, it won't clone the given attributes
|
@@ -42,7 +59,7 @@ class ActiveRecord::Base
|
|
42
59
|
# ==== Cloning a model without an attribute or nested multiple attributes
|
43
60
|
# pirate.clone :include => :parrot, :except => [:name, { :parrot => [:name] }]
|
44
61
|
#
|
45
|
-
define_method (@@rails31 ? :dup : :clone) do |*args|
|
62
|
+
define_method (@@rails31 ? :dup : :clone) do |*args, &block|
|
46
63
|
options = args[0] || {}
|
47
64
|
|
48
65
|
dict = options[:dictionary]
|
@@ -56,6 +73,8 @@ class ActiveRecord::Base
|
|
56
73
|
dict[tableized_class][self] ||= super()
|
57
74
|
end
|
58
75
|
|
76
|
+
block.call(self, kopy) if block
|
77
|
+
|
59
78
|
deep_exceptions = {}
|
60
79
|
if options[:except]
|
61
80
|
exceptions = options[:except].nil? ? [] : [options[:except]].flatten
|
@@ -81,7 +100,7 @@ class ActiveRecord::Base
|
|
81
100
|
|
82
101
|
cloned_object = case association_reflection.macro
|
83
102
|
when :belongs_to, :has_one
|
84
|
-
self.send(association) && self.send(association).send(__method__, opts)
|
103
|
+
self.send(association) && self.send(association).send(__method__, opts, &block)
|
85
104
|
when :has_many, :has_and_belongs_to_many
|
86
105
|
primary_key_name = (@@rails31 ? association_reflection.foreign_key : association_reflection.primary_key_name).to_s
|
87
106
|
|
@@ -90,7 +109,7 @@ class ActiveRecord::Base
|
|
90
109
|
end.try(:name)
|
91
110
|
|
92
111
|
self.send(association).collect do |obj|
|
93
|
-
tmp = obj.send(__method__, opts)
|
112
|
+
tmp = obj.send(__method__, opts, &block)
|
94
113
|
tmp.send("#{primary_key_name}=", nil)
|
95
114
|
tmp.send("#{reverse_association_name.to_s}=", kopy) if reverse_association_name
|
96
115
|
tmp
|
data/test/test_deep_cloneable.rb
CHANGED
@@ -150,4 +150,13 @@ class TestDeepCloneable < Test::Unit::TestCase
|
|
150
150
|
assert_equal 2, dup_human.chickens.count
|
151
151
|
end
|
152
152
|
|
153
|
+
def test_should_dup_with_block
|
154
|
+
dup = @jack.send(@@clone_method, :include => :parrot) do |original, kopy|
|
155
|
+
kopy.cloned_from_id = original.id
|
156
|
+
end
|
157
|
+
|
158
|
+
assert dup.save
|
159
|
+
assert_equal @jack.id, dup.cloned_from_id
|
160
|
+
assert_equal @jack.parrot.id, dup.parrot.cloned_from_id
|
161
|
+
end
|
153
162
|
end
|
data/test/test_helper.rb
CHANGED
@@ -34,7 +34,7 @@ end
|
|
34
34
|
|
35
35
|
class GoldPiece < ActiveRecord::Base; belongs_to :treasure end
|
36
36
|
class Matey < ActiveRecord::Base; belongs_to :pirate end
|
37
|
-
class Parrot < ActiveRecord::Base; belongs_to :pirate
|
37
|
+
class Parrot < ActiveRecord::Base; belongs_to :pirate; attr_accessor :cloned_from_id end
|
38
38
|
class BattleShip < ActiveRecord::Base; has_many :pirates, :as => :ship end
|
39
39
|
|
40
40
|
class Pirate < ActiveRecord::Base
|
@@ -44,6 +44,8 @@ class Pirate < ActiveRecord::Base
|
|
44
44
|
has_many :treasures, :foreign_key => 'owner'
|
45
45
|
has_many :gold_pieces, :through => :treasures
|
46
46
|
has_one :parrot
|
47
|
+
|
48
|
+
attr_accessor :cloned_from_id
|
47
49
|
end
|
48
50
|
|
49
51
|
class Treasure < ActiveRecord::Base
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: deep_cloneable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,56 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
13
|
-
dependencies:
|
12
|
+
date: 2012-04-02 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: deep_cloneable
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rails
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: jeweler
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
14
62
|
description: ! 'Extends the functionality of ActiveRecord::Base#clone to perform a
|
15
63
|
deep clone that includes user specified associations. '
|
16
64
|
email: r.j.delange@nedforce.nl
|
@@ -21,6 +69,8 @@ extra_rdoc_files:
|
|
21
69
|
- README.rdoc
|
22
70
|
files:
|
23
71
|
- .document
|
72
|
+
- Gemfile
|
73
|
+
- Gemfile.lock
|
24
74
|
- LICENSE
|
25
75
|
- README.rdoc
|
26
76
|
- Rakefile
|
@@ -44,6 +94,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
44
94
|
- - ! '>='
|
45
95
|
- !ruby/object:Gem::Version
|
46
96
|
version: '0'
|
97
|
+
segments:
|
98
|
+
- 0
|
99
|
+
hash: -1579513982850858765
|
47
100
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
101
|
none: false
|
49
102
|
requirements:
|
@@ -52,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
52
105
|
version: '0'
|
53
106
|
requirements: []
|
54
107
|
rubyforge_project:
|
55
|
-
rubygems_version: 1.8.
|
108
|
+
rubygems_version: 1.8.21
|
56
109
|
signing_key:
|
57
110
|
specification_version: 3
|
58
111
|
summary: This gem gives every ActiveRecord::Base object the possibility to do a deep
|