From ae190c5f073e828ec2c0bc522f5dcff37d74b7cd Mon Sep 17 00:00:00 2001 From: chris48s Date: Thu, 23 Aug 2018 20:22:24 +0100 Subject: [PATCH] generate static examples without api call [apm appveyor cdnjs clojars gem npm uptimerobot] (#1740) * allow service classes to define a static example * define static example for some services (apm, appveyor, cdnjs, clojars, gem, librariesio, npm, uptimerobot) * add/update tests This allows us to show an example without making an API call to a live service for better performance. We can now specify 3 fields in the example definition: * urlPattern for the version with placeholders e.g: /npm/dw/:package.svg * ExampleUrl/Uri for the concrete example e.g: /npm/dw/localeval.svg * PreviewUrl/Uri for the static (or live) image we will actually show --- frontend/components/badge-examples.js | 20 ++++++--- frontend/components/markup-modal.js | 23 ++++++++-- lib/all-badge-examples.js | 32 +++++++++----- lib/all-badge-examples.spec.js | 10 +++-- services/apm/apm.service.js | 42 +++++++++++++++---- services/appveyor/appveyor-ci.service.js | 8 +++- services/base.js | 39 +++++++++++++---- services/base.spec.js | 36 +++++++++++++--- services/cdnjs/cdnjs.service.js | 4 +- services/clojars/clojars-version.service.js | 8 +++- services/gem/gem-downloads.service.js | 32 +++++++++++--- services/gem/gem-owner.service.js | 4 +- services/gem/gem-rank.service.js | 33 ++++++++------- services/gem/gem-version.service.js | 4 +- .../librariesio-dependent-repos.service.js | 4 +- .../librariesio-dependents.service.js | 4 +- .../librariesio-sourcerank.service.js | 4 +- services/npm/npm-downloads.service.js | 4 +- services/npm/npm-license.service.js | 8 +++- services/npm/npm-version.service.js | 20 ++++++--- .../uptimerobot/uptimerobot-ratio.service.js | 10 +++-- .../uptimerobot/uptimerobot-status.service.js | 6 ++- 22 files changed, 265 insertions(+), 90 deletions(-) diff --git a/frontend/components/badge-examples.js b/frontend/components/badge-examples.js index 3b7cca205d..637d3ea126 100644 --- a/frontend/components/badge-examples.js +++ b/frontend/components/badge-examples.js @@ -6,8 +6,9 @@ import resolveBadgeUrl from '../lib/badge-url' const Badge = ({ title, - previewUri, exampleUri, + previewUri, + urlPattern, documentation, baseUri, longCache, @@ -15,7 +16,14 @@ const Badge = ({ onClick, }) => { const handleClick = onClick - ? () => onClick({ title, previewUri, exampleUri, documentation }) + ? () => + onClick({ + title, + exampleUri, + previewUri, + urlPattern, + documentation, + }) : undefined const previewImage = previewUri ? ( @@ -29,7 +37,7 @@ const Badge = ({ '\u00a0' ) // non-breaking space const resolvedExampleUri = resolveBadgeUrl( - exampleUri || previewUri, + urlPattern || previewUri, baseUri, { longCache: false } ) @@ -59,8 +67,9 @@ const Badge = ({ } Badge.propTypes = { title: PropTypes.string.isRequired, - previewUri: PropTypes.string, exampleUri: PropTypes.string, + previewUri: PropTypes.string, + urlPattern: PropTypes.string, documentation: PropTypes.string, baseUri: PropTypes.string, longCache: PropTypes.bool.isRequired, @@ -101,8 +110,9 @@ Category.propTypes = { examples: PropTypes.arrayOf( PropTypes.shape({ title: PropTypes.string.isRequired, - previewUri: PropTypes.string, exampleUri: PropTypes.string, + previewUri: PropTypes.string, + urlPattern: PropTypes.string, documentation: PropTypes.string, }) ).isRequired, diff --git a/frontend/components/markup-modal.js b/frontend/components/markup-modal.js index 1e7231e73f..9941bd80db 100644 --- a/frontend/components/markup-modal.js +++ b/frontend/components/markup-modal.js @@ -10,8 +10,9 @@ export default class MarkupModal extends React.Component { static propTypes = { example: PropTypes.shape({ title: PropTypes.string.isRequired, - previewUri: PropTypes.string, exampleUri: PropTypes.string, + previewUri: PropTypes.string, + urlPattern: PropTypes.string, documentation: PropTypes.string, link: PropTypes.string, }), @@ -20,6 +21,7 @@ export default class MarkupModal extends React.Component { } state = { + exampleUri: null, badgeUri: null, link: null, style: 'flat', @@ -38,10 +40,13 @@ export default class MarkupModal extends React.Component { // Transfer `badgeUri` and `link` into state so they can be edited by the // user. - const { exampleUri, previewUri, link } = example + const { exampleUri, urlPattern, previewUri, link } = example this.setState({ + exampleUri: exampleUri + ? resolveBadgeUrl(exampleUri, baseUri || window.location.href) + : null, badgeUri: resolveBadgeUrl( - exampleUri || previewUri, + urlPattern || previewUri, baseUri || window.location.href ), link, @@ -126,6 +131,18 @@ export default class MarkupModal extends React.Component { />

+ {this.state.exampleUri && ( +

+ Example  + + + +

+ )}