UNPKG

semantic-release-pypi

Version:

semantic-release plugin to publish a python package to PyPI

124 lines 5.3 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import FormData from 'form-data'; import fs from 'fs'; import got from 'got'; import path from 'path'; import TOML from 'smol-toml'; import { DefaultConfig } from './default-options.js'; import { __dirname, pipe, spawn } from './util.js'; function assertEnvVar(name) { if (!process.env[name]) { throw new Error(`Environment variable ${name} is not set`); } } function assertExitCode(executable, args = [], options, exitCode = 0) { return __awaiter(this, void 0, void 0, function* () { let res; try { res = yield spawn(executable, args, options); } catch (err) { res = err; } if (res.exitCode != exitCode) { throw Error(res.stderr + `\ncommand: ${res.command}, exit code: ${res.exitCode}, expected: ${exitCode}`); } }); } function assertPackage(name, options) { return __awaiter(this, void 0, void 0, function* () { try { yield assertExitCode('pip3', ['show', name], options); } catch (err) { throw Error(`Package ${name} is not installed`); } }); } function verifySetupPy(setupPy, options) { return __awaiter(this, void 0, void 0, function* () { yield assertExitCode('python3', [path.resolve(__dirname, 'py/verify_setup.py'), path.basename(setupPy)], Object.assign(Object.assign({}, options), { cwd: path.dirname(setupPy) }), 0); }); } function verifyAuth(repoUrl, username, token) { return __awaiter(this, void 0, void 0, function* () { const form = new FormData(); form.append(':action', 'file_upload'); const basicAuth = Buffer.from(`${username}:${token}`).toString('base64'); const headers = { Authorization: `Basic ${basicAuth}`, }; try { yield got(repoUrl, { method: 'post', headers: Object.assign(headers, form.getHeaders()), body: form, }); } catch (err) { if (err.response && err.response.statusCode == 403) { throw err; } } }); } function isLegacyBuildInterface(srcDir) { const pyprojectPath = path.join(srcDir, 'pyproject.toml'); if (!fs.existsSync(pyprojectPath)) { return true; } return !fs.statSync(pyprojectPath).isFile; } function assertVersionCmd(pyproject, versionCmd) { var _a, _b; const dynamic = (_b = (_a = pyproject.project) === null || _a === void 0 ? void 0 : _a.dynamic) !== null && _b !== void 0 ? _b : []; if (dynamic.includes('version') && !versionCmd) { throw Error(`'versionCmd' is required when using a dynamic version`); } } function verify(pluginConfig, context) { var _a, _b, _c; return __awaiter(this, void 0, void 0, function* () { const { logger } = context; const { srcDir, setupPath, pypiPublish, repoUrl, repoUsername, repoToken, versionCmd, } = new DefaultConfig(pluginConfig); const execaOptions = pipe(context); if (pypiPublish !== false) { const repo = (_a = process.env['PYPI_REPO_URL']) !== null && _a !== void 0 ? _a : repoUrl; const username = (_b = process.env['PYPI_USERNAME']) !== null && _b !== void 0 ? _b : repoUsername; const token = (_c = process.env['PYPI_TOKEN']) !== null && _c !== void 0 ? _c : repoToken; if (token === '') { throw new Error(`Token is not set. Either set PYPI_TOKEN environment variable or repoToken in plugin configuration`); } logger.log(`Verify authentication for ${username}@${repo}`); yield verifyAuth(repo, username, token); } if (isLegacyBuildInterface(srcDir)) { logger.log('pyproject.toml not found, using legacy interface (setup.py)'); if (!fs.existsSync(setupPath)) { throw Error(`setup.py not found, path: ${setupPath}`); } logger.log('Verify that version is not set in setup.py'); yield verifySetupPy(setupPath, execaOptions); } else { const pyprojectPath = path.join(srcDir, 'pyproject.toml'); const toml = fs.readFileSync(pyprojectPath, { encoding: 'utf8', flag: 'r', }); const pyproject = TOML.parse(toml); assertVersionCmd(pyproject, versionCmd); } }); } export { assertEnvVar, assertExitCode, assertPackage, isLegacyBuildInterface, verify, verifyAuth, verifySetupPy, }; //# sourceMappingURL=verify.js.map