Skip to content

Commit 9d6ffd5

Browse files
committed
Add rich colorful logging
Signed-off-by: Rahul Krishna <[email protected]>
1 parent 1ac3356 commit 9d6ffd5

File tree

7 files changed

+76
-17
lines changed

7 files changed

+76
-17
lines changed

src/analysis/java/JavaAnalysis.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ import os from "os";
2626
import JSONStream from "JSONStream";
2727
declare module "JSONStream";
2828
import crypto from "crypto";
29+
import { createLogger } from "src/utils";
30+
31+
const logger = createLogger("JavaAnalysis");
2932

3033
enum AnalysisLevel {
3134
SYMBOL_TABLE = "1",
@@ -56,10 +59,10 @@ export class JavaAnalysis {
5659
const jarPath = matches[0];
5760

5861
if (!jarPath) {
59-
console.log("Default codeanalyzer jar not found.");
62+
logger.error("Default codeanalyzer jar not found.");
6063
throw new Error("Default codeanalyzer jar not found.");
6164
}
62-
log.info("Codeanalyzer jar found at:", jarPath);
65+
logger.info("Codeanalyzer jar found at:", jarPath);
6366
return ["java", "-jar", jarPath];
6467
}
6568

@@ -91,7 +94,7 @@ export class JavaAnalysis {
9194
if (!command[0]) {
9295
return reject(new Error("Codeanalyzer command not found"));
9396
}
94-
log.debug(command.join(" "));
97+
logger.debug(command.join(" "));
9598
const result = spawnSync(command[0], command.slice(1), {
9699
stdio: ["ignore", "pipe", "inherit"],
97100
});
@@ -115,8 +118,9 @@ export class JavaAnalysis {
115118

116119
stream.on("end", () => {
117120
// Clean up the temporary file
121+
logger.debug(`Deleting temporary file: ${tmpFilePath}`);
118122
fs.rm(tmpFilePath, { recursive: true, force: true }, (err) => {
119-
if (err) log.warn(`Failed to delete temporary file: ${tmpFilePath}`, err);
123+
if (err) logger.warn(`Failed to delete temporary file: ${tmpFilePath}`, err);
120124
});
121125
resolve(result as types.JApplicationType);
122126
});

src/types/signale.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
declare module 'signale';

src/utils/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './logger';

src/utils/logger.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// logger.ts
2+
import Signale from 'signale';
3+
import chalk from 'chalk';
4+
5+
class Logger {
6+
/**
7+
* Instance of Signale for logging messages.
8+
*/
9+
10+
/**
11+
* @note Instead of using `private signale: Signale;`, I am using `InstanceType<typeof Signale>` to tell
12+
* typescript, "Hey, signale is an instance of the {@link Signale} class."
13+
*/
14+
private signale: InstanceType<typeof Signale>;
15+
16+
constructor(scope?: string) {
17+
this.signale = new Signale({ scope });
18+
}
19+
20+
info(...messages: unknown[]) {
21+
this.signale.info(...messages.map(m => typeof m === 'string' ? chalk.cyan(m) : m));
22+
}
23+
24+
success(...messages: unknown[]) {
25+
this.signale.success(...messages.map(m => typeof m === 'string' ? chalk.greenBright(m) : m));
26+
}
27+
28+
warn(...messages: unknown[]) {
29+
this.signale.warn(...messages.map(m => typeof m === 'string' ? chalk.yellowBright(m) : m));
30+
}
31+
32+
error(...messages: unknown[]) {
33+
this.signale.error(...messages.map(m => typeof m === 'string' ? chalk.redBright.bold(m) : m));
34+
}
35+
36+
debug(...messages: unknown[]) {
37+
this.signale.debug(...messages.map(m => typeof m === 'string' ? chalk.magentaBright(m) : m));
38+
}
39+
40+
prettyJson(title: string, obj: any) {
41+
this.signale.info(chalk.blue.bold(title));
42+
this.signale.info(chalk.gray(JSON.stringify(obj, null, 2)));
43+
}
44+
}
45+
46+
export const logger = new Logger();
47+
export function createLogger(scope: string) {
48+
return new Logger(scope);
49+
}

test/conftest.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import * as path from 'path';
2323
import extract from 'extract-zip';
2424
import { beforeAll, afterAll } from "bun:test";
2525
import { CLDK } from "../src/CLDK";
26+
import { JavaAnalysis } from "../src/analysis/java/JavaAnalysis";
2627

2728
/*
2829
* Set up sample applications for testing

test/unit/analysis/java/JavaAnalysis.test.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import { JCallable, JCallableParameter, JType } from "../../../../src/models/java/";
22
import { daytraderJavaAnalysis } from "../../../conftest";
33
import { expect, test } from "bun:test";
4-
import chalk from "chalk";
5-
import { Signale } from "signale";
6-
7-
const logger = new Signale();
4+
import { logger } from "../../../../src/utils";
85

96
test("Must get analysis object from JavaAnalysis object", () => {
107
expect(daytraderJavaAnalysis).toBeDefined();
@@ -64,27 +61,27 @@ test("Must get parameters of a specific method in a specific class in the applic
6461
"com.ibm.websphere.samples.daytrader.impl.direct.TradeDirect", "publishQuotePriceChange(QuoteDataBean, BigDecimal, BigDecimal, double)");
6562

6663
expect(parameters).toBeDefined();
67-
logger.success(chalk.green("parameters are defined"));
64+
logger.success("parameters are defined");
6865
expect(parameters.length).toBe(4);
69-
logger.success(chalk.green("there are 4 parameters"));
66+
logger.success("there are 4 parameters");
7067
parameters.forEach(param => {
7168
expect(async () => JCallableParameter.parse(param)).not.toThrow();
7269
});
73-
logger.success(chalk.green("All parameters are valid JCallableParameter instances"));
70+
logger.success("All parameters are valid JCallableParameter instances");
7471
});
7572

7673
test("Must get parameters of a specific method in a specific class in the application given the callable object", async () => {
7774
const method = await daytraderJavaAnalysis.getMethodByQualifiedName(
7875
"com.ibm.websphere.samples.daytrader.impl.direct.TradeDirect", "publishQuotePriceChange(QuoteDataBean, BigDecimal, BigDecimal, double)");
7976
const parameters = await daytraderJavaAnalysis.getMethodParametersFromCallable(method);
8077
expect(parameters).toBeDefined();
81-
logger.success(chalk.green("parameters are defined"));
78+
logger.success("parameters are defined");
8279
expect(parameters.length).toBe(4);
83-
logger.success(chalk.green("there are 4 parameters"));
80+
logger.success("there are 4 parameters");
8481
parameters.forEach(param => {
8582
expect(async () => JCallableParameter.parse(param)).not.toThrow();
8683
}
8784
);
88-
logger.success(chalk.green("All parameters are valid JCallableParameter instances"));
85+
logger.success("All parameters are valid JCallableParameter instances");
8986
});
9087

tsconfig.json

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,16 @@
2828
"noPropertyAccessFromIndexSignature": false,
2929
"baseUrl": ".",
3030
"paths": {
31-
"cldk": ["node_modules/@cldk/cldk"]
32-
}
31+
"cldk": [
32+
"node_modules/@cldk/cldk"
33+
]
34+
},
35+
"typeRoots": [
36+
"./src/ypes",
37+
"./node_modules/@types"
38+
]
3339
},
3440
"include": [
3541
"src"
3642
]
37-
}
43+
}

0 commit comments

Comments
 (0)