Skip to content

Commit c85ece0

Browse files
committed
Define methods dynamically. Evaluate error_headers at initialization. Simplify potential_versions.
1 parent 2dd0bd9 commit c85ece0

File tree

4 files changed

+27
-45
lines changed

4 files changed

+27
-45
lines changed

lib/grape/middleware/versioner/accept_version_header.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ module Versioner
1919
class AcceptVersionHeader < Base
2020
def before
2121
potential_version = env['HTTP_ACCEPT_VERSION'].try(:scrub)
22-
not_acceptable!('Accept-Version header must be set.') if strict? && potential_version.blank?
22+
not_acceptable!('Accept-Version header must be set.') if strict && potential_version.blank?
2323

2424
return if potential_version.blank?
2525

lib/grape/middleware/versioner/base.rb

Lines changed: 23 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -6,67 +6,49 @@ module Versioner
66
class Base < Grape::Middleware::Base
77
DEFAULT_OPTIONS = {
88
pattern: /.*/i,
9+
prefix: nil,
10+
mount_path: nil,
911
version_options: {
1012
strict: false,
1113
cascade: true,
12-
parameter: 'apiver'
14+
parameter: 'apiver',
15+
vendor: nil
1316
}.freeze
1417
}.freeze
1518

16-
def self.inherited(klass)
17-
super
18-
Versioner.register(klass)
19-
end
20-
21-
def versions
22-
options[:versions]
23-
end
24-
25-
def prefix
26-
options[:prefix]
27-
end
28-
29-
def mount_path
30-
options[:mount_path]
31-
end
19+
CASCADE_PASS_HEADER = { 'X-Cascade' => 'pass' }.freeze
3220

33-
def pattern
34-
options[:pattern]
21+
DEFAULT_OPTIONS.each_key do |key|
22+
define_method key do
23+
options[key]
24+
end
3525
end
3626

37-
def version_options
38-
options[:version_options]
27+
DEFAULT_OPTIONS[:version_options].each_key do |key|
28+
define_method key do
29+
options[:version_options][key]
30+
end
3931
end
4032

41-
def strict?
42-
version_options[:strict]
43-
end
44-
45-
# By default those errors contain an `X-Cascade` header set to `pass`, which allows nesting and stacking
46-
# of routes (see Grape::Router) for more information). To prevent
47-
# this behavior, and not add the `X-Cascade` header, one can set the `:cascade` option to `false`.
48-
def cascade?
49-
version_options[:cascade]
50-
end
51-
52-
def parameter_key
53-
version_options[:parameter]
33+
def self.inherited(klass)
34+
super
35+
Versioner.register(klass)
5436
end
5537

56-
def vendor
57-
version_options[:vendor]
58-
end
38+
attr_reader :error_headers, :versions
5939

60-
def error_headers
61-
cascade? ? { 'X-Cascade' => 'pass' } : {}
40+
def initialize(app, **options)
41+
super
42+
@error_headers = cascade ? CASCADE_PASS_HEADER : {}
43+
@versions = options[:versions]&.map(&:to_s) # making sure versions are strings to easy potential match
6244
end
6345

6446
def potential_version_match?(potential_version)
65-
versions.blank? || versions.any? { |v| v.to_s == potential_version }
47+
versions.blank? || versions.include?(potential_version)
6648
end
6749

6850
def version_not_found!
69-
throw :error, status: 404, message: '404 API Version Not Found', headers: { 'X-Cascade' => 'pass' }
51+
throw :error, status: 404, message: '404 API Version Not Found', headers: CASCADE_PASS_HEADER
7052
end
7153
end
7254
end

lib/grape/middleware/versioner/header.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def accept_header
5353
end
5454

5555
def strict_header_checks!
56-
return unless strict?
56+
return unless strict
5757

5858
accept_header_check!
5959
version_and_vendor_check!

lib/grape/middleware/versioner/param.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ module Versioner
2020
# env['api.version'] => 'v1'
2121
class Param < Base
2222
def before
23-
potential_version = query_params[parameter_key]
23+
potential_version = query_params[parameter]
2424
return if potential_version.blank?
2525

2626
version_not_found! unless potential_version_match?(potential_version)
27-
env[Grape::Env::API_VERSION] = env[Rack::RACK_REQUEST_QUERY_HASH].delete(parameter_key)
27+
env[Grape::Env::API_VERSION] = env[Rack::RACK_REQUEST_QUERY_HASH].delete(parameter)
2828
end
2929
end
3030
end

0 commit comments

Comments
 (0)