diff -pruN 0.12.2-1/.git_archival.txt 0.13-1/.git_archival.txt
--- 0.12.2-1/.git_archival.txt	2023-03-27 21:21:26.000000000 +0000
+++ 0.13-1/.git_archival.txt	2023-05-18 11:22:53.000000000 +0000
@@ -1,4 +1,4 @@
-node: 2940279970c3de0992b3c44aff7dc19e6bb1043e
-node-date: 2023-03-27T22:21:26+01:00
-describe-name: v0.12.2
-ref-names: HEAD -> main, tag: v0.12.2
+node: b752273289ecf6d81dbbe6fc8284f2689ef8514d
+node-date: 2023-05-18T12:22:53+01:00
+describe-name: v0.13
+ref-names: HEAD -> main, tag: v0.13
diff -pruN 0.12.2-1/.pre-commit-config.yaml 0.13-1/.pre-commit-config.yaml
--- 0.12.2-1/.pre-commit-config.yaml	2023-03-27 21:21:26.000000000 +0000
+++ 0.13-1/.pre-commit-config.yaml	2023-05-18 11:22:53.000000000 +0000
@@ -20,7 +20,7 @@ repos:
     args: ['--fix=auto']  # replace 'auto' with 'lf' to enforce Linux/Mac line endings or 'crlf' for Windows
 
 - repo: https://github.com/PyCQA/autoflake
-  rev: v2.0.2
+  rev: v2.1.1
   hooks:
   - id: autoflake
     args: [
@@ -40,7 +40,7 @@ repos:
   - id: isort
 
 - repo: https://github.com/psf/black
-  rev: 23.1.0
+  rev: 23.3.0
   hooks:
   - id: black
     language_version: python3
diff -pruN 0.12.2-1/CHANGELOG.rst 0.13-1/CHANGELOG.rst
--- 0.12.2-1/CHANGELOG.rst	2023-03-27 21:21:26.000000000 +0000
+++ 0.13-1/CHANGELOG.rst	2023-05-18 11:22:53.000000000 +0000
@@ -6,8 +6,16 @@ Changelog
    Development Version
    ====================
 
-Version 0.12.2 (dev)
-====================
+Version 0.13
+============
+
+- Make it clear when using input from ``stdin``, #96
+- Fix summary for ``allOf``, #100
+- ``setuptools`` plugin:
+    - Improve validation of ``attr`` directives, #101
+
+Version 0.12.2
+==============
 
 - ``setuptools`` plugin:
     - Fix problem with ``license-files`` patterns,
diff -pruN 0.12.2-1/debian/changelog 0.13-1/debian/changelog
--- 0.12.2-1/debian/changelog	2023-03-29 10:26:58.000000000 +0000
+++ 0.13-1/debian/changelog	2023-05-24 08:58:56.000000000 +0000
@@ -1,3 +1,9 @@
+python-validate-pyproject (0.13-1) unstable; urgency=medium
+
+  * [e5c06bf] New upstream version 0.13
+
+ -- Carsten Schoenert <c.schoenert@t-online.de>  Wed, 24 May 2023 10:58:56 +0200
+
 python-validate-pyproject (0.12.2-1) unstable; urgency=medium
 
   * [0c20071] New upstream version 0.12.2
diff -pruN 0.12.2-1/src/validate_pyproject/cli.py 0.13-1/src/validate_pyproject/cli.py
--- 0.12.2-1/src/validate_pyproject/cli.py	2023-03-27 21:21:26.000000000 +0000
+++ 0.13-1/src/validate_pyproject/cli.py	2023-05-18 11:22:53.000000000 +0000
@@ -58,6 +58,8 @@ def critical_logging():
         raise
 
 
+_STDIN = argparse.FileType("r")("-")
+
 META: Dict[str, dict] = {
     "version": dict(
         flags=("-V", "--version"),
@@ -67,7 +69,7 @@ META: Dict[str, dict] = {
     "input_file": dict(
         dest="input_file",
         nargs="*",
-        default=[argparse.FileType("r")("-")],
+        # default=[_STDIN],  # postponed to facilitate testing
         type=argparse.FileType("r"),
         help="TOML file to be verified (`stdin` by default)",
     ),
@@ -120,6 +122,7 @@ def __meta__(plugins: Sequence[PluginWra
     """'Hyper parameters' to instruct :mod:`argparse` how to create the CLI"""
     meta = {k: v.copy() for k, v in META.items()}
     meta["enable"]["choices"] = set([p.tool for p in plugins])
+    meta["input_file"]["default"] = [_STDIN]  # lazily defined to facilitate testing
     return meta
 
 
@@ -216,12 +219,7 @@ def run(args: Sequence[str] = ()):
     exceptions = _ExceptionGroup()
     for file in params.input_file:
         try:
-            toml_equivalent = loads(file.read())
-            validator(toml_equivalent)
-            if params.dump_json:
-                print(json.dumps(toml_equivalent, indent=2))
-            else:
-                print(f"Valid {_format_file(file)}")
+            _run_on_file(validator, params, file)
         except _REGULAR_EXCEPTIONS as ex:
             exceptions.add(f"Invalid {_format_file(file)}", ex)
 
@@ -230,6 +228,18 @@ def run(args: Sequence[str] = ()):
     return 0
 
 
+def _run_on_file(validator: Validator, params: CliParams, file: io.TextIOBase):
+    if file in (sys.stdin, _STDIN):
+        print("Expecting input via `stdin`...", file=sys.stderr, flush=True)
+
+    toml_equivalent = loads(file.read())
+    validator(toml_equivalent)
+    if params.dump_json:
+        print(json.dumps(toml_equivalent, indent=2))
+    else:
+        print(f"Valid {_format_file(file)}")
+
+
 main = exceptions2exit()(run)
 
 
diff -pruN 0.12.2-1/src/validate_pyproject/error_reporting.py 0.13-1/src/validate_pyproject/error_reporting.py
--- 0.12.2-1/src/validate_pyproject/error_reporting.py	2023-03-27 21:21:26.000000000 +0000
+++ 0.13-1/src/validate_pyproject/error_reporting.py	2023-05-18 11:22:53.000000000 +0000
@@ -24,7 +24,7 @@ _SKIP_DETAILS = (
     "must not be there",
 )
 
-_NEED_DETAILS = {"anyOf", "oneOf", "anyOf", "contains", "propertyNames", "not", "items"}
+_NEED_DETAILS = {"anyOf", "oneOf", "allOf", "contains", "propertyNames", "not", "items"}
 
 _CAMEL_CASE_SPLITTER = re.compile(r"\W+|([A-Z][^A-Z\W]*)")
 _IDENTIFIER = re.compile(r"^[\w_]+$", re.I)
diff -pruN 0.12.2-1/src/validate_pyproject/plugins/setuptools.schema.json 0.13-1/src/validate_pyproject/plugins/setuptools.schema.json
--- 0.12.2-1/src/validate_pyproject/plugins/setuptools.schema.json	2023-03-27 21:21:26.000000000 +0000
+++ 0.13-1/src/validate_pyproject/plugins/setuptools.schema.json	2023-05-18 11:22:53.000000000 +0000
@@ -256,7 +256,7 @@
       "type": "object",
       "additionalProperties": false,
       "properties": {
-        "attr": {"type": "string"}
+        "attr": {"format": "python-qualified-identifier"}
       },
       "required": ["attr"]
     },
diff -pruN 0.12.2-1/tests/invalid-examples/setuptools/attr/missing-attr-name.errors.txt 0.13-1/tests/invalid-examples/setuptools/attr/missing-attr-name.errors.txt
--- 0.12.2-1/tests/invalid-examples/setuptools/attr/missing-attr-name.errors.txt	1970-01-01 00:00:00.000000000 +0000
+++ 0.13-1/tests/invalid-examples/setuptools/attr/missing-attr-name.errors.txt	2023-05-18 11:22:53.000000000 +0000
@@ -0,0 +1,2 @@
+`tool.setuptools.dynamic.version` must be valid exactly by one definition
+'attr': {format: 'python-qualified-identifier'}
diff -pruN 0.12.2-1/tests/invalid-examples/setuptools/attr/missing-attr-name.toml 0.13-1/tests/invalid-examples/setuptools/attr/missing-attr-name.toml
--- 0.12.2-1/tests/invalid-examples/setuptools/attr/missing-attr-name.toml	1970-01-01 00:00:00.000000000 +0000
+++ 0.13-1/tests/invalid-examples/setuptools/attr/missing-attr-name.toml	2023-05-18 11:22:53.000000000 +0000
@@ -0,0 +1,17 @@
+# Issue pypa/setuptools#3928
+# https://github.com/RonnyPfannschmidt/reproduce-setuptools-dynamic-attr
+[build-system]
+build-backend = "_own_version_helper"
+backend-path = ["."]
+requires = ["setuptools" ]
+
+[project]
+name = "ronnypfannschmidt.setuptools-build-attr-error-reproduce"
+description = "reproducer for a setuptools issue"
+requires-python = ">=3.7"
+dynamic = [
+  "version",
+]
+
+[tool.setuptools.dynamic]
+version = { attr = "_own_version_helper."}
diff -pruN 0.12.2-1/tests/test_cli.py 0.13-1/tests/test_cli.py
--- 0.12.2-1/tests/test_cli.py	2023-03-27 21:21:26.000000000 +0000
+++ 0.13-1/tests/test_cli.py	2023-05-18 11:22:53.000000000 +0000
@@ -1,7 +1,9 @@
 import inspect
+import io
 import logging
 import sys
 from pathlib import Path
+from unittest.mock import Mock
 from uuid import uuid4
 
 import pytest
@@ -120,6 +122,19 @@ class TestDisable:
         assert cli.main([str(invalid_example), "-D", "setuptools"]) == 0
 
 
+class TestInput:
+    def test_inform_user_about_stdin(self, monkeypatch):
+        print_mock = Mock()
+        fake_stdin = io.StringIO('[project]\nname="test"\nversion="0.42"\n')
+        with monkeypatch.context() as ctx:
+            ctx.setattr("validate_pyproject.cli._STDIN", fake_stdin)
+            ctx.setattr("sys.argv", ["validate-pyproject"])
+            ctx.setattr("builtins.print", print_mock)
+            cli.run()
+        calls = print_mock.call_args_list
+        assert any("input via `stdin`" in str(args[0]) for args, _kwargs in calls)
+
+
 class TestOutput:
     def test_valid(self, capsys, valid_example):
         cli.main([str(valid_example)])
