activeadmin_decorator 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -0
- data/Gemfile +1 -0
- data/lib/activeadmin/arbre_decorator.rb +1 -1
- data/lib/activeadmin/decorator/association.rb +45 -0
- data/lib/activeadmin/decorator.rb +13 -30
- data/lib/activeadmin_decorator/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c5fef3015a46bcf7b93b09a8a12018f117e4c301e208b24dba8b2f4405c5f81e
|
4
|
+
data.tar.gz: 89ef8d221f034e59303f563253cedbf3c6a49a49b5bf105ab5c550ec10822fe4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a0fa368c1a9acaf58cc87c76147fac4d5cdcc19404c0afbf137b6e0447eb8e8f89f927e492789b001e5d62a0435e6e6f7e5bb904975b8a2e1848065154ac5ea
|
7
|
+
data.tar.gz: aa450eea02e047f607b1552c8428585bada299f387d9f84900979a734e28f555febdcbef55775c2f4eee262fd20ee15917133ddb3b8983abff2f1521cf94716e
|
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveAdmin
|
4
|
+
class Decorator < SimpleDelegator
|
5
|
+
module Association
|
6
|
+
class << self
|
7
|
+
def decorate(association, with: nil, parent: nil)
|
8
|
+
raise ArgumentError, "parent or with required" if parent.nil? && with.nil?
|
9
|
+
|
10
|
+
if association.nil?
|
11
|
+
nil
|
12
|
+
elsif association.respond_to?(:each)
|
13
|
+
decorate_many(association, with, parent)
|
14
|
+
else
|
15
|
+
decorate_one(association, with, parent)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def decorate_many(association, with, parent)
|
20
|
+
with ||=
|
21
|
+
if association.is_a?(ActiveRecord::Relation)
|
22
|
+
decorator_class_name_for(parent, association.klass)
|
23
|
+
else
|
24
|
+
decorator_class_name_for(parent, association.first.class)
|
25
|
+
end
|
26
|
+
with = with.constantize if with.is_a?(String)
|
27
|
+
association.map { |item| with.new(item) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def decorate_one(element, with, parent)
|
31
|
+
with ||= decorator_class_name_for(parent, element.class)
|
32
|
+
with = with.constantize if with.is_a?(String)
|
33
|
+
with.new(element)
|
34
|
+
end
|
35
|
+
|
36
|
+
def decorator_class_name_for(parent, klass)
|
37
|
+
parent_class_elements = parent.class.name.split("::")
|
38
|
+
prefix = parent_class_elements[0...-1]
|
39
|
+
suffix = parent_class_elements[-1].sub(/^#{parent.model.class.name}/, "")
|
40
|
+
[*prefix, klass].join("::").concat(suffix)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "delegate"
|
4
|
+
require_relative "decorator/association"
|
4
5
|
|
5
6
|
module ActiveAdmin
|
6
7
|
class Decorator < SimpleDelegator
|
@@ -8,32 +9,23 @@ module ActiveAdmin
|
|
8
9
|
# Utility method for ActiveAdmin
|
9
10
|
def decorate(*args)
|
10
11
|
object = args[0]
|
11
|
-
|
12
|
-
object.map { |o| new(o) }
|
13
|
-
else
|
14
|
-
new(object)
|
15
|
-
end
|
12
|
+
Association.decorate(object, with: self)
|
16
13
|
end
|
17
14
|
|
18
15
|
# use in decorator to decorate association
|
19
|
-
def decorates_association(association, relation: association, with: nil)
|
16
|
+
def decorates_association(association, relation: association, with: nil) # rubocop:disable Metrics/MethodLength
|
17
|
+
raise ArgumentError, "relation must be a Symbol or Proc" unless relation.is_a?(Symbol) || relation.is_a?(Proc)
|
18
|
+
|
20
19
|
define_method(association) do
|
21
|
-
|
22
|
-
|
23
|
-
when Symbol then model.send(relation)
|
24
|
-
when Proc then relation.call(model)
|
25
|
-
else raise ArgumentError, "relation must be a Symbol or Proc"
|
26
|
-
end
|
27
|
-
if associated.is_a?(ActiveRecord::Relation)
|
28
|
-
with ||= decorator_class_name_for(associated.klass)
|
29
|
-
with = with.constantize if with.is_a?(String)
|
30
|
-
associated = associated.map { |item| with.new(item) }
|
20
|
+
if instance_variable_defined?("@#{association}_decorated")
|
21
|
+
then instance_variable_get("@#{association}_decorated")
|
31
22
|
else
|
32
|
-
|
33
|
-
|
34
|
-
|
23
|
+
result =
|
24
|
+
if relation.is_a?(Proc) then relation.call(model)
|
25
|
+
elsif relation.is_a?(Symbol) then model.send(relation)
|
26
|
+
end
|
27
|
+
instance_variable_set("@#{association}_decorated", Association.decorate(result, with:, parent: self))
|
35
28
|
end
|
36
|
-
associated
|
37
29
|
end
|
38
30
|
end
|
39
31
|
end
|
@@ -41,14 +33,5 @@ module ActiveAdmin
|
|
41
33
|
def model = __getobj__
|
42
34
|
|
43
35
|
def nil? = model.nil?
|
44
|
-
|
45
|
-
private
|
46
|
-
|
47
|
-
# autodetect decorator class name for association
|
48
|
-
def decorator_class_name_for(klass)
|
49
|
-
@prefix ||= self.class.name.split('::')[0...-1].freeze
|
50
|
-
@suffix ||= self.class.name.split('::')[-1].sub(/^#{model.class.name}/, '').freeze
|
51
|
-
[*@prefix, klass].join('::').concat(@suffix)
|
52
|
-
end
|
53
36
|
end
|
54
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activeadmin_decorator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michal Papis
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activeadmin
|
@@ -69,6 +69,7 @@ files:
|
|
69
69
|
- Rakefile
|
70
70
|
- lib/activeadmin/arbre_decorator.rb
|
71
71
|
- lib/activeadmin/decorator.rb
|
72
|
+
- lib/activeadmin/decorator/association.rb
|
72
73
|
- lib/activeadmin_decorator.rb
|
73
74
|
- lib/activeadmin_decorator/version.rb
|
74
75
|
- sig/activeadmin_decorator.rbs
|