Skip to content

Commit a7c5e40

Browse files
author
Kartik Raj
committed
Code reviews
1 parent 512d426 commit a7c5e40

File tree

7 files changed

+32
-18
lines changed

7 files changed

+32
-18
lines changed

.vscode/launch.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@
144144
"--ui=tdd",
145145
"--recursive",
146146
"--colors",
147-
"--grep", "xExtension",
147+
//"--grep", "<suite name>",
148148
"--timeout=300000"
149149
],
150150
"outFiles": [
@@ -209,4 +209,4 @@
209209
]
210210
}
211211
]
212-
}
212+
}

src/client/activation/extensionSurvey.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,33 +13,33 @@ import {
1313
import { Common, ExtensionSurveyBanner, LanguageService } from '../common/utils/localize';
1414
import { sendTelemetryEvent } from '../telemetry';
1515
import { EventName } from '../telemetry/constants';
16-
import { IExtensionSurvey } from './types';
16+
import { IExtensionSingleActivationService } from './types';
1717

1818
// persistent state names, exported to make use of in testing
1919
export enum extensionSurveyStateKeys {
2020
doNotShowAgain = 'doNotShowExtensionSurveyAgain',
2121
disableSurveyForTime = 'doNotShowExtensionSurveyUntilTime'
2222
}
2323

24-
export const timeToDisableSurveyFor = 1000 * 60 * 60 * 24 * 7 * 12; // 12 weeks
25-
const waitTimeToShowSurvey = 1000 * 60 * 60 * 3; // 3 hours
24+
const timeToDisableSurveyFor = 1000 * 60 * 60 * 24 * 7 * 12; // 12 weeks
25+
const WAIT_TIME_TO_SHOW_SURVEY = 1000 * 60 * 60 * 3; // 3 hours
2626

2727
@injectable()
28-
export class ExtensionSurveyPrompt implements IExtensionSurvey {
28+
export class ExtensionSurveyPrompt implements IExtensionSingleActivationService {
2929
constructor(
3030
@inject(IApplicationShell) private appShell: IApplicationShell,
3131
@inject(IBrowserService) private browserService: IBrowserService,
3232
@inject(IPersistentStateFactory) private persistentState: IPersistentStateFactory,
3333
@inject(IRandom) private random: IRandom,
3434
@optional() private sampleSizePerOneHundredUsers: number = 10,
35-
@optional() private _waitTimeToShowSurvey: number = waitTimeToShowSurvey) { }
35+
@optional() private waitTimeToShowSurvey: number = WAIT_TIME_TO_SHOW_SURVEY) { }
3636

37-
public async initialize(): Promise<void> {
37+
public async activate(): Promise<void> {
3838
const show = this.shouldShowBanner();
3939
if (!show) {
4040
return;
4141
}
42-
setTimeout(() => this.showSurvey().ignoreErrors(), this._waitTimeToShowSurvey);
42+
setTimeout(() => this.showSurvey().ignoreErrors(), this.waitTimeToShowSurvey);
4343
}
4444

4545
@traceDecorators.error('Failed to check whether to display prompt for extension survey')

src/client/activation/serviceRegistry.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import { BetaLanguageServerPackageRepository, DailyLanguageServerPackageReposito
2727
import { LanguageServerPackageService } from './languageServer/languageServerPackageService';
2828
import { LanguageServerManager } from './languageServer/manager';
2929
import { PlatformData } from './languageServer/platformData';
30-
import { IDownloadChannelRule, IExtensionActivationManager, IExtensionActivationService, IExtensionSurvey, ILanguageClientFactory, ILanguageServer, ILanguageServerActivator, ILanguageServerAnalysisOptions, ILanguageServerCompatibilityService as ILanagueServerCompatibilityService, ILanguageServerDownloader, ILanguageServerExtension, ILanguageServerFolderService, ILanguageServerManager, ILanguageServerPackageService, IPlatformData, LanguageClientFactory, LanguageServerActivator } from './types';
30+
import { IDownloadChannelRule, IExtensionActivationManager, IExtensionActivationService, IExtensionSingleActivationService, ILanguageClientFactory, ILanguageServer, ILanguageServerActivator, ILanguageServerAnalysisOptions, ILanguageServerCompatibilityService as ILanagueServerCompatibilityService, ILanguageServerDownloader, ILanguageServerExtension, ILanguageServerFolderService, ILanguageServerManager, ILanguageServerPackageService, IPlatformData, LanguageClientFactory, LanguageServerActivator } from './types';
3131

3232
export function registerTypes(serviceManager: IServiceManager) {
3333
serviceManager.addSingleton<IExtensionActivationService>(IExtensionActivationService, LanguageServerExtensionActivationService);
@@ -56,5 +56,5 @@ export function registerTypes(serviceManager: IServiceManager) {
5656
serviceManager.add<ILanguageServerAnalysisOptions>(ILanguageServerAnalysisOptions, LanguageServerAnalysisOptions);
5757
serviceManager.addSingleton<ILanguageServer>(ILanguageServer, LanguageServer);
5858
serviceManager.add<ILanguageServerManager>(ILanguageServerManager, LanguageServerManager);
59-
serviceManager.addSingleton<IExtensionSurvey>(IExtensionSurvey, ExtensionSurveyPrompt);
59+
serviceManager.addSingleton<IExtensionSingleActivationService>(IExtensionSingleActivationService, ExtensionSurveyPrompt);
6060
}

src/client/activation/types.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export interface IExtensionActivationManager extends IDisposable {
1818
export const IExtensionActivationService = Symbol('IExtensionActivationService');
1919
/**
2020
* Classes implementing this interface will have their `activate` methods
21-
* invoked during the actiavtion of the extension.
21+
* invoked for every resource during the actiavtion of the extension.
2222
* This is a great hook for extension activation code, i.e. you don't need to modify
2323
* the `extension.ts` file to invoke some code when extension gets activated.
2424
* @export
@@ -124,7 +124,15 @@ export interface IPlatformData {
124124
readonly engineExecutableName: string;
125125
}
126126

127-
export const IExtensionSurvey = Symbol('IExtensionSurvey');
128-
export interface IExtensionSurvey {
129-
initialize(): Promise<void>;
127+
export const IExtensionSingleActivationService = Symbol('IExtensionSingleActivationService');
128+
/**
129+
* Classes implementing this interface will have their `activate` methods
130+
* invoked during the activation of the extension.
131+
* This is a great hook for extension activation code, i.e. you don't need to modify
132+
* the `extension.ts` file to invoke some code when extension gets activated.
133+
* @export
134+
* @interface IExtensionSingleActivationService
135+
*/
136+
export interface IExtensionSingleActivationService {
137+
activate(): Promise<void>;
130138
}

src/client/extension.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import {
3434
} from 'vscode';
3535

3636
import { registerTypes as activationRegisterTypes } from './activation/serviceRegistry';
37-
import { IExtensionActivationManager, IExtensionSurvey, ILanguageServerExtension } from './activation/types';
37+
import { IExtensionActivationManager, IExtensionSingleActivationService, ILanguageServerExtension } from './activation/types';
3838
import { buildApi, IExtensionApi } from './api';
3939
import { registerTypes as appRegisterTypes } from './application/serviceRegistry';
4040
import { IApplicationDiagnostics } from './application/types';
@@ -263,7 +263,8 @@ function registerServices(context: ExtensionContext, serviceManager: ServiceMana
263263
async function initializeServices(context: ExtensionContext, serviceManager: ServiceManager, serviceContainer: ServiceContainer) {
264264
const abExperiments = serviceContainer.get<IExperimentsManager>(IExperimentsManager);
265265
await abExperiments.activate();
266-
serviceContainer.get<IExtensionSurvey>(IExtensionSurvey).initialize().ignoreErrors();
266+
const singleActivationServices = serviceContainer.getAll<IExtensionSingleActivationService>(IExtensionSingleActivationService);
267+
Promise.all(singleActivationServices.map(item => item.activate())).ignoreErrors();
267268
const selector = serviceContainer.get<IInterpreterSelector>(IInterpreterSelector);
268269
selector.initialize();
269270
context.subscriptions.push(selector);

src/client/telemetry/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,9 @@ export interface IEventNamePropertyMapping {
459459
*/
460460
error?: string;
461461
};
462+
/**
463+
* When user clicks a button in the python extension survey prompt, this telemetry event is sent with details
464+
*/
462465
[EventName.EXTENSION_SURVEY_PROMPT]: {
463466
/**
464467
* Carries the selection of user when they are asked to take the extension survey

src/test/activation/extensionSurvey.unit.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ suite('xExtension survey prompt - shouldShowBanner()', () => {
7575
doNotShowAgain
7676
.setup(d => d.value)
7777
.returns(() => false);
78-
for (let i = 11; i < 100; i = i + 1) {
78+
// Default sample size is 10
79+
for (let i = 10; i < 100; i = i + 1) {
7980
random
8081
.setup(r => r.getRandomInt(0, 100))
8182
.returns(() => i);
@@ -91,6 +92,7 @@ suite('xExtension survey prompt - shouldShowBanner()', () => {
9192
doNotShowAgain
9293
.setup(d => d.value)
9394
.returns(() => false);
95+
// Default sample size is 10
9496
for (let i = 0; i < 10; i = i + 1) {
9597
random
9698
.setup(r => r.getRandomInt(0, 100))

0 commit comments

Comments
 (0)