versioncake 1.0.0 → 1.1.0

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.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/.travis.yml +1 -0
  4. data/CHANGELOG.md +37 -0
  5. data/Gemfile +3 -5
  6. data/Gemfile.lock +18 -14
  7. data/README.md +31 -2
  8. data/lib/versioncake/configuration.rb +46 -0
  9. data/lib/versioncake/controller_additions.rb +24 -0
  10. data/lib/versioncake/railtie.rb +23 -0
  11. data/lib/versioncake/strategies/custom_strategy.rb +11 -0
  12. data/lib/versioncake/strategies/extraction_strategy.rb +37 -0
  13. data/lib/versioncake/strategies/http_accept_parameter_strategy.rb +12 -0
  14. data/lib/versioncake/strategies/http_header_strategy.rb +11 -0
  15. data/lib/versioncake/strategies/query_parameter_strategy.rb +11 -0
  16. data/lib/versioncake/strategies/request_parameter_strategy.rb +11 -0
  17. data/lib/versioncake/version.rb +1 -1
  18. data/lib/versioncake/versioned_request.rb +38 -0
  19. data/lib/versioncake/{action_view/resolver.rb → view_additions.rb} +15 -0
  20. data/lib/versioncake.rb +12 -6
  21. data/test/app/controllers/renders_controller.rb +4 -1
  22. data/test/config/application.rb +5 -7
  23. data/test/functional/renders_controller_test.rb +32 -11
  24. data/test/test_helper.rb +6 -2
  25. data/test/unit/configuration_test.rb +49 -0
  26. data/test/unit/strategies/extraction_strategy_test.rb +38 -0
  27. data/test/unit/strategies/http_accept_parameter_strategy_test.rb +17 -0
  28. data/test/unit/strategies/http_header_strategy_test.rb +17 -0
  29. data/test/unit/strategies/query_parameter_strategy_test.rb +17 -0
  30. data/test/unit/strategies/request_parameter_strategy_test.rb +17 -0
  31. data/test/unit/versioned_request_test.rb +48 -0
  32. metadata +36 -37
  33. data/lib/versioncake/action_controller/versioning.rb +0 -31
  34. data/lib/versioncake/action_view/lookup_context.rb +0 -10
  35. data/lib/versioncake/action_view/railtie.rb +0 -19
  36. data/lib/versioncake/action_view/template.rb +0 -11
  37. data/lib/versioncake/action_view/versions.rb +0 -90
  38. data/test/config/database.yml +0 -4
  39. data/test/db/test.sqlite3 +0 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ad6b180d713a358c8dca71c1ee7d13763b33d61c
4
+ data.tar.gz: 6b3a64e7b6af7ebf8839d27c8f427c0dcdf1030d
5
+ SHA512:
6
+ metadata.gz: c13e158b7af821d0099ac548bc20f723554b335383088b857e886b7483fea4cae52880087b9713745e7450fd160787323471e59169c953eb9d0ed6fc796a2248
7
+ data.tar.gz: 9d371dcb0558ec42eeb179141c908e7c9a4b6c2831c6836e0063412772b5cfb9dc397db6f79af65e41db6f2d981c8be6eafb94f90d87439b2fe173b20c881fca
data/.gitignore CHANGED
@@ -1,5 +1,8 @@
1
1
  .idea
2
2
  .rvmrc
3
+ .ruby-gemset
4
+ .ruby-version
3
5
  spec/log
4
6
  log/
5
7
  *.gem
8
+ coverage/
data/.travis.yml CHANGED
@@ -2,3 +2,4 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.2
4
4
  - 1.9.3
5
+ - ruby-head
data/CHANGELOG.md ADDED
@@ -0,0 +1,37 @@
1
+ ## Unreleased Changes
2
+
3
+ [Full Changelog](https://github.com/bwillis/versioncake/compare/v1.1...master)
4
+
5
+ * No significant changes.
6
+
7
+ ## 1.1.0 (May 18, 2013)
8
+
9
+ [Full Changelog](https://github.com/bwillis/versioncake/compare/v1.0...v1.1)
10
+
11
+
12
+ Bug Fixes:
13
+
14
+ * HttpAcceptParameterStrategy will now accept multiple digit versions
15
+
16
+ Enhancements:
17
+
18
+ * Added this CHANGELOG!
19
+ * New configuration parameter default_version to set the desired version when a client does not send a version instead of the default latest version. Thanks to [Billy Catherall](https://github.com/bcatherall) for implementing this.
20
+ * Internal refactoring of strategies for better testability.
21
+ * Isolated Rails hooks.
22
+
23
+ Deprecations:
24
+
25
+ * None
26
+
27
+ ## 1.0.0 (March 14, 2013)
28
+
29
+ [Full Changelog](https://github.com/bwillis/versioncake/compare/v0.5...v1.0)
30
+
31
+ ## 0.5.0 (December 6, 2012)
32
+
33
+ [Full Changelog](https://github.com/bwillis/versioncake/compare/v0.4...v0.5)
34
+
35
+ ## 0.4.0 (October 29, 2012)
36
+
37
+ [Full Changelog](https://github.com/bwillis/versioncake/compare/0fe364999ec9e5fe27faf39f82d8f7f2d26f38be...v0.4)
data/Gemfile CHANGED
@@ -1,17 +1,15 @@
1
- source "http://rubygems.org"
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
5
  gem 'rack'
6
- gem 'actionpack'
7
- gem 'activerecord'
8
6
  gem 'multi_json'
9
- gem 'i18n', '0.6.1'
10
7
  gem 'tzinfo'
11
- gem 'sqlite3'
8
+ gem 'coveralls', require: false
12
9
 
13
10
  group :development do
14
11
  # for travis-ci.org
15
12
  gem "rake"
16
13
  gem 'test-unit'
14
+ gem 'mocha', '~> 0.12.0', :require => false
17
15
  end
data/Gemfile.lock CHANGED
@@ -1,13 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- versioncake (1.0.0)
4
+ versioncake (1.1.0)
5
5
  actionpack (>= 3.0)
6
6
  activesupport (>= 3.0)
7
7
  railties (>= 3.0)
8
8
 
9
9
  GEM
10
- remote: http://rubygems.org/
10
+ remote: https://rubygems.org/
11
11
  specs:
12
12
  actionpack (3.2.8)
13
13
  activemodel (= 3.2.8)
@@ -22,22 +22,24 @@ GEM
22
22
  activemodel (3.2.8)
23
23
  activesupport (= 3.2.8)
24
24
  builder (~> 3.0.0)
25
- activerecord (3.2.8)
26
- activemodel (= 3.2.8)
27
- activesupport (= 3.2.8)
28
- arel (~> 3.0.2)
29
- tzinfo (~> 0.3.29)
30
25
  activesupport (3.2.8)
31
26
  i18n (~> 0.6)
32
27
  multi_json (~> 1.0)
33
- arel (3.0.2)
34
28
  builder (3.0.0)
29
+ colorize (0.5.8)
30
+ coveralls (0.6.3)
31
+ colorize
32
+ multi_json (~> 1.3)
33
+ rest-client
34
+ simplecov (>= 0.7)
35
+ thor
35
36
  erubis (2.7.0)
36
37
  hike (1.2.1)
37
38
  i18n (0.6.1)
38
39
  journey (1.0.4)
39
40
  json (1.7.5)
40
41
  metaclass (0.0.1)
42
+ mime-types (1.21)
41
43
  mocha (0.12.3)
42
44
  metaclass (~> 0.0.1)
43
45
  multi_json (1.3.6)
@@ -58,11 +60,16 @@ GEM
58
60
  rake (0.9.2.2)
59
61
  rdoc (3.12)
60
62
  json (~> 1.4)
63
+ rest-client (1.6.7)
64
+ mime-types (>= 1.16)
65
+ simplecov (0.7.1)
66
+ multi_json (~> 1.0)
67
+ simplecov-html (~> 0.7.1)
68
+ simplecov-html (0.7.1)
61
69
  sprockets (2.1.3)
62
70
  hike (~> 1.2)
63
71
  rack (~> 1.0)
64
72
  tilt (~> 1.1, != 1.3.0)
65
- sqlite3 (1.3.6)
66
73
  test-unit (2.5.2)
67
74
  thor (0.16.0)
68
75
  tilt (1.3.3)
@@ -72,14 +79,11 @@ PLATFORMS
72
79
  ruby
73
80
 
74
81
  DEPENDENCIES
75
- actionpack
76
- activerecord
77
- i18n (= 0.6.1)
78
- mocha
82
+ coveralls
83
+ mocha (~> 0.12.0)
79
84
  multi_json
80
85
  rack
81
86
  rake
82
- sqlite3
83
87
  test-unit
84
88
  tzinfo
85
89
  versioncake!
data/README.md CHANGED
@@ -2,6 +2,9 @@
2
2
 
3
3
  [![Build Status](https://secure.travis-ci.org/bwillis/versioncake.png?branch=master)](http://travis-ci.org/bwillis/versioncake)
4
4
  [![Code Climate](https://codeclimate.com/github/bwillis/versioncake.png)](https://codeclimate.com/github/bwillis/versioncake)
5
+ [![Coverage Status](https://coveralls.io/repos/bwillis/versioncake/badge.png?branch=master)](https://coveralls.io/r/bwillis/versioncake)
6
+ [![Dependency Status](https://gemnasium.com/bwillis/versioncake.png)](https://gemnasium.com/bwillis/versioncake)
7
+ [![Gem Version](https://badge.fury.io/rb/versioncake.png)](http://badge.fury.io/rb/versioncake)
5
8
 
6
9
  Co-authored by Ben Willis ([@bwillis](https://github.com/bwillis/)) and Jim Jones ([@aantix](https://github.com/aantix)).
7
10
 
@@ -159,12 +162,17 @@ When no version is specified, the latest version of the view is rendered. In th
159
162
  ## How to use
160
163
 
161
164
  ### Configuration
165
+ The configuration should be placed in your Rails projects `config/application.rb`. It is also suggested to enable different settings per environment, for example development and test can have extraction strategies that make it easier to develop or write test code.
162
166
 
167
+ #### Supported Versions
163
168
  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:
164
169
 
165
170
  ```ruby
166
- config.view_versions = [1,3,4,5] # or (1...5)
171
+ config.view_versions = [1,2,3,4,5] # or (1..5)
167
172
  ```
173
+
174
+ #### Extraction Strategy
175
+
168
176
  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.
169
177
  ```ruby
170
178
  config.view_version_extraction_strategy = :query_parameter # [:http_header, :http_accept_parameter]
@@ -176,7 +184,17 @@ These are the available strategies:
176
184
  - **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)
177
185
  - **custom**: `lambda {|request| request.headers["HTTP_X_MY_VERSION"].to_i }` takes the request object and must return an integer
178
186
 
179
- The strategies use a default string of `api_version`, but that can be changed:
187
+
188
+ #### Default Version
189
+
190
+ 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:
191
+ ```ruby
192
+ config.default_version = 4
193
+ ```
194
+
195
+ #### Version String
196
+
197
+ The extraction strategies use a default string key of `api_version`, but that can be changed:
180
198
  ```ruby
181
199
  config.view_version_string = "special_version_parameter_name"
182
200
  ```
@@ -264,6 +282,16 @@ AppName::Application.config.view_versions.each do |supported_version|
264
282
  end
265
283
  ```
266
284
 
285
+ # Thanks!
286
+
287
+ Thanks to all those who have helped make Version Cake really sweet:
288
+
289
+ * [Manilla](https://github.com/manilla)
290
+ * [Alicia](https://github.com/alicial)
291
+ * [Rohit](https://github.com/rg)
292
+ * Sevag
293
+ * [Billy](https://github.com/bcatherall)
294
+
267
295
  # Related Material
268
296
 
269
297
  ## Usages
@@ -285,6 +313,7 @@ end
285
313
  - [Ruby5 on versioncake](http://ruby5.envylabs.com/episodes/310-episode-306-september-18th-2012/stories/2704-version-cake)
286
314
  - [Rails core discussion](https://groups.google.com/forum/#!msg/rubyonrails-core/odwmEYYIum0/9POep66BvoMJ)
287
315
  - [RubyWeekly](http://rubyweekly.com/archive/119.html)
316
+ - [API building tools on Ruby Toolbox](https://www.ruby-toolbox.com/categories/API_Builders)
288
317
 
289
318
  # Questions?
290
319
 
@@ -0,0 +1,46 @@
1
+ require 'active_support/core_ext/module/attribute_accessors.rb'
2
+
3
+ module VersionCake
4
+ module Configuration
5
+
6
+ SUPPORTED_VERSIONS_DEFAULT = (1..10)
7
+
8
+ mattr_accessor :supported_version_numbers
9
+ self.supported_version_numbers = SUPPORTED_VERSIONS_DEFAULT
10
+
11
+ mattr_accessor :extraction_strategies
12
+ self.extraction_strategies = [VersionCake::QueryParameterStrategy.new]
13
+
14
+ mattr_accessor :default_version
15
+ self.default_version = nil
16
+
17
+ def self.extraction_strategy=(val)
18
+ @@extraction_strategies.clear
19
+ Array.wrap(val).each do |configured_strategy|
20
+ @@extraction_strategies << VersionCake::ExtractionStrategy.lookup(configured_strategy)
21
+ end
22
+ end
23
+
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!
27
+ end
28
+
29
+ def self.supported_versions(requested_version_number=nil)
30
+ supported_version_numbers.collect do |supported_version_number|
31
+ if requested_version_number.nil? || supported_version_number <= requested_version_number
32
+ :"v#{supported_version_number}"
33
+ end
34
+ end
35
+ end
36
+
37
+ def self.supports_version?(version)
38
+ supported_version_numbers.include? version
39
+ end
40
+
41
+ def self.latest_version
42
+ supported_version_numbers.first
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,24 @@
1
+ require 'action_controller'
2
+
3
+ module VersionCake
4
+ module ControllerAdditions
5
+ extend ActiveSupport::Concern
6
+
7
+ attr_accessor :requested_version, :is_latest_version, :derived_version
8
+
9
+ included do
10
+ prepend_before_filter :set_version
11
+ end
12
+
13
+ protected
14
+ def set_version(override_version=nil)
15
+ versioned_request = VersionCake::VersionedRequest.new(request, override_version)
16
+ @requested_version = versioned_request.extracted_version
17
+ @derived_version = versioned_request.version
18
+ @_lookup_context.versions = versioned_request.supported_versions
19
+ @is_latest_version = versioned_request.is_latest_version
20
+ end
21
+ end
22
+ end
23
+
24
+ ActionController::Base.send(:include, VersionCake::ControllerAdditions)
@@ -0,0 +1,23 @@
1
+ require 'rails'
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
22
+ end
23
+ end
@@ -0,0 +1,11 @@
1
+ module VersionCake
2
+ class CustomStrategy < ExtractionStrategy
3
+ def initialize(callback)
4
+ @callback = callback
5
+ end
6
+
7
+ def execute(request)
8
+ @callback.call(request)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,37 @@
1
+ require 'active_support/core_ext/class/attribute_accessors.rb'
2
+
3
+ module VersionCake
4
+ class ExtractionStrategy
5
+
6
+ cattr_accessor :version_string
7
+ @@version_string = 'api_version'
8
+
9
+ def extract(request)
10
+ version = execute(request)
11
+ return version.to_i if version
12
+ end
13
+
14
+ def execute(request)
15
+ raise Exception, "ExtractionStrategy requires execute to be implemented"
16
+ end
17
+
18
+ def self.lookup(strategy)
19
+ if strategy.class == Proc
20
+ if strategy.arity == 1
21
+ VersionCake::CustomStrategy.new(strategy)
22
+ else
23
+ raise Exception, "Custom extraction strategy requires a single parameter"
24
+ end
25
+ else
26
+ strategy_name = "#{strategy}_strategy".camelize
27
+ begin
28
+ VersionCake.const_get(strategy_name).new
29
+ rescue
30
+ raise Exception, "Unknown VersionCake extraction strategy #{strategy_name}"
31
+ end
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,12 @@
1
+ module VersionCake
2
+ class HttpAcceptParameterStrategy < ExtractionStrategy
3
+
4
+ def execute(request)
5
+ if request.headers.has_key?("HTTP_ACCEPT") &&
6
+ match = request.headers["HTTP_ACCEPT"].match(/#{@@version_string}=([0-9]+)/)
7
+ match[1]
8
+ end
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ module VersionCake
2
+ class HttpHeaderStrategy < ExtractionStrategy
3
+
4
+ def execute(request)
5
+ if request.headers.has_key? "HTTP_X_#{@@version_string.upcase}"
6
+ request.headers["HTTP_X_#{@@version_string.upcase}"]
7
+ end
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module VersionCake
2
+ class QueryParameterStrategy < ExtractionStrategy
3
+
4
+ def execute(request)
5
+ if request.query_parameters.has_key? @@version_string.to_sym
6
+ request.query_parameters[@@version_string.to_sym]
7
+ end
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module VersionCake
2
+ class RequestParameterStrategy < ExtractionStrategy
3
+
4
+ def execute(request)
5
+ if request.request_parameters.has_key? @@version_string.to_sym
6
+ request.request_parameters[@@version_string.to_sym].to_i
7
+ end
8
+ end
9
+
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module VersionCake
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -0,0 +1,38 @@
1
+ module VersionCake
2
+ class VersionedRequest
3
+ attr_reader :version, :extracted_version, :is_latest_version
4
+
5
+ def initialize(request, version_override=nil)
6
+ @version = version_override || extract_version(request)
7
+ @is_latest_version = @version == VersionCake::Configuration.latest_version
8
+ end
9
+
10
+ def supported_versions
11
+ VersionCake::Configuration.supported_versions(@version)
12
+ end
13
+
14
+ private
15
+
16
+ def apply_strategies(request)
17
+ version = nil
18
+ VersionCake::Configuration.extraction_strategies.each do |strategy|
19
+ version = strategy.extract(request)
20
+ break unless version.nil?
21
+ end
22
+ version
23
+ end
24
+
25
+ def extract_version(request)
26
+ @extracted_version = apply_strategies(request)
27
+ if @extracted_version.nil?
28
+ @version = VersionCake::Configuration.default_version || VersionCake::Configuration.latest_version
29
+ elsif VersionCake::Configuration.supports_version? @extracted_version
30
+ @version = @extracted_version
31
+ elsif @extracted_version > VersionCake::Configuration.latest_version
32
+ raise ActionController::RoutingError.new("No route match for version")
33
+ else
34
+ raise ActionController::RoutingError.new("Version is deprecated")
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,5 +1,10 @@
1
1
  require 'action_view'
2
2
 
3
+ # register an addition detail for the lookup context to understand,
4
+ # this will allow us to have the versions available upon lookup in
5
+ # the resolver.
6
+ ActionView::LookupContext.register_detail(:versions){ VersionCake::Configuration.supported_versions }
7
+
3
8
  ActionView::PathResolver.class_eval do
4
9
 
5
10
  # not sure why we are doing this yet, but looks like a good idea
@@ -10,4 +15,14 @@ ActionView::PathResolver.class_eval do
10
15
  # it to the default pattern
11
16
  ActionView::PathResolver::DEFAULT_PATTERN.replace ":prefix/:action{.:locale,}{.:versions,}{.:formats,}{.:handlers,}"
12
17
 
18
+ end
19
+
20
+ ActionView::Template.class_eval do
21
+
22
+ # the identifier method name filters out numbers,
23
+ # but we want to preserve them for v1 etc.
24
+ def identifier_method_name #:nodoc:
25
+ inspect.gsub(/[^a-z0-9_]/, '_')
26
+ end
27
+
13
28
  end
data/lib/versioncake.rb CHANGED
@@ -1,6 +1,12 @@
1
- require 'versioncake/action_view/template'
2
- require 'versioncake/action_view/versions'
3
- require 'versioncake/action_view/lookup_context'
4
- require 'versioncake/action_view/resolver'
5
- require 'versioncake/action_controller/versioning'
6
- require 'versioncake/action_view/railtie'
1
+ require 'versioncake/strategies/extraction_strategy'
2
+ require 'versioncake/strategies/http_accept_parameter_strategy'
3
+ require 'versioncake/strategies/http_header_strategy'
4
+ require 'versioncake/strategies/query_parameter_strategy'
5
+ require 'versioncake/strategies/request_parameter_strategy'
6
+ require 'versioncake/strategies/custom_strategy'
7
+
8
+ require 'versioncake/configuration'
9
+ require 'versioncake/controller_additions'
10
+ require 'versioncake/view_additions'
11
+ require 'versioncake/versioned_request'
12
+ require 'versioncake/railtie'
@@ -3,5 +3,8 @@ require "action_controller/base"
3
3
 
4
4
  class RendersController < ActionController::Base
5
5
  def index
6
+ if params[:override_version]
7
+ set_version(params[:override_version].to_i)
8
+ end
6
9
  end
7
- end
10
+ end
@@ -1,13 +1,11 @@
1
- require 'rails/all'
1
+ require "action_controller/railtie"
2
+ require "active_support/railtie"
3
+
4
+ # Auto-require default libraries and those for the current Rails environment.
5
+ Bundler.require :default, Rails.env
2
6
 
3
7
  module RendersTest
4
8
  class Application < Rails::Application
5
- config.encoding = "utf-8"
6
- config.filter_parameters += [:password]
7
- config.active_support.escape_html_entities_in_json = true
8
- config.active_record.whitelist_attributes = true
9
- config.assets.enabled = true
10
- config.assets.version = '1.0'
11
9
  config.active_support.deprecation = :stderr
12
10
  config.view_versions = (1..3)
13
11
  config.view_version_extraction_strategy = :http_header
@@ -6,11 +6,11 @@ class RendersControllerTest < ActionController::TestCase
6
6
 
7
7
  setup do
8
8
  # change the version string for configuration testing
9
- ActionView::Template::Versions.version_string = "version"
9
+ VersionCake::ExtractionStrategy.version_string = "version"
10
10
  end
11
11
 
12
12
  teardown do
13
- ActionView::Template::Versions.version_string = "api_version"
13
+ VersionCake::ExtractionStrategy.version_string = "api_version"
14
14
  end
15
15
 
16
16
  test "render latest version of partial" do
@@ -33,22 +33,34 @@ class RendersControllerTest < ActionController::TestCase
33
33
  assert !@controller.is_latest_version
34
34
  end
35
35
 
36
- test "exposes the derived version when the version is not set" do
36
+ test "exposes the derived version when the version is not set and no default" do
37
37
  get :index
38
38
  assert_equal 3, @controller.derived_version
39
39
  end
40
40
 
41
+ test "exposes the default version when the version is not set default is set" do
42
+ VersionCake::Configuration.default_version = 1
43
+ get :index
44
+ assert_equal 1, @controller.derived_version
45
+ VersionCake::Configuration.default_version = nil
46
+ end
47
+
41
48
  test "requested version is blank when the version is not set" do
42
49
  get :index
43
50
  assert_blank @controller.requested_version
44
51
  end
52
+
53
+ test "set_version can be called to override the requested version" do
54
+ get :index, "version" => "1", "override_version" => 2
55
+ assert_equal 2, @controller.derived_version
56
+ end
45
57
  end
46
58
 
47
59
  class ParameterStragegyTest < ActionController::TestCase
48
60
  tests RendersController
49
61
 
50
62
  setup do
51
- ActionView::Template::Versions.extraction_strategy = :query_parameter
63
+ VersionCake::Configuration.extraction_strategy = :query_parameter
52
64
  end
53
65
 
54
66
  test "render version 1 of the partial based on the parameter _api_version" do
@@ -71,7 +83,7 @@ class CustomHeaderStrategyTest < ActionController::TestCase
71
83
  tests RendersController
72
84
 
73
85
  setup do
74
- ActionView::Template::Versions.extraction_strategy = :http_header
86
+ VersionCake::Configuration.extraction_strategy = :http_header
75
87
  end
76
88
 
77
89
  test "renders version 1 of the partial based on the header API-Version" do
@@ -97,7 +109,7 @@ class RequestBodyStrategyTest < ActionController::TestCase
97
109
  tests RendersController
98
110
 
99
111
  setup do
100
- ActionView::Template::Versions.extraction_strategy = :request_parameter
112
+ VersionCake::Configuration.extraction_strategy = :request_parameter
101
113
  end
102
114
 
103
115
  test "requested version is in the body" do
@@ -110,7 +122,7 @@ class AcceptHeaderStrategyTest < ActionController::TestCase
110
122
  tests RendersController
111
123
 
112
124
  setup do
113
- ActionView::Template::Versions.extraction_strategy = :http_accept_parameter
125
+ VersionCake::Configuration.extraction_strategy = :http_accept_parameter
114
126
  end
115
127
 
116
128
  test "render version 1 of the partial based on the header Accept" do
@@ -136,13 +148,22 @@ class AcceptHeaderStrategyTest < ActionController::TestCase
136
148
  get :index
137
149
  assert_equal @response.body, "index.v2.html.erb"
138
150
  end
151
+
152
+ test "render the default version version of the partial" do
153
+ VersionCake::Configuration.default_version = 1
154
+ @controller.request.stubs(:headers).returns({"HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=abc"})
155
+ get :index
156
+ assert_equal @response.body, "index.v1.html.erb"
157
+ VersionCake::Configuration.default_version = nil
158
+ end
159
+
139
160
  end
140
161
 
141
162
  class CustomStrategyTest < ActionController::TestCase
142
163
  tests RendersController
143
164
 
144
165
  setup do
145
- ActionView::Template::Versions.extraction_strategy = lambda { |request| 2 }
166
+ VersionCake::Configuration.extraction_strategy = lambda { |request| 2 }
146
167
  end
147
168
 
148
169
  test "renders version 2 of the partial based on the header Accept" do
@@ -155,7 +176,7 @@ class MultipleStrategyTest < ActionController::TestCase
155
176
  tests RendersController
156
177
 
157
178
  setup do
158
- ActionView::Template::Versions.extraction_strategy = [:http_accept_parameter, :query_parameter]
179
+ VersionCake::Configuration.extraction_strategy = [:http_accept_parameter, :query_parameter]
159
180
  end
160
181
 
161
182
  test "renders version 1 of the partial based on the header Accept" do
@@ -180,7 +201,7 @@ class UnsupportedVersionTest < ActionController::TestCase
180
201
  tests RendersController
181
202
 
182
203
  setup do
183
- ActionView::Template::Versions.extraction_strategy = :query_parameter
204
+ VersionCake::Configuration.extraction_strategy = :query_parameter
184
205
  end
185
206
 
186
207
  test "responds with 404 when the version is larger than the supported version" do
@@ -190,7 +211,7 @@ class UnsupportedVersionTest < ActionController::TestCase
190
211
  end
191
212
 
192
213
  test "responds with 404 when the version is lower than the latest version, but not an available version" do
193
- ActionView::Template::Versions.supported_version_numbers = [2,3]
214
+ VersionCake::Configuration.supported_version_numbers = [2,3]
194
215
  assert_raise ActionController::RoutingError do
195
216
  get :index, "api_version" => "1"
196
217
  end
data/test/test_helper.rb CHANGED
@@ -1,3 +1,6 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
1
4
  require 'bundler'
2
5
  Bundler.require
3
6
 
@@ -5,13 +8,14 @@ require 'versioncake'
5
8
 
6
9
  ENV["RAILS_ENV"] = 'test'
7
10
 
8
- require 'rails/all'
9
11
  require 'rails/test_help'
10
12
  require 'test/unit'
11
13
 
14
+ require "mocha"
15
+
12
16
  require File.expand_path('../config/application', __FILE__)
13
17
 
14
18
  FIXTURE_LOAD_PATH = File.join(File.dirname(__FILE__), 'fixtures')
15
19
  FIXTURES = Pathname.new(FIXTURE_LOAD_PATH)
16
20
 
17
- RendersTest::Application.initialize!
21
+ RendersTest::Application.initialize!
@@ -0,0 +1,49 @@
1
+ require './test/test_helper'
2
+
3
+ class ConfigurationTest < ActiveSupport::TestCase
4
+ setup do
5
+ @previous_versions = VersionCake::Configuration.supported_version_numbers
6
+ end
7
+
8
+ teardown do
9
+ VersionCake::Configuration.supported_version_numbers = @previous_versions
10
+ end
11
+
12
+ test "supported_version_numbers can be set with range" do
13
+ VersionCake::Configuration.supported_version_numbers = (1..7)
14
+ assert_equal [7,6,5,4,3,2,1], VersionCake::Configuration.supported_version_numbers
15
+ end
16
+
17
+ test "supported_version_numbers can be set with an unordered array" do
18
+ VersionCake::Configuration.supported_version_numbers = [2,4,1,5,3,6,7]
19
+ assert_equal [7,6,5,4,3,2,1], VersionCake::Configuration.supported_version_numbers
20
+ end
21
+
22
+ test "supported_version_numbers can be set with a single value" do
23
+ VersionCake::Configuration.supported_version_numbers = 19
24
+ assert_equal [19], VersionCake::Configuration.supported_version_numbers
25
+ end
26
+
27
+ test "supports_version? is only true for given supported versions" do
28
+ VersionCake::Configuration.supported_version_numbers = (1..7)
29
+ VersionCake::Configuration.supported_version_numbers.each do |supported_version|
30
+ assert_true VersionCake::Configuration.supports_version? supported_version
31
+ end
32
+ end
33
+
34
+ test "supports_version? is not true for other versions" do
35
+ VersionCake::Configuration.supported_version_numbers = (1..7)
36
+ [-2,-1,0,8,9,10].each do |unsupported_version|
37
+ assert_false VersionCake::Configuration.supports_version? unsupported_version
38
+ end
39
+ end
40
+
41
+ test "latest_version retrieves the highest supported version" do
42
+ VersionCake::Configuration.supported_version_numbers = [4,1,3,9,2,54]
43
+ assert_equal 54, VersionCake::Configuration.latest_version
44
+ end
45
+
46
+ test "default supported_version_numbers should be a logic set of version numbers" do
47
+ assert_equal VersionCake::Configuration::SUPPORTED_VERSIONS_DEFAULT, (1..10)
48
+ end
49
+ end
@@ -0,0 +1,38 @@
1
+ require './test/test_helper'
2
+
3
+ class ExtractionStrategyTest < ActiveSupport::TestCase
4
+ test "execute is required for a strategy" do
5
+ assert_raise(Exception) do
6
+ VersionCake::ExtractionStrategy.new.execute("request")
7
+ end
8
+ end
9
+
10
+ test "extract will convert the the result to integer" do
11
+ class TestStrategy < VersionCake::ExtractionStrategy
12
+ def execute(request); "123"; end
13
+ end
14
+ assert_equal TestStrategy.new.extract("request"), 123
15
+ end
16
+
17
+ test "it can lookup a strategy" do
18
+ strategy = VersionCake::ExtractionStrategy.lookup(:query_parameter)
19
+ assert_equal VersionCake::QueryParameterStrategy, strategy.class
20
+ end
21
+
22
+ test "it creates a custom strategy for a proc" do
23
+ strategy = VersionCake::ExtractionStrategy.lookup(lambda{|req|})
24
+ assert_equal VersionCake::CustomStrategy, strategy.class
25
+ end
26
+
27
+ test "it fails to create a custom strategy for a proc with no parameters" do
28
+ assert_raise(Exception) do
29
+ VersionCake::ExtractionStrategy.lookup(lambda{})
30
+ end
31
+ end
32
+
33
+ test "it raises error when no strategy is found" do
34
+ assert_raise(Exception) do
35
+ VersionCake::ExtractionStrategy.lookup(:fake_extraction)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,17 @@
1
+ require './test/test_helper'
2
+
3
+ class HttpAcceptParameterStrategyTest < ActiveSupport::TestCase
4
+ setup do
5
+ @strategy = VersionCake::HttpAcceptParameterStrategy.new
6
+ end
7
+
8
+ test "a request with an HTTP_ACCEPT version retrieves the version" do
9
+ request = stub(:headers => {'HTTP_ACCEPT' => 'application/xml; api_version=11'})
10
+ assert_equal 11, @strategy.extract(request)
11
+ end
12
+
13
+ test "a request without an HTTP_ACCEPT version returns nil" do
14
+ request = stub(:headers => {'HTTP_ACCEPT' => 'text/x-dvi; q=.8; mxb=100000; mxt=5.0, text/x-c'})
15
+ assert_nil @strategy.extract(request)
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ require './test/test_helper'
2
+
3
+ class HttpHeaderStrategyTest < ActiveSupport::TestCase
4
+ setup do
5
+ @strategy = VersionCake::HttpHeaderStrategy.new
6
+ end
7
+
8
+ test "a request with an HTTP_X_API_VERSION retrieves the version" do
9
+ request = stub(:headers => {'HTTP_X_API_VERSION' => '11'})
10
+ assert_equal 11, @strategy.extract(request)
11
+ end
12
+
13
+ test "a request without an HTTP_X_API_VERSION returns nil" do
14
+ request = stub(:headers => {'HTTP_ACCEPT' => 'text/x-dvi; q=.8; mxb=100000; mxt=5.0, text/x-c'})
15
+ assert_nil @strategy.extract(request)
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ require './test/test_helper'
2
+
3
+ class QueryParameterStrategyTest < ActiveSupport::TestCase
4
+ setup do
5
+ @strategy = VersionCake::QueryParameterStrategy.new
6
+ end
7
+
8
+ test "a request with an api_version parameter retrieves the version" do
9
+ request = stub(:query_parameters => {:api_version => '11', :other => 'parameter'})
10
+ assert_equal 11, @strategy.extract(request)
11
+ end
12
+
13
+ test "a request without an api_version parameter returns nil" do
14
+ request = stub(:query_parameters => {:other => 'parameter', :another => 'parameter'})
15
+ assert_nil @strategy.extract(request)
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ require './test/test_helper'
2
+
3
+ class RequestParameterStrategyTest < ActiveSupport::TestCase
4
+ setup do
5
+ @strategy = VersionCake::RequestParameterStrategy.new
6
+ end
7
+
8
+ test "a request with an api_version request parameter retrieves the version" do
9
+ request = stub(:request_parameters => {:api_version => '11', :other => 'parameter'})
10
+ assert_equal 11, @strategy.extract(request)
11
+ end
12
+
13
+ test "a request without an api_version request parameter returns nil" do
14
+ request = stub(:request_parameters => {:other => 'parameter', :another => 'parameter'})
15
+ assert_nil @strategy.extract(request)
16
+ end
17
+ end
@@ -0,0 +1,48 @@
1
+ require './test/test_helper'
2
+
3
+ class VersionedRequestTest < ActiveSupport::TestCase
4
+ test "a request with a supported version returns the version" do
5
+ VersionCake::VersionedRequest.any_instance.stubs(:apply_strategies => 2)
6
+ versioned_request = VersionCake::VersionedRequest.new(stub())
7
+ assert_equal 2, versioned_request.version
8
+ end
9
+
10
+ test "a request without a version returns the latest version" do
11
+ VersionCake::VersionedRequest.any_instance.stubs(:apply_strategies => nil)
12
+ versioned_request = VersionCake::VersionedRequest.new(stub())
13
+ assert_equal 3, versioned_request.version
14
+ end
15
+
16
+ test "a request for a version that is higher than the latest version raises an error" do
17
+ VersionCake::VersionedRequest.any_instance.stubs(:apply_strategies => 99)
18
+ assert_raise ActionController::RoutingError do
19
+ VersionCake::VersionedRequest.new(stub())
20
+ end
21
+ end
22
+
23
+ test "a request for a deprecated version raises an exception" do
24
+ VersionCake::VersionedRequest.any_instance.stubs(:apply_strategies => 2)
25
+ VersionCake::Configuration.stubs(:supports_version? => false)
26
+ assert_raise ActionController::RoutingError do
27
+ VersionCake::VersionedRequest.new(stub())
28
+ end
29
+ end
30
+
31
+ test "has a method to determine if requesting the latest version" do
32
+ VersionCake::VersionedRequest.any_instance.stubs(:apply_strategies => nil)
33
+ versioned_request = VersionCake::VersionedRequest.new(stub())
34
+ assert_true versioned_request.is_latest_version
35
+ end
36
+
37
+ test "has a method to retrieve the extracted version" do
38
+ VersionCake::VersionedRequest.any_instance.stubs(:apply_strategies => nil)
39
+ versioned_request = VersionCake::VersionedRequest.new(stub())
40
+ assert_nil versioned_request.extracted_version
41
+ assert_equal 3, versioned_request.version
42
+ end
43
+
44
+ test "the version can be overriden by a parameter" do
45
+ versioned_request = VersionCake::VersionedRequest.new(stub(), 8)
46
+ assert_equal 8, versioned_request.version
47
+ end
48
+ end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: versioncake
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
5
- prerelease:
4
+ version: 1.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jim Jones
@@ -10,86 +9,76 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2013-03-14 00:00:00.000000000Z
12
+ date: 2013-05-19 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: actionpack
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
- - - ! '>='
18
+ - - '>='
21
19
  - !ruby/object:Gem::Version
22
20
  version: '3.0'
23
21
  type: :runtime
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
- - - ! '>='
25
+ - - '>='
29
26
  - !ruby/object:Gem::Version
30
27
  version: '3.0'
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: activesupport
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
- - - ! '>='
32
+ - - '>='
37
33
  - !ruby/object:Gem::Version
38
34
  version: '3.0'
39
35
  type: :runtime
40
36
  prerelease: false
41
37
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
38
  requirements:
44
- - - ! '>='
39
+ - - '>='
45
40
  - !ruby/object:Gem::Version
46
41
  version: '3.0'
47
42
  - !ruby/object:Gem::Dependency
48
43
  name: railties
49
44
  requirement: !ruby/object:Gem::Requirement
50
- none: false
51
45
  requirements:
52
- - - ! '>='
46
+ - - '>='
53
47
  - !ruby/object:Gem::Version
54
48
  version: '3.0'
55
49
  type: :runtime
56
50
  prerelease: false
57
51
  version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
52
  requirements:
60
- - - ! '>='
53
+ - - '>='
61
54
  - !ruby/object:Gem::Version
62
55
  version: '3.0'
63
56
  - !ruby/object:Gem::Dependency
64
57
  name: test-unit
65
58
  requirement: !ruby/object:Gem::Requirement
66
- none: false
67
59
  requirements:
68
- - - ! '>='
60
+ - - '>='
69
61
  - !ruby/object:Gem::Version
70
62
  version: '0'
71
63
  type: :development
72
64
  prerelease: false
73
65
  version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
66
  requirements:
76
- - - ! '>='
67
+ - - '>='
77
68
  - !ruby/object:Gem::Version
78
69
  version: '0'
79
70
  - !ruby/object:Gem::Dependency
80
71
  name: mocha
81
72
  requirement: !ruby/object:Gem::Requirement
82
- none: false
83
73
  requirements:
84
- - - ! '>='
74
+ - - '>='
85
75
  - !ruby/object:Gem::Version
86
76
  version: '0'
87
77
  type: :development
88
78
  prerelease: false
89
79
  version_requirements: !ruby/object:Gem::Requirement
90
- none: false
91
80
  requirements:
92
- - - ! '>='
81
+ - - '>='
93
82
  - !ruby/object:Gem::Version
94
83
  version: '0'
95
84
  description: Render versioned views automagically based on the clients requested version.
@@ -102,28 +91,32 @@ extra_rdoc_files: []
102
91
  files:
103
92
  - .gitignore
104
93
  - .travis.yml
94
+ - CHANGELOG.md
105
95
  - Gemfile
106
96
  - Gemfile.lock
107
97
  - README.md
108
98
  - Rakefile
109
99
  - images/versioncake-logo450x100.png
110
100
  - lib/versioncake.rb
111
- - lib/versioncake/action_controller/versioning.rb
112
- - lib/versioncake/action_view/lookup_context.rb
113
- - lib/versioncake/action_view/railtie.rb
114
- - lib/versioncake/action_view/resolver.rb
115
- - lib/versioncake/action_view/template.rb
116
- - lib/versioncake/action_view/versions.rb
101
+ - lib/versioncake/configuration.rb
102
+ - lib/versioncake/controller_additions.rb
103
+ - lib/versioncake/railtie.rb
104
+ - lib/versioncake/strategies/custom_strategy.rb
105
+ - lib/versioncake/strategies/extraction_strategy.rb
106
+ - lib/versioncake/strategies/http_accept_parameter_strategy.rb
107
+ - lib/versioncake/strategies/http_header_strategy.rb
108
+ - lib/versioncake/strategies/query_parameter_strategy.rb
109
+ - lib/versioncake/strategies/request_parameter_strategy.rb
117
110
  - lib/versioncake/version.rb
111
+ - lib/versioncake/versioned_request.rb
112
+ - lib/versioncake/view_additions.rb
118
113
  - test/app/controllers/renders_controller.rb
119
114
  - test/app/views/renders/index.html.erb
120
115
  - test/app/views/renders/index.v1.html.erb
121
116
  - test/app/views/renders/index.v2.html.erb
122
117
  - test/config.ru
123
118
  - test/config/application.rb
124
- - test/config/database.yml
125
119
  - test/config/routes.rb
126
- - test/db/test.sqlite3
127
120
  - test/fixtures/partials/_versioned.erb
128
121
  - test/fixtures/partials/_versioned.v1.erb
129
122
  - test/fixtures/partials/_versioned.v2.erb
@@ -139,29 +132,35 @@ files:
139
132
  - test/script/rails
140
133
  - test/template/render_test.rb
141
134
  - test/test_helper.rb
135
+ - test/unit/configuration_test.rb
136
+ - test/unit/strategies/extraction_strategy_test.rb
137
+ - test/unit/strategies/http_accept_parameter_strategy_test.rb
138
+ - test/unit/strategies/http_header_strategy_test.rb
139
+ - test/unit/strategies/query_parameter_strategy_test.rb
140
+ - test/unit/strategies/request_parameter_strategy_test.rb
141
+ - test/unit/versioned_request_test.rb
142
142
  - versioncake.gemspec
143
143
  homepage: https://github.com/bwillis/versioncake
144
144
  licenses: []
145
+ metadata: {}
145
146
  post_install_message:
146
147
  rdoc_options: []
147
148
  require_paths:
148
149
  - lib
149
150
  required_ruby_version: !ruby/object:Gem::Requirement
150
- none: false
151
151
  requirements:
152
- - - ! '>='
152
+ - - '>='
153
153
  - !ruby/object:Gem::Version
154
154
  version: '0'
155
155
  required_rubygems_version: !ruby/object:Gem::Requirement
156
- none: false
157
156
  requirements:
158
- - - ! '>='
157
+ - - '>='
159
158
  - !ruby/object:Gem::Version
160
159
  version: '0'
161
160
  requirements: []
162
161
  rubyforge_project:
163
- rubygems_version: 1.8.19
162
+ rubygems_version: 2.0.3
164
163
  signing_key:
165
- specification_version: 3
164
+ specification_version: 4
166
165
  summary: Easily render versions of your rails views.
167
166
  test_files: []
@@ -1,31 +0,0 @@
1
- require 'action_controller'
2
-
3
- module ActionController #:nodoc:
4
- module Versioning
5
- extend ActiveSupport::Concern
6
-
7
- attr_accessor :requested_version, :is_latest_version, :derived_version
8
-
9
- included do
10
- prepend_before_filter :set_version
11
- end
12
-
13
- protected
14
- def set_version
15
- @requested_version = ActionView::Template::Versions.extract_version request
16
-
17
- if @requested_version.nil?
18
- @derived_version = ActionView::Template::Versions.latest_version
19
- elsif ActionView::Template::Versions.supports_version? @requested_version
20
- @derived_version = @requested_version
21
- elsif @requested_version > ActionView::Template::Versions.latest_version
22
- raise ActionController::RoutingError.new("No route match for version")
23
- else
24
- raise ActionController::RoutingError.new("Version is deprecated")
25
- end
26
- @_lookup_context.versions = ActionView::Template::Versions.supported_versions(@derived_version)
27
- @is_latest_version = @derived_version == ActionView::Template::Versions.latest_version
28
- end
29
- end
30
- end
31
- ActionController::Base.send(:include, ActionController::Versioning)
@@ -1,10 +0,0 @@
1
- require 'action_view'
2
-
3
- ActionView::LookupContext.class_eval do
4
-
5
- # register an addition detail for the lookup context to understand,
6
- # this will allow us to have the versions available upon lookup in
7
- # the resolver.
8
- register_detail(:versions){ ActionView::Template::Versions.supported_versions }
9
-
10
- end
@@ -1,19 +0,0 @@
1
- require 'rails'
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
- ActionView::Template::Versions.supported_version_numbers = app.config.view_versions
8
- end
9
-
10
- if app.config.respond_to?(:view_version_extraction_strategy)
11
- ActionView::Template::Versions.extraction_strategy = app.config.view_version_extraction_strategy
12
- end
13
-
14
- if app.config.respond_to?(:view_version_string)
15
- ActionView::Template::Versions.version_string = app.config.view_version_string
16
- end
17
- end
18
- end
19
- end
@@ -1,11 +0,0 @@
1
- require 'action_view'
2
-
3
- ActionView::Template.class_eval do
4
-
5
- # the identifier method name filters out numbers,
6
- # but we want to preserve them for v1 etc.
7
- def identifier_method_name #:nodoc:
8
- inspect.gsub(/[^a-z0-9_]/, '_')
9
- end
10
-
11
- end
@@ -1,90 +0,0 @@
1
- require 'active_support/core_ext/module/attribute_accessors.rb'
2
-
3
- module ActionView
4
- class Template
5
- module Versions
6
-
7
- mattr_accessor :version_string
8
- self.version_string = "api_version"
9
-
10
- mattr_accessor :supported_version_numbers
11
- self.supported_version_numbers = []
12
-
13
- mattr_accessor :extraction_strategy
14
- self.extraction_strategy = [:query_parameter]
15
-
16
- def self.extract_version(request)
17
- version = nil
18
- extraction_strategy.each do |strategy|
19
- version = apply_strategy(request, strategy)
20
- break unless version.nil?
21
- end
22
- version
23
- end
24
-
25
- def self.apply_strategy(request, strategy)
26
- case strategy
27
- when Proc
28
- strategy.call(request)
29
- when :http_accept_parameter
30
- if request.headers.has_key?("HTTP_ACCEPT") &&
31
- match = request.headers["HTTP_ACCEPT"].match(%{#{@@version_string}=([0-9])})
32
- match[1].to_i
33
- end
34
- when :http_header
35
- if request.headers.has_key? "HTTP_X_#{@@version_string.upcase}"
36
- request.headers["HTTP_X_#{@@version_string.upcase}"].to_i
37
- end
38
- when :query_parameter
39
- if request.query_parameters.has_key? @@version_string.to_sym
40
- request.query_parameters[@@version_string.to_sym].to_i
41
- end
42
- when :request_parameter
43
- if request.request_parameters.has_key? @@version_string.to_sym
44
- request.request_parameters[@@version_string.to_sym].to_i
45
- end
46
- else
47
- raise "Unknown extraction strategy #{strategy}"
48
- end
49
- end
50
-
51
- def self.extraction_strategy=(val)
52
- case val
53
- when Array
54
- @@extraction_strategy = val
55
- else
56
- @@extraction_strategy = Array.wrap(val)
57
- end
58
- end
59
-
60
- def self.supported_version_numbers=(val)
61
- case val
62
- when Range
63
- @@supported_version_numbers = val.to_a
64
- when Array
65
- @@supported_version_numbers = val
66
- else
67
- @@supported_version_numbers = Array.wrap(val)
68
- end
69
- @@supported_version_numbers.sort!.reverse!
70
- end
71
-
72
- def self.supported_versions(requested_version_number=nil)
73
- supported_version_numbers.collect do |supported_version_number|
74
- if requested_version_number.nil? || supported_version_number <= requested_version_number
75
- :"v#{supported_version_number}"
76
- end
77
- end
78
- end
79
-
80
- def self.supports_version?(version)
81
- supported_version_numbers.include? version
82
- end
83
-
84
- def self.latest_version
85
- supported_version_numbers.first
86
- end
87
-
88
- end
89
- end
90
- end
@@ -1,4 +0,0 @@
1
- test:
2
- adapter: sqlite3
3
- database: db/test.sqlite3
4
- timeout: 5000
data/test/db/test.sqlite3 DELETED
File without changes