Skip to content
Prev Previous commit
Next Next commit
Add untest poetry cache implementation
  • Loading branch information
patrick91 committed Mar 26, 2022
commit 59cb3f4919eb64c8afad1545f67330fee453e839
75 changes: 75 additions & 0 deletions src/cache-distributions/poetry-cache.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import * as glob from '@actions/glob';
import * as os from 'os';
import * as path from 'path';
import * as exec from '@actions/exec';

import CacheDistributor from './cache-distributor';

class PoetryCache extends CacheDistributor {
constructor(
private pythonVersion: string,
protected patterns: string = '**/poetry.lock'
) {
super('poetry', patterns);
}

protected async getCacheGlobalDirectories() {
const poetryConfig = await this.getPoetryConfiguration();

const cacheDir = poetryConfig['cache-dir'];
const virtualenvsPath = poetryConfig['virtualenvs.path'].replace(
'{cache-dir}',
cacheDir
);

const paths = [virtualenvsPath];

if (poetryConfig['virtualenvs.in-project'] === 'true') {
paths.push(path.join(process.cwd(), '.venv'));
}

return paths;
}

protected async computeKeys() {
const hash = await glob.hashFiles(this.patterns);
const primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-python-${this.pythonVersion}-${this.packageManager}-${hash}`;
const restoreKey = undefined;
return {
primaryKey,
restoreKey
};
}

private async getPoetryConfiguration() {
const {stdout, stderr, exitCode} = await exec.getExecOutput(
'poetry config --list'
);

if (exitCode && stderr) {
throw new Error(
`Could not get cache folder path for poetry package manager`
);
}

const lines = stdout.split(os.EOL);

const config = {} as {
'cache-dir': string;
'virtualenvs.in-project': string;
'virtualenvs.path': string;
};

for (let line of lines) {
line = line.replace(/#.*$/, '');

const [key, value] = line.split('=').map(part => part.trim());

config[key as keyof typeof config] = value;
}

return config;
}
}

export default PoetryCache;