rspec-document_requests 1.2.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +58 -3
- data/lib/rspec/document_requests/configuration.rb +1 -0
- data/lib/rspec/document_requests/dsl.rb +13 -11
- data/lib/rspec/document_requests/request.rb +28 -30
- data/lib/rspec/document_requests/version.rb +1 -1
- data/lib/rspec/document_requests/writers/markdown.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4fedfef2a8965ead1fee4d9cb58371e3ea061814
|
4
|
+
data.tar.gz: f6712172151b7e9ba4a8c8897ccfdcfd4c25c5df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50c3b3868f1a0a7c32851ddab4eba661901ff0a7675ebbc50d34b9854396ccff66939f50a23fd3378d051b3f028d6668c19a9d350758da37600a1eb3390368ec
|
7
|
+
data.tar.gz: 4fc2781de76cc5ed2fdda452a19079604e95a20dcac27023d96b2da05de2aed597bb1283fd4f6b9084fc98cd229ad2e5b03df6acd1ee5a816b142de6624996c3
|
data/README.md
CHANGED
@@ -104,8 +104,8 @@ RSpec.describe "Session resource", type: :request, doc: true do
|
|
104
104
|
before do
|
105
105
|
explain do
|
106
106
|
request do # No request explanation
|
107
|
-
parameter 'session[username]', "The username", required: true,
|
108
|
-
parameter 'session[password]',
|
107
|
+
parameter 'session[username]', "The username", required: true, type: 'string'
|
108
|
+
parameter 'session[password]', required: "when not SSO", type: 'string' # No explanation
|
109
109
|
header 'Content-Type', ... # you get the point
|
110
110
|
end
|
111
111
|
response do # No response explanation
|
@@ -124,6 +124,46 @@ end
|
|
124
124
|
**NOTE:** Explaining response parameters only works when this gem can
|
125
125
|
parse the response body, see [here](#configuration) how to configure it.
|
126
126
|
|
127
|
+
### Reference
|
128
|
+
|
129
|
+
#### Example Group Metadatas
|
130
|
+
|
131
|
+
(The hash you pass to `describe`/`context`).
|
132
|
+
|
133
|
+
| Symbol | Meaning |
|
134
|
+
|---------------|---------|
|
135
|
+
| `doc` | When set to `true`, all requests in the example group (`describe`/`context`) are automatically documented. Use `doc: false` to override a parent example group. |
|
136
|
+
| `explanation` | When set, this will be written below the title of the example group (`describe`/`context`) (depending on the writer). Use this to further explain the meaning of the request in your API. **NOTE:** grouped example groups (see `group_levels`) will not show their explanation in the default markdown writer. |
|
137
|
+
|
138
|
+
#### DSL
|
139
|
+
|
140
|
+
These functions are available from within your example (inside the `it`, `specify`, `before`, `after`, `around`).
|
141
|
+
|
142
|
+
**NOTE:** This is only available inside example groups that have the `doc: true` metadata.
|
143
|
+
|
144
|
+
| Method | Meaning |
|
145
|
+
|-------------------|---------|
|
146
|
+
| `nodoc` | Skips documentation for the rest of this example. When given a block, only skips requests made inside the block. Use this to skip specific requests that are used to prepare the request, or use the `doc: false` metadata on the entire example group. |
|
147
|
+
| `explain`| Receives a block in which you can explain your request and its response. Inside the block, see [Explain Block](#explain-block). |
|
148
|
+
|
149
|
+
##### Explain Block
|
150
|
+
|
151
|
+
These methods are used inside the block passed to `explain`.
|
152
|
+
|
153
|
+
| Method | Meaning |
|
154
|
+
|------------|---------|
|
155
|
+
| `request` | Receives an optional parameter that describes the meaning of this request to the entire test sequence. Also receives an optional block, see [Request/Response Block](#requestresponse-block). |
|
156
|
+
| `response` | Receives an optional parameter that describes the meaning of this request's response to the entire test sequence. Also receives an optional block, see [Request/Response Block](#requestresponse-block). |
|
157
|
+
|
158
|
+
###### Request/Response Block
|
159
|
+
|
160
|
+
These methods are used inside the block passed to `request` and `response` within the `explain` block.
|
161
|
+
|
162
|
+
| Method | Meaning |
|
163
|
+
|-------------|---------|
|
164
|
+
| `parameter` | Receives a string that is the name of the parameter, use `[]` for nested arrays & objects. Receives an additional optional string that describes the parameter, and a hash with these optional keys: `:required`, and `:type`. **NOTE:** This only works in response when the response is parsed, see [Configuration's](#configuration) `response_parser` to make sure it does. |
|
165
|
+
| `header` | Receives a string that is the name of the header, use `[]` for nested arrays & objects. Receives an additional optional string that describes the header, and a hash with these optional keys: `:required`, and `:type`. |
|
166
|
+
|
127
167
|
### Configuration
|
128
168
|
|
129
169
|
These are the possible configurations:
|
@@ -153,12 +193,26 @@ RSpec::DocumentRequests.configure do |config|
|
|
153
193
|
end
|
154
194
|
}
|
155
195
|
|
196
|
+
# Request parameters
|
156
197
|
config.include_request_parameters = nil # nil means not used
|
157
198
|
config.exclude_request_parameters = []
|
158
199
|
config.hide_request_parameters = [] # Displays '...' instead of actual value
|
200
|
+
config.enforce_explain_request_parameters = false # Raise error if an unexplained included parameter is used
|
201
|
+
# Request headers
|
202
|
+
config.include_request_headers = nil # nil means not used
|
203
|
+
config.exclude_request_headers = []
|
204
|
+
config.hide_request_headers = [] # Displays '...' instead of actual value
|
205
|
+
config.enforce_explain_request_headers = false
|
206
|
+
# Response parameters
|
159
207
|
config.include_response_parameters = nil
|
160
208
|
config.exclude_response_parameters = []
|
161
209
|
config.hide_response_parameters = []
|
210
|
+
config.enforce_explain_response_parameters = false
|
211
|
+
# Response headers
|
212
|
+
config.include_response_headers = nil
|
213
|
+
config.exclude_response_headers = []
|
214
|
+
config.hide_response_headers = []
|
215
|
+
config.enforce_explain_response_headers = false
|
162
216
|
end
|
163
217
|
```
|
164
218
|
|
@@ -236,7 +290,8 @@ The gem works, but it's missing some basics:
|
|
236
290
|
|
237
291
|
* Unit tests (specs).
|
238
292
|
* Example generated documentations.
|
239
|
-
* More writers (see
|
293
|
+
* More writers (see [lib/rspec/document_requests/writers/base.rb](lib/rspec/document_requests/writers/base.rb)).
|
294
|
+
* More default response parsers (see [lib/rspec/document_requests/configuration.rb](lib/rspec/document_requests/configuration.rb)).
|
240
295
|
|
241
296
|
So...
|
242
297
|
|
@@ -2,19 +2,18 @@ module RSpec
|
|
2
2
|
module DocumentRequests
|
3
3
|
module DSL
|
4
4
|
class << self
|
5
|
-
attr_accessor :documented_requests
|
5
|
+
attr_accessor :documented_requests
|
6
6
|
end
|
7
7
|
self.documented_requests = []
|
8
|
-
self.currently_documented_example = nil
|
9
8
|
|
10
9
|
[:get, :post, :patch, :put, :delete, :head].each do |method|
|
11
10
|
define_method(method) do |path, parameters = nil, headers_or_env = nil|
|
12
11
|
result = super(path, parameters, headers_or_env)
|
13
12
|
|
14
|
-
if not @
|
13
|
+
if not @document_requests_prevented and @currently_documented_example
|
15
14
|
DSL.documented_requests << Request.new(
|
16
15
|
explanation: document_request_explanation,
|
17
|
-
example:
|
16
|
+
example: @currently_documented_example,
|
18
17
|
method: method.to_s.upcase,
|
19
18
|
path: path,
|
20
19
|
request_parameters: parameters,
|
@@ -37,11 +36,14 @@ module RSpec
|
|
37
36
|
end
|
38
37
|
|
39
38
|
def nodoc
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
39
|
+
was_prevented = @document_requests_prevented
|
40
|
+
@document_requests_prevented = true
|
41
|
+
if block_given?
|
42
|
+
begin
|
43
|
+
yield
|
44
|
+
ensure
|
45
|
+
@document_requests_prevented = false if not was_prevented
|
46
|
+
end
|
45
47
|
end
|
46
48
|
end
|
47
49
|
end
|
@@ -54,8 +56,8 @@ RSpec.configure do |config|
|
|
54
56
|
config.run_all_when_everything_filtered = false
|
55
57
|
|
56
58
|
config.after(:suite) { RSpec::DocumentRequests::Builder.new }
|
57
|
-
config.before { |ex|
|
58
|
-
config.after { |ex|
|
59
|
+
config.before(doc: true) { |ex| @currently_documented_example = ex }
|
60
|
+
config.after(doc: true) { |ex| @currently_documented_example = nil }
|
59
61
|
end
|
60
62
|
|
61
63
|
config.include RSpec::DocumentRequests::DSL, doc: true
|
@@ -2,12 +2,13 @@ module RSpec
|
|
2
2
|
module DocumentRequests
|
3
3
|
class Request
|
4
4
|
class Parameter
|
5
|
-
attr_accessor :message, :required, :type, :value
|
6
|
-
def initialize(message = nil, required: false, type: nil, value: nil)
|
5
|
+
attr_accessor :message, :required, :type, :value, :generated
|
6
|
+
def initialize(message = nil, required: false, type: nil, value: nil, generated: false)
|
7
7
|
@message = message
|
8
8
|
@required = required
|
9
9
|
@type = type
|
10
10
|
@value = value
|
11
|
+
@generated = generated
|
11
12
|
end
|
12
13
|
end
|
13
14
|
|
@@ -33,46 +34,41 @@ module RSpec
|
|
33
34
|
|
34
35
|
private
|
35
36
|
|
36
|
-
def
|
37
|
-
|
38
|
-
|
39
|
-
next values if values.nil?
|
37
|
+
def filter_values(name)
|
38
|
+
values = instance_variable_get(:"@#{name}")
|
39
|
+
return values if values.nil?
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
included_values = DocumentRequests.configuration.send(:"include_#{name}")
|
42
|
+
excluded_values = DocumentRequests.configuration.send(:"exclude_#{name}")
|
43
|
+
hidden_values = DocumentRequests.configuration.send(:"hide_#{name}")
|
44
|
+
enforce = DocumentRequests.configuration.send(:"enforce_explain_#{name}")
|
44
45
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
unexplained = []
|
47
|
+
values.select! do |k, v|
|
48
|
+
next false if included_values and included_values.exclude?(k)
|
49
|
+
next false if excluded_values.include?(k)
|
50
|
+
unexplained << k if v.generated
|
51
|
+
v.value = "..." if hidden_values.include?(k)
|
52
|
+
true
|
52
53
|
end
|
54
|
+
raise "Unexplained parameters used: #{unexplained.join(", ")}" if enforce and unexplained.any?
|
55
|
+
values
|
53
56
|
end
|
54
57
|
|
55
|
-
public
|
56
|
-
|
57
|
-
filter_values :request_parameters
|
58
|
-
filter_values :request_headers
|
59
|
-
filter_values :response_parameters
|
60
|
-
filter_values :response_headers
|
61
|
-
|
62
|
-
private
|
63
|
-
|
64
58
|
def process_request_parameters(parameters, prefix: nil)
|
65
59
|
@request_parameters = {}
|
66
60
|
process_parameters(parameters, @request_parameters, explanation: @explanation.request.parameters)
|
61
|
+
filter_values :request_parameters
|
67
62
|
end
|
68
63
|
|
69
64
|
def process_request_headers(headers)
|
70
65
|
@request_headers = {}
|
71
66
|
headers.each do |name, value|
|
72
|
-
@request_headers[name] = @explanation.request.headers[name] || Parameter.new
|
67
|
+
@request_headers[name] = @explanation.request.headers[name] || Parameter.new(generated: true)
|
73
68
|
@request_headers[name].value = value
|
74
69
|
end
|
75
70
|
@explanation.request.headers.each { |name, header| @request_headers[name] ||= header }
|
71
|
+
filter_values :request_headers
|
76
72
|
end
|
77
73
|
|
78
74
|
def process_response_parameters(parameters = nil)
|
@@ -81,20 +77,22 @@ module RSpec
|
|
81
77
|
@response_parameters = {}
|
82
78
|
process_parameters(@parsed_response, @response_parameters, explanation: @explanation.response.parameters)
|
83
79
|
end
|
80
|
+
filter_values :response_parameters
|
84
81
|
end
|
85
82
|
|
86
83
|
def process_response_headers
|
87
84
|
@response_headers = {}
|
88
85
|
@response.headers.each do |name, value|
|
89
|
-
@response_headers[name] = @explanation.response.headers[name] || Parameter.new
|
86
|
+
@response_headers[name] = @explanation.response.headers[name] || Parameter.new(generated: true)
|
90
87
|
@response_headers[name].value = value
|
91
88
|
end
|
92
89
|
@explanation.response.headers.each { |name, header| @response_headers[name] ||= header }
|
90
|
+
filter_values :response_headers
|
93
91
|
end
|
94
92
|
|
95
93
|
def process_parameters(input, output, explanation:, prefix: nil)
|
96
94
|
input.each do |key, value|
|
97
|
-
name = prefix ? "#{prefix}[#{key}]" : key
|
95
|
+
name = prefix ? "#{prefix}[#{key}]" : key.to_s
|
98
96
|
case value
|
99
97
|
when Hash
|
100
98
|
process_parameters(value, output, explanation: explanation, prefix: name)
|
@@ -110,11 +108,11 @@ module RSpec
|
|
110
108
|
end
|
111
109
|
end
|
112
110
|
if base_values.any?
|
113
|
-
output[name] ||= explanation[name] || Parameter.new
|
111
|
+
output[name] ||= explanation[name] || Parameter.new(generated: true)
|
114
112
|
output[name].value = [output[name].value, base_values.to_s].compact.join(", ")
|
115
113
|
end
|
116
114
|
else
|
117
|
-
output[name] ||= explanation[name] || Parameter.new
|
115
|
+
output[name] ||= explanation[name] || Parameter.new(generated: true)
|
118
116
|
output[name].value = [output[name].value, value].compact.join(", ")
|
119
117
|
end
|
120
118
|
end
|
@@ -44,7 +44,7 @@ module RSpec
|
|
44
44
|
@file.puts "| Name | Type | Required? | Value | |"
|
45
45
|
@file.puts "|------|------|-----------|-------|---|"
|
46
46
|
parameters.each do |name, parameter|
|
47
|
-
@file.puts "| #{name} | #{parameter.type} | #{
|
47
|
+
@file.puts "| #{name} | #{parameter.type} | #{parameter.required || false} | #{parameter.value} | #{parameter.message} |"
|
48
48
|
end
|
49
49
|
@file.puts
|
50
50
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-document_requests
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oded Niv
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec-rails
|