Commit 1d54edad authored by malthe's avatar malthe

Merged branch that extends configuration syntax with support for -= and += operators.

git-svn-id: http://svn.zope.org/repos/main/zc.buildout/trunk@87201 62d5b8a3-27da-0310-9561-8e5933582275
parent 7919ac40
...@@ -7,6 +7,8 @@ Change History ...@@ -7,6 +7,8 @@ Change History
1.0.4 (unreleased) 1.0.4 (unreleased)
================== ==================
- Extended configuration syntax to allow -= and += operators (malthe).
1.0.3 (2008-06-01) 1.0.3 (2008-06-01)
================== ==================
......
...@@ -1146,10 +1146,25 @@ def _dists_sig(dists): ...@@ -1146,10 +1146,25 @@ def _dists_sig(dists):
result.append(os.path.basename(location)) result.append(os.path.basename(location))
return result return result
def _update_section(s1, s2):
for k, v in s2.items():
if k.endswith('+'):
key = k.rstrip(' +')
s2[key] = "\n".join(s1.get(key, "").split() + s2[k].split())
del s2[k]
elif k.endswith('-'):
key = k.rstrip(' -')
s2[key] = "\n".join([v for v in s1.get(key, "").split()
if v not in s2[k].split()])
del s2[k]
s1.update(s2)
return s1
def _update(d1, d2): def _update(d1, d2):
for section in d2: for section in d2:
if section in d1: if section in d1:
d1[section].update(d2[section]) d1[section] = _update_section(d1[section], d2[section])
else: else:
d1[section] = d2[section] d1[section] = d2[section]
return d1 return d1
......
...@@ -688,6 +688,9 @@ extensions are: ...@@ -688,6 +688,9 @@ extensions are:
- option values can use a substitution syntax, described below, to - option values can use a substitution syntax, described below, to
refer to option values in specific sections. refer to option values in specific sections.
- option values can be appended or removed using the - and +
operators.
The ConfigParser syntax is very flexible. Section names can contain The ConfigParser syntax is very flexible. Section names can contain
any characters other than newlines and right square braces ("]"). any characters other than newlines and right square braces ("]").
Option names can contain any characters other than newlines, colons, Option names can contain any characters other than newlines, colons,
...@@ -893,6 +896,137 @@ It will still be treated as a part: ...@@ -893,6 +896,137 @@ It will still be treated as a part:
parts = data-dir debug parts = data-dir debug
... ...
Adding and removing options
---------------------------
We can append and remove values to an option by using the + and -
operators.
This is illustrated below; first we define a base configuration.
>>> write(sample_buildout, 'base.cfg',
... """
... [buildout]
... parts = part1 part2 part3
...
... [part1]
... recipe =
... option = a1 a2
...
... [part2]
... recipe =
... option = b1 b2 b3 b4
...
... [part3]
... recipe =
... option = c1 c2
...
... """)
Extending this configuration, we can "adjust" the values set in the
base configuration file.
>>> write(sample_buildout, 'extension1.cfg',
... """
... [buildout]
... extends = base.cfg
...
... # appending values
... [part1]
... option += a3 a4
...
... # removing values
... [part2]
... option -= b1 b2
...
... # alt. spelling
... [part3]
... option+=c3 c4 c5
...
... # normal assignment
... [part4]
... option = h1 h2
...
... """)
An additional extension.
>>> write(sample_buildout, 'extension2.cfg',
... """
... [buildout]
... extends = extension1.cfg
...
... # appending values
... [part1]
... option += a5
...
... # removing values
... [part2]
... option -= b1 b2 b3
...
... """)
To verify that the options are adjusted correctly, we'll set up an
extension that prints out the options.
>>> mkdir(sample_buildout, 'demo')
>>> write(sample_buildout, 'demo', 'demo.py',
... """
... def ext(buildout):
... print [part['option'] for name, part in buildout.items() \
... if name.startswith('part')]
... """)
>>> write(sample_buildout, 'demo', 'setup.py',
... """
... from setuptools import setup
...
... setup(
... name="demo",
... entry_points={'zc.buildout.extension': ['ext = demo:ext']},
... )
... """)
Set up a buildout configuration for this extension.
>>> write(sample_buildout, 'buildout.cfg',
... """
... [buildout]
... develop = demo
... parts =
... """)
>>> os.chdir(sample_buildout)
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout')),
Develop: '/sample-buildout/demo'
Uninstalling debug.
Getting distribution for 'recipes'.
zip_safe flag not set; analyzing archive contents...
Got recipes 0.0.0.
Uninstalling data-dir.
warning: install_lib: 'build/lib' does not exist -- no Python modules to install
Verify option values.
>>> write(sample_buildout, 'buildout.cfg',
... """
... [buildout]
... develop = demo
... extensions = demo
... extends = extension2.cfg
... """)
>>> print system(os.path.join('bin', 'buildout')),
['a1/na2/na3/na4/na5', 'b4', 'c1/nc2/nc3/nc4/nc5', 'h1 h2']
Develop: '/sample-buildout/demo'
Cleanup.
>>> os.remove(os.path.join(sample_buildout, 'base.cfg'))
>>> os.remove(os.path.join(sample_buildout, 'extension1.cfg'))
>>> os.remove(os.path.join(sample_buildout, 'extension2.cfg'))
Multiple configuration files Multiple configuration files
---------------------------- ----------------------------
...@@ -928,8 +1062,6 @@ To see how this works, we use an example: ...@@ -928,8 +1062,6 @@ To see how this works, we use an example:
>>> print system(buildout), >>> print system(buildout),
Develop: '/sample-buildout/recipes' Develop: '/sample-buildout/recipes'
Uninstalling debug.
Uninstalling data-dir.
Installing debug. Installing debug.
op buildout op buildout
recipe recipes:debug recipe recipes:debug
...@@ -1591,6 +1723,7 @@ the buildout in the usual way: ...@@ -1591,6 +1723,7 @@ the buildout in the usual way:
d d1 d d1
d d2 d d2
d d3 d d3
d demo
d develop-eggs d develop-eggs
d eggs d eggs
d parts d parts
...@@ -1670,6 +1803,7 @@ and run the buildout specifying just d3 and d4: ...@@ -1670,6 +1803,7 @@ and run the buildout specifying just d3 and d4:
d d2 d d2
d data2-extra d data2-extra
d data3 d data3
d demo
d develop-eggs d develop-eggs
d eggs d eggs
d parts d parts
...@@ -1746,6 +1880,7 @@ also see that d1 and d2 have gone away: ...@@ -1746,6 +1880,7 @@ also see that d1 and d2 have gone away:
d data2 d data2
d data2-extra d data2-extra
d data3 d data3
d demo
d develop-eggs d develop-eggs
d eggs d eggs
d parts d parts
...@@ -2126,6 +2261,7 @@ or on the command line: ...@@ -2126,6 +2261,7 @@ or on the command line:
- base.cfg - base.cfg
d bin d bin
- buildout.cfg - buildout.cfg
d demo
d develop-eggs d develop-eggs
d eggs d eggs
- inst.cfg - inst.cfg
...@@ -2147,6 +2283,7 @@ buildout installed option: ...@@ -2147,6 +2283,7 @@ buildout installed option:
- base.cfg - base.cfg
d bin d bin
- buildout.cfg - buildout.cfg
d demo
d develop-eggs d develop-eggs
d eggs d eggs
d parts d parts
...@@ -2170,6 +2307,7 @@ parts: ...@@ -2170,6 +2307,7 @@ parts:
- base.cfg - base.cfg
d bin d bin
- buildout.cfg - buildout.cfg
d demo
d develop-eggs d develop-eggs
d eggs d eggs
d parts d parts
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment