versioncake 2.5.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +6 -14
  2. data/.rspec +2 -0
  3. data/.travis.yml +4 -0
  4. data/Appraisals +12 -0
  5. data/CHANGELOG.md +18 -1
  6. data/CONTRIBUTING.md +2 -2
  7. data/Gemfile.lock +96 -44
  8. data/README.md +79 -29
  9. data/RELEASE.md +1 -1
  10. data/Rakefile +3 -7
  11. data/gemfiles/rails3.2.gemfile +2 -1
  12. data/gemfiles/rails3.2.gemfile.lock +34 -10
  13. data/gemfiles/rails4.0.gemfile +2 -1
  14. data/gemfiles/rails4.0.gemfile.lock +31 -7
  15. data/gemfiles/rails4.1.gemfile +1 -1
  16. data/gemfiles/rails4.1.gemfile.lock +28 -8
  17. data/gemfiles/rails4.2.gemfile +9 -0
  18. data/gemfiles/rails4.2.gemfile.lock +133 -0
  19. data/lib/generators/templates/versioncake.rb +40 -0
  20. data/lib/generators/versioncake/install_generator.rb +12 -0
  21. data/lib/versioncake.rb +24 -3
  22. data/lib/versioncake/configuration.rb +19 -2
  23. data/lib/versioncake/controller_additions.rb +35 -23
  24. data/lib/versioncake/engine.rb +7 -0
  25. data/lib/versioncake/exceptions.rb +4 -0
  26. data/lib/versioncake/rack/middleware.rb +20 -0
  27. data/lib/versioncake/strategies/extraction_strategy.rb +8 -3
  28. data/lib/versioncake/strategies/http_accept_parameter_strategy.rb +2 -2
  29. data/lib/versioncake/strategies/http_header_strategy.rb +2 -2
  30. data/lib/versioncake/strategies/path_parameter_strategy.rb +6 -2
  31. data/lib/versioncake/strategies/query_parameter_strategy.rb +2 -2
  32. data/lib/versioncake/strategies/request_parameter_strategy.rb +2 -2
  33. data/lib/versioncake/test_helpers.rb +14 -0
  34. data/lib/versioncake/version.rb +1 -1
  35. data/lib/versioncake/version_checker.rb +28 -0
  36. data/lib/versioncake/version_context.rb +20 -0
  37. data/lib/versioncake/version_context_service.rb +47 -0
  38. data/lib/versioncake/versioned_request.rb +22 -33
  39. data/lib/versioncake/versioned_resource.rb +14 -0
  40. data/lib/versioncake/view_additions.rb +7 -7
  41. data/{test → spec}/fixtures/partials/_versioned.erb +0 -0
  42. data/{test → spec}/fixtures/partials/_versioned.v1.erb +0 -0
  43. data/{test → spec}/fixtures/partials/_versioned.v2.erb +0 -0
  44. data/{test → spec}/fixtures/partials/_versioned.v3.erb +0 -0
  45. data/{test → spec}/fixtures/partials/another_versioned_partial.erb +0 -0
  46. data/{test → spec}/fixtures/partials/another_versioned_partial.v1.erb +0 -0
  47. data/{test → spec}/fixtures/templates/unversioned.html.erb +0 -0
  48. data/{test → spec}/fixtures/templates/v1_extension_scheme.v3.html.erb +0 -0
  49. data/{test → spec}/fixtures/templates/v1_extension_scheme.v6.json +0 -0
  50. data/{test → spec}/fixtures/templates/versioned.html.erb +0 -0
  51. data/{test → spec}/fixtures/templates/versioned.html.v1.erb +0 -0
  52. data/{test → spec}/fixtures/templates/versioned.html.v2.erb +0 -0
  53. data/{test → spec}/fixtures/templates/versioned.html.v3.erb +0 -0
  54. data/spec/fixtures/test_cases.yml +45 -0
  55. data/spec/integration/controller/renders_controller_spec.rb +73 -0
  56. data/spec/integration/controller/unversioned_controller_spec.rb +12 -0
  57. data/spec/integration/rack/middleware_regression_spec.rb +41 -0
  58. data/spec/integration/view/render_spec.rb +33 -0
  59. data/spec/integration/view/view_additions_spec.rb +51 -0
  60. data/spec/rails_helper.rb +41 -0
  61. data/spec/spec_helper.rb +25 -0
  62. data/spec/test_app/Rakefile +7 -0
  63. data/{test → spec/test_app}/app/controllers/renders_controller.rb +0 -0
  64. data/spec/test_app/app/controllers/unversioned_controller.rb +6 -0
  65. data/spec/test_app/app/views/renders/index.html.erb +1 -0
  66. data/{test → spec/test_app}/app/views/renders/index.html.v1.erb +0 -0
  67. data/{test → spec/test_app}/app/views/renders/index.html.v2.erb +0 -0
  68. data/spec/test_app/app/views/unversioned/index.html.erb +1 -0
  69. data/spec/test_app/config.ru +4 -0
  70. data/{test → spec/test_app}/config/application.rb +4 -6
  71. data/spec/test_app/config/boot.rb +5 -0
  72. data/spec/test_app/config/environment.rb +5 -0
  73. data/spec/test_app/config/initializers/versioncake.rb +45 -0
  74. data/spec/test_app/config/routes.rb +4 -0
  75. data/spec/test_app/script/rails +4 -0
  76. data/spec/unit/cli_spec.rb +36 -0
  77. data/spec/unit/configuration_spec.rb +61 -0
  78. data/spec/unit/strategies/extraction_strategy_spec.rb +71 -0
  79. data/spec/unit/strategies/http_accept_parameter_strategy_spec.rb +20 -0
  80. data/spec/unit/strategies/http_header_strategy_spec.rb +19 -0
  81. data/spec/unit/strategies/path_parameter_strategy_spec.rb +18 -0
  82. data/spec/unit/strategies/query_parameter_strategy_spec.rb +24 -0
  83. data/spec/unit/strategies/request_parameter_strategy_spec.rb +19 -0
  84. data/spec/unit/version_checker_spec.rb +60 -0
  85. data/spec/unit/version_context_service_spec.rb +84 -0
  86. data/spec/unit/version_context_spec.rb +46 -0
  87. data/spec/unit/versioned_request_spec.rb +35 -0
  88. data/spec/unit/versioned_resource_spec.rb +12 -0
  89. data/versioncake.gemspec +5 -2
  90. metadata +91 -70
  91. data/lib/versioncake/railtie.rb +0 -7
  92. data/test/app/views/renders/index.html.erb +0 -1
  93. data/test/config.ru +0 -0
  94. data/test/config/routes.rb +0 -3
  95. data/test/fixtures/test_cases.yml +0 -70
  96. data/test/functional/custom_strategy_controller_test.rb +0 -16
  97. data/test/functional/multiple_strategy_controller_test.rb +0 -24
  98. data/test/functional/renders_controller_test.rb +0 -71
  99. data/test/functional/strategy_controller_test.rb +0 -38
  100. data/test/script/rails +0 -0
  101. data/test/template/render_test.rb +0 -34
  102. data/test/test_helper.rb +0 -21
  103. data/test/unit/cli_test.rb +0 -48
  104. data/test/unit/configuration_test.rb +0 -45
  105. data/test/unit/strategies/extraction_strategy_test.rb +0 -70
  106. data/test/unit/strategies/http_accept_parameter_strategy_test.rb +0 -17
  107. data/test/unit/strategies/http_header_strategy_test.rb +0 -17
  108. data/test/unit/strategies/path_parameter_strategy_test.rb +0 -17
  109. data/test/unit/strategies/query_parameter_strategy_test.rb +0 -22
  110. data/test/unit/strategies/request_parameter_strategy_test.rb +0 -17
  111. data/test/unit/versioned_request_test.rb +0 -44
  112. data/test/unit/view_additions_test.rb +0 -35
@@ -1,3 +0,0 @@
1
- RendersTest::Application.routes.draw do
2
- resources :renders
3
- end
@@ -1,70 +0,0 @@
1
- # http_header_strategy
2
- - request:
3
- headers:
4
- HTTP_ACCEPT: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=1"
5
- response: "template v1"
6
-
7
- - request:
8
- headers:
9
- HTTP_ACCEPT: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=2"
10
- response: "template v2"
11
-
12
- - request:
13
- headers:
14
- HTTP_ACCEPT: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=INVALID"
15
- response: "template v2"
16
-
17
- # request_parameter_strategy
18
- - request:
19
- method: post
20
- params:
21
- api_version: "1"
22
- response: "template v1"
23
-
24
- - request:
25
- method: post
26
- params:
27
- api_version: "2"
28
- response: "template v2"
29
-
30
- - request:
31
- method: post
32
- params:
33
- api_version: "INVALID"
34
- response: "template v2"
35
-
36
- # query_parameter_strategy
37
- - request:
38
- params:
39
- api_version: "1"
40
- response: "template v1"
41
-
42
- - request:
43
- params:
44
- api_version: "2"
45
- response: "template v2"
46
-
47
- - request:
48
- params:
49
- api_version: "INVALID"
50
- response: "template v2"
51
-
52
- # http_header_strategy
53
- - request:
54
- headers:
55
- HTTP_X_API_VERSION: "1"
56
- response: "template v1"
57
-
58
- - request:
59
- headers:
60
- HTTP_X_API_VERSION: "2"
61
- response: "template v2"
62
-
63
- - request:
64
- headers:
65
- HTTP_X_API_VERSION: "INVALID"
66
- response: "template v2"
67
-
68
- # general
69
- - request:
70
- response: "template v2"
@@ -1,16 +0,0 @@
1
- require './test/test_helper'
2
- require 'action_controller'
3
- require 'action_controller/test_case'
4
-
5
- class CustomStrategyTest < ActionController::TestCase
6
- tests RendersController
7
-
8
- setup do
9
- VersionCake::Configuration.any_instance.stubs(:extraction_strategy => lambda { |request| 2 })
10
- end
11
-
12
- test "renders version 2 of the partial based on the header Accept" do
13
- get :index
14
- assert_equal "template v2", @response.body
15
- end
16
- end
@@ -1,24 +0,0 @@
1
- require './test/test_helper'
2
- require 'action_controller'
3
- require 'action_controller/test_case'
4
-
5
- class MultipleStrategyTest < ActionController::TestCase
6
- tests RendersController
7
-
8
- test "renders version 1 of the partial based on the header Accept" do
9
- @controller.request.stubs(:headers).returns({"HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=1"})
10
- get :index
11
- assert_equal "template v1", @response.body
12
- end
13
-
14
- test "renders the query parameter when accept parameter isn't available" do
15
- get :index, "api_version" => "1"
16
- assert_equal "template v1", @response.body
17
- end
18
-
19
- test "renders the higher priority accept parameter version" do
20
- @controller.request.stubs(:headers).returns({"HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=2"})
21
- get :index, "api_version" => "1"
22
- assert_equal "template v2", @response.body
23
- end
24
- end
@@ -1,71 +0,0 @@
1
- require './test/test_helper'
2
- require 'action_controller'
3
- require 'action_controller/test_case'
4
-
5
- class RendersControllerTest < ActionController::TestCase
6
-
7
- test "render latest version of partial" do
8
- get :index
9
- assert_equal "template v2", @response.body
10
- end
11
-
12
- test "exposes the requested version" do
13
- get :index, "api_version" => "1"
14
- assert_equal 1, @controller.requested_version
15
- end
16
-
17
- test "exposes latest version when requesting the latest" do
18
- get :index, "api_version" => "3"
19
- assert @controller.is_latest_version
20
- end
21
-
22
- test "reports not the latest version" do
23
- get :index, "api_version" => "1"
24
- assert !@controller.is_latest_version
25
- end
26
-
27
- test "exposes the derived version when the version is not set and no default" do
28
- get :index
29
- assert_equal 3, @controller.derived_version
30
- end
31
-
32
- test "exposes the default version when the version is not set default is set" do
33
- VersionCake::Configuration.any_instance.stubs(:default_version => 1)
34
- get :index
35
- assert_equal 1, @controller.derived_version
36
- end
37
-
38
- test "requested version is blank when the version is not set" do
39
- get :index
40
- assert @controller.requested_version.blank?
41
- end
42
-
43
- test "set_version can be called to override the requested version" do
44
- get :index, "api_version" => "1", "override_version" => 2
45
- assert_equal 2, @controller.derived_version
46
- end
47
-
48
- test "responds with 404 when the version is larger than the supported version" do
49
- assert_raise VersionCake::UnsupportedVersionError do
50
- get :index, "api_version" => "4"
51
- end
52
- end
53
-
54
- test "responds with 404 when the version is lower than the latest version, but not an available version" do
55
- assert_raise VersionCake::UnsupportedVersionError do
56
- get :index, "api_version" => "0"
57
- end
58
- end
59
-
60
- test "render the default version version of the partial" do
61
- VersionCake::Configuration.any_instance.stubs(:default_version => 1)
62
- get :index, "api_version" => "abc"
63
- assert_equal "template v1", @response.body
64
- end
65
-
66
- test "derived_version can be called before the before_filter and it returns the request version" do
67
- @controller.instance_variable_set("@_lookup_context", mock(:versions= => nil))
68
- @controller.request.stubs(:query_parameters => {:api_version => "2"})
69
- assert_equal 2, @controller.derived_version
70
- end
71
- end
@@ -1,38 +0,0 @@
1
- require './test/test_helper'
2
- require 'action_controller'
3
- require 'action_controller/test_case'
4
- require 'yaml'
5
-
6
- class StrategyControllerTest < ActionController::TestCase
7
- tests RendersController
8
-
9
- setup do
10
- @test_cases = YAML.load(File.open(Rails.root.join('fixtures', 'test_cases.yml')))
11
- end
12
-
13
- test "test yml test cases" do
14
- @test_cases.each do |test_case|
15
- request = (test_case['request'] || {})
16
- headers = request['headers']
17
- params = request['params']
18
- method = (request['method'] || "get").to_sym
19
- response = test_case['response']
20
- @controller.request.stubs(:headers).returns(headers || {})
21
- @controller.versioned_request = nil # clear out the versioned request so it's not cached
22
- begin
23
- send(method, :index, params || {})
24
- assert_equal(response, @response.body, custom_message(headers, params, method, response))
25
- rescue => e
26
- fail(custom_message(headers, params, method, response) + ", but it failed with an exception '#{e.message}'")
27
- end
28
- end
29
- end
30
-
31
- def custom_message(headers, params, method, response)
32
- data = []
33
- data << "headers:#{headers}" if headers
34
- data << "params:#{params}" if params
35
- "Expected #{data.join(",")} with method #{method} to yield #{response}"
36
- end
37
-
38
- end
File without changes
@@ -1,34 +0,0 @@
1
- require "./test/test_helper"
2
-
3
- class VersionRenderTest < ActiveSupport::TestCase
4
-
5
- def setup
6
- path = ActionView::FileSystemResolver.new(FIXTURE_LOAD_PATH)
7
- view_paths = ActionView::PathSet.new([path])
8
- @view = ActionView::Base.new(view_paths)
9
- end
10
-
11
- def test_regression_renders_unversioned_template
12
- @view.lookup_context.versions = [:v0]
13
- assert_equal "template", @view.render(:template => "templates/versioned")
14
- end
15
-
16
- def test_render_template_defaults_to_latest_template_version
17
- assert_equal "template v3", @view.render(:template => "templates/versioned")
18
- end
19
-
20
- def test_render_template_with_parameter_version_override
21
- assert_equal "template v1", @view.render(:template => "templates/versioned", :versions => :v1)
22
- end
23
-
24
- def test_render_template_with_legacy_version
25
- @view.lookup_context.versions = [:v2]
26
- assert_equal "template v2", @view.render(:template => "templates/versioned")
27
- end
28
-
29
- def test_render_template_gracefully_degrades
30
- @view.lookup_context.versions = [:v4,:v3,:v2,:v1]
31
- assert_equal "template v3", @view.render(:template => "templates/versioned")
32
- end
33
-
34
- end
@@ -1,21 +0,0 @@
1
- require 'coveralls'
2
- Coveralls.wear!
3
-
4
- require 'bundler'
5
- Bundler.require
6
-
7
- require 'versioncake'
8
-
9
- ENV["RAILS_ENV"] = 'test'
10
-
11
- require 'rails/test_help'
12
- require 'test/unit'
13
-
14
- require 'mocha/setup'
15
-
16
- require File.expand_path('../config/application', __FILE__)
17
-
18
- FIXTURE_LOAD_PATH = File.join(File.dirname(__FILE__), 'fixtures')
19
- FIXTURES = Pathname.new(FIXTURE_LOAD_PATH)
20
-
21
- RendersTest::Application.initialize!
@@ -1,48 +0,0 @@
1
- require './test/test_helper'
2
- require './lib/versioncake/cli'
3
-
4
- class CliTest < ActiveSupport::TestCase
5
-
6
- setup do
7
- File.stubs :rename
8
- capture_stdout(true)
9
- end
10
-
11
- teardown do
12
- capture_stdout(false)
13
- end
14
-
15
- def capture_stdout(flag=true)
16
- if flag
17
- out = StringIO.new
18
- $stdout = out
19
- else
20
- $stdout = STDOUT
21
- end
22
- end
23
-
24
- test 'it can detect old file names' do
25
- renamed_files = VersionCake::Cli.new.migrate('./test/fixtures/templates')
26
- assert_equal 2, renamed_files.size
27
- end
28
-
29
- test 'it renames old filenames to new filenames' do
30
- renamed_files = VersionCake::Cli.new.migrate('./test/fixtures/templates')
31
- expected_renamed_files = [
32
- ['./test/fixtures/templates/v1_extension_scheme.v3.html.erb', './test/fixtures/templates/v1_extension_scheme.html.v3.erb'],
33
- ['./test/fixtures/templates/v1_extension_scheme.v6.json', './test/fixtures/templates/v1_extension_scheme.json.v6']
34
- ]
35
- assert_empty expected_renamed_files - renamed_files
36
- end
37
-
38
- test 'it reports no files changed when new filenames exist' do
39
- assert_empty VersionCake::Cli.new.migrate('./test/app/views')
40
- end
41
-
42
- test 'it raises if it cannot find the path' do
43
- assert_raises ArgumentError do
44
- VersionCake::Cli.new.migrate('./a/missing/path')
45
- end
46
- end
47
-
48
- end
@@ -1,45 +0,0 @@
1
- require './test/test_helper'
2
-
3
- class ConfigurationTest < ActiveSupport::TestCase
4
- setup do
5
- @config = VersionCake::Configuration.new
6
- end
7
-
8
- test "supported_version_numbers can be set with range" do
9
- @config.supported_version_numbers = (1..7)
10
- assert_equal [7,6,5,4,3,2,1], @config.supported_version_numbers
11
- end
12
-
13
- test "supported_version_numbers can be set with an unordered array" do
14
- @config.supported_version_numbers = [2,4,1,5,3,6,7]
15
- assert_equal [7,6,5,4,3,2,1], @config.supported_version_numbers
16
- end
17
-
18
- test "supported_version_numbers can be set with a single value" do
19
- @config.supported_version_numbers = 19
20
- assert_equal [19], @config.supported_version_numbers
21
- end
22
-
23
- test "supports_version? is only true for given supported versions" do
24
- @config.supported_version_numbers = (1..7)
25
- @config.supported_version_numbers.each do |supported_version|
26
- assert @config.supports_version? supported_version
27
- end
28
- end
29
-
30
- test "supports_version? is not true for other versions" do
31
- @config.supported_version_numbers = (1..7)
32
- [-2,-1,0,8,9,10].each do |unsupported_version|
33
- assert !@config.supports_version?(unsupported_version)
34
- end
35
- end
36
-
37
- test "latest_version retrieves the highest supported version" do
38
- @config.supported_version_numbers = [4,1,3,9,2,54]
39
- assert_equal 54, @config.latest_version
40
- end
41
-
42
- test "default supported_version_numbers should be a logic set of version numbers" do
43
- assert_equal (1..10).to_a.reverse, @config.supported_version_numbers
44
- end
45
- end
@@ -1,70 +0,0 @@
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 "custom strategy result will be converted to integer" do
11
- class TestStrategy < VersionCake::ExtractionStrategy
12
- def execute(request); "123"; end
13
- end
14
- assert_equal 123, TestStrategy.new.extract("request")
15
- end
16
-
17
- test "custom strategy result will be returned" do
18
- class TestStrategy < VersionCake::ExtractionStrategy
19
- def execute(request); 123; end
20
- end
21
- assert_equal 123, TestStrategy.new.extract("request")
22
- end
23
-
24
- test "custom strategy will fail if it returns unexpected result" do
25
- class TestStrategy < VersionCake::ExtractionStrategy
26
- def execute(request); Object.new; end
27
- end
28
- assert_nil TestStrategy.new.extract("request")
29
- end
30
-
31
- test "it can lookup a strategy" do
32
- strategy = VersionCake::ExtractionStrategy.lookup(:query_parameter)
33
- assert_equal VersionCake::QueryParameterStrategy, strategy.class
34
- end
35
-
36
- test "it creates a custom strategy for a proc" do
37
- strategy = VersionCake::ExtractionStrategy.lookup(lambda{|req|})
38
- assert_equal VersionCake::CustomStrategy, strategy.class
39
- end
40
-
41
- test "it wraps a custom object" do
42
- class FakeStrategy
43
- def execute(request);end
44
- end
45
- strategy = VersionCake::ExtractionStrategy.lookup(FakeStrategy.new)
46
- assert_equal VersionCake::CustomStrategy, strategy.class
47
- end
48
-
49
- test "it calls a custom objects execute method" do
50
- class FakeStrategy
51
- def execute(request)
52
- 9999
53
- end
54
- end
55
- strategy = VersionCake::ExtractionStrategy.lookup(FakeStrategy.new)
56
- assert_equal 9999, strategy.execute(nil)
57
- end
58
-
59
- test "it fails to create a custom strategy for a proc with no parameters" do
60
- assert_raise(Exception) do
61
- VersionCake::ExtractionStrategy.lookup(lambda{})
62
- end
63
- end
64
-
65
- test "it raises error when no strategy is found" do
66
- assert_raise(Exception) do
67
- VersionCake::ExtractionStrategy.lookup(:fake_extraction)
68
- end
69
- end
70
- end