summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2019-12-11 21:00:46 -0500
committerXavier Claessens <xavier.claessens@collabora.com>2019-12-12 18:30:17 -0500
commit49082f96698fbb74b587ca774dae45b7b5943a16 (patch)
treec85a47d74c5f6e6ba7e0a7388c1479e6a8938ad4
parent6e865a233099a00e9ea08f6a2f911ede3c7b4215 (diff)
downloadmeson-49082f96698fbb74b587ca774dae45b7b5943a16.tar.gz
summary: Allow section with no title, and passing key/value separately
-rw-r--r--docs/markdown/Reference-manual.md17
-rw-r--r--mesonbuild/interpreter.py32
-rwxr-xr-xrun_unittests.py11
-rw-r--r--test cases/unit/74 summary/meson.build6
-rw-r--r--test cases/unit/74 summary/subprojects/sub/meson.build3
5 files changed, 43 insertions, 26 deletions
diff --git a/docs/markdown/Reference-manual.md b/docs/markdown/Reference-manual.md
index e4c18a176..cf5585b74 100644
--- a/docs/markdown/Reference-manual.md
+++ b/docs/markdown/Reference-manual.md
@@ -1209,6 +1209,9 @@ This function prints its argument to stdout prefixed with WARNING:.
### summary()
``` meson
+ void summary(key, value)
+ void summary(dictionary)
+ void summary(section_name, key, value)
void summary(section_name, dictionary)
```
@@ -1216,12 +1219,16 @@ This function is used to summarize build configuration at the end of the build
process. This function provides a way for projects (and subprojects) to report
this information in a clear way.
-The first argument is a section name, the second argument is a dictionary.
-`summary()` can be called multiple times as long as the same dict key doesn't
-appear twice in the same section. All sections will be collected and printed at
-the end of the configuration in the same order as they have been called.
+The content is a serie of key/value pairs grouped into sections. If the section
+argument is omitted, those key/value pairs are implicitly grouped into a section
+with no title. key/value pairs can optionally be grouped into a dictionary,
+but keep in mind that dictionaries does not guarantee ordering.
+`section_name` and `key` must be strings, `value` can only be lists, integers,
+booleans or strings.
-Dictionary values can only be lists, integers, booleans or strings.
+`summary()` can be called multiple times as long as the same section_name/key
+pair doesn't appear twice. All sections will be collected and printed at
+the end of the configuration in the same order as they have been called.
Example:
```meson
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index a8e35fe06..2d937e549 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -1775,7 +1775,8 @@ class Summary:
mlog.log(self.project_name, mlog.normal_cyan(self.project_version))
for section, values in self.sections.items():
mlog.log('') # newline
- mlog.log(' ', mlog.bold(section))
+ if section:
+ mlog.log(' ', mlog.bold(section))
for k, v in values.items():
indent = self.max_key_len - len(k) + 3
mlog.log(' ' * indent, k + ':', v[0])
@@ -2871,13 +2872,28 @@ external dependencies (including libraries) must go to "dependencies".''')
@noKwargs
@FeatureNew('summary', '0.53.0')
def func_summary(self, node, args, kwargs):
- if len(args) != 2:
- raise InterpreterException('Summary accepts exactly two arguments.')
- section, values = args
- if not isinstance(section, str):
- raise InterpreterException('Argument 1 must be a string.')
- if not isinstance(values, dict):
- raise InterpreterException('Argument 2 must be a dictionary.')
+ if len(args) == 1:
+ if not isinstance(args[0], dict):
+ raise InterpreterException('Argument 1 must be a dictionary.')
+ section = ''
+ values = args[0]
+ elif len(args) == 2:
+ if not isinstance(args[0], str):
+ raise InterpreterException('Argument 1 must be a string.')
+ if isinstance(args[1], dict):
+ section, values = args
+ else:
+ section = ''
+ values = {args[0]: args[1]}
+ elif len(args) == 3:
+ if not isinstance(args[0], str):
+ raise InterpreterException('Argument 1 must be a string.')
+ if not isinstance(args[1], str):
+ raise InterpreterException('Argument 2 must be a string.')
+ section, key, value = args
+ values = {key: value}
+ else:
+ raise InterpreterException('Summary accepts at most 3 arguments.')
if self.subproject not in self.summary:
self.summary[self.subproject] = Summary(self.active_projectname, self.project_version)
self.summary[self.subproject].add_section(section, values)
diff --git a/run_unittests.py b/run_unittests.py
index 9167d1401..cb5086cf2 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -4122,16 +4122,12 @@ recommended as it is not supported on some platforms''')
expected = textwrap.dedent(r'''
Some Subproject 2.0
- Features
- foo: bar
+ string: bar
+ integer: 1
+ boolean: True
My Project 1.0
- Directories
- bindir: bin
- libdir: lib
- datadir: share
-
Configuration
Some boolean: False
Another boolean: True
@@ -4139,6 +4135,7 @@ recommended as it is not supported on some platforms''')
A list: string
1
True
+ A number: 1
''')
# Dict ordering is not guaranteed and an exact string comparison randomly
# fails on the CI because lines are reordered.
diff --git a/test cases/unit/74 summary/meson.build b/test cases/unit/74 summary/meson.build
index 11f96d089..392d940c5 100644
--- a/test cases/unit/74 summary/meson.build
+++ b/test cases/unit/74 summary/meson.build
@@ -1,10 +1,5 @@
project('My Project', version : '1.0')
-summary('Directories', {'bindir': get_option('bindir'),
- 'libdir': get_option('libdir'),
- 'datadir': get_option('datadir'),
- })
-
subproject('sub')
subproject('sub2', required : false)
@@ -13,3 +8,4 @@ summary('Configuration', {'Some boolean': false,
'Some string': 'Hello World',
'A list': ['string', 1, true],
})
+summary('Configuration', 'A number', 1)
diff --git a/test cases/unit/74 summary/subprojects/sub/meson.build b/test cases/unit/74 summary/subprojects/sub/meson.build
index f47c7b794..e7d783384 100644
--- a/test cases/unit/74 summary/subprojects/sub/meson.build
+++ b/test cases/unit/74 summary/subprojects/sub/meson.build
@@ -1,3 +1,4 @@
project('Some Subproject', version : '2.0')
-summary('Features', {'foo': 'bar'})
+summary('string', 'bar')
+summary({'integer': 1, 'boolean': true})