diff --git a/lib/pip.js b/lib/pip.js index 14864794..ea969c4f 100644 --- a/lib/pip.js +++ b/lib/pip.js @@ -7,6 +7,7 @@ const { spawnSync } = require('child_process'); const { quote } = require('shell-quote'); const { buildImage, getBindPath, getDockerUid } = require('./docker'); const { getStripCommand, getStripMode, deleteFiles } = require('./slim'); +const { isPoetryProject } = require('./poetry'); const { checkForAndDeleteMaxCacheVersions, sha256Path, @@ -62,7 +63,9 @@ function generateRequirementsFile( ) { if ( options.usePoetry && - fse.existsSync(path.join(servicePath, 'pyproject.toml')) + fse.existsSync( + path.join(servicePath, 'pyproject.toml') && isPoetryProject(servicePath) + ) ) { filterRequirementsFile( path.join(servicePath, '.serverless/requirements.txt'), @@ -442,7 +445,9 @@ function copyVendors(vendorFolder, targetFolder, serverless) { function requirementsFileExists(servicePath, options, fileName) { if ( options.usePoetry && - fse.existsSync(path.join(servicePath, 'pyproject.toml')) + fse.existsSync( + path.join(servicePath, 'pyproject.toml') && isPoetryProject(servicePath) + ) ) { return true; } diff --git a/lib/poetry.js b/lib/poetry.js index 7f041c83..9bf0424c 100644 --- a/lib/poetry.js +++ b/lib/poetry.js @@ -90,4 +90,4 @@ function isPoetryProject(servicePath) { return false; } -module.exports = { pyprojectTomlToRequirements }; +module.exports = { pyprojectTomlToRequirements, isPoetryProject }; diff --git a/test.js b/test.js index 59cb6a76..c924e141 100644 --- a/test.js +++ b/test.js @@ -748,6 +748,16 @@ test('non build pyproject.toml uses requirements.txt', t => { t.end(); }); +test('non poetry pyproject.toml without requirements.txt packages handler only', t => { + process.chdir('tests/non_poetry_pyproject'); + const path = npm(['pack', '../..']); + npm(['i', path]); + sls(['package']); + const zipfiles = listZipFiles('.serverless/sls-py-req-test.zip'); + t.true(zipfiles.includes(`handler.py`), 'handler is packaged'); + t.end(); +}); + test('poetry py3.6 can package flask with default options', t => { process.chdir('tests/poetry'); const path = npm(['pack', '../..']); diff --git a/tests/non_poetry_pyproject/.gitignore b/tests/non_poetry_pyproject/.gitignore new file mode 100644 index 00000000..3c2369dc --- /dev/null +++ b/tests/non_poetry_pyproject/.gitignore @@ -0,0 +1,22 @@ +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# Serverless +.serverless +.requirements +unzip_requirements.py diff --git a/tests/non_poetry_pyproject/handler.py b/tests/non_poetry_pyproject/handler.py new file mode 100644 index 00000000..5e2e67ff --- /dev/null +++ b/tests/non_poetry_pyproject/handler.py @@ -0,0 +1,5 @@ +import requests + + +def hello(event, context): + return requests.get('https://httpbin.org/get').json() diff --git a/tests/non_poetry_pyproject/package.json b/tests/non_poetry_pyproject/package.json new file mode 100644 index 00000000..752c49c6 --- /dev/null +++ b/tests/non_poetry_pyproject/package.json @@ -0,0 +1,14 @@ +{ + "name": "example", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "serverless-python-requirements": "file:serverless-python-requirements-5.1.0.tgz" + } +} diff --git a/tests/non_poetry_pyproject/pyproject.toml b/tests/non_poetry_pyproject/pyproject.toml new file mode 100644 index 00000000..41932632 --- /dev/null +++ b/tests/non_poetry_pyproject/pyproject.toml @@ -0,0 +1,10 @@ +[tool.black] +line-length = 79 +py36 = true +skip-string-normalization = true +exclude = ''' +/( + \.serverless + | node_modules +)/ +''' diff --git a/tests/non_poetry_pyproject/serverless.yml b/tests/non_poetry_pyproject/serverless.yml new file mode 100644 index 00000000..2456a72a --- /dev/null +++ b/tests/non_poetry_pyproject/serverless.yml @@ -0,0 +1,18 @@ +service: sls-py-req-test + +provider: + name: aws + runtime: python3.6 + +plugins: + - serverless-python-requirements + +package: + exclude: + - '**/*' + include: + - handler.py + +functions: + hello: + handler: handler.hello