Skip to content

Commit 8dd1a81

Browse files
authored
Merge pull request #680 from jpogran/maint-refactor-extensionts
(maint) Refactor Forge calls to API
2 parents fea4a1f + 25460ab commit 8dd1a81

File tree

5 files changed

+135
-139
lines changed

5 files changed

+135
-139
lines changed

src/extension.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { PuppetNodeGraphFeature } from './feature/PuppetNodeGraphFeature';
1616
import { PuppetResourceFeature } from './feature/PuppetResourceFeature';
1717
import { PuppetStatusBarFeature } from './feature/PuppetStatusBarFeature';
1818
import { UpdateConfigurationFeature } from './feature/UpdateConfigurationFeature';
19+
import { getPDKVersion } from './forge';
1920
import { ConnectionHandler } from './handler';
2021
import { StdioConnectionHandler } from './handlers/stdio';
2122
import { TcpConnectionHandler } from './handlers/tcp';
@@ -26,9 +27,6 @@ import { reporter } from './telemetry';
2627
import { PuppetFactsProvider } from './views/facts';
2728
import { PuppetfileProvider } from './views/puppetfile';
2829

29-
// eslint-disable-next-line @typescript-eslint/no-var-requires
30-
const axios = require('axios');
31-
3230
export const puppetLangID = 'puppet'; // don't change this
3331
export const puppetFileLangID = 'puppetfile'; // don't change this
3432
const debugType = 'Puppet'; // don't change this
@@ -287,11 +285,7 @@ async function notifyIfNewPDKVersion(context: vscode.ExtensionContext, settings:
287285
return;
288286
}
289287

290-
axios
291-
.get('https://s3.amazonaws.com/puppet-pdk/pdk/LATEST')
292-
.then((response) => {
293-
return response.data;
294-
})
288+
getPDKVersion(logger)
295289
.then((latestVersion) => {
296290
if (version !== latestVersion) {
297291
return vscode.window.showWarningMessage(

src/feature/FormatDocumentFeature.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
'use strict';
22

33
import * as vscode from 'vscode';
4+
import { IAggregateConfiguration } from '../configuration';
45
import { IFeature } from '../feature';
5-
import { ILogger } from '../logging';
6+
import { ConnectionHandler } from '../handler';
67
import { ConnectionStatus } from '../interfaces';
8+
import { ILogger } from '../logging';
79
import * as messages from '../messages';
8-
import { ConnectionHandler } from '../handler';
9-
import { IAggregateConfiguration } from '../configuration';
10+
import { reporter } from '../telemetry';
1011

1112
class RequestParams implements messages.PuppetFixDiagnosticErrorsRequestParams {
1213
documentUri: string;
@@ -32,6 +33,10 @@ class FormatDocumentProvider {
3233
return [];
3334
}
3435

36+
if (reporter) {
37+
reporter.sendTelemetryEvent('puppet/FormatDocument');
38+
}
39+
3540
const requestParams = new RequestParams();
3641
requestParams.documentUri = document.uri.toString(false);
3742
requestParams.alwaysReturnContent = false;
Lines changed: 12 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { getLocation } from 'jsonc-parser';
22
import * as vscode from 'vscode';
33
import { IFeature } from '../feature';
4+
import { buildMarkdown, getModuleInfo } from '../forge';
45
import { ILogger } from '../logging';
6+
import { reporter } from '../telemetry';
57

68
export class PuppetModuleHoverFeature implements IFeature {
79
constructor(public context: vscode.ExtensionContext, public logger: ILogger) {
@@ -17,11 +19,11 @@ export class PuppetModuleHoverFeature implements IFeature {
1719
export class PuppetModuleHoverProvider implements vscode.HoverProvider {
1820
constructor(public logger: ILogger) {}
1921

20-
provideHover(
22+
async provideHover(
2123
document: vscode.TextDocument,
2224
position: vscode.Position,
2325
token: vscode.CancellationToken,
24-
): Thenable<vscode.Hover> | null {
26+
): Promise<vscode.Hover> | null {
2527
const offset = document.offsetAt(position);
2628
const location = getLocation(document.getText(), offset);
2729

@@ -37,56 +39,20 @@ export class PuppetModuleHoverProvider implements vscode.HoverProvider {
3739
return;
3840
}
3941

42+
if (reporter) {
43+
reporter.sendTelemetryEvent('metadataJSON/Hover');
44+
}
45+
4046
const range = document.getWordRangeAtPosition(position);
4147
const word = document.getText(range);
4248

4349
this.logger.debug('Metadata hover info found ' + word + ' module');
4450

4551
const name = word.replace('"', '').replace('"', '').replace('/', '-');
4652

47-
return this.getModuleInfo(name).then(function (result: any) {
48-
const msg: string[] = [];
49-
msg.push(`### ${result.slug}`);
50-
51-
const releaseDate = new Date(result.releases[0].created_at);
52-
// eslint-disable-next-line @typescript-eslint/no-var-requires
53-
const dateformat = require('dateformat');
54-
msg.push(`\nLatest version: ${result.releases[0].version} (${dateformat(releaseDate, 'dS mmmm yyyy')})`);
55-
56-
if (result.endorsement !== null) {
57-
const endorsementCapitalized = result.endorsement.charAt(0).toUpperCase() + result.endorsement.slice(1);
58-
msg.push(`\nEndorsement: ${endorsementCapitalized}`);
59-
}
60-
61-
msg.push(`\nOwner: ${result.owner.slug}`);
62-
63-
const forgeUri = `https://forge.puppet.com/${result.owner.username}/${result.name}`;
64-
msg.push(`\nForge: [${forgeUri}](${forgeUri})\n`);
65-
66-
if (result.homepage_url !== null) {
67-
msg.push(`\nProject: [${result.homepage_url}](${result.homepage_url})\n`);
68-
}
69-
70-
const md = msg.join('\n');
71-
72-
return Promise.resolve(new vscode.Hover(new vscode.MarkdownString(md), range));
73-
});
74-
}
75-
76-
private getModuleInfo(name: string) {
77-
const options = {
78-
url: `https://forgeapi.puppet.com/v3/modules/${name}?exclude_fields=readme%20changelog%20license%20reference`,
79-
};
80-
return new Promise(function (resolve, reject) {
81-
// eslint-disable-next-line @typescript-eslint/no-var-requires
82-
const request = require('request');
83-
request.get(options, function (err, resp, body) {
84-
if (err) {
85-
reject(err);
86-
} else {
87-
resolve(JSON.parse(body));
88-
}
89-
});
90-
});
53+
const info = await getModuleInfo(name, this.logger);
54+
const markdown = buildMarkdown(info);
55+
const hoverinfo = new vscode.Hover(markdown, range);
56+
return hoverinfo;
9157
}
9258
}

src/feature/PuppetfileHoverFeature.ts

Lines changed: 8 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,9 @@
11
// const axios = require('axios');
2-
import axios from 'axios';
32
import * as vscode from 'vscode';
43
import { IFeature } from '../feature';
4+
import { buildMarkdown, getModuleInfo } from '../forge';
55
import { ILogger } from '../logging';
6-
7-
interface PuppetForgeModuleInfo {
8-
uri: string;
9-
slug: string;
10-
name: string;
11-
downloads: number;
12-
score: number;
13-
created: Date;
14-
updated: Date;
15-
endorsement: string;
16-
owner: { slug: string; username: string };
17-
forgeUrl: string;
18-
homepageUrl: string;
19-
version: number;
20-
summary: string;
21-
}
6+
import { reporter } from '../telemetry';
227

238
class PuppetfileHoverProvider implements vscode.HoverProvider {
249
constructor(public readonly logger: ILogger) {}
@@ -38,81 +23,22 @@ class PuppetfileHoverProvider implements vscode.HoverProvider {
3823
return null;
3924
}
4025

26+
if (reporter) {
27+
reporter.sendTelemetryEvent('puppetfile/Hover');
28+
}
29+
4130
const text = line.text
4231
.replace(new RegExp('mod\\s+'), '')
4332
.replace(new RegExp(",\\s+'\\d.\\d.\\d\\'"), '')
4433
.replace(new RegExp(',\\s+:latest'), '')
4534
.replace("'", '')
4635
.replace("'", '');
4736

48-
const info = await this.getModuleInfo(text);
49-
const markdown = this.buildmarkdown(info);
37+
const info = await getModuleInfo(text, this.logger);
38+
const markdown = buildMarkdown(info);
5039
const hoverinfo = new vscode.Hover(markdown, range);
5140
return hoverinfo;
5241
}
53-
54-
private buildmarkdown(info: PuppetForgeModuleInfo): vscode.MarkdownString {
55-
const message = `## ${info.name}\n
56-
${info.summary}\n
57-
**Latest version:** ${info.version} (${info.created.toDateString()})\n
58-
**Forge**: [${info.forgeUrl}](${info.forgeUrl})\n
59-
**Project**: [${info.homepageUrl}](${info.homepageUrl})\n
60-
**Owner:** ${info.owner.username}\n
61-
**Endorsement:** ${info.endorsement?.toLocaleUpperCase()}\n
62-
**Score:** ${info.score}\n
63-
`;
64-
return new vscode.MarkdownString(message);
65-
}
66-
67-
private getModuleInfo(title: string): Promise<PuppetForgeModuleInfo> {
68-
return new Promise((resolve) => {
69-
return axios
70-
.get(`https://forgeapi.puppet.com/v3/modules/${title}`, {
71-
params: {
72-
// eslint-disable-next-line @typescript-eslint/camelcase
73-
exclude_fields: 'readme changelog license reference',
74-
},
75-
headers: {
76-
'Content-Type': 'application/json;charset=UTF-8',
77-
'User-Agent': 'puppet-vscode/0.27.0',
78-
},
79-
})
80-
.then((response) => {
81-
if (response.status !== 200) {
82-
this.logger.error(`Error getting Puppet forge data. Status: ${response.status}:${response.statusText}`);
83-
resolve();
84-
}
85-
86-
const info = response.data;
87-
const module = {
88-
uri: info.uri,
89-
slug: info.slug,
90-
name: info.name,
91-
downloads: info.downloads,
92-
score: info.feedback_score,
93-
created: new Date(info.created_at),
94-
updated: new Date(info.updated_at),
95-
endorsement: info.endorsement ?? '',
96-
forgeUrl: `https://forge.puppet.com/${info.owner.username}/${info.name}`,
97-
homepageUrl: info.homepage_url ?? '',
98-
version: info.current_release.version,
99-
owner: {
100-
uri: info.owner.uri,
101-
slug: info.owner.slug,
102-
username: info.owner.username,
103-
gravatar: info.owner.gravatar_id,
104-
},
105-
summary: info.current_release.metadata.summary,
106-
};
107-
108-
resolve(module);
109-
})
110-
.catch((error) => {
111-
this.logger.error(`Error getting Puppet forge data: ${error}`);
112-
resolve();
113-
});
114-
});
115-
}
11642
}
11743

11844
export class PuppetfileHoverFeature implements IFeature {

src/forge.ts

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import axios from 'axios';
2+
import { MarkdownString } from 'vscode';
3+
import { ILogger } from './logging';
4+
5+
export interface PuppetForgeModuleInfo {
6+
uri: string;
7+
slug: string;
8+
name: string;
9+
downloads: number;
10+
score: number;
11+
created: Date;
12+
updated: Date;
13+
endorsement: string;
14+
owner: { slug: string; username: string };
15+
forgeUrl: string;
16+
homepageUrl: string;
17+
version: number;
18+
summary: string;
19+
}
20+
21+
export function buildMarkdown(info: PuppetForgeModuleInfo): MarkdownString {
22+
const message = `## ${info.name}\n
23+
${info.summary}\n
24+
**Latest version:** ${info.version} (${info.created.toDateString()})\n
25+
**Forge**: [${info.forgeUrl}](${info.forgeUrl})\n
26+
**Project**: [${info.homepageUrl}](${info.homepageUrl})\n
27+
**Owner:** ${info.owner.username}\n
28+
**Endorsement:** ${info.endorsement?.toLocaleUpperCase()}\n
29+
**Score:** ${info.score}\n
30+
`;
31+
return new MarkdownString(message);
32+
}
33+
34+
export function getPDKVersion(logger: ILogger): Promise<string> {
35+
return new Promise((resolve) => {
36+
return axios
37+
.get('https://s3.amazonaws.com/puppet-pdk/pdk/LATEST', {
38+
params: {
39+
// eslint-disable-next-line @typescript-eslint/camelcase
40+
exclude_fields: 'readme changelog license reference',
41+
},
42+
headers: {
43+
'Content-Type': 'application/json;charset=UTF-8',
44+
'User-Agent': 'puppet-vscode/0.27.1',
45+
},
46+
})
47+
.then((response) => {
48+
if (response.status !== 200) {
49+
logger.error(`Error getting Puppet forge data. Status: ${response.status}:${response.statusText}`);
50+
resolve();
51+
}
52+
return response.data;
53+
});
54+
});
55+
}
56+
57+
export function getModuleInfo(title: string, logger: ILogger): Promise<PuppetForgeModuleInfo> {
58+
return new Promise((resolve) => {
59+
return axios
60+
.get(`https://forgeapi.puppet.com/v3/modules/${title}`, {
61+
params: {
62+
// eslint-disable-next-line @typescript-eslint/camelcase
63+
exclude_fields: 'readme changelog license reference',
64+
},
65+
headers: {
66+
'Content-Type': 'application/json;charset=UTF-8',
67+
'User-Agent': 'puppet-vscode/0.27.1',
68+
},
69+
})
70+
.then((response) => {
71+
if (response.status !== 200) {
72+
logger.error(`Error getting Puppet forge data. Status: ${response.status}:${response.statusText}`);
73+
resolve();
74+
}
75+
76+
const info = response.data;
77+
const module = {
78+
uri: info.uri,
79+
slug: info.slug,
80+
name: info.name,
81+
downloads: info.downloads,
82+
score: info.feedback_score,
83+
created: new Date(info.created_at),
84+
updated: new Date(info.updated_at),
85+
endorsement: info.endorsement ?? '',
86+
forgeUrl: `https://forge.puppet.com/${info.owner.username}/${info.name}`,
87+
homepageUrl: info.homepage_url ?? '',
88+
version: info.current_release.version,
89+
owner: {
90+
uri: info.owner.uri,
91+
slug: info.owner.slug,
92+
username: info.owner.username,
93+
gravatar: info.owner.gravatar_id,
94+
},
95+
summary: info.current_release.metadata.summary,
96+
};
97+
98+
resolve(module);
99+
})
100+
.catch((error) => {
101+
logger.error(`Error getting Puppet forge data: ${error}`);
102+
resolve();
103+
});
104+
});
105+
}

0 commit comments

Comments
 (0)