rails_json_serializer 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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