python-poetry / python-poetry/poetry

`poetry plugin show` crash with obscure error message

Open
#4,345 4 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

kind/bug status/triage
Dominant language
Python
Stars
34.3k
Forks
2.5k
Avg merge
2d 19h
Merged PRs (30d)
30

Description

  • I am on the latest Poetry version.

  • I have searched the issues of this repo and believe that this is not a duplicate.

  • If an exception occurs when executing a command, I executed it again in debug mode (-vvv option).

  • OS version and name: MacOs

  • Poetry version: 1.2.0a2

  • Link of a Gist with the contents of your pyproject.toml file:

[tool.poetry]
name = "nightly_release"
version = "0.1.0"
description = "Poetry plugin to setup automated release"
authors = ["Sunds team <sunds@google.com>"]

[tool.poetry.dependencies]
python = "^3.7"

[tool.poetry.dev-dependencies]
pytest = "*"

[tool.poetry.plugins."poetry.plugin"]
demo = "nightly_release:NightlyReleasePlugin"

[build-system]
requires = ["poetry-core>=1.1.0a6"]
build-backend = "poetry.core.masonry.api"

Issue

I'm trying to develop a poetry plugin locally. I'm trying a dummy plugin:

import cleo.io.io
import poetry.plugins
import poetry.poetry


class NightlyReleasePlugin(poetry.plugins.Plugin):

    def activate(self, poetry: poetry.poetry.Poetry, io: cleo.io.io.IO):
        io.write_line(repr(poetry))
        print(poetry)

As there is no good way to install package globally in development mode (like pip install -e), I'm forced to recompile the package every time (which is not a good developer experience):

pip uninstall -y nightly-release
poetry build
pip install .

After the plugin is installed, I'm trying to check if the plugin is correctly detected with poetry plugin show, but got the following error:

$ poetry plugin show

  KeyError

  'demo'

  at /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/poetry/console/commands/plugin/show.py:54 in handle
       50│             category = "plugins"
       51│             if issubclass(plugin, ApplicationPlugin):
       52│                 category = "application_plugins"
       53│ 
    →  54│             package = packages_by_name[canonicalize_name(entry_point.name)]
       55│             plugins[package.pretty_name]["package"] = package
       56│             plugins[package.pretty_name][category].append(entry_point)
       57│ 
       58│         for name, info in plugins.items():
Full stacktrace. Click to expand!
epot-macbookpro2:~ epot$ poetry plugin show -vvv

  Stack trace:

  7  /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/cleo/application.py:330 in run
      328│ 
      329│             try:
    → 330│                 exit_code = self._run(io)
      331│             except Exception as e:
      332│                 if not self._catch_exceptions:

  6  /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/poetry/console/application.py:180 in _run
      178│         self._load_plugins(io)
      179│ 
    → 180│         return super()._run(io)
      181│ 
      182│     def _configure_io(self, io: IO) -> None:

  5  /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/cleo/application.py:425 in _run
      423│                 io.set_input(ArgvInput(argv))
      424│ 
    → 425│         exit_code = self._run_command(command, io)
      426│         self._running_command = None
      427│ 

  4  /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/cleo/application.py:467 in _run_command
      465│ 
      466│         if error is not None:
    → 467│             raise error
      468│ 
      469│         return event.exit_code

  3  /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/cleo/application.py:451 in _run_command
      449│ 
      450│             if event.command_should_run():
    → 451│                 exit_code = command.run(io)
      452│             else:
      453│                 exit_code = ConsoleCommandEvent.RETURN_CODE_DISABLED

  2  /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/cleo/commands/base_command.py:118 in run
      116│         io.input.validate()
      117│ 
    → 118│         status_code = self.execute(io)
      119│ 
      120│         if status_code is None:

  1  /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/cleo/commands/command.py:85 in execute
       83│ 
       84│         try:
    →  85│             return self.handle()
       86│         except KeyboardInterrupt:
       87│             return 1

  KeyError

  'demo'

  at /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/poetry/console/commands/plugin/show.py:54 in handle
       50│             category = "plugins"
       51│             if issubclass(plugin, ApplicationPlugin):
       52│                 category = "application_plugins"
       53│ 
    →  54│             package = packages_by_name[canonicalize_name(entry_point.name)]
       55│             plugins[package.pretty_name]["package"] = package
       56│             plugins[package.pretty_name][category].append(entry_point)
       57│ 
       58│         for name, info in plugins.items():

I'm confident that the entry point is correct and my plugin is correctly loaded:

  • If I uninstall my plugin (pip uninstall -y nightly-release), the error goes away
  • If an error happens during the import process (e.g. make a typo poetry.poetry.PoetryWrong), poetry plugin show correctly crash with PoetryWrong undefined error.

I also get other error message when trying other commands:

$ poetry publish --dry-run

  AttributeError

  'IO' object has no attribute 'ask'

  at /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/poetry/publishing/publisher.py:82 in publish
       78│         )
       79│         # Requesting missing credentials but only if there is not a client cert defined.
       80│         if not resolved_client_cert:
       81│             if username is None:
    →  82│                 username = self._io.ask("Username:")
       83│ 
       84│             # skip password input if no username is provided, assume unauthenticated
       85│             if username and password is None:
       86│                 password = self._io.ask_hidden("Password:")

My cleo version installed is cleo==1.0.0a4

What is this error about ?

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the issue with the supplied dummy plugin and Poetry 1.2.0a2 setup, then inspect poetry/console/commands/plugin/show.py at the reported line and the related publisher.py failure. Confirm the behavior of poetry plugin show and poetry publish --dry-run with cleo==1.0.0a4, and ensure the commands no longer fail with the reported obscure errors.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
cli
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.