rspec-document_requests 1.2.1 → 1.3.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.
- 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
|