From bb22b9acebc6a12f1741516b50401dab355e7560 Mon Sep 17 00:00:00 2001 From: Karthik Nadig Date: Wed, 16 Sep 2020 12:15:48 -0700 Subject: [PATCH 1/2] Clean up eslint errors --- .../discovery/locators/helpers.ts | 15 +- .../discovery/locators/index.ts | 49 +++--- .../discovery/locators/progressService.ts | 5 +- .../locators/services/KnownPathsService.ts | 2 +- .../services/baseVirtualEnvService.ts | 19 +-- .../discovery/locators/index.unit.test.ts | 139 ++++++++++-------- .../locators/progressService.unit.test.ts | 35 +++-- 7 files changed, 146 insertions(+), 118 deletions(-) diff --git a/src/client/pythonEnvironments/discovery/locators/helpers.ts b/src/client/pythonEnvironments/discovery/locators/helpers.ts index 8b72b92b0e25..d2b64b20d895 100644 --- a/src/client/pythonEnvironments/discovery/locators/helpers.ts +++ b/src/client/pythonEnvironments/discovery/locators/helpers.ts @@ -10,7 +10,7 @@ import { EnvironmentType, PythonEnvironment } from '../../info'; const CheckPythonInterpreterRegEx = IS_WINDOWS ? /^python(\d+(.\d+)?)?\.exe$/ : /^python(\d+(.\d+)?)?$/; -export async function lookForInterpretersInDirectory(pathToCheck: string, _: IFileSystem): Promise { +export async function lookForInterpretersInDirectory(pathToCheck: string): Promise { // Technically, we should be able to use fs.getFiles(). However, // that breaks some tests. So we stick with the broader behavior. try { @@ -40,9 +40,9 @@ export class InterpreterLocatorHelper implements IInterpreterLocatorHelper { item.path = path.normalize(item.path); return item; }) - .reduce((accumulator, current) => { + .reduce((accumulator, current:PythonEnvironment) => { const currentVersion = current && current.version ? current.version.raw : undefined; - const existingItem = accumulator.find((item) => { + let existingItem = accumulator.find((item) => { // If same version and same base path, then ignore. // Could be Python 3.6 with path = python.exe, and Python 3.6 and path = python3.exe. if ( @@ -76,12 +76,11 @@ export class InterpreterLocatorHelper implements IInterpreterLocatorHelper { 'sysVersion', 'version', ]; - for (const prop of props) { - if (!existingItem[prop] && current[prop]) { - // tslint:disable-next-line: no-any - (existingItem as any)[prop] = current[prop]; + props.forEach((prop) => { + if (existingItem && !existingItem[prop] && current[prop]) { + existingItem = { ...existingItem, [prop]: current[prop] }; } - } + }); } return accumulator; }, []); diff --git a/src/client/pythonEnvironments/discovery/locators/index.ts b/src/client/pythonEnvironments/discovery/locators/index.ts index 4ebf360f765a..e7f4d8178d81 100644 --- a/src/client/pythonEnvironments/discovery/locators/index.ts +++ b/src/client/pythonEnvironments/discovery/locators/index.ts @@ -1,4 +1,6 @@ +/* eslint-disable max-classes-per-file */ import { inject, injectable } from 'inversify'; +import { flatten } from 'lodash'; import { Disposable, Event, EventEmitter, Uri, } from 'vscode'; @@ -37,9 +39,6 @@ import { PythonEnvironment } from '../../info'; import { isHiddenInterpreter } from './services/interpreterFilter'; import { GetInterpreterLocatorOptions } from './types'; -// tslint:disable-next-line:no-require-imports no-var-requires -const flatten = require('lodash/flatten') as typeof import('lodash/flatten'); - /** * A wrapper around all locators used by the extension. */ @@ -49,7 +48,7 @@ export class ExtensionLocators extends Locators { nonWorkspace: ILocator[], // This is expected to be a locator wrapping any found in // the workspace (i.e. WorkspaceLocators). - workspace: ILocator + workspace: ILocator, ) { super([...nonWorkspace, workspace]); } @@ -72,10 +71,12 @@ type RootURI = string; */ export class WorkspaceLocators extends Locator { private readonly locators: Record = {}; + private readonly roots: Record = {}; + constructor( // used to produce the per-root locators: - private readonly factories: WorkspaceLocatorFactory[] + private readonly factories: WorkspaceLocatorFactory[], ) { super(); } @@ -85,10 +86,10 @@ export class WorkspaceLocators extends Locator { * * @param folders - the info used to keep track of the workspace folders */ - public activate(folders: IWorkspaceFolders) { - for (const root of folders.roots) { + public activate(folders: IWorkspaceFolders):void { + folders.roots.forEach((root) => { this.addRoot(root); - } + }); folders.onAdded((root: Uri) => this.addRoot(root)); folders.onRemoved((root: Uri) => this.removeRoot(root)); } @@ -116,7 +117,11 @@ export class WorkspaceLocators extends Locator { } } // Fall back to checking all the roots. + // The eslint disable below should be removed after we have a + // better solution for these. We need asyncFind for this. + // eslint-disable-next-line no-restricted-syntax for (const key of Object.keys(this.locators)) { + // eslint-disable-next-line no-await-in-loop const resolved = await this.locators[key].resolveEnv(env); if (resolved !== undefined) { return resolved; @@ -130,9 +135,9 @@ export class WorkspaceLocators extends Locator { this.removeRoot(root); // Create the root's locator, wrapping each factory-generated locator. const locators: ILocator[] = []; - for (const create of this.factories) { + this.factories.forEach((create) => { locators.push(...create(root)); - } + }); const locator = new DisableableLocator(new Locators(locators)); // Cache it. const key = root.toString(); @@ -168,17 +173,18 @@ export class WorkspaceLocators extends Locator { * or the URI must be a parent of one of the candidates. */ function matchURI(uri: Uri, ...candidates: Uri[]): boolean { - const uriPath = uri.path.endsWith('/') ? uri.path : `{uri.path}/`; - for (const candidate of candidates) { + const uriPath = uri.path.endsWith('/') ? uri.path : '{uri.path}/'; + const matchedUri = candidates.find((candidate) => { if (candidate.scheme === uri.scheme) { if (candidate.path === uri.path) { return true; - } else if (candidate.path.startsWith(uriPath)) { + } if (candidate.path.startsWith(uriPath)) { return true; } } - } - return false; + return false; + }); + return matchedUri !== undefined; } /** @@ -196,6 +202,9 @@ export class PythonInterpreterLocatorService implements IInterpreterLocatorServi private readonly _hasInterpreters: Deferred; + private readonly onLocatingEmitter:EventEmitter> = + new EventEmitter>(); + constructor(@inject(IServiceContainer) private serviceContainer: IServiceContainer) { this._hasInterpreters = createDeferred(); serviceContainer.get(IDisposableRegistry).push(this); @@ -206,14 +215,14 @@ export class PythonInterpreterLocatorService implements IInterpreterLocatorServi /** * This class should never emit events when we're locating. - * The events will be fired by the indivitual locators retrieved in `getLocators`. + * The events will be fired by the individual locators retrieved in `getLocators`. * * @readonly * @type {Event>} * @memberof PythonInterpreterLocatorService */ public get onLocating(): Event> { - return new EventEmitter>().event; + return this.onLocatingEmitter.event; } public get hasInterpreters(): Promise { @@ -225,7 +234,7 @@ export class PythonInterpreterLocatorService implements IInterpreterLocatorServi * * Called by VS Code to indicate it is done with the resource. */ - public dispose() { + public dispose():void { this.disposables.forEach((disposable) => disposable.dispose()); } @@ -286,7 +295,9 @@ export class PythonInterpreterLocatorService implements IInterpreterLocatorServi // Set it to true the first time the user selects an interpreter if (!this.didTriggerInterpreterSuggestions && options?.onSuggestion === true) { this.didTriggerInterpreterSuggestions = true; - locators.forEach((locator) => (locator.didTriggerInterpreterSuggestions = true)); + locators.forEach((locator) => { + locator.didTriggerInterpreterSuggestions = true; + }); } return locators; diff --git a/src/client/pythonEnvironments/discovery/locators/progressService.ts b/src/client/pythonEnvironments/discovery/locators/progressService.ts index f261fe858227..90005178d803 100644 --- a/src/client/pythonEnvironments/discovery/locators/progressService.ts +++ b/src/client/pythonEnvironments/discovery/locators/progressService.ts @@ -61,12 +61,13 @@ export class InterpreterLocatorProgressService implements IInterpreterLocatorPro this.refreshing.fire(); } - private checkProgress() { + private checkProgress(): void { if (this.deferreds.length === 0) { return; } if (this.areAllItemsComplete()) { - return this.notifyCompleted(); + this.notifyCompleted(); + return; } Promise.all(this.deferreds.map((item) => item.promise)) .catch(noop) diff --git a/src/client/pythonEnvironments/discovery/locators/services/KnownPathsService.ts b/src/client/pythonEnvironments/discovery/locators/services/KnownPathsService.ts index 40a83ededdb2..940bd21356f4 100644 --- a/src/client/pythonEnvironments/discovery/locators/services/KnownPathsService.ts +++ b/src/client/pythonEnvironments/discovery/locators/services/KnownPathsService.ts @@ -83,7 +83,7 @@ export class KnownPathsService extends CacheableLocatorService { const fs = this.serviceContainer.get(IFileSystem); return fs .directoryExists(dir) - .then((exists) => (exists ? lookForInterpretersInDirectory(dir, fs) : Promise.resolve([]))); + .then((exists) => (exists ? lookForInterpretersInDirectory(dir) : Promise.resolve([]))); } } diff --git a/src/client/pythonEnvironments/discovery/locators/services/baseVirtualEnvService.ts b/src/client/pythonEnvironments/discovery/locators/services/baseVirtualEnvService.ts index a969b9bea14a..121ffe0152b9 100644 --- a/src/client/pythonEnvironments/discovery/locators/services/baseVirtualEnvService.ts +++ b/src/client/pythonEnvironments/discovery/locators/services/baseVirtualEnvService.ts @@ -1,6 +1,7 @@ // tslint:disable:no-unnecessary-callback-wrapper no-require-imports no-var-requires import { injectable, unmanaged } from 'inversify'; +import { flatten, noop } from 'lodash'; import * as path from 'path'; import { Uri } from 'vscode'; import { traceError } from '../../../../common/logger'; @@ -12,8 +13,6 @@ import { EnvironmentType, PythonEnvironment } from '../../../info'; import { lookForInterpretersInDirectory } from '../helpers'; import { CacheableLocatorService } from './cacheableLocatorService'; -const flatten = require('lodash/flatten') as typeof import('lodash/flatten'); - @injectable() export class BaseVirtualEnvService extends CacheableLocatorService { private readonly virtualEnvMgr: IVirtualEnvironmentManager; @@ -34,8 +33,10 @@ export class BaseVirtualEnvService extends CacheableLocatorService { this.fileSystem = serviceContainer.get(IFileSystem); } - // tslint:disable-next-line:no-empty - public dispose() {} + // eslint-disable-next-line class-methods-use-this + public dispose(): void { + noop(); + } protected getInterpretersImplementation(resource?: Uri): Promise { return this.suggestionsFromKnownVenvs(resource); @@ -53,7 +54,7 @@ export class BaseVirtualEnvService extends CacheableLocatorService { .getSubDirectories(pathToCheck) .then((subDirs) => Promise.all(this.getProspectiveDirectoriesForLookup(subDirs))) .then((dirs) => dirs.filter((dir) => dir.length > 0)) - .then((dirs) => Promise.all(dirs.map((d) => lookForInterpretersInDirectory(d, this.fileSystem)))) + .then((dirs) => Promise.all(dirs.map((d) => lookForInterpretersInDirectory(d)))) .then((pathsWithInterpreters) => flatten(pathsWithInterpreters)) .then((interpreters) => Promise.all( interpreters.map((interpreter) => this.getVirtualEnvDetails(interpreter, resource)), @@ -92,16 +93,16 @@ export class BaseVirtualEnvService extends CacheableLocatorService { this.helper.getInterpreterInformation(interpreter), this.virtualEnvMgr.getEnvironmentName(interpreter, resource), this.virtualEnvMgr.getEnvironmentType(interpreter, resource), - ]).then(([details, virtualEnvName, type]) => { + ]).then(([details, virtualEnvName, type]):Promise => { if (!details) { - return; + return Promise.resolve(undefined); } this._hasInterpreters.resolve(true); - return { + return Promise.resolve({ ...(details as PythonEnvironment), envName: virtualEnvName, type: type! as EnvironmentType, - }; + }); }); } } diff --git a/src/test/pythonEnvironments/discovery/locators/index.unit.test.ts b/src/test/pythonEnvironments/discovery/locators/index.unit.test.ts index a610a8d3c9fc..53221858a193 100644 --- a/src/test/pythonEnvironments/discovery/locators/index.unit.test.ts +++ b/src/test/pythonEnvironments/discovery/locators/index.unit.test.ts @@ -31,21 +31,28 @@ import { PythonEnvInfo, PythonEnvKind } from '../../../../client/pythonEnvironme import { PythonEnvsChangedEvent } from '../../../../client/pythonEnvironments/base/watcher'; import { PythonInterpreterLocatorService, - WorkspaceLocators + WorkspaceLocators, } from '../../../../client/pythonEnvironments/discovery/locators'; import { EnvironmentType, PythonEnvironment } from '../../../../client/pythonEnvironments/info'; -import { createEnv, createLocatedEnv, getEnvs, SimpleLocator } from '../../base/common'; +import { + createEnv, createLocatedEnv, getEnvs, SimpleLocator, +} from '../../base/common'; class WorkspaceFolders { public added = new EventEmitter(); + public removed = new EventEmitter(); + public readonly roots: Uri[]; + constructor(roots: (Uri | string)[]) { - this.roots = roots.map((r) => typeof r === 'string' ? Uri.file(r) : r); + this.roots = roots.map((r) => (typeof r === 'string' ? Uri.file(r) : r)); } + public get onAdded(): Event { return this.added.event; } + public get onRemoved(): Event { return this.removed.event; } @@ -62,10 +69,10 @@ suite('WorkspaceLocators', () => { [Uri.file('bar'), 2], // from onAdded: [Uri.file('baz'), 1], - [Uri.file('baz'), 2] + [Uri.file('baz'), 2], ]; // Force r._formatted to be set. - expected.forEach(([r,]) => r.toString()); + expected.forEach(([r]) => r.toString()); const calls: [Uri, number][] = []; const locators = new WorkspaceLocators([ (r) => { @@ -75,7 +82,7 @@ suite('WorkspaceLocators', () => { (r) => { calls.push([r, 2]); return []; - } + }, ]); const folders = new WorkspaceFolders(['foo', 'bar']); @@ -92,7 +99,7 @@ suite('WorkspaceLocators', () => { const env1 = createEnv('foo', '3.8.1', PythonEnvKind.Venv); const loc1 = new SimpleLocator([env1]); const locators = new WorkspaceLocators([ - (_r) => [loc1], + () => [loc1], ]); const folders = new WorkspaceFolders([]); locators.activate(folders); @@ -126,14 +133,14 @@ suite('WorkspaceLocators', () => { const root2 = Uri.file('bar'); const expected: PythonEnvsChangedEvent[] = [ { searchLocation: root1, kind: PythonEnvKind.Unknown }, - { searchLocation: root2, kind: PythonEnvKind.Venv}, + { searchLocation: root2, kind: PythonEnvKind.Venv }, { searchLocation: root1 }, { searchLocation: root2, kind: PythonEnvKind.Venv }, { searchLocation: root2, kind: PythonEnvKind.Pipenv }, - { searchLocation: root1, kind: PythonEnvKind.Conda } + { searchLocation: root1, kind: PythonEnvKind.Conda }, ]; const event1: PythonEnvsChangedEvent = { kind: PythonEnvKind.Unknown }; - const event2: PythonEnvsChangedEvent = { kind: PythonEnvKind.Venv}; + const event2: PythonEnvsChangedEvent = { kind: PythonEnvKind.Venv }; const event3: PythonEnvsChangedEvent = {}; const event4: PythonEnvsChangedEvent = { kind: PythonEnvKind.Venv }; const event5: PythonEnvsChangedEvent = { kind: PythonEnvKind.Pipenv }; @@ -146,9 +153,9 @@ suite('WorkspaceLocators', () => { const loc5 = new SimpleLocator([]); const loc6 = new SimpleLocator([]); const locators = new WorkspaceLocators([ - (r) => r === root1 ? [loc1] : [loc2], - (r) => r === root1 ? [loc3] : [loc4, loc5], - (r) => r === root1 ? [loc6] : [] + (r) => (r === root1 ? [loc1] : [loc2]), + (r) => (r === root1 ? [loc3] : [loc4, loc5]), + (r) => (r === root1 ? [loc6] : []), ]); const folders = new WorkspaceFolders([root1, root2]); locators.activate(folders); @@ -172,7 +179,7 @@ suite('WorkspaceLocators', () => { [root1, root2].forEach((r) => r.toString()); const expected: PythonEnvsChangedEvent[] = [ { searchLocation: root1 }, - { searchLocation: root2 } + { searchLocation: root2 }, ]; const locators = new WorkspaceLocators([]); const folders = new WorkspaceFolders(['foo', 'bar']); @@ -187,7 +194,7 @@ suite('WorkspaceLocators', () => { test('identifies added roots', () => { const added = Uri.file('baz'); const expected: PythonEnvsChangedEvent[] = [ - { searchLocation: added } + { searchLocation: added }, ]; const locators = new WorkspaceLocators([]); const folders = new WorkspaceFolders(['foo', 'bar']); @@ -206,7 +213,7 @@ suite('WorkspaceLocators', () => { // Force r._formatted to be set. [root1, root2].forEach((r) => r.toString()); const expected: PythonEnvsChangedEvent[] = [ - { searchLocation: root2 } + { searchLocation: root2 }, ]; const locators = new WorkspaceLocators([]); const folders = new WorkspaceFolders([root1, root2]); @@ -224,18 +231,18 @@ suite('WorkspaceLocators', () => { const root2 = Uri.file('bar'); const expected: PythonEnvsChangedEvent[] = [ { searchLocation: root1, kind: PythonEnvKind.Unknown }, - { searchLocation: root2, kind: PythonEnvKind.Venv}, + { searchLocation: root2, kind: PythonEnvKind.Venv }, { searchLocation: root2 }, // removed { searchLocation: root1 }, ]; const event1: PythonEnvsChangedEvent = { kind: PythonEnvKind.Unknown }; - const event2: PythonEnvsChangedEvent = { kind: PythonEnvKind.Venv}; + const event2: PythonEnvsChangedEvent = { kind: PythonEnvKind.Venv }; const event3: PythonEnvsChangedEvent = {}; const event4: PythonEnvsChangedEvent = { kind: PythonEnvKind.Venv }; const loc1 = new SimpleLocator([]); const loc2 = new SimpleLocator([]); const locators = new WorkspaceLocators([ - (r) => r === root1 ? [loc1] : [loc2] + (r) => (r === root1 ? [loc1] : [loc2]), ]); const folders = new WorkspaceFolders([root1, root2]); locators.activate(folders); @@ -258,7 +265,7 @@ suite('WorkspaceLocators', () => { const env1 = createEnv('foo', '3.8.1', PythonEnvKind.Venv); const loc1 = new SimpleLocator([env1]); const locators = new WorkspaceLocators([ - (_r) => [loc1], + () => [loc1], ]); const folders = new WorkspaceFolders([]); locators.activate(folders); @@ -286,7 +293,7 @@ suite('WorkspaceLocators', () => { const expected: PythonEnvInfo[] = []; const loc1 = new SimpleLocator([]); const locators = new WorkspaceLocators([ - (_r) => [loc1], + () => [loc1], ]); const folders = new WorkspaceFolders([root1]); locators.activate(folders); @@ -303,7 +310,7 @@ suite('WorkspaceLocators', () => { const expected: PythonEnvInfo[] = [env1]; const loc1 = new SimpleLocator([env1]); const locators = new WorkspaceLocators([ - (_r) => [loc1], + () => [loc1], ]); const folders = new WorkspaceFolders([root1]); locators.activate(folders); @@ -323,7 +330,7 @@ suite('WorkspaceLocators', () => { const loc2 = new SimpleLocator([], { before: loc1.done }); const loc3 = new SimpleLocator([env2], { before: loc2.done }); const locators = new WorkspaceLocators([ - (_r) => [loc1, loc2, loc3] + () => [loc1, loc2, loc3], ]); const folders = new WorkspaceFolders([root1]); locators.activate(folders); @@ -351,8 +358,8 @@ suite('WorkspaceLocators', () => { const loc3 = new SimpleLocator([env5, env6], { before: loc2.done }); const loc4 = new SimpleLocator([env7, env8], { before: loc3.done }); const locators = new WorkspaceLocators([ - (r) => r === root1 ? [loc1] : [loc3], - (r) => r === root1 ? [loc2] : [loc4] + (r) => (r === root1 ? [loc1] : [loc3]), + (r) => (r === root1 ? [loc2] : [loc4]), ]); const folders = new WorkspaceFolders([root1, root2]); locators.activate(folders); @@ -376,8 +383,8 @@ suite('WorkspaceLocators', () => { const loc3 = new SimpleLocator([env3], { before: loc2.done }); const loc4 = new SimpleLocator([env4], { before: loc3.done }); const locators = new WorkspaceLocators([ - (r) => r === root1 ? [loc1] : [loc3], - (r) => r === root1 ? [loc2] : [loc4] + (r) => (r === root1 ? [loc1] : [loc3]), + (r) => (r === root1 ? [loc2] : [loc4]), ]); const folders = new WorkspaceFolders([root1, root2]); locators.activate(folders); @@ -401,8 +408,8 @@ suite('WorkspaceLocators', () => { const loc3 = new SimpleLocator([env3], { before: loc2.done }); const loc4 = new SimpleLocator([env4], { before: loc3.done }); const locators = new WorkspaceLocators([ - (r) => r === root1 ? [loc1] : [loc3], - (r) => r === root1 ? [loc2] : [loc4] + (r) => (r === root1 ? [loc1] : [loc3]), + (r) => (r === root1 ? [loc2] : [loc4]), ]); const folders = new WorkspaceFolders([root1, root2]); locators.activate(folders); @@ -425,8 +432,8 @@ suite('WorkspaceLocators', () => { const loc3 = new SimpleLocator([env3], { before: loc2.done }); const loc4 = new SimpleLocator([env4], { before: loc3.done }); const locators = new WorkspaceLocators([ - (r) => r === root1 ? [loc1] : [loc3], - (r) => r === root1 ? [loc2] : [loc4] + (r) => (r === root1 ? [loc1] : [loc3]), + (r) => (r === root1 ? [loc2] : [loc4]), ]); const folders = new WorkspaceFolders([root1, root2]); locators.activate(folders); @@ -450,8 +457,8 @@ suite('WorkspaceLocators', () => { const loc3 = new SimpleLocator([env3], { before: loc2.done }); const loc4 = new SimpleLocator([env4], { before: loc3.done }); const locators = new WorkspaceLocators([ - (r) => r === root1 ? [loc1] : [loc3], - (r) => r === root1 ? [loc2] : [loc4] + (r) => (r === root1 ? [loc1] : [loc3]), + (r) => (r === root1 ? [loc2] : [loc4]), ]); const folders = new WorkspaceFolders([root1, root2]); locators.activate(folders); @@ -479,8 +486,8 @@ suite('WorkspaceLocators', () => { const loc2 = new SimpleLocator([env3, env4], { before: loc1.done }); const loc4 = new SimpleLocator([env7, env8], { before: loc2.done }); const locators = new WorkspaceLocators([ - (r) => r === root1 ? [loc1] : [loc3], - (r) => r === root1 ? [loc2] : [loc4] + (r) => (r === root1 ? [loc1] : [loc3]), + (r) => (r === root1 ? [loc2] : [loc4]), ]); const folders = new WorkspaceFolders([root1, root2]); locators.activate(folders); @@ -512,7 +519,7 @@ suite('WorkspaceLocators', () => { createDeferred(), createDeferred(), createDeferred(), - createDeferred() + createDeferred(), ]; async function beforeEach(env: PythonEnvInfo) { const index = expected.indexOf(env); @@ -531,8 +538,8 @@ suite('WorkspaceLocators', () => { const loc3 = new SimpleLocator([env5, env6], { beforeEach, afterEach }); const loc4 = new SimpleLocator([env7, env8], { beforeEach, afterEach }); const locators = new WorkspaceLocators([ - (r) => r === root1 ? [loc1] : [loc3], - (r) => r === root1 ? [loc2] : [loc4] + (r) => (r === root1 ? [loc1] : [loc3]), + (r) => (r === root1 ? [loc2] : [loc4]), ]); const folders = new WorkspaceFolders([root1, root2]); locators.activate(folders); @@ -560,8 +567,8 @@ suite('WorkspaceLocators', () => { const loc3 = new SimpleLocator([env5, env6], { before: loc2.done }); const loc4 = new SimpleLocator([env7, env8], { before: loc3.done }); const locators = new WorkspaceLocators([ - (r) => r === root1 ? [loc1] : [loc3], - (r) => r === root1 ? [loc2] : [loc4] + (r) => (r === root1 ? [loc1] : [loc3]), + (r) => (r === root1 ? [loc2] : [loc4]), ]); const folders = new WorkspaceFolders([root1, root2]); @@ -592,8 +599,8 @@ suite('WorkspaceLocators', () => { const loc3 = new SimpleLocator([env5, env6], { before: loc2.done }); const loc4 = new SimpleLocator([env7, env8], { before: loc3.done }); const locators = new WorkspaceLocators([ - (r) => r === root1 ? [loc1] : [loc3], - (r) => r === root1 ? [loc2] : [loc4] + (r) => (r === root1 ? [loc1] : [loc3]), + (r) => (r === root1 ? [loc2] : [loc4]), ]); const folders = new WorkspaceFolders([]); locators.activate(folders); @@ -627,8 +634,8 @@ suite('WorkspaceLocators', () => { const loc3 = new SimpleLocator([env5, env6], { before: loc2.done }); const loc4 = new SimpleLocator([env7, env8], { before: loc3.done }); const locators = new WorkspaceLocators([ - (r) => r === root1 ? [loc1] : [loc3], - (r) => r === root1 ? [loc2] : [loc4] + (r) => (r === root1 ? [loc1] : [loc3]), + (r) => (r === root1 ? [loc2] : [loc4]), ]); const folders = new WorkspaceFolders([root1, root2]); locators.activate(folders); @@ -656,7 +663,7 @@ suite('WorkspaceLocators', () => { const env1 = createEnv('foo', '3.8.1', PythonEnvKind.Venv); const loc1 = new SimpleLocator([env1]); const locators = new WorkspaceLocators([ - (_r) => [loc1], + () => [loc1], ]); const folders = new WorkspaceFolders([]); locators.activate(folders); @@ -682,7 +689,7 @@ suite('WorkspaceLocators', () => { const env1 = createEnv('foo', '3.8.1', PythonEnvKind.Venv); const loc1 = new SimpleLocator([env1], { resolve: null }); const locators = new WorkspaceLocators([ - (_r) => [loc1], + () => [loc1], ]); const folders = new WorkspaceFolders([root1]); locators.activate(folders); @@ -698,7 +705,7 @@ suite('WorkspaceLocators', () => { const expected = env1; const loc1 = new SimpleLocator([env1]); const locators = new WorkspaceLocators([ - (_r) => [loc1], + () => [loc1], ]); const folders = new WorkspaceFolders([root1]); locators.activate(folders); @@ -713,10 +720,10 @@ suite('WorkspaceLocators', () => { const env1 = createEnv('foo', '3.8.1', PythonEnvKind.Venv); const expected = env1; const seen: number[] = []; - const loc1 = new SimpleLocator( [env1], { resolve: getResolver(seen, 1) }); + const loc1 = new SimpleLocator([env1], { resolve: getResolver(seen, 1) }); const loc2 = new SimpleLocator([], { resolve: getResolver(seen, 2) }); const locators = new WorkspaceLocators([ - (_r) => [loc1, loc2], + () => [loc1, loc2], ]); const folders = new WorkspaceFolders([root1]); locators.activate(folders); @@ -732,10 +739,10 @@ suite('WorkspaceLocators', () => { const env1 = createEnv('foo', '3.8.1', PythonEnvKind.Venv); const expected = env1; const seen: number[] = []; - const loc1 = new SimpleLocator( [env1], { resolve: getResolver(seen, 1, false) }); + const loc1 = new SimpleLocator([env1], { resolve: getResolver(seen, 1, false) }); const loc2 = new SimpleLocator([], { resolve: getResolver(seen, 2) }); const locators = new WorkspaceLocators([ - (_r) => [loc1, loc2], + () => [loc1, loc2], ]); const folders = new WorkspaceFolders([root1]); locators.activate(folders); @@ -750,10 +757,10 @@ suite('WorkspaceLocators', () => { const root1 = Uri.file('foo'); const env1 = createEnv('foo', '3.8.1', PythonEnvKind.Venv); const seen: number[] = []; - const loc1 = new SimpleLocator( [env1], { resolve: getResolver(seen, 1, false) }); + const loc1 = new SimpleLocator([env1], { resolve: getResolver(seen, 1, false) }); const loc2 = new SimpleLocator([], { resolve: getResolver(seen, 2, false) }); const locators = new WorkspaceLocators([ - (_r) => [loc1, loc2], + () => [loc1, loc2], ]); const folders = new WorkspaceFolders([root1]); locators.activate(folders); @@ -770,10 +777,10 @@ suite('WorkspaceLocators', () => { const env1 = createEnv('foo', '3.8.1', PythonEnvKind.Venv); const expected = env1; const seen: number[] = []; - const loc1 = new SimpleLocator( [env1], { resolve: getResolver(seen, 1, false) }); + const loc1 = new SimpleLocator([env1], { resolve: getResolver(seen, 1, false) }); const loc2 = new SimpleLocator([], { resolve: getResolver(seen, 2) }); const locators = new WorkspaceLocators([ - (r) => r === root1 ? [loc1] : [loc2], + (r) => (r === root1 ? [loc1] : [loc2]), ]); const folders = new WorkspaceFolders([root1, root2]); locators.activate(folders); @@ -791,10 +798,10 @@ suite('WorkspaceLocators', () => { env1.searchLocation = root2; const expected = env1; const seen: number[] = []; - const loc1 = new SimpleLocator( [], { resolve: getResolver(seen, 1) }); + const loc1 = new SimpleLocator([], { resolve: getResolver(seen, 1) }); const loc2 = new SimpleLocator([], { resolve: getResolver(seen, 2) }); const locators = new WorkspaceLocators([ - (r) => r === root1 ? [loc1] : [loc2], + (r) => (r === root1 ? [loc1] : [loc2]), ]); const folders = new WorkspaceFolders([root1, root2]); locators.activate(folders); @@ -812,10 +819,10 @@ suite('WorkspaceLocators', () => { env1.searchLocation = Uri.file('baz'); const expected = env1; const seen: number[] = []; - const loc1 = new SimpleLocator( [env1], { resolve: getResolver(seen, 1) }); + const loc1 = new SimpleLocator([env1], { resolve: getResolver(seen, 1) }); const loc2 = new SimpleLocator([], { resolve: getResolver(seen, 2) }); const locators = new WorkspaceLocators([ - (r) => r === root1 ? [loc1] : [loc2], + (r) => (r === root1 ? [loc1] : [loc2]), ]); const folders = new WorkspaceFolders([root1, root2]); locators.activate(folders); @@ -892,7 +899,9 @@ suite('Interpreters - Locators Index', () => { .verifiable(TypeMoq.Times.once()); serviceContainer - .setup((c) => c.get(TypeMoq.It.isValue(IInterpreterLocatorService), TypeMoq.It.isValue(typeName))) + .setup( + (c) => c.get(TypeMoq.It.isValue(IInterpreterLocatorService), TypeMoq.It.isValue(typeName)), + ) .returns(() => typeLocator.object); return { @@ -953,7 +962,9 @@ suite('Interpreters - Locators Index', () => { .verifiable(TypeMoq.Times.once()); serviceContainer - .setup((c) => c.get(TypeMoq.It.isValue(IInterpreterLocatorService), TypeMoq.It.isValue(typeName))) + .setup( + (c) => c.get(TypeMoq.It.isValue(IInterpreterLocatorService), TypeMoq.It.isValue(typeName)), + ) .returns(() => typeLocator.object); return { @@ -1017,7 +1028,9 @@ suite('Interpreters - Locators Index', () => { .verifiable(TypeMoq.Times.once()); serviceContainer - .setup((c) => c.get(TypeMoq.It.isValue(IInterpreterLocatorService), TypeMoq.It.isValue(typeName))) + .setup( + (c) => c.get(TypeMoq.It.isValue(IInterpreterLocatorService), TypeMoq.It.isValue(typeName)), + ) .returns(() => typeLocator.object); return { @@ -1034,7 +1047,7 @@ suite('Interpreters - Locators Index', () => { await locator.getInterpreters(resource, { onSuggestion: true }); locatorsWithInterpreters.forEach((item) => item.locator.verify( - (l) => (l.didTriggerInterpreterSuggestions = true), TypeMoq.Times.once(), + (l) => { l.didTriggerInterpreterSuggestions = true; }, TypeMoq.Times.once(), )); expect(locator.didTriggerInterpreterSuggestions).to.equal( true, diff --git a/src/test/pythonEnvironments/discovery/locators/progressService.unit.test.ts b/src/test/pythonEnvironments/discovery/locators/progressService.unit.test.ts index 8a3d27df4667..acf904636d00 100644 --- a/src/test/pythonEnvironments/discovery/locators/progressService.unit.test.ts +++ b/src/test/pythonEnvironments/discovery/locators/progressService.unit.test.ts @@ -9,7 +9,7 @@ import { expect } from 'chai'; import { anything, instance, mock, when, } from 'ts-mockito'; -import { Disposable, Uri } from 'vscode'; +import { Disposable } from 'vscode'; import { createDeferred } from '../../../../client/common/utils/async'; import { noop } from '../../../../client/common/utils/misc'; import { IInterpreterLocatorService } from '../../../../client/interpreter/contracts'; @@ -20,26 +20,29 @@ import { sleep } from '../../../core'; suite('Interpreters - Locator Progress', () => { class Locator implements IInterpreterLocatorService { + public locatingCallback?: (e: Promise) => unknown; + + private hasInterpreterValue = true; + + private interpreters: PythonEnvironment[] = []; + public get hasInterpreters(): Promise { - return Promise.resolve(true); + return Promise.resolve(this.hasInterpreterValue); } - public locatingCallback?: (e: Promise) => any; - public onLocating( - listener: (e: Promise) => any, - _thisArgs?: any, - _disposables?: Disposable[], + listener: (e: Promise) => unknown, ): Disposable { this.locatingCallback = listener; return { dispose: noop }; } - public getInterpreters(_resource?: Uri): Promise { - return Promise.resolve([]); + public getInterpreters(): Promise { + return Promise.resolve(this.interpreters); } - public dispose() { + // eslint-disable-next-line class-methods-use-this + public dispose(): void { noop(); } } @@ -52,9 +55,9 @@ suite('Interpreters - Locator Progress', () => { progress.register(); let refreshingInvoked = false; - progress.onRefreshing(() => (refreshingInvoked = true)); + progress.onRefreshing(() => { refreshingInvoked = true; }); let refreshedInvoked = false; - progress.onRefreshed(() => (refreshedInvoked = true)); + progress.onRefreshed(() => { refreshedInvoked = true; }); const locatingDeferred = createDeferred(); locator.locatingCallback!.bind(progress)(locatingDeferred.promise); @@ -69,9 +72,9 @@ suite('Interpreters - Locator Progress', () => { progress.register(); let refreshingInvoked = false; - progress.onRefreshing(() => (refreshingInvoked = true)); + progress.onRefreshing(() => { refreshingInvoked = true; }); let refreshedInvoked = false; - progress.onRefreshed(() => (refreshedInvoked = true)); + progress.onRefreshed(() => { refreshedInvoked = true; }); const locatingDeferred = createDeferred(); locator.locatingCallback!.bind(progress)(locatingDeferred.promise); @@ -91,9 +94,9 @@ suite('Interpreters - Locator Progress', () => { progress.register(); let refreshingInvoked = false; - progress.onRefreshing(() => (refreshingInvoked = true)); + progress.onRefreshing(() => { refreshingInvoked = true; }); let refreshedInvoked = false; - progress.onRefreshed(() => (refreshedInvoked = true)); + progress.onRefreshed(() => { refreshedInvoked = true; }); const locatingDeferred1 = createDeferred(); locator1.locatingCallback!.bind(progress)(locatingDeferred1.promise); From 4f2c975206c528621466ea1843a84185cc14ec65 Mon Sep 17 00:00:00 2001 From: Karthik Nadig Date: Wed, 16 Sep 2020 13:31:10 -0700 Subject: [PATCH 2/2] Fix linting and address comments. --- .../pythonEnvironments/discovery/locators/index.ts | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/client/pythonEnvironments/discovery/locators/index.ts b/src/client/pythonEnvironments/discovery/locators/index.ts index e7f4d8178d81..505cd2042046 100644 --- a/src/client/pythonEnvironments/discovery/locators/index.ts +++ b/src/client/pythonEnvironments/discovery/locators/index.ts @@ -1,3 +1,4 @@ +// tslint:disable-next-line: no-single-line-block-comment /* eslint-disable max-classes-per-file */ import { inject, injectable } from 'inversify'; import { flatten } from 'lodash'; @@ -174,16 +175,8 @@ export class WorkspaceLocators extends Locator { */ function matchURI(uri: Uri, ...candidates: Uri[]): boolean { const uriPath = uri.path.endsWith('/') ? uri.path : '{uri.path}/'; - const matchedUri = candidates.find((candidate) => { - if (candidate.scheme === uri.scheme) { - if (candidate.path === uri.path) { - return true; - } if (candidate.path.startsWith(uriPath)) { - return true; - } - } - return false; - }); + const matchedUri = candidates.find((candidate) => (candidate.scheme === uri.scheme) + && (candidate.path === uri.path || candidate.path.startsWith(uriPath))); return matchedUri !== undefined; }