Compare commits

..

11 Commits

Author SHA1 Message Date
6640d5fb2f 0.1.1 2016-05-17 03:27:34 +02:00
7a3aed275f update README 2016-05-17 03:27:29 +02:00
19beb95e20 now logging allright 2016-05-15 15:52:59 +02:00
8944ae2462 added Taskparallel class that executest tasks in parallel 2016-05-15 15:28:38 +02:00
b1eeb3563e 0.1.0 2016-05-15 03:18:19 +02:00
1714f552ac now has working taskchain 2016-05-15 03:16:50 +02:00
454a999a42 improve options handling between classes 2016-05-14 23:24:11 +02:00
1f3f2ae92f included ora and introduced taskspace. 2016-05-14 04:28:22 +02:00
9014eec9f6 tiny fix 2016-05-13 05:14:29 +02:00
ee56b6f655 now has working task class 2016-05-06 02:05:45 +02:00
55ddbece13 update tests 2016-05-05 19:30:24 +02:00
30 changed files with 476 additions and 146 deletions

View File

@ -1,5 +1,5 @@
# taskbuffer
Flexible task organization for gulp.
Flexible task organization for gulp. TypeScript ready!
## Status
[![Coverage Status](https://coveralls.io/repos/github/pushrocks/taskbuffer/badge.svg?branch=master)](https://coveralls.io/github/pushrocks/taskbuffer?branch=master)
@ -12,7 +12,7 @@ npm install taskbuffer --save
## Concepts
#### Task
### class `Task`
* A Task in its most simple form is a function that is executed when the task runs.
* A Task can have a **preTask** and an **afterTask**
(those are run before or after the main function whenever the task is called)
@ -27,6 +27,25 @@ npm install taskbuffer --save
* Task.triggered() is an Observable stream that emits events every time a task call is called and every time a call is completed.
* Task is compatible to gulp streams.
#### Taskchain
* Multiple Tasks can be combined in a bigger task using a Taskchain. Taskchain extends Task.
### class `TaskChain`
* Multiple Tasks can be combined in a bigger task using a Taskchain.
* Taskchain extends Task.
* While the tasks are async in themselve, TaskChain **runs Tasks serialized** (one after the other)
* that means that tasks can rely on each other and
### class `TaskParallel`
* like TaskChain, however **tasks run in parallel**
* Tasks cannot rely on each other
### Usage
We highly recommend TypeScript as this module supports **TypeScript intellisense**.
```
import * as taskbuffer from "taskbuffer";
myTask = new taskbuffer.Task({
name:"myTask1",
taskFunction:() => {
//do some stuff and return promise
}
})
```

5
dist/index.d.ts vendored
View File

@ -1,2 +1,5 @@
export * from "./taskbuffer.classes";
export { Task } from "./taskbuffer.classes.task";
export { Taskchain } from "./taskbuffer.classes.taskchain";
export { Taskparallel } from "./taskbuffer.classes.taskparallel";
export { Taskspace } from "./taskbuffer.classes.taskspace";
import "./taskbuffer.classes.helpers";

14
dist/index.js vendored
View File

@ -1,10 +1,14 @@
"use strict";
function __export(m) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
/// <reference path="./typings/main.d.ts" />
__export(require("./taskbuffer.classes"));
var taskbuffer_classes_task_1 = require("./taskbuffer.classes.task");
exports.Task = taskbuffer_classes_task_1.Task;
var taskbuffer_classes_taskchain_1 = require("./taskbuffer.classes.taskchain");
exports.Taskchain = taskbuffer_classes_taskchain_1.Taskchain;
var taskbuffer_classes_taskparallel_1 = require("./taskbuffer.classes.taskparallel");
exports.Taskparallel = taskbuffer_classes_taskparallel_1.Taskparallel;
var taskbuffer_classes_taskspace_1 = require("./taskbuffer.classes.taskspace");
exports.Taskspace = taskbuffer_classes_taskspace_1.Taskspace;
// import for naming only
require("./taskbuffer.classes.helpers");
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw0Q0FBNEM7QUFDNUMsaUJBQWMsc0JBQXNCLENBQUMsRUFBQTtBQUVyQyx5QkFBeUI7QUFDekIsUUFBTyw4QkFBOEIsQ0FBQyxDQUFEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vdHlwaW5ncy9tYWluLmQudHNcIiAvPlxuZXhwb3J0ICogZnJvbSBcIi4vdGFza2J1ZmZlci5jbGFzc2VzXCI7XG5cbi8vIGltcG9ydCBmb3IgbmFtaW5nIG9ubHlcbmltcG9ydCBcIi4vdGFza2J1ZmZlci5jbGFzc2VzLmhlbHBlcnNcIiJdfQ==
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw0Q0FBNEM7QUFDNUMsd0NBQW1CLDJCQUEyQixDQUFDO0FBQXZDLDhDQUF1QztBQUMvQyw2Q0FBd0IsZ0NBQWdDLENBQUM7QUFBakQsNkRBQWlEO0FBQ3pELGdEQUEyQixtQ0FBbUMsQ0FBQztBQUF2RCxzRUFBdUQ7QUFDL0QsNkNBQXdCLGdDQUFnQyxDQUFDO0FBQWpELDZEQUFpRDtBQUV6RCx5QkFBeUI7QUFDekIsUUFBTyw4QkFBOEIsQ0FBQyxDQUFEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vdHlwaW5ncy9tYWluLmQudHNcIiAvPlxyXG5leHBvcnQge1Rhc2t9IGZyb20gXCIuL3Rhc2tidWZmZXIuY2xhc3Nlcy50YXNrXCI7XHJcbmV4cG9ydCB7VGFza2NoYWlufSBmcm9tIFwiLi90YXNrYnVmZmVyLmNsYXNzZXMudGFza2NoYWluXCI7XHJcbmV4cG9ydCB7VGFza3BhcmFsbGVsfSBmcm9tIFwiLi90YXNrYnVmZmVyLmNsYXNzZXMudGFza3BhcmFsbGVsXCI7XHJcbmV4cG9ydCB7VGFza3NwYWNlfSBmcm9tIFwiLi90YXNrYnVmZmVyLmNsYXNzZXMudGFza3NwYWNlXCI7XHJcblxyXG4vLyBpbXBvcnQgZm9yIG5hbWluZyBvbmx5XHJcbmltcG9ydCBcIi4vdGFza2J1ZmZlci5jbGFzc2VzLmhlbHBlcnNcIiJdfQ==

View File

@ -1,2 +0,0 @@
export * from "./taskbuffer.classes.task";
export * from "./taskbuffer.classes.taskchain";

View File

@ -1,8 +1,9 @@
import { Task } from "./taskbuffer.classes";
import { Task } from "./taskbuffer.classes.task";
export declare let emptyTaskFunction: () => any;
export declare let isTask: (taskArg: any) => boolean;
export declare let isTaskTouched: (task: Task, touchedTasksArray: Task[]) => boolean;
export declare let isTaskTouched: (taskArg: Task, touchedTasksArray: Task[]) => boolean;
export declare let runTask: (taskArg: Task, optionsArg?: {
touchedTasksArray: Task[];
}) => any;
export declare let runBufferedTask: (taskArg: Task) => void;
export declare let updateTaskStatus: (taskArg: any, statusArg: string) => void;

File diff suppressed because one or more lines are too long

View File

@ -1,8 +0,0 @@
"use strict";
function __export(m) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
__export(require("./taskbuffer.classes.task"));
__export(require("./taskbuffer.classes.taskchain"));
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRhc2tidWZmZXIuY2xhc3Nlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsaUJBQWMsMkJBQ2QsQ0FBQyxFQUR3QztBQUN6QyxpQkFBYyxnQ0FDZCxDQUFDLEVBRDZDIiwiZmlsZSI6InRhc2tidWZmZXIuY2xhc3Nlcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL3Rhc2tidWZmZXIuY2xhc3Nlcy50YXNrXCJcbmV4cG9ydCAqIGZyb20gXCIuL3Rhc2tidWZmZXIuY2xhc3Nlcy50YXNrY2hhaW5cIlxuIl19

View File

@ -1,7 +1,8 @@
export declare class Task {
name: string;
task: any;
idle: boolean;
running: boolean;
idle: boolean;
buffered: boolean;
bufferCounter: number;
bufferMax: number;
@ -15,8 +16,9 @@ export declare class Task {
afterTask?: Task;
buffered?: boolean;
bufferMax?: number;
name?: string;
});
trigger(): void;
trigger(): any;
triggerUnBuffered(): any;
triggerBuffered(): any;
state: string;

File diff suppressed because one or more lines are too long

View File

@ -1,8 +1,14 @@
import { Task } from "./taskbuffer.classes";
import { Task } from "./taskbuffer.classes.task";
export declare class Taskchain extends Task {
taskArray: Task[];
constructor(taskArrayArg: Task[] | Task);
private _oraObject;
constructor(optionsArg: {
name?: string;
log?: boolean;
taskArray: Task[];
});
addTask(taskArg: Task): void;
removeTask(taskArg: Task): void;
shiftTask(): void;
trigger(): any;
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,7 @@
import { Task } from "./taskbuffer.classes.task";
export declare class Taskparallel extends Task {
taskArray: Task[];
constructor(optionsArg: {
taskArray: Task[];
});
}

32
dist/taskbuffer.classes.taskparallel.js vendored Normal file
View File

@ -0,0 +1,32 @@
"use strict";
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
/// <reference path="./typings/main.d.ts" />
var plugins = require("./taskbuffer.plugins");
var taskbuffer_classes_task_1 = require("./taskbuffer.classes.task");
var Taskparallel = (function (_super) {
__extends(Taskparallel, _super);
function Taskparallel(optionsArg) {
var _this = this;
var options = plugins.lodash.assign(optionsArg, {
taskFunction: function () {
var done = plugins.Q.defer();
var promiseArray; // stores promises of all tasks, since they run in parallel
_this.taskArray.forEach(function (taskArg) {
promiseArray.push(taskArg.trigger());
});
plugins.Q.all(promiseArray)
.then(done.resolve);
return done.promise;
}
});
_super.call(this, options);
}
return Taskparallel;
}(taskbuffer_classes_task_1.Task));
exports.Taskparallel = Taskparallel;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRhc2tidWZmZXIuY2xhc3Nlcy50YXNrcGFyYWxsZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNENBQTRDO0FBQzVDLElBQVksT0FBTyxXQUFNLHNCQUN6QixDQUFDLENBRDhDO0FBRS9DLHdDQUFtQiwyQkFFbkIsQ0FBQyxDQUY2QztBQUU5QztJQUFrQyxnQ0FBSTtJQUVsQyxzQkFBWSxVQUVYO1FBSkwsaUJBc0JDO1FBakJPLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUMvQixVQUFVLEVBQ1Y7WUFDSSxZQUFZLEVBQUM7Z0JBQ1QsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxZQUFZLENBQUMsQ0FBQywyREFBMkQ7Z0JBQzdFLEtBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVMsT0FBWTtvQkFDeEMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDekMsQ0FBQyxDQUFDLENBQUE7Z0JBQ0YsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO3FCQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN4QixDQUFDO1NBQ0osQ0FDSixDQUFBO1FBQ0Qsa0JBQU0sT0FBTyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUNMLG1CQUFDO0FBQUQsQ0F0QkEsQUFzQkMsQ0F0QmlDLDhCQUFJLEdBc0JyQztBQXRCWSxvQkFBWSxlQXNCeEIsQ0FBQSIsImZpbGUiOiJ0YXNrYnVmZmVyLmNsYXNzZXMudGFza3BhcmFsbGVsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vdHlwaW5ncy9tYWluLmQudHNcIiAvPlxyXG5pbXBvcnQgKiBhcyBwbHVnaW5zIGZyb20gXCIuL3Rhc2tidWZmZXIucGx1Z2luc1wiXHJcbmltcG9ydCAqIGFzIGhlbHBlcnMgZnJvbSBcIi4vdGFza2J1ZmZlci5jbGFzc2VzLmhlbHBlcnNcIlxyXG5pbXBvcnQge1Rhc2t9IGZyb20gXCIuL3Rhc2tidWZmZXIuY2xhc3Nlcy50YXNrXCJcclxuXHJcbmV4cG9ydCBjbGFzcyBUYXNrcGFyYWxsZWwgZXh0ZW5kcyBUYXNrIHtcclxuICAgIHRhc2tBcnJheTpUYXNrW107XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zQXJnOntcclxuICAgICAgICB0YXNrQXJyYXk6VGFza1tdXHJcbiAgICB9KXtcclxuICAgICAgICBsZXQgb3B0aW9ucyA9IHBsdWdpbnMubG9kYXNoLmFzc2lnbihcclxuICAgICAgICAgICAgb3B0aW9uc0FyZyxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGFza0Z1bmN0aW9uOigpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IHBsdWdpbnMuUS5kZWZlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9taXNlQXJyYXk7IC8vIHN0b3JlcyBwcm9taXNlcyBvZiBhbGwgdGFza3MsIHNpbmNlIHRoZXkgcnVuIGluIHBhcmFsbGVsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YXNrQXJyYXkuZm9yRWFjaChmdW5jdGlvbih0YXNrQXJnOlRhc2spe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlQXJyYXkucHVzaCh0YXNrQXJnLnRyaWdnZXIoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICBwbHVnaW5zLlEuYWxsKHByb21pc2VBcnJheSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZG9uZS5yZXNvbHZlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xyXG4gICAgfVxyXG59XHJcblxyXG4iXX0=

View File

@ -0,0 +1,2 @@
export declare class Taskspace {
}

9
dist/taskbuffer.classes.taskspace.js vendored Normal file
View File

@ -0,0 +1,9 @@
"use strict";
var Taskspace = (function () {
function Taskspace() {
}
return Taskspace;
}());
exports.Taskspace = Taskspace;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRhc2tidWZmZXIuY2xhc3Nlcy50YXNrc3BhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUlBO0lBQUE7SUFFQSxDQUFDO0lBQUQsZ0JBQUM7QUFBRCxDQUZBLEFBRUMsSUFBQTtBQUZZLGlCQUFTLFlBRXJCLENBQUEiLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLnRhc2tzcGFjZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL3R5cGluZ3MvbWFpbi5kLnRzXCIgLz5cclxuaW1wb3J0ICogYXMgcGx1Z2lucyBmcm9tIFwiLi90YXNrYnVmZmVyLnBsdWdpbnNcIlxyXG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gXCIuL3Rhc2tidWZmZXIuY2xhc3Nlcy5oZWxwZXJzXCJcclxuXHJcbmV4cG9ydCBjbGFzcyBUYXNrc3BhY2Uge1xyXG4gICAgXHJcbn0iXX0=

View File

@ -1,5 +1,3 @@
declare var plugins: {
beautylog: any;
Q: any;
};
export = plugins;
export import beautylog = require("beautylog");
export declare let Q: any;
export declare let lodash: any;

View File

@ -1,9 +1,7 @@
"use strict";
/// <reference path="./typings/main.d.ts" />
var plugins = {
beautylog: require("beautylog"),
Q: require("q")
};
module.exports = plugins;
exports.beautylog = require("beautylog");
exports.Q = require("q");
exports.lodash = require("lodash");
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRhc2tidWZmZXIucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsNENBQTRDO0FBQzVDLElBQUksT0FBTyxHQUFHO0lBQ1YsU0FBUyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUM7SUFDL0IsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUM7Q0FDbEIsQ0FBQztBQUNGLGlCQUFTLE9BQU8sQ0FBQyIsImZpbGUiOiJ0YXNrYnVmZmVyLnBsdWdpbnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi90eXBpbmdzL21haW4uZC50c1wiIC8+XG52YXIgcGx1Z2lucyA9IHtcbiAgICBiZWF1dHlsb2c6IHJlcXVpcmUoXCJiZWF1dHlsb2dcIiksXG4gICAgUTogcmVxdWlyZShcInFcIilcbn07XG5leHBvcnQgPSBwbHVnaW5zO1xuIl19
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRhc2tidWZmZXIucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsNENBQTRDO0FBQzlCLGlCQUFTLFdBQVcsV0FBVyxDQUFDLENBQUM7QUFDcEMsU0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixjQUFNLEdBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDIiwiZmlsZSI6InRhc2tidWZmZXIucGx1Z2lucy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL3R5cGluZ3MvbWFpbi5kLnRzXCIgLz5cclxuZXhwb3J0IGltcG9ydCBiZWF1dHlsb2cgPSByZXF1aXJlKFwiYmVhdXR5bG9nXCIpO1xyXG5leHBvcnQgbGV0IFEgPSByZXF1aXJlKFwicVwiKTtcclxuZXhwb3J0IGxldCBsb2Rhc2g9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XHJcbiJdfQ==

View File

@ -1,7 +1,7 @@
{
"name": "taskbuffer",
"version": "0.0.5",
"description": "manage triggers and execution of tasks with promises",
"version": "0.1.1",
"description": "Flexible task organization for gulp. TypeScript ready!",
"main": "dist/index.js",
"scripts": {
"test": "(npmts)"
@ -23,7 +23,8 @@
},
"homepage": "https://github.com/pushrocks/taskbuffer#readme",
"dependencies": {
"beautylog": "^4.1.6",
"beautylog": "^5.0.0",
"lodash": "^4.12.0",
"projectinfo": "1.0.1",
"q": "^1.4.1",
"rx": "^4.1.0"

3
test/test.d.ts vendored
View File

@ -1,3 +0,0 @@
declare var taskbuffer: any;
declare var classes: any;
declare var should: any;

File diff suppressed because one or more lines are too long

View File

@ -1,25 +1,83 @@
/// <reference path="../ts/typings/main.d.ts" />
var taskbuffer = require("../dist/index");
var classes = require("../dist/taskbuffer.classes");
var should = require("should");
describe("taskbuffer",function(){
describe(".task()",function(){
var testTask;
it("should return a new task to var testTask",function(){
testTask = taskbuffer.task();
});
import taskbuffer = require("../dist/index");
let should = require("should");
let plugins = {
q: require("q")
}
it("testTask should be instance of Task",function(){
testTask.should.be.instanceof(classes.Task);
// setup some testData to work with
let testTask:taskbuffer.Task;
let testTaskFunction = function(){
let done = plugins.q.defer();
console.log("main function executed!")
done.resolve();
return done.promise;
}
let testPreTask = new taskbuffer.Task({
taskFunction:function(){
console.log("preTask executed");
},
preTask:testTask
});
describe("taskbuffer",function(){
describe(".Task",function(){
it("new Task() should return a new task",function(){
testTask = new taskbuffer.Task({taskFunction:testTaskFunction,preTask:testPreTask});
});
it("testTask should be and instance of Task",function(){
testTask.should.be.instanceof(taskbuffer.Task);
});
it("testTask.idle is true",function(){
if (!testTask.idle){
throw new Error("testTask.idle is not true");
}
});
it("testTask.running is type boolean and initially false",function(){
testTask.running.should.be.type("boolean");
testTask.running.should.be.false();
});
it("testTask.trigger() should return Promise",function(){
testTask.trigger().should.be.Promise();
});
it("testTask.trigger() returned Promise should be fullfilled",function(done){
testTask.trigger()
.then(done);
});
it("should run a task without pre and afterTask",function(done){
let localTestTask = new taskbuffer.Task({taskFunction:testTaskFunction});
localTestTask.trigger().then(done);
});
});
describe("Taskchain",function(){
let testTaskchain;
let testTaskArray = [
new taskbuffer.Task({
name:"task1",
taskFunction:function(){
let done = plugins.q.defer();
setTimeout(done.resolve,2000);
return done.promise;
}
}),
new taskbuffer.Task({
name:"task2",
taskFunction: function(){
let done = plugins.q.defer();
setTimeout(done.resolve,2000);
return done.promise;
}
}),
];
it("should run tasks in sequence",function(done){
this.timeout(5000);
testTaskchain = new taskbuffer.Taskchain({
name:"Taskchain1",
taskArray:testTaskArray
});
testTaskchain.trigger().then(done);
});
});
});

View File

@ -1,5 +1,8 @@
/// <reference path="./typings/main.d.ts" />
export * from "./taskbuffer.classes";
export {Task} from "./taskbuffer.classes.task";
export {Taskchain} from "./taskbuffer.classes.taskchain";
export {Taskparallel} from "./taskbuffer.classes.taskparallel";
export {Taskspace} from "./taskbuffer.classes.taskspace";
// import for naming only
import "./taskbuffer.classes.helpers"

View File

@ -1,6 +1,6 @@
/// <reference path="./typings/main.d.ts" />
import plugins = require("./taskbuffer.plugins");
import {Task} from "./taskbuffer.classes"
import {Task} from "./taskbuffer.classes.task";
export let emptyTaskFunction = function(){
let done = plugins.Q.defer();
@ -20,12 +20,20 @@ export let isTask = function(taskArg):boolean{
};
export let isTaskTouched = (task:Task, touchedTasksArray:Task[]):boolean => {
return false;
export let isTaskTouched = (taskArg:Task, touchedTasksArray:Task[]):boolean => {
let result = false;
for (let keyArg in touchedTasksArray){
if(taskArg === touchedTasksArray[keyArg]){
result = true;
}
}
return result;
}
export let runTask = function(taskArg:Task,optionsArg?:{touchedTasksArray:Task[]}){
export let runTask = function(taskArg:Task,optionsArg:{touchedTasksArray:Task[]} = {touchedTasksArray:[]}){
let done = plugins.Q.defer();
updateTaskStatus(taskArg,"running");
done.promise.then(function(){updateTaskStatus(taskArg,"idle")})
let localDeferred = plugins.Q.defer();
let touchedTasksArray:Task[];
if(optionsArg.touchedTasksArray){
@ -39,7 +47,7 @@ export let runTask = function(taskArg:Task,optionsArg?:{touchedTasksArray:Task[]
if(taskArg.preTask && !isTaskTouched(taskArg.preTask,touchedTasksArray)){
return runTask(taskArg.preTask,{touchedTasksArray:touchedTasksArray})
} else {
let done2 = plugins.Q.resolve();
let done2 = plugins.Q.defer();
done2.resolve();
return done2.promise;
}
@ -51,18 +59,39 @@ export let runTask = function(taskArg:Task,optionsArg?:{touchedTasksArray:Task[]
if(taskArg.afterTask && !isTaskTouched(taskArg.afterTask,touchedTasksArray)){
return runTask(taskArg.afterTask,{touchedTasksArray:touchedTasksArray})
} else {
let done2 = plugins.Q.resolve();
let done2 = plugins.Q.defer();
done2.resolve();
return done2.promise;
}
})
.then(() => {
done.resolve();
})
});
localDeferred.resolve();
return done.promise;
};
export let runBufferedTask = (taskArg:Task) => {
}
let recursiveBufferRunner = () => {
if(taskArg.bufferCounter > 0){
taskArg.bufferCounter--;
runTask(taskArg)
.then(recursiveBufferRunner);
}
}
}
export let updateTaskStatus = (taskArg,statusArg:string) => {
switch (statusArg) {
case "running":
taskArg.running = true;
taskArg.idle = false;
break;
case "idle":
taskArg.running = false;
taskArg.idle = true;
break;
default:
throw new Error("status not recognised");
}
}

View File

@ -2,11 +2,11 @@
import * as plugins from "./taskbuffer.plugins"
import * as helpers from "./taskbuffer.classes.helpers"
export class Task {
name:string;
task:any;
idle:boolean;
running:boolean;
idle:boolean;
buffered:boolean;
bufferCounter:number;
bufferMax:number;
@ -15,22 +15,37 @@ export class Task {
preTask:Task;
afterTask:Task;
constructor(optionsArg:{taskFunction:any,preTask?:Task,afterTask?:Task, buffered?:boolean, bufferMax?:number}){
constructor(optionsArg:{
taskFunction:any,
preTask?:Task,
afterTask?:Task,
buffered?:boolean,
bufferMax?:number,
name?:string
}){
if (!optionsArg){optionsArg = {taskFunction:function(){}}}
var options = optionsArg;
this.task = optionsArg.taskFunction;
this.preTask = options.preTask;
this.afterTask = options.afterTask;
this.idle = true;
this.running = false;
this.idle = true;
this.buffered = options.buffered;
this.bufferMax = options.bufferMax;
this.name = options.name;
}
trigger(){
let done = plugins.Q.defer();
if(this.buffered) {this.triggerBuffered()}
else{this.triggerUnBuffered()};
if(this.buffered) {
this.triggerBuffered()
.then(done.resolve);
}
else {
this.triggerUnBuffered()
.then(done.resolve);
};
return done.promise;
};
triggerUnBuffered(){
return helpers.runTask(this);
@ -51,7 +66,7 @@ export class Task {
if (stateArg == "locked"){
this._state = "locked";
} else {
plugins.beautylog.error("state type" );
plugins.beautylog.error("state type " + stateArg.blue + " could not be set");
}
}
}

View File

@ -1,26 +1,48 @@
/// <reference path="./typings/main.d.ts" />
import * as plugins from "./taskbuffer.plugins";
import {Task} from "./taskbuffer.classes";
import {Task} from "./taskbuffer.classes.task";
import helpers = require("./taskbuffer.classes.helpers");
export class Taskchain extends Task {
taskArray:Task[];
constructor(taskArrayArg:Task[]|Task){
super({
taskFunction: () => { // this is the function that gets executed when TaskChain is triggered
if(this.taskArray.length = 0) return; //make sure there is actually a Task available to execute
let startDeferred = plugins.Q.defer(); // this is the starting Deferred object
let promisePointer = startDeferred.promise;
for(let keyArg in this.taskArray){
promisePointer.then(function(){
promisePointer = this.taskArray[keyArg].trigger();
return promisePointer;
})
};
startDeferred.resolve();
private _oraObject:plugins.beautylog.Ora;
constructor(optionsArg:{
name?:string,
log?:boolean,
taskArray:Task[]
}){
let options = plugins.lodash.assign(
{
name:"unnamed Taskchain",
log:false
},
optionsArg,
{
taskFunction: () => { // 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;
let iterateTasks = () => {
if(typeof this.taskArray[taskCounter] != "undefined"){
this._oraObject.text(this.name + " running: Task" + this.taskArray[taskCounter].name);
this.taskArray[taskCounter].trigger()
.then(()=>{
this._oraObject.log(this.taskArray[taskCounter].name,"ok");
taskCounter++;
iterateTasks();
});
} else {
this._oraObject.endOk("Taskchain \"" + this.name + "\" completed successfully");
done.resolve();
}
};
iterateTasks();
return done.promise;
}
}
});
);
super(options);
this.taskArray = optionsArg.taskArray;
this._oraObject = new plugins.beautylog.Ora("Taskchain idle","blue");
}
addTask(taskArg:Task){
this.taskArray.push(taskArg);
@ -31,10 +53,8 @@ export class Taskchain extends Task {
shiftTask(){
};
};
let myTask = new Taskchain(
new Task({
taskFunction:function(){}
})
);
trigger(){
this._oraObject.start(this.name + " running...");
return helpers.runTask(this);
}
};

View File

@ -0,0 +1,29 @@
/// <reference path="./typings/main.d.ts" />
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.assign(
optionsArg,
{
taskFunction:() => {
let done = plugins.Q.defer();
let promiseArray; // stores promises of all tasks, since they run in parallel
this.taskArray.forEach(function(taskArg:Task){
promiseArray.push(taskArg.trigger());
})
plugins.Q.all(promiseArray)
.then(done.resolve);
return done.promise;
}
}
)
super(options);
}
}

View File

@ -0,0 +1,7 @@
/// <reference path="./typings/main.d.ts" />
import * as plugins from "./taskbuffer.plugins"
import * as helpers from "./taskbuffer.classes.helpers"
export class Taskspace {
}

View File

@ -1,2 +0,0 @@
export * from "./taskbuffer.classes.task"
export * from "./taskbuffer.classes.taskchain"

View File

@ -1,6 +1,4 @@
/// <reference path="./typings/main.d.ts" />
var plugins = {
beautylog: require("beautylog"),
Q: require("q")
};
export = plugins;
export import beautylog = require("beautylog");
export let Q = require("q");
export let lodash= require("lodash");

View File

@ -1,7 +1,8 @@
{
"ambientDependencies": {
"node": "github:DefinitelyTyped/DefinitelyTyped/node/node.d.ts",
"colors": "github:DefinitelyTyped/DefinitelyTyped/colors/colors.d.ts",
"mocha": "github:Bartvds/tsd-deftools/typings/DefinitelyTyped/mocha/mocha.d.ts",
"colors": "github:DefinitelyTyped/DefinitelyTyped/colors/colors.d.ts"
"node": "github:DefinitelyTyped/DefinitelyTyped/node/node.d.ts",
"should": "registry:dt/should#8.1.1+20160316155526"
}
}