Skip to content

Commit

Permalink
feat(sync): select label color from flag or state, value, and project
Browse files Browse the repository at this point in the history
  • Loading branch information
ssube committed Aug 15, 2020
1 parent e4ab01a commit 365a23c
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 18 deletions.
11 changes: 11 additions & 0 deletions docs/api/cautious-journey.syncoptions.colors.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions docs/api/cautious-journey.syncoptions.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

32 changes: 32 additions & 0 deletions src/labels.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import { doesExist, InvalidArgumentError } from '@apextoaster/js-utils';
import { randomItem } from './utils';

/**
* A reference to another label.
*/
Expand Down Expand Up @@ -113,3 +116,32 @@ export function prioritizeLabels<TLabel extends BaseLabel>(labels: Array<TLabel>
}
});
}

/**
* Pick a label color, preferring the label data if set, falling back to a randomly selected color.
*
* TODO: this is a terrible overload
*/
export function colorizeLabel(flag: FlagLabel, colors: Array<string>): string;
export function colorizeLabel(state: StateLabel, value: StateValue, colors: Array<string>): string;
export function colorizeLabel(label: BaseLabel, colorsOrValue: Array<string> | StateValue, maybeColors?: Array<string>): string {
if (Array.isArray(colorsOrValue)) {
const { color } = label;
if (doesExist(color)) {
return color;
} else {
return randomItem(colorsOrValue);
}
} else {
if (!Array.isArray(maybeColors)) {
throw new InvalidArgumentError();
}

const { color = colorsOrValue.color } = label;
if (doesExist(color)) {
return color;
} else {
return randomItem(maybeColors);
}
}
}
22 changes: 13 additions & 9 deletions src/main.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { InvalidArgumentError, isNil, doesExist } from '@apextoaster/js-utils';
import { doesExist, InvalidArgumentError, isNil } from '@apextoaster/js-utils';
import { createSchema } from '@apextoaster/js-yaml-schema';
import { existsSync, readFileSync, realpathSync } from 'fs';
import { DEFAULT_SAFE_SCHEMA, safeLoad } from 'js-yaml';
Expand Down Expand Up @@ -57,25 +57,29 @@ export async function main(argv: Array<string>): Promise<number> {
}, 'startup environment');

for (const project of config.projects) {
if (doesExist(args.project) && !args.project.includes(project.name)) {
logger.info({ project: project.name }, 'skipping project');
const { colors, flags, name, states } = project;

if (doesExist(args.project) && !args.project.includes(name)) {
logger.info({ project: name }, 'skipping project');
continue;
}

const remote = new GithubRemote({
...project.remote,
dryrun: args.dryrun,
data: project.remote.data,
dryrun: args.dryrun || project.remote.dryrun,
logger,
type: project.remote.type,
});
await remote.connect();

// mode switch
const options: SyncOptions = {
flags: project.flags,
colors,
flags,
logger,
project: project.name,
project: name,
remote,
states: project.states,
states,
};
switch (mode) {
case Commands.ISSUES:
Expand All @@ -85,7 +89,7 @@ export async function main(argv: Array<string>): Promise<number> {
await syncLabels(options);
break;
default:
throw new InvalidArgumentError('unknown mode');
throw new InvalidArgumentError('unknown command');
}
}

Expand Down
15 changes: 8 additions & 7 deletions src/sync.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { doesExist, mustExist } from '@apextoaster/js-utils';
import { Logger } from 'noicejs';

import { FlagLabel, getLabelNames, StateLabel, valueName } from './labels';
import { colorizeLabel, FlagLabel, getLabelNames, StateLabel, valueName } from './labels';
import { LabelUpdate, Remote } from './remote';
import { resolveLabels } from './resolve';
import { defaultTo } from './utils';
import { defaultTo, defaultUntil } from './utils';

export interface SyncOptions {
colors: Array<string>;
flags: Array<FlagLabel>;
logger: Logger;
project: string;
Expand Down Expand Up @@ -88,7 +89,7 @@ export async function createLabel(options: SyncOptions, name: string) {
const flag = options.flags.find((it) => name === it.name);
if (doesExist(flag)) {
await options.remote.createLabel({
color: mustExist(flag.color),
color: colorizeLabel(flag, options.colors),
desc: mustExist(flag.desc),
name,
project: options.project,
Expand All @@ -102,8 +103,8 @@ export async function createLabel(options: SyncOptions, name: string) {
const value = state.values.find((it) => valueName(state, it) === name);
if (doesExist(value)) {
await options.remote.createLabel({
color: defaultTo(defaultTo(value.color, state.color), ''),
desc: defaultTo(defaultTo(value.desc, state.desc), ''),
color: colorizeLabel(state, value, options.colors),
desc: defaultUntil(value.desc, state.desc, ''),
name: valueName(state, value),
project: options.project,
});
Expand Down Expand Up @@ -138,7 +139,7 @@ export async function syncSingleLabel(options: SyncOptions, label: LabelUpdate):
const flag = options.flags.find((it) => label.name === it.name);
if (doesExist(flag)) {
await syncLabelDiff(options, label, {
color: defaultTo(flag.color, label.color),
color: colorizeLabel(flag, options.colors),
desc: defaultTo(flag.desc, label.desc),
name: flag.name,
project: options.project,
Expand All @@ -152,7 +153,7 @@ export async function syncSingleLabel(options: SyncOptions, label: LabelUpdate):
const value = state.values.find((it) => valueName(state, it) === label.name);
if (doesExist(value)) {
await syncLabelDiff(options, label, {
color: defaultTo(value.color, label.color),
color: colorizeLabel(state, value, options.colors),
desc: defaultTo(value.desc, label.desc),
name: valueName(state, value),
project: options.project,
Expand Down
12 changes: 11 additions & 1 deletion src/utils.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { doesExist, Optional } from '@apextoaster/js-utils';
import { doesExist, Optional, mustExist } from '@apextoaster/js-utils';

export function defaultTo<T>(a: Optional<T>, b: T): T {
if (doesExist(a)) {
Expand All @@ -7,3 +7,13 @@ export function defaultTo<T>(a: Optional<T>, b: T): T {
return b;
}
}

export function defaultUntil<T>(...items: Array<Optional<T>>): T {
const result = items.reduce(defaultTo, undefined);
return mustExist(result);
}

export function randomItem<T>(items: Array<T>, source = Math.random): T {
const idx = Math.floor(source() * items.length);
return items[idx];
}
13 changes: 12 additions & 1 deletion test/TestUtils.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { expect } from 'chai';

import { defaultTo } from '../src/utils';
import { defaultTo, defaultUntil } from '../src/utils';

const TEST_TRUE = 'foo';
const TEST_FALSE = 'bar';
Expand All @@ -14,4 +14,15 @@ describe('utils', () => {
expect(defaultTo(TEST_TRUE, TEST_FALSE)).to.equal(TEST_TRUE);
});
});

describe('default until value helper', () => {
it('should return the first defined value', () => {
/* eslint-disable-next-line no-null/no-null */
expect(defaultUntil(null, null, TEST_TRUE)).to.equal(TEST_TRUE);
/* eslint-disable-next-line no-null/no-null */
expect(defaultUntil(null, undefined, TEST_TRUE)).to.equal(TEST_TRUE);
expect(defaultUntil(undefined, TEST_TRUE, undefined, undefined, TEST_FALSE)).to.equal(TEST_TRUE);
expect(defaultUntil(undefined, undefined, TEST_TRUE, undefined)).to.equal(TEST_TRUE);
});
});
});

0 comments on commit 365a23c

Please sign in to comment.