Skip to content

Commit ceee711

Browse files
author
Michael Bleigh
committed
Adds #present to Endpoints to make entity usage dead simple.
1 parent 25a92c1 commit ceee711

File tree

7 files changed

+106
-34
lines changed

7 files changed

+106
-34
lines changed

Gemfile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
11
source 'http://rubygems.org'
22

33
gemspec
4+
5+
group :development, :test do
6+
gem 'pry'
7+
gem 'guard'
8+
gem 'guard-rspec'
9+
gem 'guard-bundler'
10+
gem 'rb-fsevent'
11+
gem 'growl'
12+
end

Gemfile.lock

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,62 +2,74 @@ PATH
22
remote: .
33
specs:
44
grape (0.1.5)
5-
hashie (~> 1.0)
5+
hashie (~> 1.2)
66
multi_json
77
multi_xml
88
rack
9-
rack-jsonp
109
rack-mount
1110

1211
GEM
1312
remote: http://rubygems.org/
1413
specs:
15-
diff-lcs (1.1.2)
16-
guard (0.6.2)
14+
coderay (1.0.0)
15+
diff-lcs (1.1.3)
16+
growl (1.0.3)
17+
guard (0.8.8)
1718
thor (~> 0.14.6)
1819
guard-bundler (0.1.3)
1920
bundler (>= 1.0.0)
2021
guard (>= 0.2.2)
21-
guard-rspec (0.4.2)
22-
guard (>= 0.4.0)
23-
hashie (1.1.0)
24-
json_pure (1.5.2)
22+
guard-rspec (0.5.1)
23+
guard (>= 0.8.4)
24+
hashie (1.2.0)
2525
maruku (0.6.0)
2626
syntax (>= 1.0.0)
27+
method_source (0.6.5)
28+
ruby_parser (>= 2.0.5)
2729
multi_json (1.0.3)
28-
multi_xml (0.3.0)
29-
rack (1.3.0)
30-
rack-jsonp (1.2.0)
31-
rack
30+
multi_xml (0.4.1)
31+
pry (0.9.6)
32+
coderay (>= 0.9.8)
33+
method_source (>= 0.6.5)
34+
ruby_parser (>= 2.0.5)
35+
slop (~> 2.1.0)
36+
rack (1.3.5)
3237
rack-mount (0.8.3)
3338
rack (>= 1.0.0)
34-
rack-test (0.6.0)
39+
rack-test (0.6.1)
3540
rack (>= 1.0)
36-
rake (0.9.2)
37-
rspec (2.6.0)
38-
rspec-core (~> 2.6.0)
39-
rspec-expectations (~> 2.6.0)
40-
rspec-mocks (~> 2.6.0)
41-
rspec-core (2.6.4)
42-
rspec-expectations (2.6.0)
41+
rake (0.9.2.2)
42+
rb-fsevent (0.4.3.1)
43+
rspec (2.7.0)
44+
rspec-core (~> 2.7.0)
45+
rspec-expectations (~> 2.7.0)
46+
rspec-mocks (~> 2.7.0)
47+
rspec-core (2.7.1)
48+
rspec-expectations (2.7.0)
4349
diff-lcs (~> 1.1.2)
44-
rspec-mocks (2.6.0)
50+
rspec-mocks (2.7.0)
51+
ruby_parser (2.3.1)
52+
sexp_processor (~> 3.0)
53+
sexp_processor (3.0.7)
54+
slop (2.1.0)
4555
syntax (1.0.0)
4656
thor (0.14.6)
47-
yard (0.7.1)
57+
yard (0.7.2)
4858

4959
PLATFORMS
5060
ruby
5161

5262
DEPENDENCIES
5363
bundler
5464
grape!
65+
growl
5566
guard
5667
guard-bundler
5768
guard-rspec
58-
json_pure
5969
maruku
70+
pry
6071
rack-test
6172
rake
62-
rspec (~> 2.6.0)
73+
rb-fsevent
74+
rspec (~> 2.7.0)
6375
yard

grape.gemspec

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,17 @@ Gem::Specification.new do |s|
1515

1616
s.add_runtime_dependency 'rack'
1717
s.add_runtime_dependency 'rack-mount'
18-
s.add_runtime_dependency 'rack-jsonp'
18+
# s.add_runtime_dependency 'rack-jsonp'
1919
s.add_runtime_dependency 'multi_json'
2020
s.add_runtime_dependency 'multi_xml'
21-
s.add_runtime_dependency 'hashie', '~> 1.0'
21+
s.add_runtime_dependency 'hashie', '~> 1.2'
2222

2323
s.add_development_dependency 'rake'
2424
s.add_development_dependency 'maruku'
2525
s.add_development_dependency 'yard'
2626
s.add_development_dependency 'rack-test'
27-
s.add_development_dependency 'rspec', '~> 2.6.0'
28-
s.add_development_dependency 'json_pure'
27+
s.add_development_dependency 'rspec', '~> 2.7.0'
2928
s.add_development_dependency 'bundler'
30-
s.add_development_dependency 'guard'
31-
s.add_development_dependency 'guard-rspec'
32-
s.add_development_dependency 'guard-bundler'
3329

3430
s.files = `git ls-files`.split("\n")
3531
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")

lib/grape.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ module Grape
88
autoload :Client, 'grape/client'
99
autoload :Route, 'grape/route'
1010
autoload :Entity, 'grape/entity'
11-
11+
1212
module Middleware
1313
autoload :Base, 'grape/middleware/base'
1414
autoload :Prefixer, 'grape/middleware/prefixer'
1515
autoload :Versioner, 'grape/middleware/versioner'
1616
autoload :Formatter, 'grape/middleware/formatter'
1717
autoload :Error, 'grape/middleware/error'
18-
18+
1919
module Auth
2020
autoload :OAuth2, 'grape/middleware/auth/oauth2'
2121
autoload :Basic, 'grape/middleware/auth/basic'

lib/grape/endpoint.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,33 @@ def body(value = nil)
9090
end
9191
end
9292

93+
# Allows you to make use of Grape Entities by setting
94+
# the response body to the serializable hash of the
95+
# entity provided in the `:with` option. This has the
96+
# added benefit of automatically passing along environment
97+
# and version information to the serialization, making it
98+
# very easy to do conditional exposures. See Entity docs
99+
# for more info.
100+
#
101+
# @example
102+
#
103+
# get '/users/:id' do
104+
# present User.find(params[:id]),
105+
# :with => API::Entities::User,
106+
# :admin => current_user.admin?
107+
# end
108+
def present(object, options = {})
109+
entity_class = options.delete(:with)
110+
111+
if entity_class
112+
embeds = {:env => env}
113+
embeds[:version] = env['api.version'] if env['api.version']
114+
body entity_class.represent(object, embeds.merge(options))
115+
else
116+
body object
117+
end
118+
end
119+
93120
def call(env)
94121
@env = env
95122
@header = {}

spec/grape/endpoint_spec.rb

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,35 @@ def memoized
120120
last_response.body.should == 'yo'
121121
end
122122

123+
describe '#present' do
124+
it 'should just set the object as the body if no options are provided' do
125+
subject.get '/example' do
126+
present({:abc => 'def'})
127+
body.should == {:abc => 'def'}
128+
end
129+
get '/example'
130+
end
131+
132+
it 'should call through to the provided entity class if one is given' do
133+
subject.get '/example' do
134+
entity_mock = Object.new
135+
entity_mock.should_receive(:represent)
136+
present Object.new, :with => entity_mock
137+
end
138+
get '/example'
139+
end
140+
141+
it 'should embed version and env when calling through to an entity' do
142+
subject.version 'v2'
143+
subject.get '/example' do
144+
entity_mock = Object.new
145+
entity_mock.should_receive(:represent).with(:version => 'v2', :env => env)
146+
present Object.new, :with => entity_mock
147+
end
148+
get '/example'
149+
end
150+
end
151+
123152
context 'filters' do
124153
describe 'before filters' do
125154
it 'should run the before filter if set' do

spec/spec_helper.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
require 'bundler'
88
Bundler.setup :default, :test
99

10-
require 'rspec'
1110
require 'rack/test'
1211

1312
require 'base64'

0 commit comments

Comments
 (0)