para 0.9.3.2 → 0.9.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6deb45940599a543b4257463561e645256df1db47b9cef62f1d287b97e841abd
4
- data.tar.gz: a37ab4aca7ab0c23baf41a65083c84bdbdb6d6fe12437621b08f9a4f49baf22d
3
+ metadata.gz: 45b33c0018d1c19e222c84f62ef8c0eb3820fbbe60dcc6c99da7a40bf229fc1b
4
+ data.tar.gz: fe48b49c545495cc4103418d4c75f3d34447b1003ef690ac45076768509cfc30
5
5
  SHA512:
6
- metadata.gz: 229be291a706963be79ef902fb99fdedad27092a62f8c855d912b57c21d10f94ed8e9ffd254a9bb1f29ae465ab6ec1cbe3753af53096778ce6131bdca83ef3b3
7
- data.tar.gz: 10e5675bb29448fd949112632bda77b2dc897d7ca3b2d2dd8dfbac4ef47a19d8ddf629aa6ef40cea98dbfed05bfc716afe8fe06b1c57b950e2af8b541f859672
6
+ metadata.gz: f8e403bd825fbeba4dd042eb2a01a0f17562b9ab145ec400aa216ed81ed07e483b2b22984e9c6a63b55408367ef7b0faf7022e931a262fe61640a1fffc7c03da
7
+ data.tar.gz: c9e6a4da03d11873890d5c7c1c338f109fe03f0ebfe605022b304bce43758f650e05580df1899b5c68bfe523d47b16e3988f86ed5247b9e999bd4dd1816fef87
@@ -2,6 +2,7 @@ module Para
2
2
  module Breadcrumbs
3
3
  module Controller
4
4
  extend ActiveSupport::Concern
5
+ include ActionController::Helpers
5
6
 
6
7
  included do
7
8
  class_attribute :_class_level_breadcrumbs
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Para
2
4
  module Cloneable
3
5
  # This object acts as a service to compile a nested cloneable options hash to be
@@ -49,7 +51,7 @@ module Para
49
51
  # }
50
52
  #
51
53
  class IncludeTreeBuilder
52
- attr_reader :resource, :cloneable_options
54
+ attr_reader :resource, :cloneable_options
53
55
 
54
56
  def initialize(resource)
55
57
  @resource = resource
@@ -73,26 +75,56 @@ module Para
73
75
  # if it exist, which include the attributes that shouldn't be duplicated when
74
76
  # the resource is cloned.
75
77
  #
76
- def build_cloneable_options_tree(resource)
78
+ def build_cloneable_options_tree(resource, path = [])
77
79
  cloneable_options = resource.cloneable_options
78
- options = {}
79
80
 
80
81
  # Iterate over the resource's cloneable options' :include array and recursively
81
82
  # add nested included resources to its own included resources.
82
83
  options = cloneable_options[:include].each_with_object({}) do |reflection_name, hash|
84
+ # This avoids cyclic dependencies issues by stopping nested association
85
+ # inclusions before the cycle starts.
86
+ #
87
+ # For example, if a post includes its author, and the author includes its posts,
88
+ # this would make the system fail with a stack level too deep error. Here this
89
+ # guard allows the inclusion to stop at :
90
+ #
91
+ # { posts: { author: { posts: { author: {}}}}}
92
+ #
93
+ # Which ensures that, using the dictionary strategy of deep_cloneable, all
94
+ # posts' authors' posts will have their author mapped to an already cloned
95
+ # author when it comes to cloning the "author" 4th level of the include tree.
96
+ #
97
+ # This is not the most optimized solution, but works well enough as if the
98
+ # author's posts match previously cloned posts, they won't be cloned as they'll
99
+ # exist in the cloned resources dictionary.
100
+ next if path.length >= 4 &&
101
+ path[-4] == path[-2] &&
102
+ path[-2] == reflection_name &&
103
+ path[-3] == path[-1]
104
+
83
105
  hash[reflection_name] = {}
84
106
 
85
- if (reflection = resource.class.reflections[reflection_name.to_s])
86
- reflection_options = hash[reflection_name]
87
- association_target = resource.send(reflection_name)
107
+ unless (reflection = resource.class.reflections[reflection_name.to_s])
108
+ next
109
+ end
88
110
 
89
- if reflection.collection?
90
- association_target.each do |nested_resource|
91
- add_reflection_options(reflection_options, nested_resource)
92
- end
93
- else
94
- add_reflection_options(reflection_options, association_target)
111
+ reflection_options = hash[reflection_name]
112
+ association_target = resource.send(reflection_name)
113
+
114
+ if reflection.collection?
115
+ association_target.each do |nested_resource|
116
+ add_reflection_options(
117
+ reflection_options,
118
+ nested_resource,
119
+ [*path, reflection_name]
120
+ )
95
121
  end
122
+ else
123
+ add_reflection_options(
124
+ reflection_options,
125
+ association_target,
126
+ [*path, reflection_name]
127
+ )
96
128
  end
97
129
  end
98
130
 
@@ -104,11 +136,11 @@ module Para
104
136
  options
105
137
  end
106
138
 
107
- def add_reflection_options(reflection_options, nested_resource)
139
+ def add_reflection_options(reflection_options, nested_resource, path)
108
140
  options = nested_resource.class.try(:cloneable_options)
109
141
  return reflection_options unless options
110
142
 
111
- target_options = build_cloneable_options_tree(nested_resource)
143
+ target_options = build_cloneable_options_tree(nested_resource, path)
112
144
  reflection_options.deep_merge!(target_options)
113
145
  end
114
146
 
@@ -1,17 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Para
2
4
  class ComponentsCleaner
3
5
  # Hide class instanciation
4
- def self.run; new.run; end
6
+ def self.run
7
+ new.run
8
+ end
5
9
 
6
10
  def run
7
11
  components.each do |component|
8
- unless component == Para.components.component_for(component.identifier)
12
+ if component.id != Para.components.components_ids_hash[component.identifier]
9
13
  component.destroy
10
14
  end
11
15
  end
12
16
 
13
17
  Para::ComponentSection.find_each do |section|
14
- unless Para.components.section_for(section.identifier)
18
+ unless Para.components.sections_ids_hash[section.identifier]
15
19
  section.destroy
16
20
  end
17
21
  end
@@ -76,6 +76,14 @@ module Para
76
76
  nil
77
77
  end
78
78
 
79
+ def sections_ids_hash
80
+ @sections_ids_hash ||= {}.with_indifferent_access
81
+ end
82
+
83
+ def components_ids_hash
84
+ @components_ids_hash ||= {}.with_indifferent_access
85
+ end
86
+
79
87
  private
80
88
 
81
89
  def build
@@ -93,14 +101,6 @@ module Para
93
101
  end
94
102
  end
95
103
 
96
- def sections_ids_hash
97
- @sections_ids_hash ||= {}.with_indifferent_access
98
- end
99
-
100
- def components_ids_hash
101
- @components_ids_hash ||= {}.with_indifferent_access
102
- end
103
-
104
104
  # Only store sections cache for the request duration to avoid expired
105
105
  # references to AR objects between requests
106
106
  #
@@ -88,6 +88,8 @@ module Para
88
88
  join_resources.find do |res|
89
89
  res.send(attribute_field.through_relation_source_foreign_key) == resource.id
90
90
  end
91
+ else
92
+ resource
91
93
  end
92
94
 
93
95
  existing_resource.position
data/lib/para/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Para
4
- VERSION = '0.9.3.2'
4
+ VERSION = '0.9.4'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: para
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3.2
4
+ version: 0.9.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Valentin Ballestrino
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-02 00:00:00.000000000 Z
11
+ date: 2022-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '4.0'
20
20
  - - "<="
21
21
  - !ruby/object:Gem::Version
22
- version: '7.0'
22
+ version: '8.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: '4.0'
30
30
  - - "<="
31
31
  - !ruby/object:Gem::Version
32
- version: '7.0'
32
+ version: '8.0'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: rails-i18n
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -852,7 +852,7 @@ homepage: http://github.com/glyph-fr/para
852
852
  licenses:
853
853
  - MIT
854
854
  metadata: {}
855
- post_install_message:
855
+ post_install_message:
856
856
  rdoc_options: []
857
857
  require_paths:
858
858
  - lib
@@ -867,8 +867,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
867
867
  - !ruby/object:Gem::Version
868
868
  version: '0'
869
869
  requirements: []
870
- rubygems_version: 3.1.4
871
- signing_key:
870
+ rubygems_version: 3.3.7
871
+ signing_key:
872
872
  specification_version: 4
873
873
  summary: Rails admin engine
874
874
  test_files: []