@@ -95,6 +95,7 @@ Explicit cross-referencing syntax for QAPI modules is available with
.. qapi:command:: fake-command
:since: 13.37
+ :deprecated:
This is a fake command, it's not real. It can't hurt you.
@@ -116,6 +117,9 @@ Explicit cross-referencing syntax for QAPI modules is available with
:arg int64 zzxyz: And this is another argument belonging to that same branch.
:feat hallucination: This command is a figment of your imagination.
+ :feat deprecated: Although this command is fake, you should know that
+ it's also deprecated. That's great news! Maybe it will go away and
+ stop haunting you someday.
:error CommandNotFound: When you try to use this command, because it
isn't real.
:error GenericError: If the system decides it doesn't like the
@@ -159,3 +159,28 @@ div[class^="highlight"] pre {
color: inherit;
}
}
+
+/* QAPI domain theming */
+
+.qapi-infopips {
+ margin-bottom: 1em;
+}
+
+.qapi-infopip {
+ display: inline-block;
+ padding: 0em 0.5em 0em 0.5em;
+ margin: 0.25em;
+}
+
+.qapi-deprecated {
+ background-color: #fffef5;
+ border: solid #fff176 6px;
+ font-weight: bold;
+ padding: 8px;
+ border-radius: 15px;
+ margin: 5px;
+}
+
+.qapi-deprecated::before {
+ content: '⚠️ ';
+}
@@ -150,6 +150,7 @@ class QAPIObject(ObjectDescription[Signature]):
"module": directives.unchanged, # Override contextual module name
# These are QAPI originals:
"since": since_validator,
+ "deprecated": directives.flag,
}
)
@@ -249,6 +250,28 @@ def add_target_and_index(
("single", indextext, node_id, "", None)
)
+ def _add_infopips(self, contentnode: addnodes.desc_content) -> None:
+ # Add various eye-catches and things that go below the signature
+ # bar, but precede the user-defined content.
+ infopips = nodes.container()
+ infopips.attributes["classes"].append("qapi-infopips")
+
+ def _add_pip(source: str, content: str, classname: str) -> None:
+ node = nodes.container(source)
+ node.append(nodes.Text(content))
+ node.attributes["classes"].extend(["qapi-infopip", classname])
+ infopips.append(node)
+
+ if "deprecated" in self.options:
+ _add_pip(
+ ":deprecated:",
+ f"This {self.objtype} is deprecated.",
+ "qapi-deprecated",
+ )
+
+ if infopips.children:
+ contentnode.insert(0, infopips)
+
def _merge_adjoining_field_lists(self, contentnode: addnodes.desc_content) -> None:
# Take any adjacent field lists and glue them together into
# one list for further processing by Sphinx. This is done so
@@ -271,6 +294,7 @@ def _merge_adjoining_field_lists(self, contentnode: addnodes.desc_content) -> No
contentnode.remove(child)
def transform_content(self, contentnode: addnodes.desc_content) -> None:
+ self._add_infopips(contentnode)
self._merge_adjoining_field_lists(contentnode)
def _toc_entry_name(self, sig_node: desc_signature) -> str: