From 972da4bc0229d05b9e632396b148e29fa2c9246a Mon Sep 17 00:00:00 2001 From: Kartik Raj Date: Thu, 18 Apr 2019 15:55:47 -0700 Subject: [PATCH] Include pylintrc --- src/client/linters/constants.ts | 2 - src/client/linters/linterAvailability.ts | 23 +++++------ .../linters/linter.availability.unit.test.ts | 40 +++---------------- 3 files changed, 16 insertions(+), 49 deletions(-) diff --git a/src/client/linters/constants.ts b/src/client/linters/constants.ts index 27133fb80552..a3067c2eead6 100644 --- a/src/client/linters/constants.ts +++ b/src/client/linters/constants.ts @@ -17,5 +17,3 @@ export const LINTERID_BY_PRODUCT = new Map([ [Product.pydocstyle, 'pydocstyle'], [Product.pylama, 'pylama'] ]); - -export const PYLINT_CONFIG = '.pylintrc'; diff --git a/src/client/linters/linterAvailability.ts b/src/client/linters/linterAvailability.ts index 9e4bed947e0a..22aa5215a6e8 100644 --- a/src/client/linters/linterAvailability.ts +++ b/src/client/linters/linterAvailability.ts @@ -8,13 +8,12 @@ import * as path from 'path'; import { Uri } from 'vscode'; import { IApplicationShell, IWorkspaceService } from '../common/application/types'; import '../common/extensions'; -import { traceError } from '../common/logger'; +import { traceDecorators } from '../common/logger'; import { IFileSystem } from '../common/platform/types'; -import { IConfigurationService, IPersistentStateFactory, Product } from '../common/types'; +import { IConfigurationService, IPersistentStateFactory } from '../common/types'; import { Common, Linters } from '../common/utils/localize'; import { sendTelemetryEvent } from '../telemetry'; import { EventName } from '../telemetry/constants'; -import { PYLINT_CONFIG } from './constants'; import { IAvailableLinterActivator, ILinterInfo } from './types'; const doNotDisplayPromptStateKey = 'MESSAGE_KEY_FOR_CONFIGURE_AVAILABLE_LINTER_PROMPT'; @@ -50,7 +49,7 @@ export class AvailableLinterActivator implements IAvailableLinterActivator { } // Is the linter available in the current workspace? - if (await this.isLinterAvailable(linterInfo.product, resource)) { + if (await this.isLinterAvailable(linterInfo, resource)) { // great, it is - ask the user if they'd like to enable it. return this.promptToConfigureAvailableLinter(linterInfo); @@ -96,18 +95,18 @@ export class AvailableLinterActivator implements IAvailableLinterActivator { * @param linterProduct Linter to check in the current workspace environment. * @param resource Context information for workspace. */ - public async isLinterAvailable(linterProduct: Product, resource?: Uri): Promise { + @traceDecorators.error('Failed to discover if linter pylint is available') + public async isLinterAvailable(linterInfo: ILinterInfo, resource?: Uri): Promise { if (!this.workspaceService.hasWorkspaceFolders) { return false; } const workspaceFolder = resource ? this.workspaceService.getWorkspaceFolder(resource)! : this.workspaceService.workspaceFolders![0]; - const filePath = path.join(workspaceFolder.uri.fsPath, PYLINT_CONFIG); - return this.fs.fileExists(filePath) - .catch((reason) => { - // report and continue, assume the linter is unavailable. - traceError(`[WARNING]: Failed to discover if linter ${linterProduct} is installed.`, reason); - return false; - }); + let isAvailable = false; + for (const configName of linterInfo.configFileNames) { + const configPath = path.join(workspaceFolder.uri.fsPath, configName); + isAvailable = isAvailable || await this.fs.fileExists(configPath); + } + return isAvailable; } /** diff --git a/src/test/linters/linter.availability.unit.test.ts b/src/test/linters/linter.availability.unit.test.ts index 1ce3c1fca912..a42f73dbb145 100644 --- a/src/test/linters/linter.availability.unit.test.ts +++ b/src/test/linters/linter.availability.unit.test.ts @@ -284,7 +284,7 @@ suite('Linter Availability Provider tests', () => { .verifiable(TypeMoq.Times.once()); fsMock.setup(fs => fs.fileExists(TypeMoq.It.isAny())) .returns(async () => options.linterIsInstalled) - .verifiable(TypeMoq.Times.once()); + .verifiable(TypeMoq.Times.atLeastOnce()); setupConfigurationServiceForJediSettingsTest(options.jediEnabledValue, configServiceMock); setupWorkspaceMockForLinterConfiguredTests( @@ -413,7 +413,7 @@ suite('Linter Availability Provider tests', () => { // perform test const availabilityProvider = new AvailableLinterActivator(appShellMock.object, fsMock.object, workspaceServiceMock.object, configServiceMock.object, factoryMock.object); - const result = await availabilityProvider.isLinterAvailable(linterInfo.product); + const result = await availabilityProvider.isLinterAvailable(linterInfo); expect(result).to.equal(expectedResult, 'Expected promptToConfigureAvailableLinter to return true because the configuration was updated.'); fsMock.verifyAll(); @@ -431,37 +431,7 @@ suite('Linter Availability Provider tests', () => { // perform test const availabilityProvider = new AvailableLinterActivator(appShellMock.object, fsMock.object, workspaceServiceMock.object, configServiceMock.object, factoryMock.object); - const result = await availabilityProvider.isLinterAvailable(linterInfo.product); - - expect(result).to.equal(expectedResult, 'Expected promptToConfigureAvailableLinter to return true because the configuration was updated.'); - fsMock.verifyAll(); - workspaceServiceMock.verifyAll(); - }); - - test('Discovery of linter is available in the environment returns false when it fails', async () => { - // set expectations - const expectedResult = false; - - // arrange - const [appShellMock, fsMock, workspaceServiceMock, configServiceMock, factoryMock, linterInfo] = getDependenciesForAvailabilityTests(); - const workspaceFolder = { uri: Uri.parse('full/path/to/workspace'), name: '', index: 0 }; - workspaceServiceMock - .setup(c => c.hasWorkspaceFolders) - .returns(() => true) - .verifiable(TypeMoq.Times.once()); - workspaceServiceMock - .setup(c => c.workspaceFolders) - .returns(() => [workspaceFolder]); - workspaceServiceMock - .setup(c => c.getWorkspaceFolder(TypeMoq.It.isAny())) - .returns(() => workspaceFolder); - fsMock.setup(fs => fs.fileExists(TypeMoq.It.isAny())) - .returns(async () => Promise.reject('error testfail')) - .verifiable(TypeMoq.Times.once()); - - // perform test - const availabilityProvider = new AvailableLinterActivator(appShellMock.object, fsMock.object, workspaceServiceMock.object, configServiceMock.object, factoryMock.object); - const result = await availabilityProvider.isLinterAvailable(linterInfo.product); + const result = await availabilityProvider.isLinterAvailable(linterInfo); expect(result).to.equal(expectedResult, 'Expected promptToConfigureAvailableLinter to return true because the configuration was updated.'); fsMock.verifyAll(); @@ -532,8 +502,8 @@ function setupInstallerForAvailabilityTest(_linterInfo: LinterInfo, linterIsInst .setup(c => c.getWorkspaceFolder(TypeMoq.It.isAny())) .returns(() => workspaceFolder); fsMock.setup(fs => fs.fileExists(TypeMoq.It.isAny())) - .returns(async () => linterIsInstalled) - .verifiable(TypeMoq.Times.once()); + .returns(() => Promise.resolve(linterIsInstalled)) + .verifiable(TypeMoq.Times.atLeastOnce()); return fsMock; }