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
+
+
+
+
+ )}