Skip to content

Commit

Permalink
Merge branch 'master' into webyourmind/e2eTests
Browse files Browse the repository at this point in the history
  • Loading branch information
storrisi authored Feb 12, 2019
2 parents 8c788ba + 7c954a0 commit 5001ae8
Show file tree
Hide file tree
Showing 17 changed files with 1,432 additions and 98 deletions.
1,041 changes: 991 additions & 50 deletions package-lock.json

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"react-bootstrap-typeahead": "^2.6.0",
"react-bs-notifier": "^4.4.6",
"react-copy-to-clipboard": "^5.0.1",
"react-countup": "^4.0.0",
"react-dom": "^16.4.1",
"react-ga": "^2.5.3",
"react-monaco-editor": "^0.13.0",
Expand All @@ -24,7 +25,9 @@
"react-router-dom": "^4.3.1",
"react-scripts": "^2.1.3",
"react-table": "6.8.6",
"react-ui-cards": "^1.5.0",
"react-virtualized": "^9.19.1",
"recharts": "^1.4.2",
"redux": "^3.7.2",
"redux-persist": "^4.6.0",
"redux-thunk": "^2.3.0",
Expand Down
8 changes: 8 additions & 0 deletions src/api/clearlyDefined.js
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,14 @@ export function getRevisions(token, path, type, provider) {
return get(url(`${origin}/${path}/revisions`), token)
}

export function getStats(key) {
return get(url(`stats/${key}`))
}

export function getStatus(key) {
return get(url(`status/${key}`))
}

// ========================== utilities ====================

export function url(path, query) {
Expand Down
50 changes: 3 additions & 47 deletions src/components/DefinitionEntry.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import cargo from '../images/cargo.png'
import nuget from '../images/nuget.svg'
import Contribution from '../utils/contribution'
import Definition from '../utils/definition'
import EntitySpec from '../utils/entitySpec'
import LicensePicker from './LicensePicker'

export default class DefinitionEntry extends React.Component {
Expand Down Expand Up @@ -66,8 +67,8 @@ export default class DefinitionEntry extends React.Component {

renderHeadline(definition) {
const { namespace, name, revision } = definition.coordinates
const componentUrl = this.getComponentUrl(definition.coordinates)
const revisionUrl = this.getRevisionUrl(definition.coordinates)
const componentUrl = EntitySpec.getComponentUrl(definition.coordinates)
const revisionUrl = EntitySpec.getRevisionUrl(definition.coordinates)
const namespaceText = namespace ? namespace + '/' : ''
const componentTag = componentUrl ? (
<span>
Expand Down Expand Up @@ -130,51 +131,6 @@ export default class DefinitionEntry extends React.Component {
)
}

getRevisionUrl(coordinates) {
if (!coordinates.revision) return
switch (coordinates.provider) {
case 'github':
return `${this.getComponentUrl(coordinates)}/commit/${coordinates.revision}`
case 'npmjs':
return `${this.getComponentUrl(coordinates)}/v/${coordinates.revision}`
case 'nuget':
return `${this.getComponentUrl(coordinates)}/${coordinates.revision}`
case 'cratesio':
return `${this.getComponentUrl(coordinates)}/${coordinates.revision}`
case 'mavencentral':
return `${this.getComponentUrl(coordinates)}/${coordinates.revision}`
case 'pypi':
return `${this.getComponentUrl(coordinates)}/${coordinates.revision}`
case 'rubygems':
return `${this.getComponentUrl(coordinates)}/versions/${coordinates.revision}`
default:
return
}
}

getComponentUrl(coordinates) {
switch (coordinates.provider) {
case 'github':
return `https://github.com/${coordinates.namespace}/${coordinates.name}`
case 'npmjs':
return `https://npmjs.com/package/${
coordinates.namespace ? coordinates.namespace + '/' + coordinates.name : coordinates.name
}`
case 'nuget':
return `https://nuget.org/packages/${coordinates.name}`
case 'cratesio':
return `https://crates.io/crates/${coordinates.name}`
case 'mavencentral':
return `https://mvnrepository.com/artifact/${coordinates.namespace}/${coordinates.name}`
case 'pypi':
return `https://pypi.org/project/${coordinates.name}`
case 'rubygems':
return `https://rubygems.org/gems/${coordinates.name}`
default:
return
}
}

getPercentage(count, total) {
return Math.round(((count || 0) / total) * 100)
}
Expand Down
57 changes: 57 additions & 0 deletions src/components/Navigation/Pages/PageStats/PageStats.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// Copyright (c) Microsoft Corporation and others. Licensed under the MIT license.
// SPDX-License-Identifier: MIT

import React, { Component } from 'react'
import { Grid, Row, Col, Jumbotron } from 'react-bootstrap'
import TypeCard from './TypeCard'
import CountUp from 'react-countup'
import { getStats } from '../../../../api/clearlyDefined'
import npm from '../../../../../src/images/n-large.png'
import maven from '../../../../../src/images/maven.png'
import nuget from '../../../../../src/images/nuget.svg'
import pod from '../../../../../src/images/pod.png'
import git from '../../../../../src/images/GitHub-Mark-120px-plus.png'
import crate from '../../../../../src/images/cargo.png'
import gem from '../../../../../src/images/gem.png'
import pypi from '../../../../../src/images/pypi.png'

export default class PageStats extends Component {
constructor(props) {
super(props)
this.state = {
totalComponents: 0
}
}

async componentDidMount() {
const totalComponents = await getStats('totalcount')
this.setState({ totalComponents: totalComponents.value })
}

render() {
return (
<Grid className="main-container">
<Row>
<Jumbotron className="text-center" style={{ backgroundColor: '#ecf0f1' }}>
<h2>
<CountUp end={this.state.totalComponents} separator="," />
</h2>
<p>Number of total definitions</p>
</Jumbotron>
</Row>
<Row>
<div className="card-container">
<TypeCard type="npm" image={npm} />
<TypeCard type="maven" image={maven} />
<TypeCard type="nuget" image={nuget} />
<TypeCard type="git" image={git} />
<TypeCard type="pod" image={pod} />
<TypeCard type="crate" image={crate} />
<TypeCard type="gem" image={gem} />
<TypeCard type="pypi" image={pypi} />
</div>
</Row>
</Grid>
)
}
}
45 changes: 45 additions & 0 deletions src/components/Navigation/Pages/PageStats/TypeCard.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import React, { Component } from 'react'
import { UserCard } from 'react-ui-cards'
import { getStats } from '../../../../api/clearlyDefined'

export default class TypeCard extends Component {
constructor(props) {
super(props)
this.state = {
totalCount: 0,
averageLicensed: 0,
averageDescribed: 0
}
}

async componentDidMount() {
const data = await getStats(this.props.type)
if (!data.value) return
this.setState({
totalCount: data.value.totalcount,
averageLicensed: Math.round(data.value['avg_licensed.score.total'] * 100) / 100,
averageDescribed: Math.round(data.value['avg_described.score.total'] * 100) / 100
})
}

render() {
return (
<UserCard
cardClass="float"
header={this.props.image}
name={this.props.type}
positionName={`total count: ${this.state.totalCount}`}
stats={[
{
name: 'average licensed score',
value: this.state.averageLicensed
},
{
name: 'average described score',
value: this.state.averageDescribed
}
]}
/>
)
}
}
1 change: 1 addition & 0 deletions src/components/Navigation/Pages/PageStats/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from './PageStats'
Loading

0 comments on commit 5001ae8

Please sign in to comment.