Skip to content

Commit

Permalink
Allow for empty choice while selecting dependencies
Browse files Browse the repository at this point in the history
Fixes #2355

This works around an issue with cleo's `Command.choice` implementation.
If the user does not make a selection then an AttributeError is raised.
  • Loading branch information
jacobperron authored and abn committed May 20, 2022
1 parent c880cd7 commit dbb20cf
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 3 deletions.
13 changes: 10 additions & 3 deletions src/poetry/console/commands/init.py
Original file line number Diff line number Diff line change
Expand Up @@ -306,19 +306,26 @@ def _determine_requirements(

self.line(info_string)

# Default to an empty value to signal no package was selected
choices.append("")

package = self.choice(
"\nEnter package # to add, or the complete package name if it"
" is not listed",
choices,
attempts=3,
default=len(choices) - 1,
)

if not package:
self.line("<warning>No package selected</warning>")

# package selected by user, set constraint name to package name
if package is not False:
if package:
constraint["name"] = package

# no constraint yet, determine the best version automatically
if package is not False and "version" not in constraint:
if package and "version" not in constraint:
question = self.create_question(
"Enter the version constraint to require "
"(or leave blank to use the latest version):"
Expand All @@ -340,7 +347,7 @@ def _determine_requirements(

constraint["version"] = package_constraint

if package is not False:
if package:
result.append(constraint)

if self.io.is_interactive():
Expand Down
44 changes: 44 additions & 0 deletions tests/console/commands/test_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,50 @@ def test_interactive_with_dependencies(tester: CommandTester, repo: TestReposito
assert expected in tester.io.fetch_output()


# Regression test for https://github.com/python-poetry/poetry/issues/2355
def test_interactive_with_dependencies_and_no_selection(
tester: CommandTester, repo: TestRepository
):
repo.add_package(get_package("django-pendulum", "0.1.6-pre4"))
repo.add_package(get_package("pendulum", "2.0.0"))
repo.add_package(get_package("pytest", "3.6.0"))

inputs = [
"my-package", # Package name
"1.2.3", # Version
"This is a description", # Description
"n", # Author
"MIT", # License
"~2.7 || ^3.6", # Python
"", # Interactive packages
"pendulu", # Search for package
"", # Do not select an option
"", # Stop searching for packages
"", # Interactive dev packages
"pytest", # Search for package
"", # Do not select an option
"",
"",
"\n", # Generate
]
tester.execute(inputs="\n".join(inputs))
expected = """\
[tool.poetry]
name = "my-package"
version = "1.2.3"
description = "This is a description"
authors = ["Your Name <you@example.com>"]
license = "MIT"
readme = "README.md"
packages = [{include = "my_package"}]
[tool.poetry.dependencies]
python = "~2.7 || ^3.6"
"""

assert expected in tester.io.fetch_output()


def test_empty_license(tester: CommandTester):
inputs = [
"my-package", # Package name
Expand Down

0 comments on commit dbb20cf

Please sign in to comment.