python-poetry / tomlkit

Style-preserving TOML library for Python
MIT License
699 stars 100 forks source link

New element in a table is placed in the wrong place #361

Closed Namnamseo closed 4 months ago

Namnamseo commented 5 months ago

Hi, nice work here. Thank you for the project.

I have a bug report to file.

x = tomlkit.parse('''
[root1.root2]
  value = 1
[root1.root2.a.b.c]
  value = 2
[WALRUS]
  goo = "gjob"
[root1.root2.x]
  value = 4
''')
x['root1']['root2']['a'].add('tmp', 'hi')
print(tomlkit.dumps(x))

Expected (amongst other formatting possibilities):

[root1.root2]
  value = 1
[root1.root2.a]
tmp = "hi"
[root1.root2.a.b.c]
  value = 2
[WALRUS]
  goo = "gjob"
[root1.root2.x]
  value = 4

But the code rather prints:

[root1.root2]
  value = 1
[root1.root2.a]
[root1.root2.a.b.c]
  value = 2
tmp = "hi"
[WALRUS]
  goo = "gjob"
[root1.root2.x]
  value = 4

This TOML code places tmp = "hi" under a.b.c, not a (as the Python code said).

Another instance of the bug is:

x = tomlkit.parse('''
[root1.root2.a.b.c]
  value = 2
[WALRUS]
  goo = "gjob"
[root1.root2.x]
  value = 4
''')
x['root1']['root2']['a'].add('tmp', 'hi')
print(tomlkit.dumps(x))

(NOTE: the code is almost the same. The only difference is that [root1.root2] is gone in the TOML.)

In this case, the output does not change with .add(), nor even a direct setitem:

>>> x['root1']['root2']['a']['tmp'] = 'hi'
>>> x['root1']['root2']['a']
{'b': {'c': {'value': 2}}}

Maybe the update is happening on some kind of proxy object, which interacts badly with the original object, I don't know.

Maybe there's a bug in parsing out-of-order sections, cc. #196 #261?