From a03c12786a6b9859b10b2f05b74ae5e2b043702a Mon Sep 17 00:00:00 2001 From: kyle Date: Fri, 1 Jun 2018 16:04:27 -0700 Subject: [PATCH] feat(rendering): gate rendering based on valid version identifiers (#4614) * create VersionPragmaFilter component * use VersionPragmaFilter in BaseLayout * tighten version idenitifier constraints * handle case where user specifies a valid `swagger` and `openapi` field * add traceable class names for each message * add tests * linter fixes! * UNRELATED CHANGE: remove travis short-circuit * add bypass switch to VersionPragmaFilter --- .travis.yml | 9 --- src/core/components/layouts/base.jsx | 8 ++- src/core/components/version-pragma-filter.jsx | 54 ++++++++++++++ src/core/plugins/oas3/helpers.js | 4 +- src/core/presets/base.js | 2 + src/style/_layout.scss | 27 +++++++ test/components/version-pragma-filter.js | 70 +++++++++++++++++++ 7 files changed, 161 insertions(+), 13 deletions(-) create mode 100644 src/core/components/version-pragma-filter.jsx create mode 100644 test/components/version-pragma-filter.js diff --git a/.travis.yml b/.travis.yml index b2757d64..36288736 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,15 +11,6 @@ branches: - master - /^v\d+\.\d+(\.\d+)?(-\S*)?$/ install: "npm i && npm update" -before_install: -- | # quickly pass if only documentation is being updated - if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then - TRAVIS_COMMIT_RANGE="FETCH_HEAD...$TRAVIS_BRANCH" - git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '(\.md$)|(^(docs|examples))/' || { - echo "Only docs were updated, stopping build process." - exit - } - fi before_deploy: - npm run build env: diff --git a/src/core/components/layouts/base.jsx b/src/core/components/layouts/base.jsx index ba468a5e..d0d56b37 100644 --- a/src/core/components/layouts/base.jsx +++ b/src/core/components/layouts/base.jsx @@ -40,6 +40,7 @@ export default class BaseLayout extends React.Component { let servers = specSelectors.servers() let SvgAssets = getComponent("SvgAssets") + let VersionPragmaFilter = getComponent("VersionPragmaFilter") let Info = getComponent("info") let Operations = getComponent("operations", true) let Models = getComponent("Models", true) @@ -49,6 +50,9 @@ export default class BaseLayout extends React.Component { let Servers = getComponent("Servers") let Errors = getComponent("errors", true) + let isSwagger2 = specSelectors.isSwagger2() + let isOAS3 = specSelectors.isOAS3() + let isLoading = specSelectors.loadingStatus() === "loading" let isFailed = specSelectors.loadingStatus() === "failed" let filter = layoutSelectors.currentFilter() @@ -80,7 +84,7 @@ export default class BaseLayout extends React.Component {
-
+ }> @@ -142,7 +146,7 @@ export default class BaseLayout extends React.Component { -
+
) } diff --git a/src/core/components/version-pragma-filter.jsx b/src/core/components/version-pragma-filter.jsx new file mode 100644 index 00000000..1130dbf2 --- /dev/null +++ b/src/core/components/version-pragma-filter.jsx @@ -0,0 +1,54 @@ +import React from "react" +import PropTypes from "prop-types" + +export default class VersionPragmaFilter extends React.PureComponent { + static propTypes = { + isSwagger2: PropTypes.bool.isRequired, + isOAS3: PropTypes.bool.isRequired, + bypass: PropTypes.bool, + alsoShow: PropTypes.element, + children: PropTypes.any, + } + + static defaultProps = { + alsoShow: null, + children: null, + bypass: false, + } + + render() { + const { bypass, isSwagger2, isOAS3, alsoShow } = this.props + + if(bypass) { + return
{ this.props.children }
+ } + + if(isSwagger2 && isOAS3) { + return
+ {alsoShow} +
+
+

Unable to render this definition

+

swagger and openapi fields cannot be present in the same Swagger or OpenAPI definition. Please remove one of the fields.

+

Supported version fields are swagger: {"\"2.0\""} and those that match openapi: 3.0.n (for example, openapi: 3.0.0).

+
+
+
+ } + + if(!isSwagger2 && !isOAS3) { + return
+ {alsoShow} +
+
+

Unable to render this definition

+

The provided definition does not specify a valid version field.

+

Please indicate a valid Swagger or OpenAPI version field. Supported version fields are swagger: {"\"2.0\""} and those that match openapi: 3.0.n (for example, openapi: 3.0.0).

+
+
+
+ } + + return
{ this.props.children }
+ } +} diff --git a/src/core/plugins/oas3/helpers.js b/src/core/plugins/oas3/helpers.js index 0300bb62..193c767e 100644 --- a/src/core/plugins/oas3/helpers.js +++ b/src/core/plugins/oas3/helpers.js @@ -6,7 +6,7 @@ export function isOAS3(jsSpec) { return false } - return oasVersion.startsWith("3") + return oasVersion.startsWith("3.0.") } export function isSwagger2(jsSpec) { @@ -15,7 +15,7 @@ export function isSwagger2(jsSpec) { return false } - return swaggerVersion.startsWith("2") + return swaggerVersion.startsWith("2.0") } export function OAS3ComponentWrapFactory(Component) { diff --git a/src/core/presets/base.js b/src/core/presets/base.js index 10fba1e3..8a7812d7 100644 --- a/src/core/presets/base.js +++ b/src/core/presets/base.js @@ -66,6 +66,7 @@ import ArrayModel from "core/components/array-model" import PrimitiveModel from "core/components/primitive-model" import Property from "core/components/property" import TryItOutButton from "core/components/try-it-out-button" +import VersionPragmaFilter from "core/components/version-pragma-filter" import VersionStamp from "core/components/version-stamp" import DeepLink from "core/components/deep-link" import SvgAssets from "core/components/svg-assets" @@ -125,6 +126,7 @@ export default function() { TryItOutButton, Markdown, BaseLayout, + VersionPragmaFilter, VersionStamp, OperationExt, OperationExtRow, diff --git a/src/style/_layout.scss b/src/style/_layout.scss index 812f461e..5cffd574 100644 --- a/src/style/_layout.scss +++ b/src/style/_layout.scss @@ -796,3 +796,30 @@ a.nostyle { cursor: pointer; } } + +.version-pragma { + height: 100%; + padding: 5em 0px; + + &__message { + display: flex; + justify-content: center; + height: 100%; + font-size: 1.2em; + text-align: center; + line-height: 1.5em; + + padding: 0px .6em; + + > div { + max-width: 55ch; + flex: 1; + } + + code { + background-color: #dedede; + padding: 4px 4px 2px; + white-space: pre; + } + } +} diff --git a/test/components/version-pragma-filter.js b/test/components/version-pragma-filter.js new file mode 100644 index 00000000..c7d653fe --- /dev/null +++ b/test/components/version-pragma-filter.js @@ -0,0 +1,70 @@ +/* eslint-env mocha */ +import React from "react" +import expect, { createSpy } from "expect" +import { shallow } from "enzyme" +import { fromJS, Map } from "immutable" +import VersionPragmaFilter from "components/version-pragma-filter" + +describe("", function(){ + it("renders children for a Swagger 2 definition", function(){ + // When + let wrapper = shallow( + + hello! + + ) + + // Then + expect(wrapper.find("div").length).toEqual(1) + expect(wrapper.find("div").text()).toEqual("hello!") + }) + it("renders children for an OpenAPI 3 definition", function(){ + // When + let wrapper = shallow( + + hello! + + ) + + // Then + expect(wrapper.find("div").length).toEqual(1) + expect(wrapper.find("div").text()).toEqual("hello!") + }) + it("renders children when a bypass prop is set", function(){ + // When + let wrapper = shallow( + + hello! + + ) + + // Then + expect(wrapper.find("div").length).toEqual(1) + expect(wrapper.find("div").text()).toEqual("hello!") + }) + it("renders the correct message for an ambiguous-version definition", function(){ + // When + let wrapper = shallow( + + hello! + + ) + + // Then + expect(wrapper.find("div.version-pragma__message--ambiguous").length).toEqual(1) + expect(wrapper.find("div.version-pragma__message--missing").length).toEqual(0) + }) + it("renders the correct message for a missing-version definition", function(){ + // When + let wrapper = shallow( + + hello! + + ) + + // Then + expect(wrapper.find("div.version-pragma__message--missing").length).toEqual(1) + expect(wrapper.find("div.version-pragma__message--ambiguous").length).toEqual(0) + }) + +})