rails_json_serializer 1.1.0 → 1.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1979a6763434dbcb97197b96e8b6d063e57e7a1e1661f73aff7669ad0014d0e3
4
- data.tar.gz: '0280285eefc66726612611b12df19d190a7ed1421393394a6c669a93ab33fd15'
3
+ metadata.gz: dc8a9ac788966e52d712b4927d9ec959015aeec7c401ed04741d34faeb315786
4
+ data.tar.gz: 2ef1b797adfa346886d437cd8b5322418ddd96d1f06f1bf80d68bf59f9d589e6
5
5
  SHA512:
6
- metadata.gz: 681b0f1e1b1856859676747640f6829437cc613987ffb1a60939254f4492c1c83bbe49ebb96f8eba764d3b5da8bf47b337c44e2ffe9b0893188d97c3316ff999
7
- data.tar.gz: 48152e760af615c8ec8b399e7a8a8ea72cdb0d663d85bfac9d242d1df01a4c2c0cba95f0629664e01cb0213c2ce82d321c3cb33ff5ee217b426cc296cc16d0fc
6
+ metadata.gz: 66ee9df244dd1e8317aab9013fe4ae6dc83dd77963660c8700e268f70bcb795b907299b88a1b5b1b7259ff663b5200122eda6a75d2a6d78763b6530e87ffb285
7
+ data.tar.gz: 5923bb6172eb2a3bd8306035517cee75c975bbc6f2e4fa49922ccf206ef7042115377365f30887550a89f2e55905bc5623aa04975dd98daebcf681161d03d881
@@ -1,8 +1,8 @@
1
1
  require 'active_support/concern'
2
- require 'serializer/application_serializer'
2
+ require_relative 'serializer/application_serializer'
3
3
  Dir[File.join(Rails.root, 'app', 'serializers', '**', '*.rb')].each {|file| require file }
4
- require 'serializer/configuration'
5
- require 'serializer/concern'
4
+ require_relative 'serializer/configuration'
5
+ require_relative 'serializer/concern'
6
6
 
7
7
  module Serializer
8
8
  # config src: http://lizabinante.com/blog/creating-a-configurable-ruby-gem/
@@ -1,27 +1,30 @@
1
1
  module Serializer
2
+ DELETE_MATCHED_SUPPORTED_CACHE_TYPES = [:memory_store, :file_store]
2
3
  module Concern
3
4
  # ActiveSupport extend src: https://stackoverflow.com/questions/2328984/rails-extending-activerecordbase
4
5
  extend ActiveSupport::Concern
5
6
 
6
7
  # START MODEL INSTANCE METHODS
7
8
  def clear_serializer_cache
8
- if self.class.const_defined?("SerializerMethods")
9
- serializer_klass = "#{self.class.name}::SerializerMethods".constantize
10
- serializer_klass.public_instance_methods.each do |query_name|
9
+ if self.class.const_defined?("SERIALIZER_QUERY_KEYS_CACHE")
10
+
11
+ # list_of_serializer_query_names = "#{self.class.name}::SERIALIZER_QUERY_KEYS_CACHE".constantize
12
+ self.class.get_cumulatively_inherited_serializer_query_list.each do |query_name|
11
13
  cache_key = "#{self.class.name}_____#{query_name}___#{self.id}"
12
14
  Rails.logger.info "Serializer: CLEARING CACHE KEY: #{cache_key}" if Serializer.configuration.debug
13
15
  Rails.cache.delete(cache_key)
14
16
  end
15
17
  return true
16
18
  else
17
- if Serializer.configuration.debug
18
- Rails.logger.info(
19
+ # if Serializer.configuration.debug
20
+ Rails.logger.error(
19
21
  """
20
- Serializer: Class #{self.class.name} does not have the serializer module #{self.class.name}Serializer defined.
22
+ ERROR. COULD NOT CLEAR SERIALIZER CACHE FOR: Class #{self.class.name}
23
+ Serializer: Class #{self.class.name} may not have the serializer module #{self.class.name}Serializer defined.
21
24
  Nor was it defined on an inheriting class.
22
25
  """
23
26
  )
24
- end
27
+ # end
25
28
  return nil
26
29
  end
27
30
  end
@@ -76,11 +79,23 @@ module Serializer
76
79
  serializer_klass = "#{subclass.name}Serializer".constantize
77
80
 
78
81
  if serializer_klass.class == Module
79
- if !serializer_klass.const_defined?("SerializerMethods")
80
- serializer_klass.const_set('SerializerMethods', Module.new {})
82
+ if !serializer_klass.const_defined?("SerializerClassAndInstanceMethods")
83
+ serializer_klass.const_set('SerializerClassAndInstanceMethods', Module.new {})
84
+ end
85
+ if !serializer_klass.const_defined?("SerializerClassMethods")
86
+ serializer_klass.const_set('SerializerClassMethods', Module.new {})
87
+ serializer_klass::SerializerClassMethods.send(:define_method, :get_cumulatively_inherited_serializer_query_list) do |opts = {}|
88
+ if defined?(super)
89
+ return (subclass::SERIALIZER_QUERY_KEYS_CACHE + superclass.get_cumulatively_inherited_serializer_query_list).uniq
90
+ else
91
+ return subclass::SERIALIZER_QUERY_KEYS_CACHE
92
+ end
93
+ end
81
94
  end
82
95
 
83
- serializer_klass.public_instance_methods.each do |query_name|
96
+ serializer_query_names = serializer_klass.public_instance_methods
97
+
98
+ serializer_query_names.each do |query_name|
84
99
  serializer_name = query_name[/(?<name>.+)_query/, :name]
85
100
  if serializer_name.nil?
86
101
  Rails.logger.info "Serializer: #{serializer_klass.name} method #{query_name} does not end in '(.+)_query', as is expected of serializers" if Serializer.configuration.debug
@@ -89,26 +104,43 @@ module Serializer
89
104
  # Skip if chosen to override it.
90
105
  next if serializer_klass.respond_to?(serializer_name)
91
106
  if serializer_name == 'serializer'
92
- serializer_klass::SerializerMethods.send(:define_method, serializer_name) do |opts = {}|
107
+ serializer_klass::SerializerClassAndInstanceMethods.send(:define_method, serializer_name) do |opts = {}|
93
108
  super({json_query_override: query_name}.merge(opts))
94
109
  end
95
110
  else
96
- serializer_klass::SerializerMethods.send(:define_method, serializer_name) do |opts = {}|
111
+ serializer_klass::SerializerClassAndInstanceMethods.send(:define_method, serializer_name) do |opts = {}|
97
112
  serializer({json_query_override: query_name}.merge(opts))
98
113
  end
99
114
  end
100
115
  end
116
+ if serializer_query_names.any?
117
+ # Inject instance methods
118
+ subclass.send(:include, serializer_klass::SerializerClassAndInstanceMethods)
119
+ # Inject class methods
120
+ subclass.send(:extend, serializer_klass::SerializerClassAndInstanceMethods)
121
+ # Inject class methods that has queries
122
+ if Serializer.configuration.debug
123
+ Rails.logger.info "Injecting queries: #{serializer_klass.public_instance_methods} into class: #{subclass}"
124
+ end
125
+ puts "Injecting queries: #{serializer_klass.public_instance_methods} into class: #{subclass}"
126
+ subclass.send(:extend, serializer_klass)
127
+ # Injecting the Serializer Methods as a namespaced class of the rails class, so we can have
128
+ # access to the list of methods to clear their cache.
129
+ # 'Class Name + Serializer' does not work with inheritence.
130
+ subclass.const_set('SERIALIZER_QUERY_KEYS_CACHE', serializer_query_names)
131
+ # Inject class methods
132
+ subclass.send(:extend, serializer_klass::SerializerClassMethods)
101
133
 
102
- # Inject instance methods
103
- subclass.send(:include, serializer_klass::SerializerMethods)
104
- # Inject class methods
105
- subclass.send(:extend, serializer_klass::SerializerMethods)
106
- # Inject class methods that has queries
107
- subclass.send(:extend, serializer_klass)
108
- # Injecting the Serializer Methods as a namespaced class of the rails class, so we can have
109
- # access to the list of methods to clear their cache.
110
- # 'Class Name + Serializer' does not work with inheritence.
111
- subclass.const_set('SerializerMethods', serializer_klass::SerializerMethods.dup)
134
+ # Issue with inheritting classes caching the serializer data from queries in super classes.
135
+ # Only on the rails server, not the console strangely.
136
+ if DELETE_MATCHED_SUPPORTED_CACHE_TYPES.include?(Rails.configuration.cache_store)
137
+ serializer_query_names.each do |query_name|
138
+ cache_key_prefix = /#{subclass.name}_____#{query_name}___(\d+)/
139
+ puts "Deleting cache here: Rails.cache.delete_matched(#{cache_key_prefix})"
140
+ Rails.cache.delete_matched(cache_key_prefix)
141
+ end
142
+ end
143
+ end
112
144
  else
113
145
  Rails.logger.info "Serializer: #{serializer_klass.name} was not a Module as expected" if Serializer.configuration.debug
114
146
  end
@@ -116,6 +148,23 @@ module Serializer
116
148
  super(subclass)
117
149
  end
118
150
 
151
+ # Class defined clear serializer
152
+ if DELETE_MATCHED_SUPPORTED_CACHE_TYPES.include?(Rails.configuration.cache_store)
153
+ def clear_serializer_cache
154
+ self.get_cumulatively_inherited_serializer_query_list.each do |query_name|
155
+ cache_key_prefix = /#{self.name}_____#{query_name}___(\d+)/
156
+ Rails.logger.info "Serializer: CLEARING CACHE KEY Prefix: #{cache_key_prefix}" if Serializer.configuration.debug
157
+ Rails.cache.delete_matched(cache_key_prefix)
158
+ end
159
+ return true
160
+ end
161
+ else
162
+ def clear_serializer_cache
163
+ puts "Not supported by rails cache store: #{Rails.configuration.cache_store}. Supported: #{DELETE_MATCHED_SUPPORTED_CACHE_TYPES}"
164
+ return false
165
+ end
166
+ end
167
+
119
168
  # Can override the query, using the options. ex: {json_query_override: :tiny_children_serializer_query}
120
169
  def serializer opts = {}
121
170
  query = opts[:json_query_override].present? ? self.send(opts[:json_query_override], opts) : serializer_query(opts)
@@ -164,6 +213,7 @@ module Serializer
164
213
  klass = self if klass.nil?
165
214
  if options[:include].present? && !options[:skip_eager_loading]
166
215
  options[:include].each do |include_key, include_hash|
216
+ next if include_hash[:skip_eager_loading] == true
167
217
  # Will 'next' if there is a scope that takes arguments, an instance-dependent scope.
168
218
  # Can't eager load when assocation has a instance condition for it's associative scope.
169
219
  # Might not be a real assocation
@@ -174,6 +224,17 @@ module Serializer
174
224
  query_filter[include_key] = generate_includes_from_json_query(include_hash, klass.reflect_on_association(include_key).klass)
175
225
  end
176
226
  end
227
+ # Does not include data, just eager-loads. Useful when methods need assocations, but you don't need association data.
228
+ if options[:eager_include].present?
229
+ options[:eager_include].each do |include_key|
230
+ # Will 'next' if there is a scope that takes arguments, an instance-dependent scope.
231
+ # Can't eager load when assocation has a instance condition for it's associative scope.
232
+ # Might not be a real assocation
233
+ next if klass.reflect_on_association(include_key).nil?
234
+ next if klass.reflect_on_association(include_key).scope&.arity&.nonzero?
235
+ query_filter[include_key] ||= {}
236
+ end
237
+ end
177
238
  return query_filter
178
239
  end
179
240
  # END MODEL CLASS METHODS
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_json_serializer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - benjamin.dana.software.dev@gmail.com
@@ -14,16 +14,100 @@ dependencies:
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5.0'
19
+ version: '5.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '5.0'
26
+ version: '5.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '5.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.9'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: listen
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.2'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-rails
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '4.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '4.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: database_cleaner
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.8'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.8'
97
+ - !ruby/object:Gem::Dependency
98
+ name: sqlite3
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.4'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.4'
27
111
  description:
28
112
  email:
29
113
  executables: []
@@ -36,7 +120,7 @@ files:
36
120
  - lib/serializer/configuration.rb
37
121
  homepage: https://github.com/danabr75/rails_json_serializer
38
122
  licenses:
39
- - GNU
123
+ - LGPL-3.0-only
40
124
  metadata: {}
41
125
  post_install_message:
42
126
  rdoc_options: []
@@ -53,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
53
137
  - !ruby/object:Gem::Version
54
138
  version: '0'
55
139
  requirements: []
56
- rubygems_version: 3.1.2
140
+ rubygems_version: 3.0.8
57
141
  signing_key:
58
142
  specification_version: 4
59
143
  summary: An ActiveRecord JSON Serializer with supported caching and eager-loading