versioncake 2.5.0 → 3.0.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 (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