Skip to content

Commit 53112f9

Browse files
authored
Merge pull request #43 from zhandao/header_obj
Support for definiting headers to Response Object
2 parents 1bc5603 + b0d4326 commit 53112f9

File tree

8 files changed

+78
-9
lines changed

8 files changed

+78
-9
lines changed

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,22 @@
22

33
## [Unreleased]
44

5+
## [2.1.0] - 2019/2/16 - [view diff](https://github.com/zhandao/zero-rails_openapi/compare/v2.0.3...v2.1.0)
6+
7+
See: [PR #43](https://github.com/zhandao/zero-rails_openapi/pull/43)
8+
9+
### Added
10+
11+
Headers in Response Object ([issued by @drjonnicholson](https://github.com/zhandao/zero-rails_openapi/issues/42))
12+
13+
## [2.0.0 - 2.0.3] - 2019/2/12 - [view diff](https://github.com/zhandao/zero-rails_openapi/compare/v1.7.0...v2.0.3)
14+
15+
See: [PR #35](https://github.com/zhandao/zero-rails_openapi/pull/35)
16+
17+
1. Totally refactoring
18+
2. README rewritten
19+
3. Removed Or Changed uncommonly used features
20+
521
## [1.7.0] - 2018/12/17 - [view diff](https://github.com/zhandao/zero-rails_openapi/compare/v1.6.1...v1.7.0)
622

723
### Added

lib/oas_objs/header_obj.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# frozen_string_literal: true
2+
3+
require 'oas_objs/helpers'
4+
5+
module OpenApi
6+
module DSL
7+
# https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#header-object
8+
class HeaderObj < Hash
9+
include Helpers
10+
11+
attr_accessor :processed, :schema
12+
13+
def initialize(desc = '', schema)
14+
self.schema = SchemaObj.new(schema)
15+
self.processed = { description: desc }
16+
end
17+
18+
def process
19+
schema.process
20+
processed.merge!(schema: schema)
21+
end
22+
end
23+
end
24+
end
25+
26+
27+
__END__
28+
29+
Header Object Example
30+
31+
{
32+
"description": "The number of allowed requests in the current period",
33+
"schema": {
34+
"type": "integer"
35+
}
36+
}

lib/oas_objs/response_obj.rb

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,29 @@ module DSL
99
class ResponseObj < Hash
1010
include Helpers
1111

12-
attr_accessor :processed, :media_types
12+
attr_accessor :processed, :media_types, :headers
13+
1314
def initialize(desc)
1415
self.media_types = [ ]
16+
self.headers = { }
1517
self.processed = { description: desc }
1618
end
1719

18-
def absorb(desc, media_type, hash)
20+
def absorb(desc, media_type, headers: { }, **media_hash)
1921
self.processed[:description] = desc if desc.present?
20-
media_types << MediaTypeObj.new(media_type, hash)
22+
self.headers.merge!(headers)
23+
media_types << MediaTypeObj.new(media_type, media_hash)
2124
self
2225
end
2326

2427
def process
2528
content = media_types.map(&:process).reduce({ }, &fusion)
2629
processed[:content] = content if content.present?
30+
_headers = headers.map do |name, schema|
31+
schema = schema.is_a?(Hash) ? schema : { type: schema }
32+
[ name, HeaderObj.new(schema.delete(:desc), schema).process ]
33+
end.to_h
34+
processed[:headers] = _headers if _headers.present?
2735
processed
2836
end
2937
end
@@ -49,4 +57,4 @@ def process
4957
}
5058
}
5159
}
52-
}
60+
}

lib/open_api/dsl/api.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ def data name, type = nil, schema = { }
9595
form data: { name => schema }
9696
end
9797

98-
def response code, desc, media_type = nil, data: { }, **options
99-
(self[:responses][code] ||= ResponseObj.new(desc)).absorb(desc, media_type, { data: data, **options })
98+
def response code, desc, media_type = nil, headers: { }, data: { }, **options
99+
(self[:responses][code] ||= ResponseObj.new(desc)).absorb(desc, media_type, headers: headers, data: data, **options)
100100
end
101101

102102
alias_method :resp, :response

lib/open_api/dsl/components.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ def request_body component_key, required, media_type, data: { }, desc: '', **opt
4949
arrow_enable :body
5050
arrow_enable :body!
5151

52-
def response component_key, desc, media_type = nil, data: { }, **options
53-
(self[:responses][component_key] ||= ResponseObj.new(desc)).absorb(desc, media_type, { data: data, **options })
52+
def response component_key, desc, media_type = nil, headers: { }, data: { }, **options
53+
(self[:responses][component_key] ||= ResponseObj.new(desc)).absorb(desc, media_type, headers: headers, data: data, **options)
5454
end
5555

5656
alias_method :resp, :response

lib/open_api/dsl/helpers.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
require 'oas_objs/ref_obj'
99
require 'oas_objs/example_obj'
1010
require 'oas_objs/callback_obj'
11+
require 'oas_objs/header_obj'
1112

1213
module OpenApi
1314
module DSL

lib/open_api/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# frozen_string_literal: true
22

33
module OpenApi
4-
VERSION = '2.0.3'
4+
VERSION = '2.1.0'
55
end

spec/api_spec.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,14 @@
186186
expect_its :description, eq: 'invalid token'
187187
expect_its :content, has_keys: { 'application/json': [ schema: [:title] ] }
188188

189+
context 'when passing headers' do
190+
api -> do
191+
response :success, 'succ', :json, headers: { 'X-Request-Start': String }, data: { }
192+
end, has_key!: :success
193+
focus_on :success
194+
expect_its :headers, has_key: :'X-Request-Start'
195+
end
196+
189197
context 'when re-calling through the same code and media-type' do
190198
api -> do
191199
response :success, 'success desc1', :json, data: { name: String }

0 commit comments

Comments
 (0)