Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add milestone report
  • Loading branch information
Isaac Würth committed Mar 9, 2021
commit b89a8b23707f482d45b0fffce3e6a21e43d9acf0
22 changes: 19 additions & 3 deletions package-lock.json

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

28 changes: 28 additions & 0 deletions src/gtt-report.js
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,23 @@ new Promise(resolve => {
.then(() => resolve());
}))

// get milestones
.then(() => new Promise(resolve => {
if (!config.get('query').includes('milestones')) return resolve();

Cli.list(`${Cli.fetch} Fetching milestones`);

reports
.forEach((report, done) => {
report.getMilestones()
.catch(error => done(error))
.then(() => done());
})
.catch(error => Cli.x(`could not fetch milestones.`, error))
.then(() => Cli.mark())
.then(() => resolve());
}))

// merge reports
.then(() => new Promise(resolve => {
Cli.list(`${Cli.merge} Merging reports`);
Expand Down Expand Up @@ -320,6 +337,17 @@ new Promise(resolve => {
.then(() => resolve());
}))

// process milestones
.then(() => new Promise(resolve => {
if (!config.get('query').includes('milestones') || master.milestones.length === 0) return resolve();

Cli.bar(`${Cli.process}️️ Processing milestones`, master.milestones.length);
master.processMilestones(() => Cli.advance())
.then(() => Cli.mark())
.catch(error => Cli.x(`could not process milestones.`, error))
.then(() => resolve());
}))

// make report
.then(() => new Promise(resolve => {
if (master.issues.length === 0 && master.mergeRequests.length === 0)
Expand Down
153 changes: 153 additions & 0 deletions src/models/milestone.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
const _ = require('underscore');
const moment = require('moment');

const hasTimes = require('./hasTimes');
const Issue = require('./issue')

/**
* issue model
*/
class milestone extends hasTimes {
constructor(config, data = {}) {
super(config);
this.data = data;
this.stats = {
spent : 0,
total_spent : 0,
time_estimate : 0
}
}

make(project, id, create = false) {
let promise;

if (create) {
promise = this.post(`projects/${encodeURIComponent(project)}/milestones`, {title: id});
} else {
promise = this.get(`projects/${encodeURIComponent(project)}/milestones/${id}`);
}

promise.then(issue => {
this.data = issue.body;
return promise;
});

return promise;
}

/*
* properties
*/
get iid() {
return this.data.iid;
}

get id() {
return this.data.id;
}

get project_id() {
return this.data.project_id;
}

get title() {
return this.data.title;
}

get description() {
return this.data.description;
}

get state() {
return this.data.state;
}

get created_at() {
return moment(this.data.created_at);
}

get updated_at() {
return moment(this.data.updated_at);
}

get due_date() {
return this.data.due_date ? moment(this.data.due_date): null;
}

get start_date() {
return this.data.start_date ? moment(this.data.start_date): null;
}

get expired() {
return this.data.expired;
}

get spent() {
return this.stats ? this.config.toHumanReadable(this.stats.spent, this._type) : null;
}

get total_spent() {
return this.stats ? this.config.toHumanReadable(this.stats.total_spent, this._type) : null;
}

get total_estimate() {
return this.stats ? this.config.toHumanReadable(this.stats.time_estimate, this._type) : null;
}

get _type() {
return 'milestones';
}

get _typeSingular() {
return 'Milestone';
}

getIssues(){
let promise = new Promise(resolve => {
this.get(`projects/${encodeURIComponent(this.project_id)}/issues/?milestone=${this.title}`)
.then(data => data.body)
.then(rawIssues => {
let issues = []
rawIssues.forEach(data => {
let issue = new Issue(this.config, data)
issues.push(issue)
})
this.issues = issues
resolve()
})
})

return promise
}

getStats(){
let promise = new Promise((resolve) => {
this.issues.forEach(async issue => {
await issue.getStats()
this.stats.time_estimate += issue.total_estimate;
this.stats.total_spent += issue.total_spent;
this.stats.spent += issue.spent;
})
resolve()
})
return promise
}

async getNotes(){
let promise = new Promise(async resolve => {
await this.getIssues();
this.notes = [];
for (const issue of this.issues) {
await issue.getNotes()
this.notes = this.notes.concat(issue.notes)
}
resolve()
})


return promise
}

}

module.exports = milestone;
19 changes: 19 additions & 0 deletions src/models/report.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ const Base = require('./base');
const Issue = require('./issue');
const MergeRequest = require('./mergeRequest');
const Project = require('./project');
const Milestone = require('./milestone')

/**
* report model
Expand All @@ -23,6 +24,7 @@ class report extends Base {

this.issues = [];
this.mergeRequests = [];
this.milestones = [];
}

/**
Expand Down Expand Up @@ -95,6 +97,13 @@ class report extends Base {
return promise;
}

getMilestones(){
let promise = this.all(`projects/${this.project.id}/milestones`);
promise.then(milestones => this.milestones = milestones);

return promise;
}

/**
* filter empty
* @param issues
Expand Down Expand Up @@ -153,6 +162,7 @@ class report extends Base {
if (!this.members) this.members = [];
this.members = this.members.concat(report.members ? report.members : []);
this.projects = Object.assign(this.projects, report.projects);
this.milestones = this.milestones.concat(report.milestones);
}

/**
Expand All @@ -172,6 +182,15 @@ class report extends Base {
processMergeRequests(advance = false) {
return this.process('mergeRequests', MergeRequest, advance);
}

/**
* process merge requests
* @param advance
* @return {Promise}
*/
processMilestones(advance = false) {
return this.process('milestones', Milestone, advance);
}
}

module.exports = report;
10 changes: 10 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -764,6 +764,7 @@
"estraverse" "^4.2.0"
"esutils" "^2.0.2"
"optionator" "^0.8.1"
"source-map" "~0.6.1"
optionalDependencies:
"source-map" "~0.6.1"

Expand All @@ -776,6 +777,7 @@
"estraverse" "^1.9.1"
"esutils" "^2.0.2"
"optionator" "^0.8.1"
"source-map" "~0.2.0"
optionalDependencies:
"source-map" "~0.2.0"

Expand Down Expand Up @@ -1169,6 +1171,7 @@
"async" "^1.4.0"
"optimist" "^0.6.1"
"source-map" "^0.4.4"
"uglify-js" "^2.6"
optionalDependencies:
"uglify-js" "^2.6"

Expand Down Expand Up @@ -1584,13 +1587,17 @@
"integrity" "sha1-NzaitCi4e72gzIO1P6PWM6NcKug="
"resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz"
"version" "2.4.0"
dependencies:
"graceful-fs" "^4.1.6"
optionalDependencies:
"graceful-fs" "^4.1.6"

"jsonfile@^4.0.0":
"integrity" "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss="
"resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz"
"version" "4.0.0"
dependencies:
"graceful-fs" "^4.1.6"
optionalDependencies:
"graceful-fs" "^4.1.6"

Expand Down Expand Up @@ -1664,6 +1671,8 @@
"integrity" "sha1-QIhDO0azsbolnXh4XY6W9zugJDk="
"resolved" "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz"
"version" "1.3.1"
dependencies:
"graceful-fs" "^4.1.9"
optionalDependencies:
"graceful-fs" "^4.1.9"

Expand Down Expand Up @@ -2849,6 +2858,7 @@
"version" "2.8.29"
dependencies:
"source-map" "~0.5.1"
"uglify-to-browserify" "~1.0.0"
"yargs" "~3.10.0"
optionalDependencies:
"uglify-to-browserify" "~1.0.0"
Expand Down