redsnow 0.2.0 → 0.2.1
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/CHANGELOG.md +3 -1
- data/README.md +12 -0
- data/ext/snowcrash/bin/snowcrash +0 -0
- data/ext/snowcrash/ext/markdown-parser/ext/sundown/src/markdown.c +5 -2
- data/ext/snowcrash/snowcrash.gyp +7 -2
- data/ext/snowcrash/src/ActionParser.h +141 -81
- data/ext/snowcrash/src/AssetParser.h +19 -11
- data/ext/snowcrash/src/Blueprint.h +44 -14
- data/ext/snowcrash/src/BlueprintParser.h +65 -51
- data/ext/snowcrash/src/BlueprintSourcemap.h +254 -0
- data/ext/snowcrash/src/BlueprintUtility.h +3 -24
- data/ext/snowcrash/src/CBlueprint.cc +40 -31
- data/ext/snowcrash/src/CBlueprint.h +54 -58
- data/ext/snowcrash/src/CBlueprintSourcemap.cc +620 -0
- data/ext/snowcrash/src/CBlueprintSourcemap.h +342 -0
- data/ext/snowcrash/src/CSourceAnnotation.cc +14 -0
- data/ext/snowcrash/src/CodeBlockUtility.h +42 -5
- data/ext/snowcrash/src/HeadersParser.h +84 -42
- data/ext/snowcrash/src/ParameterParser.h +110 -68
- data/ext/snowcrash/src/ParametersParser.h +26 -28
- data/ext/snowcrash/src/PayloadParser.h +164 -83
- data/ext/snowcrash/src/ResourceGroupParser.h +35 -41
- data/ext/snowcrash/src/ResourceParser.h +142 -97
- data/ext/snowcrash/src/SectionParser.h +15 -14
- data/ext/snowcrash/src/SectionParserData.h +11 -2
- data/ext/snowcrash/src/SectionProcessor.h +42 -18
- data/ext/snowcrash/src/Serialize.cc +2 -0
- data/ext/snowcrash/src/Serialize.h +3 -1
- data/ext/snowcrash/src/SerializeJSON.cc +608 -16
- data/ext/snowcrash/src/SerializeJSON.h +4 -1
- data/ext/snowcrash/src/SerializeYAML.cc +367 -19
- data/ext/snowcrash/src/SerializeYAML.h +4 -1
- data/ext/snowcrash/src/SymbolTable.h +12 -1
- data/ext/snowcrash/src/ValuesParser.h +12 -11
- data/ext/snowcrash/src/Version.h +1 -1
- data/ext/snowcrash/src/csnowcrash.cc +7 -3
- data/ext/snowcrash/src/csnowcrash.h +4 -2
- data/ext/snowcrash/src/snowcrash.cc +10 -11
- data/ext/snowcrash/src/snowcrash.h +3 -3
- data/ext/snowcrash/src/snowcrash/snowcrash.cc +38 -8
- data/ext/snowcrash/tools/homebrew/snowcrash.rb +1 -1
- data/lib/redsnow.rb +41 -2
- data/lib/redsnow/binding.rb +93 -8
- data/lib/redsnow/blueprint.rb +48 -25
- data/lib/redsnow/parseresult.rb +9 -2
- data/lib/redsnow/sourcemap.rb +369 -0
- data/lib/redsnow/version.rb +1 -1
- data/test/fixtures/sample-api-ast.json +1 -1
- data/test/fixtures/sample-api-sourcemap.json +169 -0
- data/test/redsnow_binding_test.rb +19 -2
- data/test/redsnow_options_test.rb +42 -0
- data/test/redsnow_parseresult_test.rb +5 -1
- data/test/redsnow_test.rb +5 -0
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee23a2d43da39feb6ca4e0238652fb4ab3233975
|
4
|
+
data.tar.gz: b9f182cffddcd81c49b515c8b033f4d84f7a3f64
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d6f68de2038028753baffa195aeea9e85d4cf020a3013a330259ca467009b1af0423642bd2464278198a50002edaae6752c8a16d78fe0a431f23fbfb819f848
|
7
|
+
data.tar.gz: dc19e0bee08bb8dfc73433a916c2155674ffd048ac231d38aebb4a947e8ab66619f1178659ccc9ebddff4b5428dd45101985f4a91d45379bd36a710e6986c05f
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# Changelog
|
2
|
+
- 0.2.1
|
3
|
+
- Support for source maps [Snow Crash v0.15.0](https://github.com/apiaryio/snowcrash/releases/tag/v0.15.0) and [AST Serialization Format 2.1](https://github.com/apiaryio/api-blueprint-ast/releases/tag/v2.1).
|
2
4
|
- 0.2.0
|
3
|
-
- New Parser Architecture [Snow Crash v0.14.0](https://github.com/apiaryio/snowcrash/releases)
|
5
|
+
- New Parser Architecture [Snow Crash v0.14.0](https://github.com/apiaryio/snowcrash/releases/tag/v0.14.0)
|
4
6
|
- 0.1.6
|
5
7
|
- Fixing problem with submodules in Gem install [IS#25](https://github.com/apiaryio/redsnow/issues/25)
|
6
8
|
- 0.1.5
|
data/README.md
CHANGED
@@ -24,6 +24,18 @@ result = RedSnow::parse('# My API')
|
|
24
24
|
puts result.ast.name
|
25
25
|
```
|
26
26
|
|
27
|
+
## Parsing options
|
28
|
+
|
29
|
+
Options can be number or hash. We support `:requireBlueprintName` and `:exportSourcemap` option.
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
require 'redsnow'
|
33
|
+
|
34
|
+
result = RedSnow::parse('# My API', { :exportSourcemap => true })
|
35
|
+
puts result.ast.name
|
36
|
+
puts result.sourcemap.name
|
37
|
+
```
|
38
|
+
|
27
39
|
## Hacking Redsnow
|
28
40
|
You are welcome to contribute. Use following steps to build & test Redsnow.
|
29
41
|
|
data/ext/snowcrash/bin/snowcrash
CHANGED
Binary file
|
@@ -2622,9 +2622,12 @@ sd_markdown_render(struct buf *ob, const uint8_t *document, size_t doc_size, str
|
|
2622
2622
|
beg += 3;
|
2623
2623
|
|
2624
2624
|
while (beg < doc_size) /* iterating over lines */
|
2625
|
-
if (is_ref(document, beg, doc_size, &end, md->refs))
|
2625
|
+
if (is_ref(document, beg, doc_size, &end, md->refs)) {
|
2626
|
+
if (end > beg)
|
2627
|
+
expand_tabs(text, document + beg, end - beg);
|
2628
|
+
|
2626
2629
|
beg = end;
|
2627
|
-
else { /* skipping to the next line */
|
2630
|
+
} else { /* skipping to the next line */
|
2628
2631
|
end = beg;
|
2629
2632
|
while (end < doc_size && document[end] != '\n' && document[end] != '\r')
|
2630
2633
|
end++;
|
data/ext/snowcrash/snowcrash.gyp
CHANGED
@@ -62,6 +62,8 @@
|
|
62
62
|
'sources': [
|
63
63
|
'src/CBlueprint.cc',
|
64
64
|
'src/CBlueprint.h',
|
65
|
+
'src/CBlueprintSourcemap.cc',
|
66
|
+
'src/CBlueprintSourcemap.h',
|
65
67
|
'src/CSourceAnnotation.cc',
|
66
68
|
'src/CSourceAnnotation.h',
|
67
69
|
'src/HTTP.cc',
|
@@ -88,6 +90,7 @@
|
|
88
90
|
'src/AssetParser.h',
|
89
91
|
'src/Blueprint.h',
|
90
92
|
'src/BlueprintParser.h',
|
93
|
+
'src/BlueprintSourcemap.h',
|
91
94
|
'src/BlueprintUtility.h',
|
92
95
|
'src/CodeBlockUtility.h',
|
93
96
|
'src/HeadersParser.h',
|
@@ -160,7 +163,8 @@
|
|
160
163
|
'src',
|
161
164
|
'src/snowcrash',
|
162
165
|
'ext/markdown-parser/src',
|
163
|
-
'
|
166
|
+
'ext/markdown-parser/ext/sundown/src',
|
167
|
+
'ext/cmdline'
|
164
168
|
],
|
165
169
|
'sources': [
|
166
170
|
'src/snowcrash/snowcrash.cc'
|
@@ -176,7 +180,8 @@
|
|
176
180
|
'include_dirs': [
|
177
181
|
'src',
|
178
182
|
'ext/markdown-parser/src',
|
179
|
-
'
|
183
|
+
'ext/markdown-parser/ext/sundown/src',
|
184
|
+
'ext/cmdline',
|
180
185
|
'test',
|
181
186
|
'test/performance',
|
182
187
|
],
|
@@ -23,9 +23,7 @@ namespace snowcrash {
|
|
23
23
|
/** Named action matching regex */
|
24
24
|
const char* const NamedActionHeaderRegex = "^[[:blank:]]*" SYMBOL_IDENTIFIER "\\[" HTTP_REQUEST_METHOD "]$";
|
25
25
|
|
26
|
-
/** Internal type alias for Collection of Action */
|
27
|
-
typedef Collection<Action>::type Actions;
|
28
|
-
|
26
|
+
/** Internal type alias for Collection iterator of Action */
|
29
27
|
typedef Collection<Action>::const_iterator ActionIterator;
|
30
28
|
|
31
29
|
/** Action Definition Type */
|
@@ -46,17 +44,30 @@ namespace snowcrash {
|
|
46
44
|
const MarkdownNodes& siblings,
|
47
45
|
SectionParserData& pd,
|
48
46
|
SectionLayout& layout,
|
49
|
-
|
50
|
-
Action& out) {
|
47
|
+
ParseResult<Action>& out) {
|
51
48
|
|
52
|
-
actionHTTPMethodAndName(node, out.method, out.name);
|
53
|
-
TrimString(out.name);
|
49
|
+
actionHTTPMethodAndName(node, out.node.method, out.node.name);
|
50
|
+
TrimString(out.node.name);
|
54
51
|
|
55
52
|
mdp::ByteBuffer remainingContent;
|
56
53
|
GetFirstLine(node->text, remainingContent);
|
57
54
|
|
55
|
+
if (pd.exportSourceMap()) {
|
56
|
+
if (!out.node.method.empty()) {
|
57
|
+
out.sourceMap.method.sourceMap = node->sourceMap;
|
58
|
+
}
|
59
|
+
|
60
|
+
if (!out.node.name.empty()) {
|
61
|
+
out.sourceMap.name.sourceMap = node->sourceMap;
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
58
65
|
if (!remainingContent.empty()) {
|
59
|
-
out.description += remainingContent;
|
66
|
+
out.node.description += remainingContent;
|
67
|
+
|
68
|
+
if (pd.exportSourceMap()) {
|
69
|
+
out.sourceMap.description.sourceMap.append(node->sourceMap);
|
70
|
+
}
|
60
71
|
}
|
61
72
|
|
62
73
|
return ++MarkdownNodeIterator(node);
|
@@ -65,50 +76,82 @@ namespace snowcrash {
|
|
65
76
|
static MarkdownNodeIterator processNestedSection(const MarkdownNodeIterator& node,
|
66
77
|
const MarkdownNodes& siblings,
|
67
78
|
SectionParserData& pd,
|
68
|
-
|
69
|
-
Action& out) {
|
79
|
+
ParseResult<Action>& out) {
|
70
80
|
|
71
81
|
SectionType sectionType = pd.sectionContext();
|
72
82
|
MarkdownNodeIterator cur = node;
|
73
|
-
Payload payload;
|
74
83
|
std::stringstream ss;
|
75
84
|
|
76
85
|
mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
|
77
86
|
|
78
87
|
switch (sectionType) {
|
79
88
|
case ParametersSectionType:
|
80
|
-
|
89
|
+
{
|
90
|
+
ParseResult<Parameters> parameters(out.report, out.node.parameters, out.sourceMap.parameters);
|
91
|
+
return ParametersParser::parse(node, siblings, pd, parameters);
|
92
|
+
}
|
81
93
|
|
82
94
|
case RequestSectionType:
|
83
95
|
case RequestBodySectionType:
|
84
|
-
|
96
|
+
{
|
97
|
+
ParseResult<Payload> payload(out.report);
|
98
|
+
cur = PayloadParser::parse(node, siblings, pd, payload);
|
85
99
|
|
86
|
-
if (out.examples.empty() || !out.examples.back().responses.empty()) {
|
100
|
+
if (out.node.examples.empty() || !out.node.examples.back().responses.empty()) {
|
87
101
|
TransactionExample transaction;
|
88
|
-
|
102
|
+
SourceMap<TransactionExample> transactionSM;
|
103
|
+
|
104
|
+
out.node.examples.push_back(transaction);
|
105
|
+
|
106
|
+
if (pd.exportSourceMap()) {
|
107
|
+
out.sourceMap.examples.collection.push_back(transactionSM);
|
108
|
+
}
|
89
109
|
}
|
90
110
|
|
91
|
-
checkPayload(sectionType, sourceMap, payload, out
|
111
|
+
checkPayload(sectionType, sourceMap, payload.node, out);
|
112
|
+
|
113
|
+
out.node.examples.back().requests.push_back(payload.node);
|
114
|
+
|
115
|
+
if (pd.exportSourceMap()) {
|
116
|
+
out.sourceMap.examples.collection.back().requests.collection.push_back(payload.sourceMap);
|
117
|
+
}
|
92
118
|
|
93
|
-
out.examples.back().requests.push_back(payload);
|
94
119
|
break;
|
120
|
+
}
|
95
121
|
|
96
122
|
case ResponseSectionType:
|
97
123
|
case ResponseBodySectionType:
|
98
|
-
|
124
|
+
{
|
125
|
+
ParseResult<Payload> payload(out.report);
|
126
|
+
cur = PayloadParser::parse(node, siblings, pd, payload);
|
99
127
|
|
100
|
-
if (out.examples.empty()) {
|
128
|
+
if (out.node.examples.empty()) {
|
101
129
|
TransactionExample transaction;
|
102
|
-
|
130
|
+
SourceMap<TransactionExample> transactionSM;
|
131
|
+
|
132
|
+
out.node.examples.push_back(transaction);
|
133
|
+
|
134
|
+
if (pd.exportSourceMap()) {
|
135
|
+
out.sourceMap.examples.collection.push_back(transactionSM);
|
136
|
+
}
|
103
137
|
}
|
104
138
|
|
105
|
-
checkPayload(sectionType, sourceMap, payload, out
|
139
|
+
checkPayload(sectionType, sourceMap, payload.node, out);
|
140
|
+
|
141
|
+
out.node.examples.back().responses.push_back(payload.node);
|
142
|
+
|
143
|
+
if (pd.exportSourceMap()) {
|
144
|
+
out.sourceMap.examples.collection.back().responses.collection.push_back(payload.sourceMap);
|
145
|
+
}
|
106
146
|
|
107
|
-
out.examples.back().responses.push_back(payload);
|
108
147
|
break;
|
148
|
+
}
|
109
149
|
|
110
150
|
case HeadersSectionType:
|
111
|
-
|
151
|
+
{
|
152
|
+
ParseResult<Headers> headers(out.report, out.node.headers, out.sourceMap.headers);
|
153
|
+
return SectionProcessor<Action>::handleDeprecatedHeaders(node, siblings, pd, headers);
|
154
|
+
}
|
112
155
|
|
113
156
|
default:
|
114
157
|
break;
|
@@ -120,7 +163,7 @@ namespace snowcrash {
|
|
120
163
|
static bool isUnexpectedNode(const MarkdownNodeIterator& node,
|
121
164
|
SectionType sectionType) {
|
122
165
|
|
123
|
-
if (
|
166
|
+
if (SectionProcessor<Asset>::sectionType(node) != UndefinedSectionType) {
|
124
167
|
return true;
|
125
168
|
}
|
126
169
|
|
@@ -131,18 +174,21 @@ namespace snowcrash {
|
|
131
174
|
const MarkdownNodes& siblings,
|
132
175
|
SectionParserData& pd,
|
133
176
|
SectionType& sectionType,
|
134
|
-
|
135
|
-
Action& out) {
|
177
|
+
ParseResult<Action>& out) {
|
136
178
|
|
137
179
|
if ((node->type == mdp::ParagraphMarkdownNodeType ||
|
138
180
|
node->type == mdp::CodeMarkdownNodeType) &&
|
139
181
|
(sectionType == ResponseBodySectionType ||
|
140
182
|
sectionType == ResponseSectionType) &&
|
141
|
-
!out.examples.empty() &&
|
142
|
-
!out.examples.back().responses.empty()) {
|
183
|
+
!out.node.examples.empty() &&
|
184
|
+
!out.node.examples.back().responses.empty()) {
|
185
|
+
|
186
|
+
mdp::ByteBuffer content = CodeBlockUtility::addDanglingAsset(node, pd, sectionType, out.report, out.node.examples.back().responses.back().body);
|
187
|
+
|
188
|
+
if (pd.exportSourceMap() && !content.empty()) {
|
189
|
+
out.sourceMap.examples.collection.back().responses.collection.back().body.sourceMap.append(node->sourceMap);
|
190
|
+
}
|
143
191
|
|
144
|
-
CodeBlockUtility::addDanglingAsset(node, pd, sectionType, report, out.examples.back().responses.back().body);
|
145
|
-
|
146
192
|
return ++MarkdownNodeIterator(node);
|
147
193
|
}
|
148
194
|
|
@@ -150,11 +196,15 @@ namespace snowcrash {
|
|
150
196
|
node->type == mdp::CodeMarkdownNodeType) &&
|
151
197
|
(sectionType == RequestBodySectionType ||
|
152
198
|
sectionType == RequestSectionType) &&
|
153
|
-
!out.examples.empty() &&
|
154
|
-
!out.examples.back().requests.empty()) {
|
155
|
-
|
156
|
-
CodeBlockUtility::addDanglingAsset(node, pd, sectionType, report, out.examples.back().requests.back().body);
|
199
|
+
!out.node.examples.empty() &&
|
200
|
+
!out.node.examples.back().requests.empty()) {
|
157
201
|
|
202
|
+
mdp::ByteBuffer content = CodeBlockUtility::addDanglingAsset(node, pd, sectionType, out.report, out.node.examples.back().requests.back().body);
|
203
|
+
|
204
|
+
if (pd.exportSourceMap() && !content.empty()) {
|
205
|
+
out.sourceMap.examples.collection.back().requests.collection.back().body.sourceMap.append(node->sourceMap);
|
206
|
+
}
|
207
|
+
|
158
208
|
return ++MarkdownNodeIterator(node);
|
159
209
|
}
|
160
210
|
|
@@ -169,14 +219,14 @@ namespace snowcrash {
|
|
169
219
|
ss << "Ignoring " << SectionName(assetType) << " list item, ";
|
170
220
|
ss << SectionName(assetType) << " list item is expected to be indented by 4 spaces or 1 tab";
|
171
221
|
|
172
|
-
report.warnings.push_back(Warning(ss.str(),
|
173
|
-
|
174
|
-
|
222
|
+
out.report.warnings.push_back(Warning(ss.str(),
|
223
|
+
IgnoringWarning,
|
224
|
+
sourceMap));
|
175
225
|
|
176
226
|
return ++MarkdownNodeIterator(node);
|
177
227
|
}
|
178
228
|
|
179
|
-
return SectionProcessorBase<Action>::processUnexpectedNode(node, siblings, pd, sectionType,
|
229
|
+
return SectionProcessorBase<Action>::processUnexpectedNode(node, siblings, pd, sectionType, out);
|
180
230
|
}
|
181
231
|
|
182
232
|
static SectionType sectionType(const MarkdownNodeIterator& node) {
|
@@ -242,40 +292,43 @@ namespace snowcrash {
|
|
242
292
|
|
243
293
|
static void finalize(const MarkdownNodeIterator& node,
|
244
294
|
SectionParserData& pd,
|
245
|
-
|
246
|
-
|
295
|
+
ParseResult<Action>& out) {
|
296
|
+
|
297
|
+
if (!out.node.headers.empty()) {
|
247
298
|
|
248
|
-
|
299
|
+
SectionProcessor<Headers>::injectDeprecatedHeaders(pd, out.node.headers, out.sourceMap.headers, out.node.examples, out.sourceMap.examples);
|
300
|
+
out.node.headers.clear();
|
249
301
|
|
250
|
-
|
251
|
-
|
302
|
+
if (pd.exportSourceMap()) {
|
303
|
+
out.sourceMap.headers.collection.clear();
|
304
|
+
}
|
252
305
|
}
|
253
306
|
|
254
|
-
if (out.examples.empty()) {
|
307
|
+
if (out.node.examples.empty()) {
|
255
308
|
|
256
309
|
// WARN: No response for action
|
257
310
|
mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
|
258
|
-
report.warnings.push_back(Warning("action is missing a response",
|
259
|
-
|
260
|
-
|
261
|
-
} else if (!out.examples.empty() &&
|
262
|
-
!out.examples.back().requests.empty() &&
|
263
|
-
out.examples.back().responses.empty()) {
|
311
|
+
out.report.warnings.push_back(Warning("action is missing a response",
|
312
|
+
EmptyDefinitionWarning,
|
313
|
+
sourceMap));
|
314
|
+
} else if (!out.node.examples.empty() &&
|
315
|
+
!out.node.examples.back().requests.empty() &&
|
316
|
+
out.node.examples.back().responses.empty()) {
|
264
317
|
|
265
318
|
// WARN: No response for request
|
266
319
|
std::stringstream ss;
|
267
320
|
ss << "action is missing a response for ";
|
268
321
|
|
269
|
-
if (out.examples.back().requests.back().name.empty()) {
|
322
|
+
if (out.node.examples.back().requests.back().name.empty()) {
|
270
323
|
ss << "a request";
|
271
324
|
} else {
|
272
|
-
ss << "the '" << out.examples.back().requests.back().name << "' request";
|
325
|
+
ss << "the '" << out.node.examples.back().requests.back().name << "' request";
|
273
326
|
}
|
274
327
|
|
275
328
|
mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
|
276
|
-
report.warnings.push_back(Warning(ss.str(),
|
277
|
-
|
278
|
-
|
329
|
+
out.report.warnings.push_back(Warning(ss.str(),
|
330
|
+
EmptyDefinitionWarning,
|
331
|
+
sourceMap));
|
279
332
|
}
|
280
333
|
}
|
281
334
|
|
@@ -290,19 +343,18 @@ namespace snowcrash {
|
|
290
343
|
static void checkPayload(SectionType sectionType,
|
291
344
|
const mdp::CharactersRangeSet sourceMap,
|
292
345
|
const Payload& payload,
|
293
|
-
|
294
|
-
Report& report) {
|
346
|
+
ParseResult<Action>& out) {
|
295
347
|
|
296
|
-
if (isPayloadDuplicate(sectionType, payload,
|
348
|
+
if (isPayloadDuplicate(sectionType, payload, out.node.examples.back())) {
|
297
349
|
|
298
350
|
// WARN: Duplicate payload
|
299
351
|
std::stringstream ss;
|
300
352
|
ss << SectionName(sectionType) << " payload `" << payload.name << "`";
|
301
|
-
ss << " already defined for `" <<
|
353
|
+
ss << " already defined for `" << out.node.method << "` method";
|
302
354
|
|
303
|
-
report.warnings.push_back(Warning(ss.str(),
|
304
|
-
|
305
|
-
|
355
|
+
out.report.warnings.push_back(Warning(ss.str(),
|
356
|
+
DuplicateWarning,
|
357
|
+
sourceMap));
|
306
358
|
}
|
307
359
|
|
308
360
|
if (sectionType == ResponseSectionType || sectionType == ResponseBodySectionType) {
|
@@ -313,27 +365,27 @@ namespace snowcrash {
|
|
313
365
|
std::stringstream(payload.name) >> code;
|
314
366
|
}
|
315
367
|
|
316
|
-
HTTPMethodTraits methodTraits = GetMethodTrait(
|
368
|
+
HTTPMethodTraits methodTraits = GetMethodTrait(out.node.method);
|
317
369
|
|
318
370
|
if (!methodTraits.allowBody && !payload.body.empty()) {
|
319
371
|
|
320
372
|
// WARN: Edge case for 2xx CONNECT
|
321
|
-
if (
|
373
|
+
if (out.node.method == HTTPMethodName::Connect && code/100 == 2) {
|
322
374
|
|
323
375
|
std::stringstream ss;
|
324
|
-
ss << "the response for " << code << " " <<
|
376
|
+
ss << "the response for " << code << " " << out.node.method << " request MUST NOT include a " << SectionName(BodySectionType);
|
325
377
|
|
326
|
-
report.warnings.push_back(Warning(ss.str(),
|
327
|
-
|
328
|
-
|
329
|
-
} else if (
|
378
|
+
out.report.warnings.push_back(Warning(ss.str(),
|
379
|
+
EmptyDefinitionWarning,
|
380
|
+
sourceMap));
|
381
|
+
} else if (out.node.method != HTTPMethodName::Connect && !methodTraits.allowBody) {
|
330
382
|
|
331
383
|
std::stringstream ss;
|
332
|
-
ss << "the response for " <<
|
384
|
+
ss << "the response for " << out.node.method << " request MUST NOT include a " << SectionName(BodySectionType);
|
333
385
|
|
334
|
-
report.warnings.push_back(Warning(ss.str(),
|
335
|
-
|
336
|
-
|
386
|
+
out.report.warnings.push_back(Warning(ss.str(),
|
387
|
+
EmptyDefinitionWarning,
|
388
|
+
sourceMap));
|
337
389
|
}
|
338
390
|
|
339
391
|
return;
|
@@ -351,11 +403,11 @@ namespace snowcrash {
|
|
351
403
|
|
352
404
|
if (sectionType == RequestSectionType) {
|
353
405
|
|
354
|
-
|
406
|
+
RequestIterator duplicate = SectionProcessor<Payload>::findRequest(example, payload);
|
355
407
|
return duplicate != example.requests.end();
|
356
408
|
} else if (sectionType == ResponseSectionType) {
|
357
409
|
|
358
|
-
|
410
|
+
ResponseIterator duplicate = SectionProcessor<Payload>::findResponse(example, payload);
|
359
411
|
return duplicate != example.responses.end();
|
360
412
|
}
|
361
413
|
|
@@ -366,19 +418,18 @@ namespace snowcrash {
|
|
366
418
|
static MarkdownNodeIterator handleDeprecatedHeaders(const MarkdownNodeIterator& node,
|
367
419
|
const MarkdownNodes& siblings,
|
368
420
|
SectionParserData& pd,
|
369
|
-
|
370
|
-
Headers& headers) {
|
421
|
+
ParseResult<Headers>& out) {
|
371
422
|
|
372
|
-
MarkdownNodeIterator cur = HeadersParser::parse(node, siblings, pd,
|
423
|
+
MarkdownNodeIterator cur = HeadersParser::parse(node, siblings, pd, out);
|
373
424
|
|
374
425
|
// WARN: Deprecated header sections
|
375
426
|
std::stringstream ss;
|
376
427
|
ss << "the 'headers' section at this level is deprecated and will be removed in a future, use respective payload header section(s) instead";
|
377
428
|
|
378
429
|
mdp::CharactersRangeSet sourceMap = mdp::BytesRangeSetToCharactersRangeSet(node->sourceMap, pd.sourceData);
|
379
|
-
report.warnings.push_back(Warning(ss.str(),
|
380
|
-
|
381
|
-
|
430
|
+
out.report.warnings.push_back(Warning(ss.str(),
|
431
|
+
DeprecatedWarning,
|
432
|
+
sourceMap));
|
382
433
|
|
383
434
|
return cur;
|
384
435
|
}
|
@@ -430,6 +481,15 @@ namespace snowcrash {
|
|
430
481
|
|
431
482
|
return;
|
432
483
|
}
|
484
|
+
|
485
|
+
/** Finds an action inside an actions collection */
|
486
|
+
static ActionIterator findAction(const Actions& actions,
|
487
|
+
const Action& action) {
|
488
|
+
|
489
|
+
return std::find_if(actions.begin(),
|
490
|
+
actions.end(),
|
491
|
+
std::bind2nd(MatchAction<Action>(), action));
|
492
|
+
}
|
433
493
|
};
|
434
494
|
|
435
495
|
/** Action Section Parser */
|