panko_serializer 0.4.3 → 0.4.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 +4 -4
- data/.rubocop.yml +9 -2
- data/lib/panko/array_serializer.rb +1 -2
- data/lib/panko/attribute.rb +1 -3
- data/lib/panko/response.rb +57 -25
- data/lib/panko/serialization_descriptor.rb +15 -24
- data/lib/panko/serializer.rb +8 -15
- data/lib/panko/serializer_resolver.rb +2 -5
- data/lib/panko/version.rb +2 -1
- data/lib/panko_serializer.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b82a221e5207cf94860579c3ae74a5a31b51a50667785f83c6d9311160096792
|
4
|
+
data.tar.gz: e8177737c068e142e2273fdfe70cb367a2b22fe841d4e3c49a63817f59383b25
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 78f1c9ae160336f9d950d2bab9796a1b124674cc4a0e8a2e41b000b38689e4093aa3783d63e64547598e23914c2e7156921f052409efc645d0d46e06d4daddba
|
7
|
+
data.tar.gz: 44d99088e0afad8264c599026df2584d1df58b8c243540001b05f77b4caef9f110cf71b17bf08b15dfe525ef5bb9671125fefe822b5bffc4542e6ab8887e716d
|
data/.rubocop.yml
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
AllCops:
|
2
|
-
|
3
|
-
TargetRubyVersion: 2.4.1
|
2
|
+
TargetRubyVersion: 2.5
|
4
3
|
DisplayCopNames: true
|
5
4
|
StyleGuideCopsOnly: false
|
6
5
|
|
@@ -20,3 +19,11 @@ Layout/TrailingBlankLines:
|
|
20
19
|
Layout/TrailingWhitespace:
|
21
20
|
Enabled: true
|
22
21
|
|
22
|
+
Style/FrozenStringLiteralComment:
|
23
|
+
Enabled: true
|
24
|
+
|
25
|
+
Style/RedundantFreeze:
|
26
|
+
Enabled: true
|
27
|
+
|
28
|
+
Performance/UnfreezeString:
|
29
|
+
Enabled: true
|
@@ -15,7 +15,6 @@ Please pass valid each_serializer to ArraySerializer, for example:
|
|
15
15
|
}
|
16
16
|
end
|
17
17
|
|
18
|
-
|
19
18
|
serializer_options = {
|
20
19
|
only: options.fetch(:only, []),
|
21
20
|
except: options.fetch(:except, []),
|
@@ -41,7 +40,7 @@ Please pass valid each_serializer to ArraySerializer, for example:
|
|
41
40
|
|
42
41
|
def serialize_to_json(subjects)
|
43
42
|
writer = Oj::StringWriter.new(mode: :rails)
|
44
|
-
Panko
|
43
|
+
Panko.serialize_subjects(subjects.to_a, writer, @descriptor)
|
45
44
|
writer.to_s
|
46
45
|
end
|
47
46
|
end
|
data/lib/panko/attribute.rb
CHANGED
@@ -9,9 +9,7 @@ module Panko
|
|
9
9
|
|
10
10
|
def ==(attr)
|
11
11
|
return name.to_sym == attr if attr.is_a? Symbol
|
12
|
-
if attr.is_a? Panko::Attribute
|
13
|
-
return name == attr.name && alias_name == attr.alias_name
|
14
|
-
end
|
12
|
+
return name == attr.name && alias_name == attr.alias_name if attr.is_a? Panko::Attribute
|
15
13
|
super
|
16
14
|
end
|
17
15
|
|
data/lib/panko/response.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "oj"
|
3
4
|
|
4
5
|
module Panko
|
@@ -6,6 +7,28 @@ module Panko
|
|
6
7
|
def self.from(value)
|
7
8
|
JsonValue.new(value)
|
8
9
|
end
|
10
|
+
|
11
|
+
def to_json
|
12
|
+
value
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class ResponseCreator
|
17
|
+
def self.value(value)
|
18
|
+
Panko::Response.new(value)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.json(value)
|
22
|
+
Panko::JsonValue.from(value)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.array_serializer(data, serializer)
|
26
|
+
Panko::ArraySerializer.new(data, each_serializer: serializer)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.serializer(data, serializer)
|
30
|
+
json serializer.new.serialize_to_json(data)
|
31
|
+
end
|
9
32
|
end
|
10
33
|
|
11
34
|
class Response
|
@@ -13,42 +36,51 @@ module Panko
|
|
13
36
|
@data = data
|
14
37
|
end
|
15
38
|
|
16
|
-
def to_json(
|
39
|
+
def to_json(_options = nil)
|
17
40
|
writer = Oj::StringWriter.new(mode: :rails)
|
41
|
+
write(writer, @data)
|
42
|
+
writer.to_s
|
43
|
+
end
|
18
44
|
|
19
|
-
|
45
|
+
def self.create
|
46
|
+
Response.new(yield ResponseCreator)
|
47
|
+
end
|
20
48
|
|
21
|
-
|
22
|
-
key = key.to_s
|
49
|
+
private
|
23
50
|
|
24
|
-
|
25
|
-
|
26
|
-
value.each { |v| write_object(writer, v) }
|
27
|
-
writer.pop
|
28
|
-
next
|
29
|
-
end
|
51
|
+
def write(writer, data, key = nil)
|
52
|
+
return write_array(writer, data, key) if data.is_a?(Array)
|
30
53
|
|
31
|
-
|
54
|
+
return write_object(writer, data) if data.is_a?(Hash)
|
32
55
|
|
33
|
-
|
56
|
+
write_value(writer, data, key)
|
57
|
+
end
|
34
58
|
|
59
|
+
def write_array(writer, value, key = nil)
|
60
|
+
writer.push_array key
|
61
|
+
value.each { |v| write(writer, v) }
|
35
62
|
writer.pop
|
36
|
-
|
37
|
-
writer.to_s
|
38
63
|
end
|
39
64
|
|
40
|
-
private
|
41
|
-
|
42
65
|
def write_object(writer, value, key = nil)
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
66
|
+
writer.push_object key
|
67
|
+
|
68
|
+
value.each do |entry_key, entry_value|
|
69
|
+
write(writer, entry_value, entry_key.to_s)
|
70
|
+
end
|
71
|
+
|
72
|
+
writer.pop
|
73
|
+
end
|
74
|
+
|
75
|
+
def write_value(writer, value, key = nil)
|
76
|
+
if value.is_a?(Panko::ArraySerializer) ||
|
77
|
+
value.is_a?(Panko::Serializer) ||
|
78
|
+
value.is_a?(Panko::Response) ||
|
79
|
+
value.is_a?(Panko::JsonValue)
|
80
|
+
writer.push_json(value.to_json, key)
|
81
|
+
else
|
82
|
+
writer.push_value(value, key)
|
83
|
+
end
|
52
84
|
end
|
53
85
|
end
|
54
86
|
end
|
@@ -1,16 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Panko
|
3
4
|
class SerializationDescriptor
|
4
5
|
#
|
5
6
|
# Creates new description and apply the options
|
6
7
|
# on the new descriptor
|
7
8
|
#
|
8
|
-
def self.build(serializer, options={})
|
9
|
+
def self.build(serializer, options = {})
|
9
10
|
backend = Panko::SerializationDescriptor.duplicate(serializer._descriptor)
|
10
11
|
|
11
|
-
if serializer.respond_to? :filters_for
|
12
|
-
options.merge! serializer.filters_for(options[:context], options[:scope])
|
13
|
-
end
|
12
|
+
options.merge! serializer.filters_for(options[:context], options[:scope]) if serializer.respond_to? :filters_for
|
14
13
|
|
15
14
|
backend.context = options[:context]
|
16
15
|
backend.scope = options[:scope]
|
@@ -32,9 +31,7 @@ module Panko
|
|
32
31
|
|
33
32
|
backend.method_fields = descriptor.method_fields.dup
|
34
33
|
|
35
|
-
unless descriptor.serializer.nil?
|
36
|
-
backend.serializer = descriptor.serializer.reset
|
37
|
-
end
|
34
|
+
backend.serializer = descriptor.serializer.reset unless descriptor.serializer.nil?
|
38
35
|
|
39
36
|
backend.has_many_associations = descriptor.has_many_associations.dup
|
40
37
|
backend.has_one_associations = descriptor.has_one_associations.dup
|
@@ -55,30 +52,30 @@ module Panko
|
|
55
52
|
attributes_except_filters, associations_except_filters = resolve_filters(options, :except)
|
56
53
|
|
57
54
|
self.attributes = apply_attribute_filters(
|
58
|
-
|
55
|
+
attributes,
|
59
56
|
attributes_only_filters,
|
60
57
|
attributes_except_filters
|
61
58
|
)
|
62
59
|
|
63
60
|
self.method_fields = apply_fields_filters(
|
64
|
-
|
61
|
+
method_fields,
|
65
62
|
attributes_only_filters,
|
66
63
|
attributes_except_filters
|
67
64
|
)
|
68
65
|
|
69
|
-
unless
|
66
|
+
unless has_many_associations.empty?
|
70
67
|
self.has_many_associations = apply_association_filters(
|
71
|
-
|
68
|
+
has_many_associations,
|
72
69
|
{ attributes: attributes_only_filters, associations: associations_only_filters },
|
73
|
-
|
70
|
+
attributes: attributes_except_filters, associations: associations_except_filters
|
74
71
|
)
|
75
72
|
end
|
76
73
|
|
77
|
-
unless
|
74
|
+
unless has_one_associations.empty?
|
78
75
|
self.has_one_associations = apply_association_filters(
|
79
|
-
|
76
|
+
has_one_associations,
|
80
77
|
{ attributes: attributes_only_filters, associations: associations_only_filters },
|
81
|
-
|
78
|
+
attributes: attributes_except_filters, associations: associations_except_filters
|
82
79
|
)
|
83
80
|
end
|
84
81
|
end
|
@@ -91,7 +88,6 @@ module Panko
|
|
91
88
|
end
|
92
89
|
end
|
93
90
|
|
94
|
-
|
95
91
|
attributes_except_filters = except_filters[:attributes] || []
|
96
92
|
unless attributes_except_filters.empty?
|
97
93
|
associations.reject! do |association|
|
@@ -99,13 +95,10 @@ module Panko
|
|
99
95
|
end
|
100
96
|
end
|
101
97
|
|
102
|
-
|
103
98
|
associations_only_filters = only_filters[:associations]
|
104
99
|
associations_except_filters = except_filters[:associations]
|
105
100
|
|
106
|
-
if associations_only_filters.empty? && associations_except_filters.empty?
|
107
|
-
return associations
|
108
|
-
end
|
101
|
+
return associations if associations_only_filters.empty? && associations_except_filters.empty?
|
109
102
|
|
110
103
|
associations.map do |association|
|
111
104
|
name = association.name_sym
|
@@ -132,9 +125,7 @@ module Panko
|
|
132
125
|
|
133
126
|
def resolve_filters(options, filter)
|
134
127
|
filters = options.fetch(filter, {})
|
135
|
-
if filters.is_a? Array
|
136
|
-
return filters, {}
|
137
|
-
end
|
128
|
+
return filters, {} if filters.is_a? Array
|
138
129
|
|
139
130
|
# hash filters looks like this
|
140
131
|
# { instance: [:a], foo: [:b] }
|
@@ -146,7 +137,7 @@ module Panko
|
|
146
137
|
attributes_filters = filters.fetch(:instance, [])
|
147
138
|
association_filters = filters.except(:instance)
|
148
139
|
|
149
|
-
|
140
|
+
[attributes_filters, association_filters]
|
150
141
|
end
|
151
142
|
|
152
143
|
def apply_fields_filters(fields, only, except)
|
data/lib/panko/serializer.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require_relative "serialization_descriptor"
|
3
4
|
require "oj"
|
4
5
|
|
@@ -6,10 +7,7 @@ module Panko
|
|
6
7
|
class Serializer
|
7
8
|
class << self
|
8
9
|
def inherited(base)
|
9
|
-
|
10
|
-
unless _descriptor.nil?
|
11
|
-
base._descriptor = Panko::SerializationDescriptor.duplicate(_descriptor)
|
12
|
-
else
|
10
|
+
if _descriptor.nil?
|
13
11
|
base._descriptor = Panko::SerializationDescriptor.new
|
14
12
|
|
15
13
|
base._descriptor.attributes = []
|
@@ -19,9 +17,10 @@ module Panko
|
|
19
17
|
|
20
18
|
base._descriptor.has_many_associations = []
|
21
19
|
base._descriptor.has_one_associations = []
|
20
|
+
else
|
21
|
+
base._descriptor = Panko::SerializationDescriptor.duplicate(_descriptor)
|
22
22
|
end
|
23
23
|
base._descriptor.type = base
|
24
|
-
|
25
24
|
end
|
26
25
|
|
27
26
|
attr_accessor :_descriptor
|
@@ -39,18 +38,14 @@ module Panko
|
|
39
38
|
def method_added(method)
|
40
39
|
return if @_descriptor.nil?
|
41
40
|
deleted_attr = @_descriptor.attributes.delete(method)
|
42
|
-
unless deleted_attr.nil?
|
43
|
-
@_descriptor.method_fields << method
|
44
|
-
end
|
41
|
+
@_descriptor.method_fields << method unless deleted_attr.nil?
|
45
42
|
end
|
46
43
|
|
47
44
|
def has_one(name, options = {})
|
48
45
|
serializer_const = options[:serializer]
|
49
46
|
serializer_const = Panko::SerializerResolver.resolve(name.to_s) if serializer_const.nil?
|
50
47
|
|
51
|
-
if serializer_const.nil?
|
52
|
-
raise "Can't find serializer for #{self.name}.#{name} has_one relationship."
|
53
|
-
end
|
48
|
+
raise "Can't find serializer for #{self.name}.#{name} has_one relationship." if serializer_const.nil?
|
54
49
|
|
55
50
|
@_descriptor.has_one_associations << Panko::Association.new(
|
56
51
|
name,
|
@@ -63,9 +58,7 @@ module Panko
|
|
63
58
|
serializer_const = options[:serializer] || options[:each_serializer]
|
64
59
|
serializer_const = Panko::SerializerResolver.resolve(name.to_s) if serializer_const.nil?
|
65
60
|
|
66
|
-
if serializer_const.nil?
|
67
|
-
raise "Can't find serializer for #{self.name}.#{name} has_many relationship."
|
68
|
-
end
|
61
|
+
raise "Can't find serializer for #{self.name}.#{name} has_many relationship." if serializer_const.nil?
|
69
62
|
|
70
63
|
@_descriptor.has_many_associations << Panko::Association.new(
|
71
64
|
name,
|
@@ -89,7 +82,7 @@ module Panko
|
|
89
82
|
|
90
83
|
def serialize_to_json(object)
|
91
84
|
writer = Oj::StringWriter.new(mode: :rails)
|
92
|
-
Panko
|
85
|
+
Panko.serialize_subject(object, writer, @descriptor)
|
93
86
|
writer.to_s
|
94
87
|
end
|
95
88
|
|
@@ -1,18 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Panko::SerializerResolver
|
4
|
-
|
5
4
|
def self.resolve(name)
|
6
5
|
serializer_name = "#{name.singularize.camelize}Serializer"
|
7
|
-
serializer_const =
|
6
|
+
serializer_const = safe_const_get(serializer_name)
|
8
7
|
|
9
8
|
return nil if serializer_const.nil?
|
10
|
-
return nil unless
|
9
|
+
return nil unless is_serializer(serializer_const)
|
11
10
|
|
12
11
|
serializer_const
|
13
12
|
end
|
14
13
|
|
15
|
-
|
16
14
|
private
|
17
15
|
|
18
16
|
def self.is_serializer(const)
|
@@ -24,5 +22,4 @@ class Panko::SerializerResolver
|
|
24
22
|
rescue NameError
|
25
23
|
nil
|
26
24
|
end
|
27
|
-
|
28
25
|
end
|
data/lib/panko/version.rb
CHANGED
data/lib/panko_serializer.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "panko/version"
|
3
4
|
require "panko/attribute"
|
4
5
|
require "panko/serializer"
|
@@ -6,7 +7,6 @@ require "panko/array_serializer"
|
|
6
7
|
require "panko/response"
|
7
8
|
require "panko/serializer_resolver"
|
8
9
|
|
9
|
-
|
10
10
|
# C Extension
|
11
11
|
require "oj"
|
12
12
|
require "panko/panko_serializer"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: panko_serializer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yosi Attias
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oj
|