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 CHANGED
@@ -9,7 +9,7 @@ gem "activerecord"
9
9
  # Include everything needed to run rake, tests, features, etc.
10
10
  group :development do
11
11
  gem "rspec", "~> 2.3.0"
12
- gem "bundler", "~> 1.0.0"
12
+ gem "bundler"
13
13
  gem "jeweler", "~> 1.6.4"
14
14
  gem "rcov", ">= 0"
15
15
  end
data/Gemfile.lock CHANGED
@@ -41,7 +41,7 @@ PLATFORMS
41
41
  DEPENDENCIES
42
42
  activerecord
43
43
  activesupport
44
- bundler (~> 1.0.0)
44
+ bundler
45
45
  jeweler (~> 1.6.4)
46
46
  rcov
47
47
  rspec (~> 2.3.0)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "activerecord_clone"
8
- s.version = "0.1.0"
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>, ["~> 1.0.0"])
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>, ["~> 1.0.0"])
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>, ["~> 1.0.0"])
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
@@ -27,7 +27,7 @@ module ActiveRecord
27
27
  @options = {}
28
28
 
29
29
  def can_clone(options={})
30
- @options = default_options.merge(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)).merge(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
 
@@ -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.0
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: &2152873640 !ruby/object:Gem::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: *2152873640
25
+ version_requirements: *2169345520
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: activerecord
28
- requirement: &2152873160 !ruby/object:Gem::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: *2152873160
36
+ version_requirements: *2169344920
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: rspec
39
- requirement: &2152872680 !ruby/object:Gem::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: *2152872680
47
+ version_requirements: *2169344320
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: bundler
50
- requirement: &2152872200 !ruby/object:Gem::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: 1.0.0
55
+ version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *2152872200
58
+ version_requirements: *2169343660
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: jeweler
61
- requirement: &2152871720 !ruby/object:Gem::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: *2152871720
69
+ version_requirements: *2169343180
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rcov
72
- requirement: &2168729400 !ruby/object:Gem::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: *2168729400
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: -753603999457149900
121
+ hash: 136612710791117306
122
122
  required_rubygems_version: !ruby/object:Gem::Requirement
123
123
  none: false
124
124
  requirements: