Skip to content

Commit

Permalink
API version can now take an array of versions.
Browse files Browse the repository at this point in the history
  • Loading branch information
dblock committed Jul 19, 2013
1 parent f12fac7 commit 2be499c
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 6 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
Next Release
============

#### Features

* Grape is no longer tested against Ruby 1.8.7.
* [#442](https://github.com/intridea/grape/issues/442): Enable incrementally building on top of a previous API version - [@dblock](https://github.com/dblock).
* [#442](https://github.com/intridea/grape/issues/442): API `version` can now take an array of multiple versions - [@dblock](https://github.com/dblock).

* Your contribution here.

#### Fixes

* [#428](https://github.com/intridea/grape/issues/428): Removes memoization from `Grape::Request` params to prevent middleware from freezing parameter values before `Formatter` can get them - [@mbleigh](https://github.com/mbleigh).


0.5.0 (6/14/2013)
=================

Expand Down
2 changes: 1 addition & 1 deletion lib/grape/endpoint.rb
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@ def build_middleware

if settings[:version]
b.use Grape::Middleware::Versioner.using(settings[:version_options][:using]), {
:versions => settings[:version],
:versions => settings[:version] ? settings[:version].flatten : nil,
:version_options => settings[:version_options],
:prefix => settings[:root_prefix]
}
Expand Down
4 changes: 2 additions & 2 deletions lib/grape/middleware/versioner/header.rb
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,8 @@ def strict?
# of routes (see [Rack::Mount](https://github.com/josh/rack-mount) for more information). To prevent
# this behavior, and not add the `X-Cascade` header, one can set the `:cascade` option to `false`.
def cascade?
options[:version_options] && options[:version_options].has_key?(:cascade) ?
!! options[:version_options][:cascade] :
options[:version_options] && options[:version_options].has_key?(:cascade) ?
!! options[:version_options][:cascade] :
true
end

Expand Down
10 changes: 9 additions & 1 deletion spec/grape/api_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,15 @@ def subject.enable_root_route!
subject.version 'v1', :using => :header, :vendor => 'test'
subject.enable_root_route!

versioned_get "/", "v1", :using => :header
versioned_get "/", "v1", :using => :header, :vendor => 'test'
end

it 'header versioned APIs with multiple headers' do
subject.version ['v1', 'v2'], :using => :header, :vendor => 'test'
subject.enable_root_route!

versioned_get "/", "v1", :using => :header, :vendor => 'test'
versioned_get "/", "v2", :using => :header, :vendor => 'test'
end

it 'param versioned APIs' do
Expand Down
25 changes: 25 additions & 0 deletions spec/grape/middleware/versioner/header_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -274,4 +274,29 @@
subject.call('HTTP_ACCEPT' => 'application/vnd.vendor-v1+json').first.should == 200
end
end

context 'when multiple versions are specified' do
before do
@options[:versions] = ['v1', 'v2']
end

it 'succeeds with v1' do
subject.call('HTTP_ACCEPT' => 'application/vnd.vendor-v1+json').first.should == 200
end

it 'succeeds with v2' do
subject.call('HTTP_ACCEPT' => 'application/vnd.vendor-v2+json').first.should == 200
end

it 'fails with another version' do
expect {
subject.call('HTTP_ACCEPT' => 'application/vnd.vendor-v3+json')
}.to throw_symbol(
:error,
:status => 406,
:headers => {'X-Cascade' => 'pass'},
:message => 'API vendor or version not found.'
)
end
end
end
7 changes: 5 additions & 2 deletions spec/support/versioned_helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@ def versioned_headers(options)
{} # no-op
when :header
{
'HTTP_ACCEPT' => "application/vnd.#{options[:vendor]}-#{options[:version]}+#{options[:format]}"
'HTTP_ACCEPT' => [
"application/vnd.#{options[:vendor]}-#{options[:version]}",
options[:format]
].compact.join("+")
}
when :accept_version_header
{
Expand All @@ -41,7 +44,7 @@ def versioned_get(path, version_name, version_options = {})
headers = versioned_headers(version_options.merge(:version => version_name))
params = {}
if version_options[:using] == :param
params = { version_options[:parameter] => version_name }
params = { version_options[:parameter] => version_name }
end
get path, params, headers
end
Expand Down

0 comments on commit 2be499c

Please sign in to comment.