rails_admin_clone 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YzYwNjFlYzE1M2E3N2E3NzY3YmVjM2QxZWI1MjljY2Y2NDE5NWIyMw==
5
+ data.tar.gz: !binary |-
6
+ ZTUzZDE3MTlmZmU2MmZjNTQwODFiMDZhM2Y3YmM3MWZlYzdkMTRlZQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ YjM3YmQ5NjBlY2E1NmYzMjg5OTlhMTM3NTdmNGFmNDg0OWNkYTc1ZTBhZDU0
10
+ MzI2NzBhYmFmMTlhYjdjYjhhZWY2Yzg5NmJlMDFjZDM0ZjNhMDBiN2YzMzVh
11
+ OTlkMTJjZTFhNGM0Y2IxYTMwNWE0NDExNjljYTUzNTFiODNlNzg=
12
+ data.tar.gz: !binary |-
13
+ NDc5MzI0NjI4MTg1N2RmMGQxNWExMzIzZjA0NjFmYTFhZGMyMzRmOGZmMTli
14
+ MGJiN2Q0ZThmYzc3ZTAzZTljYmMyNTFlY2NjZDRjY2U2ZWY2ZjdkOWM4YmE3
15
+ ODA4Y2Y5NWNiNThlMzRkYjI2Yjk3ZWNhYzM1NGRhZGNkZGUxNTE=
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2013 YOURNAME
1
+ Copyright 2013 Andrea Dal Ponte
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -9,62 +9,85 @@ module RailsAdminClone
9
9
  @original_model
10
10
  end
11
11
 
12
- def default_clone
13
- new_object = self.clone_object(self.original_model)
12
+ def class_model
13
+ original_model.class
14
+ end
14
15
 
15
- self.clone_recursively!(self.original_model, new_object)
16
- begin
17
- self.clone_recursively!(self.original_model, new_object)
18
- rescue Exception => e
19
- Rails.logger.info "RailsAdminClone Exception on clone_recursively!:\n#{e}"
20
- end
16
+ def default_clone
17
+ new_object = clone_object(original_model)
18
+ clone_recursively!(original_model, new_object)
21
19
 
22
20
  new_object
23
21
  end
24
22
 
25
23
  def method_clone(method)
26
- self.original_model.send(method)
24
+ original_model.send(method)
27
25
  end
28
26
 
29
27
  protected
30
28
 
31
- def clone_recursively!(old_object, new_object)
32
- new_object = clone_has_one(old_object, new_object)
33
- new_object = clone_habtm(old_object, new_object)
34
- new_object = clone_has_many(old_object, new_object)
29
+ def class_with_strong_parameters?(klass)
30
+ defined?(ActiveModel::ForbiddenAttributesProtection) && klass.include?(ActiveModel::ForbiddenAttributesProtection)
31
+ end
32
+
33
+ def timestamp_columns
34
+ %w(created_at created_on updated_at updated_on)
35
+ end
36
+
37
+ def attributes_black_list_from_model(model)
38
+ [model.primary_key, model.inheritance_column] + timestamp_columns
39
+ end
40
+
41
+ def attributes_black_list_from_association(association)
42
+ model = association.class_name.constantize
43
+ attributes = attributes_black_list_from_model(model)
44
+ attributes + [association.try(:foreign_key), association.try(:type)]
45
+ end
46
+
47
+ def get_model_attributes_from(object)
48
+ object.attributes.select do |k,v|
49
+ !attributes_black_list_from_model(object.class).include?(k)
50
+ end
51
+ end
52
+
53
+ def get_association_attributes_from(object, association)
54
+ object.attributes.select do |k,v|
55
+ !attributes_black_list_from_association(association).include?(k)
56
+ end
57
+ end
58
+
59
+ def assign_attributes_for(object, attributes)
60
+ if class_with_strong_parameters?(object.class)
61
+ object.assign_attributes attributes
62
+ else
63
+ object.assign_attributes attributes, without_protection: true
64
+ end
65
+ end
35
66
 
67
+ # deep clone
68
+ def clone_recursively!(old_object, new_object)
69
+ new_object = clone_has_one old_object, new_object
70
+ new_object = clone_habtm old_object, new_object
71
+ new_object = clone_has_many old_object, new_object
36
72
 
37
73
  new_object
38
74
  end
39
75
 
40
76
  # clone object without associations
41
77
  def clone_object(old_object)
42
- object = build_from(old_object)
43
- attributes = old_object.attributes.select do |k,v|
44
- ![object.class.primary_key, 'created_at', 'updated_at'].include?(k)
45
- end
78
+ object = build_from(old_object)
79
+ assign_attributes_for(object, get_model_attributes_from(old_object))
46
80
 
47
- object.assign_attributes attributes, without_protection: true
48
81
  object
49
82
  end
50
83
 
51
84
  # clone has_one associations
52
85
  def clone_has_one(old_object, new_object)
53
- old_object.class.reflect_on_all_associations(:has_one).each do |class_association|
54
- association_name = class_association.name
55
- old_association = old_object.send(association_name)
56
-
57
- if old_association
58
- # primary_key = association_name.to_s.singularize.camelize.constantize.try(:primary_key) || 'id'
59
- primary_key = 'id'
60
-
61
- attributes = old_association.attributes.select do |k,v|
62
- ![primary_key, class_association.try(:foreign_key), class_association.try(:type), 'created_at', 'updated_at'].include?(k)
63
- end
64
-
65
- new_object.send(:"build_#{association_name}").tap do |new_association|
66
- new_association.assign_attributes attributes, without_protection: true
67
- new_association = self.clone_recursively!(old_association, new_association)
86
+ old_object.class.reflect_on_all_associations(:has_one).each do |association|
87
+ if old_association = old_object.send(association.name)
88
+ new_object.send(:"build_#{association.name}").tap do |new_association|
89
+ assign_attributes_for(new_association, get_association_attributes_from(old_association, association))
90
+ new_association = clone_recursively!(old_association, new_association)
68
91
  end
69
92
  end
70
93
  end
@@ -77,19 +100,11 @@ module RailsAdminClone
77
100
  associations = old_object.class.reflect_on_all_associations(:has_many)
78
101
  .select{|a| !a.options.keys.include?(:through)}
79
102
 
80
- associations.each do |class_association|
81
- association_name = class_association.name
82
- # primary_key = association_name.to_s.singularize.camelize.constantize.try(:primary_key) || 'id'
83
- primary_key = 'id'
84
-
85
- old_object.send(association_name).each do |old_association|
86
- attributes = old_association.attributes.select do |k,v|
87
- ![primary_key, class_association.try(:foreign_key), class_association.try(:type), 'created_at', 'updated_at'].include?(k)
88
- end
89
-
90
- new_object.send(association_name).build.tap do |new_association|
91
- new_association.assign_attributes attributes, without_protection: true
92
- new_association = self.clone_recursively!(old_association, new_association)
103
+ associations.each do |association|
104
+ old_object.send(association.name).each do |old_association|
105
+ new_object.send(association.name).build.tap do |new_association|
106
+ assign_attributes_for(new_association, get_association_attributes_from(old_association, association))
107
+ new_association = clone_recursively!(old_association, new_association)
93
108
  end
94
109
  end
95
110
  end
@@ -103,12 +118,8 @@ module RailsAdminClone
103
118
  a.macro == :has_and_belongs_to_many || (a.macro == :has_many && a.options.keys.include?(:through))
104
119
  end
105
120
 
106
- associations.each do |class_association|
107
- association_name = class_association.name
108
- method_ids = "#{association_name.to_s.singularize.to_sym}_ids"
109
-
110
- Rails.logger.info "**** association_name: #{association_name}"
111
-
121
+ associations.each do |association|
122
+ method_ids = "#{association.name.to_s.singularize.to_sym}_ids"
112
123
  new_object.send(:"#{method_ids}=", old_object.send(method_ids))
113
124
  end
114
125
 
@@ -1,3 +1,3 @@
1
1
  module RailsAdminClone
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
metadata CHANGED
@@ -1,36 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_admin_clone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
5
- prerelease:
4
+ version: 0.0.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Andrea Dal Ponte
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-10-14 00:00:00.000000000 Z
11
+ date: 2013-11-21 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rails
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
21
- version: '3.1'
19
+ version: '3.2'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ! '>='
28
25
  - !ruby/object:Gem::Version
29
- version: '3.1'
26
+ version: '3.2'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rails_admin
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ! '>='
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ! '>='
44
39
  - !ruby/object:Gem::Version
@@ -63,26 +58,25 @@ files:
63
58
  homepage: https://github.com/dalpo/rails_admin_clone
64
59
  licenses:
65
60
  - MIT
61
+ metadata: {}
66
62
  post_install_message:
67
63
  rdoc_options: []
68
64
  require_paths:
69
65
  - lib
70
66
  required_ruby_version: !ruby/object:Gem::Requirement
71
- none: false
72
67
  requirements:
73
68
  - - ! '>='
74
69
  - !ruby/object:Gem::Version
75
70
  version: '0'
76
71
  required_rubygems_version: !ruby/object:Gem::Requirement
77
- none: false
78
72
  requirements:
79
73
  - - ! '>='
80
74
  - !ruby/object:Gem::Version
81
75
  version: '0'
82
76
  requirements: []
83
77
  rubyforge_project:
84
- rubygems_version: 1.8.25
78
+ rubygems_version: 2.1.10
85
79
  signing_key:
86
- specification_version: 3
80
+ specification_version: 4
87
81
  summary: Rails Admin plugin to clone existing records
88
82
  test_files: []