easy_serializer 0.1.3 → 0.2.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 +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
|
-
[](https://travis-ci.org/arturictus/easy_serializer)
|
4
|
+
[](https://badge.fury.io/rb/easy_serializer)
|
5
5
|
[](https://codeclimate.com/github/arturictus/easy_serializer/coverage)
|
6
|
+
[](https://codeclimate.com/github/arturictus/easy_serializer)
|
7
|
+
[](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.
|