Compare commits

...

10 Commits

Author SHA1 Message Date
Cristi Vîjdea 0697c415ed Update changelog 2018-06-16 17:04:02 +03:00
Andrew Yager 4825ec70b1 Handle swagger_extra_fields in field_to_swagger_object (#142)
* Move add_manual_fields call to make_schema_definition
* Do not call add_manual_fields twice
2018-06-16 17:02:06 +03:00
Cristi Vîjdea 54ad90415d Add 1.9.0 changelog 2018-06-16 15:55:36 +03:00
Cristi Vîjdea 1184ea8b46 Add --generator-class argument to management command
Closes #140
2018-06-16 15:54:51 +03:00
Cristi Vîjdea 6ac58b8cf7 Fix testproj duplicate operation id
Fixes #139
2018-06-16 15:41:51 +03:00
Cristi Vîjdea d627a1bc5d Handle coreapi Fields without a schema attribute
Fixes #143
2018-06-16 15:08:59 +03:00
Cristi Vîjdea 38e884b5ea Remove wrong 'count' in paginator response required fields
Fixes #141
2018-06-16 15:06:09 +03:00
Cristi Vîjdea 2ef7cfbfe3 Catch and log exceptions raised from get_serializer
Fixes #135
2018-06-01 16:21:25 +03:00
Cristi Vîjdea 58adbb8f4c Coerce read_only into a boolean 2018-06-01 15:36:37 +03:00
Cristi Vîjdea 34c7fa2b0e Update swagger-ui to 3.16.0 and ReDoc to 2.0.0-alpha.22 2018-05-31 00:35:11 +03:00
18 changed files with 339 additions and 252 deletions
+13
View File
@@ -3,6 +3,19 @@ Changelog
#########
*********
**1.9.0**
*********
*Release date: Jun 16, 2018*
- **ADDED:** added ``DEFAULT_GENERATOR_CLASS`` setting and ``--generator-clas`` argument to the ``generate_swagger``
management command (:issue:`140`)
- **FIXED:** fixed wrongly required ``'count'`` response field on ``CursorPagination`` (:issue:`141`)
- **FIXED:** fixed some cases where ``swagger_extra_fields`` would not be handlded (:pr:`142`)
- **FIXED:** fixed crash when encountering ``coreapi.Fields``\ s without a ``schema`` (:issue:`143`)
*********
**1.8.0**
*********
+9 -1
View File
@@ -43,6 +43,14 @@ The possible settings and their default values are as follows:
Default classes
===============
DEFAULT_GENERATOR_CLASS
-------------------------
:class:`~.generators.OpenAPISchemaGenerator` subclass that will be used by default for generating the final
:class:`.Schema` object. Can be overriden by the ``generator_class`` argument to :func:`.get_schema_view`.
**Default**: :class:`drf_yasg.generators.OpenAPISchemaGenerator`
DEFAULT_AUTO_SCHEMA_CLASS
-------------------------
@@ -102,7 +110,7 @@ DEFAULT_INFO
------------
An import string to an :class:`.openapi.Info` object. This will be used when running the ``generate_swagger``
management command, or if no ``info`` argument is passed to ``get_schema_view``.
management command, or if no ``info`` argument is passed to :func:`.get_schema_view`.
**Default**: :python:`None`
+216 -196
View File
@@ -3,15 +3,25 @@
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"@types/chai": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.3.tgz",
"integrity": "sha512-f5dXGzOJycyzSMdaXVhiBhauL4dYydXwVpavfQ1mVCaGjR56a9QfklXObUxlIY9bGTmCPHEEZ04I16BZ/8w5ww=="
},
"@types/tapable": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.2.tgz",
"integrity": "sha512-42zEJkBpNfMEAvWR5WlwtTH22oDzcMjFsL9gDGExwF8X8WvAiw7Vwop7hPw03QT8TKfec83LwbHj6SvpqM4ELQ=="
},
"ajv": {
"version": "5.5.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
"requires": {
"co": "^4.6.0",
"fast-deep-equal": "^1.0.0",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.3.0"
"co": "4.6.0",
"fast-deep-equal": "1.1.0",
"fast-json-stable-stringify": "2.0.0",
"json-schema-traverse": "0.3.1"
}
},
"ansi-regex": {
@@ -24,7 +34,7 @@
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"requires": {
"sprintf-js": "~1.0.2"
"sprintf-js": "1.0.3"
}
},
"asap": {
@@ -42,8 +52,8 @@
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz",
"integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==",
"requires": {
"base64-js": "^1.0.2",
"ieee754": "^1.1.4"
"base64-js": "1.3.0",
"ieee754": "1.1.11"
}
},
"call-me-maybe": {
@@ -67,9 +77,9 @@
"integrity": "sha512-7yhQBmtN+uYZmfRjjVjKa0dZdWuabzpSKGtyQZN+9C8xlC788SSJjOHWh7tzurfwTqTD5UDYAhIv5fRJg3sHjQ==",
"optional": true,
"requires": {
"good-listener": "^1.2.2",
"select": "^1.1.2",
"tiny-emitter": "^2.0.0"
"good-listener": "1.2.2",
"select": "1.1.2",
"tiny-emitter": "2.0.2"
}
},
"cliui": {
@@ -77,9 +87,9 @@
"resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
"integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
"requires": {
"string-width": "^2.1.1",
"strip-ansi": "^4.0.0",
"wrap-ansi": "^2.0.0"
"string-width": "2.1.1",
"strip-ansi": "4.0.0",
"wrap-ansi": "2.1.0"
}
},
"co": {
@@ -102,9 +112,9 @@
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
"integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
"requires": {
"lru-cache": "^4.0.1",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
"lru-cache": "4.1.3",
"shebang-command": "1.2.0",
"which": "1.3.0"
}
},
"css-color-keywords": {
@@ -117,9 +127,9 @@
"resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.2.0.tgz",
"integrity": "sha512-SWG8+tsVRBHpxn1cSDmx7B95DJCiKwUecBbboGpm2znDCnJDMGkcoYR73w1p2IZMab6iNqVms8VC+4TrSqoFeQ==",
"requires": {
"css-color-keywords": "^1.0.0",
"fbjs": "^0.8.5",
"postcss-value-parser": "^3.3.0"
"css-color-keywords": "1.0.0",
"fbjs": "0.8.16",
"postcss-value-parser": "3.3.0"
}
},
"debug": {
@@ -161,7 +171,7 @@
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
"integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
"requires": {
"iconv-lite": "~0.4.13"
"iconv-lite": "0.4.23"
}
},
"es6-promise": {
@@ -184,13 +194,13 @@
"resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
"integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
"requires": {
"cross-spawn": "^5.0.1",
"get-stream": "^3.0.0",
"is-stream": "^1.1.0",
"npm-run-path": "^2.0.0",
"p-finally": "^1.0.0",
"signal-exit": "^3.0.0",
"strip-eof": "^1.0.0"
"cross-spawn": "5.1.0",
"get-stream": "3.0.0",
"is-stream": "1.1.0",
"npm-run-path": "2.0.2",
"p-finally": "1.0.0",
"signal-exit": "3.0.2",
"strip-eof": "1.0.0"
}
},
"fast-deep-equal": {
@@ -213,13 +223,13 @@
"resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz",
"integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=",
"requires": {
"core-js": "^1.0.0",
"isomorphic-fetch": "^2.1.1",
"loose-envify": "^1.0.0",
"object-assign": "^4.1.0",
"promise": "^7.1.1",
"setimmediate": "^1.0.5",
"ua-parser-js": "^0.7.9"
"core-js": "1.2.7",
"isomorphic-fetch": "2.2.1",
"loose-envify": "1.3.1",
"object-assign": "4.1.1",
"promise": "7.3.1",
"setimmediate": "1.0.5",
"ua-parser-js": "0.7.18"
}
},
"find-up": {
@@ -227,7 +237,7 @@
"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
"requires": {
"locate-path": "^2.0.0"
"locate-path": "2.0.0"
}
},
"foreach": {
@@ -255,8 +265,8 @@
"resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz",
"integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=",
"requires": {
"min-document": "^2.19.0",
"process": "~0.5.1"
"min-document": "2.19.0",
"process": "0.5.2"
}
},
"good-listener": {
@@ -265,7 +275,7 @@
"integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
"optional": true,
"requires": {
"delegate": "^3.1.2"
"delegate": "3.2.0"
}
},
"has-flag": {
@@ -283,7 +293,7 @@
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
"integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
"safer-buffer": "2.1.2"
}
},
"ieee754": {
@@ -306,7 +316,7 @@
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
"requires": {
"isobject": "^3.0.1"
"isobject": "3.0.1"
}
},
"is-stream": {
@@ -329,8 +339,8 @@
"resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
"integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
"requires": {
"node-fetch": "^1.0.1",
"whatwg-fetch": ">=0.10.0"
"node-fetch": "1.7.3",
"whatwg-fetch": "2.0.4"
}
},
"js-tokens": {
@@ -343,8 +353,8 @@
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
"integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
"requires": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
"argparse": "1.0.10",
"esprima": "4.0.0"
}
},
"json-pointer": {
@@ -352,7 +362,7 @@
"resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.0.tgz",
"integrity": "sha1-jlAFUKaqxUZKRzN32leqbMIoKNc=",
"requires": {
"foreach": "^2.0.4"
"foreach": "2.0.5"
}
},
"json-schema-ref-parser": {
@@ -360,10 +370,10 @@
"resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-5.0.3.tgz",
"integrity": "sha512-RCZE9RpvMG2zY+dSSQkqHxsCYaqBYlh/u2PWWRdWMvtaH718YqR73lYu4IW4cGNxJIkUnIgTMuJtp+A1tIn4+w==",
"requires": {
"call-me-maybe": "^1.0.1",
"debug": "^3.1.0",
"js-yaml": "^3.11.0",
"ono": "^4.0.3"
"call-me-maybe": "1.0.1",
"debug": "3.1.0",
"js-yaml": "3.11.0",
"ono": "4.0.5"
}
},
"json-schema-traverse": {
@@ -376,7 +386,7 @@
"resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
"integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
"requires": {
"invert-kv": "^1.0.0"
"invert-kv": "1.0.0"
}
},
"locate-path": {
@@ -384,8 +394,8 @@
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
"requires": {
"p-locate": "^2.0.0",
"path-exists": "^3.0.0"
"p-locate": "2.0.0",
"path-exists": "3.0.0"
}
},
"loose-envify": {
@@ -393,7 +403,7 @@
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
"integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
"requires": {
"js-tokens": "^3.0.0"
"js-tokens": "3.0.2"
}
},
"lru-cache": {
@@ -401,31 +411,21 @@
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
"integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
"requires": {
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
"pseudomap": "1.0.2",
"yallist": "2.1.2"
}
},
"lunr": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/lunr/-/lunr-2.2.0.tgz",
"integrity": "sha512-HNuCi0meEZZpfORgJuxmXu5yHkdWrWew9dphUj+ouCbNNT38ud5YXWKVcLo1gSwQcDdKMXn+lRuDiXLfllnnjA=="
},
"mark.js": {
"version": "8.11.1",
"resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz",
"integrity": "sha1-GA8fnr74sOY45BZq1S24eb6y/8U="
},
"marked": {
"version": "0.3.19",
"resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz",
"integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg=="
},
"mem": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
"integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
"requires": {
"mimic-fn": "^1.0.0"
"mimic-fn": "1.2.0"
}
},
"mimic-fn": {
@@ -438,21 +438,16 @@
"resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
"integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
"requires": {
"dom-walk": "^0.1.0"
"dom-walk": "0.1.1"
}
},
"mobx": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/mobx/-/mobx-4.2.1.tgz",
"integrity": "sha1-3UGQ2vG0PUGjoihYUlP5lwsKJ90="
},
"mobx-react": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-5.1.2.tgz",
"integrity": "sha1-7FwtKaHfgj29GzfiFPo2oJBwVOI=",
"requires": {
"hoist-non-react-statics": "^2.5.0",
"react-lifecycles-compat": "^3.0.2"
"hoist-non-react-statics": "2.5.0",
"react-lifecycles-compat": "3.0.4"
}
},
"ms": {
@@ -465,8 +460,8 @@
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
"integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
"requires": {
"encoding": "^0.1.11",
"is-stream": "^1.0.1"
"encoding": "0.1.12",
"is-stream": "1.1.0"
}
},
"node-readfiles": {
@@ -474,7 +469,7 @@
"resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz",
"integrity": "sha1-271K8SE04uY1wkXvk//Pb2BnOl0=",
"requires": {
"es6-promise": "^3.2.1"
"es6-promise": "3.3.1"
}
},
"npm-run-path": {
@@ -482,7 +477,7 @@
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
"integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
"requires": {
"path-key": "^2.0.0"
"path-key": "2.0.1"
}
},
"number-is-nan": {
@@ -500,15 +495,7 @@
"resolved": "https://registry.npmjs.org/ono/-/ono-4.0.5.tgz",
"integrity": "sha512-ZVNuV9kJbr/2tWs83I2snrYo+WIS0DISF/xUfX9p9b6GyDD6F5N9PzHjW+p/dep6IGwSYylf1HCub5I/nM0R5Q==",
"requires": {
"format-util": "^1.0.3"
}
},
"openapi-sampler": {
"version": "1.0.0-beta.9",
"resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.0.0-beta.9.tgz",
"integrity": "sha1-HkuldvqPtjG2iK5g6ZW9J6wIdJI=",
"requires": {
"json-pointer": "^0.6.0"
"format-util": "1.0.3"
}
},
"os-locale": {
@@ -516,9 +503,9 @@
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
"integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
"requires": {
"execa": "^0.7.0",
"lcid": "^1.0.0",
"mem": "^1.1.0"
"execa": "0.7.0",
"lcid": "1.0.0",
"mem": "1.1.0"
}
},
"p-finally": {
@@ -531,7 +518,7 @@
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
"integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
"requires": {
"p-try": "^1.0.0"
"p-try": "1.0.0"
}
},
"p-locate": {
@@ -539,7 +526,7 @@
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
"requires": {
"p-limit": "^1.1.0"
"p-limit": "1.2.0"
}
},
"p-try": {
@@ -577,7 +564,7 @@
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.14.0.tgz",
"integrity": "sha512-sa2s4m60bXs+kU3jcuUwx3ZCrUH7o0kuqnOOINbODqlRrDB7KY8SRx+xR/D7nHLlgfDdG7zXbRO8wJ+su5Ls0A==",
"requires": {
"clipboard": "^2.0.0"
"clipboard": "2.0.1"
}
},
"process": {
@@ -590,7 +577,7 @@
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
"integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
"requires": {
"asap": "~2.0.3"
"asap": "2.0.6"
}
},
"prop-types": {
@@ -598,9 +585,9 @@
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz",
"integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==",
"requires": {
"fbjs": "^0.8.16",
"loose-envify": "^1.3.1",
"object-assign": "^4.1.1"
"fbjs": "0.8.16",
"loose-envify": "1.3.1",
"object-assign": "4.1.1"
}
},
"pseudomap": {
@@ -613,7 +600,7 @@
"resolved": "https://registry.npmjs.org/react-dropdown/-/react-dropdown-1.5.0.tgz",
"integrity": "sha512-rRv3a7NiP++yC1rzdjzkviC5ujq759i4SRa0M3C0Cr7loYT4Z3+JhSPekv1/04JiZNXX46cV3/g6A9kS7rkI4Q==",
"requires": {
"classnames": "^2.2.3"
"classnames": "2.2.5"
}
},
"react-hot-loader": {
@@ -621,12 +608,12 @@
"resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.1.3.tgz",
"integrity": "sha512-CF3Y/qUfL1PkM6TPrELNsSiHGKJFRnpyLdzsk+HV4IIuQAY2g1aZXQmK4L/O8WOaldoOujxAYfRfpzrWTvmvtg==",
"requires": {
"fast-levenshtein": "^2.0.6",
"global": "^4.3.0",
"hoist-non-react-statics": "^2.5.0",
"prop-types": "^15.6.1",
"react-lifecycles-compat": "^3.0.2",
"shallowequal": "^1.0.2"
"fast-levenshtein": "2.0.6",
"global": "4.3.2",
"hoist-non-react-statics": "2.5.0",
"prop-types": "15.6.1",
"react-lifecycles-compat": "3.0.4",
"shallowequal": "1.0.2"
}
},
"react-is": {
@@ -644,38 +631,83 @@
"resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-2.2.2.tgz",
"integrity": "sha512-jZGAAoq1yknr/XF60/2kH5X3UJdR1X8ItcsLZ1mJnHfoniKcCr3shT2TK5wiS2sO0LOmqwX2BtJQX3snKd50sg==",
"requires": {
"classnames": "^2.2.0",
"prop-types": "^15.5.0"
"classnames": "2.2.5",
"prop-types": "15.6.1"
}
},
"redoc": {
"version": "2.0.0-alpha.20",
"resolved": "https://registry.npmjs.org/redoc/-/redoc-2.0.0-alpha.20.tgz",
"integrity": "sha512-oJ6CACoflRW7BvvfUTANjNj9+8bvWweg8gBKJnl4gTcao1tA1NsN7hNRv7uGpN79RP8eMFBSlRHcGmxKONU/tA==",
"version": "2.0.0-alpha.22",
"resolved": "https://registry.npmjs.org/redoc/-/redoc-2.0.0-alpha.22.tgz",
"integrity": "sha512-hZuzYWk0wcnr5ftGHXRzNEJguDVAXzqDt4VpcpZDIauwLDHC7ZJNN1GryPuRzEMbuEEP4G2X7bIdo+dWl6h/Zg==",
"requires": {
"classnames": "^2.2.5",
"decko": "^1.2.0",
"dompurify": "^1.0.2",
"eventemitter3": "^3.0.0",
"json-pointer": "^0.6.0",
"json-schema-ref-parser": "^5.0.0",
"lunr": "^2.1.5",
"mark.js": "^8.11.1",
"marked": "^0.3.19",
"mobx": "^4.1.0",
"mobx-react": "^5.0.0",
"openapi-sampler": "1.0.0-beta.9",
"perfect-scrollbar": "^1.3.0",
"polished": "^1.9.2",
"prismjs": "^1.12.2",
"prop-types": "^15.6.0",
"react-dropdown": "^1.3.0",
"react-hot-loader": "^4.0.0",
"react-tabs": "^2.0.0",
"slugify": "^1.2.1",
"stickyfill": "^1.1.1",
"styled-components": "^3.2.3",
"swagger2openapi": "^2.11.0"
"@types/chai": "4.1.3",
"@types/tapable": "1.0.2",
"classnames": "2.2.5",
"decko": "1.2.0",
"dompurify": "1.0.4",
"eventemitter3": "3.1.0",
"json-pointer": "0.6.0",
"json-schema-ref-parser": "5.0.3",
"lunr": "2.2.1",
"mark.js": "8.11.1",
"marked": "0.4.0",
"mobx": "4.3.0",
"mobx-react": "5.1.2",
"openapi-sampler": "1.0.0-beta.12",
"perfect-scrollbar": "1.3.0",
"polished": "1.9.2",
"prismjs": "1.14.0",
"prop-types": "15.6.1",
"react-dropdown": "1.5.0",
"react-hot-loader": "4.1.3",
"react-tabs": "2.2.2",
"slugify": "1.3.0",
"stickyfill": "1.1.1",
"styled-components": "3.3.0",
"swagger2openapi": "2.11.16",
"tslib": "1.9.2"
},
"dependencies": {
"lunr": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/lunr/-/lunr-2.2.1.tgz",
"integrity": "sha1-YsYpR7+DYZRQ6Uq/JgYfHOO6qkc="
},
"marked": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/marked/-/marked-0.4.0.tgz",
"integrity": "sha512-tMsdNBgOsrUophCAFQl0XPe6Zqk/uy9gnue+jIIKhykO51hxyu6uNx7zBPy0+y/WKYVZZMspV9YeXLNdKk+iYw=="
},
"mobx": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/mobx/-/mobx-4.3.0.tgz",
"integrity": "sha1-UKXmP9AZeoPGgWb/g62kW2XIWfg="
},
"openapi-sampler": {
"version": "1.0.0-beta.12",
"resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.0.0-beta.12.tgz",
"integrity": "sha512-/6DK47sOfOjjOs0VDp2tkX35fJSRpi2e5FfGSXT42+cCBTbJ3mKX27tkuZM3V9Q6ot0wM0/7x7CCzlNMSFlGyA==",
"requires": {
"json-pointer": "0.6.0"
}
},
"styled-components": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/styled-components/-/styled-components-3.3.0.tgz",
"integrity": "sha1-M1sbK2c7QWzV7AEgEOI37R+Hf+k=",
"requires": {
"buffer": "5.1.0",
"css-to-react-native": "2.2.0",
"fbjs": "0.8.16",
"hoist-non-react-statics": "2.5.0",
"is-plain-object": "2.0.4",
"prop-types": "15.6.1",
"react-is": "16.3.2",
"stylis": "3.5.0",
"stylis-rule-sheet": "0.0.10",
"supports-color": "3.2.3"
}
}
}
},
"reftools": {
@@ -724,7 +756,7 @@
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
"integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
"requires": {
"shebang-regex": "^1.0.0"
"shebang-regex": "1.0.0"
}
},
"shebang-regex": {
@@ -737,11 +769,11 @@
"resolved": "https://registry.npmjs.org/should/-/should-13.2.1.tgz",
"integrity": "sha512-l+/NwEMO+DcstsHEwPHRHzC9j4UOE3VQwJGcMWSsD/vqpqHbnQ+1iSHy64Ihmmjx1uiRPD9pFadTSc3MJtXAgw==",
"requires": {
"should-equal": "^2.0.0",
"should-format": "^3.0.3",
"should-type": "^1.4.0",
"should-type-adaptors": "^1.0.1",
"should-util": "^1.0.0"
"should-equal": "2.0.0",
"should-format": "3.0.3",
"should-type": "1.4.0",
"should-type-adaptors": "1.1.0",
"should-util": "1.0.0"
}
},
"should-equal": {
@@ -749,7 +781,7 @@
"resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz",
"integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==",
"requires": {
"should-type": "^1.4.0"
"should-type": "1.4.0"
}
},
"should-format": {
@@ -757,8 +789,8 @@
"resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz",
"integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=",
"requires": {
"should-type": "^1.3.0",
"should-type-adaptors": "^1.0.1"
"should-type": "1.4.0",
"should-type-adaptors": "1.1.0"
}
},
"should-type": {
@@ -771,8 +803,8 @@
"resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz",
"integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==",
"requires": {
"should-type": "^1.3.0",
"should-util": "^1.0.0"
"should-type": "1.4.0",
"should-util": "1.0.0"
}
},
"should-util": {
@@ -805,8 +837,8 @@
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"requires": {
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^4.0.0"
"is-fullwidth-code-point": "2.0.0",
"strip-ansi": "4.0.0"
}
},
"strip-ansi": {
@@ -814,7 +846,7 @@
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"requires": {
"ansi-regex": "^3.0.0"
"ansi-regex": "3.0.0"
}
},
"strip-eof": {
@@ -822,23 +854,6 @@
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
"integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
},
"styled-components": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/styled-components/-/styled-components-3.2.6.tgz",
"integrity": "sha1-mebnWnRr3t0pWhfgPdFJMFWhzDs=",
"requires": {
"buffer": "^5.0.3",
"css-to-react-native": "^2.0.3",
"fbjs": "^0.8.16",
"hoist-non-react-statics": "^2.5.0",
"is-plain-object": "^2.0.1",
"prop-types": "^15.5.4",
"react-is": "^16.3.1",
"stylis": "^3.5.0",
"stylis-rule-sheet": "^0.0.10",
"supports-color": "^3.2.3"
}
},
"stylis": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.0.tgz",
@@ -854,28 +869,28 @@
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
"integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
"requires": {
"has-flag": "^1.0.0"
"has-flag": "1.0.0"
}
},
"swagger-ui-dist": {
"version": "3.14.2",
"resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.14.2.tgz",
"integrity": "sha1-aayy6HOFF5ICwx6Iw/Bl8xBlEFY="
"version": "3.16.0",
"resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.16.0.tgz",
"integrity": "sha1-kCtuBC97HsPpXDSVfzMoHN2uEsQ="
},
"swagger2openapi": {
"version": "2.11.16",
"resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-2.11.16.tgz",
"integrity": "sha512-5Pv20whg9Bn1dqKDuGatH0r+7mAEU8+tHJU1PdT9ufGeZNseqJBs9Y8AOd8EMEHKRuAgAzYYWhINvgtodAlZRA==",
"requires": {
"ajv": "^5.0.1",
"call-me-maybe": "^1.0.1",
"co": "^4.6.0",
"js-yaml": "^3.6.1",
"node-fetch": "^2.0.0",
"node-readfiles": "^0.2.0",
"ajv": "5.5.2",
"call-me-maybe": "1.0.1",
"co": "4.6.0",
"js-yaml": "3.11.0",
"node-fetch": "2.1.2",
"node-readfiles": "0.2.0",
"reftools": "0.0.20",
"should": "^13.0.1",
"yargs": "^11.0.0"
"should": "13.2.1",
"yargs": "11.0.0"
},
"dependencies": {
"node-fetch": {
@@ -891,6 +906,11 @@
"integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==",
"optional": true
},
"tslib": {
"version": "1.9.2",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.2.tgz",
"integrity": "sha512-AVP5Xol3WivEr7hnssHDsaM+lVrVXWUvd1cfXTRkTj80b//6g2wIFEH6hZG0muGZRnHGrfttpdzRk3YlBkWjKw=="
},
"ua-parser-js": {
"version": "0.7.18",
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz",
@@ -906,7 +926,7 @@
"resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
"integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
"requires": {
"isexe": "^2.0.0"
"isexe": "2.0.0"
}
},
"which-module": {
@@ -919,8 +939,8 @@
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
"requires": {
"string-width": "^1.0.1",
"strip-ansi": "^3.0.1"
"string-width": "1.0.2",
"strip-ansi": "3.0.1"
},
"dependencies": {
"ansi-regex": {
@@ -933,7 +953,7 @@
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"requires": {
"number-is-nan": "^1.0.0"
"number-is-nan": "1.0.1"
}
},
"string-width": {
@@ -941,9 +961,9 @@
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
"strip-ansi": "^3.0.0"
"code-point-at": "1.1.0",
"is-fullwidth-code-point": "1.0.0",
"strip-ansi": "3.0.1"
}
},
"strip-ansi": {
@@ -951,7 +971,7 @@
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"requires": {
"ansi-regex": "^2.0.0"
"ansi-regex": "2.1.1"
}
}
}
@@ -971,18 +991,18 @@
"resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz",
"integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==",
"requires": {
"cliui": "^4.0.0",
"decamelize": "^1.1.1",
"find-up": "^2.1.0",
"get-caller-file": "^1.0.1",
"os-locale": "^2.0.0",
"require-directory": "^2.1.1",
"require-main-filename": "^1.0.1",
"set-blocking": "^2.0.0",
"string-width": "^2.0.0",
"which-module": "^2.0.0",
"y18n": "^3.2.1",
"yargs-parser": "^9.0.2"
"cliui": "4.1.0",
"decamelize": "1.2.0",
"find-up": "2.1.0",
"get-caller-file": "1.0.2",
"os-locale": "2.1.0",
"require-directory": "2.1.1",
"require-main-filename": "1.0.1",
"set-blocking": "2.0.0",
"string-width": "2.1.1",
"which-module": "2.0.0",
"y18n": "3.2.1",
"yargs-parser": "9.0.2"
}
},
"yargs-parser": {
@@ -990,7 +1010,7 @@
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz",
"integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=",
"requires": {
"camelcase": "^4.1.0"
"camelcase": "4.1.0"
}
}
}
+2 -2
View File
@@ -1,8 +1,8 @@
{
"name": "drf-yasg",
"dependencies": {
"redoc": "^2.0.0-alpha.20",
"swagger-ui-dist": "^3.14.2"
"redoc": "^2.0.0-alpha.22",
"swagger-ui-dist": "^3.16.0"
},
"repository": {
"type": "git",
+2
View File
@@ -2,6 +2,7 @@ from django.conf import settings
from rest_framework.settings import perform_import
SWAGGER_DEFAULTS = {
'DEFAULT_GENERATOR_CLASS': 'drf_yasg.generators.OpenAPISchemaGenerator',
'DEFAULT_AUTO_SCHEMA_CLASS': 'drf_yasg.inspectors.SwaggerAutoSchema',
'DEFAULT_FIELD_INSPECTORS': [
@@ -68,6 +69,7 @@ REDOC_DEFAULTS = {
}
IMPORT_STRINGS = [
'DEFAULT_GENERATOR_CLASS',
'DEFAULT_AUTO_SCHEMA_CLASS',
'DEFAULT_FIELD_INSPECTORS',
'DEFAULT_FILTER_INSPECTORS',
+6 -5
View File
@@ -36,10 +36,7 @@ class InlineSerializerInspector(SerializerInspector):
setattr(schema, attr, val)
def get_schema(self, serializer):
result = self.probe_field_inspectors(serializer, openapi.Schema, self.use_definitions)
schema = openapi.resolve_ref(result, self.components)
self.add_manual_fields(serializer, schema)
return result
return self.probe_field_inspectors(serializer, openapi.Schema, self.use_definitions)
def add_manual_parameters(self, serializer, parameters):
"""Add/replace parameters from the given list of automatically generated request parameters. This method
@@ -95,7 +92,7 @@ class InlineSerializerInspector(SerializerInspector):
for property_name, child in field.fields.items():
property_name = self.get_property_name(property_name)
prop_kwargs = {
'read_only': child.read_only or None
'read_only': bool(child.read_only) or None
}
prop_kwargs = filter_none(prop_kwargs)
@@ -117,6 +114,10 @@ class InlineSerializerInspector(SerializerInspector):
# but is visually displayed like the model name, which is confusing
# it is better to just remove title from inline models
del result.title
# Provide an option to add manual paremeters to a schema
# for example, to add examples
self.add_manual_fields(field, result)
return result
if not ref_name or not use_references:
+5 -2
View File
@@ -48,7 +48,7 @@ class CoreAPICompatInspector(PaginatorInspector, FilterInspector):
in_=location_to_in[field.location],
type=coreapi_types.get(type(field.schema), openapi.TYPE_STRING),
required=field.required,
description=field.schema.description,
description=field.schema.description if field.schema else None,
)
@@ -70,7 +70,10 @@ class DjangoRestResponsePagination(PaginatorInspector):
('previous', openapi.Schema(type=openapi.TYPE_STRING, format=openapi.FORMAT_URI)),
('results', response_schema),
)),
required=['count', 'results']
required=['results']
)
if has_count:
paged_schema.required.insert(0, 'count')
return paged_schema
+8 -1
View File
@@ -1,3 +1,4 @@
import logging
from collections import OrderedDict
from rest_framework.request import is_form_media_type
@@ -12,6 +13,8 @@ from ..utils import (
)
from .base import ViewInspector
log = logging.getLogger(__name__)
class SwaggerAutoSchema(ViewInspector):
def __init__(self, view, path, method, components, request, overrides):
@@ -83,7 +86,11 @@ class SwaggerAutoSchema(ViewInspector):
"""
if not hasattr(self.view, 'get_serializer'):
return None
return self.view.get_serializer()
try:
return self.view.get_serializer()
except Exception:
log.warning("view's get_serializer raised exception (%s)", type(self.view).__name__, exc_info=True)
return None
def get_request_serializer(self):
"""Return the request serializer (used for parsing the request payload) for this endpoint.
@@ -2,6 +2,7 @@ import json
import logging
import os
from collections import OrderedDict
from importlib import import_module
from django.contrib.auth.models import User
from django.core.exceptions import ImproperlyConfigured
@@ -12,7 +13,15 @@ from rest_framework.views import APIView
from ... import openapi
from ...app_settings import swagger_settings
from ...codecs import OpenAPICodecJson, OpenAPICodecYaml
from ...generators import OpenAPISchemaGenerator
def import_class(import_string):
if not import_string:
return None
module_path, class_name = import_string.rsplit('.', 1)
module = import_module(module_path)
return getattr(module, class_name)
class Command(BaseCommand):
@@ -64,6 +73,11 @@ class Command(BaseCommand):
'OpenAPISchemaGenerator.get_schema().\n'
'This option implies --mock-request.'
)
parser.add_argument(
'-g', '--generator-class', dest='generator_class_name',
default='',
help='Import string pointing to an OpenAPISchemaGenerator subclass to use for schema generation.'
)
def write_schema(self, schema, stream, format):
if format == 'json':
@@ -89,7 +103,8 @@ class Command(BaseCommand):
request = APIView().initialize_request(request)
return request
def handle(self, output_file, overwrite, format, api_url, mock, user, private, *args, **options):
def handle(self, output_file, overwrite, format, api_url, mock, user, private, generator_class_name,
*args, **kwargs):
# disable logs of WARNING and below
logging.disable(logging.WARNING)
@@ -117,7 +132,8 @@ class Command(BaseCommand):
request = self.get_mock_request(api_url, format, user) if mock else None
generator = OpenAPISchemaGenerator(
generator_class = import_class(generator_class_name) or swagger_settings.DEFAULT_GENERATOR_CLASS
generator = generator_class(
info=info,
url=api_url
)
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -2
View File
@@ -11,7 +11,6 @@ from rest_framework.settings import api_settings
from rest_framework.views import APIView
from .app_settings import swagger_settings
from .generators import OpenAPISchemaGenerator
from .renderers import OpenAPIRenderer, ReDocRenderer, SwaggerJSONRenderer, SwaggerUIRenderer, SwaggerYAMLRenderer
SPEC_RENDERERS = (SwaggerYAMLRenderer, SwaggerJSONRenderer, OpenAPIRenderer)
@@ -46,7 +45,7 @@ def deferred_never_cache(view_func):
def get_schema_view(info=None, url=None, patterns=None, urlconf=None, public=False, validators=None,
generator_class=OpenAPISchemaGenerator,
generator_class=swagger_settings.DEFAULT_GENERATOR_CLASS,
authentication_classes=api_settings.DEFAULT_AUTHENTICATION_CLASSES,
permission_classes=api_settings.DEFAULT_PERMISSION_CLASSES):
"""Create a SchemaView class with default renderers and generators.
+1 -1
View File
@@ -13,6 +13,6 @@ router.register(r'recursive', views.TodoRecursiveView)
urlpatterns = router.urls
urlpatterns += [
url(r'^(?P<todo_id>\d+)/yetanother/(?P<yetanother_id>\d+)/$',
url(r'^(?P<todo_id>\d+)/yetanothers/(?P<yetanother_id>\d+)/$',
views.NestedTodoView.as_view(), ),
]
+2 -2
View File
@@ -697,9 +697,9 @@ paths:
description: A unique integer value identifying this todo.
required: true
type: integer
/todo/{todo_id}/yetanother/{yetanother_id}/:
/todo/{todo_id}/yetanothers/{yetanother_id}/:
get:
operationId: todo_yetanother_read
operationId: todo_yetanothers_read
description: ''
parameters: []
responses:
+16 -4
View File
@@ -11,17 +11,18 @@ import pytest
from django.contrib.auth.models import User
from django.core.management import call_command
from drf_yasg import openapi
from drf_yasg.codecs import yaml_sane_load
from drf_yasg.generators import OpenAPISchemaGenerator
def call_generate_swagger(output_file='-', overwrite=False, format='', api_url='',
mock=False, user='', private=False, **kwargs):
mock=False, user='', private=False, generator_class_name='', **kwargs):
out = StringIO()
call_command(
'generate_swagger', stdout=out,
output_file=output_file, overwrite=overwrite, format=format,
api_url=api_url, mock=mock, user=user, private=private,
**kwargs
output_file=output_file, overwrite=overwrite, format=format, api_url=api_url, mock=mock, user=user,
private=private, generator_class_name=generator_class_name, **kwargs
)
return out.getvalue()
@@ -46,6 +47,17 @@ def test_no_mock(db):
assert len(output_schema['paths']) > 0
class EmptySchemaGenerator(OpenAPISchemaGenerator):
def get_paths(self, endpoints, components, request, public):
return openapi.Paths(paths={}), ''
def test_generator_class(db):
output = call_generate_swagger(generator_class_name='test_management.EmptySchemaGenerator')
output_schema = json.loads(output, object_pairs_hook=OrderedDict)
assert len(output_schema['paths']) == 0
def silentremove(filename):
try:
os.remove(filename)