@lde/pipeline-console-reporter 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -0
- package/dist/consoleReporter.d.ts +33 -0
- package/dist/consoleReporter.d.ts.map +1 -0
- package/dist/consoleReporter.js +133 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/package.json +34 -0
package/README.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Pipeline Console Reporter
|
|
2
|
+
|
|
3
|
+
Console progress reporter for [@lde/pipeline](../pipeline). Displays real-time pipeline progress with spinners, colours and timing information.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { Pipeline } from '@lde/pipeline';
|
|
9
|
+
import { ConsoleReporter } from '@lde/pipeline-console-reporter';
|
|
10
|
+
|
|
11
|
+
await new Pipeline({
|
|
12
|
+
datasetSelector: selector,
|
|
13
|
+
stages,
|
|
14
|
+
writers,
|
|
15
|
+
reporter: new ConsoleReporter(),
|
|
16
|
+
}).run();
|
|
17
|
+
```
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Dataset, Distribution } from '@lde/dataset';
|
|
2
|
+
import type { DistributionAnalysisResult, ProgressReporter } from '@lde/pipeline';
|
|
3
|
+
export declare class ConsoleReporter implements ProgressReporter {
|
|
4
|
+
private stageSpinner?;
|
|
5
|
+
private datasetStartTime;
|
|
6
|
+
private datasetTotal;
|
|
7
|
+
private datasetIndex;
|
|
8
|
+
private analysisResults;
|
|
9
|
+
pipelineStart(_name: string): void;
|
|
10
|
+
datasetsSelected(count: number): void;
|
|
11
|
+
datasetStart(dataset: Dataset): void;
|
|
12
|
+
distributionsAnalyzed(_dataset: Dataset, results: DistributionAnalysisResult[]): void;
|
|
13
|
+
distributionSelected(_dataset: Dataset, distribution: Distribution, importedFrom?: Distribution, importDuration?: number): void;
|
|
14
|
+
stageStart(stage: string): void;
|
|
15
|
+
stageProgress(update: {
|
|
16
|
+
elementsProcessed: number;
|
|
17
|
+
quadsGenerated: number;
|
|
18
|
+
}): void;
|
|
19
|
+
stageComplete(_stage: string, result: {
|
|
20
|
+
elementsProcessed: number;
|
|
21
|
+
quadsGenerated: number;
|
|
22
|
+
duration: number;
|
|
23
|
+
}): void;
|
|
24
|
+
stageFailed(_stage: string, error: Error): void;
|
|
25
|
+
stageSkipped(_stage: string, reason: string): void;
|
|
26
|
+
datasetComplete(_dataset: Dataset): void;
|
|
27
|
+
datasetSkipped(_dataset: Dataset, reason: string): void;
|
|
28
|
+
private printAnalysisResults;
|
|
29
|
+
pipelineComplete(result: {
|
|
30
|
+
duration: number;
|
|
31
|
+
}): void;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=consoleReporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consoleReporter.d.ts","sourceRoot":"","sources":["../src/consoleReporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EACV,0BAA0B,EAC1B,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAKvB,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,YAAY,CAAC,CAAM;IAC3B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,eAAe,CAAoC;IAE3D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAOlC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAOrC,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAYpC,qBAAqB,CACnB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,0BAA0B,EAAE,GACpC,IAAI;IAIP,oBAAoB,CAClB,QAAQ,EAAE,OAAO,EACjB,YAAY,EAAE,YAAY,EAC1B,YAAY,CAAC,EAAE,YAAY,EAC3B,cAAc,CAAC,EAAE,MAAM,GACtB,IAAI;IAIP,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK/B,aAAa,CAAC,MAAM,EAAE;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,IAAI;IAMR,aAAa,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;QACN,iBAAiB,EAAE,MAAM,CAAC;QAC1B,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;KAClB,GACA,IAAI;IAQP,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAQ/C,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQlD,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAQxC,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IASvD,OAAO,CAAC,oBAAoB;IAwD5B,gBAAgB,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAKrD"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import prettyMilliseconds from 'pretty-ms';
|
|
4
|
+
export class ConsoleReporter {
|
|
5
|
+
stageSpinner;
|
|
6
|
+
datasetStartTime = 0;
|
|
7
|
+
datasetTotal = 0;
|
|
8
|
+
datasetIndex = 0;
|
|
9
|
+
analysisResults = [];
|
|
10
|
+
pipelineStart(_name) {
|
|
11
|
+
this.stageSpinner = ora({
|
|
12
|
+
discardStdin: false,
|
|
13
|
+
text: 'Selecting datasets',
|
|
14
|
+
}).start();
|
|
15
|
+
}
|
|
16
|
+
datasetsSelected(count) {
|
|
17
|
+
this.datasetTotal = count;
|
|
18
|
+
if (this.stageSpinner) {
|
|
19
|
+
this.stageSpinner.text = `Selected datasets: found ${chalk.bold(count)} datasets`;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
datasetStart(dataset) {
|
|
23
|
+
this.stageSpinner?.succeed();
|
|
24
|
+
this.stageSpinner = undefined;
|
|
25
|
+
this.datasetStartTime = Date.now();
|
|
26
|
+
this.datasetIndex++;
|
|
27
|
+
const counter = this.datasetTotal
|
|
28
|
+
? ` ${chalk.dim(`[${this.datasetIndex}/${this.datasetTotal}]`)}`
|
|
29
|
+
: '';
|
|
30
|
+
console.info();
|
|
31
|
+
console.info(`Dataset ${chalk.bold(dataset.iri.toString())}${counter}`);
|
|
32
|
+
}
|
|
33
|
+
distributionsAnalyzed(_dataset, results) {
|
|
34
|
+
this.analysisResults = results;
|
|
35
|
+
}
|
|
36
|
+
distributionSelected(_dataset, distribution, importedFrom, importDuration) {
|
|
37
|
+
this.printAnalysisResults(distribution, importedFrom, importDuration);
|
|
38
|
+
}
|
|
39
|
+
stageStart(stage) {
|
|
40
|
+
this.stageSpinner = ora({ discardStdin: false }).start();
|
|
41
|
+
this.stageSpinner.text = `Stage ${chalk.bold(stage)}`;
|
|
42
|
+
}
|
|
43
|
+
stageProgress(update) {
|
|
44
|
+
if (this.stageSpinner) {
|
|
45
|
+
this.stageSpinner.suffixText = `${update.elementsProcessed} elements, ${update.quadsGenerated} quads`;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
stageComplete(_stage, result) {
|
|
49
|
+
if (this.stageSpinner) {
|
|
50
|
+
this.stageSpinner.suffixText = `took ${chalk.bold(prettyMilliseconds(result.duration))}`;
|
|
51
|
+
this.stageSpinner.succeed();
|
|
52
|
+
this.stageSpinner = undefined;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
stageFailed(_stage, error) {
|
|
56
|
+
if (this.stageSpinner) {
|
|
57
|
+
this.stageSpinner.suffixText = chalk.red(error.message);
|
|
58
|
+
this.stageSpinner.fail();
|
|
59
|
+
this.stageSpinner = undefined;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
stageSkipped(_stage, reason) {
|
|
63
|
+
if (this.stageSpinner) {
|
|
64
|
+
this.stageSpinner.suffixText = `skipped: ${chalk.red(reason)}`;
|
|
65
|
+
this.stageSpinner.fail();
|
|
66
|
+
this.stageSpinner = undefined;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
datasetComplete(_dataset) {
|
|
70
|
+
const s = ora({
|
|
71
|
+
discardStdin: false,
|
|
72
|
+
text: `Completed in ${chalk.bold(prettyMilliseconds(Date.now() - this.datasetStartTime))}`,
|
|
73
|
+
}).start();
|
|
74
|
+
s.succeed();
|
|
75
|
+
}
|
|
76
|
+
datasetSkipped(_dataset, reason) {
|
|
77
|
+
this.printAnalysisResults();
|
|
78
|
+
const s = ora({
|
|
79
|
+
discardStdin: false,
|
|
80
|
+
text: `Skipped: ${chalk.red(reason)}`,
|
|
81
|
+
}).start();
|
|
82
|
+
s.fail();
|
|
83
|
+
}
|
|
84
|
+
printAnalysisResults(selected, importedFrom, importDuration) {
|
|
85
|
+
// Match by selected distribution URL, or by importedFrom URL (when a data
|
|
86
|
+
// dump was imported to a local SPARQL endpoint, the selected distribution
|
|
87
|
+
// is the local endpoint which doesn't appear in probe results).
|
|
88
|
+
const selectedUrl = selected?.accessUrl.toString();
|
|
89
|
+
const importedFromUrl = importedFrom?.accessUrl.toString();
|
|
90
|
+
for (const result of this.analysisResults) {
|
|
91
|
+
const resultUrl = result.distribution.accessUrl.toString();
|
|
92
|
+
const isSelected = selected &&
|
|
93
|
+
(resultUrl === selectedUrl || resultUrl === importedFromUrl);
|
|
94
|
+
const typeLabel = result.type === 'sparql'
|
|
95
|
+
? 'SPARQL endpoint'
|
|
96
|
+
: result.type === 'data-dump'
|
|
97
|
+
? 'Data dump'
|
|
98
|
+
: 'Network error';
|
|
99
|
+
const url = chalk.underline(resultUrl);
|
|
100
|
+
const s = ora({ discardStdin: false });
|
|
101
|
+
if (isSelected) {
|
|
102
|
+
if (importedFrom) {
|
|
103
|
+
const duration = importDuration !== undefined
|
|
104
|
+
? ` in ${chalk.bold(prettyMilliseconds(importDuration))}`
|
|
105
|
+
: '';
|
|
106
|
+
s.start(`Imported ${url} (to ${chalk.underline(selectedUrl)})${duration}`);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
s.start(`${typeLabel} ${url}`);
|
|
110
|
+
}
|
|
111
|
+
s.succeed();
|
|
112
|
+
}
|
|
113
|
+
else if (result.available) {
|
|
114
|
+
const detail = result.statusCode !== undefined ? ` (HTTP ${result.statusCode})` : '';
|
|
115
|
+
s.start(`${typeLabel} ${url}${detail}`);
|
|
116
|
+
s.succeed();
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
const detail = result.error
|
|
120
|
+
? ` (${result.error})`
|
|
121
|
+
: result.statusCode !== undefined
|
|
122
|
+
? ` (HTTP ${result.statusCode})`
|
|
123
|
+
: '';
|
|
124
|
+
s.start(`${typeLabel} ${url}${detail}`);
|
|
125
|
+
s.fail();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
this.analysisResults = [];
|
|
129
|
+
}
|
|
130
|
+
pipelineComplete(result) {
|
|
131
|
+
console.info(`\nPipeline completed in ${chalk.bold(prettyMilliseconds(result.duration))}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ConsoleReporter } from './consoleReporter.js';
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lde/pipeline-console-reporter",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Console progress reporter for @lde/pipeline",
|
|
5
|
+
"repository": {
|
|
6
|
+
"url": "https://github.com/ldengine/lde",
|
|
7
|
+
"directory": "packages/pipeline-console-reporter"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"exports": {
|
|
11
|
+
"./package.json": "./package.json",
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"development": "./src/index.ts",
|
|
16
|
+
"default": "./dist/index.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"main": "./dist/index.js",
|
|
20
|
+
"module": "./dist/index.js",
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"!**/*.tsbuildinfo"
|
|
25
|
+
],
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@lde/dataset": "0.7.0",
|
|
28
|
+
"@lde/pipeline": "0.13.0",
|
|
29
|
+
"chalk": "^5.4.1",
|
|
30
|
+
"ora": "^8.2.0",
|
|
31
|
+
"pretty-ms": "^9.3.0",
|
|
32
|
+
"tslib": "^2.3.0"
|
|
33
|
+
}
|
|
34
|
+
}
|