Skip to content

Commit 12abec0

Browse files
committed
Inline parsers
1 parent 72b21fc commit 12abec0

4 files changed

Lines changed: 100 additions & 156 deletions

File tree

‎src/managers/builtin/commands/availableVersions.ts‎

Lines changed: 30 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,6 @@ export class PipAvailableVersionsCommand extends AvailableVersionsCommand {
2020
}
2121

2222
async execute(executeArgs: AvailableVersionsExecuteArgs): Promise<string[]> {
23-
let availableVersions: string[] = [];
24-
25-
const parser = (output: string): void => {
26-
const match = output.match(/{[\s\S]*}/);
27-
if (!match) {
28-
availableVersions = [];
29-
return;
30-
}
31-
try {
32-
const parsed = JSON.parse(match[0]) as { versions?: string[] };
33-
let versions = Array.isArray(parsed.versions) ? parsed.versions.filter((v) => !!v.trim()) : [];
34-
if (!executeArgs.includePrerelease) {
35-
versions = versions.filter((version) => !/[ab]|rc|dev/i.test(version));
36-
}
37-
availableVersions = versions;
38-
} catch {
39-
availableVersions = [];
40-
}
41-
};
42-
4323
const args = this.buildCommand(executeArgs);
4424

4525
const output = await runPython(
@@ -51,8 +31,21 @@ export class PipAvailableVersionsCommand extends AvailableVersionsCommand {
5131
this.timeout,
5232
);
5333

54-
parser(output);
55-
return availableVersions;
34+
const match = output.match(/{[\s\S]*}/);
35+
if (!match) {
36+
return [];
37+
}
38+
39+
try {
40+
const parsed = JSON.parse(match[0]) as { versions?: string[] };
41+
let versions = Array.isArray(parsed.versions) ? parsed.versions.filter((v) => !!v.trim()) : [];
42+
if (!executeArgs.includePrerelease) {
43+
versions = versions.filter((version) => !/[ab]|rc|dev/i.test(version));
44+
}
45+
return versions;
46+
} catch {
47+
return [];
48+
}
5649
}
5750
}
5851

@@ -72,31 +65,24 @@ export class UvAvailableVersionsCommand extends AvailableVersionsCommand {
7265
}
7366

7467
async execute(executeArgs: AvailableVersionsExecuteArgs): Promise<string[]> {
75-
let availableVersions: string[] = [];
76-
77-
const parser = (output: string): void => {
78-
const match = output.match(/{[\s\S]*}/);
79-
if (!match) {
80-
availableVersions = [];
81-
return;
82-
}
83-
try {
84-
const parsed = JSON.parse(match[0]) as { versions?: string[] };
85-
let versions = Array.isArray(parsed.versions) ? parsed.versions.filter((v) => !!v.trim()) : [];
86-
if (!executeArgs.includePrerelease) {
87-
versions = versions.filter((version) => !/[ab]|rc|dev/i.test(version));
88-
}
89-
availableVersions = versions;
90-
} catch {
91-
availableVersions = [];
92-
}
93-
};
94-
9568
const args = this.buildCommand(executeArgs);
9669

9770
const output = await runUV(args, undefined, this.log, executeArgs.cancellationToken, this.timeout);
9871

99-
parser(output);
100-
return availableVersions;
72+
const match = output.match(/{[\s\S]*}/);
73+
if (!match) {
74+
return [];
75+
}
76+
77+
try {
78+
const parsed = JSON.parse(match[0]) as { versions?: string[] };
79+
let versions = Array.isArray(parsed.versions) ? parsed.versions.filter((v) => !!v.trim()) : [];
80+
if (!executeArgs.includePrerelease) {
81+
versions = versions.filter((version) => !/[ab]|rc|dev/i.test(version));
82+
}
83+
return versions;
84+
} catch {
85+
return [];
86+
}
10187
}
10288
}

‎src/managers/builtin/commands/list.ts‎

Lines changed: 40 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,6 @@ export class PipListCommand extends ListCommand {
1616
}
1717

1818
async execute(executeArgs?: BaseExecuteArgs): Promise<PackageInfo[]> {
19-
const packages: PackageInfo[] = [];
20-
21-
const parser = (output: string): void => {
22-
let json: unknown;
23-
try {
24-
json = JSON.parse(output);
25-
} catch (e) {
26-
this.log?.error(`Failed to parse pip list output: ${e}`);
27-
return;
28-
}
29-
if (!Array.isArray(json)) {
30-
this.log?.error('Invalid output from pip list command');
31-
return;
32-
}
33-
const parsed = json
34-
.filter(({ name, version }) => name && version)
35-
.map(({ name, version }) => ({
36-
name,
37-
version,
38-
displayName: name,
39-
description: version,
40-
}));
41-
packages.push(...parsed);
42-
};
43-
4419
const args = this.buildCommand();
4520

4621
const output = await runPython(
@@ -52,8 +27,26 @@ export class PipListCommand extends ListCommand {
5227
this.timeout,
5328
);
5429

55-
parser(output);
56-
return packages;
30+
let json: unknown;
31+
try {
32+
json = JSON.parse(output);
33+
} catch (e) {
34+
this.log?.error(`Failed to parse pip list output: ${e}`);
35+
return [];
36+
}
37+
if (!Array.isArray(json)) {
38+
this.log?.error('Invalid output from pip list command');
39+
return [];
40+
}
41+
42+
return json
43+
.filter(({ name, version }) => !!name && !!version)
44+
.map(({ name, version }) => ({
45+
name,
46+
version,
47+
displayName: name,
48+
description: version,
49+
}));
5750
}
5851
}
5952

@@ -72,36 +65,29 @@ export class UvListCommand extends ListCommand {
7265
}
7366

7467
async execute(executeArgs?: BaseExecuteArgs): Promise<PackageInfo[]> {
75-
const packages: PackageInfo[] = [];
76-
77-
const parser = (output: string): void => {
78-
let json: unknown;
79-
try {
80-
json = JSON.parse(output);
81-
} catch (e) {
82-
this.log?.error(`Failed to parse uv pip list output: ${e}`);
83-
return;
84-
}
85-
if (!Array.isArray(json)) {
86-
this.log?.error('Invalid output from uv pip list command');
87-
return;
88-
}
89-
const parsed = json
90-
.filter(({ name, version }) => name && version)
91-
.map(({ name, version }) => ({
92-
name,
93-
version,
94-
displayName: name,
95-
description: version,
96-
}));
97-
packages.push(...parsed);
98-
};
99-
10068
const args = this.buildCommand();
10169

10270
const output = await runUV(args, undefined, this.log, executeArgs?.cancellationToken, this.timeout);
10371

104-
parser(output);
105-
return packages;
72+
let json: unknown;
73+
try {
74+
json = JSON.parse(output);
75+
} catch (e) {
76+
this.log?.error(`Failed to parse uv pip list output: ${e}`);
77+
return [];
78+
}
79+
if (!Array.isArray(json)) {
80+
this.log?.error('Invalid output from uv pip list command');
81+
return [];
82+
}
83+
84+
return json
85+
.filter(({ name, version }) => !!name && !!version)
86+
.map(({ name, version }) => ({
87+
name,
88+
version,
89+
displayName: name,
90+
description: version,
91+
}));
10692
}
10793
}

‎src/managers/builtin/commands/listDirectNames.ts‎

Lines changed: 26 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,6 @@ export class PipListDirectNamesCommand extends ListDirectNamesCommand {
1515
}
1616

1717
async execute(executeArgs?: BaseExecuteArgs): Promise<string[]> {
18-
let directNames: string[] = [];
19-
20-
const parser = (output: string): void => {
21-
let packages: unknown;
22-
try {
23-
packages = JSON.parse(output);
24-
} catch (e) {
25-
this.log?.error(`Failed to parse pip list output: ${e}`);
26-
return;
27-
}
28-
if (!Array.isArray(packages)) {
29-
this.log?.error('Invalid output from pip list command');
30-
return;
31-
}
32-
directNames = packages.filter(({ name }) => name).map(({ name }) => name);
33-
};
34-
3518
const args = this.buildCommand();
3619

3720
const output = await runPython(
@@ -43,8 +26,19 @@ export class PipListDirectNamesCommand extends ListDirectNamesCommand {
4326
this.timeout,
4427
);
4528

46-
parser(output);
47-
return directNames;
29+
let packages: unknown;
30+
try {
31+
packages = JSON.parse(output);
32+
} catch (e) {
33+
this.log?.error(`Failed to parse pip list output: ${e}`);
34+
return [];
35+
}
36+
if (!Array.isArray(packages)) {
37+
this.log?.error('Invalid output from pip list command');
38+
return [];
39+
}
40+
41+
return packages.filter(({ name }) => !!name).map(({ name }) => name);
4842
}
4943
}
5044

@@ -63,28 +57,22 @@ export class UvListDirectNamesCommand extends ListDirectNamesCommand {
6357
}
6458

6559
async execute(executeArgs?: BaseExecuteArgs): Promise<string[]> {
66-
let directNames: string[] = [];
67-
68-
const parser = (output: string): void => {
69-
let packages: unknown;
70-
try {
71-
packages = JSON.parse(output);
72-
} catch (e) {
73-
this.log?.error(`Failed to parse uv pip list output: ${e}`);
74-
return;
75-
}
76-
if (!Array.isArray(packages)) {
77-
this.log?.error('Invalid output from uv pip list command');
78-
return;
79-
}
80-
directNames = packages.filter(({ name }) => name).map(({ name }) => name);
81-
};
82-
8360
const args = this.buildCommand();
8461

8562
const output = await runUV(args, undefined, this.log, executeArgs?.cancellationToken, this.timeout);
8663

87-
parser(output);
88-
return directNames;
64+
let packages: unknown;
65+
try {
66+
packages = JSON.parse(output);
67+
} catch (e) {
68+
this.log?.error(`Failed to parse uv pip list output: ${e}`);
69+
return [];
70+
}
71+
if (!Array.isArray(packages)) {
72+
this.log?.error('Invalid output from uv pip list command');
73+
return [];
74+
}
75+
76+
return packages.filter(({ name }) => !!name).map(({ name }) => name);
8977
}
9078
}

‎src/managers/builtin/commands/version.ts‎

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,6 @@ export class PipVersionCommand extends VersionCommand {
1717
}
1818

1919
async execute(executeArgs?: BaseExecuteArgs): Promise<Pep440Version | undefined> {
20-
let parsedVersion: Pep440Version | undefined;
21-
22-
const parser = (output: string): void => {
23-
// "pip X.Y.Z from /path/to/pip (python X.Y)"
24-
const match = output.match(/^pip\s+(\d+\.\d+(?:\.\d+)*)/);
25-
parsedVersion = match ? (parsePep440Version(match[1]) ?? undefined) : undefined;
26-
};
27-
2820
const args = this.buildCommand();
2921

3022
const output = await runPython(
@@ -36,8 +28,8 @@ export class PipVersionCommand extends VersionCommand {
3628
this.timeout,
3729
);
3830

39-
parser(output);
40-
return parsedVersion;
31+
const match = output.match(/^pip\s+(\d+\.\d+(?:\.\d+)*)/);
32+
return match ? (parsePep440Version(match[1]) ?? undefined) : undefined;
4133
}
4234
}
4335

@@ -56,19 +48,11 @@ export class UvVersionCommand extends VersionCommand {
5648
}
5749

5850
async execute(executeArgs?: BaseExecuteArgs): Promise<Pep440Version | undefined> {
59-
let parsedVersion: Pep440Version | undefined;
60-
61-
const parser = (output: string): void => {
62-
// "uv X.Y.Z" format
63-
const match = output.match(/(\d+\.\d+(?:\.\d+)*)/);
64-
parsedVersion = match ? (parsePep440Version(match[1]) ?? undefined) : undefined;
65-
};
66-
6751
const args = this.buildCommand();
6852

6953
const output = await runUV(args, undefined, this.log, executeArgs?.cancellationToken, this.timeout);
7054

71-
parser(output);
72-
return parsedVersion;
55+
const match = output.match(/(\d+\.\d+(?:\.\d+)*)/);
56+
return match ? (parsePep440Version(match[1]) ?? undefined) : undefined;
7357
}
7458
}

0 commit comments

Comments
 (0)