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 +4 -4
- data/lib/serializer.rb +3 -3
- data/lib/serializer/concern.rb +83 -22
- metadata +91 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc8a9ac788966e52d712b4927d9ec959015aeec7c401ed04741d34faeb315786
|
4
|
+
data.tar.gz: 2ef1b797adfa346886d437cd8b5322418ddd96d1f06f1bf80d68bf59f9d589e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66ee9df244dd1e8317aab9013fe4ae6dc83dd77963660c8700e268f70bcb795b907299b88a1b5b1b7259ff663b5200122eda6a75d2a6d78763b6530e87ffb285
|
7
|
+
data.tar.gz: 5923bb6172eb2a3bd8306035517cee75c975bbc6f2e4fa49922ccf206ef7042115377365f30887550a89f2e55905bc5623aa04975dd98daebcf681161d03d881
|
data/lib/serializer.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'active_support/concern'
|
2
|
-
|
2
|
+
require_relative 'serializer/application_serializer'
|
3
3
|
Dir[File.join(Rails.root, 'app', 'serializers', '**', '*.rb')].each {|file| require file }
|
4
|
-
|
5
|
-
|
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/
|
data/lib/serializer/concern.rb
CHANGED
@@ -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?("
|
9
|
-
|
10
|
-
|
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.
|
19
|
+
# if Serializer.configuration.debug
|
20
|
+
Rails.logger.error(
|
19
21
|
"""
|
20
|
-
|
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?("
|
80
|
-
serializer_klass.const_set('
|
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
|
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::
|
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::
|
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
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
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.
|
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.
|
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.
|
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
|
-
-
|
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.
|
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
|