|
From: Jason B. <jb...@ze...> - 2010-03-17 19:53:12
|
On Wed, Mar 17, 2010 at 1:52 PM, Michael Foord <fuz...@vo...>wrote:
> Well - as far as I can tell setdefault is exactly a "magical
> get_by_interpolation function" - so I guess I'm not understanding you
> (setdefault is also a standard dictionary method).
>
> Michael
>
Consider the following config file:
[section]
foo = 'bar'
[[subsection]]
baz = '$foo'
Suppose I have a Section object that represents the subsection
(configobj['section']['subsection']). Now suppose I do this:
a = subsection['baz']
Since the option baz contains a string '$foo', what happens is something
like the following:
1. The interpolater looks in subsection to see if it has a foo option.
2. When it sees that it doesn't exist, it checks the DEFAULT section.
3. When it sees that *that* doesn't exist, it checks the parent section
4. The parent section has a foo option, so it returns it.
Now suppose I do this:
b = subsection['foo']
What happens is more like the following:
1. Subsection is searched for a foo option.
2. Subsection doesn't have a foo option, so it throws a KeyError.
What I would like is some kind of function such that I can do something like
this:
c = subsection.get_by_interpolation('foo')
...that would look for an option named foo, but would look in the same
places as the first operation. Here's the reason why I want to do this.
Using envbuilder, I want to write a config file like this:
[project]
parcel = 'parcel1', 'parcel2'
[[DEFAULT]]
branch = 'master'
[[parcel1]]
[[parcel2]]
branch = 'someotherbranch'
[commands]
[[update]]
default = 'git pull origin %branch'
Essentially, I've written my own interpolation engine for commands such that
a variable beginning with % is to be on the parcel. So when I run "envb
update", it should essentially run:
# Get parcel1 using branch from default
$ git pull origin master
# Get parcel2 using branch from parcel2
$ git pull origin someotherbranch
However, parcel1 would throw an exception because it doesn't actually have
an option named "branch". Of course, I could do something like this:
[project]
parcels = 'parcel1', 'parcel2'
[[DEFAULT]]
default_branch = 'master'
[[parcel1]]
branch = '$default_branch'
[[parcel2]]
branch = 'someotherbranch'
[commands]
[[update]]
default = 'git pull origin %branch'
...but that gets tedious when you start dealing with a nontrivial amount of
parcels.
Does that make things more clear, or did I just confuse you even more? :-)
|