Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions src/managers/common/registeredManagers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ import type {
*/

export class InternalEnvironmentManager implements EnvironmentManager {
private _version?: Promise<Pep440Version | undefined>;

public constructor(
public readonly id: string,
private readonly manager: EnvironmentManager,
Expand Down Expand Up @@ -87,7 +89,8 @@ export class InternalEnvironmentManager implements EnvironmentManager {
}

public getVersion(): Promise<Pep440Version | undefined> {
return this.manager.getVersion ? this.manager.getVersion() : Promise.resolve(undefined);
this._version ??= this.manager.getVersion ? this.manager.getVersion() : Promise.resolve(undefined);
return this._version;
}

public get capabilities(): EnvironmentManager['capabilities'] {
Expand Down Expand Up @@ -240,6 +243,7 @@ function inferPackageManagementTrigger(
}

export class InternalPackageManager implements PackageManager {
private readonly _version = new Map<string, Promise<Pep440Version | undefined>>();
private readonly relatedManagers: WeakSet<PackageManager>;
private readonly packageChangeEventValue: Event<DidChangePackagesEventArgs> | undefined;
private isDisposed = false;
Expand Down Expand Up @@ -386,7 +390,15 @@ export class InternalPackageManager implements PackageManager {

getVersion(environment: PythonEnvironment): Promise<Pep440Version | undefined> {
this.throwIfDisposed();
return this.manager.getVersion ? this.manager.getVersion(environment) : Promise.resolve(undefined);
const environmentId = environment.envId.id;
Comment thread
edvilme marked this conversation as resolved.
Resolved
let version = this._version.get(environmentId);
if (!version) {
version = this.manager.getVersion
? this.manager.getVersion(environment)
: Promise.resolve(undefined);
this._version.set(environmentId, version);
}
return version;
}

getPackageAvailableVersions(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,47 @@
// Licensed under the MIT License.

import * as assert from 'assert';
import { explain as parsePep440Version } from '@renovatebot/pep440';
import * as sinon from 'sinon';
import { isPackageVersionLookupNotSupportedError } from '../../../publicErrors';
import type { PackageManager, PythonEnvironment } from '../../../types';
import { InternalPackageManager } from '../../../managers/common/registeredManagers';
import type { EnvironmentManager, PackageManager, PythonEnvironment } from '../../../types';
import {
InternalEnvironmentManager,
InternalPackageManager,
} from '../../../managers/common/registeredManagers';

suite('Internal manager getVersion', () => {
const version = parsePep440Version('1.2.3');

test('caches an environment manager version', async () => {
const getVersion = sinon.stub().resolves(version);
const manager = new InternalEnvironmentManager('test:manager', {
getVersion,
} as unknown as EnvironmentManager);

assert.deepStrictEqual(await manager.getVersion(), version);
assert.deepStrictEqual(await manager.getVersion(), version);
assert.strictEqual(getVersion.callCount, 1);
});

test('caches a package manager version', async () => {
const environment = { envId: { id: 'env', managerId: 'mgr' } } as PythonEnvironment;
const otherEnvironment = { envId: { id: 'other-env', managerId: 'mgr' } } as PythonEnvironment;
const otherVersion = parsePep440Version('2.0.0');
const getVersion = sinon.stub();
getVersion.withArgs(environment).resolves(version);
getVersion.withArgs(otherEnvironment).resolves(otherVersion);
const manager = new InternalPackageManager('test:manager', {
getVersion,
} as unknown as PackageManager);

assert.deepStrictEqual(await manager.getVersion(environment), version);
assert.deepStrictEqual(await manager.getVersion(environment), version);
assert.deepStrictEqual(await manager.getVersion(otherEnvironment), otherVersion);
assert.deepStrictEqual(await manager.getVersion(otherEnvironment), otherVersion);
assert.strictEqual(getVersion.callCount, 2);
});
});

suite('InternalPackageManager.getPackageAvailableVersions', () => {
const environment = { envId: { id: 'env', managerId: 'mgr' } } as PythonEnvironment;
Expand Down
Loading