Skip to content

Commit

Permalink
integrate new extraction strategies classes into the action view logic
Browse files Browse the repository at this point in the history
 - strategies are now optimistically looked up on assignment which should alert of invalid configurations at load time
 - preferring one time instead of dynamic construction of strategies should be more efficient
  • Loading branch information
bwillis committed Apr 14, 2013
1 parent 5e7ff31 commit 39dd040
Show file tree
Hide file tree
Showing 14 changed files with 21 additions and 52 deletions.
2 changes: 1 addition & 1 deletion lib/versioncake/action_view/railtie.rb
Expand Up @@ -12,7 +12,7 @@ class ActionViewVersions < Rails::Railtie
end

if app.config.respond_to?(:view_version_string)
ActionView::Template::Versions.version_string = app.config.view_version_string
VersionCake::ExtractionStrategy.version_string = app.config.view_version_string
end
end
end
Expand Down
45 changes: 7 additions & 38 deletions lib/versioncake/action_view/versions.rb
Expand Up @@ -4,56 +4,25 @@ module ActionView
class Template
module Versions

mattr_accessor :version_string
self.version_string = "api_version"

mattr_accessor :supported_version_numbers
self.supported_version_numbers = []

mattr_accessor :extraction_strategy
self.extraction_strategy = [:query_parameter]
mattr_accessor :extraction_strategies
self.extraction_strategies = [:query_parameter]

def self.extract_version(request)
version = nil
extraction_strategy.each do |strategy|
version = apply_strategy(request, strategy)
extraction_strategies.each do |strategy|
version = strategy.extract(request)
break unless version.nil?
end
version
end

def self.apply_strategy(request, strategy)
case strategy
when Proc
strategy.call(request)
when :http_accept_parameter
if request.headers.has_key?("HTTP_ACCEPT") &&
match = request.headers["HTTP_ACCEPT"].match(%{#{@@version_string}=([0-9])})
match[1].to_i
end
when :http_header
if request.headers.has_key? "HTTP_X_#{@@version_string.upcase}"
request.headers["HTTP_X_#{@@version_string.upcase}"].to_i
end
when :query_parameter
if request.query_parameters.has_key? @@version_string.to_sym
request.query_parameters[@@version_string.to_sym].to_i
end
when :request_parameter
if request.request_parameters.has_key? @@version_string.to_sym
request.request_parameters[@@version_string.to_sym].to_i
end
else
raise "Unknown extraction strategy #{strategy}"
end
end

def self.extraction_strategy=(val)
case val
when Array
@@extraction_strategy = val
else
@@extraction_strategy = Array.wrap(val)
@@extraction_strategies.clear
Array.wrap(val).each do |configured_strategy|
@@extraction_strategies << VersionCake::ExtractionStrategy.lookup(configured_strategy)
end
end

Expand Down
2 changes: 1 addition & 1 deletion lib/versioncake/strategies/custom_strategy.rb
Expand Up @@ -8,4 +8,4 @@ def execute(request)
@callback.call(request)
end
end
end
end
2 changes: 1 addition & 1 deletion lib/versioncake/strategies/extraction_strategy.rb
Expand Up @@ -34,4 +34,4 @@ def self.lookup(strategy)
end

end
end
end
Expand Up @@ -9,4 +9,4 @@ def execute(request)
end

end
end
end
2 changes: 1 addition & 1 deletion lib/versioncake/strategies/http_header_strategy.rb
Expand Up @@ -8,4 +8,4 @@ def execute(request)
end

end
end
end
2 changes: 1 addition & 1 deletion lib/versioncake/strategies/query_parameter_strategy.rb
Expand Up @@ -8,4 +8,4 @@ def execute(request)
end

end
end
end
2 changes: 1 addition & 1 deletion lib/versioncake/strategies/request_parameter_strategy.rb
Expand Up @@ -8,4 +8,4 @@ def execute(request)
end

end
end
end
4 changes: 2 additions & 2 deletions test/functional/renders_controller_test.rb
Expand Up @@ -6,11 +6,11 @@ class RendersControllerTest < ActionController::TestCase

setup do
# change the version string for configuration testing
ActionView::Template::Versions.version_string = "version"
VersionCake::ExtractionStrategy.version_string = "version"
end

teardown do
ActionView::Template::Versions.version_string = "api_version"
VersionCake::ExtractionStrategy.version_string = "api_version"
end

test "render latest version of partial" do
Expand Down
2 changes: 1 addition & 1 deletion test/unit/extraction_strategy_test.rb
Expand Up @@ -35,4 +35,4 @@ def execute(request); "123"; end
VersionCake::ExtractionStrategy.lookup(:fake_extraction)
end
end
end
end
2 changes: 1 addition & 1 deletion test/unit/http_accept_parameter_strategy_test.rb
Expand Up @@ -14,4 +14,4 @@ class HttpAcceptParameterStrategyTest < ActiveSupport::TestCase
request = stub(:headers => {'HTTP_ACCEPT' => 'text/x-dvi; q=.8; mxb=100000; mxt=5.0, text/x-c'})
assert_nil @strategy.extract(request)
end
end
end
2 changes: 1 addition & 1 deletion test/unit/http_header_strategy_test.rb
Expand Up @@ -14,4 +14,4 @@ class HttpHeaderStrategyTest < ActiveSupport::TestCase
request = stub(:headers => {'HTTP_ACCEPT' => 'text/x-dvi; q=.8; mxb=100000; mxt=5.0, text/x-c'})
assert_nil @strategy.extract(request)
end
end
end
2 changes: 1 addition & 1 deletion test/unit/query_parameter_strategy_test.rb
Expand Up @@ -14,4 +14,4 @@ class QueryParameterStrategyTest < ActiveSupport::TestCase
request = stub(:query_parameters => {:other => 'parameter', :another => 'parameter'})
assert_nil @strategy.extract(request)
end
end
end
2 changes: 1 addition & 1 deletion test/unit/request_parameter_strategy_test.rb
Expand Up @@ -14,4 +14,4 @@ class RequestParameterStrategyTest < ActiveSupport::TestCase
request = stub(:request_parameters => {:other => 'parameter', :another => 'parameter'})
assert_nil @strategy.extract(request)
end
end
end

0 comments on commit 39dd040

Please sign in to comment.