grape-active_model_serializers 1.3.1 → 1.3.2
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/.rubocop.yml +2 -0
- data/.rubocop_todo.yml +24 -0
- data/.travis.yml +15 -0
- data/Gemfile +7 -0
- data/Guardfile +4 -5
- data/README.md +20 -16
- data/Rakefile +5 -2
- data/grape-active_model_serializers.gemspec +15 -14
- data/lib/grape-active_model_serializers/endpoint_extension.rb +16 -17
- data/lib/grape-active_model_serializers/formatter.rb +22 -38
- data/lib/grape-active_model_serializers/version.rb +1 -1
- data/spec/features/grape-active_model_serializers/render_spec.rb +8 -11
- data/spec/grape-active_model_serializers/endpoint_extension_spec.rb +14 -10
- data/spec/grape-active_model_serializers/formatter_spec.rb +24 -23
- data/spec/grape-active_model_serializers_spec.rb +0 -1
- data/spec/old_grape_ams_spec.rb +37 -38
- data/spec/spec_helper.rb +3 -3
- data/spec/support/models/blog_post.rb +2 -2
- data/spec/support/models/user.rb +2 -2
- metadata +37 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0833fa7f880a3344cf42f728b3176856e6ffd2a4
|
4
|
+
data.tar.gz: d080d1eeb3674e584535668269ed1cef7af531e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b43a17bd55b83913d2d745db519c91e13523d601d318f6d87169ddbfae15105f71997b35461a21d238543d5e6b2cb4115b6a19083c7c39bc3ae4d81cd7ebaefb
|
7
|
+
data.tar.gz: 1aa226e6e3e42baa064c8d83f413be3da199e65add7c3cceba5fb2083154cfad2a764d906cd3ad1e4ac5082c7c10d620705584a696522ad6f46e7bf5bca65d6a
|
data/.rubocop.yml
ADDED
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# This configuration was generated by `rubocop --auto-gen-config`
|
2
|
+
# on 2015-01-13 18:47:14 -0500 using RuboCop version 0.28.0.
|
3
|
+
# The point is for the user to remove these configuration records
|
4
|
+
# one by one as the offenses are removed from the code base.
|
5
|
+
# Note that changes in the inspected code, or installation of new
|
6
|
+
# versions of RuboCop, may require this file to be generated again.
|
7
|
+
|
8
|
+
# Offense count: 25
|
9
|
+
# Configuration parameters: AllowURI, URISchemes.
|
10
|
+
Metrics/LineLength:
|
11
|
+
Max: 179
|
12
|
+
|
13
|
+
# Offense count: 7
|
14
|
+
Style/Documentation:
|
15
|
+
Enabled: false
|
16
|
+
|
17
|
+
# Offense count: 2
|
18
|
+
# Configuration parameters: Exclude.
|
19
|
+
Style/FileName:
|
20
|
+
Enabled: false
|
21
|
+
|
22
|
+
# Offense count: 4
|
23
|
+
Style/RegexpLiteral:
|
24
|
+
MaxSlashes: 0
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/Guardfile
CHANGED
@@ -4,15 +4,15 @@
|
|
4
4
|
guard 'rspec' do
|
5
5
|
watch(%r{^spec/.+_spec\.rb$})
|
6
6
|
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
|
-
watch('spec/spec_helper.rb') {
|
7
|
+
watch('spec/spec_helper.rb') { 'spec' }
|
8
8
|
|
9
9
|
# Rails example
|
10
10
|
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
11
11
|
watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
12
12
|
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
13
|
-
watch(%r{^spec/support/(.+)\.rb$}) {
|
14
|
-
watch('config/routes.rb') {
|
15
|
-
watch('app/controllers/application_controller.rb') {
|
13
|
+
watch(%r{^spec/support/(.+)\.rb$}) { 'spec' }
|
14
|
+
watch('config/routes.rb') { 'spec/routing' }
|
15
|
+
watch('app/controllers/application_controller.rb') { 'spec/controllers' }
|
16
16
|
|
17
17
|
# Capybara features specs
|
18
18
|
watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
|
@@ -21,4 +21,3 @@ guard 'rspec' do
|
|
21
21
|
watch(%r{^spec/acceptance/(.+)\.feature$})
|
22
22
|
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
|
23
23
|
end
|
24
|
-
|
data/README.md
CHANGED
@@ -82,18 +82,18 @@ end
|
|
82
82
|
|
83
83
|
```ruby
|
84
84
|
# Serializer options can be specified on routes or namespaces.
|
85
|
-
namespace 'foo', :
|
85
|
+
namespace 'foo', serializer: BarSerializer do
|
86
86
|
get "/" do
|
87
87
|
# will use "bar" serializer
|
88
88
|
end
|
89
89
|
|
90
90
|
# Options specified on a route or namespace override those of the containing namespace.
|
91
|
-
get "/home", :
|
91
|
+
get "/home", serializer: HomeSerializer do
|
92
92
|
# will use "home" serializer
|
93
93
|
end
|
94
94
|
|
95
95
|
# All standard options for `ActiveModel::Serializers` are supported.
|
96
|
-
get "/fancy_homes", :
|
96
|
+
get "/fancy_homes", root: 'world', each_serializer: FancyHomesSerializer
|
97
97
|
...
|
98
98
|
end
|
99
99
|
end
|
@@ -112,11 +112,11 @@ end
|
|
112
112
|
### Support for `default_serializer_options`
|
113
113
|
|
114
114
|
```ruby
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
end
|
115
|
+
helpers do
|
116
|
+
def default_serializer_options
|
117
|
+
{only: params[:only], except: params[:except]}
|
119
118
|
end
|
119
|
+
end
|
120
120
|
```
|
121
121
|
|
122
122
|
### current_user
|
@@ -128,15 +128,15 @@ In Grape, you can get the same behavior by defining a `current_user`
|
|
128
128
|
helper method:
|
129
129
|
|
130
130
|
```ruby
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
end
|
131
|
+
helpers do
|
132
|
+
def current_user
|
133
|
+
@current_user ||= User.where(access_token: params[:token]).first
|
134
|
+
end
|
135
|
+
|
136
|
+
def authenticate!
|
137
|
+
error!('401 Unauthenticated', 401) unless current_user
|
139
138
|
end
|
139
|
+
end
|
140
140
|
```
|
141
141
|
|
142
142
|
Then, in your serializer, you could show or hide some elements
|
@@ -168,7 +168,7 @@ class API < Grape::API
|
|
168
168
|
end
|
169
169
|
end
|
170
170
|
|
171
|
-
API.new.get "/home" # => '{:
|
171
|
+
API.new.get "/home" # => '{ user: { first_name: "JR", last_name: "HE" } }'
|
172
172
|
```
|
173
173
|
|
174
174
|
|
@@ -180,6 +180,10 @@ Enjoy :)
|
|
180
180
|
|
181
181
|
## Changelog
|
182
182
|
|
183
|
+
#### Next
|
184
|
+
* Adds support for Grape 0.10.x
|
185
|
+
|
186
|
+
|
183
187
|
#### v1.2.1
|
184
188
|
* Adds support for active model serializer 0.9.x
|
185
189
|
|
data/Rakefile
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
|
-
require
|
2
|
+
require 'bundler/gem_tasks'
|
3
3
|
|
4
4
|
require 'rspec/core'
|
5
5
|
require 'rspec/core/rake_task'
|
@@ -8,4 +8,7 @@ RSpec::Core::RakeTask.new(:spec) do |spec|
|
|
8
8
|
spec.pattern = FileList['spec/**/*_spec.rb']
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
require 'rubocop/rake_task'
|
12
|
+
RuboCop::RakeTask.new(:rubocop)
|
13
|
+
|
14
|
+
task default: [:rubocop, :spec]
|
@@ -2,25 +2,26 @@
|
|
2
2
|
require File.expand_path('../lib/grape-active_model_serializers/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = [
|
6
|
-
gem.email = [
|
7
|
-
gem.summary =
|
8
|
-
gem.description =
|
9
|
-
gem.homepage =
|
5
|
+
gem.authors = ['Jonathan Richard Henry Evans']
|
6
|
+
gem.email = ['contact@jrhe.co.uk']
|
7
|
+
gem.summary = 'Use active_model_serializer in grape'
|
8
|
+
gem.description = 'Provides a Formatter for the Grape API DSL to emit objects serialized with active_model_serializers.'
|
9
|
+
gem.homepage = 'https://github.com/jrhe/grape-active_model_serializers'
|
10
10
|
|
11
|
-
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
12
12
|
gem.files = `git ls-files`.split("\n")
|
13
13
|
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
-
gem.name =
|
15
|
-
gem.require_paths = [
|
14
|
+
gem.name = 'grape-active_model_serializers'
|
15
|
+
gem.require_paths = ['lib']
|
16
16
|
gem.version = Grape::ActiveModelSerializers::VERSION
|
17
17
|
gem.licenses = ['MIT']
|
18
18
|
|
19
|
-
gem.add_dependency
|
20
|
-
gem.add_dependency
|
19
|
+
gem.add_dependency 'grape'
|
20
|
+
gem.add_dependency 'active_model_serializers', '>= 0.9.0'
|
21
21
|
|
22
|
-
gem.add_development_dependency
|
23
|
-
gem.add_development_dependency
|
24
|
-
gem.add_development_dependency
|
25
|
-
gem.add_development_dependency
|
22
|
+
gem.add_development_dependency 'rspec'
|
23
|
+
gem.add_development_dependency 'rack-test'
|
24
|
+
gem.add_development_dependency 'rake'
|
25
|
+
gem.add_development_dependency 'guard-rspec'
|
26
|
+
gem.add_development_dependency 'rubocop', '0.28.0'
|
26
27
|
end
|
@@ -9,11 +9,19 @@ module Grape
|
|
9
9
|
attr_accessor :controller_name
|
10
10
|
|
11
11
|
def namespace_options
|
12
|
-
|
12
|
+
if self.respond_to?(:inheritable_setting)
|
13
|
+
inheritable_setting.namespace
|
14
|
+
else
|
15
|
+
settings[:namespace] ? settings[:namespace].options : {}
|
16
|
+
end
|
13
17
|
end
|
14
18
|
|
15
19
|
def route_options
|
16
|
-
|
20
|
+
if self.respond_to?(:inheritable_setting)
|
21
|
+
inheritable_setting.route
|
22
|
+
else
|
23
|
+
options[:route_options]
|
24
|
+
end
|
17
25
|
end
|
18
26
|
|
19
27
|
def self.included(base)
|
@@ -27,26 +35,17 @@ module Grape
|
|
27
35
|
end
|
28
36
|
end
|
29
37
|
|
30
|
-
def render(resources, meta={})
|
31
|
-
|
38
|
+
def render(resources, meta = {})
|
39
|
+
env['ams_meta'] = meta
|
32
40
|
resources
|
33
41
|
end
|
34
42
|
|
35
|
-
def default_serializer_options
|
36
|
-
|
37
|
-
def url_options; end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def set_meta_and_meta_key(meta)
|
42
|
-
if meta.has_key?(:meta)
|
43
|
-
Formatter::ActiveModelSerializers.meta = meta[:meta]
|
44
|
-
if meta.has_key?(:meta_key)
|
45
|
-
Formatter::ActiveModelSerializers.meta_key = meta[:meta_key]
|
46
|
-
end
|
47
|
-
end
|
43
|
+
def default_serializer_options
|
48
44
|
end
|
49
45
|
|
46
|
+
def url_options
|
47
|
+
end
|
50
48
|
end
|
49
|
+
|
51
50
|
Endpoint.send(:include, EndpointExtension)
|
52
51
|
end
|
@@ -16,56 +16,40 @@ module Grape
|
|
16
16
|
endpoint = env['api.endpoint']
|
17
17
|
options = build_options_from_endpoint(endpoint)
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
19
|
+
serializer = options.fetch(:serializer, ActiveModel::Serializer.serializer_for(resource))
|
20
|
+
return nil unless serializer
|
21
|
+
|
22
|
+
options[:scope] = endpoint unless options.key?(:scope)
|
23
|
+
# ensure we have an root to fallback on
|
24
|
+
options[:resource_name] = default_root(endpoint) if resource.respond_to?(:to_ary)
|
25
|
+
serializer.new(resource, options.merge(other_options(env)))
|
25
26
|
end
|
26
27
|
|
27
|
-
def other_options
|
28
|
+
def other_options(env)
|
28
29
|
options = {}
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
end
|
35
|
-
meta_option = @meta_content_items[:meta]
|
36
|
-
@meta_content_items.delete(:meta)
|
37
|
-
options[key_option || :meta] = meta_option if meta_option
|
38
|
-
end
|
30
|
+
ams_meta = env['ams_meta'] || {}
|
31
|
+
meta = ams_meta.delete(:meta)
|
32
|
+
meta_key = ams_meta.delete(:meta_key)
|
33
|
+
options[:meta_key] = meta_key if meta && meta_key
|
34
|
+
options[meta_key || :meta] = meta if meta
|
39
35
|
options
|
40
36
|
end
|
41
37
|
|
42
|
-
def meta
|
43
|
-
@meta_content_items || {}
|
44
|
-
end
|
45
|
-
|
46
|
-
def meta=(meta_content)
|
47
|
-
@meta_content_items = { meta: meta_content } if meta_content
|
48
|
-
end
|
49
|
-
|
50
|
-
def meta_key
|
51
|
-
@meta_key || {}
|
52
|
-
end
|
53
|
-
|
54
|
-
def meta_key=(key)
|
55
|
-
@meta_key = { meta_key: key } if key
|
56
|
-
end
|
57
|
-
|
58
38
|
def build_options_from_endpoint(endpoint)
|
59
|
-
[endpoint.default_serializer_options || {}, endpoint.namespace_options, endpoint.route_options].reduce(:merge)
|
39
|
+
[endpoint.default_serializer_options || {}, endpoint.namespace_options, endpoint.route_options, endpoint.options, endpoint.options.fetch(:route_options)].reduce(:merge)
|
60
40
|
end
|
61
41
|
|
62
42
|
# array root is the innermost namespace name ('space') if there is one,
|
63
43
|
# otherwise the route name (e.g. get 'name')
|
64
44
|
def default_root(endpoint)
|
65
|
-
innermost_scope = endpoint.
|
66
|
-
|
67
|
-
|
68
|
-
|
45
|
+
innermost_scope = if endpoint.respond_to?(:namespace_stackable)
|
46
|
+
endpoint.namespace_stackable(:namespace).last
|
47
|
+
else
|
48
|
+
endpoint.settings.peek[:namespace]
|
49
|
+
end
|
50
|
+
|
51
|
+
if innermost_scope
|
52
|
+
innermost_scope.space
|
69
53
|
else
|
70
54
|
endpoint.options[:path][0].to_s.split('/')[-1]
|
71
55
|
end
|
@@ -20,43 +20,40 @@ describe '#render' do
|
|
20
20
|
|
21
21
|
context 'with meta key' do
|
22
22
|
it 'includes meta key and content' do
|
23
|
-
result = get_resource_with(
|
23
|
+
result = get_resource_with(meta: { total: 2 })
|
24
24
|
expect(result).to have_key('meta')
|
25
|
-
expect(result.fetch('meta')).to eq(
|
25
|
+
expect(result.fetch('meta')).to eq('total' => 2)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
29
|
context 'with a custom meta_key' do
|
30
|
-
|
31
30
|
it 'includes the custom meta key name' do
|
32
|
-
result = get_resource_with(
|
31
|
+
result = get_resource_with(meta: { total: 2 }, meta_key: :custom_key_name)
|
33
32
|
expect(result).to have_key('custom_key_name')
|
34
|
-
expect(result.fetch('custom_key_name')).to eq(
|
33
|
+
expect(result.fetch('custom_key_name')).to eq('total' => 2)
|
35
34
|
end
|
36
35
|
|
37
36
|
it 'ignores a lonely meta_key' do
|
38
|
-
result = get_resource_with(
|
37
|
+
result = get_resource_with(meta_key: :custom_key_name)
|
39
38
|
expect(result).not_to have_key('meta')
|
40
39
|
expect(result).not_to have_key('custom_key_name')
|
41
40
|
end
|
42
41
|
end
|
43
42
|
|
44
43
|
context 'junk keys' do
|
45
|
-
|
46
44
|
it 'ignores junk keys' do
|
47
|
-
result = get_resource_with(
|
45
|
+
result = get_resource_with(junk_key: { total: 2 })
|
48
46
|
expect(result).not_to have_key('junk_key')
|
49
47
|
end
|
50
48
|
|
51
49
|
it 'ignores empty meta_key' do
|
52
|
-
result = get_resource_with(
|
50
|
+
result = get_resource_with(meta: { total: 2 }, meta_key: nil)
|
53
51
|
expect(result).to have_key('meta')
|
54
52
|
end
|
55
53
|
|
56
54
|
it 'ignores empty meta' do
|
57
|
-
result = get_resource_with(
|
55
|
+
result = get_resource_with(meta: nil)
|
58
56
|
expect(result).not_to have_key('meta')
|
59
57
|
end
|
60
|
-
|
61
58
|
end
|
62
59
|
end
|
@@ -1,8 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'Grape::EndpointExtension' do
|
4
|
-
|
5
|
-
|
4
|
+
if Grape::Util.const_defined?('InheritableSetting')
|
5
|
+
subject { Grape::Endpoint.new(Grape::Util::InheritableSetting.new, path: '/', method: 'foo') }
|
6
|
+
else
|
7
|
+
subject { Grape::Endpoint.new({}, path: '/', method: 'foo') }
|
8
|
+
end
|
6
9
|
|
7
10
|
let(:serializer) { Grape::Formatter::ActiveModelSerializers }
|
8
11
|
|
@@ -16,24 +19,25 @@ describe 'Grape::EndpointExtension' do
|
|
16
19
|
|
17
20
|
let(:users) { [user, user] }
|
18
21
|
|
19
|
-
describe
|
22
|
+
describe '#render' do
|
23
|
+
before do
|
24
|
+
allow(subject).to receive(:env).and_return({})
|
25
|
+
end
|
20
26
|
it { should respond_to(:render) }
|
21
|
-
let
|
22
|
-
let
|
27
|
+
let(:meta_content) { { total: 2 } }
|
28
|
+
let(:meta_full) { { meta: meta_content } }
|
23
29
|
context 'supplying meta' do
|
24
30
|
it 'passes through the Resource and uses given meta settings' do
|
25
|
-
|
31
|
+
allow(subject).to receive(:env).and_return(meta: meta_full)
|
26
32
|
expect(subject.render(users, meta_full)).to eq(users)
|
27
33
|
end
|
28
34
|
end
|
29
35
|
context 'supplying meta and key' do
|
30
|
-
let
|
36
|
+
let(:meta_key) { { meta_key: :custom_key_name } }
|
31
37
|
it 'passes through the Resource and uses given meta settings' do
|
32
|
-
|
33
|
-
expect(serializer).to receive(:meta_key=).with(meta_key[:meta_key])
|
38
|
+
allow(subject).to receive(:env).and_return(meta: meta_full.merge(meta_key))
|
34
39
|
expect(subject.render(users, meta_full.merge(meta_key))).to eq(users)
|
35
40
|
end
|
36
41
|
end
|
37
42
|
end
|
38
|
-
|
39
43
|
end
|
@@ -3,38 +3,35 @@ require 'grape-active_model_serializers/formatter'
|
|
3
3
|
|
4
4
|
describe Grape::Formatter::ActiveModelSerializers do
|
5
5
|
subject { Grape::Formatter::ActiveModelSerializers }
|
6
|
-
it { should respond_to(:meta) }
|
7
|
-
it { should respond_to(:meta=) }
|
8
|
-
it { should respond_to(:meta_key) }
|
9
|
-
it { should respond_to(:meta_key=) }
|
10
|
-
|
11
|
-
context '#meta' do
|
12
|
-
it 'will silently accept falsy input but return empty Hash' do
|
13
|
-
subject.meta = nil
|
14
|
-
expect(subject.meta).to eq({})
|
15
|
-
end
|
16
6
|
|
17
|
-
|
18
|
-
|
19
|
-
expect(subject.meta).to eq({ meta: { total: 2 } })
|
20
|
-
end
|
21
|
-
end
|
7
|
+
describe 'serializer options from namespace' do
|
8
|
+
let(:app) { Class.new(Grape::API) }
|
22
9
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
10
|
+
before do
|
11
|
+
app.format :json
|
12
|
+
app.formatter :json, Grape::Formatter::ActiveModelSerializers
|
13
|
+
|
14
|
+
app.namespace('space') do |ns|
|
15
|
+
ns.get('/', root: false) do
|
16
|
+
{ user: { first_name: 'JR', last_name: 'HE' } }
|
17
|
+
end
|
18
|
+
end
|
27
19
|
end
|
28
20
|
|
29
|
-
it '
|
30
|
-
|
31
|
-
expect(subject.meta_key).to eq({ meta_key: :custom_key_name })
|
21
|
+
it 'should read serializer options like "root"' do
|
22
|
+
expect(described_class.build_options_from_endpoint(app.endpoints.first)).to include :root
|
32
23
|
end
|
33
24
|
end
|
34
25
|
|
35
26
|
describe '.fetch_serializer' do
|
36
27
|
let(:user) { User.new(first_name: 'John') }
|
37
|
-
|
28
|
+
|
29
|
+
if Grape::Util.const_defined?('InheritableSetting')
|
30
|
+
let(:endpoint) { Grape::Endpoint.new(Grape::Util::InheritableSetting.new, path: '/', method: 'foo', root: false) }
|
31
|
+
else
|
32
|
+
let(:endpoint) { Grape::Endpoint.new({}, path: '/', method: 'foo', root: false) }
|
33
|
+
end
|
34
|
+
|
38
35
|
let(:env) { { 'api.endpoint' => endpoint } }
|
39
36
|
|
40
37
|
before do
|
@@ -59,5 +56,9 @@ describe Grape::Formatter::ActiveModelSerializers do
|
|
59
56
|
expect(subject.instance_variable_get('@only')).to eq([:only])
|
60
57
|
expect(subject.instance_variable_get('@except')).to eq([:except])
|
61
58
|
end
|
59
|
+
|
60
|
+
it 'should read serializer options like "root"' do
|
61
|
+
expect(described_class.build_options_from_endpoint(endpoint).keys).to include :root
|
62
|
+
end
|
62
63
|
end
|
63
64
|
end
|
data/spec/old_grape_ams_spec.rb
CHANGED
@@ -3,90 +3,90 @@ require 'support/models/user'
|
|
3
3
|
require 'support/models/blog_post'
|
4
4
|
require 'support/serializers/user_serializer'
|
5
5
|
require 'support/serializers/blog_post_serializer'
|
6
|
-
require
|
6
|
+
require 'grape-active_model_serializers'
|
7
7
|
|
8
8
|
describe Grape::ActiveModelSerializers do
|
9
9
|
let(:app) { Class.new(Grape::API) }
|
10
|
+
subject { last_response.body }
|
10
11
|
|
11
12
|
before do
|
12
13
|
app.format :json
|
13
14
|
app.formatter :json, Grape::Formatter::ActiveModelSerializers
|
14
15
|
end
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
app.get("/home/users", :serializer => UserSerializer) do
|
17
|
+
it 'should respond with proper content-type' do
|
18
|
+
app.get('/home/users', serializer: UserSerializer) do
|
19
19
|
User.new
|
20
20
|
end
|
21
|
-
get(
|
22
|
-
last_response.headers[
|
21
|
+
get('/home/users')
|
22
|
+
expect(last_response.headers['Content-Type']).to eql 'application/json'
|
23
23
|
end
|
24
24
|
|
25
25
|
context 'serializer is set to nil' do
|
26
26
|
before do
|
27
|
-
app.get(
|
28
|
-
{user: {first_name:
|
27
|
+
app.get('/home', serializer: nil) do
|
28
|
+
{ user: { first_name: 'JR', last_name: 'HE' } }
|
29
29
|
end
|
30
30
|
end
|
31
|
-
it 'uses the built in grape serializer' do
|
32
|
-
get(
|
33
|
-
|
31
|
+
it 'uses the built in grape serializer' do
|
32
|
+
get('/home')
|
33
|
+
expect(subject).to eql "{\"user\":{\"first_name\":\"JR\",\"last_name\":\"HE\"}}"
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
37
|
context "serializer isn't set" do
|
38
38
|
before do
|
39
|
-
app.get(
|
40
|
-
User.new(
|
39
|
+
app.get('/home') do
|
40
|
+
User.new(first_name: 'JR', last_name: 'HE', email: 'contact@jrhe.co.uk')
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
44
|
it 'infers the serializer' do
|
45
|
-
get
|
46
|
-
|
45
|
+
get '/home'
|
46
|
+
expect(subject).to eql "{\"user\":{\"first_name\":\"JR\",\"last_name\":\"HE\"}}"
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
it
|
51
|
-
app.get(
|
52
|
-
user = User.new(
|
50
|
+
it 'serializes arrays of objects' do
|
51
|
+
app.get('/users') do
|
52
|
+
user = User.new(first_name: 'JR', last_name: 'HE', email: 'contact@jrhe.co.uk')
|
53
53
|
[user, user]
|
54
54
|
end
|
55
55
|
|
56
|
-
get
|
57
|
-
|
56
|
+
get '/users'
|
57
|
+
expect(subject).to eql "{\"users\":[{\"first_name\":\"JR\",\"last_name\":\"HE\"},{\"first_name\":\"JR\",\"last_name\":\"HE\"}]}"
|
58
58
|
end
|
59
59
|
|
60
|
-
context
|
60
|
+
context 'models with compound names' do
|
61
61
|
it "generates the proper 'root' node for individual objects" do
|
62
|
-
app.get(
|
63
|
-
BlogPost.new(
|
62
|
+
app.get('/home') do
|
63
|
+
BlogPost.new(title: 'Grape AM::S Rocks!', body: 'Really, it does.')
|
64
64
|
end
|
65
65
|
|
66
|
-
get
|
67
|
-
|
66
|
+
get '/home'
|
67
|
+
expect(subject).to eql "{\"blog_post\":{\"title\":\"Grape AM::S Rocks!\",\"body\":\"Really, it does.\"}}"
|
68
68
|
end
|
69
69
|
|
70
70
|
it "generates the proper 'root' node for serialized arrays" do
|
71
|
-
app.get(
|
72
|
-
blog_post = BlogPost.new(
|
71
|
+
app.get('/blog_posts') do
|
72
|
+
blog_post = BlogPost.new(title: 'Grape AM::S Rocks!', body: 'Really, it does.')
|
73
73
|
[blog_post, blog_post]
|
74
74
|
end
|
75
75
|
|
76
|
-
get
|
77
|
-
|
76
|
+
get '/blog_posts'
|
77
|
+
expect(subject).to eql "{\"blog_posts\":[{\"title\":\"Grape AM::S Rocks!\",\"body\":\"Really, it does.\"},{\"title\":\"Grape AM::S Rocks!\",\"body\":\"Really, it does.\"}]}"
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
-
it
|
82
|
-
app.namespace :admin, :
|
81
|
+
it 'uses namespace options when provided' do
|
82
|
+
app.namespace :admin, serializer: UserSerializer do
|
83
83
|
get('/jeff') do
|
84
84
|
User.new(first_name: 'Jeff')
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
|
-
get
|
89
|
-
|
88
|
+
get '/admin/jeff'
|
89
|
+
expect(subject).to eql "{\"user\":{\"first_name\":\"Jeff\",\"last_name\":null}}"
|
90
90
|
end
|
91
91
|
|
92
92
|
context 'route is in a namespace' do
|
@@ -98,8 +98,8 @@ describe Grape::ActiveModelSerializers do
|
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
101
|
-
get
|
102
|
-
|
101
|
+
get '/admin/jeff'
|
102
|
+
expect(subject).to eql "{\"admin\":[{\"first_name\":\"Jeff\",\"last_name\":null},{\"first_name\":\"Jeff\",\"last_name\":null}]}"
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
@@ -110,9 +110,8 @@ describe Grape::ActiveModelSerializers do
|
|
110
110
|
[user, user]
|
111
111
|
end
|
112
112
|
|
113
|
-
get
|
114
|
-
|
113
|
+
get '/people'
|
114
|
+
expect(subject).to eql "{\"people\":[{\"first_name\":\"Jeff\",\"last_name\":null},{\"first_name\":\"Jeff\",\"last_name\":null}]}"
|
115
115
|
end
|
116
116
|
end
|
117
117
|
end
|
118
|
-
|
data/spec/spec_helper.rb
CHANGED
@@ -4,9 +4,9 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
4
4
|
require 'bundler'
|
5
5
|
Bundler.setup :default, :test
|
6
6
|
|
7
|
-
require
|
7
|
+
require 'active_model_serializers'
|
8
8
|
require 'active_support/core_ext/hash/conversions'
|
9
|
-
require
|
9
|
+
require 'active_support/json'
|
10
10
|
require 'rspec'
|
11
11
|
require 'rack/test'
|
12
12
|
require 'grape-active_model_serializers'
|
@@ -15,4 +15,4 @@ RSpec.configure do |config|
|
|
15
15
|
config.include Rack::Test::Methods
|
16
16
|
end
|
17
17
|
|
18
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
18
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
data/spec/support/models/user.rb
CHANGED
@@ -2,8 +2,8 @@ class User
|
|
2
2
|
include ActiveModel::SerializerSupport
|
3
3
|
attr_accessor :first_name, :last_name, :password, :email
|
4
4
|
|
5
|
-
def initialize(params={})
|
6
|
-
params.each do |k,v|
|
5
|
+
def initialize(params = {})
|
6
|
+
params.each do |k, v|
|
7
7
|
instance_variable_set("@#{k}", v) unless v.nil?
|
8
8
|
end
|
9
9
|
end
|
metadata
CHANGED
@@ -1,99 +1,113 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grape-active_model_serializers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Richard Henry Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: grape
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0
|
19
|
+
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: active_model_serializers
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 0.9.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.9.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rack-test
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: guard-rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.28.0
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.28.0
|
97
111
|
description: Provides a Formatter for the Grape API DSL to emit objects serialized
|
98
112
|
with active_model_serializers.
|
99
113
|
email:
|
@@ -102,7 +116,10 @@ executables: []
|
|
102
116
|
extensions: []
|
103
117
|
extra_rdoc_files: []
|
104
118
|
files:
|
105
|
-
- .gitignore
|
119
|
+
- ".gitignore"
|
120
|
+
- ".rubocop.yml"
|
121
|
+
- ".rubocop_todo.yml"
|
122
|
+
- ".travis.yml"
|
106
123
|
- Gemfile
|
107
124
|
- Guardfile
|
108
125
|
- LICENSE.txt
|
@@ -135,17 +152,17 @@ require_paths:
|
|
135
152
|
- lib
|
136
153
|
required_ruby_version: !ruby/object:Gem::Requirement
|
137
154
|
requirements:
|
138
|
-
- -
|
155
|
+
- - ">="
|
139
156
|
- !ruby/object:Gem::Version
|
140
157
|
version: '0'
|
141
158
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
159
|
requirements:
|
143
|
-
- -
|
160
|
+
- - ">="
|
144
161
|
- !ruby/object:Gem::Version
|
145
162
|
version: '0'
|
146
163
|
requirements: []
|
147
164
|
rubyforge_project:
|
148
|
-
rubygems_version: 2.
|
165
|
+
rubygems_version: 2.4.5
|
149
166
|
signing_key:
|
150
167
|
specification_version: 4
|
151
168
|
summary: Use active_model_serializer in grape
|