panko_serializer 0.4.4 → 0.5.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: b82a221e5207cf94860579c3ae74a5a31b51a50667785f83c6d9311160096792
4
- data.tar.gz: e8177737c068e142e2273fdfe70cb367a2b22fe841d4e3c49a63817f59383b25
3
+ metadata.gz: 5d2e6523f47bf65ff0dca7931267fc0d0402ac68f4490ff643eeafa589b8249d
4
+ data.tar.gz: 9fd3025b410b6ed6a29206ae02d868300b7b4fcc458987aaaeadb2117466bad3
5
5
  SHA512:
6
- metadata.gz: 78f1c9ae160336f9d950d2bab9796a1b124674cc4a0e8a2e41b000b38689e4093aa3783d63e64547598e23914c2e7156921f052409efc645d0d46e06d4daddba
7
- data.tar.gz: 44d99088e0afad8264c599026df2584d1df58b8c243540001b05f77b4caef9f110cf71b17bf08b15dfe525ef5bb9671125fefe822b5bffc4542e6ab8887e716d
6
+ metadata.gz: 64cb44e5e8b0dd3406eb720b34aff1eea7bd29f51e7f62a9b98d79690f76d4d4d1f645754f75b5efc880bca313a646cb52aeda667968f6917216bdb311ad8efd
7
+ data.tar.gz: 40ffe87725181f27edbeaf5e023c09b70ef836c20fdd8ab018c70ee59d0df42a5ae9c370d9eeb67e215be6404cb3c4c0f826f33ea6b6c6db0a162cac66c12c45
@@ -9,6 +9,9 @@ static ID pop_id;
9
9
 
10
10
  static ID to_a_id;
11
11
 
12
+ static ID object_id;
13
+ static ID serialization_context_id;
14
+
12
15
  void write_value(VALUE str_writer, VALUE key, VALUE value) {
13
16
  rb_funcall(str_writer, push_value_id, 2, value, key);
14
17
  }
@@ -24,8 +27,8 @@ void serialize_method_fields(VALUE subject,
24
27
  return;
25
28
  }
26
29
 
27
- serializer = sd_build_serializer(descriptor);
28
- sd_apply_serializer_config(descriptor, serializer, subject);
30
+ serializer = descriptor->serializer;
31
+ rb_ivar_set(serializer, object_id, subject);
29
32
 
30
33
  for (i = 0; i < RARRAY_LEN(method_fields); i++) {
31
34
  volatile VALUE attribute_name = RARRAY_AREF(method_fields, i);
@@ -34,6 +37,8 @@ void serialize_method_fields(VALUE subject,
34
37
 
35
38
  write_value(str_writer, rb_sym2str(attribute_name), result);
36
39
  }
40
+
41
+ rb_ivar_set(serializer, object_id, Qnil);
37
42
  }
38
43
 
39
44
  void serialize_fields(VALUE subject,
@@ -155,6 +160,9 @@ void Init_panko_serializer() {
155
160
  push_object_id = rb_intern("push_object");
156
161
  pop_id = rb_intern("pop");
157
162
  to_a_id = rb_intern("to_a");
163
+ object_id = rb_intern("@object");
164
+ serialization_context_id = rb_intern("@serialization_context");
165
+
158
166
 
159
167
  VALUE mPanko = rb_define_module("Panko");
160
168
 
@@ -3,8 +3,8 @@
3
3
  VALUE cSerializationDescriptor;
4
4
 
5
5
  static ID context_id;
6
- static ID scope_id;
7
6
  static ID object_id;
7
+ static ID sc_id;
8
8
 
9
9
  static void sd_free(SerializationDescriptor sd) {
10
10
  if (!sd) {
@@ -18,9 +18,6 @@ static void sd_free(SerializationDescriptor sd) {
18
18
  sd->has_one_associations = Qnil;
19
19
  sd->has_many_associations = Qnil;
20
20
  sd->aliases = Qnil;
21
- sd->context = Qnil;
22
- sd->scope = Qnil;
23
-
24
21
  xfree(sd);
25
22
  }
26
23
 
@@ -32,8 +29,6 @@ void sd_mark(SerializationDescriptor data) {
32
29
  rb_gc_mark(data->has_one_associations);
33
30
  rb_gc_mark(data->has_many_associations);
34
31
  rb_gc_mark(data->aliases);
35
- rb_gc_mark(data->context);
36
- rb_gc_mark(data->scope);
37
32
  }
38
33
 
39
34
  static VALUE sd_new(int argc, VALUE* argv, VALUE self) {
@@ -46,8 +41,6 @@ static VALUE sd_new(int argc, VALUE* argv, VALUE self) {
46
41
  sd->has_one_associations = Qnil;
47
42
  sd->has_many_associations = Qnil;
48
43
  sd->aliases = Qnil;
49
- sd->context = Qnil;
50
- sd->scope = Qnil;
51
44
 
52
45
  sd->attributes_writer = create_empty_attributes_writer();
53
46
 
@@ -66,14 +59,6 @@ void sd_set_writer(SerializationDescriptor sd, VALUE subject) {
66
59
  sd->attributes_writer = create_attributes_writer(subject);
67
60
  }
68
61
 
69
- VALUE sd_build_serializer(SerializationDescriptor sd) {
70
- if (sd->serializer == Qnil) {
71
- VALUE args[0];
72
- sd->serializer = rb_class_new_instance(0, args, sd->serializer_type);
73
- }
74
-
75
- return sd->serializer;
76
- }
77
62
 
78
63
  VALUE sd_serializer_set(VALUE self, VALUE serializer) {
79
64
  SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
@@ -88,18 +73,6 @@ VALUE sd_serializer_ref(VALUE self) {
88
73
  return sd->serializer;
89
74
  }
90
75
 
91
- void sd_apply_serializer_config(SerializationDescriptor descriptor,
92
- VALUE serializer,
93
- VALUE object) {
94
- rb_ivar_set(serializer, object_id, object);
95
- if (descriptor->context != Qnil && descriptor->context != Qundef) {
96
- rb_ivar_set(serializer, context_id, descriptor->context);
97
- }
98
-
99
- if (descriptor->scope != Qnil && descriptor->scope != Qundef) {
100
- rb_ivar_set(serializer, scope_id, descriptor->scope);
101
- }
102
- }
103
76
  VALUE sd_attributes_set(VALUE self, VALUE attributes) {
104
77
  SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
105
78
 
@@ -173,22 +146,9 @@ VALUE public_sd_build_serializer(VALUE self) {
173
146
  return sd_build_serializer(sd);
174
147
  }
175
148
 
176
- VALUE sd_context_set(VALUE self, VALUE context) {
177
- SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
178
- sd->context = context;
179
- return Qnil;
180
- }
181
-
182
- VALUE sd_scope_set(VALUE self, VALUE scope) {
183
- SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
184
- sd->scope = scope;
185
- return Qnil;
186
- }
187
-
188
149
  void panko_init_serialization_descriptor(VALUE mPanko) {
189
150
  object_id = rb_intern("@object");
190
- context_id = rb_intern("@context");
191
- scope_id = rb_intern("@scope");
151
+ sc_id = rb_intern("@sc");
192
152
 
193
153
  cSerializationDescriptor =
194
154
  rb_define_class_under(mPanko, "SerializationDescriptor", rb_cObject);
@@ -225,9 +185,4 @@ void panko_init_serialization_descriptor(VALUE mPanko) {
225
185
 
226
186
  rb_define_method(cSerializationDescriptor, "aliases=", sd_aliases_set, 1);
227
187
  rb_define_method(cSerializationDescriptor, "aliases", sd_aliases_aref, 0);
228
-
229
- rb_define_method(cSerializationDescriptor, "scope=", sd_scope_set, 1);
230
- rb_define_method(cSerializationDescriptor, "context=", sd_context_set, 1);
231
- rb_define_method(cSerializationDescriptor, "build_serializer",
232
- public_sd_build_serializer, 0);
233
188
  }
@@ -18,8 +18,6 @@ typedef struct _SerializationDescriptor {
18
18
  VALUE has_one_associations;
19
19
  VALUE has_many_associations;
20
20
 
21
- VALUE context;
22
- VALUE scope;
23
21
  AttributesWriter attributes_writer;
24
22
  } * SerializationDescriptor;
25
23
 
@@ -27,10 +25,6 @@ SerializationDescriptor sd_read(VALUE descriptor);
27
25
 
28
26
  void sd_mark(SerializationDescriptor data);
29
27
 
30
- VALUE sd_build_serializer(SerializationDescriptor descriptor);
31
- void sd_apply_serializer_config(SerializationDescriptor descriptor,
32
- VALUE serializer,
33
- VALUE object);
34
28
  void sd_set_writer(SerializationDescriptor sd, VALUE subject);
35
29
 
36
30
  void panko_init_serialization_descriptor(VALUE mPanko);
@@ -22,8 +22,10 @@ Please pass valid each_serializer to ArraySerializer, for example:
22
22
  scope: options[:scope]
23
23
  }
24
24
 
25
- @descriptor = Panko::SerializationDescriptor.build(@each_serializer, serializer_options)
26
- @context = options[:context]
25
+ @serialization_context = if options.key?(:context) || options.key?(:scope)
26
+ SerializationContext.new(options[:context], options[:scope])
27
+ end
28
+ @descriptor = Panko::SerializationDescriptor.build(@each_serializer, serializer_options, @serialization_context)
27
29
  end
28
30
 
29
31
  def to_json
@@ -41,6 +43,7 @@ Please pass valid each_serializer to ArraySerializer, for example:
41
43
  def serialize_to_json(subjects)
42
44
  writer = Oj::StringWriter.new(mode: :rails)
43
45
  Panko.serialize_subjects(subjects.to_a, writer, @descriptor)
46
+ @descriptor.set_serialization_context(nil) if @serialization_context.present?
44
47
  writer.to_s
45
48
  end
46
49
  end
@@ -6,15 +6,15 @@ module Panko
6
6
  # Creates new description and apply the options
7
7
  # on the new descriptor
8
8
  #
9
- def self.build(serializer, options = {})
9
+ def self.build(serializer, options = {}, serialization_context = nil)
10
10
  backend = Panko::SerializationDescriptor.duplicate(serializer._descriptor)
11
11
 
12
12
  options.merge! serializer.filters_for(options[:context], options[:scope]) if serializer.respond_to? :filters_for
13
13
 
14
- backend.context = options[:context]
15
- backend.scope = options[:scope]
16
14
  backend.apply_filters(options)
17
15
 
16
+ backend.set_serialization_context(serialization_context)
17
+
18
18
  backend
19
19
  end
20
20
 
@@ -30,18 +30,26 @@ module Panko
30
30
  backend.attributes = descriptor.attributes.dup
31
31
 
32
32
  backend.method_fields = descriptor.method_fields.dup
33
-
34
- backend.serializer = descriptor.serializer.reset unless descriptor.serializer.nil?
33
+ backend.serializer = descriptor.type.new(_skip_init: true)
35
34
 
36
35
  backend.has_many_associations = descriptor.has_many_associations.dup
37
36
  backend.has_one_associations = descriptor.has_one_associations.dup
38
37
 
39
- backend.context = nil
40
- backend.scope = nil
41
-
42
38
  backend
43
39
  end
44
40
 
41
+ def set_serialization_context(context)
42
+ serializer.instance_variable_set :@serialization_context, context if !method_fields.empty? && serializer.present?
43
+
44
+ has_many_associations.each do |assoc|
45
+ assoc.descriptor.set_serialization_context context
46
+ end
47
+
48
+ has_one_associations.each do |assoc|
49
+ assoc.descriptor.set_serialization_context context
50
+ end
51
+ end
52
+
45
53
  #
46
54
  # Applies attributes and association filters
47
55
  #
@@ -3,6 +3,15 @@
3
3
  require_relative "serialization_descriptor"
4
4
  require "oj"
5
5
 
6
+ class SerializationContext
7
+ attr_accessor :context, :scope
8
+
9
+ def initialize(context, scope)
10
+ @context = context
11
+ @scope = scope
12
+ end
13
+ end
14
+
6
15
  module Panko
7
16
  class Serializer
8
17
  class << self
@@ -69,12 +78,25 @@ module Panko
69
78
  end
70
79
 
71
80
  def initialize(options = {})
72
- @descriptor = Panko::SerializationDescriptor.build(self.class, options)
73
- @context = options[:context]
74
- @scope = options[:scope]
81
+ # this "_skip_init" trick is so I can create serializers from serialization descriptor
82
+ return if options[:_skip_init]
83
+
84
+ @serialization_context = if options.key?(:context) || options.key?(:scope)
85
+ SerializationContext.new(options[:context], options[:scope])
86
+ end
87
+
88
+ @descriptor = Panko::SerializationDescriptor.build(self.class, options, @serialization_context)
89
+ end
90
+
91
+ def context
92
+ @serialization_context.context
93
+ end
94
+
95
+ def scope
96
+ @serialization_context.scope
75
97
  end
76
98
 
77
- attr_reader :object, :context, :scope
99
+ attr_reader :object
78
100
 
79
101
  def serialize(object)
80
102
  Oj.load(serialize_to_json(object))
@@ -83,15 +105,9 @@ module Panko
83
105
  def serialize_to_json(object)
84
106
  writer = Oj::StringWriter.new(mode: :rails)
85
107
  Panko.serialize_subject(object, writer, @descriptor)
86
- writer.to_s
87
- end
88
-
89
- def reset
90
- @object = nil
91
- @context = nil
92
- @scope = nil
93
108
 
94
- self
109
+ @descriptor.set_serialization_context(nil) if @serialization_context.present?
110
+ writer.to_s
95
111
  end
96
112
  end
97
113
  end
data/lib/panko/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Panko
4
- VERSION = "0.4.4"
4
+ VERSION = "0.5.0"
5
5
  end
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
4
+ version: 0.5.0
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-23 00:00:00.000000000 Z
11
+ date: 2018-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj