fix(tests): now using tstest

This commit is contained in:
2018-08-04 17:53:22 +02:00
parent df18aba4b5
commit f60deddadd
37 changed files with 1607 additions and 1659 deletions

View File

@ -1,8 +1,8 @@
export { Task, ITaskFunction } from './taskbuffer.classes.task'
export { Taskchain } from './taskbuffer.classes.taskchain'
export { Taskparallel } from './taskbuffer.classes.taskparallel'
export { TaskManager } from './taskbuffer.classes.taskmanager'
export { TaskOnce } from './taskbuffer.classes.taskonce'
export { Task, ITaskFunction } from './taskbuffer.classes.task';
export { Taskchain } from './taskbuffer.classes.taskchain';
export { Taskparallel } from './taskbuffer.classes.taskparallel';
export { TaskManager } from './taskbuffer.classes.taskmanager';
export { TaskOnce } from './taskbuffer.classes.taskonce';
// import for naming only
import './taskbuffer.classes.helpers'
import './taskbuffer.classes.helpers';

View File

@ -1,160 +1,160 @@
import plugins = require('./taskbuffer.plugins')
import { Task, ITaskFunction } from './taskbuffer.classes.task'
import plugins = require('./taskbuffer.plugins');
import { Task, ITaskFunction } from './taskbuffer.classes.task';
export let emptyTaskFunction: ITaskFunction = function (x) {
let done = plugins.q.defer()
done.resolve()
return done.promise
}
export let emptyTaskFunction: ITaskFunction = function(x) {
let done = plugins.smartpromise.defer();
done.resolve();
return done.promise;
};
export let isTask = function (taskArg: Task): boolean {
if (
taskArg instanceof Task
&& typeof taskArg.taskFunction === 'function'
) {
return true
export let isTask = function(taskArg: Task): boolean {
if (taskArg instanceof Task && typeof taskArg.taskFunction === 'function') {
return true;
} else {
return false
return false;
}
}
};
export let isTaskTouched = (taskArg: Task, touchedTasksArray: Task[]): boolean => {
let result = false
let result = false;
for (let keyArg in touchedTasksArray) {
if (taskArg === touchedTasksArray[ keyArg ]) {
result = true
if (taskArg === touchedTasksArray[keyArg]) {
result = true;
}
}
return result
}
return result;
};
export let runTask = async (taskArg: Task, optionsArg: { x?, touchedTasksArray?: Task[] }) => {
let done = plugins.q.defer()
export let runTask = async (taskArg: Task, optionsArg: { x?; touchedTasksArray?: Task[] }) => {
let done = plugins.smartpromise.defer();
// pay respect to execDelay
if (taskArg.execDelay) {
await plugins.smartdelay.delayFor(taskArg.execDelay)
await plugins.smartdelay.delayFor(taskArg.execDelay);
}
// set running params
taskArg.running = true
taskArg.running = true;
done.promise.then(async () => { taskArg.running = false })
done.promise.then(async () => {
taskArg.running = false;
});
// handle options
let options = plugins.lodash.merge(
{ x: undefined, touchedTasksArray: [] },
optionsArg
)
let x = options.x
let touchedTasksArray: Task[] = options.touchedTasksArray
let options = {
...{ x: undefined, touchedTasksArray: [] },
...optionsArg
};
let x = options.x;
let touchedTasksArray: Task[] = options.touchedTasksArray;
touchedTasksArray.push(taskArg)
touchedTasksArray.push(taskArg);
// run the task cascade
let localDeferred = plugins.q.defer()
let localDeferred = plugins.smartpromise.defer();
localDeferred.promise
.then(() => {
if (taskArg.preTask && !isTaskTouched(taskArg.preTask, touchedTasksArray)) {
return runTask(taskArg.preTask, { x: x, touchedTasksArray: touchedTasksArray })
return runTask(taskArg.preTask, { x: x, touchedTasksArray: touchedTasksArray });
} else {
let done2 = plugins.q.defer()
done2.resolve(x)
return done2.promise
let done2 = plugins.smartpromise.defer();
done2.resolve(x);
return done2.promise;
}
})
.then(x => {
return taskArg.taskFunction(x)
return taskArg.taskFunction(x);
})
.then(x => {
if (taskArg.afterTask && !isTaskTouched(taskArg.afterTask, touchedTasksArray)) {
return runTask(taskArg.afterTask, { x: x, touchedTasksArray: touchedTasksArray })
return runTask(taskArg.afterTask, { x: x, touchedTasksArray: touchedTasksArray });
} else {
let done2 = plugins.q.defer()
done2.resolve(x)
return done2.promise
let done2 = plugins.smartpromise.defer();
done2.resolve(x);
return done2.promise;
}
})
.then(x => {
done.resolve(x)
}).catch((err) => {
console.log(err)
done.resolve(x);
})
localDeferred.resolve()
return await done.promise
}
.catch(err => {
console.log(err);
});
localDeferred.resolve();
return await done.promise;
};
export interface cycleObject {
cycleCounter: number,
deferred: plugins.q.Deferred<any>
cycleCounter: number;
deferred: plugins.smartpromise.Deferred<any>;
}
export class CycleCounter {
task: Task
cycleObjectArray: cycleObject[] = []
task: Task;
cycleObjectArray: cycleObject[] = [];
constructor(taskArg: Task) {
this.task = taskArg
this.task = taskArg;
}
getPromiseForCycle (cycleCountArg: number) {
let done = plugins.q.defer()
getPromiseForCycle(cycleCountArg: number) {
let done = plugins.smartpromise.defer();
let cycleObject: cycleObject = {
cycleCounter: cycleCountArg,
deferred: done
}
this.cycleObjectArray.push(cycleObject)
return done.promise
};
this.cycleObjectArray.push(cycleObject);
return done.promise;
}
informOfCycle (x) {
let newCycleObjectArray: cycleObject[] = []
informOfCycle(x) {
let newCycleObjectArray: cycleObject[] = [];
this.cycleObjectArray.forEach(cycleObjectArg => {
cycleObjectArg.cycleCounter--
cycleObjectArg.cycleCounter--;
if (cycleObjectArg.cycleCounter <= 0) {
cycleObjectArg.deferred.resolve(x)
cycleObjectArg.deferred.resolve(x);
} else {
newCycleObjectArray.push(cycleObjectArg)
newCycleObjectArray.push(cycleObjectArg);
}
})
this.cycleObjectArray = newCycleObjectArray
});
this.cycleObjectArray = newCycleObjectArray;
}
}
export class BufferRunner {
task: Task
task: Task;
// initialze by default
bufferCounter: number = 0
running: boolean = false
bufferCounter: number = 0;
running: boolean = false;
constructor(taskArg: Task) {
this.task = taskArg
this.task = taskArg;
}
trigger (x): Promise<any> {
trigger(x): Promise<any> {
if (!(this.bufferCounter >= this.task.bufferMax)) {
this.bufferCounter++
this.bufferCounter++;
}
let returnPromise: Promise<any> = this.task.cycleCounter.getPromiseForCycle(this.bufferCounter + 1)
let returnPromise: Promise<any> = this.task.cycleCounter.getPromiseForCycle(
this.bufferCounter + 1
);
if (!this.running) {
this._run(x)
this._run(x);
}
return returnPromise
return returnPromise;
}
private _run (x) {
let recursiveBufferRunner = (x) => {
private _run(x) {
let recursiveBufferRunner = x => {
if (this.bufferCounter >= 0) {
this.running = true
this.task.running = true
runTask(this.task, { x: x })
.then((x) => {
this.bufferCounter--
this.task.cycleCounter.informOfCycle(x)
recursiveBufferRunner(x)
})
this.running = true;
this.task.running = true;
runTask(this.task, { x: x }).then(x => {
this.bufferCounter--;
this.task.cycleCounter.informOfCycle(x);
recursiveBufferRunner(x);
});
} else {
this.running = false
this.task.running = false
this.running = false;
this.task.running = false;
}
}
recursiveBufferRunner(x)
};
recursiveBufferRunner(x);
}
}

View File

@ -1,70 +1,70 @@
import * as plugins from './taskbuffer.plugins'
import * as helpers from './taskbuffer.classes.helpers'
import * as plugins from './taskbuffer.plugins';
import * as helpers from './taskbuffer.classes.helpers';
export interface ITaskFunction {
(x?: any): PromiseLike<any>
(x?: any): PromiseLike<any>;
}
export class Task {
// man datory properties
name: string
taskFunction: ITaskFunction
buffered: boolean
name: string;
taskFunction: ITaskFunction;
buffered: boolean;
bufferMax: number
execDelay: number
bufferMax: number;
execDelay: number;
// tasks to run before and after
preTask: Task
afterTask: Task
preTask: Task;
afterTask: Task;
// initialize by default
running: boolean = false
bufferRunner = new helpers.BufferRunner(this)
cycleCounter = new helpers.CycleCounter(this)
running: boolean = false;
bufferRunner = new helpers.BufferRunner(this);
cycleCounter = new helpers.CycleCounter(this);
idle: boolean = true
private _state: string = 'ready'
idle: boolean = true;
private _state: string = 'ready';
constructor(optionsArg: {
/**
* the task function to run, must return promise
*/
taskFunction: ITaskFunction
taskFunction: ITaskFunction;
/**
* any other task to run before
*/
preTask?: Task
preTask?: Task;
/**
* any other task to run after
*/
afterTask?: Task
afterTask?: Task;
/**
* wether this task should run buffered
*/
buffered?: boolean
buffered?: boolean;
/**
* the maximum buffer
*/
bufferMax?: number
bufferMax?: number;
/**
* the execution delay, before the task is executed
* only makes sense when running in buffered mode
*/
execDelay?: number
execDelay?: number;
/**
* the name of the task
*/
name?: string
name?: string;
}) {
this.taskFunction = optionsArg.taskFunction
this.preTask = optionsArg.preTask
this.afterTask = optionsArg.afterTask
this.idle = !this.running
this.buffered = optionsArg.buffered
this.bufferMax = optionsArg.bufferMax
this.execDelay = optionsArg.execDelay
this.name = optionsArg.name
this.taskFunction = optionsArg.taskFunction;
this.preTask = optionsArg.preTask;
this.afterTask = optionsArg.afterTask;
this.idle = !this.running;
this.buffered = optionsArg.buffered;
this.bufferMax = optionsArg.bufferMax;
this.execDelay = optionsArg.execDelay;
this.name = optionsArg.name;
}
/**
@ -72,9 +72,9 @@ export class Task {
*/
trigger(x?): Promise<any> {
if (this.buffered) {
return this.triggerBuffered(x)
return this.triggerBuffered(x);
} else {
return this.triggerUnBuffered(x)
return this.triggerUnBuffered(x);
}
}
@ -82,25 +82,25 @@ export class Task {
* trigger task unbuffered.
*/
triggerUnBuffered(x?): Promise<any> {
return helpers.runTask(this, { x: x })
return helpers.runTask(this, { x: x });
}
/**
* trigger task buffered.
*/
triggerBuffered(x?): Promise<any> {
return this.bufferRunner.trigger(x)
return this.bufferRunner.trigger(x);
}
get state(): string {
return this._state
return this._state;
}
set state(stateArg: string) {
if (stateArg === 'locked') {
this._state = 'locked'
this._state = 'locked';
} else {
plugins.beautylog.error('state type ' + stateArg + ' could not be set')
plugins.smartlog.defaultLogger.error('state type ' + stateArg + ' could not be set');
}
}
}

View File

@ -1,63 +1,58 @@
// TaskChain chains tasks
// and extends Task
import * as plugins from './taskbuffer.plugins'
import { Task } from './taskbuffer.classes.task'
import helpers = require('./taskbuffer.classes.helpers')
import * as plugins from './taskbuffer.plugins';
import { Task } from './taskbuffer.classes.task';
import helpers = require('./taskbuffer.classes.helpers');
export class Taskchain extends Task {
taskArray: Task[]
private _oraObject
taskArray: Task[];
constructor(optionsArg: {
taskArray: Task[],
name?: string,
log?: boolean,
buffered?: boolean,
bufferMax?: number
taskArray: Task[];
name?: string;
log?: boolean;
buffered?: boolean;
bufferMax?: number;
}) {
let options = plugins.lodash.merge(
{
let options = {
...{
name: 'unnamed Taskchain',
log: false
},
optionsArg,
{
taskFunction: (x: any) => { // this is the function that gets executed when TaskChain is triggered
let done = plugins.q.defer() // this is the starting Deferred object
let taskCounter = 0 // counter for iterating async over the taskArray
let iterateTasks = (x) => {
if (typeof this.taskArray[ taskCounter ] !== 'undefined') {
this._oraObject.text(this.name + ' running: Task' + this.taskArray[ taskCounter ].name)
this.taskArray[ taskCounter ].trigger(x)
.then((x) => {
plugins.beautylog.ok(this.taskArray[ taskCounter ].name)
taskCounter++
iterateTasks(x)
})
...optionsArg,
...{
taskFunction: (x: any) => {
// this is the function that gets executed when TaskChain is triggered
let done = plugins.smartpromise.defer(); // this is the starting Deferred object
let taskCounter = 0; // counter for iterating async over the taskArray
let iterateTasks = x => {
if (typeof this.taskArray[taskCounter] !== 'undefined') {
console.log(this.name + ' running: Task' + this.taskArray[taskCounter].name);
this.taskArray[taskCounter].trigger(x).then(x => {
plugins.smartlog.defaultLogger.info(this.taskArray[taskCounter].name);
taskCounter++;
iterateTasks(x);
});
} else {
this._oraObject.endOk('Taskchain "' + this.name + '" completed successfully')
done.resolve(x)
console.log('Taskchain "' + this.name + '" completed successfully');
done.resolve(x);
}
}
iterateTasks(x)
return done.promise
};
iterateTasks(x);
return done.promise;
}
}
)
super(options)
this.taskArray = optionsArg.taskArray
this._oraObject = plugins.beautylog.ora
if (optionsArg.log === true) {
this._oraObject.start()
}
};
super(options);
this.taskArray = optionsArg.taskArray;
}
addTask (taskArg: Task) {
this.taskArray.push(taskArg)
addTask(taskArg: Task) {
this.taskArray.push(taskArg);
}
removeTask (taskArg: Task) {
removeTask(taskArg: Task) {
// TODO:
}
shiftTask () {
shiftTask() {
// TODO:
}
}

View File

@ -1,13 +1,13 @@
import * as plugins from './taskbuffer.plugins'
import { Task } from './taskbuffer.classes.task'
import * as plugins from './taskbuffer.plugins';
import { Task } from './taskbuffer.classes.task';
// interfaces
import { Objectmap } from 'lik'
import { Objectmap } from '@pushrocks/lik';
export class TaskManager {
taskMap = new plugins.lik.Objectmap<Task>()
private cronJobMap = new plugins.lik.Objectmap<ICronJob>()
constructor () {
taskMap = new plugins.lik.Objectmap<Task>();
private cronJobMap = new plugins.lik.Objectmap<ICronJob>();
constructor() {
// nothing here
}
@ -15,21 +15,21 @@ export class TaskManager {
* checks if a task is already present
* @param taskNameArg
*/
getTaskByName (taskNameArg): Task {
return this.taskMap.find((itemArg) => {
return itemArg.name === taskNameArg
})
getTaskByName(taskNameArg): Task {
return this.taskMap.find(itemArg => {
return itemArg.name === taskNameArg;
});
}
/**
* adds a Task to the TaskManager
* @param taskArg
*/
addTask (taskArg: Task): void {
addTask(taskArg: Task): void {
if (!taskArg.name) {
throw new Error('taskArg needs a name to be added to taskManager')
throw new Error('taskArg needs a name to be added to taskManager');
}
this.taskMap.add(taskArg)
this.taskMap.add(taskArg);
}
/**
@ -37,61 +37,59 @@ export class TaskManager {
* @param taskArg
* @param cronStringArg
*/
addAndScheduleTask (taskArg: Task, cronStringArg: string) {
this.addTask(taskArg)
let taskName = taskArg.name
this.scheduleTaskByName(taskName, cronStringArg)
addAndScheduleTask(taskArg: Task, cronStringArg: string) {
this.addTask(taskArg);
let taskName = taskArg.name;
this.scheduleTaskByName(taskName, cronStringArg);
}
/**
* triggers a task in the TaskManagerByName
* @param taskNameArg
*/
triggerTaskByName (taskNameArg: string): Promise<any> {
let taskToTrigger = this.getTaskByName(taskNameArg)
triggerTaskByName(taskNameArg: string): Promise<any> {
let taskToTrigger = this.getTaskByName(taskNameArg);
if (!taskToTrigger) {
throw new Error(`There is no task with the name of ${taskNameArg}`)
throw new Error(`There is no task with the name of ${taskNameArg}`);
}
return taskToTrigger.trigger()
return taskToTrigger.trigger();
}
/**
* schedules the task by name
* @param taskNameArg
*/
scheduleTaskByName (taskNameArg: string, cronStringArg: string) {
let taskToSchedule = this.getTaskByName(taskNameArg)
scheduleTaskByName(taskNameArg: string, cronStringArg: string) {
let taskToSchedule = this.getTaskByName(taskNameArg);
let job = new plugins.cron.CronJob({
cronTime: cronStringArg,
onTick: () => {
this.triggerTaskByName(taskNameArg)
this.triggerTaskByName(taskNameArg);
},
start: true
})
});
this.cronJobMap.add({
taskNameArg: taskToSchedule.name,
cronString: cronStringArg,
job: job
})
});
}
descheduleTaskByName (taskNameArg: string) {
let descheduledCron = this.cronJobMap.findOneAndRemove((itemArg) => {
return itemArg.taskNameArg === taskNameArg
})
descheduledCron.job.stop()
descheduleTaskByName(taskNameArg: string) {
let descheduledCron = this.cronJobMap.findOneAndRemove(itemArg => {
return itemArg.taskNameArg === taskNameArg;
});
descheduledCron.job.stop();
}
/**
* returns all schedules of a specific task
* @param taskNameArg
*/
getSchedulesForTaskName (taskNameArg: string) {
}
getSchedulesForTaskName(taskNameArg: string) {}
}
export interface ICronJob {
cronString: string
taskNameArg: string
job: any
cronString: string;
taskNameArg: string;
job: any;
}

View File

@ -1,24 +1,21 @@
import * as plugins from './taskbuffer.plugins'
import * as plugins from './taskbuffer.plugins';
import { Task, ITaskFunction} from './taskbuffer.classes.task'
import { Task, ITaskFunction } from './taskbuffer.classes.task';
/**
* TaskOnce is run exactly once, no matter how often it is triggered
*/
export class TaskOnce extends Task {
hasTriggered: boolean = false
constructor (optionsArg: {
name?: string,
taskFunction: ITaskFunction
}) {
hasTriggered: boolean = false;
constructor(optionsArg: { name?: string; taskFunction: ITaskFunction }) {
super({
name: optionsArg.name,
taskFunction: async () => {
if (!this.hasTriggered) {
this.hasTriggered = true
await optionsArg.taskFunction()
this.hasTriggered = true;
await optionsArg.taskFunction();
}
}
})
});
}
}
}

View File

@ -1,28 +1,25 @@
import * as plugins from './taskbuffer.plugins'
import * as helpers from './taskbuffer.classes.helpers'
import { Task } from './taskbuffer.classes.task'
import * as plugins from './taskbuffer.plugins';
import * as helpers from './taskbuffer.classes.helpers';
import { Task } from './taskbuffer.classes.task';
export class Taskparallel extends Task {
taskArray: Task[]
constructor (optionsArg: {
taskArray: Task[]
}) {
let options = plugins.lodash.merge(
optionsArg,
{
taskArray: Task[];
constructor(optionsArg: { taskArray: Task[] }) {
const options = {
...optionsArg,
...{
taskFunction: () => {
let done = plugins.q.defer()
let promiseArray: Promise<any>[] = [] // stores promises of all tasks, since they run in parallel
this.taskArray.forEach(function (taskArg) {
promiseArray.push(taskArg.trigger())
})
Promise.all(promiseArray)
.then(done.resolve)
return done.promise
let done = plugins.smartpromise.defer();
let promiseArray: Promise<any>[] = []; // stores promises of all tasks, since they run in parallel
this.taskArray.forEach(function(taskArg) {
promiseArray.push(taskArg.trigger());
});
Promise.all(promiseArray).then(done.resolve);
return done.promise;
}
}
)
super(options)
this.taskArray = optionsArg.taskArray
};
super(options);
this.taskArray = optionsArg.taskArray;
}
}

View File

@ -1,18 +1,8 @@
import 'typings-global'
import * as beautylog from 'beautylog'
let cron = require('cron')
import * as lik from 'lik'
import * as lodash from 'lodash'
import * as rxjs from 'rxjs'
import * as q from 'smartq'
import * as smartdelay from 'smartdelay'
import * as smartlog from '@pushrocks/smartlog';
let cron = require('cron');
import * as lik from '@pushrocks/lik';
import * as rxjs from 'rxjs';
import * as smartpromise from '@pushrocks/smartpromise';
import * as smartdelay from '@pushrocks/smartdelay';
export {
beautylog,
cron,
lik,
lodash,
rxjs,
q,
smartdelay
}
export { smartlog, cron, lik, rxjs, smartpromise, smartdelay };