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