@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 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
+ }
@@ -0,0 +1,2 @@
1
+ export { ConsoleReporter } from './consoleReporter.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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
+ }