plucker_serializer 0.2.1 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 26a16586daa2f18223613d2c0d7b8d058f3d013325c8477f988b7ab2f7e0b6ad
4
- data.tar.gz: 93fe0cc9d2877e9960fd39461864243bdcd6b812c35d08f57b250c07bd9b16e3
3
+ metadata.gz: b1afbdbecad2e29b9ee1e5cc59f143597f8995ad851b2d4a7b28ddcab61349de
4
+ data.tar.gz: 6a4bbd5de3a4d833833030fa8c2e35f43fc3ed56c2b2bfaeb435352495a904d0
5
5
  SHA512:
6
- metadata.gz: f780d77f1a8160851c1c04efe52263f453df1525f45b290fbfeb41653005317563235078259adf388afba8216cfa991bcd10eaa197f4e9deee615c28da7ea874
7
- data.tar.gz: cb06a2e6340ede77cbd0b368cd617c58b6cfa85c571f69e7458c520b2a349222caff40595effc969476c4f84818020994651489484f52375eae41b58e137b5fd
6
+ metadata.gz: d06fa3ebe3216c2aef19f60eb42887f8d4190111ce6f6d2d07010d2e0401965d9a5968e01e1da0915fd4dea468f727b2d05df323dda072351559e590c851cb04
7
+ data.tar.gz: 2ee3ef45ca3635bdf8400ec8b988a7d6ee2fc0bc524a9ee957287f8f59a8713ffcc04b5ec91195fa7f546b261152e395b107d22d25e6b756ca656fff5f5c0c16
data/lib/plucker/base.rb CHANGED
@@ -4,6 +4,7 @@ require_relative 'descriptor'
4
4
  require_relative 'has_many'
5
5
  require_relative 'belongs_to'
6
6
  require_relative 'has_one'
7
+ require "oj"
7
8
  require 'active_support/all'
8
9
 
9
10
  module Plucker
@@ -38,19 +39,23 @@ module Plucker
38
39
  alias to_hash serializable_hash
39
40
  alias to_h serializable_hash
40
41
 
41
- def get_hash
42
- attributes_hash.merge! associations_hash
42
+ def as_json(options = nil)
43
+ serializable_hash
43
44
  end
44
45
 
45
- def as_json(options = nil)
46
- to_h.as_json(options)
46
+ def to_json(options = {})
47
+ Oj.dump(serializable_hash, mode: :rails)
48
+ end
49
+
50
+ def get_hash
51
+ attributes_hash.merge! associations_hash
47
52
  end
48
53
 
49
54
  def associations_hash
50
55
  hash = {}
51
56
  self.class._descriptor._relationships.each do |(key, relationship)|
52
57
  next if relationship.excluded?(self)
53
- hash[key] = relationship.value(self)
58
+ hash[key.to_s] = relationship.value(self)
54
59
  end
55
60
  hash
56
61
  end
@@ -58,7 +63,7 @@ module Plucker
58
63
  def attributes_hash
59
64
  self.class._descriptor._attributes.each_with_object({}) do |(key, attr), hash|
60
65
  next if attr.excluded?(self)
61
- hash[key] = attr.value(self)
66
+ hash[key.to_s] = attr.value(self)
62
67
  end
63
68
  end
64
69
 
@@ -1,16 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
  require_relative 'concerns/caching'
3
+ require "oj"
4
+ require "pluck_all"
3
5
 
4
6
  module Plucker
5
7
  class Collection
6
8
  include Enumerable
7
9
  include Caching
8
10
 
9
- attr_reader :objects, :serializer_class, :options
11
+ attr_reader :objects, :cache_type, :serializer_class, :options
10
12
 
11
13
  def initialize(objects, options = {})
12
14
  @objects = objects
13
15
  @options = options
16
+ @cache_type = options[:cache] == :multi ? :multi : :collection
14
17
  @serializer_class = get_serialized_model(objects)
15
18
  end
16
19
 
@@ -20,24 +23,12 @@ module Plucker
20
23
  serializer_class.new(object).serializable_hash
21
24
  end.compact
22
25
  else
23
- if serializer_class.cache_enabled?
26
+ if @cache_type == :collection && serializer_class.cache_enabled?
24
27
  fetch do
25
- if serializer_class.is_pluckable?
26
- associated_hash
27
- else
28
- objects.map do |object|
29
- serializer_class.new(object).serializable_hash
30
- end.compact
31
- end
28
+ get_hash
32
29
  end
33
30
  else
34
- if serializer_class.is_pluckable?
35
- associated_hash
36
- else
37
- objects.map do |object|
38
- serializer_class.new(object).serializable_hash
39
- end.compact
40
- end
31
+ get_hash
41
32
  end
42
33
  end
43
34
  end
@@ -45,7 +36,21 @@ module Plucker
45
36
  alias to_h serializable_hash
46
37
 
47
38
  def as_json(options = nil)
48
- to_h.as_json(options)
39
+ serializable_hash
40
+ end
41
+
42
+ def to_json(options = {})
43
+ Oj.dump(serializable_hash, mode: :rails)
44
+ end
45
+
46
+ def get_hash
47
+ if serializer_class.is_pluckable?
48
+ associated_hash
49
+ else
50
+ objects.map do |object|
51
+ serializer_class.new(object).serializable_hash
52
+ end.compact
53
+ end
49
54
  end
50
55
 
51
56
  def cache_version
@@ -63,9 +68,9 @@ module Plucker
63
68
  pluck_to_hash(objects, serializer_class.pluckable_columns.to_a)
64
69
  end
65
70
 
66
- def pluck_to_hash(object, attrs)
67
- namespaced_attrs = attrs.map { |attr| object.model.table_name.to_s + "." + attr.to_s }
68
- object.pluck(Arel.sql(namespaced_attrs.join(','))).map { |el| attrs.zip(el).to_h }
71
+ def pluck_to_hash(objects, attrs)
72
+ namespaced_attrs = attrs.map { |attr| objects.model.table_name.to_s + "." + attr.to_s }
73
+ objects.pluck_all(namespaced_attrs.join(','))
69
74
  end
70
75
 
71
76
  def get_serialized_model(objects)
@@ -7,12 +7,12 @@ module Plucker
7
7
  self._serialized_model = get_serialized_model(serializer_class)
8
8
  self._attributes = {}
9
9
  self._relationships = {}
10
- self._pluckable_columns = Set.new([:updated_at])
10
+ self._pluckable_columns = Set.new
11
11
  self._is_pluckable = true
12
12
  end
13
13
 
14
14
  def is_pluckable?
15
- self._is_pluckable && !self._relationships.present?
15
+ self._is_pluckable
16
16
  end
17
17
 
18
18
  def add_attribute(key, attr)
@@ -5,7 +5,12 @@ require_relative "field"
5
5
  module Plucker
6
6
  class Relationship < Plucker::Field
7
7
  def associated_object(serializer)
8
- serializer.object.send(name)
8
+ block_value = instance_exec(serializer.object, &block) if block
9
+ if block && block_value != :nil
10
+ block_value
11
+ else
12
+ serializer.object.send(name)
13
+ end
9
14
  end
10
15
 
11
16
  def value(serializer)
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Plucker
3
- VERSION = "0.2.1"
3
+ VERSION = "0.4.0"
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plucker_serializer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henry Boisgibault
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-01 00:00:00.000000000 Z
11
+ date: 2022-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: oj
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pluck_all
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
27
55
  description: A blazing fast JSON serializer for ActiveRecord & Ruby objects
28
56
  email: henry@logora.fr
29
57
  executables: []