versioncake 2.5.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -14
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/Appraisals +12 -0
- data/CHANGELOG.md +18 -1
- data/CONTRIBUTING.md +2 -2
- data/Gemfile.lock +96 -44
- data/README.md +79 -29
- data/RELEASE.md +1 -1
- data/Rakefile +3 -7
- data/gemfiles/rails3.2.gemfile +2 -1
- data/gemfiles/rails3.2.gemfile.lock +34 -10
- data/gemfiles/rails4.0.gemfile +2 -1
- data/gemfiles/rails4.0.gemfile.lock +31 -7
- data/gemfiles/rails4.1.gemfile +1 -1
- data/gemfiles/rails4.1.gemfile.lock +28 -8
- data/gemfiles/rails4.2.gemfile +9 -0
- data/gemfiles/rails4.2.gemfile.lock +133 -0
- data/lib/generators/templates/versioncake.rb +40 -0
- data/lib/generators/versioncake/install_generator.rb +12 -0
- data/lib/versioncake.rb +24 -3
- data/lib/versioncake/configuration.rb +19 -2
- data/lib/versioncake/controller_additions.rb +35 -23
- data/lib/versioncake/engine.rb +7 -0
- data/lib/versioncake/exceptions.rb +4 -0
- data/lib/versioncake/rack/middleware.rb +20 -0
- data/lib/versioncake/strategies/extraction_strategy.rb +8 -3
- data/lib/versioncake/strategies/http_accept_parameter_strategy.rb +2 -2
- data/lib/versioncake/strategies/http_header_strategy.rb +2 -2
- data/lib/versioncake/strategies/path_parameter_strategy.rb +6 -2
- data/lib/versioncake/strategies/query_parameter_strategy.rb +2 -2
- data/lib/versioncake/strategies/request_parameter_strategy.rb +2 -2
- data/lib/versioncake/test_helpers.rb +14 -0
- data/lib/versioncake/version.rb +1 -1
- data/lib/versioncake/version_checker.rb +28 -0
- data/lib/versioncake/version_context.rb +20 -0
- data/lib/versioncake/version_context_service.rb +47 -0
- data/lib/versioncake/versioned_request.rb +22 -33
- data/lib/versioncake/versioned_resource.rb +14 -0
- data/lib/versioncake/view_additions.rb +7 -7
- data/{test → spec}/fixtures/partials/_versioned.erb +0 -0
- data/{test → spec}/fixtures/partials/_versioned.v1.erb +0 -0
- data/{test → spec}/fixtures/partials/_versioned.v2.erb +0 -0
- data/{test → spec}/fixtures/partials/_versioned.v3.erb +0 -0
- data/{test → spec}/fixtures/partials/another_versioned_partial.erb +0 -0
- data/{test → spec}/fixtures/partials/another_versioned_partial.v1.erb +0 -0
- data/{test → spec}/fixtures/templates/unversioned.html.erb +0 -0
- data/{test → spec}/fixtures/templates/v1_extension_scheme.v3.html.erb +0 -0
- data/{test → spec}/fixtures/templates/v1_extension_scheme.v6.json +0 -0
- data/{test → spec}/fixtures/templates/versioned.html.erb +0 -0
- data/{test → spec}/fixtures/templates/versioned.html.v1.erb +0 -0
- data/{test → spec}/fixtures/templates/versioned.html.v2.erb +0 -0
- data/{test → spec}/fixtures/templates/versioned.html.v3.erb +0 -0
- data/spec/fixtures/test_cases.yml +45 -0
- data/spec/integration/controller/renders_controller_spec.rb +73 -0
- data/spec/integration/controller/unversioned_controller_spec.rb +12 -0
- data/spec/integration/rack/middleware_regression_spec.rb +41 -0
- data/spec/integration/view/render_spec.rb +33 -0
- data/spec/integration/view/view_additions_spec.rb +51 -0
- data/spec/rails_helper.rb +41 -0
- data/spec/spec_helper.rb +25 -0
- data/spec/test_app/Rakefile +7 -0
- data/{test → spec/test_app}/app/controllers/renders_controller.rb +0 -0
- data/spec/test_app/app/controllers/unversioned_controller.rb +6 -0
- data/spec/test_app/app/views/renders/index.html.erb +1 -0
- data/{test → spec/test_app}/app/views/renders/index.html.v1.erb +0 -0
- data/{test → spec/test_app}/app/views/renders/index.html.v2.erb +0 -0
- data/spec/test_app/app/views/unversioned/index.html.erb +1 -0
- data/spec/test_app/config.ru +4 -0
- data/{test → spec/test_app}/config/application.rb +4 -6
- data/spec/test_app/config/boot.rb +5 -0
- data/spec/test_app/config/environment.rb +5 -0
- data/spec/test_app/config/initializers/versioncake.rb +45 -0
- data/spec/test_app/config/routes.rb +4 -0
- data/spec/test_app/script/rails +4 -0
- data/spec/unit/cli_spec.rb +36 -0
- data/spec/unit/configuration_spec.rb +61 -0
- data/spec/unit/strategies/extraction_strategy_spec.rb +71 -0
- data/spec/unit/strategies/http_accept_parameter_strategy_spec.rb +20 -0
- data/spec/unit/strategies/http_header_strategy_spec.rb +19 -0
- data/spec/unit/strategies/path_parameter_strategy_spec.rb +18 -0
- data/spec/unit/strategies/query_parameter_strategy_spec.rb +24 -0
- data/spec/unit/strategies/request_parameter_strategy_spec.rb +19 -0
- data/spec/unit/version_checker_spec.rb +60 -0
- data/spec/unit/version_context_service_spec.rb +84 -0
- data/spec/unit/version_context_spec.rb +46 -0
- data/spec/unit/versioned_request_spec.rb +35 -0
- data/spec/unit/versioned_resource_spec.rb +12 -0
- data/versioncake.gemspec +5 -2
- metadata +91 -70
- data/lib/versioncake/railtie.rb +0 -7
- data/test/app/views/renders/index.html.erb +0 -1
- data/test/config.ru +0 -0
- data/test/config/routes.rb +0 -3
- data/test/fixtures/test_cases.yml +0 -70
- data/test/functional/custom_strategy_controller_test.rb +0 -16
- data/test/functional/multiple_strategy_controller_test.rb +0 -24
- data/test/functional/renders_controller_test.rb +0 -71
- data/test/functional/strategy_controller_test.rb +0 -38
- data/test/script/rails +0 -0
- data/test/template/render_test.rb +0 -34
- data/test/test_helper.rb +0 -21
- data/test/unit/cli_test.rb +0 -48
- data/test/unit/configuration_test.rb +0 -45
- data/test/unit/strategies/extraction_strategy_test.rb +0 -70
- data/test/unit/strategies/http_accept_parameter_strategy_test.rb +0 -17
- data/test/unit/strategies/http_header_strategy_test.rb +0 -17
- data/test/unit/strategies/path_parameter_strategy_test.rb +0 -17
- data/test/unit/strategies/query_parameter_strategy_test.rb +0 -22
- data/test/unit/strategies/request_parameter_strategy_test.rb +0 -17
- data/test/unit/versioned_request_test.rb +0 -44
- data/test/unit/view_additions_test.rb +0 -35
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
NmJiMzc5YTk5MjcwODU2MTI0M2YzOGIxYTlhM2EwOWJjZDRjYzJiOWJjMDIz
|
10
|
-
MzJmOTA0NjFhMzlhM2I5ODMyMzE4YWYzNzc5ZTMzMWNkMGJjZDdjY2RjNzE4
|
11
|
-
ODc4NDE0MmU1ZmY2ZjM1ZDc1ZmJiMTg4ZWVhODViMGU3MjkxOGE=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
MWExYWQ1ZmI5ZThlN2Q4N2QwNTg5NDU4NzM5MzdlODQ5NzFiODczNjIxMTM1
|
14
|
-
MzUzYjQ1OGRlMTVhNDM1MmRlMWRmMDY4NzYyNTRjYzIxZDFjZTM1YTkyYjhm
|
15
|
-
ZTkxMWM2YTNkZmEyYTdhOTEzNzZlOTk5MjI3NDJlZjZmYjJjMmM=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b2f2076334af038794b17f3f6cae1e2c0fb8347d
|
4
|
+
data.tar.gz: 8f6fc9bf8359ba05b5e7f0620c280aa2ead43f47
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 12c7dbe459aeb4a7caff6599905bc52f90a40a32a0220492d133a89f394a2791cce96abcfad434fd32cc3ccd477d59bd95cf8a86432e1f469769f925bea85fc6
|
7
|
+
data.tar.gz: 4394f668996b75d5b5ae627c895eeb5a0a45c0f096b51f1370acfacd4a458b5e68c529ee5643bae0c64e4f900630a68bda728a2e59a61e8cca7e329a5ccd72d1
|
data/.rspec
ADDED
data/.travis.yml
CHANGED
@@ -4,12 +4,14 @@ rvm:
|
|
4
4
|
- 1.9.3
|
5
5
|
- 2.0.0
|
6
6
|
- 2.1.0
|
7
|
+
- 2.2.0
|
7
8
|
- ruby-head
|
8
9
|
|
9
10
|
gemfile:
|
10
11
|
- gemfiles/rails3.2.gemfile
|
11
12
|
- gemfiles/rails4.0.gemfile
|
12
13
|
- gemfiles/rails4.1.gemfile
|
14
|
+
- gemfiles/rails4.2.gemfile
|
13
15
|
|
14
16
|
matrix:
|
15
17
|
exclude:
|
@@ -17,6 +19,8 @@ matrix:
|
|
17
19
|
gemfile: gemfiles/rails4.0.gemfile
|
18
20
|
- rvm: 1.9.2
|
19
21
|
gemfile: gemfiles/rails4.1.gemfile
|
22
|
+
- rvm: 1.9.2
|
23
|
+
gemfile: gemfiles/rails4.2.gemfile
|
20
24
|
|
21
25
|
allow_failures:
|
22
26
|
- rvm: ruby-head
|
data/Appraisals
CHANGED
@@ -2,12 +2,18 @@ appraise "rails3.2" do
|
|
2
2
|
gem('actionpack', '~> 3.2.0')
|
3
3
|
gem('activesupport', '~> 3.2.0')
|
4
4
|
gem('railties', '~> 3.2.0')
|
5
|
+
# Rails 3.2 has test-unit as a dependency, but Ruby 2.2 removes
|
6
|
+
# it, so we need to now manually require it as a dependency
|
7
|
+
gem('test-unit', '~>3.0')
|
5
8
|
end
|
6
9
|
|
7
10
|
appraise "rails4.0" do
|
8
11
|
gem('actionpack', '~> 4.0.0')
|
9
12
|
gem('activesupport', '~> 4.0.0')
|
10
13
|
gem('railties', '~> 4.0.0')
|
14
|
+
# Rails 4.0 has test-unit as a dependency, but Ruby 2.2 removes
|
15
|
+
# it, so we need to now manually require it as a dependency
|
16
|
+
gem('test-unit', '~>3.0')
|
11
17
|
end
|
12
18
|
|
13
19
|
appraise "rails4.1" do
|
@@ -15,3 +21,9 @@ appraise "rails4.1" do
|
|
15
21
|
gem('activesupport', '~> 4.1.0')
|
16
22
|
gem('railties', '~> 4.1.0')
|
17
23
|
end
|
24
|
+
|
25
|
+
appraise "rails4.2" do
|
26
|
+
gem('actionpack', '~> 4.2.0')
|
27
|
+
gem('activesupport', '~> 4.2.0')
|
28
|
+
gem('railties', '~> 4.2.0')
|
29
|
+
end
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
## Unreleased Changes
|
2
2
|
|
3
|
-
[Full Changelog](https://github.com/bwillis/versioncake/compare/
|
3
|
+
[Full Changelog](https://github.com/bwillis/versioncake/compare/v3.0...master)
|
4
4
|
|
5
5
|
Bug Fixes:
|
6
6
|
|
@@ -14,6 +14,23 @@ Deprecations:
|
|
14
14
|
|
15
15
|
* None
|
16
16
|
|
17
|
+
## 3.0.0 (Aug 3, 2015)
|
18
|
+
|
19
|
+
Bug Fixes:
|
20
|
+
|
21
|
+
* When an invalid version is received an unsupported exception is raised (#34)
|
22
|
+
* Remove deprecated X- from header (breaking change)
|
23
|
+
* Remove warning in Rails 5 (#40) Thanks [Michael Elfassy](https://github.com/elfassy)!
|
24
|
+
|
25
|
+
Enhancements:
|
26
|
+
|
27
|
+
* Migrate from test-unit to rspec (#37)
|
28
|
+
* Rack based versioning middleware (#36) (breaking changes)
|
29
|
+
|
30
|
+
Deprecations:
|
31
|
+
|
32
|
+
* None
|
33
|
+
|
17
34
|
## 2.5.0 (Apr 18, 2014)
|
18
35
|
|
19
36
|
[Full Changelog](https://github.com/bwillis/versioncake/compare/v2.4...v2.5)
|
data/CONTRIBUTING.md
CHANGED
@@ -14,5 +14,5 @@ We really like when people not only discover something they want added/fixed/rem
|
|
14
14
|
|
15
15
|
Version Cake supports multiple versions of Rails with Appriasals. These will be automatically tested against several ruby versions on CI. If you need to debug a problem, or want to be dilegent and run all of these do the following:
|
16
16
|
|
17
|
-
* Install the gems for all supported Rails versions: `bundle exec rake appraisal
|
18
|
-
* Run all the tests for the supported Rails versions: `bundle exec rake appraisal
|
17
|
+
* Install the gems for all supported Rails versions: `bundle exec rake appraisal install`
|
18
|
+
* Run all the tests for the supported Rails versions: `bundle exec rake appraisal spec`
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
versioncake (
|
4
|
+
versioncake (3.0.0)
|
5
5
|
actionpack (>= 3.2)
|
6
6
|
activesupport (>= 3.2)
|
7
7
|
railties (>= 3.2)
|
@@ -10,61 +10,110 @@ PATH
|
|
10
10
|
GEM
|
11
11
|
remote: https://rubygems.org/
|
12
12
|
specs:
|
13
|
-
actionpack (4.
|
14
|
-
actionview (= 4.
|
15
|
-
activesupport (= 4.
|
16
|
-
rack (~> 1.
|
13
|
+
actionpack (4.2.3)
|
14
|
+
actionview (= 4.2.3)
|
15
|
+
activesupport (= 4.2.3)
|
16
|
+
rack (~> 1.6)
|
17
17
|
rack-test (~> 0.6.2)
|
18
|
-
|
19
|
-
|
18
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
19
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
20
|
+
actionview (4.2.3)
|
21
|
+
activesupport (= 4.2.3)
|
20
22
|
builder (~> 3.1)
|
21
23
|
erubis (~> 2.7.0)
|
22
|
-
|
23
|
-
|
24
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
25
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
26
|
+
activesupport (4.2.3)
|
27
|
+
i18n (~> 0.7)
|
24
28
|
json (~> 1.7, >= 1.7.7)
|
25
29
|
minitest (~> 5.1)
|
26
|
-
thread_safe (~> 0.
|
30
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
27
31
|
tzinfo (~> 1.1)
|
28
|
-
appraisal (0.
|
32
|
+
appraisal (2.0.2)
|
29
33
|
bundler
|
30
34
|
rake
|
35
|
+
thor (>= 0.14.0)
|
31
36
|
builder (3.2.2)
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
coveralls (0.8.2)
|
38
|
+
json (~> 1.8)
|
39
|
+
rest-client (>= 1.6.8, < 2)
|
40
|
+
simplecov (~> 0.10.0)
|
41
|
+
term-ansicolor (~> 1.3)
|
42
|
+
thor (~> 0.19.1)
|
43
|
+
diff-lcs (1.2.5)
|
44
|
+
docile (1.1.5)
|
45
|
+
domain_name (0.5.24)
|
46
|
+
unf (>= 0.0.5, < 1.0.0)
|
39
47
|
erubis (2.7.0)
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
48
|
+
http-cookie (1.0.2)
|
49
|
+
domain_name (~> 0.5)
|
50
|
+
i18n (0.7.0)
|
51
|
+
json (1.8.3)
|
52
|
+
loofah (2.0.2)
|
53
|
+
nokogiri (>= 1.5.9)
|
54
|
+
mime-types (2.6.1)
|
55
|
+
mini_portile (0.6.2)
|
56
|
+
minitest (5.7.0)
|
57
|
+
netrc (0.10.3)
|
58
|
+
nokogiri (1.6.6.2)
|
59
|
+
mini_portile (~> 0.6.0)
|
60
|
+
rack (1.6.4)
|
61
|
+
rack-test (0.6.3)
|
50
62
|
rack (>= 1.0)
|
51
|
-
|
52
|
-
|
53
|
-
|
63
|
+
rails-deprecated_sanitizer (1.0.3)
|
64
|
+
activesupport (>= 4.2.0.alpha)
|
65
|
+
rails-dom-testing (1.0.6)
|
66
|
+
activesupport (>= 4.2.0.beta, < 5.0)
|
67
|
+
nokogiri (~> 1.6.0)
|
68
|
+
rails-deprecated_sanitizer (>= 1.0.1)
|
69
|
+
rails-html-sanitizer (1.0.2)
|
70
|
+
loofah (~> 2.0)
|
71
|
+
railties (4.2.3)
|
72
|
+
actionpack (= 4.2.3)
|
73
|
+
activesupport (= 4.2.3)
|
54
74
|
rake (>= 0.8.7)
|
55
75
|
thor (>= 0.18.1, < 2.0)
|
56
|
-
rake (10.
|
57
|
-
rest-client (1.
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
76
|
+
rake (10.4.2)
|
77
|
+
rest-client (1.8.0)
|
78
|
+
http-cookie (>= 1.0.2, < 2.0)
|
79
|
+
mime-types (>= 1.16, < 3.0)
|
80
|
+
netrc (~> 0.7)
|
81
|
+
rspec (3.3.0)
|
82
|
+
rspec-core (~> 3.3.0)
|
83
|
+
rspec-expectations (~> 3.3.0)
|
84
|
+
rspec-mocks (~> 3.3.0)
|
85
|
+
rspec-core (3.3.2)
|
86
|
+
rspec-support (~> 3.3.0)
|
87
|
+
rspec-expectations (3.3.1)
|
88
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
89
|
+
rspec-support (~> 3.3.0)
|
90
|
+
rspec-mocks (3.3.2)
|
91
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
92
|
+
rspec-support (~> 3.3.0)
|
93
|
+
rspec-rails (3.3.3)
|
94
|
+
actionpack (>= 3.0, < 4.3)
|
95
|
+
activesupport (>= 3.0, < 4.3)
|
96
|
+
railties (>= 3.0, < 4.3)
|
97
|
+
rspec-core (~> 3.3.0)
|
98
|
+
rspec-expectations (~> 3.3.0)
|
99
|
+
rspec-mocks (~> 3.3.0)
|
100
|
+
rspec-support (~> 3.3.0)
|
101
|
+
rspec-support (3.3.0)
|
102
|
+
simplecov (0.10.0)
|
103
|
+
docile (~> 1.1.0)
|
104
|
+
json (~> 1.8)
|
105
|
+
simplecov-html (~> 0.10.0)
|
106
|
+
simplecov-html (0.10.0)
|
107
|
+
term-ansicolor (1.3.2)
|
108
|
+
tins (~> 1.0)
|
109
|
+
thor (0.19.1)
|
110
|
+
thread_safe (0.3.5)
|
111
|
+
tins (1.5.4)
|
112
|
+
tzinfo (1.2.2)
|
67
113
|
thread_safe (~> 0.1)
|
114
|
+
unf (0.1.4)
|
115
|
+
unf_ext
|
116
|
+
unf_ext (0.0.7.1)
|
68
117
|
|
69
118
|
PLATFORMS
|
70
119
|
ruby
|
@@ -72,7 +121,10 @@ PLATFORMS
|
|
72
121
|
DEPENDENCIES
|
73
122
|
appraisal
|
74
123
|
coveralls
|
75
|
-
mocha
|
76
124
|
rake
|
77
|
-
|
125
|
+
rspec
|
126
|
+
rspec-rails
|
78
127
|
versioncake!
|
128
|
+
|
129
|
+
BUNDLED WITH
|
130
|
+
1.10.6
|
data/README.md
CHANGED
@@ -29,18 +29,39 @@ Check out https://github.com/bwillis/350-rest-api-versioning for a comparison of
|
|
29
29
|
|
30
30
|
```
|
31
31
|
gem install versioncake
|
32
|
+
rails g versioncake:install
|
32
33
|
```
|
33
34
|
|
34
35
|
### Requirements
|
35
36
|
|
36
|
-
| Version | Rails 3.2 Support? | Rails 4 Support? | Rails 4.1 Support? | [Rails API](https://github.com/rails-api/rails-api) 0.2 Support? |
|
37
|
-
|
|
38
|
-
| [1.0](CHANGELOG.md#100-march-14-2013) | Yes | No | No | No |
|
39
|
-
| [1.1](CHANGELOG.md#110-may-18-2013) | Yes | No | No | No |
|
40
|
-
| [1.2](CHANGELOG.md#120-may-26-2013) | Yes | Yes | No | No |
|
41
|
-
| [1.3](CHANGELOG.md#130-sept-26-2013) | Yes | Yes | No | No |
|
42
|
-
| [>2.0](CHANGELOG.md#200-feb-6-2014) | Yes | Yes | Yes | No |
|
43
|
-
| [>2.4](CHANGELOG.md#200-feb-6-2014) | Yes | Yes | Yes | Yes |
|
37
|
+
| Version | Rails 3.2 Support? | Rails 4 Support? | Rails >4.1 Support? | Rails >5 Support? | [Rails API](https://github.com/rails-api/rails-api) 0.2 Support? |
|
38
|
+
| -------:|:---------:| -------:| -------:| -------:| -------:|
|
39
|
+
| [1.0](CHANGELOG.md#100-march-14-2013) | Yes | No | No | No | No |
|
40
|
+
| [1.1](CHANGELOG.md#110-may-18-2013) | Yes | No | No | No | No |
|
41
|
+
| [1.2](CHANGELOG.md#120-may-26-2013) | Yes | Yes | No | No | No |
|
42
|
+
| [1.3](CHANGELOG.md#130-sept-26-2013) | Yes | Yes | No | No | No |
|
43
|
+
| [>2.0](CHANGELOG.md#200-feb-6-2014) | Yes | Yes | Yes | No | No |
|
44
|
+
| [>2.4](CHANGELOG.md#200-feb-6-2014) | Yes | Yes | Yes | No | Yes |
|
45
|
+
| [>3.0](CHANGELOG.md) | Yes | Yes | Yes | Yes | Yes |
|
46
|
+
|
47
|
+
## Upgrade v2.0 -> v3.0
|
48
|
+
|
49
|
+
### Accept header name changes
|
50
|
+
|
51
|
+
The default accept header was changed from 'X-API-Version' to 'API-Version'. If you require the 'X-' or some other variant, you can specify a custom strategy as outlined in Extraction Strategy section below.
|
52
|
+
|
53
|
+
### Configuration changes
|
54
|
+
|
55
|
+
Configuration is now done with an initializer-you can generate a default one with `rails g versioncake:install` and then modify the generated file to match your configuration.
|
56
|
+
|
57
|
+
### Configuration changes
|
58
|
+
|
59
|
+
The configuration options for Version Cake have changed:
|
60
|
+
|
61
|
+
| Old Name | New Name |
|
62
|
+
| -------------------------------------------- | ---------------------- |
|
63
|
+
| config.versioncake.supported_version_numbers | config.resources |
|
64
|
+
| config.versioncake.default_version | config.missing_version |
|
44
65
|
|
45
66
|
## Upgrade v1.* -> v2.0
|
46
67
|
|
@@ -70,8 +91,13 @@ In this simple example we will outline the code that is introduced to support a
|
|
70
91
|
|
71
92
|
### config/application.rb
|
72
93
|
```ruby
|
73
|
-
|
74
|
-
config.
|
94
|
+
VersionCake.setup do |config|
|
95
|
+
config.resources do |r|
|
96
|
+
r.resource %r{.*}, [], [], (1..4)
|
97
|
+
end
|
98
|
+
config.extraction_strategy = :query_parameter # for simplicity
|
99
|
+
config.missing_version = 4
|
100
|
+
end
|
75
101
|
```
|
76
102
|
|
77
103
|
Often times with APIs, depending upon the version, different logic needs to be applied. With the following controller code, the initial value of @posts includes all Post entries.
|
@@ -87,7 +113,7 @@ class PostsController < ApplicationController
|
|
87
113
|
@posts = Post.scoped
|
88
114
|
|
89
115
|
# version 3 or greated supports embedding post comments
|
90
|
-
if
|
116
|
+
if request_version >= 3
|
91
117
|
@posts = @posts.includes(:comments)
|
92
118
|
end
|
93
119
|
end
|
@@ -160,7 +186,7 @@ For a given request, if we specify the version number, and that version of the v
|
|
160
186
|
```
|
161
187
|
|
162
188
|
|
163
|
-
When no version is specified, the
|
189
|
+
When no version is specified, the configured `missing_version` will be used to render a view. In this case, views/posts/index.json.v4.jbuilder.
|
164
190
|
|
165
191
|
#### http://localhost:3000/posts.json
|
166
192
|
```javascript
|
@@ -195,20 +221,28 @@ When no version is specified, the latest version of the view is rendered. In th
|
|
195
221
|
## How to use
|
196
222
|
|
197
223
|
### Configuration
|
198
|
-
The configuration
|
224
|
+
The configuration lives in `config/initializers/versioncake.rb`.
|
199
225
|
|
200
|
-
####
|
201
|
-
|
226
|
+
#### Versioned Resources
|
227
|
+
Each individual resource uri can be identified by a regular expression. For each one it can be customized to have obsolete, deprecated, supported versions.
|
202
228
|
|
203
229
|
```ruby
|
204
|
-
config.
|
230
|
+
config.resources do |r|
|
231
|
+
# r.resource uri_regex, obsolete, deprecated, supported
|
232
|
+
|
233
|
+
# version 2 and 3 are still supported on users resource
|
234
|
+
r.resource %r{/users}, [1], [2,3], [4]
|
235
|
+
|
236
|
+
# all other resources only allow v4
|
237
|
+
r.resource %r{.*}, [1,2,3], [], [4]
|
238
|
+
end
|
205
239
|
```
|
206
240
|
|
207
241
|
#### Extraction Strategy
|
208
242
|
|
209
|
-
You can also define the way to extract the version. The `
|
243
|
+
You can also define the way to extract the version. The `extraction_strategy` allows you to set one of the default strategies or provide a proc to set your own. You can also pass it a prioritized array of the strategies.
|
210
244
|
```ruby
|
211
|
-
config.
|
245
|
+
config.extraction_strategy = :query_parameter # [:http_header, :http_accept_parameter]
|
212
246
|
```
|
213
247
|
These are the available strategies:
|
214
248
|
|
@@ -216,8 +250,8 @@ Strategy | Description | Example
|
|
216
250
|
--- | --- | ---
|
217
251
|
:query_parameter | version in the url query parameter, for testing or to override for special case | `http://localhost:3000/posts.json?api_version=1` (This is the default.)
|
218
252
|
:path_parameter | version in the url path parameter | `api/v:api_version/`
|
219
|
-
request_parameter | version that is sent in the body of the request | Good for testing.
|
220
|
-
:http_header | Api version HTTP header | `
|
253
|
+
:request_parameter | version that is sent in the body of the request | Good for testing.
|
254
|
+
:http_header | Api version HTTP header | `API-Version: 1`
|
221
255
|
:http_accept_parameter | HTTP Accept header | `Accept: application/xml; version=1` [why do this?](http://blog.steveklabnik.com/posts/2011-07-03-nobody-understands-rest-or-http#i_want_my_api_to_be_versioned)
|
222
256
|
custom | takes the request object and must return an integer | lambda {|request| request.headers["HTTP_X_MY_VERSION"].to_i } or class ExtractorStrategy; def execute(request);end;end
|
223
257
|
|
@@ -236,14 +270,20 @@ end
|
|
236
270
|
|
237
271
|
When no version is supplied by a client, the version rendered will be the latest version by default. If you want to override this to another version, set the following property:
|
238
272
|
```ruby
|
239
|
-
config.
|
273
|
+
config.missing_version = 4
|
240
274
|
```
|
241
275
|
|
242
276
|
#### Version String
|
243
277
|
|
244
278
|
The extraction strategies use a default string key of `api_version`, but that can be changed:
|
245
279
|
```ruby
|
246
|
-
config.
|
280
|
+
config.version_key = "special_version_parameter_name"
|
281
|
+
```
|
282
|
+
|
283
|
+
#### Version String
|
284
|
+
If you do not wish to use the magic mapping of the version number to templates it can be disabled:
|
285
|
+
```ruby
|
286
|
+
config.rails_view_versioning = false
|
247
287
|
```
|
248
288
|
|
249
289
|
### Version your views
|
@@ -273,7 +313,7 @@ def index
|
|
273
313
|
@posts = Post.scoped
|
274
314
|
|
275
315
|
# version 3 or greated supports embedding post comments
|
276
|
-
if
|
316
|
+
if request_version >= 3
|
277
317
|
@posts = @posts.includes(:comments)
|
278
318
|
end
|
279
319
|
end
|
@@ -282,9 +322,19 @@ end
|
|
282
322
|
|
283
323
|
When a client makes a request it will automatically receive the latest supported version of the view. The client can also request for a specific version by one of the strategies configured by ``view_version_extraction_strategy``.
|
284
324
|
|
285
|
-
###
|
325
|
+
### Raised exceptions
|
326
|
+
|
327
|
+
These are the types of exceptions VersionCake will raise:
|
328
|
+
|
329
|
+
|Exception type|Description|
|
330
|
+
|--------------|-----------|
|
331
|
+
|VersionCake::UnsupportedVersionError| The version is invalid, too high or too low for the resource.|
|
332
|
+
|VersionCake::ObsoleteVersionError|The version is obsolete for the resource.|
|
333
|
+
|VersionCake::MissingVersionError|If no `config.missing_version` is specified, this will be raised when no version is in the request.|
|
334
|
+
|
335
|
+
### Handling Exceptions
|
286
336
|
|
287
|
-
|
337
|
+
Handling exceptions can simply be done by using Rails `rescue_from` to return app specific messages to the client.
|
288
338
|
|
289
339
|
```ruby
|
290
340
|
class ApplicationController < ActionController::Base
|
@@ -296,7 +346,7 @@ class ApplicationController < ActionController::Base
|
|
296
346
|
private
|
297
347
|
|
298
348
|
def render_unsupported_version
|
299
|
-
headers['
|
349
|
+
headers['API-Version-Supported'] = 'false'
|
300
350
|
respond_to do |format|
|
301
351
|
format.json { render json: {message: "You requested an unsupported version (#{requested_version})"}, status: :unprocessable_entity }
|
302
352
|
end
|
@@ -317,7 +367,7 @@ Testing can be painful but here are some easy ways to test different versions of
|
|
317
367
|
Allowing more extraction strategies during testing can be helpful when needing to override the version.
|
318
368
|
```ruby
|
319
369
|
# config/environments/test.rb
|
320
|
-
config.
|
370
|
+
config.extraction_strategy = [:query_parameter, :request_parameter, :http_header, :http_accept_parameter]
|
321
371
|
```
|
322
372
|
|
323
373
|
### Testing a specific version
|
@@ -325,7 +375,7 @@ config.versioncake.extraction_strategy = [:query_parameter, :request_parameter,
|
|
325
375
|
One way to test a specific version for would be to stub the requested version in the before block:
|
326
376
|
```ruby
|
327
377
|
before do
|
328
|
-
@controller.stubs(:
|
378
|
+
@controller.stubs(:request_version).returns(3)
|
329
379
|
end
|
330
380
|
```
|
331
381
|
|
@@ -343,7 +393,7 @@ end
|
|
343
393
|
You can iterate over all of the supported version numbers by accessing the ```AppName::Application.config.versioncake.supported_version_numbers```.
|
344
394
|
|
345
395
|
```ruby
|
346
|
-
|
396
|
+
VersionCake.config.resources.first.supported_versions.each do |supported_version|
|
347
397
|
before do
|
348
398
|
@controller.stubs(:requested_version).returns(supported_version)
|
349
399
|
end
|