restpack_serializer 0.5.7 → 0.5.8
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/README.md +15 -2
- data/lib/restpack_serializer/serializable/attributes.rb +28 -4
- data/lib/restpack_serializer/version.rb +1 -1
- data/spec/serializable/attributes_spec.rb +35 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c62e329e0e5ad1a715c774afa67cf2fa73c9ecbf
|
4
|
+
data.tar.gz: a3a127d3888cf16b3b3561ad01990c1728716b88
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb603fa7f78a4a8349bf64ecebcc4fb02f2cbd3956bd4aff643dd4450409ec98e99714bc12c307972d50def980edaa4c61e2a408a17ba043d3ad363f7d8f3b55
|
7
|
+
data.tar.gz: c9631648c26608e0718b17348402eb46a6b666d165ed4773772ec37b659e9170cae5794c58e675802f2973109e9017cb8393d928fc41a1d43100e8f7493bcc0c
|
data/README.md
CHANGED
@@ -63,6 +63,8 @@ end
|
|
63
63
|
class AlbumSerializer
|
64
64
|
include RestPack::Serializer
|
65
65
|
attributes :id, :title, :year, :artist_id, :extras
|
66
|
+
optional :score
|
67
|
+
|
66
68
|
can_include :artists, :songs
|
67
69
|
can_filter_by :year
|
68
70
|
|
@@ -78,6 +80,18 @@ end
|
|
78
80
|
AlbumSerializer.as_json(album, { admin?: true })
|
79
81
|
```
|
80
82
|
|
83
|
+
All `attributes` are serialized by default. If you'd like to skip an attribute, you can pass an option in the `@context` as follows:
|
84
|
+
|
85
|
+
```ruby
|
86
|
+
AlbumSerializer.as_json(album, { include_title?: false })
|
87
|
+
```
|
88
|
+
|
89
|
+
You can also define `optional` attributes which aren't included by default. To include:
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
AlbumSerializer.as_json(album, { include_score?: true })
|
93
|
+
```
|
94
|
+
|
81
95
|
## Exposing an API
|
82
96
|
|
83
97
|
The `AlbumSerializer` provides `page` and `resource` methods which provide paged collection and singular resource GET endpoints.
|
@@ -114,8 +128,7 @@ AlbumSerializer.page(params, Albums.where("year < 1950"), { admin?: true })
|
|
114
128
|
```
|
115
129
|
|
116
130
|
Other features:
|
117
|
-
* [
|
118
|
-
* [Custom Attributes Hash](https://github.com/RestPack/restpack_serializer/blob/master/spec/serializable/serializer_spec.rb#L46)
|
131
|
+
* [Custom Attributes Hash](https://github.com/RestPack/restpack_serializer/blob/master/spec/serializable/serializer_spec.rb#L55)
|
119
132
|
|
120
133
|
## Paging
|
121
134
|
|
@@ -14,6 +14,10 @@ module RestPack::Serializer::Attributes
|
|
14
14
|
attrs.each { |attr| attribute attr }
|
15
15
|
end
|
16
16
|
|
17
|
+
def optional(*attrs)
|
18
|
+
attrs.each { |attr| optional_attribute attr }
|
19
|
+
end
|
20
|
+
|
17
21
|
def transform(attrs = [], transform_lambda)
|
18
22
|
attrs.each { |attr| transform_attribute(attr, transform_lambda) }
|
19
23
|
end
|
@@ -34,23 +38,43 @@ module RestPack::Serializer::Attributes
|
|
34
38
|
define_include_method name
|
35
39
|
end
|
36
40
|
|
41
|
+
def optional_attribute(name, options={})
|
42
|
+
add_to_serializable(name, options)
|
43
|
+
define_attribute_method name
|
44
|
+
define_optional_include_method name
|
45
|
+
end
|
46
|
+
|
37
47
|
def define_attribute_method(name)
|
38
48
|
unless method_defined?(name)
|
39
49
|
define_method name do
|
40
50
|
value = self.default_href if name == :href
|
41
|
-
|
51
|
+
if @model.is_a?(Hash)
|
52
|
+
value ||= @model[name] || @model[name.to_s]
|
53
|
+
else
|
54
|
+
value ||= @model.send(name)
|
55
|
+
end
|
42
56
|
value = value.to_s if name == :id
|
43
57
|
value
|
44
58
|
end
|
45
59
|
end
|
46
60
|
end
|
47
61
|
|
48
|
-
def
|
62
|
+
def define_optional_include_method(name)
|
63
|
+
define_include_method(name, false)
|
64
|
+
end
|
65
|
+
|
66
|
+
def define_include_method(name, include_by_default=true)
|
49
67
|
method = "include_#{name}?".to_sym
|
50
68
|
|
51
69
|
unless method_defined?(method)
|
52
|
-
|
53
|
-
|
70
|
+
if include_by_default
|
71
|
+
define_method method do
|
72
|
+
@context[method].nil? || @context[method]
|
73
|
+
end
|
74
|
+
else
|
75
|
+
define_method method do
|
76
|
+
@context[method].present?
|
77
|
+
end
|
54
78
|
end
|
55
79
|
end
|
56
80
|
end
|
@@ -4,6 +4,8 @@ describe RestPack::Serializer::Attributes do
|
|
4
4
|
class CustomSerializer
|
5
5
|
include RestPack::Serializer
|
6
6
|
attributes :a, :b, :c
|
7
|
+
attributes :d, :e
|
8
|
+
optional :sometimes, :maybe
|
7
9
|
attribute :old_attribute, :key => :new_key
|
8
10
|
transform [:gonzaga], lambda { |name, model| model.send(name).downcase }
|
9
11
|
end
|
@@ -11,11 +13,11 @@ describe RestPack::Serializer::Attributes do
|
|
11
13
|
subject(:attributes) { CustomSerializer.serializable_attributes }
|
12
14
|
|
13
15
|
it "correctly models specified attributes" do
|
14
|
-
expect(attributes.length).to be(
|
16
|
+
expect(attributes.length).to be(9)
|
15
17
|
end
|
16
18
|
|
17
19
|
it "correctly maps normal attributes" do
|
18
|
-
[:a, :b, :c].each do |attr|
|
20
|
+
[:a, :b, :c, :d, :e].each do |attr|
|
19
21
|
expect(attributes[attr]).to eq(attr)
|
20
22
|
end
|
21
23
|
end
|
@@ -24,6 +26,26 @@ describe RestPack::Serializer::Attributes do
|
|
24
26
|
expect(attributes[:new_key]).to eq(:old_attribute)
|
25
27
|
end
|
26
28
|
|
29
|
+
describe "optional attributes" do
|
30
|
+
let(:model) { OpenStruct.new(a: 'A', sometimes: 'SOMETIMES', gonzaga: 'GONZAGA') }
|
31
|
+
let(:context) { {} }
|
32
|
+
subject(:as_json) { CustomSerializer.as_json(model, context) }
|
33
|
+
|
34
|
+
context 'with no includes context' do
|
35
|
+
it "excludes by default" do
|
36
|
+
expect(as_json[:sometimes]).to eq(nil)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'with an includes context' do
|
41
|
+
let(:context) { { include_sometimes?: true } }
|
42
|
+
|
43
|
+
it "allows then to be included" do
|
44
|
+
expect(as_json[:sometimes]).to eq('SOMETIMES')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
27
49
|
describe '#transform_attributes' do
|
28
50
|
let(:model) { OpenStruct.new(gonzaga: 'IS A SCHOOL') }
|
29
51
|
|
@@ -33,4 +55,15 @@ describe RestPack::Serializer::Attributes do
|
|
33
55
|
expect(as_json[:gonzaga]).to eq('is a school')
|
34
56
|
end
|
35
57
|
end
|
58
|
+
|
59
|
+
describe "model as a hash" do
|
60
|
+
let(:model) { { a: 'A', 'b' => 'B' } }
|
61
|
+
|
62
|
+
subject(:as_json) { CustomSerializer.as_json(model, include_gonzaga?: false) }
|
63
|
+
|
64
|
+
it 'uses the transform method on the model attribute' do
|
65
|
+
expect(as_json[:a]).to eq('A')
|
66
|
+
expect(as_json[:b]).to eq('B')
|
67
|
+
end
|
68
|
+
end
|
36
69
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: restpack_serializer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gavin Joyce
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|