@@ -6,67 +6,49 @@ module Versioner
6
6
class Base < Grape ::Middleware ::Base
7
7
DEFAULT_OPTIONS = {
8
8
pattern : /.*/i ,
9
+ prefix : nil ,
10
+ mount_path : nil ,
9
11
version_options : {
10
12
strict : false ,
11
13
cascade : true ,
12
- parameter : 'apiver'
14
+ parameter : 'apiver' ,
15
+ vendor : nil
13
16
} . freeze
14
17
} . freeze
15
18
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
32
20
33
- def pattern
34
- options [ :pattern ]
21
+ DEFAULT_OPTIONS . each_key do |key |
22
+ define_method key do
23
+ options [ key ]
24
+ end
35
25
end
36
26
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
39
31
end
40
32
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 )
54
36
end
55
37
56
- def vendor
57
- version_options [ :vendor ]
58
- end
38
+ attr_reader :error_headers , :versions
59
39
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
62
44
end
63
45
64
46
def potential_version_match? ( potential_version )
65
- versions . blank? || versions . any? { | v | v . to_s == potential_version }
47
+ versions . blank? || versions . include? ( potential_version )
66
48
end
67
49
68
50
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
70
52
end
71
53
end
72
54
end
0 commit comments