versioncake 1.3.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +5 -0
  3. data/Appraisals +6 -0
  4. data/CHANGELOG.md +12 -0
  5. data/Gemfile.lock +4 -4
  6. data/README.md +65 -30
  7. data/RELEASE.md +1 -1
  8. data/bin/versioncake +9 -0
  9. data/gemfiles/rails3.2.gemfile.lock +6 -2
  10. data/gemfiles/rails4.0.gemfile.lock +1 -1
  11. data/gemfiles/rails4.1.gemfile +9 -0
  12. data/gemfiles/rails4.1.gemfile.lock +87 -0
  13. data/lib/versioncake/cli.rb +60 -0
  14. data/lib/versioncake/configuration.rb +21 -21
  15. data/lib/versioncake/railtie.rb +3 -19
  16. data/lib/versioncake/strategies/extraction_strategy.rb +5 -5
  17. data/lib/versioncake/strategies/http_accept_parameter_strategy.rb +1 -1
  18. data/lib/versioncake/strategies/http_header_strategy.rb +2 -2
  19. data/lib/versioncake/strategies/path_parameter_strategy.rb +11 -0
  20. data/lib/versioncake/strategies/query_parameter_strategy.rb +2 -2
  21. data/lib/versioncake/strategies/request_parameter_strategy.rb +2 -2
  22. data/lib/versioncake/version.rb +1 -1
  23. data/lib/versioncake/versioned_request.rb +10 -6
  24. data/lib/versioncake/view_additions.rb +67 -10
  25. data/lib/versioncake.rb +2 -0
  26. data/test/{fixtures/templates/versioned.v1.html.erb → app/views/renders/index.html.v1.erb} +0 -0
  27. data/test/{fixtures/templates/versioned.v2.html.erb → app/views/renders/index.html.v2.erb} +0 -0
  28. data/test/config/application.rb +3 -2
  29. data/test/fixtures/templates/v1_extension_scheme.v3.html.erb +7 -0
  30. data/test/fixtures/templates/v1_extension_scheme.v6.json +4 -0
  31. data/test/fixtures/templates/versioned.html.v1.erb +1 -0
  32. data/test/fixtures/templates/versioned.html.v2.erb +1 -0
  33. data/test/fixtures/templates/{versioned.v3.html.erb → versioned.html.v3.erb} +0 -0
  34. data/test/fixtures/test_cases.yml +70 -0
  35. data/test/functional/custom_strategy_controller_test.rb +16 -0
  36. data/test/functional/multiple_strategy_controller_test.rb +24 -0
  37. data/test/functional/renders_controller_test.rb +14 -168
  38. data/test/functional/strategy_controller_test.rb +37 -0
  39. data/test/unit/cli_test.rb +48 -0
  40. data/test/unit/configuration_test.rb +15 -19
  41. data/test/unit/strategies/extraction_strategy_test.rb +2 -2
  42. data/test/unit/strategies/path_parameter_strategy_test.rb +17 -0
  43. data/test/unit/strategies/query_parameter_strategy_test.rb +5 -0
  44. data/test/unit/versioned_request_test.rb +1 -1
  45. data/test/unit/view_additions_test.rb +35 -0
  46. data/versioncake.gemspec +1 -0
  47. metadata +25 -9
  48. data/test/app/views/renders/index.v1.html.erb +0 -1
  49. data/test/app/views/renders/index.v2.html.erb +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d61aa19d50e26e583ce2eea0fca2d2e12cc0337c
4
- data.tar.gz: 024e457348b85cb229be55db1319944da4ce2a9f
3
+ metadata.gz: 8fbcc57e744a93f5f6de3774d76ac1243a7fa412
4
+ data.tar.gz: a928bce4aaf76fa1bfd130773b1e7f8bd4b85727
5
5
  SHA512:
6
- metadata.gz: edc4648ae169a2c6c61ff8def796b3bf5c5abaf568beb1d80d187f96d2a3ba870ed56ad2ec9c5405cb5865c46bdd97651916b08c57a5f4ede932019d0817ad57
7
- data.tar.gz: a8610d6612b85369d1338e27614369d55494d63277ea218b3500457458bc6dcd023c8ffdc27f386356a7446ba6e0d8d5f31f637dc93a71cbbbae3d2fa659b2cb
6
+ metadata.gz: 9e1bd9d2d1206d7ac5f036ff4b58ac6ef5bc218eb86a11319efa7a93dcb341a8ce1760740be620fbef9ca0b205dd067e414ae0f06c22c28b38851a746ad8b661
7
+ data.tar.gz: 77692e1b0088daa052cbca53d4da0f35acbac818d7e7e0277df12111eeafb6f0592f05e10faccb8ba6dcd78ecd261a7e45dea494c101eb7d53abe3edb999fbb7
data/.travis.yml CHANGED
@@ -2,16 +2,21 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.2
4
4
  - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.0
5
7
  - ruby-head
6
8
 
7
9
  gemfile:
8
10
  - gemfiles/rails3.2.gemfile
9
11
  - gemfiles/rails4.0.gemfile
12
+ - gemfiles/rails4.1.gemfile
10
13
 
11
14
  matrix:
12
15
  exclude:
13
16
  - rvm: 1.9.2
14
17
  gemfile: gemfiles/rails4.0.gemfile
18
+ - rvm: 1.9.2
19
+ gemfile: gemfiles/rails4.1.gemfile
15
20
 
16
21
  allow_failures:
17
22
  - rvm: ruby-head
data/Appraisals CHANGED
@@ -9,3 +9,9 @@ appraise "rails4.0" do
9
9
  gem('activesupport', '~> 4.0.0')
10
10
  gem('railties', '~> 4.0.0')
11
11
  end
12
+
13
+ appraise "rails4.1" do
14
+ gem('actionpack', '~> 4.1.0.beta1')
15
+ gem('activesupport', '~> 4.1.0.beta1')
16
+ gem('railties', '~> 4.1.0.beta1')
17
+ end
data/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  [Full Changelog](https://github.com/bwillis/versioncake/compare/v1.3...master)
4
4
 
5
+ Bug Fixes:
6
+
7
+ * Adjusting view details priorities so that RABL templates that do not have a format are not prioritized over templates that do have a format (issues #14). This is going to go into v2 as it is a breaking change.
8
+ * Looking up a versioned or unversioned layout template was not working (issue #22). The change related to issue #14 resulted in the template format not being identified properly. Monkey patched another Rails (for old and new Rails) method to fix this issue.
9
+
10
+ Enhancements:
11
+
12
+ * New path strategy to support `/v3/posts` style versioning, thanks [Michael Elfassy](https://github.com/elfassy)
13
+ * Support Rails 4.1, thanks [Washington L Braga Jr](https://github.com/huoxito)
14
+ * Added v1->v2 template renaming migration script
15
+ * Improving configuration
16
+
5
17
  ## 1.3.0 (Sept 26, 2013)
6
18
 
7
19
  [Full Changelog](https://github.com/bwillis/versioncake/compare/v1.2...v1.3)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- versioncake (1.3.0)
4
+ versioncake (2.0.0)
5
5
  actionpack (>= 3.2)
6
6
  activesupport (>= 3.2)
7
7
  railties (>= 3.2)
@@ -25,7 +25,7 @@ GEM
25
25
  appraisal (0.5.2)
26
26
  bundler
27
27
  rake
28
- atomic (1.1.10)
28
+ atomic (1.1.14)
29
29
  builder (3.1.4)
30
30
  colorize (0.5.8)
31
31
  coveralls (0.6.7)
@@ -35,7 +35,7 @@ GEM
35
35
  simplecov (>= 0.7)
36
36
  thor
37
37
  erubis (2.7.0)
38
- i18n (0.6.4)
38
+ i18n (0.6.9)
39
39
  metaclass (0.0.1)
40
40
  mime-types (1.23)
41
41
  minitest (4.7.5)
@@ -59,7 +59,7 @@ GEM
59
59
  simplecov-html (0.7.1)
60
60
  test-unit (2.5.5)
61
61
  thor (0.18.1)
62
- thread_safe (0.1.0)
62
+ thread_safe (0.1.3)
63
63
  atomic
64
64
  tzinfo (0.3.37)
65
65
 
data/README.md CHANGED
@@ -14,10 +14,10 @@ Version Cake is an unobtrusive way to version APIs in your Rails app.
14
14
 
15
15
  ```ruby
16
16
  app/views/posts/
17
- - index.v1.xml.builder
18
- - index.v3.xml.builder
19
- - index.v1.json.jbuilder
20
- - index.v4.json.jbuilder
17
+ - index.xml.v1.builder
18
+ - index.xml.v3.builder
19
+ - index.json.v1.jbuilder
20
+ - index.json.v4.jbuilder
21
21
  ```
22
22
  - Gracefully degrade requests to the latest supported version
23
23
  - Clients can request API versions through different strategies
@@ -33,7 +33,35 @@ gem install versioncake
33
33
 
34
34
  ### Requirements
35
35
 
36
- Rails >= v3.2 is supported in versioncake =< v1.1. Rails 4 support is included versioncake >= v1.2.
36
+ | Version | Rails 3.2 Support? | Rails 4 Support? | Rails 4.1 Support? |
37
+ | ------- |:---------:| -------:| -------:|
38
+ | 1.0 | Yes | No | No |
39
+ | 1.1 | Yes | No | No |
40
+ | 1.2 | Yes | Yes | No |
41
+ | 1.3 | Yes | Yes | No |
42
+ | 2.0 | Yes | Yes | Yes |
43
+
44
+ ## Upgrade v1.0 -> v2.0
45
+
46
+ ### Filename changes
47
+ The major breaking change to require a bump to v2.0 was the order of the extensions. To avoid priority issues with the format (#14), the version number and the format have been swapped.
48
+
49
+ `index.v1.json.jbuilder` -> `index.json.v1.jbuilder`
50
+
51
+ To make it easier to upgrade, run the following command to automatically rename these files:
52
+
53
+ `verisoncake migrate` or `verisoncake migrate path/to/views`
54
+
55
+ ### Configuration changes
56
+
57
+ The configuration options for Version Cake have been namespaced and slightly renamed. The following is a mapping of the old names to the new names:
58
+
59
+ | Old Name | New Name |
60
+ | --------------------------------------- | -------------------------------------------- |
61
+ | config.view_versions | config.versioncake.supported_version_numbers |
62
+ | config.view_version_extraction_strategy | config.versioncake.extraction_strategy |
63
+ | config.view_version_string | config.versioncake.version_key |
64
+ | config.default_version | config.versioncake.default_version |
37
65
 
38
66
  ## Example
39
67
 
@@ -41,8 +69,8 @@ In this simple example we will outline the code that is introduced to support a
41
69
 
42
70
  ### config/application.rb
43
71
  ```ruby
44
- config.view_versions = (1...4)
45
- config.view_version_extraction_strategy = :query_parameter # for simplicity
72
+ config.versioncake.supported_version_numbers = (1...4)
73
+ config.versioncake.extraction_strategy = :query_parameter # for simplicity
46
74
  ```
47
75
 
48
76
  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.
@@ -65,21 +93,21 @@ class PostsController < ApplicationController
65
93
  end
66
94
  ```
67
95
 
68
- See the view samples below. The basic top level posts are referenced in views/posts/index.v1.json.jbuilder.
69
- But for views/posts/index.v4.json.jbuilder, we utilize the additional related comments.
96
+ See the view samples below. The basic top level posts are referenced in views/posts/index.json.v1.jbuilder.
97
+ But for views/posts/index.json.v4.jbuilder, we utilize the additional related comments.
70
98
 
71
99
  ### Views
72
100
 
73
101
  Notice the version numbers are denoted by the "v{version number}" extension within the file name.
74
102
 
75
- #### views/posts/index.v1.json.jbuilder
103
+ #### views/posts/index.json.v1.jbuilder
76
104
  ```ruby
77
105
  json.array!(@posts) do |json, post|
78
106
  json.(post, :id, :title)
79
107
  end
80
108
  ```
81
109
 
82
- #### views/posts/index.v4.json.jbuilder
110
+ #### views/posts/index.json.v4.jbuilder
83
111
  ```ruby
84
112
  json.array!(@posts) do |json, post|
85
113
  json.(post, :id, :title)
@@ -89,7 +117,7 @@ end
89
117
 
90
118
  ### Sample Output
91
119
 
92
- When a version is specified for which a view doesn't exist, the request degrades and renders the next lowest version number to ensure the API's backwards compatibility. In the following case, since views/posts/index.v3.json.jbuilder doesn't exist, views/posts/index.v1.json.jbuilder is rendered instead.
120
+ When a version is specified for which a view doesn't exist, the request degrades and renders the next lowest version number to ensure the API's backwards compatibility. In the following case, since views/posts/index.json.v3.jbuilder doesn't exist, views/posts/index.json.v1.jbuilder is rendered instead.
93
121
 
94
122
  #### http://localhost:3000/posts.json?api_version=3
95
123
  ```javascript
@@ -110,7 +138,7 @@ When a version is specified for which a view doesn't exist, the request degrades
110
138
  ```
111
139
 
112
140
 
113
- For a given request, if we specify the version number, and that version of the view exists, that version specific view version will be rendered. In the below case, views/posts/index.v1.json.jbuilder is rendered.
141
+ For a given request, if we specify the version number, and that version of the view exists, that version specific view version will be rendered. In the below case, views/posts/index.json.v1.jbuilder is rendered.
114
142
 
115
143
  #### http://localhost:3000/posts.json?api_version=2 or http://localhost:3000/posts.json?api_version=1
116
144
  ```javascript
@@ -131,7 +159,7 @@ For a given request, if we specify the version number, and that version of the v
131
159
  ```
132
160
 
133
161
 
134
- When no version is specified, the latest version of the view is rendered. In this case, views/posts/index.v4.json.jbuilder.
162
+ When no version is specified, the latest version of the view is rendered. In this case, views/posts/index.json.v4.jbuilder.
135
163
 
136
164
  #### http://localhost:3000/posts.json
137
165
  ```javascript
@@ -172,35 +200,39 @@ The configuration should be placed in your Rails projects `config/application.rb
172
200
  You need to define the supported versions in your Rails application.rb file as `view_versions`. Use this config to set the range of supported API versions that can be served:
173
201
 
174
202
  ```ruby
175
- config.view_versions = [1,2,3,4,5] # or (1..5)
203
+ config.versioncake.supported_version_numbers = [1,2,3,4,5] # or (1..5)
176
204
  ```
177
205
 
178
206
  #### Extraction Strategy
179
207
 
180
208
  You can also define the way to extract the version. The `view_version_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.
181
209
  ```ruby
182
- config.view_version_extraction_strategy = :query_parameter # [:http_header, :http_accept_parameter]
210
+ config.versioncake.extraction_strategy = :query_parameter # [:http_header, :http_accept_parameter]
183
211
  ```
184
212
  These are the available strategies:
185
- - **query_parameter**: version in the url query parameter, for testing or to override for special case i.e. ```http://localhost:3000/posts.json?api_version=1``` (This is the default.)
186
- - **request_parameter**: version that is sent in the body of the request. Good for testing.
187
- - **http_header**: Api version HTTP header ie. ```X-API-Version: 1```
188
- - **http_accept_parameter**: HTTP Accept header ie. ```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)
189
- - **custom**: `lambda {|request| request.headers["HTTP_X_MY_VERSION"].to_i }` takes the request object and must return an integer
213
+
214
+ Strategy | Description | Example
215
+ --- | --- | ---
216
+ :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.)
217
+ :path_parameter | version in the url path parameter | `api/v:api_version/`
218
+ request_parameter | version that is sent in the body of the request | Good for testing.
219
+ :http_header | Api version HTTP header | `X-API-Version: 1`
220
+ :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)
221
+ custom | takes the request object and must return an integer | lambda {&#124;request&#124; request.headers["HTTP_X_MY_VERSION"].to_i }
190
222
 
191
223
 
192
224
  #### Default Version
193
225
 
194
226
  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:
195
227
  ```ruby
196
- config.default_version = 4
228
+ config.versioncake.default_version = 4
197
229
  ```
198
230
 
199
231
  #### Version String
200
232
 
201
233
  The extraction strategies use a default string key of `api_version`, but that can be changed:
202
234
  ```ruby
203
- config.view_version_string = "special_version_parameter_name"
235
+ config.versioncake.version_key = "special_version_parameter_name"
204
236
  ```
205
237
 
206
238
  ### Version your views
@@ -213,8 +245,8 @@ When a client makes a request to your controller the latest version of the view
213
245
  - edit.html.erb
214
246
  - show.html.erb
215
247
  - show.json.jbuilder
216
- - show.v1.json.jbuilder
217
- - show.v2.json.jbuilder
248
+ - show.json.v1.jbuilder
249
+ - show.json.v2.jbuilder
218
250
  - new.html.erb
219
251
  - _form.html.erb
220
252
  ```
@@ -248,7 +280,7 @@ Testing can be painful but here are some easy ways to test different versions of
248
280
  Allowing more extraction strategies during testing can be helpful when needing to override the version.
249
281
  ```ruby
250
282
  # config/environments/test.rb
251
- config.view_version_extraction_strategy = [:query_parameter, :request_parameter, :http_header, :http_accept_parameter]
283
+ config.versioncake.extraction_strategy = [:query_parameter, :request_parameter, :http_header, :http_accept_parameter]
252
284
  ```
253
285
 
254
286
  ### Testing a specific version
@@ -265,23 +297,23 @@ You can also test a specific version through a specific strategy such query_para
265
297
  # test/functional/renders_controller_test.rb#L47
266
298
  test "render version 1 of the partial based on the parameter _api_version" do
267
299
  get :index, "api_version" => "1"
268
- assert_equal @response.body, "index.v1.html.erb"
300
+ assert_equal @response.body, "index.html.v1.erb"
269
301
  end
270
302
  ```
271
303
 
272
304
  ### Testing all supported versions
273
305
 
274
- You can iterate over all of the supported version numbers by accessing the ```AppName::Application.config.view_versions```.
306
+ You can iterate over all of the supported version numbers by accessing the ```AppName::Application.config.versioncake.supported_version_numbers```.
275
307
 
276
308
  ```ruby
277
- AppName::Application.config.view_versions.each do |supported_version|
309
+ AppName::Application.config.versioncake.supported_version_numbers.each do |supported_version|
278
310
  before do
279
311
  @controller.stubs(:requested_version).returns(supported_version)
280
312
  end
281
313
 
282
314
  test "all versions render the correct template" do
283
315
  get :index
284
- assert_equal @response.body, "index.v1.html.erb"
316
+ assert_equal @response.body, "index.html.v1.erb"
285
317
  end
286
318
  end
287
319
  ```
@@ -296,6 +328,9 @@ Thanks to all those who have helped make Version Cake really sweet:
296
328
  * Sevag
297
329
  * [Billy](https://github.com/bcatherall)
298
330
  * [Jérémie Meyer de Ville](https://github.com/jeremiemv)
331
+ * [Michael Elfassy](https://github.com/elfassy)
332
+ * [Kelley Reynolds](https://github.com/kreynolds)
333
+ * [Washington L Braga Jr](https://github.com/huoxito)
299
334
 
300
335
  # Related Material
301
336
 
data/RELEASE.md CHANGED
@@ -23,5 +23,5 @@ Keeping releases consistent is important so here are the steps to follow when pu
23
23
  7. Tag the version ```git tag -a vX.X -m 'Version X.X Stable' && git push --tags```
24
24
 
25
25
  8. Build the gem ```gem build versioncake.gemspec```
26
- 9. Push the gem to ruby gems ```gem push versioncake-vX.X.X.gem```
26
+ 9. Push the gem to ruby gems ```gem push versioncake-X.X.X.gem```
27
27
  10. Remove the built gem locally ```rm versioncake-X.X.X.gem```
data/bin/versioncake ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ require 'versioncake'
3
+
4
+ case ARGV[0]
5
+ when 'migrate'
6
+ VersionCake::Cli.new.migrate ARGV[1]
7
+ else
8
+ raise 'Unknown command.'
9
+ end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../
3
3
  specs:
4
- versioncake (1.3.0)
4
+ versioncake (2.0.0)
5
5
  actionpack (>= 3.2)
6
6
  activesupport (>= 3.2)
7
7
  railties (>= 3.2)
@@ -29,6 +29,7 @@ GEM
29
29
  appraisal (0.5.2)
30
30
  bundler
31
31
  rake
32
+ atomic (1.1.14)
32
33
  builder (3.0.4)
33
34
  colorize (0.5.8)
34
35
  coveralls (0.6.7)
@@ -77,8 +78,11 @@ GEM
77
78
  tilt (~> 1.1, != 1.3.0)
78
79
  test-unit (2.5.5)
79
80
  thor (0.18.1)
81
+ thread_safe (0.1.3)
82
+ atomic
80
83
  tilt (1.4.1)
81
- tzinfo (0.3.37)
84
+ tzinfo (1.1.0)
85
+ thread_safe (~> 0.1)
82
86
 
83
87
  PLATFORMS
84
88
  ruby
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../
3
3
  specs:
4
- versioncake (1.3.0)
4
+ versioncake (2.0.0)
5
5
  actionpack (>= 3.2)
6
6
  activesupport (>= 3.2)
7
7
  railties (>= 3.2)
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "actionpack", "~> 4.1.0.beta1"
6
+ gem "activesupport", "~> 4.1.0.beta1"
7
+ gem "railties", "~> 4.1.0.beta1"
8
+
9
+ gemspec :path=>"../"
@@ -0,0 +1,87 @@
1
+ PATH
2
+ remote: ../
3
+ specs:
4
+ versioncake (2.0.0)
5
+ actionpack (>= 3.2)
6
+ activesupport (>= 3.2)
7
+ railties (>= 3.2)
8
+ tzinfo
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ actionpack (4.1.0.beta1)
14
+ actionview (= 4.1.0.beta1)
15
+ activesupport (= 4.1.0.beta1)
16
+ rack (~> 1.5.2)
17
+ rack-test (~> 0.6.2)
18
+ actionview (4.1.0.beta1)
19
+ activesupport (= 4.1.0.beta1)
20
+ builder (~> 3.1)
21
+ erubis (~> 2.7.0)
22
+ activesupport (4.1.0.beta1)
23
+ i18n (~> 0.6, >= 0.6.9)
24
+ json (~> 1.7, >= 1.7.7)
25
+ minitest (~> 5.1)
26
+ thread_safe (~> 0.1)
27
+ tzinfo (~> 1.1)
28
+ appraisal (0.5.2)
29
+ bundler
30
+ rake
31
+ atomic (1.1.14)
32
+ builder (3.2.2)
33
+ coveralls (0.7.0)
34
+ multi_json (~> 1.3)
35
+ rest-client
36
+ simplecov (>= 0.7)
37
+ term-ansicolor
38
+ thor
39
+ docile (1.1.2)
40
+ erubis (2.7.0)
41
+ i18n (0.6.9)
42
+ json (1.8.1)
43
+ metaclass (0.0.2)
44
+ mime-types (2.0)
45
+ minitest (5.2.1)
46
+ mocha (1.0.0)
47
+ metaclass (~> 0.0.1)
48
+ multi_json (1.8.4)
49
+ rack (1.5.2)
50
+ rack-test (0.6.2)
51
+ rack (>= 1.0)
52
+ railties (4.1.0.beta1)
53
+ actionpack (= 4.1.0.beta1)
54
+ activesupport (= 4.1.0.beta1)
55
+ rake (>= 0.8.7)
56
+ thor (>= 0.18.1, < 2.0)
57
+ rake (10.1.1)
58
+ rest-client (1.6.7)
59
+ mime-types (>= 1.16)
60
+ simplecov (0.8.2)
61
+ docile (~> 1.1.0)
62
+ multi_json
63
+ simplecov-html (~> 0.8.0)
64
+ simplecov-html (0.8.0)
65
+ term-ansicolor (1.2.2)
66
+ tins (~> 0.8)
67
+ test-unit (2.5.5)
68
+ thor (0.18.1)
69
+ thread_safe (0.1.3)
70
+ atomic
71
+ tins (0.13.1)
72
+ tzinfo (1.1.0)
73
+ thread_safe (~> 0.1)
74
+
75
+ PLATFORMS
76
+ ruby
77
+
78
+ DEPENDENCIES
79
+ actionpack (~> 4.1.0.beta1)
80
+ activesupport (~> 4.1.0.beta1)
81
+ appraisal
82
+ coveralls
83
+ mocha
84
+ railties (~> 4.1.0.beta1)
85
+ rake
86
+ test-unit
87
+ versioncake!
@@ -0,0 +1,60 @@
1
+ module VersionCake
2
+ class Cli
3
+ RAILS_VIEW_PATH = 'app/views'
4
+ HANDLERS = %w(
5
+ haml
6
+ erb
7
+ jbuilder
8
+ rabl
9
+ builder
10
+ )
11
+
12
+ def migrate(path)
13
+ path = RAILS_VIEW_PATH unless path
14
+ raise ArgumentError.new("No directory exists for '#{path}'") unless File.exists? path
15
+
16
+ files_to_rename = []
17
+ Dir.glob(File.join(path, '**/*.*')).each do |filename|
18
+ if has_version_in_name?(filename) && new_name = v1_to_v2_filename(filename)
19
+ files_to_rename << [filename, new_name]
20
+ end
21
+ end
22
+
23
+ if files_to_rename.empty?
24
+ puts 'No files to rename'
25
+ end
26
+
27
+ files_to_rename.each do |names|
28
+ old_name, new_name = names
29
+ puts "Renaming #{old_name} to #{new_name}"
30
+ File.rename(old_name, new_name)
31
+ end
32
+
33
+ files_to_rename
34
+ end
35
+
36
+ def v1_to_v2_filename(path)
37
+ filename = File.basename(path)
38
+ if m = filename.match(/(\.v[0-9]+)/)
39
+ version_str = m[0]
40
+ new_path = path.sub version_str, ''
41
+
42
+ if new_path.end_with? *HANDLERS
43
+ # handler exists at the end, need to put the version before it
44
+ parts = new_path.split('.')
45
+ new_path = parts.insert(parts.length-1, version_str.delete('.')).join('.')
46
+ else
47
+ # no handler, version is the last extension
48
+ new_path << version_str
49
+ end
50
+
51
+ path != new_path ? new_path : nil
52
+ end
53
+ end
54
+
55
+ def has_version_in_name?(filename)
56
+ filename =~ /v[0-9]+/
57
+ end
58
+
59
+ end
60
+ end
@@ -2,47 +2,47 @@ require 'active_support/core_ext/module/attribute_accessors.rb'
2
2
  require 'active_support/core_ext/array/wrap.rb'
3
3
 
4
4
  module VersionCake
5
- module Configuration
5
+ class Configuration
6
6
 
7
7
  SUPPORTED_VERSIONS_DEFAULT = (1..10)
8
+ VERSION_KEY_DEFAULT = 'api_version'
8
9
 
9
- mattr_reader :supported_version_numbers
10
+ attr_reader :extraction_strategies, :supported_version_numbers
11
+ attr_accessor :default_version, :version_key
10
12
 
11
- mattr_accessor :extraction_strategies
12
- self.extraction_strategies = []
13
-
14
- mattr_accessor :default_version
15
- self.default_version = nil
13
+ def initialize
14
+ @version_key = VERSION_KEY_DEFAULT
15
+ self.supported_version_numbers = SUPPORTED_VERSIONS_DEFAULT
16
+ self.extraction_strategy = :query_parameter
17
+ end
16
18
 
17
- def self.extraction_strategy=(val)
18
- @@extraction_strategies.clear
19
+ def extraction_strategy=(val)
20
+ @extraction_strategies = []
19
21
  Array.wrap(val).each do |configured_strategy|
20
- @@extraction_strategies << VersionCake::ExtractionStrategy.lookup(configured_strategy)
22
+ @extraction_strategies << VersionCake::ExtractionStrategy.lookup(configured_strategy)
21
23
  end
22
24
  end
23
25
 
24
- def self.supported_version_numbers=(val)
25
- @@supported_version_numbers = val.respond_to?(:to_a) ? val.to_a : Array.wrap(val)
26
- @@supported_version_numbers.sort!.reverse!
26
+ def supported_version_numbers=(val)
27
+ @supported_version_numbers = val.respond_to?(:to_a) ? val.to_a : Array.wrap(val)
28
+ @supported_version_numbers.sort!.reverse!
27
29
  end
28
30
 
29
- def self.supported_versions(requested_version_number=nil)
30
- supported_version_numbers.collect do |supported_version_number|
31
+ def supported_versions(requested_version_number=nil)
32
+ @supported_version_numbers.collect do |supported_version_number|
31
33
  if requested_version_number.nil? || supported_version_number <= requested_version_number
32
34
  :"v#{supported_version_number}"
33
35
  end
34
36
  end
35
37
  end
36
38
 
37
- def self.supports_version?(version)
38
- supported_version_numbers.include? version
39
+ def supports_version?(version)
40
+ @supported_version_numbers.include? version
39
41
  end
40
42
 
41
- def self.latest_version
42
- supported_version_numbers.first
43
+ def latest_version
44
+ @supported_version_numbers.first
43
45
  end
44
46
 
45
- self.extraction_strategy = :query_parameter
46
- self.supported_version_numbers = SUPPORTED_VERSIONS_DEFAULT
47
47
  end
48
48
  end
@@ -1,23 +1,7 @@
1
1
  require 'rails'
2
2
 
3
- class ActionViewVersions < Rails::Railtie
4
- initializer "view_versions" do |app|
5
- ActiveSupport.on_load(:action_view) do
6
- if app.config.respond_to?(:view_versions)
7
- VersionCake::Configuration.supported_version_numbers = app.config.view_versions
8
- end
9
-
10
- if app.config.respond_to?(:view_version_extraction_strategy)
11
- VersionCake::Configuration.extraction_strategy = app.config.view_version_extraction_strategy
12
- end
13
-
14
- if app.config.respond_to?(:view_version_string)
15
- VersionCake::ExtractionStrategy.version_string = app.config.view_version_string
16
- end
17
-
18
- if app.config.respond_to?(:default_version)
19
- VersionCake::Configuration.default_version = app.config.default_version
20
- end
21
- end
3
+ module VersionCake
4
+ class Railtie < ::Rails::Railtie
5
+ config.versioncake = VersionCake::Configuration.new
22
6
  end
23
7
  end
@@ -1,15 +1,15 @@
1
- require 'active_support/core_ext/class/attribute_accessors.rb'
2
1
  require 'active_support/core_ext/string/inflections.rb'
3
2
 
4
3
  module VersionCake
5
4
  class ExtractionStrategy
6
5
 
7
- cattr_accessor :version_string
8
- @@version_string = 'api_version'
9
-
10
6
  def extract(request)
11
7
  version = execute(request)
12
- return version.to_i if version
8
+ return version.to_i if version && /[0-9]+/.match(version)
9
+ end
10
+
11
+ def version_key
12
+ VersionCake::Railtie.config.versioncake.version_key
13
13
  end
14
14
 
15
15
  def execute(request)
@@ -3,7 +3,7 @@ module VersionCake
3
3
 
4
4
  def execute(request)
5
5
  if request.headers.key?("HTTP_ACCEPT") &&
6
- match = request.headers["HTTP_ACCEPT"].match(/#{@@version_string}=([0-9]+)/)
6
+ match = request.headers["HTTP_ACCEPT"].match(/#{version_key}=([0-9]+)/)
7
7
  match[1]
8
8
  end
9
9
  end