activerecord_clone 0.1.0 → 0.1.1
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 +1 -1
- data/Gemfile.lock +1 -1
- data/VERSION +1 -1
- data/activerecord_clone.gemspec +4 -4
- data/lib/active_record/clone.rb +4 -2
- data/lib/activerecord_clone.rb +79 -0
- metadata +16 -16
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
data/activerecord_clone.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "activerecord_clone"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["science", "buffpojken"]
|
@@ -47,14 +47,14 @@ Gem::Specification.new do |s|
|
|
47
47
|
s.add_runtime_dependency(%q<activesupport>, [">= 0"])
|
48
48
|
s.add_runtime_dependency(%q<activerecord>, [">= 0"])
|
49
49
|
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
50
|
-
s.add_development_dependency(%q<bundler>, ["
|
50
|
+
s.add_development_dependency(%q<bundler>, [">= 0"])
|
51
51
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
52
52
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
53
53
|
else
|
54
54
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
55
55
|
s.add_dependency(%q<activerecord>, [">= 0"])
|
56
56
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
57
|
-
s.add_dependency(%q<bundler>, ["
|
57
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
58
58
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
59
59
|
s.add_dependency(%q<rcov>, [">= 0"])
|
60
60
|
end
|
@@ -62,7 +62,7 @@ Gem::Specification.new do |s|
|
|
62
62
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
63
63
|
s.add_dependency(%q<activerecord>, [">= 0"])
|
64
64
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
65
|
-
s.add_dependency(%q<bundler>, ["
|
65
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
66
66
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
67
67
|
s.add_dependency(%q<rcov>, [">= 0"])
|
68
68
|
end
|
data/lib/active_record/clone.rb
CHANGED
@@ -27,7 +27,7 @@ module ActiveRecord
|
|
27
27
|
@options = {}
|
28
28
|
|
29
29
|
def can_clone(options={})
|
30
|
-
@options = default_options.
|
30
|
+
@options = default_options.keep_merge(options)
|
31
31
|
end
|
32
32
|
|
33
33
|
private
|
@@ -50,12 +50,14 @@ module ActiveRecord
|
|
50
50
|
module InstanceMethods
|
51
51
|
|
52
52
|
def clone_ar(options={})
|
53
|
-
options = (self.instance_variable_get(:@options) ? self.instance_variable_get(:@options) : self.class.send(:default_options)).
|
53
|
+
options = (self.instance_variable_get(:@options) ? self.instance_variable_get(:@options) : self.class.send(:default_options)).keep_merge(options)
|
54
|
+
puts options
|
54
55
|
attrs = []
|
55
56
|
if options[:only] and options[:only].is_a? Array
|
56
57
|
attrs = self.attribute_names.reject {|item| options[:only].include? item}
|
57
58
|
else
|
58
59
|
excluded = options[:excluded] + (options[:skip_relations] ? self.class.send(:foreing_keys) : [])
|
60
|
+
|
59
61
|
attrs = self.attribute_names.reject { |item| excluded.include? item}
|
60
62
|
end
|
61
63
|
|
data/lib/activerecord_clone.rb
CHANGED
@@ -1,2 +1,81 @@
|
|
1
|
+
class Hash
|
2
|
+
|
3
|
+
# Merges self with another hash, recursively.
|
4
|
+
#
|
5
|
+
# This code was lovingly stolen from some random gem:
|
6
|
+
# http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
|
7
|
+
#
|
8
|
+
# Thanks to whoever made it.
|
9
|
+
|
10
|
+
def deep_merge(hash)
|
11
|
+
target = dup
|
12
|
+
|
13
|
+
hash.keys.each do |key|
|
14
|
+
if hash[key].is_a? Hash and self[key].is_a? Hash
|
15
|
+
target[key] = target[key].deep_merge(hash[key])
|
16
|
+
next
|
17
|
+
end
|
18
|
+
|
19
|
+
target[key] = hash[key]
|
20
|
+
end
|
21
|
+
|
22
|
+
target
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
# From: http://www.gemtacular.com/gemdocs/cerberus-0.2.2/doc/classes/Hash.html
|
27
|
+
# File lib/cerberus/utils.rb, line 42
|
28
|
+
|
29
|
+
def deep_merge!(second)
|
30
|
+
second.each_pair do |k,v|
|
31
|
+
if self[k].is_a?(Hash) and second[k].is_a?(Hash)
|
32
|
+
self[k].deep_merge!(second[k])
|
33
|
+
else
|
34
|
+
self[k] = second[k]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
#-----------------
|
41
|
+
|
42
|
+
# cf. http://subtech.g.hatena.ne.jp/cho45/20061122
|
43
|
+
def deep_merge2(other)
|
44
|
+
deep_proc = Proc.new { |k, s, o|
|
45
|
+
if s.kind_of?(Hash) && o.kind_of?(Hash)
|
46
|
+
next s.merge(o, &deep_proc)
|
47
|
+
end
|
48
|
+
next o
|
49
|
+
}
|
50
|
+
merge(other, &deep_proc)
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
def deep_merge3(second)
|
55
|
+
|
56
|
+
# From: http://www.ruby-forum.com/topic/142809
|
57
|
+
# Author: Stefan Rusterholz
|
58
|
+
|
59
|
+
merger = proc { |key,v1,v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
|
60
|
+
self.merge(second, &merger)
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
def keep_merge(hash)
|
66
|
+
target = dup
|
67
|
+
hash.keys.each do |key|
|
68
|
+
if hash[key].is_a? Hash and self[key].is_a? Hash
|
69
|
+
target[key] = target[key].keep_merge(hash[key])
|
70
|
+
next
|
71
|
+
end
|
72
|
+
#target[key] = hash[key]
|
73
|
+
target.update(hash) { |key, *values| values.flatten.uniq }
|
74
|
+
end
|
75
|
+
target
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
1
80
|
require 'active_record/clone'
|
2
81
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord_clone
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -14,7 +14,7 @@ date: 2011-10-19 00:00:00.000000000Z
|
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
17
|
-
requirement: &
|
17
|
+
requirement: &2169345520 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *2169345520
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: activerecord
|
28
|
-
requirement: &
|
28
|
+
requirement: &2169344920 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *2169344920
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: rspec
|
39
|
-
requirement: &
|
39
|
+
requirement: &2169344320 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
@@ -44,21 +44,21 @@ dependencies:
|
|
44
44
|
version: 2.3.0
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *2169344320
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: bundler
|
50
|
-
requirement: &
|
50
|
+
requirement: &2169343660 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - ! '>='
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
55
|
+
version: '0'
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *2169343660
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: jeweler
|
61
|
-
requirement: &
|
61
|
+
requirement: &2169343180 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - ~>
|
@@ -66,10 +66,10 @@ dependencies:
|
|
66
66
|
version: 1.6.4
|
67
67
|
type: :development
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *2169343180
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rcov
|
72
|
-
requirement: &
|
72
|
+
requirement: &2169342600 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - ! '>='
|
@@ -77,7 +77,7 @@ dependencies:
|
|
77
77
|
version: '0'
|
78
78
|
type: :development
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *2169342600
|
81
81
|
description: ! "Provides the method of 'clone_ar' that can clone your current object.\n
|
82
82
|
\ Accepts options on both class level and method call level."
|
83
83
|
email: emil.palm@qubator.com
|
@@ -118,7 +118,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
118
118
|
version: '0'
|
119
119
|
segments:
|
120
120
|
- 0
|
121
|
-
hash:
|
121
|
+
hash: 136612710791117306
|
122
122
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
123
|
none: false
|
124
124
|
requirements:
|