Skip to content

Commit

Permalink
Merge pull request #40 from Fgerthoffert/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
Fgerthoffert committed Sep 21, 2019
2 parents 2138d45 + e713b82 commit 9b216d4
Show file tree
Hide file tree
Showing 13 changed files with 157 additions and 84 deletions.
94 changes: 52 additions & 42 deletions README.md

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions cli/src/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@ import Command, { flags } from '@oclif/command';
import * as fs from 'fs';
import * as fse from 'fs-extra';
import * as jsYaml from 'js-yaml';
import * as path from 'path';

import * as loadYamlFile from 'load-yaml-file';
import * as path from 'path';

import { IConfig } from './global';

Expand All @@ -25,6 +24,7 @@ export default abstract class extends Command {
host: 'https://jira.myhost.org',
fields: {
points: 'customfield_10114',
originalPoints: 'customfield_11115',
parentInitiative: 'customfield_11112',
parentEpic: 'customfield_10314'
}
Expand Down
2 changes: 1 addition & 1 deletion cli/src/commands/roadmap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ import { IJiraIssue } from '../global';
import fetchChildren from '../utils/data/fetchChildren';
import fetchCompleted from '../utils/data/fetchCompleted';
import fetchInitiatives from '../utils/data/fetchInitiatives';
import crunchRoadmap from '../utils/roadmap/crunchRoadmap';
import getEmptyCalendarObject from '../utils/roadmap/getEmptyCalendarObject';
import getEmptyRoadmapObject from '../utils/roadmap/getEmptyRoadmapObject';
import prepareInitiativesData from '../utils/roadmap/prepareInitiativesData';
import teamClosedByWeek from '../utils/roadmap/teamClosedByWeek';
import crunchRoadmap from '../utils/roadmap/crunchRoadmap';
import teamVelocityFromCache from '../utils/roadmap/teamVelocityFromCache';

export default class Roadmap extends Command {
Expand Down
1 change: 1 addition & 0 deletions cli/src/global.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,7 @@ export interface IConfigJira {
host: string;
fields: {
points: string;
originalPoints: string;
parentInitiative: string;
parentEpic: string;
};
Expand Down
21 changes: 20 additions & 1 deletion cli/src/utils/data/fetchChildren.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ const fetchChildren = async (
'issuekey in childIssuesOf(' + issueKey + ')',
'summary,status,labels,' +
userConfig.jira.fields.points +
',' +
userConfig.jira.fields.originalPoints +
',issuetype,' +
userConfig.jira.fields.parentInitiative +
',' +
Expand All @@ -55,7 +57,8 @@ const fetchChildren = async (
const updatedIssue = {
...issue,
host: userConfig.jira.host,
jql: 'issuekey in childIssuesOf(' + issueKey + ')'
jql: 'issuekey in childIssuesOf(' + issueKey + ')',
points: returnTicketsPoints(issue, userConfig)
};
issueFileStream.write(JSON.stringify(updatedIssue) + '\n');
issues.push(updatedIssue);
Expand All @@ -69,6 +72,22 @@ const fetchChildren = async (

export default fetchChildren;

const returnTicketsPoints = (issue: any, config: IConfig) => {
if (
issue.fields[config.jira.fields.points] !== undefined &&
issue.fields[config.jira.fields.points] !== null
) {
return issue.fields[config.jira.fields.points];
}
if (
issue.fields[config.jira.fields.originalPoints] !== undefined &&
issue.fields[config.jira.fields.originalPoints] !== null
) {
return issue.fields[config.jira.fields.originalPoints];
}
return 0;
};

//https://medium.com/@wietsevenema/node-js-using-for-await-to-read-lines-from-a-file-ead1f4dd8c6f
const readLines = (input: any) => {
const output = new stream.PassThrough({ objectMode: true });
Expand Down
27 changes: 21 additions & 6 deletions cli/src/utils/data/fetchCompleted.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,10 @@ const fetchCompleted = async (
const issuesJira = await jiraSearchIssues(
config.jira,
jqlQuery,
'labels,summary,' + config.jira.fields.points
'labels,summary,' +
config.jira.fields.points +
',' +
config.jira.fields.originalPoints
);
//Note: We'd still write an empty file to cache to record the fact that no issues were completed that day
const issueFileStream = fs.createWriteStream(issuesDayFilepath, {
Expand All @@ -54,11 +57,7 @@ const fetchCompleted = async (
closedAt: scanDay,
team: teamName,
host: config.jira.host,
points:
issue.fields[config.jira.fields.points] === undefined ||
issue.fields[config.jira.fields.points] === null
? 0
: issue.fields[config.jira.fields.points],
points: returnTicketsPoints(issue, config),
jql: jqlQuery
};
issues.push(updatedIssue);
Expand All @@ -79,6 +78,22 @@ const fetchCompleted = async (
return issues;
};

const returnTicketsPoints = (issue: any, config: IConfig) => {
if (
issue.fields[config.jira.fields.points] !== undefined &&
issue.fields[config.jira.fields.points] !== null
) {
return issue.fields[config.jira.fields.points];
}
if (
issue.fields[config.jira.fields.originalPoints] !== undefined &&
issue.fields[config.jira.fields.originalPoints] !== null
) {
return issue.fields[config.jira.fields.originalPoints];
}
return 0;
};

//https://medium.com/@wietsevenema/node-js-using-for-await-to-read-lines-from-a-file-ead1f4dd8c6f
const readLines = (input: any) => {
const output = new stream.PassThrough({ objectMode: true });
Expand Down
21 changes: 20 additions & 1 deletion cli/src/utils/data/fetchInitiatives.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ const fetchInitiatives = async (
userConfig.roadmap.jqlInitiatives,
'summary,status,labels,' +
userConfig.jira.fields.points +
',' +
userConfig.jira.fields.originalPoints +
',issuetype,assignee'
);
const issueFileStream = fs.createWriteStream(initiativesCache, {
Expand All @@ -52,7 +54,8 @@ const fetchInitiatives = async (
...issue,
host: userConfig.jira.host,
jql: userConfig.roadmap.jqlInitiatives,
team: getTeamFromAssignee(issue, userConfig.roadmap.teams)
team: getTeamFromAssignee(issue, userConfig.roadmap.teams),
points: returnTicketsPoints(issue, userConfig)
};
issueFileStream.write(JSON.stringify(updatedIssue) + '\n');
issues.push(updatedIssue);
Expand All @@ -66,6 +69,22 @@ const fetchInitiatives = async (

export default fetchInitiatives;

const returnTicketsPoints = (issue: any, config: IConfig) => {
if (
issue.fields[config.jira.fields.points] !== undefined &&
issue.fields[config.jira.fields.points] !== null
) {
return issue.fields[config.jira.fields.points];
}
if (
issue.fields[config.jira.fields.originalPoints] !== undefined &&
issue.fields[config.jira.fields.originalPoints] !== null
) {
return issue.fields[config.jira.fields.originalPoints];
}
return 0;
};

//https://medium.com/@wietsevenema/node-js-using-for-await-to-read-lines-from-a-file-ead1f4dd8c6f
const readLines = (input: any) => {
const output = new stream.PassThrough({ objectMode: true });
Expand Down
26 changes: 9 additions & 17 deletions cli/src/utils/roadmap/crunchMetrics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,34 +5,26 @@
const crunchMetrics = (issuesTree: any, node: any) => {
return issuesTree.treeToArray(node).reduce(
(acc: any, item: any) => {
if (parseInt(item.fields.customfield_10114, 10) > 0) {
acc.points.total =
acc.points.total + parseInt(item.fields.customfield_10114, 10);
if (item.fields.status.statusCategory.name === "Done") {
acc.points.completed =
acc.points.completed + parseInt(item.fields.customfield_10114, 10);
if (item.points > 0) {
acc.points.total = acc.points.total + item.points;
if (item.fields.status.statusCategory.name === 'Done') {
acc.points.completed = acc.points.completed + item.points;
} else {
acc.points.remaining =
acc.points.remaining + parseInt(item.fields.customfield_10114, 10);
acc.points.remaining = acc.points.remaining + item.points;
}
}
if (
(item.fields.customfield_10114 === undefined ||
item.fields.customfield_10114 === null) &&
issuesTree.hasChildren(node) === false
) {
if (item.points === 0 && issuesTree.hasChildren(node) === false) {
acc.missingPoints = true;
}
if (
(item.fields.customfield_10114 === undefined ||
item.fields.customfield_10114 === null) &&
item.points === 0 &&
issuesTree.hasChildren(item) === false &&
item.fields.status.statusCategory.name !== "Done"
item.fields.status.statusCategory.name !== 'Done'
) {
acc.points.missing++;
}
acc.issues.total = acc.issues.total + 1;
if (item.fields.status.statusCategory.name === "Done") {
if (item.fields.status.statusCategory.name === 'Done') {
acc.issues.completed++;
} else {
acc.issues.remaining++;
Expand Down
22 changes: 16 additions & 6 deletions cli/src/utils/roadmap/crunchWeeks.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// tslint:disable-next-line: file-name-casing

import { IConfig, IJiraIssue } from "../../global";
import { startOfWeek } from "../misc/dateUtils";
import { IConfig, IJiraIssue } from '../../global';
import { startOfWeek } from '../misc/dateUtils';

const crunchWeeks = (
issuesTree: any,
Expand All @@ -25,12 +25,22 @@ const crunchWeeks = (
acc[firstDayWeekKey].points.count = acc[firstDayWeekKey].list
.filter(
(issue: IJiraIssue) =>
(issue.fields[userConfig.jira.fields.points] !== undefined &&
issue.fields[userConfig.jira.fields.points] !== null) ||
(issue.fields[userConfig.jira.fields.originalPoints] !==
undefined &&
issue.fields[userConfig.jira.fields.originalPoints] !== null)
)
.map((issue: IJiraIssue) => {
if (
issue.fields[userConfig.jira.fields.points] !== undefined &&
issue.fields[userConfig.jira.fields.points] !== null
)
.map(
(issue: IJiraIssue) => issue.fields[userConfig.jira.fields.points]
)
) {
return issue.fields[userConfig.jira.fields.points];
} else {
return issue.fields[userConfig.jira.fields.originalPoints];
}
})
.reduce((acc: number, points: number) => acc + points, 0);
}
}
Expand Down
6 changes: 3 additions & 3 deletions cli/src/utils/roadmap/prepareInitiativesData.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
// tslint:disable-next-line: file-name-casing

import { IConfig } from "../../global";
import { IConfig } from '../../global';

import crunchMetrics from "./crunchMetrics";
import crunchWeeks from "./crunchWeeks";
import crunchMetrics from './crunchMetrics';
import crunchWeeks from './crunchWeeks';

const prepareInitiativesData = (
issuesTree: any,
Expand Down
2 changes: 1 addition & 1 deletion ui/src/utils/graph.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ const exploreGraph = (
data: {
...childrenIssue,
distance: distance + 1,
status: childrenIssue.fields.status.name,
status: childrenIssue.fields.status.statusCategory.name,
type: childrenIssue.fields.issuetype.name,
points: childrenIssue.metrics.points.total
}
Expand Down
12 changes: 9 additions & 3 deletions ui/src/views/roadmap/Details/NodesGraph.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -156,13 +156,19 @@ class NodesGraph extends Component<connectedProps> {
{
selector: '[status = "Done"]',
style: {
backgroundColor: '#28a745'
backgroundColor: '#14892c'
}
},
{
selector: '[status != "Done"]',
selector: '[status = "To Do"]',
style: {
backgroundColor: '#cb2431'
backgroundColor: '#4a6785'
}
},
{
selector: '[status = "In Progress"]',
style: {
backgroundColor: '#ffd351'
}
},
{
Expand Down
3 changes: 2 additions & 1 deletion ui/src/views/roadmap/Details/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ const Details: FC<connectedProps> = ({
<Grid item>
<b>Colors:</b>
<br />
Red: Open <br />
Blue: Open <br />
Yellow: In Progress <br />
Green: Closed <br />
</Grid>
<Grid item>
Expand Down

0 comments on commit 9b216d4

Please sign in to comment.