acts_as_inheritable 0.4.0 → 0.5.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/.codeclimate.yml +3 -0
- data/README.md +21 -0
- data/lib/acts_as_inheritable.rb +15 -11
- data/lib/acts_as_inheritable/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 391d2159779c617d4641194c7a9e49585763661f
|
4
|
+
data.tar.gz: 96ff7393944b993f84b0976e31e88b38669fcc62
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3bfcbbc59f32c2205ffa8debfa389d5ef5301b2fc641ad8ba38fe9b0cbf356b0d6727039451b3ca545f02c07b28063bd81d9cebfac4f23fc5cbea9ed433851a
|
7
|
+
data.tar.gz: 6d4c676e640ac8f32c8b8ce100446a38cef44702a5c5e8196c0150ca7ad2d6ec372e9030430ccd8e3c40d46880d030335956f819036765c3bd582d894b659b5a
|
data/.codeclimate.yml
CHANGED
@@ -17,6 +17,9 @@ engines:
|
|
17
17
|
# to turn off an engine, set enabled to `false` or remove it
|
18
18
|
rubocop:
|
19
19
|
enabled: true
|
20
|
+
checks:
|
21
|
+
Rubocop/Style/Documentation:
|
22
|
+
enabled: false
|
20
23
|
|
21
24
|
# Engines can analyze files and report issues on them, but you can separately
|
22
25
|
# decide which files will receive ratings based on those issues. This is
|
data/README.md
CHANGED
@@ -101,6 +101,19 @@ son.pet.inspect # => #<Pet id: 2, person_id: 2, name: "Mango", breed: "Golden Re
|
|
101
101
|
|
102
102
|
````
|
103
103
|
|
104
|
+
### Handling your own `dup`
|
105
|
+
|
106
|
+
By default new relations are _duplicated_ using [dup](http://ruby-doc.org/core-2.2.3/Object.html#method-i-dup), which produces a shallow copy of the object. But you can also handle this as you want by defining a `duplicate!` method.
|
107
|
+
|
108
|
+
|
109
|
+
## Testing
|
110
|
+
|
111
|
+
All tests follow the RSpec format and are located in the spec directory. They can be run with:
|
112
|
+
|
113
|
+
````bash
|
114
|
+
$ rspec
|
115
|
+
````
|
116
|
+
|
104
117
|
## Contributing
|
105
118
|
|
106
119
|
1. Fork it ( https://github.com/esbanarango/acts_as_inheritable/fork )
|
@@ -109,6 +122,14 @@ son.pet.inspect # => #<Pet id: 2, person_id: 2, name: "Mango", breed: "Golden Re
|
|
109
122
|
4. Push to the branch (`git push origin my-new-feature`)
|
110
123
|
5. Create a new Pull Request
|
111
124
|
|
125
|
+
## Donating
|
126
|
+
Support this project and [others by esbanarango][gratipay-esbanarango] via [gratipay][gratipay-esbanarango].
|
127
|
+
|
128
|
+
[![Support via Gratipay][gratipay]][gratipay-esbanarango]
|
129
|
+
|
130
|
+
[gratipay]: https://cdn.rawgit.com/gratipay/gratipay-badge/2.3.0/dist/gratipay.png
|
131
|
+
[gratipay-esbanarango]: https://gratipay.com/esbanarango/
|
132
|
+
|
112
133
|
## Author
|
113
134
|
|
114
135
|
This was written by [Esteban Arango Medina](http://esbanarango.com) while working at [Blue Sky Cards](https://www.blueskycards.com/).
|
data/lib/acts_as_inheritable.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'active_record'
|
2
|
-
require
|
2
|
+
require 'acts_as_inheritable/version'
|
3
3
|
|
4
4
|
module ActsAsInheritable
|
5
5
|
def acts_as_inheritable(options)
|
6
|
-
|
7
|
-
|
6
|
+
fail ArgumentError, "Hash expected, got #{options.class.name}" unless options.is_a?(Hash)
|
7
|
+
fail ArgumentError, 'Empty options' if options[:attributes].blank? && options[:associations].blank?
|
8
8
|
|
9
9
|
class_attribute :inheritable_configuration
|
10
10
|
|
@@ -20,8 +20,8 @@ module ActsAsInheritable
|
|
20
20
|
# relations defined on `INHERITABLE_ASSOCIATIONS`. For each instance on
|
21
21
|
# each relation it re-creates it.
|
22
22
|
def inherit_relations(model_parent = send(:parent), current = self)
|
23
|
-
if model_parent &&
|
24
|
-
|
23
|
+
if model_parent && current.class.method_defined?(:inheritable_configuration) && current.class.inheritable_configuration[:associations]
|
24
|
+
current.class.inheritable_configuration[:associations].each do |relation|
|
25
25
|
parent_relation = model_parent.send(relation)
|
26
26
|
relation_instances = parent_relation.respond_to?(:each) ? parent_relation : [parent_relation].compact
|
27
27
|
relation_instances.each do |relation_instance|
|
@@ -55,22 +55,25 @@ module ActsAsInheritable
|
|
55
55
|
return parent_name if new_relation.respond_to?(parent_name)
|
56
56
|
many_and_one_associations = model_parent.class.reflect_on_all_associations.select { |a| a.macro != :belongs_to }
|
57
57
|
many_and_one_associations.each do |association|
|
58
|
-
|
59
|
-
|
60
|
-
|
58
|
+
next unless association.klass.to_s.downcase == new_relation.class.to_s.downcase && association.options.key?(:as)
|
59
|
+
as = association.options[:as].to_s
|
60
|
+
if new_relation.respond_to?(as) && !new_relation.respond_to?(parent_name)
|
61
|
+
parent_name = as
|
61
62
|
break
|
62
63
|
end
|
63
64
|
end
|
64
65
|
# Relations has a diffeent name
|
65
66
|
unless new_relation.respond_to?(parent_name)
|
66
|
-
new_relation.class.reflections.each_key
|
67
|
-
|
67
|
+
new_relation.class.reflections.each_key do |reflection|
|
68
|
+
next unless new_relation.class.reflections[reflection].class_name == model_parent.class.name
|
69
|
+
parent_name = reflection
|
70
|
+
break
|
68
71
|
end
|
69
72
|
end
|
70
73
|
parent_name
|
71
74
|
end
|
72
75
|
|
73
|
-
def inherit_attributes(force = false, not_force_for=[])
|
76
|
+
def inherit_attributes(force = false, not_force_for = [])
|
74
77
|
if has_parent? && self.class.inheritable_configuration[:attributes]
|
75
78
|
# Attributes
|
76
79
|
self.class.inheritable_configuration[:attributes].each do |attribute|
|
@@ -83,6 +86,7 @@ module ActsAsInheritable
|
|
83
86
|
end
|
84
87
|
end
|
85
88
|
end
|
89
|
+
|
86
90
|
if defined?(ActiveRecord)
|
87
91
|
# Extend ActiveRecord's functionality
|
88
92
|
ActiveRecord::Base.send :extend, ActsAsInheritable
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_inheritable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Esteban Arango Medina
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|