easy_serializer 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.coveralls.yml +2 -0
- data/.travis.yml +31 -1
- data/Gemfile +3 -1
- data/README.md +4 -2
- data/lib/easy_serializer.rb +11 -5
- data/lib/easy_serializer/attribute.rb +6 -51
- data/lib/easy_serializer/attribute_serializer.rb +51 -0
- data/lib/easy_serializer/base.rb +15 -57
- data/lib/easy_serializer/cache_output.rb +3 -0
- data/lib/easy_serializer/cacher.rb +22 -71
- data/lib/easy_serializer/cacher/collection.rb +40 -0
- data/lib/easy_serializer/cacher/method.rb +31 -0
- data/lib/easy_serializer/cacher/serializer.rb +38 -0
- data/lib/easy_serializer/cacher/template.rb +26 -0
- data/lib/easy_serializer/collection.rb +19 -0
- data/lib/easy_serializer/field.rb +51 -0
- data/lib/easy_serializer/root_cacher.rb +41 -0
- data/lib/easy_serializer/version.rb +1 -1
- metadata +13 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e23789313fd87585246d0510e59fa3c512d41587
|
4
|
+
data.tar.gz: c7bdfb7eb7f55d31f1e6a57e0009e713d88f5eb0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19671f04e8fa2537334650ea8cc386932b38ac8e754c2d8b8fdfce9b6508b2f208f542ca6d7c81c47ceb59fc8d590b1bb6cb3034f713f44625fd72ad13951d75
|
7
|
+
data.tar.gz: 3a2aa87a28f38e80b90e1a5d91a90dcae99491af22513bd015cebcf72f8df3eb3cc17660f465f287f5cdcd31d54e18d9709d6ffb2905512e919797997fa36f4e
|
data/.coveralls.yml
ADDED
data/.travis.yml
CHANGED
@@ -1,4 +1,34 @@
|
|
1
|
+
sudo: false
|
2
|
+
cache: bundler
|
1
3
|
language: ruby
|
2
4
|
rvm:
|
5
|
+
- 1.9.3
|
6
|
+
- 2.0.0
|
7
|
+
- 2.1
|
3
8
|
- 2.1.6
|
4
|
-
|
9
|
+
- 2.2
|
10
|
+
- 2.3.0
|
11
|
+
- ruby-head
|
12
|
+
- jruby-19mode
|
13
|
+
- jruby-9.0.1.0
|
14
|
+
- rbx-3
|
15
|
+
env:
|
16
|
+
# this doesn't do anything for MRI or RBX, but it doesn't hurt them either
|
17
|
+
# for JRuby, it enables us to get more accurate coverage data
|
18
|
+
- JRUBY_OPTS="--debug"
|
19
|
+
matrix:
|
20
|
+
allow_failures:
|
21
|
+
- rvm: 1.9.3
|
22
|
+
- rvm: ruby-head
|
23
|
+
- rvm: rbx-3
|
24
|
+
- rvm: jruby-19mode
|
25
|
+
- rvm: jruby-9.0.1.0
|
26
|
+
fast_finish: true
|
27
|
+
before_install: gem update --remote bundler
|
28
|
+
install:
|
29
|
+
- bundle install --retry=3
|
30
|
+
script:
|
31
|
+
- bundle exec rspec
|
32
|
+
addons:
|
33
|
+
code_climate:
|
34
|
+
repo_token: 723c5d2fd0e1726d6efeea17ecd5aa22d0945a942ba3b21fdebc03f733359706
|
data/Gemfile
CHANGED
@@ -3,4 +3,6 @@ source 'https://rubygems.org'
|
|
3
3
|
# Specify your gem's dependencies in easy_serializer.gemspec
|
4
4
|
gemspec
|
5
5
|
gem 'pry'
|
6
|
-
gem '
|
6
|
+
gem 'contextuable', '~> 0.4'
|
7
|
+
gem 'coveralls', require: false
|
8
|
+
gem "codeclimate-test-reporter", group: :test, require: false
|
data/README.md
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
# EasySerializer
|
2
2
|
|
3
|
-
[
|
4
|
-
[![
|
3
|
+
[![Build Status](https://travis-ci.org/arturictus/easy_serializer.svg?branch=master)](https://travis-ci.org/arturictus/easy_serializer)
|
4
|
+
[![Gem Version](https://badge.fury.io/rb/easy_serializer.svg)](https://badge.fury.io/rb/easy_serializer)
|
5
5
|
[![Test Coverage](https://codeclimate.com/github/arturictus/easy_serializer/badges/coverage.svg)](https://codeclimate.com/github/arturictus/easy_serializer/coverage)
|
6
|
+
[![Code Climate](https://codeclimate.com/github/arturictus/easy_serializer/badges/gpa.svg)](https://codeclimate.com/github/arturictus/easy_serializer)
|
7
|
+
[![Issue Count](https://codeclimate.com/github/arturictus/easy_serializer/badges/issue_count.svg)](https://codeclimate.com/github/arturictus/easy_serializer)
|
6
8
|
|
7
9
|
Semantic serializer for making easy serializing objects.
|
8
10
|
EasySerializer is inspired in [ActiveModel Serializer > 0.10] (https://github.com/rails-api/active_model_serializers/tree/v0.10.0.rc3) it's a
|
data/lib/easy_serializer.rb
CHANGED
@@ -3,6 +3,7 @@ require 'active_support/all'
|
|
3
3
|
|
4
4
|
module EasySerializer
|
5
5
|
include ActiveSupport::Configurable
|
6
|
+
extend ActiveSupport::Autoload
|
6
7
|
|
7
8
|
def self.setup
|
8
9
|
yield self
|
@@ -10,9 +11,14 @@ module EasySerializer
|
|
10
11
|
|
11
12
|
config_accessor(:perform_caching) { false }
|
12
13
|
config_accessor(:cache)
|
13
|
-
end
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
autoload :Helpers
|
16
|
+
autoload :Cacher
|
17
|
+
autoload :RootCacher
|
18
|
+
autoload :Attribute
|
19
|
+
autoload :AttributeSerializer
|
20
|
+
autoload :Base
|
21
|
+
autoload :CacheOutput
|
22
|
+
autoload :Field
|
23
|
+
autoload :Collection
|
24
|
+
end
|
@@ -1,60 +1,15 @@
|
|
1
1
|
module EasySerializer
|
2
|
-
Attribute
|
2
|
+
class Attribute < Field
|
3
3
|
include Helpers
|
4
|
-
def self.call(serializer, setup)
|
5
|
-
new(serializer, setup).value
|
6
|
-
end
|
7
|
-
|
8
|
-
def object
|
9
|
-
serializer.object
|
10
|
-
end
|
11
|
-
def value
|
12
|
-
value_or_default
|
13
|
-
end
|
14
|
-
|
15
|
-
def value_or_default
|
16
|
-
value = attr_serializer
|
17
|
-
if value.nil? && setup[:default]
|
18
|
-
return option_to_value(setup[:default], object, serializer)
|
19
|
-
end
|
20
|
-
value
|
21
|
-
end
|
22
4
|
|
23
|
-
def
|
24
|
-
|
25
|
-
return value.output if value.is_a?(CacheOutput)
|
26
|
-
return value unless serializer_class = setup[:serializer]
|
27
|
-
if setup[:collection]
|
28
|
-
Array.wrap(value).map { |o| serialize!(serializer_class, o) }
|
29
|
-
else
|
30
|
-
serialize!(serializer_class, value)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
def send_name(obj)
|
34
|
-
obj.send(setup[:name])
|
5
|
+
def default?
|
6
|
+
options[:default]
|
35
7
|
end
|
36
8
|
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
Cacher.call(serializer, setup, nil, &execute)
|
41
|
-
else
|
42
|
-
serializer.instance_exec object, &execute
|
43
|
-
end
|
9
|
+
def get_default(object, serializer)
|
10
|
+
return unless default?
|
11
|
+
option_to_value(options[:default], object, serializer)
|
44
12
|
end
|
45
13
|
|
46
|
-
def send_to_serializer(serializer_class, value)
|
47
|
-
return unless value
|
48
|
-
option_to_value(serializer_class, value, serializer).call(value)
|
49
|
-
end
|
50
|
-
|
51
|
-
def serialize!(serializer_class, value)
|
52
|
-
return unless value
|
53
|
-
if EasySerializer.perform_caching && setup[:cache]
|
54
|
-
Cacher.call(serializer, setup, value)
|
55
|
-
else
|
56
|
-
send_to_serializer(serializer_class, value)
|
57
|
-
end
|
58
|
-
end
|
59
14
|
end
|
60
15
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module EasySerializer
|
2
|
+
AttributeSerializer = Struct.new(:serializer, :metadata) do
|
3
|
+
include Helpers
|
4
|
+
def self.call(serializer, metadata)
|
5
|
+
new(serializer, metadata).value
|
6
|
+
end
|
7
|
+
|
8
|
+
def object
|
9
|
+
serializer.object
|
10
|
+
end
|
11
|
+
|
12
|
+
def value
|
13
|
+
value_or_default
|
14
|
+
end
|
15
|
+
|
16
|
+
def value_or_default
|
17
|
+
value = attr_serializer
|
18
|
+
# Check if value is nil
|
19
|
+
# eval option default ( in case is block)
|
20
|
+
if value.nil?
|
21
|
+
return metadata.get_default(object, serializer)
|
22
|
+
end
|
23
|
+
value
|
24
|
+
end
|
25
|
+
|
26
|
+
def attr_serializer
|
27
|
+
value = cache_or_attribute
|
28
|
+
|
29
|
+
return value.output if value.is_a?(CacheOutput)
|
30
|
+
return value unless metadata.nested_serializer?
|
31
|
+
if metadata.is_a? Collection
|
32
|
+
Array.wrap(value).map { |o| nested_serialization!(o) }
|
33
|
+
else
|
34
|
+
nested_serialization!(value)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def cache_or_attribute
|
39
|
+
if EasySerializer.perform_caching && metadata.catch?
|
40
|
+
Cacher.new(serializer, metadata).execute
|
41
|
+
else
|
42
|
+
serializer.instance_exec object, &metadata.get_value
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def nested_serialization!(value)
|
47
|
+
return unless value
|
48
|
+
metadata.serialize!(value, serializer)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/easy_serializer/base.rb
CHANGED
@@ -19,7 +19,7 @@ module EasySerializer
|
|
19
19
|
|
20
20
|
def attribute(name, opts = {}, &block)
|
21
21
|
@__serializable_attributes ||= []
|
22
|
-
@__serializable_attributes <<
|
22
|
+
@__serializable_attributes << Attribute.new(name, opts, block)
|
23
23
|
end
|
24
24
|
|
25
25
|
def cache(bool, opts = {}, &block)
|
@@ -35,8 +35,8 @@ module EasySerializer
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def collection(name, opts = {}, &block)
|
38
|
-
|
39
|
-
|
38
|
+
@__serializable_attributes ||= []
|
39
|
+
@__serializable_attributes << Collection.new(name, opts, block)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
@@ -52,15 +52,19 @@ module EasySerializer
|
|
52
52
|
option_to_value(serializer, value).call(value)
|
53
53
|
end
|
54
54
|
|
55
|
+
def __cache
|
56
|
+
self.class.instance_variable_get(:@__cache)
|
57
|
+
end
|
58
|
+
|
55
59
|
private
|
56
60
|
|
57
61
|
def _serialize
|
58
|
-
__serializable_attributes.each_with_object({}) do |
|
59
|
-
if
|
60
|
-
hash.merge!(value_or_default(
|
62
|
+
__serializable_attributes.each_with_object({}) do |metadata, hash|
|
63
|
+
if metadata.options[:key] === false
|
64
|
+
hash.merge!(value_or_default(metadata))
|
61
65
|
else
|
62
|
-
key = (
|
63
|
-
hash[key] = value_or_default(
|
66
|
+
key = (metadata.options[:key] ? metadata.options[:key] : metadata.name)
|
67
|
+
hash[key] = value_or_default(metadata)
|
64
68
|
end
|
65
69
|
end
|
66
70
|
end
|
@@ -69,62 +73,16 @@ module EasySerializer
|
|
69
73
|
return false unless EasySerializer.perform_caching
|
70
74
|
cache = __cache
|
71
75
|
return false unless cache
|
72
|
-
|
73
|
-
end
|
74
|
-
|
75
|
-
def __cache
|
76
|
-
self.class.instance_variable_get(:@__cache)
|
76
|
+
RootCacher.call(self){ _serialize }
|
77
77
|
end
|
78
78
|
|
79
79
|
def __serializable_attributes
|
80
80
|
self.class.instance_variable_get(:@__serializable_attributes) || []
|
81
81
|
end
|
82
82
|
|
83
|
-
def value_or_default(
|
84
|
-
|
83
|
+
def value_or_default(metadata)
|
84
|
+
AttributeSerializer.call(self, metadata)
|
85
85
|
end
|
86
86
|
|
87
|
-
# def value_or_default(setup)
|
88
|
-
# value = attr_serializer(setup)
|
89
|
-
# if value.nil? && setup[:default]
|
90
|
-
# return option_to_value(setup[:default], object)
|
91
|
-
# end
|
92
|
-
# value
|
93
|
-
# end
|
94
|
-
#
|
95
|
-
# def attr_serializer(setup)
|
96
|
-
# value = cache_or_attribute(setup)
|
97
|
-
# return value if value.respond_to?(:fetch) || value.respond_to?(:each)
|
98
|
-
# return value unless serializer = setup[:serializer]
|
99
|
-
# if setup[:collection]
|
100
|
-
# Array.wrap(value).map { |o| cache_or_serialize(serializer, o, setup) }
|
101
|
-
# else
|
102
|
-
# cache_or_serialize(serializer, value, setup)
|
103
|
-
# end
|
104
|
-
# end
|
105
|
-
#
|
106
|
-
# def cache_or_attribute(setup)
|
107
|
-
# execute = setup[:block] || proc { |o| o.send(setup[:name]) }
|
108
|
-
# if EasySerializer.perform_caching && setup[:cache]
|
109
|
-
# Cacher.call(self, setup, nil, &execute)
|
110
|
-
# else
|
111
|
-
# if object.respond_to?(:each)
|
112
|
-
# object.map { |o| instance_exec o, &execute }
|
113
|
-
# else
|
114
|
-
# instance_exec object, &execute
|
115
|
-
# end
|
116
|
-
# end
|
117
|
-
# end
|
118
|
-
#
|
119
|
-
# def cache_or_serialize(serializer, value, opts)
|
120
|
-
# return unless value
|
121
|
-
# if EasySerializer.perform_caching && opts[:cache]
|
122
|
-
# Cacher.call(self, opts, value)
|
123
|
-
# else
|
124
|
-
# send_to_serializer(serializer, value)
|
125
|
-
# end
|
126
|
-
# end
|
127
|
-
|
128
|
-
|
129
87
|
end
|
130
88
|
end
|
@@ -1,80 +1,31 @@
|
|
1
1
|
module EasySerializer
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
Cacher.new(serializer)
|
8
|
-
.set(options: options, block: block, value: value)
|
9
|
-
.execute
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.root_call(serializer, options, value, &block)
|
13
|
-
options[:cache_key] = options[:key]
|
14
|
-
options[:root_call] = true
|
15
|
-
call(serializer, options, value, &block)
|
16
|
-
end
|
17
|
-
|
18
|
-
attr_accessor :object, :options, :block
|
19
|
-
attr_writer :value
|
20
|
-
|
21
|
-
delegate :object, to: :serializer
|
22
|
-
|
23
|
-
def set(options)
|
24
|
-
options.each { |k, v| send("#{k}=", v) }
|
25
|
-
self
|
2
|
+
class Cacher
|
3
|
+
attr_reader :serializer, :metadata
|
4
|
+
def initialize(serializer, metadata)
|
5
|
+
@serializer = serializer
|
6
|
+
@metadata = metadata
|
26
7
|
end
|
27
8
|
|
28
|
-
def
|
29
|
-
|
30
|
-
@value ||= serializer.instance_exec object, &block
|
31
|
-
end
|
32
|
-
|
33
|
-
def key(_value = nil)
|
34
|
-
_value ||= value
|
35
|
-
@key ||= if options[:cache_key]
|
36
|
-
option_to_value(options[:cache_key], _value, serializer)
|
37
|
-
elsif options[:serializer] || options[:root_call]
|
38
|
-
[_value, 'EasySerialized'].flatten
|
39
|
-
else
|
40
|
-
[_value, options[:name], 'EasySerialized'].flatten
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def options_for_cache
|
45
|
-
if options[:root_call]
|
46
|
-
options.except(:block, :cache_key, :root_call, :serializer, :key)
|
47
|
-
else
|
48
|
-
options[:cache_options]
|
49
|
-
end || {}
|
50
|
-
end
|
51
|
-
|
52
|
-
def _block_to_execute(_value = nil)
|
53
|
-
_value ||= value
|
54
|
-
if options[:serializer]
|
55
|
-
proc { serializer.send_to_serializer(options[:serializer], _value) }
|
56
|
-
else
|
57
|
-
proc { serializer.instance_exec object, &block }
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def fetch(_key = nil, _value = nil)
|
62
|
-
_key ||= key
|
63
|
-
_value ||= value
|
64
|
-
EasySerializer.cache.fetch(_key, options_for_cache, &_block_to_execute(_value))
|
9
|
+
def execute
|
10
|
+
CacheOutput.new(_execute)
|
65
11
|
end
|
66
12
|
|
67
|
-
|
68
|
-
CacheOutput.new(elem)
|
69
|
-
end
|
13
|
+
private
|
70
14
|
|
71
|
-
def
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
15
|
+
def _execute
|
16
|
+
strategy = if metadata.is_a?(EasySerializer::Collection)
|
17
|
+
Collection
|
18
|
+
elsif metadata.serializer?
|
19
|
+
Serializer
|
20
|
+
else
|
21
|
+
Method
|
22
|
+
end
|
23
|
+
strategy.call(serializer, metadata)
|
78
24
|
end
|
79
25
|
end
|
80
26
|
end
|
27
|
+
|
28
|
+
require 'easy_serializer/cacher/template'
|
29
|
+
require 'easy_serializer/cacher/collection'
|
30
|
+
require 'easy_serializer/cacher/method'
|
31
|
+
require 'easy_serializer/cacher/serializer'
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module EasySerializer
|
2
|
+
class Cacher
|
3
|
+
class Collection < Template
|
4
|
+
|
5
|
+
def execute
|
6
|
+
collection.map do |elem|
|
7
|
+
fetch(key(elem), elem)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def collection
|
12
|
+
@collection ||= serializer.instance_exec serializer.object, &metadata.get_value
|
13
|
+
end
|
14
|
+
|
15
|
+
def key(elem)
|
16
|
+
if metadata_key
|
17
|
+
[elem, metadata_key, nested_serializer.name]
|
18
|
+
else
|
19
|
+
[elem, nested_serializer.name]
|
20
|
+
end.flatten
|
21
|
+
end
|
22
|
+
|
23
|
+
def options
|
24
|
+
metadata.cache_options || {}
|
25
|
+
end
|
26
|
+
|
27
|
+
def block_to_get_value(elem)
|
28
|
+
proc { nested_serializer.call(elem) }
|
29
|
+
end
|
30
|
+
|
31
|
+
def nested_serializer
|
32
|
+
metadata.serializer(serializer.object, serializer)
|
33
|
+
end
|
34
|
+
|
35
|
+
def fetch(key, elem)
|
36
|
+
EasySerializer.cache.fetch(key, options, &block_to_get_value(elem))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module EasySerializer
|
2
|
+
class Cacher
|
3
|
+
class Method < Template
|
4
|
+
|
5
|
+
def execute
|
6
|
+
fetch
|
7
|
+
end
|
8
|
+
|
9
|
+
def key
|
10
|
+
cache_key = if metadata.cache_key
|
11
|
+
option_to_value(metadata.cache_key, serializer.object, serializer)
|
12
|
+
else
|
13
|
+
metadata.name
|
14
|
+
end
|
15
|
+
[serializer.object, cache_key, serializer.class.name].flatten
|
16
|
+
end
|
17
|
+
|
18
|
+
def options
|
19
|
+
metadata.cache_options || {}
|
20
|
+
end
|
21
|
+
|
22
|
+
def block_to_get_value
|
23
|
+
proc { serializer.instance_exec serializer.object, &metadata.get_value }
|
24
|
+
end
|
25
|
+
|
26
|
+
def fetch
|
27
|
+
EasySerializer.cache.fetch(key, options, &block_to_get_value)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module EasySerializer
|
2
|
+
class Cacher
|
3
|
+
class Serializer < Template
|
4
|
+
|
5
|
+
def execute
|
6
|
+
fetch
|
7
|
+
end
|
8
|
+
|
9
|
+
def key
|
10
|
+
if metadata_key
|
11
|
+
[value, metadata_key, nested_serializer.name]
|
12
|
+
else
|
13
|
+
[value, nested_serializer.name]
|
14
|
+
end.flatten
|
15
|
+
end
|
16
|
+
|
17
|
+
def options
|
18
|
+
metadata.cache_options || {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def block_to_get_value
|
22
|
+
proc { metadata.serialize!(value, serializer) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def value
|
26
|
+
serializer.instance_exec serializer.object, &metadata.get_value
|
27
|
+
end
|
28
|
+
|
29
|
+
def nested_serializer
|
30
|
+
metadata.serializer(serializer.object, serializer)
|
31
|
+
end
|
32
|
+
|
33
|
+
def fetch
|
34
|
+
EasySerializer.cache.fetch(key, options, &block_to_get_value)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module EasySerializer
|
2
|
+
class Cacher
|
3
|
+
class Template
|
4
|
+
include Helpers
|
5
|
+
attr_reader :serializer, :metadata
|
6
|
+
|
7
|
+
def initialize(serializer, metadata)
|
8
|
+
@serializer = serializer
|
9
|
+
@metadata = metadata
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.call(*args)
|
13
|
+
new(*args).execute
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def metadata_key
|
19
|
+
return @metadata_key if defined?(@metadata_key)
|
20
|
+
@metadata_key = if metadata.cache_key
|
21
|
+
option_to_value(metadata.cache_key, serializer.object, serializer)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module EasySerializer
|
2
|
+
class Collection < Field
|
3
|
+
attr_reader :_options, :name, :block
|
4
|
+
def initialize(name, options, block)
|
5
|
+
@name = name
|
6
|
+
@_options = options
|
7
|
+
@block = block
|
8
|
+
end
|
9
|
+
|
10
|
+
def options
|
11
|
+
received_opts.merge(collection: true)
|
12
|
+
end
|
13
|
+
|
14
|
+
def received_opts
|
15
|
+
_options || {}
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module EasySerializer
|
2
|
+
Field = Struct.new(:name, :options, :block) do
|
3
|
+
include Helpers
|
4
|
+
|
5
|
+
def get_value
|
6
|
+
if block
|
7
|
+
block
|
8
|
+
else
|
9
|
+
method(:send_method)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def send_method(obj)
|
14
|
+
obj.send(name)
|
15
|
+
end
|
16
|
+
|
17
|
+
def catch?
|
18
|
+
options[:cache]
|
19
|
+
end
|
20
|
+
|
21
|
+
def serializer?
|
22
|
+
!!options[:serializer]
|
23
|
+
end
|
24
|
+
alias_method :nested_serializer?, :serializer?
|
25
|
+
|
26
|
+
def cache_options
|
27
|
+
options[:cache_options]
|
28
|
+
end
|
29
|
+
|
30
|
+
def cache_key
|
31
|
+
options[:cache_key]
|
32
|
+
end
|
33
|
+
|
34
|
+
def nested_serializer
|
35
|
+
@serializer
|
36
|
+
end
|
37
|
+
|
38
|
+
def serializer(object, serializer_instance)
|
39
|
+
return unless serializer?
|
40
|
+
option_to_value(options[:serializer], object, serializer_instance)
|
41
|
+
end
|
42
|
+
alias_method :nested_serializer=, :serializer
|
43
|
+
|
44
|
+
# Important!!! DO NOT memoize this method
|
45
|
+
def serialize!(object, serializer_instance)
|
46
|
+
serializer = serializer(object, serializer_instance)
|
47
|
+
return unless serializer
|
48
|
+
serializer.call(object)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module EasySerializer
|
2
|
+
class RootCacher
|
3
|
+
include Helpers
|
4
|
+
|
5
|
+
def self.call(serializer, &block)
|
6
|
+
new(serializer, &block).execute
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader :serializer, :block
|
10
|
+
def initialize(serializer, &block)
|
11
|
+
@serializer = serializer
|
12
|
+
@block = block
|
13
|
+
end
|
14
|
+
|
15
|
+
def execute
|
16
|
+
fetch
|
17
|
+
end
|
18
|
+
|
19
|
+
def object
|
20
|
+
serializer.object
|
21
|
+
end
|
22
|
+
|
23
|
+
def options
|
24
|
+
serializer.__cache.except(:block, :cache_key, :root_call, :serializer, :key)
|
25
|
+
end
|
26
|
+
|
27
|
+
def key
|
28
|
+
custom = serializer.__cache[:key]
|
29
|
+
if custom
|
30
|
+
option_to_value(custom, object, serializer)
|
31
|
+
else
|
32
|
+
[object, 'EasySerialized'].flatten
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def fetch
|
37
|
+
EasySerializer.cache.fetch(key, options, &block)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: easy_serializer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artur Pañach
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -76,6 +76,7 @@ executables: []
|
|
76
76
|
extensions: []
|
77
77
|
extra_rdoc_files: []
|
78
78
|
files:
|
79
|
+
- ".coveralls.yml"
|
79
80
|
- ".gitignore"
|
80
81
|
- ".rspec"
|
81
82
|
- ".travis.yml"
|
@@ -89,9 +90,18 @@ files:
|
|
89
90
|
- easy_serializer.gemspec
|
90
91
|
- lib/easy_serializer.rb
|
91
92
|
- lib/easy_serializer/attribute.rb
|
93
|
+
- lib/easy_serializer/attribute_serializer.rb
|
92
94
|
- lib/easy_serializer/base.rb
|
95
|
+
- lib/easy_serializer/cache_output.rb
|
93
96
|
- lib/easy_serializer/cacher.rb
|
97
|
+
- lib/easy_serializer/cacher/collection.rb
|
98
|
+
- lib/easy_serializer/cacher/method.rb
|
99
|
+
- lib/easy_serializer/cacher/serializer.rb
|
100
|
+
- lib/easy_serializer/cacher/template.rb
|
101
|
+
- lib/easy_serializer/collection.rb
|
102
|
+
- lib/easy_serializer/field.rb
|
94
103
|
- lib/easy_serializer/helpers.rb
|
104
|
+
- lib/easy_serializer/root_cacher.rb
|
95
105
|
- lib/easy_serializer/version.rb
|
96
106
|
homepage: https://github.com/arturictus/easy_serializer
|
97
107
|
licenses:
|
@@ -113,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
123
|
version: '0'
|
114
124
|
requirements: []
|
115
125
|
rubyforge_project:
|
116
|
-
rubygems_version: 2.
|
126
|
+
rubygems_version: 2.4.5
|
117
127
|
signing_key:
|
118
128
|
specification_version: 4
|
119
129
|
summary: Semantic serializer for making easy serializing objects.
|