rails_json_serializer 3.0.1 → 3.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: 1dbc21fe6370943050869252bcb0dc1ad737ed58058d34dca1a0877d1f09adec
4
- data.tar.gz: 5b8c6a68aab5c7c7f9b67bba5987f70004f73cec4071ccdda7cec0ab96725636
3
+ metadata.gz: 4a17108258803bac91fbf2506e02b2953fe1d49c4ae3758acea6a6b8671a5cf0
4
+ data.tar.gz: f8e2ad23101fe3ba7a9253d6dbeec9d82b1c5f9392ce2df8c47db74326921858
5
5
  SHA512:
6
- metadata.gz: 29e9cb62478a5a225b3c56fd8e99e2cf9b1451542d4c170e494009ddba478ca9d50cd6f0e9ba927c17365ce583826bd7396d7341e37abbd2ad4736a80c54ce7a
7
- data.tar.gz: 73b5b85f6c0644f61d9c1b66710774015db55e4a273b22379b4021a156c89ed2420df53b43941992efdb4f76fd8dc1860c89c405ec1a105694d8c83d629e830e
6
+ metadata.gz: f95e665cd9adfc8c9900ba981d75af1b2448cb8c23baa41454b63aaeaf49e5fc04846ab60d18bbc2991491d3a7b310666a863ba830fad71fee18225a88db0f38
7
+ data.tar.gz: 8f7b66cce88ba721b58ce24a76d7a75791f61054ab0da38de23a495aa1f1d20c1d93b344cc4b393dc2479727c9d589bdfd4de807563ad8cf3465239aa4011901
@@ -1,12 +1,26 @@
1
+ require "zlib"
2
+
1
3
  module Serializer
2
4
  class Configuration
3
- attr_accessor :enable_includes, :default_cache_time, :disable_model_caching, :debug
5
+ attr_accessor :enable_includes, :default_cache_time, :disable_model_caching, :debug, :cache_key
6
+ attr_accessor :compress, :compressor, :decompressor
4
7
 
5
8
  def initialize
6
9
  @enable_includes = true
7
10
  @default_cache_time = 360
8
11
  @disable_model_caching = false
9
12
  @debug = false
13
+ @compress = false
14
+ @cache_key = Proc.new { |class_name, query_name, object_id| "#{class_name}_____#{query_name}___#{object_id}" }
15
+ @compressor = Proc.new { |incoming_data| Base64.encode64(Zlib::Deflate.deflate(incoming_data.to_json)) }
16
+
17
+ # have to use 'temp_val', or else there's an issue with the libraries. Won't work as a 1-liner
18
+ @decompressor = Proc.new do |outgoing_data|
19
+ temp_val1 = Base64.decode64(outgoing_data)
20
+ temp_val2 = Zlib::Inflate.inflate(temp_val1)
21
+ JSON.parse(temp_val2)
22
+ end
23
+
10
24
  end
11
25
  end
12
26
  end
@@ -4,6 +4,8 @@ module ModelSerializer
4
4
  # START CLASS EVAL
5
5
  klass.class_eval do
6
6
 
7
+
8
+ # I don't think we need to check for classname + serialiers. We are now including via: `include ModelSerializer` in classes
7
9
  # Rails 5 has autoloading issues with modules. They will show as not defined, when available.
8
10
  if Rails.env.development?
9
11
  begin
@@ -23,10 +25,31 @@ module ModelSerializer
23
25
  # Inject class methods, will have access to those queries on the class.
24
26
  klass.send(:extend, serializer_klass)
25
27
 
28
+ # Class method to clear the cache of objects without having to instantiate them.
29
+ def self.clear_serializer_cache id_or_ids
30
+ if !id_or_ids.is_a?(Array)
31
+ id_or_ids = [id_or_ids]
32
+ end
33
+ id_or_ids.each do |object_id|
34
+ self::SERIALIZER_QUERY_KEYS_CACHE.each do |query_name|
35
+ cache_key = Serializer.configuration.cache_key.call(self.name, query_name, object_id)
36
+ Rails.logger.debug "(class) CLEARING SERIALIZER CACHE: #{cache_key}" if Serializer.configuration.debug
37
+ Rails.cache.delete(cache_key)
38
+ end
39
+ end
40
+ end
41
+
26
42
  # no need to define it if inheriting class has defined it OR has been manually overridden.
27
- # CLASS METHODS
28
- klass.send(:define_singleton_method, :serializer) do |opts = {}|
43
+ # CLASS METHOD - :serializer
44
+ klass.send(:define_singleton_method, :serializer) do |opts = {}|
45
+ # puts "CLASS METHOD - SERIALIZER - OPTS: #{opts.inspect}"
29
46
  query = opts[:json_query_override].present? ? self.send(opts[:json_query_override], opts) : serializer_query(opts)
47
+
48
+ # if as_json arg, then add to as_json query
49
+ if opts[:disable_caching] == true
50
+ query[:disable_caching] = true
51
+ end
52
+
30
53
  if Serializer.configuration.enable_includes && query[:include].present? && !opts[:skip_eager_loading]
31
54
  includes(generate_includes_from_json_query(query)).as_json(query)
32
55
  else
@@ -107,29 +130,47 @@ module ModelSerializer
107
130
  return super(options)
108
131
  end
109
132
  options[:ran_serialization] = true
133
+
110
134
  # Not caching records that don't have IDs.
111
135
  if !Serializer.configuration.disable_model_caching && self.id && options[:cache_key].present? && !(options.key?(:cache_for) && options[:cache_for].nil?)
112
- cache_key = "#{self.class.name}_____#{options[:cache_key]}___#{self.id}"
113
- if Rails.cache.exist?(cache_key)
114
- Rails.logger.info "Serializer: Cache reading #{cache_key}" if Serializer.configuration.debug
115
- return Rails.cache.read(cache_key)
136
+ cache_key = Serializer.configuration.cache_key.call(self.class.name, options[:cache_key], self.id)
137
+
138
+ if Rails.cache.exist?(cache_key) && options[:disable_caching] != true
139
+ Rails.logger.debug "Serializer: Cache reading #{cache_key}" if Serializer.configuration.debug
140
+ # Rails.logger.debug(options.inspect) if Serializer.configuration.debug
141
+ outgoing_data = Rails.cache.read(cache_key)
142
+ if (options.key?(:compress) && options[:compress] == true) || (!options.key?(:compress) && Serializer.configuration.compress)
143
+ outgoing_data = Serializer.configuration.decompressor.call(outgoing_data)
144
+ end
145
+ return outgoing_data
116
146
  else
117
147
  data = super(options)
118
148
  data = self.class.as_json_associations_alias_fix(options, data)
119
- begin
120
- Rails.logger.info "Serializer: Caching #{cache_key} for #{(options[:cache_for] || Serializer.configuration.default_cache_time)} minutes." if Serializer.configuration.debug
121
- Rails.cache.write(cache_key, data, expires_in: (options[:cache_for] || Serializer.configuration.default_cache_time).minute)
122
- rescue Exception => e
123
- Rails.logger.error "Serializer: Internal Server Error on #{self.class}#as_json ID: #{self.id} for cache key: #{cache_key}"
124
- Rails.logger.error e.class
125
- Rails.logger.error e.message
126
- Rails.logger.error e.backtrace
149
+
150
+ if options[:disable_caching] != true
151
+ # compress data
152
+ cachable_data = data
153
+ if (options.key?(:compress) && options[:compress] == true) || (!options.key?(:compress) && Serializer.configuration.compress)
154
+ cachable_data = Serializer.configuration.compressor.call(data)
155
+ end
156
+ begin
157
+ Rails.logger.debug "Serializer: Caching #{cache_key} for #{(options[:cache_for] || Serializer.configuration.default_cache_time)} minutes." if Serializer.configuration.debug
158
+ Rails.cache.write(cache_key, cachable_data, expires_in: (options[:cache_for] || Serializer.configuration.default_cache_time).minute)
159
+ rescue Exception => e
160
+ Rails.logger.error "Serializer: Internal Server Error on #{self.class}#as_json ID: #{self.id} for cache key: #{cache_key}"
161
+ Rails.logger.error e.class
162
+ Rails.logger.error e.message
163
+ Rails.logger.error e.backtrace
164
+ end
165
+ else
166
+ Rails.logger.debug "Serializer: Cache reading/writing for #{cache_key} is disabled" if Serializer.configuration.debug
127
167
  end
168
+
128
169
  return data
129
170
  end
130
171
  else
131
172
  if Serializer.configuration.debug && !Serializer.configuration.disable_model_caching && self.id && options[:cache_key].present? && options.key?(:cache_for) && options[:cache_for].nil?
132
- Rails.logger.info "Serializer: Caching #{cache_key} NOT caching due to `cache_for: nil`"
173
+ Rails.logger.debug "Serializer: Caching #{cache_key} NOT caching due to `cache_for: nil`"
133
174
  end
134
175
  data = super(options)
135
176
  data = self.class.as_json_associations_alias_fix(options, data)
@@ -137,9 +178,17 @@ module ModelSerializer
137
178
  end
138
179
  end
139
180
 
181
+ # INSTANCE METHOD - :serializer
140
182
  if !klass.method_defined?(:serializer)
141
183
  klass.send(:define_method, :serializer) do |opts = {}|
184
+ # puts "INSTANCE METHOD - SERIALIZER - OPTS: #{opts.inspect}"
142
185
  query = opts[:json_query_override].present? ? self.class.send(opts[:json_query_override], opts) : self.class.serializer_query(opts)
186
+
187
+ # if as_json arg, then add to as_json query
188
+ if opts[:disable_caching] == true
189
+ query[:disable_caching] = true
190
+ end
191
+
143
192
  if Serializer.configuration.enable_includes && query[:include].present? && self.class.column_names.include?('id') && self.id.present? && !opts[:skip_eager_loading] && self.respond_to?(:persisted?) && self.persisted?
144
193
  # It's an extra SQL call, but most likely worth it to pre-load associations
145
194
  self.class.includes(self.class.generate_includes_from_json_query(query)).find(self.id).as_json(query)
@@ -153,8 +202,8 @@ module ModelSerializer
153
202
  klass.send(:define_method, :clear_serializer_cache) do
154
203
  if self.class.const_defined?("SERIALIZER_QUERY_KEYS_CACHE")
155
204
  self.class::SERIALIZER_QUERY_KEYS_CACHE.each do |query_name|
156
- cache_key = "#{self.class.name}_____#{query_name}___#{self.id}"
157
- Rails.logger.info "Serializer: CLEARING CACHE KEY: #{cache_key}" if Serializer.configuration.debug
205
+ cache_key = Serializer.configuration.cache_key.call(self.class.name, query_name, self.id)
206
+ Rails.logger.debug "Serializer: CLEARING CACHE KEY: #{cache_key}" if Serializer.configuration.debug
158
207
  Rails.cache.delete(cache_key)
159
208
  end
160
209
  return true
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: 3.0.1
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - benjamin.dana.software.dev@gmail.com
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '5.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: zlib
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rails
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -136,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
150
  - !ruby/object:Gem::Version
137
151
  version: '0'
138
152
  requirements: []
139
- rubygems_version: 3.0.8
153
+ rubygems_version: 3.1.4
140
154
  signing_key:
141
155
  specification_version: 4
142
156
  summary: An ActiveRecord JSON Serializer with supported caching and eager-loading