Class: Panko::SerializationDescriptor
- Inherits:
-
Object
- Object
- Panko::SerializationDescriptor
- Defined in:
- lib/panko/serialization_descriptor.rb,
ext/panko_serializer/serialization_descriptor/serialization_descriptor.c
Class Method Summary collapse
-
.build(serializer, options = {}, serialization_context = nil) ⇒ Object
Creates new description and apply the options on the new descriptor.
-
.duplicate(descriptor) ⇒ Object
Create new descriptor with same properties useful when you want to apply filters.
Instance Method Summary collapse
- #aliases ⇒ Object
- #aliases=(aliases) ⇒ Object
- #apply_association_filters(associations, only_filters, except_filters) ⇒ Object
- #apply_attribute_filters(attributes, only, except) ⇒ Object
- #apply_fields_filters(fields, only, except) ⇒ Object
-
#apply_filters(options) ⇒ Object
Applies attributes and association filters.
- #attributes ⇒ Object
- #attributes=(attributes) ⇒ Object
- #has_many_associations ⇒ Object
- #has_many_associations=(has_many_associations) ⇒ Object
- #has_one_associations ⇒ Object
- #has_one_associations=(has_one_associations) ⇒ Object
- #method_fields ⇒ Object
- #method_fields=(method_fields) ⇒ Object
- #resolve_filters(options, filter) ⇒ Object
- #serializer ⇒ Object
- #serializer=(serializer) ⇒ Object
- #set_serialization_context(context) ⇒ Object
- #type ⇒ Object
- #type=(type) ⇒ Object
Class Method Details
.build(serializer, options = {}, serialization_context = nil) ⇒ Object
Creates new description and apply the options on the new descriptor
9 10 11 12 13 14 15 16 17 18 19 |
# File 'lib/panko/serialization_descriptor.rb', line 9 def self.build(serializer, = {}, serialization_context = nil) backend = Panko::SerializationDescriptor.duplicate(serializer._descriptor) .merge! serializer.filters_for([:context], [:scope]) if serializer.respond_to? :filters_for backend.apply_filters() backend.set_serialization_context(serialization_context) backend end |
.duplicate(descriptor) ⇒ Object
Create new descriptor with same properties useful when you want to apply filters
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/panko/serialization_descriptor.rb', line 25 def self.duplicate(descriptor) backend = Panko::SerializationDescriptor.new backend.type = descriptor.type backend.attributes = descriptor.attributes.dup backend.method_fields = descriptor.method_fields.dup backend.serializer = descriptor.type.new(_skip_init: true) unless backend.method_fields.empty? backend.has_many_associations = descriptor.has_many_associations.map(&:duplicate) backend.has_one_associations = descriptor.has_one_associations.map(&:duplicate) backend end |
Instance Method Details
#aliases ⇒ Object
134 135 136 137 |
# File 'ext/panko_serializer/serialization_descriptor/serialization_descriptor.c', line 134
VALUE sd_aliases_aref(VALUE self) {
SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
return sd->aliases;
}
|
#aliases=(aliases) ⇒ Object
128 129 130 131 132 |
# File 'ext/panko_serializer/serialization_descriptor/serialization_descriptor.c', line 128
VALUE sd_aliases_set(VALUE self, VALUE aliases) {
SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
sd->aliases = aliases;
return Qnil;
}
|
#apply_association_filters(associations, only_filters, except_filters) ⇒ Object
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
# File 'lib/panko/serialization_descriptor.rb', line 91 def apply_association_filters(associations, only_filters, except_filters) attributes_only_filters = only_filters[:attributes] || [] unless attributes_only_filters.empty? associations.select! do |association| attributes_only_filters.include?(association.name_sym) end end attributes_except_filters = except_filters[:attributes] || [] unless attributes_except_filters.empty? associations.reject! do |association| attributes_except_filters.include?(association.name_sym) end end associations_only_filters = only_filters[:associations] associations_except_filters = except_filters[:associations] return associations if associations_only_filters.empty? && associations_except_filters.empty? associations.map do |association| name = association.name_sym descriptor = association.descriptor only_filter = associations_only_filters[name] except_filter = associations_except_filters[name] filters = {} filters[:only] = only_filter unless only_filter.nil? filters[:except] = except_filter unless except_filter.nil? unless filters.empty? next Panko::Association.new( name, association.name_str, Panko::SerializationDescriptor.build(descriptor.type, filters) ) end association end end |
#apply_attribute_filters(attributes, only, except) ⇒ Object
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
# File 'lib/panko/serialization_descriptor.rb', line 158 def apply_attribute_filters(attributes, only, except) unless only.empty? attributes = attributes.select do |attribute| name_to_check = attribute.name name_to_check = attribute.alias_name unless attribute.alias_name.nil? only.include?(name_to_check.to_sym) end end unless except.empty? attributes = attributes.reject do |attribute| name_to_check = attribute.name name_to_check = attribute.alias_name unless attribute.alias_name.nil? except.include?(name_to_check.to_sym) end end attributes end |
#apply_fields_filters(fields, only, except) ⇒ Object
151 152 153 154 155 156 |
# File 'lib/panko/serialization_descriptor.rb', line 151 def apply_fields_filters(fields, only, except) return fields & only unless only.empty? return fields - except unless except.empty? fields end |
#apply_filters(options) ⇒ Object
Applies attributes and association filters
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/panko/serialization_descriptor.rb', line 56 def apply_filters() return unless .key?(:only) || .key?(:except) attributes_only_filters, associations_only_filters = resolve_filters(, :only) attributes_except_filters, associations_except_filters = resolve_filters(, :except) self.attributes = apply_attribute_filters( attributes, attributes_only_filters, attributes_except_filters ) self.method_fields = apply_attribute_filters( method_fields, attributes_only_filters, attributes_except_filters ) unless has_many_associations.empty? self.has_many_associations = apply_association_filters( has_many_associations, {attributes: attributes_only_filters, associations: associations_only_filters}, attributes: attributes_except_filters, associations: associations_except_filters ) end unless has_one_associations.empty? self.has_one_associations = apply_association_filters( has_one_associations, {attributes: attributes_only_filters, associations: associations_only_filters}, attributes: attributes_except_filters, associations: associations_except_filters ) end end |
#attributes ⇒ Object
79 80 81 82 |
# File 'ext/panko_serializer/serialization_descriptor/serialization_descriptor.c', line 79
VALUE sd_attributes_ref(VALUE self) {
SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
return sd->attributes;
}
|
#attributes=(attributes) ⇒ Object
72 73 74 75 76 77 |
# File 'ext/panko_serializer/serialization_descriptor/serialization_descriptor.c', line 72
VALUE sd_attributes_set(VALUE self, VALUE attributes) {
SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
sd->attributes = attributes;
return Qnil;
}
|
#has_many_associations ⇒ Object
112 113 114 115 |
# File 'ext/panko_serializer/serialization_descriptor/serialization_descriptor.c', line 112
VALUE sd_has_many_associations_ref(VALUE self) {
SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
return sd->has_many_associations;
}
|
#has_many_associations=(has_many_associations) ⇒ Object
106 107 108 109 110 |
# File 'ext/panko_serializer/serialization_descriptor/serialization_descriptor.c', line 106
VALUE sd_has_many_associations_set(VALUE self, VALUE has_many_associations) {
SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
sd->has_many_associations = has_many_associations;
return Qnil;
}
|
#has_one_associations ⇒ Object
101 102 103 104 |
# File 'ext/panko_serializer/serialization_descriptor/serialization_descriptor.c', line 101
VALUE sd_has_one_associations_ref(VALUE self) {
SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
return sd->has_one_associations;
}
|
#has_one_associations=(has_one_associations) ⇒ Object
95 96 97 98 99 |
# File 'ext/panko_serializer/serialization_descriptor/serialization_descriptor.c', line 95
VALUE sd_has_one_associations_set(VALUE self, VALUE has_one_associations) {
SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
sd->has_one_associations = has_one_associations;
return Qnil;
}
|
#method_fields ⇒ Object
90 91 92 93 |
# File 'ext/panko_serializer/serialization_descriptor/serialization_descriptor.c', line 90
VALUE sd_method_fields_ref(VALUE self) {
SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
return sd->method_fields;
}
|
#method_fields=(method_fields) ⇒ Object
84 85 86 87 88 |
# File 'ext/panko_serializer/serialization_descriptor/serialization_descriptor.c', line 84
VALUE sd_method_fields_set(VALUE self, VALUE method_fields) {
SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
sd->method_fields = method_fields;
return Qnil;
}
|
#resolve_filters(options, filter) ⇒ Object
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
# File 'lib/panko/serialization_descriptor.rb', line 134 def resolve_filters(, filter) filters = .fetch(filter, {}) return filters, {} if filters.is_a? Array # hash filters looks like this # { instance: [:a], foo: [:b] } # which mean, for the current instance use `[:a]` as filter # and for association named `foo` use `[:b]` return [], {} if filters.empty? attributes_filters = filters.fetch(:instance, []) association_filters = filters.except(:instance) [attributes_filters, association_filters] end |
#serializer ⇒ Object
66 67 68 69 70 |
# File 'ext/panko_serializer/serialization_descriptor/serialization_descriptor.c', line 66
VALUE sd_serializer_ref(VALUE self) {
SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
return sd->serializer;
}
|
#serializer=(serializer) ⇒ Object
59 60 61 62 63 64 |
# File 'ext/panko_serializer/serialization_descriptor/serialization_descriptor.c', line 59
VALUE sd_serializer_set(VALUE self, VALUE serializer) {
SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
sd->serializer = serializer;
return Qnil;
}
|
#set_serialization_context(context) ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/panko/serialization_descriptor.rb', line 41 def set_serialization_context(context) serializer.serialization_context = context if !method_fields.empty? && !serializer.nil? has_many_associations.each do |assoc| assoc.descriptor.set_serialization_context context end has_one_associations.each do |assoc| assoc.descriptor.set_serialization_context context end end |
#type ⇒ Object
123 124 125 126 |
# File 'ext/panko_serializer/serialization_descriptor/serialization_descriptor.c', line 123
VALUE sd_type_aref(VALUE self) {
SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
return sd->serializer_type;
}
|
#type=(type) ⇒ Object
117 118 119 120 121 |
# File 'ext/panko_serializer/serialization_descriptor/serialization_descriptor.c', line 117
VALUE sd_type_set(VALUE self, VALUE type) {
SerializationDescriptor sd = (SerializationDescriptor)DATA_PTR(self);
sd->serializer_type = type;
return Qnil;
}
|