beetbox/confuse

Order not preserved for config set via set()

mathieu-mp opened this issue · 1 comments

Build: 1.1.0

For each iteration through .keys(), I set() values. They get reversed at the end.
set() doesn't look like preserving order, or it reverses it.

config.yaml:

items:
  foo1: bar1
  foo2: bar2
  foo3: bar3

code:

config = confuse.Configuration('MyGreatApp')
config.set_file("config.yaml")
config.set_file("config2.yaml") # Doesn't override items

for item in config['items'].keys():
  pprint(config['items'].keys()) #A
  config['items'].set(config['items'].as_str_seq())
  pprint(config['items'].keys()) #B, consistent with A

Output:
A: ['foo1', 'foo2', 'foo3']
B: ['foo1', 'foo2', 'foo3']
A: ['foo2', 'foo1', 'foo3']
B: ['foo2', 'foo1', 'foo3']
A: ['foo3', 'foo2', 'foo1']
B: ['foo3', 'foo2', 'foo1']

Workaround:
Initial iteration through items are made reversed(). It doesn't feel safe or reliable. It only works because I override every value.

config = confuse.Configuration('MyGreatApp')
config.set_file("config.yaml")
config.set_file("config2.yaml") # Doesn't override items

for item in reversed(config['items'].keys()):
  pprint(config['items'].keys()) #A
  config['items'].set(config['items'].as_str_seq())

Output:
A: ['foo3', 'foo2', 'foo1']
A: ['foo2', 'foo3', 'foo1']
A: ['foo1', 'foo2', 'foo3']

Hi! I'm confused by a few things in your example… first:

config.set_file("config.yaml")
config.set_file("config2.yaml") # Doesn't override items

Is this attempting to take the values from config2.yaml and "overlay" them on top of the values from config1.yaml? Is that not working, and that's why you resorted to the iteration strategy? If so, let's focus on fixing that instead of the for/set thing. Can you give more details about what you're trying to do—for example, what's in those files, and what you want to have happen?

Then, this:

config['items'].set(config['items'].as_str_seq())

What is the idea here? config['items'] is neither a string nor a sequence—so what's the intent behind using as_str_seq()?