q247-models-core
Version:
Models for effort/calories in q247 plugin
188 lines (187 loc) • 6.22 kB
TypeScript
declare module "iface/event" {
export interface Author {
name: string;
email: string;
}
export interface ChangeSummary {
raw: string;
files: number;
inserts: number;
deletions: number;
}
export interface DecodedBase {
author: Author;
ticket: string;
ticketPrefix: string;
changeSummary: ChangeSummary;
}
export interface Decoded extends DecodedBase {
commit: string;
commitId: string;
date: string;
message: string;
changes: string | string[];
}
/**
* Base increment event structure. There might be multiple increments (like code increment
* aka commit, or some content increments like working on JIRA issue)
*/
export interface EventBase {
id: string;
version: string;
oper: string;
account: string;
user: string;
project: string;
decoded: DecodedBase;
ct: number;
tenantId: string;
diff: any;
}
/**
* Represents a "commit" event
*/
export interface Event extends EventBase {
remote: string;
oper: "commit" | "push";
decoded: Decoded;
gitlog: string;
diff: string;
}
}
declare module "iface/content" {
import { DecodedBase, EventBase } from "iface/event";
export namespace Content {
enum ContentEventOperEnum {
JIRA_TICKET = "jira-ticket",
CONFLU_PAGE = "conflu-page"
}
/**
* Represents an increment/change in content.
* Usually either we have before and after content or diff content.
* If we have diff content, then before and after are not required.
* If we have before and after content, then diff content is not required.
*/
interface ContentDiff {
fieldId?: string;
before?: string;
after?: string;
diff?: string;
}
interface ContentJiraTicketEvent extends ContentEvent {
oper: ContentEventOperEnum.JIRA_TICKET;
}
interface ContentConfluencPageEvent extends ContentEvent {
oper: ContentEventOperEnum.CONFLU_PAGE;
}
interface DecodedContent extends DecodedBase {
url?: string;
projectId?: string;
reason?: "issue" | "comment" | "page";
}
/**
* Represents an event related to content, such as creating new content or updating existing content.
* This is a more generic event that can be used for various content-related operations.
*/
interface ContentEvent extends EventBase {
decoded: DecodedContent;
diff: ContentDiff[];
}
}
}
declare module "iface/model" {
import { Event } from "iface/event";
import { Content } from "iface/content";
export interface Score {
id: string;
model: ScoreModelCard;
event: Event | Content.ContentEvent;
}
export interface ScalarScore extends Score {
score: number;
}
export interface ScalarScoreWithChangeSummary extends ScalarScore {
files: number;
inserts: number;
deletions: number;
}
export interface ScoreModelCard {
name: string;
version: string;
}
export interface ModelParams {
[key: string]: any;
}
export interface ScoreModel extends ScoreModelCard {
score: (event: Event) => Promise<Score>;
}
export interface ContentScoreModel extends ScoreModelCard {
score: (event: Content.ContentEvent) => Promise<ScalarScoreWithChangeSummary>;
}
export namespace Diff {
interface GitDiffLineChange {
type: 'added' | 'removed';
line: string;
}
interface GitDiffFile {
original: string;
resulting: string;
changed: GitDiffLineChange[];
}
interface GitDiffResult {
[filePath: string]: GitDiffFile;
}
}
export namespace Halstead {
interface FileMetrics {
[filePath: string]: Metrics;
}
interface IncrementMetrics {
files: FileMetrics;
total: Metrics;
}
interface Metrics {
scaledEffort: number;
vocabulary: number;
length: number;
volume: number;
difficulty: number;
effort: number;
timeToProgram: number;
deliveredBugs: number;
}
interface Score extends ScalarScore {
increment: IncrementMetrics;
}
}
}
declare module "logic/commons" {
import { Diff } from "iface/model";
/**
* Will calculate diff information (resulting code, and original code)
* for each file from a provided git diff (unified diff format)
* @param diffText
* @returns
*/
export const parseGitDiff: (diffText: string) => Diff.GitDiffResult;
/**
* This is a FMW factor function that applies following modification to the score:
* - Is linear when score < upper
* - Smoothly flattens and asymptotically approaches border for score ≥ upper
*
* f(x)=border−(border−upper)⋅e^(−(x−upper/L)
* @param score original score <0, inf)
* @param upper up to upper we do not modify the score, after upper we asymptotically reach border
* @param border asymptotic border for scores that are greater than upper
* @param L the bigger the L the slower approach towards border
* @returns modified score <0, border)
*/
export const fmwFactor: (score: number, upper?: number, border?: number, L?: number) => number;
}
declare module "q247-models-core" {
export type { ScalarScore, Score, ScoreModel, ScoreModelCard, ContentScoreModel, ScalarScoreWithChangeSummary, ModelParams } from "iface/model";
export type { Event, Decoded, Author, ChangeSummary, DecodedBase, EventBase } from "iface/event";
export { Diff, Halstead } from "iface/model";
export type { Content } from "iface/content";
export { parseGitDiff, fmwFactor } from "logic/commons";
}