versioncake 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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