Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AttributeError when adding a dependency group when private repo present (Poetry 1.2.0a2) #4718

Closed
2 of 3 tasks
mbarrien opened this issue Nov 6, 2021 · 7 comments · Fixed by #5943
Closed
2 of 3 tasks
Labels
kind/bug Something isn't working as expected
Milestone

Comments

@mbarrien
Copy link

mbarrien commented Nov 6, 2021

  • 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).

Not on latest, because I am on 1.2.0a2, which is newer than latest.

  • OS version and name: Linux Debian Bullseye in a container
  • Poetry version: 1.2.0a2
  • pyproject.toml file:
[tool.poetry]
name = "foobar"
version = "0.1.0"
description = ""
authors = ["Your Name <[email protected]>"]
readme = "README.md"

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


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

[[tool.poetry.source]]
name = "foo"
url = "https://foo.bar/simple/"

Issue

When using a private repo (i.e. having a [[tool.poetry.source]] section to pyproject.toml), and adding a group dependency (e.g. running poetry add --group test pytest, e.g. the feature added in #4260) for a group that does not yet exist in the pyproject.toml, poetry raises an exception.

# poetry add --group test pytest

  AttributeError

  'dict' object has no attribute '_insert_after'

  at /usr/local/lib/python3.9/site-packagesconsole/commands/add.py:114 in handle
      110│         else:
      111│             if "group" not in poetry_content:
      112│                 group_table = table()
      113│                 group_table._is_super_table = True
    → 114│                 poetry_content.value._insert_after("dependencies", "group", group_table)
      115│
      116│             groups = poetry_content["group"]
      117│             if group not in groups:
      118│                 group_table = parse_toml(

Even though the example above has an invalid URL for the poetry source, this error happens even when the URL is valid and the necessary credentials to authenticate are present (e.g. a valid Google Artifact Repository repo), and regardless of whether the source is primary or secondary.

Also note that the dependency being added isn't even hosted inside the private repo. (In this case, trying to add pytest to a group called "test".)

Removing the [[tool.poetry.source]] section allows Poetry to properly add the dependency group and dependency.

The above pyproject.toml was generated using the following:

docker run -it --rm python:3.9-slim-bullseye bash

# Within the container:
pip install poetry==1.2.0a2
poetry init --name foobar -n
cat >> pyproject.toml <<EOF

[[tool.poetry.source]]
name = "foo"
url = "https://foo.bar/simple/"
EOF
# Then run poetry add --group test pytest to see the error

Full output when running with -vvv

# poetry -vvv add pytest --group test
Loading configuration file /root/.config/pypoetry/config.toml
Adding repository phc (https://us-central1-python.pkg.dev/foobar/python/simple) and setting it as secondary
Using virtualenv: /venv

  Stack trace:

  7  /usr/local/lib/python3.9/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  /usr/local/lib/python3.9/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  /usr/local/lib/python3.9/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  /usr/local/lib/python3.9/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  /usr/local/lib/python3.9/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  /usr/local/lib/python3.9/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  /usr/local/lib/python3.9/site-packages/cleo/commands/command.py:85 in execute
       83│
       84│         try:
    →  85│             return self.handle()
       86│         except KeyboardInterrupt:
       87│             return 1

  AttributeError

  'dict' object has no attribute '_insert_after'

  at /usr/local/lib/python3.9/site-packages/poetry/console/commands/add.py:114 in handle
      110│         else:
      111│             if "group" not in poetry_content:
      112│                 group_table = table()
      113│                 group_table._is_super_table = True
    → 114│                 poetry_content.value._insert_after("dependencies", "group", group_table)
      115│
      116│             groups = poetry_content["group"]
      117│             if group not in groups:
      118│                 group_table = parse_toml(
@mbarrien mbarrien added kind/bug Something isn't working as expected status/triage This issue needs to be triaged labels Nov 6, 2021
@mbarrien
Copy link
Author

mbarrien commented Nov 6, 2021

Did some more investigation. This error only happens if the [[tool.poetry.source]] section is the last one in the file. If the order of the clauses is swapped around like so

[tool.poetry]
name = "foobar"
version = "0.1.0"
description = ""
authors = ["Your Name <[email protected]>"]
readme = "README.md"

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

[[tool.poetry.source]]
name = "foo"
url = "https://foo.bar/simple/"

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

(Notice that [build-system] and [[tool.poetry.source]] have swapped positions)

I noticed this because I was trying to create the above test case using a different command instead of the append poetry source add foo http://foo.bar/simple, which added the source before build-system.

@RileyMShea
Copy link

I have the same error, also on version Poetry (version 1.2.0a2) but for me it occurs when references a local library ie somelib that has it's own pyproject.toml

Can be traced back to the update 1.2.0a2 here:

4b8384c#diff-8005012c00c842592c28b01560b1f9522146f351b70df58fadfec5c0245bd523

Unsure of the specifics, but it if you don't have a previously toml [tool.poetry.group] (or an tool.poetry.group.whatever.dependencies
)
this blows up:

if group == "default":
if "dependencies" not in poetry_content:
poetry_content["dependencies"] = table()
section = poetry_content["dependencies"]
else:
if "group" not in poetry_content:
group_table = table()
group_table._is_super_table = True
poetry_content.value._insert_after("dependencies", "group", group_table)

@jbsilva
Copy link

jbsilva commented Nov 27, 2021

An error in the same line happened with me when trying to add a new dev dependency to a project that was created with Poetry v1.1.11.

Replacing [tool.poetry.dev-dependencies] with [tool.poetry.group.dev.dependencies] solved the problem.

@lindycoder
Copy link

I can reproduce quickly this with

poetry init -q
echo "\n[tool.poetry.plugins]" >> pyproject.toml
poetry add --group dev pytest

on

poetry --version
Poetry (version 1.2.0a2)

produces

Creating virtualenv demo in /private/tmp/demo/.venv

  AttributeError

  'dict' object has no attribute '_insert_after'

  at ~/Library/Application Support/pypoetry/venv/lib/python3.9/site-packages/poetry/console/commands/add.py:114 in handle
      110│         else:
      111│             if "group" not in poetry_content:
      112│                 group_table = table()
      113│                 group_table._is_super_table = True
    → 114│                 poetry_content.value._insert_after("dependencies", "group", group_table)
      115│
      116│             groups = poetry_content["group"]
      117│             if group not in groups:
      118│                 group_table = parse_toml(

I confirm that moving the [build-system] section at the end solves the problem

@skion
Copy link

skion commented May 25, 2022

I confirm that moving the [build-system] section at the end solves the problem

Same here on 1.2.0b1

@abn abn added Dependency and removed status/triage This issue needs to be triaged labels May 25, 2022
@abn
Copy link
Member

abn commented May 25, 2022

Root cause is at python-poetry/tomlkit#196

@abn abn added this to the 1.2 milestone May 25, 2022
@abn abn mentioned this issue May 25, 2022
lonelyteapot added a commit to lonelyteapot/pygraphic that referenced this issue Jul 10, 2022
Copy link

github-actions bot commented Mar 1, 2024

This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Mar 1, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
kind/bug Something isn't working as expected
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants