Cleanup Codeclimate smells (#11)

* Cleanup Codeclimate smells

* Add Codeclimate badges
This commit is contained in:
Jaco Greeff
2018-12-08 16:37:05 +01:00
committed by GitHub
parent 9aaea82544
commit 91db30af82
11 changed files with 134 additions and 140 deletions
+2
View File
@@ -3,6 +3,8 @@
[![style](https://img.shields.io/badge/code%20style-semistandard-lightgrey.svg?style=flat-square)](https://github.com/Flet/semistandard)
[![npm](https://img.shields.io/npm/v/@polkadot/ui.svg?style=flat-square)](https://www.npmjs.com/package/@polkadot/ui-identicon)
[![travis](https://img.shields.io/travis/polkadot-js/ui.svg?style=flat-square)](https://travis-ci.com/polkadot-js/ui)
[![maintainability](https://img.shields.io/codeclimate/maintainability/polkadot-js/ui.svg?style=flat-square)](https://codeclimate.com/github/polkadot-js/ui/maintainability)
[![coverage](https://img.shields.io/coveralls/polkadot-js/ui.svg?style=flat-square)](https://coveralls.io/github/polkadot-js/ui?branch=master)
[![greenkeeper](https://img.shields.io/badge/greenkeeper-enabled-brightgreen.svg?style=flat-square)](https://greenkeeper.io/)
[![dependency](https://img.shields.io/david/polkadot-js/ui.svg?style=flat-square)](https://david-dm.org/polkadot-js/ui)
[![devDependency](https://img.shields.io/david/dev/polkadot-js/ui.svg?style=flat-square)](https://david-dm.org/polkadot-js/ui#info=devDependencies)
+2 -2
View File
@@ -10,9 +10,9 @@
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.1.5",
"@polkadot/keyring": "^0.33.9",
"@polkadot/keyring": "^0.33.11",
"@polkadot/ui-settings": "^0.22.8",
"@polkadot/util-crypto": "^0.33.9",
"@polkadot/util-crypto": "^0.33.11",
"@types/color": "^3.0.0",
"@types/react-copy-to-clipboard": "^4.2.6",
"color": "^3.0.0",
+62 -53
View File
@@ -9,9 +9,10 @@
//
// Here we have done the following to convert the component -
// - Converted the code to TypeScript
// - Removed the oo7 dependencies (since not initialised properly, it makes additional connections to wrong endpoints)
// - Removed the oo7 dependencies (since not initialised properly, it makes calls to wrong endpoints)
// - Remove encoding functionality, these are catered for in the base
// - Remove copy functionality (this is catered from in the base components)
// - Split calculations into relevant functions
// - Move constants to file-level
// - Overall it is now just a static component, expecting an address as an input value
@@ -45,60 +46,11 @@ const schema: { [index: string]: Scheme } = {
hmirror: { freq: 128, colors: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 6, 7, 5, 3, 4, 2, 11] }
};
function findScheme (d: number): Scheme {
let cum = 0;
const ks = Object.keys(schema);
for (let i in ks) {
cum += schema[ks[i]].freq;
if (d < cum) {
return schema[ks[i]];
}
}
throw new Error('Unable to find schema');
}
export default class Identicon extends React.PureComponent<Props> {
render () {
const { className, sixPoint = false, size, style, value } = this.props;
const r = sixPoint
? (s / 2 / 8 * 5)
: (s / 2 / 4 * 3);
const rroot3o2 = r * Math.sqrt(3) / 2;
const ro2 = r / 2;
const rroot3o4 = r * Math.sqrt(3) / 4;
const ro4 = r / 4;
const r3o4 = r * 3 / 4;
const total = Object.keys(schema).map(k => schema[k].freq).reduce((a, b) => a + b);
const id = Array.from(blake2b(decodeAddress(value))).map((x, i) =>
(x + 256 - zero[i]) % 256
);
const sat = (Math.floor(id[29] * 70 / 256 + 26) % 80) + 30;
const d = Math.floor((id[30] + id[31] * 256) % total);
const scheme = findScheme(d);
const palette = Array.from(id).map((x, i) => {
const b = (x + i % 28 * 58) % 256;
if (b === 0) {
return '#444';
} else if (b === 255) {
return 'transparent';
}
const h = Math.floor(b % 64 * 360 / 64);
const l = [53, 15, 35, 75][Math.floor(b / 64)];
return `hsl(${h}, ${sat}%, ${l}%)`;
});
const rot = (id[28] % 6) * 3;
const colors = scheme.colors.map((_, i) =>
palette[scheme.colors[i < 18 ? (i + rot) % 18 : 18]]
);
const { className, size, style, value } = this.props;
const { r, ro2, r3o4, ro4, rroot3o2, rroot3o4 } = this.getRotation();
const colors = this.getColors();
let i = 0;
return (
@@ -137,4 +89,61 @@ export default class Identicon extends React.PureComponent<Props> {
</div>
);
}
private getRotation () {
const { sixPoint = false } = this.props;
const r = sixPoint
? (s / 2 / 8 * 5)
: (s / 2 / 4 * 3);
const rroot3o2 = r * Math.sqrt(3) / 2;
const ro2 = r / 2;
const rroot3o4 = r * Math.sqrt(3) / 4;
const ro4 = r / 4;
const r3o4 = r * 3 / 4;
return { r, ro2, r3o4, ro4, rroot3o2, rroot3o4 };
}
private getColors () {
const { value } = this.props;
const total = Object.keys(schema).map(k => schema[k].freq).reduce((a, b) => a + b);
const id = Array.from(blake2b(decodeAddress(value))).map((x, i) => (x + 256 - zero[i]) % 256);
const d = Math.floor((id[30] + id[31] * 256) % total);
const rot = (id[28] % 6) * 3;
const sat = (Math.floor(id[29] * 70 / 256 + 26) % 80) + 30;
const scheme = this.findScheme(d);
const palette = Array.from(id).map((x, i) => {
const b = (x + i % 28 * 58) % 256;
if (b === 0) {
return '#444';
} else if (b === 255) {
return 'transparent';
}
const h = Math.floor(b % 64 * 360 / 64);
const l = [53, 15, 35, 75][Math.floor(b / 64)];
return `hsl(${h}, ${sat}%, ${l}%)`;
});
return scheme.colors.map((_, i) =>
palette[scheme.colors[i < 18 ? (i + rot) % 18 : 18]]
);
}
private findScheme (d: number): Scheme {
let cum = 0;
const ks = Object.keys(schema);
for (let i in ks) {
cum += schema[ks[i]].freq;
if (d < cum) {
return schema[ks[i]];
}
}
throw new Error('Unable to find schema');
}
}
+17 -15
View File
@@ -87,13 +87,28 @@ export default class IdentityIcon extends React.PureComponent<Props, State> {
}
render () {
const { className, isHighlight = false, size = DEFAULT_SIZE, style, theme = settings.uiTheme } = this.props;
const { address } = this.state;
const wrapped = this.getWrapped(address);
return !address
? wrapped
: (
<CopyToClipboard
onCopy={this.onCopy}
text={address}
>
{wrapped}
</CopyToClipboard>
);
}
private getWrapped (address?: string | null) {
const { className, isHighlight = false, size = DEFAULT_SIZE, style, theme = settings.uiTheme } = this.props;
const Component = !address
? Empty
: Components[theme] || Substrate;
const wrapped = (
return (
<Wrapper
className={['ui--IdentityIcon', className].join(' ')}
key={address || ''}
@@ -106,19 +121,6 @@ export default class IdentityIcon extends React.PureComponent<Props, State> {
/>
</Wrapper>
);
if (!address) {
return wrapped;
}
return (
<CopyToClipboard
onCopy={this.onCopy}
text={address}
>
{wrapped}
</CopyToClipboard>
);
}
private onCopy = (): void => {
+2 -2
View File
@@ -11,8 +11,8 @@
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.1.5",
"@polkadot/keyring": "^0.33.9",
"@polkadot/types": "^0.33.5",
"@polkadot/keyring": "^0.33.11",
"@polkadot/types": "^0.33.6",
"store": "^2.0.12"
}
}
+6 -14
View File
@@ -4,7 +4,7 @@
import { Prefix } from '@polkadot/keyring/address/types';
import { KeyringInstance as BaseKeyringInstance, KeyringPair, KeyringPair$Meta, KeyringPair$Json } from '@polkadot/keyring/types';
import { AccountSubject, AddressSubject, SingleAddress } from './observable/types';
import { AddressSubject, SingleAddress } from './observable/types';
import { KeyringAddress, KeyringJson, KeyringJson$Meta, KeyringStruct } from './types';
import store from 'store';
@@ -22,7 +22,7 @@ import keyringOption from './options';
// Chain determination occurs outside of Keyring. Loading `keyring.loadAll()` is triggered
// from the API after the chain is received
class Keyring implements KeyringStruct {
private _accounts: AccountSubject;
private _accounts: AddressSubject;
private _addresses: AddressSubject;
private _keyring?: BaseKeyringInstance;
private _prefix: Prefix;
@@ -81,9 +81,7 @@ class Keyring implements KeyringStruct {
private addTimestamp (pair: KeyringPair): void {
if (!pair.getMeta().whenCreated) {
pair.setMeta({
whenCreated: Date.now()
});
pair.setMeta({ whenCreated: Date.now() });
}
}
@@ -147,12 +145,8 @@ class Keyring implements KeyringStruct {
return Object
.keys(available)
.map((address) =>
this.getAddress(address, 'account')
)
.filter((account) =>
env.isDevelopment() || account.getMeta().isTesting !== true
);
.map((address) => this.getAddress(address, 'account'))
.filter((account) => env.isDevelopment() || account.getMeta().isTesting !== true);
}
getAddress (_address: string | Uint8Array, type: 'account' | 'address' = 'address'): KeyringAddress {
@@ -181,9 +175,7 @@ class Keyring implements KeyringStruct {
return Object
.keys(available)
.map((address) =>
this.getAddress(address)
);
.map((address) => this.getAddress(address));
}
getPair (address: string | Uint8Array): KeyringPair {
@@ -11,26 +11,27 @@ import store from 'store';
import createOptionItem from '../options/item';
import development from './development';
function callNext (current: SubjectInfo, subject: BehaviorSubject<any>, withTest: boolean) {
const isDevMode = development.isDevelopment();
subject.next(
Object.keys(current).reduce((filtered, key) => {
const { json: { meta: { isTesting = false } = {} } = {} } = current[key];
if (!withTest || isDevMode || isTesting !== true) {
filtered[key] = current[key];
}
return filtered;
}, {} as SubjectInfo)
);
}
export default function genericSubject (keyCreator: (address: string) => string, withTest: boolean = false): AddressSubject {
let current: SubjectInfo = {};
const subject = new BehaviorSubject({});
const next = (): void => {
const isDevMode = development.isDevelopment();
subject.next(
Object
.keys(current)
.reduce((filtered, key) => {
const { json: { meta: { isTesting = false } = {} } = {} } = current[key];
if (!withTest || isDevMode || isTesting !== true) {
filtered[key] = current[key];
}
return filtered;
}, {} as SubjectInfo)
);
};
const next = (): void =>
callNext(current, subject, withTest);
development.subject.subscribe(next);
@@ -6,11 +6,6 @@ import { BehaviorSubject } from 'rxjs';
import { KeyringSectionOption } from '../options/types';
import { KeyringJson } from '../types';
export type SingleAccount = {
json: KeyringJson,
option: KeyringSectionOption
};
export type SingleAddress = {
json: KeyringJson,
option: KeyringSectionOption
@@ -20,12 +15,6 @@ export type SubjectInfo = {
[index: string]: SingleAddress
};
export type AccountSubject = {
add: (account: string, json: KeyringJson) => SingleAccount,
remove: (account: string) => void,
subject: BehaviorSubject<SubjectInfo>
};
export type AddressSubject = {
add: (address: string, json: KeyringJson) => SingleAddress,
remove: (address: string) => void,
+2 -3
View File
@@ -7,6 +7,7 @@ import { SingleAddress } from '../observable/types';
import { KeyringOptions, KeyringOptionInstance, KeyringSectionOption, KeyringSectionOptions } from './types';
import { BehaviorSubject } from 'rxjs';
import { assert } from '@polkadot/util';
import observableAll from '../observable';
@@ -26,9 +27,7 @@ class KeyringOption implements KeyringOptionInstance {
}
init (keyring: KeyringStruct): void {
if (hasCalledInitOptions) {
throw new Error('Unable to initialise options more than once');
}
assert(!hasCalledInitOptions, 'Unable to initialise options more than once');
observableAll.subscribe((value) => {
const options = this.emptyOptions();
+2 -2
View File
@@ -3,7 +3,7 @@
// of the Apache-2.0 license. See the LICENSE file for details.
import { KeyringInstance as BaseKeyringInstance, KeyringPair, KeyringPair$Meta, KeyringPair$Json } from '@polkadot/keyring/types';
import { AccountSubject, AddressSubject, SingleAddress } from './observable/types';
import { AddressSubject, SingleAddress } from './observable/types';
export type KeyringJson$Meta = {
isRecent?: boolean,
@@ -28,7 +28,7 @@ export type KeyringAddress = {
};
export interface KeyringStruct {
readonly accounts: AccountSubject;
readonly accounts: AddressSubject;
readonly addresses: AddressSubject;
readonly keyring: BaseKeyringInstance | undefined;
+21 -21
View File
@@ -1430,14 +1430,14 @@
typedoc-plugin-no-inherit "^1.0.2"
typescript "^3.2.1"
"@polkadot/keyring@^0.33.9":
version "0.33.9"
resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-0.33.9.tgz#d192ec400a0ba6f0c4825bf2e6a9f3e180c68a0f"
integrity sha512-nXyXBMdG8SIwyUmOCCaCdvJAbcftzq6ElWHgZFa84VxFYwviWMbRicPSkrvZr+KTrn7av86h7bJsnUbi/j3phQ==
"@polkadot/keyring@^0.33.11":
version "0.33.11"
resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-0.33.11.tgz#79c6174e9b27147ff69a2375f39a2462b2d581c7"
integrity sha512-AP98VfGbcdXo9Bp650klh0l734kcmrYM1kzDs+mpGmpwMQtjRrEuitWwAvb84Sl6Snq6qMOadLXVAxU8PtOtgA==
dependencies:
"@babel/runtime" "^7.1.5"
"@polkadot/util" "^0.33.9"
"@polkadot/util-crypto" "^0.33.9"
"@polkadot/util" "^0.33.11"
"@polkadot/util-crypto" "^0.33.11"
"@types/bs58" "^3.0.30"
bs58 "^4.0.1"
@@ -1446,22 +1446,22 @@
resolved "https://registry.yarnpkg.com/@polkadot/ts/-/ts-0.1.41.tgz#647b44b038f94a7acf76633b25cb72df897872fc"
integrity sha512-/vYpjqKU+QKHNAlFdLgFZAAr54wxQMgIuszZ5BxaayUoq7ukDlvCPhUGQ3fNoyBSEaL7uTCZ/5SVRc363IehoA==
"@polkadot/types@^0.33.5":
version "0.33.5"
resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-0.33.5.tgz#a6b075c6ed104ed243103849f2ae1ee375b31a61"
integrity sha512-ITvysLq7Y1PdwlsvigKukDoEtbvG+ic/EM1xsIM08Gcy6X11kREGDHbt9ORMqPn/nQZrsd4HkI8gK4UOHp0aSQ==
"@polkadot/types@^0.33.6":
version "0.33.6"
resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-0.33.6.tgz#04b2a9cabf11634adfa6ee7cdd0cd27665c670c5"
integrity sha512-MKhWsuPqKL9PMvq2rkwckrFVv6HfeEktKlJgMozphxUTebNq+vcpz4zAMwCdP4yKjzNDm8eajS2FG0ui25v3xA==
dependencies:
"@babel/runtime" "^7.1.5"
"@polkadot/keyring" "^0.33.9"
"@polkadot/util" "^0.33.9"
"@polkadot/keyring" "^0.33.11"
"@polkadot/util" "^0.33.11"
"@polkadot/util-crypto@^0.33.9":
version "0.33.9"
resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-0.33.9.tgz#6f465604b1c5947d1a06fd4c84c845913d45a016"
integrity sha512-6beNVnvsuYd3V9LPU6yNSxjC6rzsXIWVQn4IzLUsQk7S8NEIgVSTl7xVP9OnRX6VzKSjs2DhqUe8p0ZqBygjNg==
"@polkadot/util-crypto@^0.33.11":
version "0.33.11"
resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-0.33.11.tgz#25b30e69a4da1f6a42d3680536130ca4f9480db6"
integrity sha512-jL1TzlqHGKRu9SN80e0K/0H1ZZ6fRTv96s2f6s27GrGt6+tcPEVcmaQK5vjEDMw2pT9+b5TPwcx2gLwh56GLVg==
dependencies:
"@babel/runtime" "^7.1.5"
"@polkadot/util" "^0.33.9"
"@polkadot/util" "^0.33.11"
"@types/bip39" "^2.4.1"
bip39 "^2.5.0"
blakejs "^1.1.0"
@@ -1469,10 +1469,10 @@
tweetnacl "^1.0.0"
xxhashjs "^0.2.2"
"@polkadot/util@^0.33.9":
version "0.33.9"
resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-0.33.9.tgz#65c745cad3a9583fb6a68f734f10d12318611e89"
integrity sha512-F4doCg/l1TfrM0iNxBaxmwtbaNKcKOdKEX99Uj37So2Rwxg/XVenXa0sctA+4Vk3nauQ6kJRTUPLqiBdKAdmsg==
"@polkadot/util@^0.33.11":
version "0.33.11"
resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-0.33.11.tgz#3e2433e556ee14c685ebc5920c229cb76e0b985b"
integrity sha512-Tn+WYU+RxOaJhrUsPjBOk77MDKb6bsqVkcs5ysSc1HUDIRqZwGABnX1rhP2/DipS91hj8DQ2HZE18S7mCBv1bQ==
dependencies:
"@babel/runtime" "^7.1.5"
"@types/bn.js" "^4.11.3"