We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Add ctype to the ComposeComplete schema
Currently the regindexer code that maintains an index of Flatpaks and containers in the Fedora registry looks at the 'ctype' field of a ~mashtask~compose.complete message to know whether the index needs to be rebuilt:

``` python
   match_topic = conf.daemon.topic_prefix + '.' + conf.daemon.environment + '.bodhi.masktask.complete'
   for name, endpoint, topic, raw_msg in fedmsg.tail_messages(topic=match_topic):
        msg = raw_msg['msg']
        if msg.get('ctype') in ('container', 'flatpak'):
            indexer_thread.reindex('Bodhi mash, ctype="%s"' % msg['ctype'])
```

The ctype field is not part of the ComposeCompleteV1 schema - it would be great if it could be added, since I'd like to continue using it when switching to fedora-messaging.

(@bowlofeggs suggested possibly extending the topic - I suppose like `compose.complete.flatpak` - I don't see a reason to go that fancy - there are few compose.complete messages.)

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `bodhi/messages/schemas/compose.py`
Content:
```
1 # Copyright (C) 2018-2019  Red Hat, Inc.
2 #
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License along
14 # with this program; if not, write to the Free Software Foundation, Inc.,
15 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16 """
17 Message schema for Composes.
18 
19 Each message is defined as a Python class. For details, see `fedora-messaging
20 <https://fedora-messaging.readthedocs.io/en/stable/>`_ documentation on
21 messages.
22 """
23 
24 from .base import BodhiMessage, SCHEMA_URL
25 
26 
27 class ComposeCompleteV1(BodhiMessage):
28     """Sent when a compose task completes."""
29 
30     body_schema = {
31         'id': f'{SCHEMA_URL}/v1/bodhi.compose.complete#',
32         '$schema': 'http://json-schema.org/draft-04/schema#',
33         'description': 'Schema for message sent when composes finish',
34         'type': 'object',
35         'properties': {
36             'agent': {
37                 'type': 'string',
38                 'description': 'The name of the user who started this compose.'
39             },
40             'repo': {
41                 'type': 'string',
42                 'description': 'The name of the repository being composed.'
43             },
44             'success': {
45                 'type': 'boolean',
46                 'description': 'true if the compose was successful, false otherwise.'
47             }
48         },
49         'required': ['agent', 'repo', 'success'],
50     }
51 
52     topic = "bodhi.compose.complete"
53 
54     @property
55     def repo(self) -> str:
56         """Return the name of the repository being composed."""
57         return self.body.get('repo')
58 
59     @property
60     def success(self) -> bool:
61         """Return the name of the repository being composed."""
62         return self.body.get('success')
63 
64     @property
65     def summary(self) -> str:
66         """
67         Return a short, human-readable representation of this message.
68 
69         This should provide a short summary of the message, much like the subject line
70         of an email.
71 
72         Returns:
73             The message summary.
74         """
75         if self.success:
76             return f"bodhi composer successfully composed {self.repo}"
77         else:
78             return f"bodhi composer failed to compose {self.repo}"
79 
80 
81 class ComposeComposingV1(BodhiMessage):
82     """Sent when the compose task composes."""
83 
84     body_schema = {
85         'id': f'{SCHEMA_URL}/v1/bodhi.compose.composing#',
86         '$schema': 'http://json-schema.org/draft-04/schema#',
87         'description': 'Schema for message sent when composes start',
88         'type': 'object',
89         'properties': {
90             'agent': {
91                 'type': 'string',
92                 'description': 'The name of the user who started this compose.'
93             },
94             'repo': {
95                 'type': 'string',
96                 'description': 'The name of the repository being composed.'
97             },
98         },
99         'required': ['agent', 'repo'],
100     }
101 
102     topic = "bodhi.compose.composing"
103 
104     @property
105     def repo(self) -> str:
106         """Return the name of the repository being composed."""
107         return self.body.get('repo')
108 
109     @property
110     def summary(self) -> str:
111         """
112         Return a short, human-readable representation of this message.
113 
114         This should provide a short summary of the message, much like the subject line
115         of an email.
116 
117         Returns:
118             A summary for this message.
119         """
120         return f"bodhi composer started composing {self.repo}"
121 
122 
123 class ComposeStartV1(BodhiMessage):
124     """Sent when a compose task starts."""
125 
126     body_schema = {
127         'id': f'{SCHEMA_URL}/v1/bodhi.compose.start#',
128         '$schema': 'http://json-schema.org/draft-04/schema#',
129         'description': 'Schema for message sent when composes start',
130         'type': 'object',
131         'properties': {
132             'agent': {
133                 'type': 'string',
134                 'description': 'The name of the user who started this compose.'
135             },
136         },
137         'required': ['agent'],
138     }
139 
140     topic = "bodhi.compose.start"
141 
142     @property
143     def summary(self) -> str:
144         """
145         Return a short, human-readable representation of this message.
146 
147         This should provide a short summary of the message, much like the subject line
148         of an email.
149 
150         Returns:
151             A summary for this message.
152         """
153         return "bodhi composer started a push"
154 
155 
156 class ComposeSyncDoneV1(BodhiMessage):
157     """Sent when a compose task sync is done."""
158 
159     body_schema = {
160         'id': f'{SCHEMA_URL}/v1/bodhi.compose.sync.done#',
161         '$schema': 'http://json-schema.org/draft-04/schema#',
162         'description': ('Schema for message sent when the composer is done waiting to sync to '
163                         'mirrors'),
164         'type': 'object',
165         'properties': {
166             'agent': {
167                 'type': 'string',
168                 'description': 'The name of the user who started this compose.'
169             },
170             'repo': {
171                 'type': 'string',
172                 'description': 'The name of the repository being composed.'
173             },
174         },
175         'required': ['agent', 'repo'],
176     }
177 
178     topic = "bodhi.compose.sync.done"
179 
180     @property
181     def repo(self) -> str:
182         """Return the name of the repository being composed."""
183         return self.body.get('repo')
184 
185     @property
186     def summary(self) -> str:
187         """
188         Return a short, human-readable representation of this message.
189 
190         This should provide a short summary of the message, much like the subject line
191         of an email.
192 
193         Returns:
194             A summary for this message.
195         """
196         return f"bodhi composer finished waiting for {self.repo} to hit the master mirror"
197 
198 
199 class ComposeSyncWaitV1(BodhiMessage):
200     """Sent when a compose task sync is waiting."""
201 
202     body_schema = {
203         'id': f'{SCHEMA_URL}/v1/bodhi.compose.sync.wait#',
204         '$schema': 'http://json-schema.org/draft-04/schema#',
205         'description': 'Schema for message sent when the composer is waiting to sync to mirrors',
206         'type': 'object',
207         'properties': {
208             'agent': {
209                 'type': 'string',
210                 'description': 'The name of the user who started this compose.'
211             },
212             'repo': {
213                 'type': 'string',
214                 'description': 'The name of the repository being composed.'
215             },
216         },
217         'required': ['agent', 'repo'],
218     }
219 
220     topic = "bodhi.compose.sync.wait"
221 
222     @property
223     def repo(self) -> str:
224         """Return the name of the repository being composed."""
225         return self.body.get('repo')
226 
227     @property
228     def summary(self) -> str:
229         """
230         Return a short, human-readable representation of this message.
231 
232         This should provide a short summary of the message, much like the subject line
233         of an email.
234 
235         Returns:
236             A summary for this message.
237         """
238         return f"bodhi composer is waiting for {self.repo} to hit the master mirror"
239 
240 
241 class RepoDoneV1(BodhiMessage):
242     """Sent when a repo is created and ready to be signed or otherwise processed."""
243 
244     body_schema = {
245         'id': f'{SCHEMA_URL}/v1/bodhi.repo.done#',
246         '$schema': 'http://json-schema.org/draft-04/schema#',
247         'description': 'Schema for message sent when a repo is created and ready to be signed',
248         'type': 'object',
249         'properties': {
250             'agent': {
251                 'type': 'string',
252                 'description': 'The name of the user who started this compose.'
253             },
254             'path': {
255                 'type': 'string',
256                 'description': 'The path of the repository that was composed.'
257             },
258             'repo': {
259                 'type': 'string',
260                 'description': 'The name of the repository that was composed.'
261             },
262         },
263         'required': ['agent', 'path', 'repo'],
264     }
265 
266     topic = "bodhi.repo.done"
267 
268     @property
269     def repo(self) -> str:
270         """Return the name of the repository being composed."""
271         return self.body.get('repo')
272 
273     @property
274     def summary(self) -> str:
275         """
276         Return a short, human-readable representation of this message.
277 
278         This should provide a short summary of the message, much like the subject line
279         of an email.
280 
281         Returns:
282             A summary for this message.
283         """
284         return f"bodhi composer is finished building {self.repo}"
285
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/bodhi/messages/schemas/compose.py b/bodhi/messages/schemas/compose.py
--- a/bodhi/messages/schemas/compose.py
+++ b/bodhi/messages/schemas/compose.py
@@ -44,6 +44,10 @@
             'success': {
                 'type': 'boolean',
                 'description': 'true if the compose was successful, false otherwise.'
+            },
+            'ctype': {
+                'type': 'string',
+                'description': 'Type of the compose.'
             }
         },
         'required': ['agent', 'repo', 'success'],
@@ -61,6 +65,11 @@
         """Return the name of the repository being composed."""
         return self.body.get('success')
 
+    @property
+    def ctype(self) -> str:
+        """Return the compose type."""
+        return self.body.get('ctype')
+
     @property
     def summary(self) -> str:
         """

{"golden_diff": "diff --git a/bodhi/messages/schemas/compose.py b/bodhi/messages/schemas/compose.py\n--- a/bodhi/messages/schemas/compose.py\n+++ b/bodhi/messages/schemas/compose.py\n@@ -44,6 +44,10 @@\n             'success': {\n                 'type': 'boolean',\n                 'description': 'true if the compose was successful, false otherwise.'\n+            },\n+            'ctype': {\n+                'type': 'string',\n+                'description': 'Type of the compose.'\n             }\n         },\n         'required': ['agent', 'repo', 'success'],\n@@ -61,6 +65,11 @@\n         \"\"\"Return the name of the repository being composed.\"\"\"\n         return self.body.get('success')\n \n+    @property\n+    def ctype(self) -> str:\n+        \"\"\"Return the compose type.\"\"\"\n+        return self.body.get('ctype')\n+\n     @property\n     def summary(self) -> str:\n         \"\"\"\n", "issue": "Add ctype to the ComposeComplete schema\nCurrently the regindexer code that maintains an index of Flatpaks and containers in the Fedora registry looks at the 'ctype' field of a ~mashtask~compose.complete message to know whether the index needs to be rebuilt:\r\n\r\n``` python\r\n   match_topic = conf.daemon.topic_prefix + '.' + conf.daemon.environment + '.bodhi.masktask.complete'\r\n   for name, endpoint, topic, raw_msg in fedmsg.tail_messages(topic=match_topic):\r\n        msg = raw_msg['msg']\r\n        if msg.get('ctype') in ('container', 'flatpak'):\r\n            indexer_thread.reindex('Bodhi mash, ctype=\"%s\"' % msg['ctype'])\r\n```\r\n\r\nThe ctype field is not part of the ComposeCompleteV1 schema - it would be great if it could be added, since I'd like to continue using it when switching to fedora-messaging.\r\n\r\n(@bowlofeggs suggested possibly extending the topic - I suppose like `compose.complete.flatpak` - I don't see a reason to go that fancy - there are few compose.complete messages.)\n", "before_files": [{"content": "# Copyright (C) 2018-2019  Red Hat, Inc.\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program; if not, write to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\"\"\"\nMessage schema for Composes.\n\nEach message is defined as a Python class. For details, see `fedora-messaging\n<https://fedora-messaging.readthedocs.io/en/stable/>`_ documentation on\nmessages.\n\"\"\"\n\nfrom .base import BodhiMessage, SCHEMA_URL\n\n\nclass ComposeCompleteV1(BodhiMessage):\n    \"\"\"Sent when a compose task completes.\"\"\"\n\n    body_schema = {\n        'id': f'{SCHEMA_URL}/v1/bodhi.compose.complete#',\n        '$schema': 'http://json-schema.org/draft-04/schema#',\n        'description': 'Schema for message sent when composes finish',\n        'type': 'object',\n        'properties': {\n            'agent': {\n                'type': 'string',\n                'description': 'The name of the user who started this compose.'\n            },\n            'repo': {\n                'type': 'string',\n                'description': 'The name of the repository being composed.'\n            },\n            'success': {\n                'type': 'boolean',\n                'description': 'true if the compose was successful, false otherwise.'\n            }\n        },\n        'required': ['agent', 'repo', 'success'],\n    }\n\n    topic = \"bodhi.compose.complete\"\n\n    @property\n    def repo(self) -> str:\n        \"\"\"Return the name of the repository being composed.\"\"\"\n        return self.body.get('repo')\n\n    @property\n    def success(self) -> bool:\n        \"\"\"Return the name of the repository being composed.\"\"\"\n        return self.body.get('success')\n\n    @property\n    def summary(self) -> str:\n        \"\"\"\n        Return a short, human-readable representation of this message.\n\n        This should provide a short summary of the message, much like the subject line\n        of an email.\n\n        Returns:\n            The message summary.\n        \"\"\"\n        if self.success:\n            return f\"bodhi composer successfully composed {self.repo}\"\n        else:\n            return f\"bodhi composer failed to compose {self.repo}\"\n\n\nclass ComposeComposingV1(BodhiMessage):\n    \"\"\"Sent when the compose task composes.\"\"\"\n\n    body_schema = {\n        'id': f'{SCHEMA_URL}/v1/bodhi.compose.composing#',\n        '$schema': 'http://json-schema.org/draft-04/schema#',\n        'description': 'Schema for message sent when composes start',\n        'type': 'object',\n        'properties': {\n            'agent': {\n                'type': 'string',\n                'description': 'The name of the user who started this compose.'\n            },\n            'repo': {\n                'type': 'string',\n                'description': 'The name of the repository being composed.'\n            },\n        },\n        'required': ['agent', 'repo'],\n    }\n\n    topic = \"bodhi.compose.composing\"\n\n    @property\n    def repo(self) -> str:\n        \"\"\"Return the name of the repository being composed.\"\"\"\n        return self.body.get('repo')\n\n    @property\n    def summary(self) -> str:\n        \"\"\"\n        Return a short, human-readable representation of this message.\n\n        This should provide a short summary of the message, much like the subject line\n        of an email.\n\n        Returns:\n            A summary for this message.\n        \"\"\"\n        return f\"bodhi composer started composing {self.repo}\"\n\n\nclass ComposeStartV1(BodhiMessage):\n    \"\"\"Sent when a compose task starts.\"\"\"\n\n    body_schema = {\n        'id': f'{SCHEMA_URL}/v1/bodhi.compose.start#',\n        '$schema': 'http://json-schema.org/draft-04/schema#',\n        'description': 'Schema for message sent when composes start',\n        'type': 'object',\n        'properties': {\n            'agent': {\n                'type': 'string',\n                'description': 'The name of the user who started this compose.'\n            },\n        },\n        'required': ['agent'],\n    }\n\n    topic = \"bodhi.compose.start\"\n\n    @property\n    def summary(self) -> str:\n        \"\"\"\n        Return a short, human-readable representation of this message.\n\n        This should provide a short summary of the message, much like the subject line\n        of an email.\n\n        Returns:\n            A summary for this message.\n        \"\"\"\n        return \"bodhi composer started a push\"\n\n\nclass ComposeSyncDoneV1(BodhiMessage):\n    \"\"\"Sent when a compose task sync is done.\"\"\"\n\n    body_schema = {\n        'id': f'{SCHEMA_URL}/v1/bodhi.compose.sync.done#',\n        '$schema': 'http://json-schema.org/draft-04/schema#',\n        'description': ('Schema for message sent when the composer is done waiting to sync to '\n                        'mirrors'),\n        'type': 'object',\n        'properties': {\n            'agent': {\n                'type': 'string',\n                'description': 'The name of the user who started this compose.'\n            },\n            'repo': {\n                'type': 'string',\n                'description': 'The name of the repository being composed.'\n            },\n        },\n        'required': ['agent', 'repo'],\n    }\n\n    topic = \"bodhi.compose.sync.done\"\n\n    @property\n    def repo(self) -> str:\n        \"\"\"Return the name of the repository being composed.\"\"\"\n        return self.body.get('repo')\n\n    @property\n    def summary(self) -> str:\n        \"\"\"\n        Return a short, human-readable representation of this message.\n\n        This should provide a short summary of the message, much like the subject line\n        of an email.\n\n        Returns:\n            A summary for this message.\n        \"\"\"\n        return f\"bodhi composer finished waiting for {self.repo} to hit the master mirror\"\n\n\nclass ComposeSyncWaitV1(BodhiMessage):\n    \"\"\"Sent when a compose task sync is waiting.\"\"\"\n\n    body_schema = {\n        'id': f'{SCHEMA_URL}/v1/bodhi.compose.sync.wait#',\n        '$schema': 'http://json-schema.org/draft-04/schema#',\n        'description': 'Schema for message sent when the composer is waiting to sync to mirrors',\n        'type': 'object',\n        'properties': {\n            'agent': {\n                'type': 'string',\n                'description': 'The name of the user who started this compose.'\n            },\n            'repo': {\n                'type': 'string',\n                'description': 'The name of the repository being composed.'\n            },\n        },\n        'required': ['agent', 'repo'],\n    }\n\n    topic = \"bodhi.compose.sync.wait\"\n\n    @property\n    def repo(self) -> str:\n        \"\"\"Return the name of the repository being composed.\"\"\"\n        return self.body.get('repo')\n\n    @property\n    def summary(self) -> str:\n        \"\"\"\n        Return a short, human-readable representation of this message.\n\n        This should provide a short summary of the message, much like the subject line\n        of an email.\n\n        Returns:\n            A summary for this message.\n        \"\"\"\n        return f\"bodhi composer is waiting for {self.repo} to hit the master mirror\"\n\n\nclass RepoDoneV1(BodhiMessage):\n    \"\"\"Sent when a repo is created and ready to be signed or otherwise processed.\"\"\"\n\n    body_schema = {\n        'id': f'{SCHEMA_URL}/v1/bodhi.repo.done#',\n        '$schema': 'http://json-schema.org/draft-04/schema#',\n        'description': 'Schema for message sent when a repo is created and ready to be signed',\n        'type': 'object',\n        'properties': {\n            'agent': {\n                'type': 'string',\n                'description': 'The name of the user who started this compose.'\n            },\n            'path': {\n                'type': 'string',\n                'description': 'The path of the repository that was composed.'\n            },\n            'repo': {\n                'type': 'string',\n                'description': 'The name of the repository that was composed.'\n            },\n        },\n        'required': ['agent', 'path', 'repo'],\n    }\n\n    topic = \"bodhi.repo.done\"\n\n    @property\n    def repo(self) -> str:\n        \"\"\"Return the name of the repository being composed.\"\"\"\n        return self.body.get('repo')\n\n    @property\n    def summary(self) -> str:\n        \"\"\"\n        Return a short, human-readable representation of this message.\n\n        This should provide a short summary of the message, much like the subject line\n        of an email.\n\n        Returns:\n            A summary for this message.\n        \"\"\"\n        return f\"bodhi composer is finished building {self.repo}\"\n", "path": "bodhi/messages/schemas/compose.py"}], "after_files": [{"content": "# Copyright (C) 2018-2019  Red Hat, Inc.\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program; if not, write to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\"\"\"\nMessage schema for Composes.\n\nEach message is defined as a Python class. For details, see `fedora-messaging\n<https://fedora-messaging.readthedocs.io/en/stable/>`_ documentation on\nmessages.\n\"\"\"\n\nfrom .base import BodhiMessage, SCHEMA_URL\n\n\nclass ComposeCompleteV1(BodhiMessage):\n    \"\"\"Sent when a compose task completes.\"\"\"\n\n    body_schema = {\n        'id': f'{SCHEMA_URL}/v1/bodhi.compose.complete#',\n        '$schema': 'http://json-schema.org/draft-04/schema#',\n        'description': 'Schema for message sent when composes finish',\n        'type': 'object',\n        'properties': {\n            'agent': {\n                'type': 'string',\n                'description': 'The name of the user who started this compose.'\n            },\n            'repo': {\n                'type': 'string',\n                'description': 'The name of the repository being composed.'\n            },\n            'success': {\n                'type': 'boolean',\n                'description': 'true if the compose was successful, false otherwise.'\n            },\n            'ctype': {\n                'type': 'string',\n                'description': 'Type of the compose.'\n            }\n        },\n        'required': ['agent', 'repo', 'success'],\n    }\n\n    topic = \"bodhi.compose.complete\"\n\n    @property\n    def repo(self) -> str:\n        \"\"\"Return the name of the repository being composed.\"\"\"\n        return self.body.get('repo')\n\n    @property\n    def success(self) -> bool:\n        \"\"\"Return the name of the repository being composed.\"\"\"\n        return self.body.get('success')\n\n    @property\n    def ctype(self) -> str:\n        \"\"\"Return the compose type.\"\"\"\n        return self.body.get('ctype')\n\n    @property\n    def summary(self) -> str:\n        \"\"\"\n        Return a short, human-readable representation of this message.\n\n        This should provide a short summary of the message, much like the subject line\n        of an email.\n\n        Returns:\n            The message summary.\n        \"\"\"\n        if self.success:\n            return f\"bodhi composer successfully composed {self.repo}\"\n        else:\n            return f\"bodhi composer failed to compose {self.repo}\"\n\n\nclass ComposeComposingV1(BodhiMessage):\n    \"\"\"Sent when the compose task composes.\"\"\"\n\n    body_schema = {\n        'id': f'{SCHEMA_URL}/v1/bodhi.compose.composing#',\n        '$schema': 'http://json-schema.org/draft-04/schema#',\n        'description': 'Schema for message sent when composes start',\n        'type': 'object',\n        'properties': {\n            'agent': {\n                'type': 'string',\n                'description': 'The name of the user who started this compose.'\n            },\n            'repo': {\n                'type': 'string',\n                'description': 'The name of the repository being composed.'\n            },\n        },\n        'required': ['agent', 'repo'],\n    }\n\n    topic = \"bodhi.compose.composing\"\n\n    @property\n    def repo(self) -> str:\n        \"\"\"Return the name of the repository being composed.\"\"\"\n        return self.body.get('repo')\n\n    @property\n    def summary(self) -> str:\n        \"\"\"\n        Return a short, human-readable representation of this message.\n\n        This should provide a short summary of the message, much like the subject line\n        of an email.\n\n        Returns:\n            A summary for this message.\n        \"\"\"\n        return f\"bodhi composer started composing {self.repo}\"\n\n\nclass ComposeStartV1(BodhiMessage):\n    \"\"\"Sent when a compose task starts.\"\"\"\n\n    body_schema = {\n        'id': f'{SCHEMA_URL}/v1/bodhi.compose.start#',\n        '$schema': 'http://json-schema.org/draft-04/schema#',\n        'description': 'Schema for message sent when composes start',\n        'type': 'object',\n        'properties': {\n            'agent': {\n                'type': 'string',\n                'description': 'The name of the user who started this compose.'\n            },\n        },\n        'required': ['agent'],\n    }\n\n    topic = \"bodhi.compose.start\"\n\n    @property\n    def summary(self) -> str:\n        \"\"\"\n        Return a short, human-readable representation of this message.\n\n        This should provide a short summary of the message, much like the subject line\n        of an email.\n\n        Returns:\n            A summary for this message.\n        \"\"\"\n        return \"bodhi composer started a push\"\n\n\nclass ComposeSyncDoneV1(BodhiMessage):\n    \"\"\"Sent when a compose task sync is done.\"\"\"\n\n    body_schema = {\n        'id': f'{SCHEMA_URL}/v1/bodhi.compose.sync.done#',\n        '$schema': 'http://json-schema.org/draft-04/schema#',\n        'description': ('Schema for message sent when the composer is done waiting to sync to '\n                        'mirrors'),\n        'type': 'object',\n        'properties': {\n            'agent': {\n                'type': 'string',\n                'description': 'The name of the user who started this compose.'\n            },\n            'repo': {\n                'type': 'string',\n                'description': 'The name of the repository being composed.'\n            },\n        },\n        'required': ['agent', 'repo'],\n    }\n\n    topic = \"bodhi.compose.sync.done\"\n\n    @property\n    def repo(self) -> str:\n        \"\"\"Return the name of the repository being composed.\"\"\"\n        return self.body.get('repo')\n\n    @property\n    def summary(self) -> str:\n        \"\"\"\n        Return a short, human-readable representation of this message.\n\n        This should provide a short summary of the message, much like the subject line\n        of an email.\n\n        Returns:\n            A summary for this message.\n        \"\"\"\n        return f\"bodhi composer finished waiting for {self.repo} to hit the master mirror\"\n\n\nclass ComposeSyncWaitV1(BodhiMessage):\n    \"\"\"Sent when a compose task sync is waiting.\"\"\"\n\n    body_schema = {\n        'id': f'{SCHEMA_URL}/v1/bodhi.compose.sync.wait#',\n        '$schema': 'http://json-schema.org/draft-04/schema#',\n        'description': 'Schema for message sent when the composer is waiting to sync to mirrors',\n        'type': 'object',\n        'properties': {\n            'agent': {\n                'type': 'string',\n                'description': 'The name of the user who started this compose.'\n            },\n            'repo': {\n                'type': 'string',\n                'description': 'The name of the repository being composed.'\n            },\n        },\n        'required': ['agent', 'repo'],\n    }\n\n    topic = \"bodhi.compose.sync.wait\"\n\n    @property\n    def repo(self) -> str:\n        \"\"\"Return the name of the repository being composed.\"\"\"\n        return self.body.get('repo')\n\n    @property\n    def summary(self) -> str:\n        \"\"\"\n        Return a short, human-readable representation of this message.\n\n        This should provide a short summary of the message, much like the subject line\n        of an email.\n\n        Returns:\n            A summary for this message.\n        \"\"\"\n        return f\"bodhi composer is waiting for {self.repo} to hit the master mirror\"\n\n\nclass RepoDoneV1(BodhiMessage):\n    \"\"\"Sent when a repo is created and ready to be signed or otherwise processed.\"\"\"\n\n    body_schema = {\n        'id': f'{SCHEMA_URL}/v1/bodhi.repo.done#',\n        '$schema': 'http://json-schema.org/draft-04/schema#',\n        'description': 'Schema for message sent when a repo is created and ready to be signed',\n        'type': 'object',\n        'properties': {\n            'agent': {\n                'type': 'string',\n                'description': 'The name of the user who started this compose.'\n            },\n            'path': {\n                'type': 'string',\n                'description': 'The path of the repository that was composed.'\n            },\n            'repo': {\n                'type': 'string',\n                'description': 'The name of the repository that was composed.'\n            },\n        },\n        'required': ['agent', 'path', 'repo'],\n    }\n\n    topic = \"bodhi.repo.done\"\n\n    @property\n    def repo(self) -> str:\n        \"\"\"Return the name of the repository being composed.\"\"\"\n        return self.body.get('repo')\n\n    @property\n    def summary(self) -> str:\n        \"\"\"\n        Return a short, human-readable representation of this message.\n\n        This should provide a short summary of the message, much like the subject line\n        of an email.\n\n        Returns:\n            A summary for this message.\n        \"\"\"\n        return f\"bodhi composer is finished building {self.repo}\"\n", "path": "bodhi/messages/schemas/compose.py"}]}