datanommer.models 1.3.0__tar.gz → 1.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. {datanommer_models-1.3.0 → datanommer_models-1.4.0}/NEWS.rst +17 -0
  2. {datanommer_models-1.3.0 → datanommer_models-1.4.0}/PKG-INFO +1 -1
  3. datanommer_models-1.4.0/coverage.xml +266 -0
  4. {datanommer_models-1.3.0 → datanommer_models-1.4.0}/datanommer/models/__init__.py +38 -11
  5. datanommer_models-1.4.0/datanommer/models/alembic/versions/429e6f2cba6f_message_agent_name.py +24 -0
  6. datanommer_models-1.4.0/datanommer/models/alembic/versions/f6918385051f_messages_headers_index.py +29 -0
  7. {datanommer_models-1.3.0 → datanommer_models-1.4.0}/pyproject.toml +2 -2
  8. {datanommer_models-1.3.0 → datanommer_models-1.4.0}/tests/test_model.py +59 -1
  9. datanommer_models-1.3.0/coverage.xml +0 -255
  10. {datanommer_models-1.3.0 → datanommer_models-1.4.0}/LICENSE +0 -0
  11. {datanommer_models-1.3.0 → datanommer_models-1.4.0}/README.rst +0 -0
  12. {datanommer_models-1.3.0 → datanommer_models-1.4.0}/alembic.ini +0 -0
  13. {datanommer_models-1.3.0 → datanommer_models-1.4.0}/datanommer/models/alembic/env.py +0 -0
  14. {datanommer_models-1.3.0 → datanommer_models-1.4.0}/datanommer/models/alembic/script.py.mako +0 -0
  15. {datanommer_models-1.3.0 → datanommer_models-1.4.0}/datanommer/models/alembic/versions/5db25abc63be_init.py +0 -0
  16. {datanommer_models-1.3.0 → datanommer_models-1.4.0}/datanommer/models/alembic/versions/951c40020acc_unique.py +0 -0
  17. {datanommer_models-1.3.0 → datanommer_models-1.4.0}/datanommer/models/testing/__init__.py +0 -0
  18. {datanommer_models-1.3.0 → datanommer_models-1.4.0}/tests/conftest.py +0 -0
  19. {datanommer_models-1.3.0 → datanommer_models-1.4.0}/tests/test_jsonencodeddict.py +0 -0
  20. {datanommer_models-1.3.0 → datanommer_models-1.4.0}/tox.ini +0 -0
@@ -6,6 +6,23 @@ For ``datanommer.models``
6
6
 
7
7
  .. towncrier release notes start
8
8
 
9
+ v1.4.0
10
+ ======
11
+
12
+ Released on 2024-06-12.
13
+
14
+ Features
15
+ ^^^^^^^^
16
+
17
+ * Rename the unused `username` column to `agent_name` and use it to store the agent name (`#1309 <https://github.com/fedora-infra/datanommer/issues/1309>`_)
18
+ * Add a JSON index on the message headers
19
+
20
+ Bug Fixes
21
+ ^^^^^^^^^
22
+
23
+ * Fix the `get_first()` query to actually return only one message
24
+
25
+
9
26
  v1.3.0
10
27
  ======
11
28
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: datanommer.models
3
- Version: 1.3.0
3
+ Version: 1.4.0
4
4
  Summary: SQLAlchemy models for datanommer
5
5
  Home-page: https://github.com/fedora-infra/datanommer
6
6
  License: GPL-3.0-or-later
@@ -0,0 +1,266 @@
1
+ <?xml version="1.0" ?>
2
+ <coverage version="7.5.3" timestamp="1717783023237" lines-valid="247" lines-covered="247" line-rate="1" branches-valid="118" branches-covered="118" branch-rate="1" complexity="0">
3
+ <!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.5.3 -->
4
+ <!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
5
+ <sources>
6
+ <source>/home/abompard/Fedora/apps/datanommer/datanommer.models/datanommer</source>
7
+ </sources>
8
+ <packages>
9
+ <package name="models" line-rate="1" branch-rate="1" complexity="0">
10
+ <classes>
11
+ <class name="__init__.py" filename="models/__init__.py" complexity="0" line-rate="1" branch-rate="1">
12
+ <methods/>
13
+ <lines>
14
+ <line number="16" hits="1"/>
15
+ <line number="17" hits="1"/>
16
+ <line number="18" hits="1"/>
17
+ <line number="19" hits="1"/>
18
+ <line number="20" hits="1"/>
19
+ <line number="21" hits="1"/>
20
+ <line number="22" hits="1"/>
21
+ <line number="23" hits="1"/>
22
+ <line number="25" hits="1"/>
23
+ <line number="48" hits="1"/>
24
+ <line number="49" hits="1"/>
25
+ <line number="50" hits="1"/>
26
+ <line number="57" hits="1"/>
27
+ <line number="60" hits="1"/>
28
+ <line number="61" hits="1"/>
29
+ <line number="68" hits="1"/>
30
+ <line number="71" hits="1"/>
31
+ <line number="73" hits="1"/>
32
+ <line number="74" hits="1"/>
33
+ <line number="76" hits="1"/>
34
+ <line number="77" hits="1"/>
35
+ <line number="80" hits="1"/>
36
+ <line number="83" hits="1" branch="true" condition-coverage="100% (2/2)"/>
37
+ <line number="84" hits="1"/>
38
+ <line number="86" hits="1" branch="true" condition-coverage="100% (2/2)"/>
39
+ <line number="87" hits="1"/>
40
+ <line number="89" hits="1" branch="true" condition-coverage="100% (2/2)"/>
41
+ <line number="90" hits="1"/>
42
+ <line number="95" hits="1" branch="true" condition-coverage="100% (2/2)"/>
43
+ <line number="96" hits="1"/>
44
+ <line number="97" hits="1"/>
45
+ <line number="98" hits="1"/>
46
+ <line number="100" hits="1"/>
47
+ <line number="101" hits="1"/>
48
+ <line number="103" hits="1" branch="true" condition-coverage="100% (2/2)"/>
49
+ <line number="104" hits="1" branch="true" condition-coverage="100% (2/2)"/>
50
+ <line number="105" hits="1"/>
51
+ <line number="106" hits="1"/>
52
+ <line number="117" hits="1"/>
53
+ <line number="121" hits="1"/>
54
+ <line number="122" hits="1"/>
55
+ <line number="124" hits="1" branch="true" condition-coverage="100% (2/2)"/>
56
+ <line number="127" hits="1"/>
57
+ <line number="128" hits="1"/>
58
+ <line number="129" hits="1"/>
59
+ <line number="130" hits="1"/>
60
+ <line number="131" hits="1"/>
61
+ <line number="133" hits="1"/>
62
+ <line number="136" hits="1"/>
63
+ <line number="137" hits="1"/>
64
+ <line number="138" hits="1"/>
65
+ <line number="139" hits="1"/>
66
+ <line number="144" hits="1"/>
67
+ <line number="145" hits="1"/>
68
+ <line number="146" hits="1"/>
69
+ <line number="147" hits="1"/>
70
+ <line number="148" hits="1"/>
71
+ <line number="153" hits="1"/>
72
+ <line number="155" hits="1"/>
73
+ <line number="167" hits="1"/>
74
+ <line number="173" hits="1"/>
75
+ <line number="176" hits="1"/>
76
+ <line number="178" hits="1"/>
77
+ <line number="180" hits="1"/>
78
+ <line number="181" hits="1" branch="true" condition-coverage="100% (2/2)"/>
79
+ <line number="182" hits="1"/>
80
+ <line number="184" hits="1"/>
81
+ <line number="186" hits="1"/>
82
+ <line number="187" hits="1" branch="true" condition-coverage="100% (2/2)"/>
83
+ <line number="188" hits="1"/>
84
+ <line number="189" hits="1"/>
85
+ <line number="191" hits="1"/>
86
+ <line number="193" hits="1" branch="true" condition-coverage="100% (2/2)"/>
87
+ <line number="194" hits="1"/>
88
+ <line number="196" hits="1"/>
89
+ <line number="199" hits="1"/>
90
+ <line number="207" hits="1"/>
91
+ <line number="216" hits="1"/>
92
+ <line number="217" hits="1"/>
93
+ <line number="218" hits="1"/>
94
+ <line number="228" hits="1"/>
95
+ <line number="229" hits="1"/>
96
+ <line number="230" hits="1"/>
97
+ <line number="231" hits="1"/>
98
+ <line number="232" hits="1"/>
99
+ <line number="233" hits="1"/>
100
+ <line number="234" hits="1"/>
101
+ <line number="235" hits="1"/>
102
+ <line number="236" hits="1"/>
103
+ <line number="237" hits="1"/>
104
+ <line number="238" hits="1"/>
105
+ <line number="239" hits="1" branch="true" condition-coverage="100% (2/2)"/>
106
+ <line number="240" hits="1"/>
107
+ <line number="241" hits="1"/>
108
+ <line number="242" hits="1" branch="true" condition-coverage="100% (2/2)"/>
109
+ <line number="251" hits="1" branch="true" condition-coverage="100% (2/2)"/>
110
+ <line number="261" hits="1"/>
111
+ <line number="262" hits="1" branch="true" condition-coverage="100% (2/2)"/>
112
+ <line number="268" hits="1"/>
113
+ <line number="269" hits="1"/>
114
+ <line number="270" hits="1"/>
115
+ <line number="271" hits="1"/>
116
+ <line number="272" hits="1"/>
117
+ <line number="273" hits="1"/>
118
+ <line number="274" hits="1"/>
119
+ <line number="276" hits="1"/>
120
+ <line number="277" hits="1" branch="true" condition-coverage="100% (2/2)"/>
121
+ <line number="278" hits="1"/>
122
+ <line number="279" hits="1"/>
123
+ <line number="280" hits="1" branch="true" condition-coverage="100% (2/2)"/>
124
+ <line number="281" hits="1"/>
125
+ <line number="282" hits="1"/>
126
+ <line number="283" hits="1"/>
127
+ <line number="285" hits="1"/>
128
+ <line number="286" hits="1"/>
129
+ <line number="287" hits="1"/>
130
+ <line number="288" hits="1"/>
131
+ <line number="289" hits="1" branch="true" condition-coverage="100% (2/2)"/>
132
+ <line number="290" hits="1"/>
133
+ <line number="296" hits="1"/>
134
+ <line number="301" hits="1"/>
135
+ <line number="302" hits="1"/>
136
+ <line number="304" hits="1"/>
137
+ <line number="305" hits="1"/>
138
+ <line number="307" hits="1"/>
139
+ <line number="308" hits="1" branch="true" condition-coverage="100% (2/2)"/>
140
+ <line number="309" hits="1"/>
141
+ <line number="310" hits="1"/>
142
+ <line number="311" hits="1"/>
143
+ <line number="312" hits="1" branch="true" condition-coverage="100% (2/2)"/>
144
+ <line number="313" hits="1"/>
145
+ <line number="317" hits="1"/>
146
+ <line number="324" hits="1"/>
147
+ <line number="325" hits="1"/>
148
+ <line number="327" hits="1"/>
149
+ <line number="328" hits="1" branch="true" condition-coverage="100% (2/2)"/>
150
+ <line number="329" hits="1"/>
151
+ <line number="331" hits="1"/>
152
+ <line number="332" hits="1" branch="true" condition-coverage="100% (2/2)"/>
153
+ <line number="350" hits="1"/>
154
+ <line number="351" hits="1"/>
155
+ <line number="352" hits="1" branch="true" condition-coverage="100% (2/2)"/>
156
+ <line number="353" hits="1"/>
157
+ <line number="354" hits="1"/>
158
+ <line number="363" hits="1"/>
159
+ <line number="364" hits="1"/>
160
+ <line number="370" hits="1"/>
161
+ <line number="372" hits="1"/>
162
+ <line number="373" hits="1" branch="true" condition-coverage="100% (2/2)"/>
163
+ <line number="374" hits="1"/>
164
+ <line number="380" hits="1"/>
165
+ <line number="382" hits="1"/>
166
+ <line number="383" hits="1" branch="true" condition-coverage="100% (2/2)"/>
167
+ <line number="429" hits="1"/>
168
+ <line number="430" hits="1"/>
169
+ <line number="431" hits="1"/>
170
+ <line number="432" hits="1"/>
171
+ <line number="433" hits="1"/>
172
+ <line number="434" hits="1"/>
173
+ <line number="435" hits="1"/>
174
+ <line number="436" hits="1"/>
175
+ <line number="437" hits="1"/>
176
+ <line number="438" hits="1"/>
177
+ <line number="439" hits="1"/>
178
+ <line number="441" hits="1"/>
179
+ <line number="442" hits="1"/>
180
+ <line number="446" hits="1" branch="true" condition-coverage="100% (2/2)"/>
181
+ <line number="447" hits="1"/>
182
+ <line number="451" hits="1" branch="true" condition-coverage="100% (2/2)"/>
183
+ <line number="452" hits="1"/>
184
+ <line number="454" hits="1" branch="true" condition-coverage="100% (2/2)"/>
185
+ <line number="455" hits="1"/>
186
+ <line number="458" hits="1" branch="true" condition-coverage="100% (2/2)"/>
187
+ <line number="459" hits="1" branch="true" condition-coverage="100% (2/2)"/>
188
+ <line number="461" hits="1" branch="true" condition-coverage="100% (2/2)"/>
189
+ <line number="462" hits="1" branch="true" condition-coverage="100% (2/2)"/>
190
+ <line number="464" hits="1" branch="true" condition-coverage="100% (2/2)"/>
191
+ <line number="465" hits="1" branch="true" condition-coverage="100% (2/2)"/>
192
+ <line number="467" hits="1" branch="true" condition-coverage="100% (2/2)"/>
193
+ <line number="468" hits="1" branch="true" condition-coverage="100% (2/2)"/>
194
+ <line number="470" hits="1" branch="true" condition-coverage="100% (2/2)"/>
195
+ <line number="471" hits="1" branch="true" condition-coverage="100% (2/2)"/>
196
+ <line number="473" hits="1" branch="true" condition-coverage="100% (2/2)"/>
197
+ <line number="474" hits="1" branch="true" condition-coverage="100% (2/2)"/>
198
+ <line number="477" hits="1" branch="true" condition-coverage="100% (2/2)"/>
199
+ <line number="478" hits="1" branch="true" condition-coverage="100% (2/2)"/>
200
+ <line number="480" hits="1" branch="true" condition-coverage="100% (2/2)"/>
201
+ <line number="481" hits="1" branch="true" condition-coverage="100% (2/2)"/>
202
+ <line number="485" hits="1" branch="true" condition-coverage="100% (2/2)"/>
203
+ <line number="486" hits="1" branch="true" condition-coverage="100% (2/2)"/>
204
+ <line number="488" hits="1" branch="true" condition-coverage="100% (2/2)"/>
205
+ <line number="489" hits="1" branch="true" condition-coverage="100% (2/2)"/>
206
+ <line number="491" hits="1" branch="true" condition-coverage="100% (2/2)"/>
207
+ <line number="492" hits="1" branch="true" condition-coverage="100% (2/2)"/>
208
+ <line number="494" hits="1"/>
209
+ <line number="495" hits="1"/>
210
+ <line number="497" hits="1"/>
211
+ <line number="498" hits="1" branch="true" condition-coverage="100% (2/2)"/>
212
+ <line number="539" hits="1"/>
213
+ <line number="541" hits="1"/>
214
+ <line number="543" hits="1"/>
215
+ <line number="544" hits="1"/>
216
+ <line number="545" hits="1"/>
217
+ <line number="547" hits="1" branch="true" condition-coverage="100% (2/2)"/>
218
+ <line number="548" hits="1"/>
219
+ <line number="550" hits="1"/>
220
+ <line number="551" hits="1"/>
221
+ <line number="552" hits="1"/>
222
+ <line number="554" hits="1" branch="true" condition-coverage="100% (2/2)"/>
223
+ <line number="555" hits="1" branch="true" condition-coverage="100% (2/2)"/>
224
+ <line number="556" hits="1"/>
225
+ <line number="557" hits="1"/>
226
+ <line number="560" hits="1"/>
227
+ <line number="561" hits="1" branch="true" condition-coverage="100% (2/2)"/>
228
+ <line number="562" hits="1"/>
229
+ <line number="563" hits="1"/>
230
+ <line number="565" hits="1"/>
231
+ <line number="566" hits="1" branch="true" condition-coverage="100% (2/2)"/>
232
+ <line number="568" hits="1"/>
233
+ <line number="569" hits="1"/>
234
+ <line number="570" hits="1"/>
235
+ <line number="573" hits="1"/>
236
+ <line number="574" hits="1"/>
237
+ <line number="575" hits="1"/>
238
+ <line number="577" hits="1"/>
239
+ <line number="578" hits="1" branch="true" condition-coverage="100% (2/2)"/>
240
+ <line number="584" hits="1" branch="true" condition-coverage="100% (2/2)"/>
241
+ <line number="587" hits="1"/>
242
+ <line number="588" hits="1"/>
243
+ <line number="589" hits="1" branch="true" condition-coverage="100% (2/2)"/>
244
+ <line number="590" hits="1"/>
245
+ <line number="591" hits="1"/>
246
+ <line number="592" hits="1"/>
247
+ <line number="593" hits="1"/>
248
+ <line number="594" hits="1"/>
249
+ <line number="596" hits="1"/>
250
+ <line number="597" hits="1" branch="true" condition-coverage="100% (2/2)"/>
251
+ <line number="598" hits="1"/>
252
+ <line number="601" hits="1"/>
253
+ <line number="602" hits="1"/>
254
+ <line number="603" hits="1"/>
255
+ <line number="606" hits="1"/>
256
+ <line number="607" hits="1"/>
257
+ <line number="608" hits="1"/>
258
+ <line number="611" hits="1"/>
259
+ <line number="612" hits="1"/>
260
+ <line number="619" hits="1"/>
261
+ </lines>
262
+ </class>
263
+ </classes>
264
+ </package>
265
+ </packages>
266
+ </coverage>
@@ -32,6 +32,7 @@ from sqlalchemy import (
32
32
  event,
33
33
  ForeignKey,
34
34
  func,
35
+ Index,
35
36
  Integer,
36
37
  not_,
37
38
  or_,
@@ -158,6 +159,7 @@ def add(message):
158
159
  timestamp=sent_at,
159
160
  msg=message.body,
160
161
  headers=headers,
162
+ agent_name=getattr(message, "agent_name", None),
161
163
  users=usernames,
162
164
  packages=packages,
163
165
  )
@@ -213,7 +215,15 @@ packages_assoc_table = Table(
213
215
 
214
216
  class Message(DeclarativeBase):
215
217
  __tablename__ = "messages"
216
- __table_args__ = (UniqueConstraint("msg_id", "timestamp"),)
218
+ __table_args__ = (
219
+ UniqueConstraint("msg_id", "timestamp"),
220
+ Index(
221
+ "ix_messages_headers",
222
+ "headers",
223
+ postgresql_using="gin",
224
+ postgresql_ops={"headers": "jsonb_path_ops"},
225
+ ),
226
+ )
217
227
 
218
228
  id = Column(Integer, primary_key=True, autoincrement=True)
219
229
  msg_id = Column(Unicode, nullable=True, default=None, index=True)
@@ -223,7 +233,7 @@ class Message(DeclarativeBase):
223
233
  certificate = Column(UnicodeText)
224
234
  signature = Column(UnicodeText)
225
235
  category = Column(Unicode, nullable=False, index=True)
226
- username = Column(Unicode)
236
+ agent_name = Column(Unicode, index=True)
227
237
  crypto = Column(UnicodeText)
228
238
  source_name = Column(Unicode, default="datanommer")
229
239
  source_version = Column(Unicode, default=lambda context: __version__)
@@ -326,7 +336,8 @@ class Message(DeclarativeBase):
326
336
  timestamp=self.timestamp,
327
337
  certificate=self.certificate,
328
338
  signature=self.signature,
329
- username=self.username,
339
+ agent_name=self.agent_name,
340
+ username=self.agent_name, # DEPRECATED
330
341
  crypto=self.crypto,
331
342
  msg=self.msg,
332
343
  headers=self.headers,
@@ -358,6 +369,16 @@ class Message(DeclarativeBase):
358
369
  )
359
370
  return self.as_dict(request)
360
371
 
372
+ @property
373
+ def username(self):
374
+ warn(
375
+ "The username attribute has been renamed to agent_name, and will be removed "
376
+ "in the next major version",
377
+ DeprecationWarning,
378
+ stacklevel=2,
379
+ )
380
+ return self.agent_name
381
+
361
382
  @classmethod
362
383
  def make_query(
363
384
  cls,
@@ -372,6 +393,8 @@ class Message(DeclarativeBase):
372
393
  not_categories=None,
373
394
  topics=None,
374
395
  not_topics=None,
396
+ agents=None,
397
+ not_agents=None,
375
398
  contains=None,
376
399
  ):
377
400
  """Flexible query interface for messages.
@@ -400,6 +423,7 @@ class Message(DeclarativeBase):
400
423
 
401
424
  (user == 'ralph') AND
402
425
  NOT (category == 'bodhi' OR category == 'wiki')
426
+
403
427
  """
404
428
 
405
429
  users = users or []
@@ -410,6 +434,8 @@ class Message(DeclarativeBase):
410
434
  not_cats = not_categories or []
411
435
  topics = topics or []
412
436
  not_topics = not_topics or []
437
+ agents = agents or []
438
+ not_agents = not_agents or []
413
439
  contains = contains or []
414
440
 
415
441
  Message = cls
@@ -441,6 +467,9 @@ class Message(DeclarativeBase):
441
467
  if topics:
442
468
  query = query.where(or_(*(Message.topic == topic for topic in topics)))
443
469
 
470
+ if agents:
471
+ query = query.where(or_(*(Message.agent_name == agent for agent in agents)))
472
+
444
473
  if contains:
445
474
  query = query.where(or_(*(Message.msg.like(f"%{contain}%") for contain in contains)))
446
475
 
@@ -459,6 +488,9 @@ class Message(DeclarativeBase):
459
488
  if not_topics:
460
489
  query = query.where(not_(or_(*(Message.topic == topic for topic in not_topics))))
461
490
 
491
+ if not_agents:
492
+ query = query.where(not_(or_(*(Message.agent_name == agent for agent in not_agents))))
493
+
462
494
  return query
463
495
 
464
496
  @classmethod
@@ -500,13 +532,8 @@ class Message(DeclarativeBase):
500
532
 
501
533
  ----
502
534
 
503
- The ``jsons`` argument is a list of jsonpath filters, please refer to
504
- `PostgreSQL's documentation
505
- <https://www.postgresql.org/docs/current/functions-json.html#FUNCTIONS-SQLJSON-PATH>`_
506
- on the matter to learn how to build the jsonpath expression.
507
-
508
- The ``jsons_and`` argument is similar to the ``jsons`` argument, but all
509
- the values must match for a message to be returned.
535
+ If the `defer` argument evaluates to True, the query won't actually
536
+ be executed, but a SQLAlchemy query object returned instead.
510
537
  """
511
538
  query = cls.make_query(**kwargs)
512
539
  # Finally, tag on our pagination arguments
@@ -538,7 +565,7 @@ class Message(DeclarativeBase):
538
565
  def get_first(cls, *, order="asc", **kwargs):
539
566
  """Get the first message matching the regular grep filters."""
540
567
  query = cls.make_query(**kwargs)
541
- query = query.order_by(getattr(Message.timestamp, order)())
568
+ query = query.order_by(getattr(Message.timestamp, order)()).limit(1)
542
569
  return session.scalars(query).first()
543
570
 
544
571
 
@@ -0,0 +1,24 @@
1
+ """Message.username → Message.agent_name
2
+
3
+ Revision ID: 429e6f2cba6f
4
+ Revises: 951c40020acc
5
+ Create Date: 2024-06-07 09:12:33.393757
6
+
7
+ """
8
+
9
+ from alembic import op
10
+
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "429e6f2cba6f"
14
+ down_revision = "f6918385051f"
15
+
16
+
17
+ def upgrade():
18
+ op.alter_column("messages", "username", new_column_name="agent_name")
19
+ op.create_index(op.f("ix_messages_agent_name"), "messages", ["agent_name"], unique=False)
20
+
21
+
22
+ def downgrade():
23
+ op.drop_index(op.f("ix_messages_agent_name"), table_name="messages")
24
+ op.alter_column("messages", "agent_name", new_column_name="username")
@@ -0,0 +1,29 @@
1
+ """Messages.headers index
2
+
3
+ Revision ID: f6918385051f
4
+ Revises: 951c40020acc
5
+ Create Date: 2024-05-07 16:05:05.344863
6
+
7
+ """
8
+
9
+ from alembic import op
10
+
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "f6918385051f"
14
+ down_revision = "951c40020acc"
15
+
16
+
17
+ def upgrade():
18
+ op.create_index(
19
+ "ix_messages_headers",
20
+ "messages",
21
+ ["headers"],
22
+ unique=False,
23
+ postgresql_using="gin",
24
+ postgresql_ops={"headers": "jsonb_path_ops"},
25
+ )
26
+
27
+
28
+ def downgrade():
29
+ op.drop_index("ix_messages_headers", table_name="messages", postgresql_using="gin")
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "datanommer.models"
3
- version = "1.3.0"
3
+ version = "1.4.0"
4
4
  description = "SQLAlchemy models for datanommer"
5
5
  authors = [
6
6
  "Fedora Infrastructure <admin@fedoraproject.org>"
@@ -110,7 +110,7 @@ title_format = "v{version}"
110
110
  issue_format = "{issue}"
111
111
  template = "../tools/towncrier/template.rst.j2"
112
112
  underlines = "=^-"
113
- wrap = true
113
+ wrap = false
114
114
  all_bullets = true
115
115
 
116
116
  [[tool.towncrier.type]]
@@ -345,6 +345,55 @@ def test_grep_msg_id(datanommer_models):
345
345
  assert len(messages) == 0
346
346
 
347
347
 
348
+ def test_grep_agents(datanommer_models):
349
+ example_message = generate_message()
350
+ dm.add(example_message)
351
+
352
+ bodhi_example_message = generate_bodhi_update_complete_message()
353
+ dm.add(bodhi_example_message)
354
+
355
+ dm.session.flush()
356
+
357
+ total, pages, messages = dm.Message.grep(agents=["dudemcpants"])
358
+
359
+ assert total == 1
360
+ assert pages == 1
361
+ assert len(messages) == 1
362
+
363
+ assert messages[0].msg == bodhi_example_message.body
364
+
365
+
366
+ def test_grep_not_agents(datanommer_models, mocker):
367
+ example_message = generate_message() # has agent_name == None
368
+ dm.add(example_message)
369
+
370
+ bodhi_example_message = generate_bodhi_update_complete_message()
371
+ dm.add(bodhi_example_message) # has agent_name == "dudemcpants"
372
+
373
+ class MessageWithAgent(fedora_message.Message):
374
+ topic = "org.fedoraproject.test.a.message.with.agent"
375
+ agent_name = "dummy-agent-name"
376
+
377
+ fedora_message._schema_name_to_class["MessageWithAgent"] = MessageWithAgent
378
+ fedora_message._class_to_schema_name[MessageWithAgent] = "MessageWithAgent"
379
+
380
+ example_message_with_agent = MessageWithAgent(
381
+ body={"subject": "this is a message with an agent"}
382
+ )
383
+ dm.add(example_message_with_agent)
384
+
385
+ dm.session.flush()
386
+
387
+ total, pages, messages = dm.Message.grep(not_agents=["dudemcpants"])
388
+
389
+ # Messages with agent_name == None are not returned
390
+ assert total == 1
391
+ assert pages == 1
392
+ assert len(messages) == 1
393
+
394
+ assert messages[0].msg == example_message_with_agent.body
395
+
396
+
348
397
  def test_grep_users(datanommer_models):
349
398
  example_message = generate_message()
350
399
  dm.add(example_message)
@@ -617,7 +666,7 @@ def test_as_dict(datanommer_models):
617
666
  message_dict = dbmsg.as_dict()
618
667
 
619
668
  # we should have 14 keys in this dict
620
- assert len(message_dict) == 14
669
+ assert len(message_dict) == 15
621
670
  assert message_dict["msg"] == {"encouragement": "You're doing great!"}
622
671
  assert message_dict["topic"] == "org.fedoraproject.test.a.nice.message"
623
672
 
@@ -643,6 +692,15 @@ def test___json__deprecated(datanommer_models, caplog, mocker):
643
692
  mock_as_dict.assert_called_once()
644
693
 
645
694
 
695
+ def test_username_deprecated(datanommer_models, caplog, mocker):
696
+ dm.add(generate_message())
697
+ dbmsg = dm.session.scalar(select(dm.Message))
698
+ dbmsg.agent_name = "dummy"
699
+
700
+ with pytest.warns(DeprecationWarning):
701
+ assert dbmsg.username == "dummy"
702
+
703
+
646
704
  def test_singleton_create(datanommer_models):
647
705
  dm.Package.get_or_create("foobar")
648
706
  assert [p.name for p in dm.session.scalars(select(dm.Package))] == ["foobar"]
@@ -1,255 +0,0 @@
1
- <?xml version="1.0" ?>
2
- <coverage version="7.5.1" timestamp="1716382532447" lines-valid="236" lines-covered="236" line-rate="1" branches-valid="108" branches-covered="108" branch-rate="1" complexity="0">
3
- <!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.5.1 -->
4
- <!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
5
- <sources>
6
- <source>/home/abompard/Fedora/apps/datanommer/datanommer.models/datanommer</source>
7
- </sources>
8
- <packages>
9
- <package name="models" line-rate="1" branch-rate="1" complexity="0">
10
- <classes>
11
- <class name="__init__.py" filename="models/__init__.py" complexity="0" line-rate="1" branch-rate="1">
12
- <methods/>
13
- <lines>
14
- <line number="16" hits="1"/>
15
- <line number="17" hits="1"/>
16
- <line number="18" hits="1"/>
17
- <line number="19" hits="1"/>
18
- <line number="20" hits="1"/>
19
- <line number="21" hits="1"/>
20
- <line number="22" hits="1"/>
21
- <line number="23" hits="1"/>
22
- <line number="25" hits="1"/>
23
- <line number="47" hits="1"/>
24
- <line number="48" hits="1"/>
25
- <line number="49" hits="1"/>
26
- <line number="56" hits="1"/>
27
- <line number="59" hits="1"/>
28
- <line number="60" hits="1"/>
29
- <line number="67" hits="1"/>
30
- <line number="70" hits="1"/>
31
- <line number="72" hits="1"/>
32
- <line number="73" hits="1"/>
33
- <line number="75" hits="1"/>
34
- <line number="76" hits="1"/>
35
- <line number="79" hits="1"/>
36
- <line number="82" hits="1" branch="true" condition-coverage="100% (2/2)"/>
37
- <line number="83" hits="1"/>
38
- <line number="85" hits="1" branch="true" condition-coverage="100% (2/2)"/>
39
- <line number="86" hits="1"/>
40
- <line number="88" hits="1" branch="true" condition-coverage="100% (2/2)"/>
41
- <line number="89" hits="1"/>
42
- <line number="94" hits="1" branch="true" condition-coverage="100% (2/2)"/>
43
- <line number="95" hits="1"/>
44
- <line number="96" hits="1"/>
45
- <line number="97" hits="1"/>
46
- <line number="99" hits="1"/>
47
- <line number="100" hits="1"/>
48
- <line number="102" hits="1" branch="true" condition-coverage="100% (2/2)"/>
49
- <line number="103" hits="1" branch="true" condition-coverage="100% (2/2)"/>
50
- <line number="104" hits="1"/>
51
- <line number="105" hits="1"/>
52
- <line number="116" hits="1"/>
53
- <line number="120" hits="1"/>
54
- <line number="121" hits="1"/>
55
- <line number="123" hits="1" branch="true" condition-coverage="100% (2/2)"/>
56
- <line number="126" hits="1"/>
57
- <line number="127" hits="1"/>
58
- <line number="128" hits="1"/>
59
- <line number="129" hits="1"/>
60
- <line number="130" hits="1"/>
61
- <line number="132" hits="1"/>
62
- <line number="135" hits="1"/>
63
- <line number="136" hits="1"/>
64
- <line number="137" hits="1"/>
65
- <line number="138" hits="1"/>
66
- <line number="143" hits="1"/>
67
- <line number="144" hits="1"/>
68
- <line number="145" hits="1"/>
69
- <line number="146" hits="1"/>
70
- <line number="147" hits="1"/>
71
- <line number="152" hits="1"/>
72
- <line number="154" hits="1"/>
73
- <line number="165" hits="1"/>
74
- <line number="171" hits="1"/>
75
- <line number="174" hits="1"/>
76
- <line number="176" hits="1"/>
77
- <line number="178" hits="1"/>
78
- <line number="179" hits="1" branch="true" condition-coverage="100% (2/2)"/>
79
- <line number="180" hits="1"/>
80
- <line number="182" hits="1"/>
81
- <line number="184" hits="1"/>
82
- <line number="185" hits="1" branch="true" condition-coverage="100% (2/2)"/>
83
- <line number="186" hits="1"/>
84
- <line number="187" hits="1"/>
85
- <line number="189" hits="1"/>
86
- <line number="191" hits="1" branch="true" condition-coverage="100% (2/2)"/>
87
- <line number="192" hits="1"/>
88
- <line number="194" hits="1"/>
89
- <line number="197" hits="1"/>
90
- <line number="205" hits="1"/>
91
- <line number="214" hits="1"/>
92
- <line number="215" hits="1"/>
93
- <line number="216" hits="1"/>
94
- <line number="218" hits="1"/>
95
- <line number="219" hits="1"/>
96
- <line number="220" hits="1"/>
97
- <line number="221" hits="1"/>
98
- <line number="222" hits="1"/>
99
- <line number="223" hits="1"/>
100
- <line number="224" hits="1"/>
101
- <line number="225" hits="1"/>
102
- <line number="226" hits="1"/>
103
- <line number="227" hits="1"/>
104
- <line number="228" hits="1"/>
105
- <line number="229" hits="1" branch="true" condition-coverage="100% (2/2)"/>
106
- <line number="230" hits="1"/>
107
- <line number="231" hits="1"/>
108
- <line number="232" hits="1" branch="true" condition-coverage="100% (2/2)"/>
109
- <line number="241" hits="1" branch="true" condition-coverage="100% (2/2)"/>
110
- <line number="251" hits="1"/>
111
- <line number="252" hits="1" branch="true" condition-coverage="100% (2/2)"/>
112
- <line number="258" hits="1"/>
113
- <line number="259" hits="1"/>
114
- <line number="260" hits="1"/>
115
- <line number="261" hits="1"/>
116
- <line number="262" hits="1"/>
117
- <line number="263" hits="1"/>
118
- <line number="264" hits="1"/>
119
- <line number="266" hits="1"/>
120
- <line number="267" hits="1" branch="true" condition-coverage="100% (2/2)"/>
121
- <line number="268" hits="1"/>
122
- <line number="269" hits="1"/>
123
- <line number="270" hits="1" branch="true" condition-coverage="100% (2/2)"/>
124
- <line number="271" hits="1"/>
125
- <line number="272" hits="1"/>
126
- <line number="273" hits="1"/>
127
- <line number="275" hits="1"/>
128
- <line number="276" hits="1"/>
129
- <line number="277" hits="1"/>
130
- <line number="278" hits="1"/>
131
- <line number="279" hits="1" branch="true" condition-coverage="100% (2/2)"/>
132
- <line number="280" hits="1"/>
133
- <line number="286" hits="1"/>
134
- <line number="291" hits="1"/>
135
- <line number="292" hits="1"/>
136
- <line number="294" hits="1"/>
137
- <line number="295" hits="1"/>
138
- <line number="297" hits="1"/>
139
- <line number="298" hits="1" branch="true" condition-coverage="100% (2/2)"/>
140
- <line number="299" hits="1"/>
141
- <line number="300" hits="1"/>
142
- <line number="301" hits="1"/>
143
- <line number="302" hits="1" branch="true" condition-coverage="100% (2/2)"/>
144
- <line number="303" hits="1"/>
145
- <line number="307" hits="1"/>
146
- <line number="314" hits="1"/>
147
- <line number="315" hits="1"/>
148
- <line number="317" hits="1"/>
149
- <line number="318" hits="1" branch="true" condition-coverage="100% (2/2)"/>
150
- <line number="319" hits="1"/>
151
- <line number="321" hits="1"/>
152
- <line number="322" hits="1" branch="true" condition-coverage="100% (2/2)"/>
153
- <line number="339" hits="1"/>
154
- <line number="340" hits="1"/>
155
- <line number="341" hits="1" branch="true" condition-coverage="100% (2/2)"/>
156
- <line number="342" hits="1"/>
157
- <line number="343" hits="1"/>
158
- <line number="352" hits="1"/>
159
- <line number="353" hits="1"/>
160
- <line number="359" hits="1"/>
161
- <line number="361" hits="1"/>
162
- <line number="362" hits="1" branch="true" condition-coverage="100% (2/2)"/>
163
- <line number="405" hits="1"/>
164
- <line number="406" hits="1"/>
165
- <line number="407" hits="1"/>
166
- <line number="408" hits="1"/>
167
- <line number="409" hits="1"/>
168
- <line number="410" hits="1"/>
169
- <line number="411" hits="1"/>
170
- <line number="412" hits="1"/>
171
- <line number="413" hits="1"/>
172
- <line number="415" hits="1"/>
173
- <line number="416" hits="1"/>
174
- <line number="420" hits="1" branch="true" condition-coverage="100% (2/2)"/>
175
- <line number="421" hits="1"/>
176
- <line number="425" hits="1" branch="true" condition-coverage="100% (2/2)"/>
177
- <line number="426" hits="1"/>
178
- <line number="428" hits="1" branch="true" condition-coverage="100% (2/2)"/>
179
- <line number="429" hits="1"/>
180
- <line number="432" hits="1" branch="true" condition-coverage="100% (2/2)"/>
181
- <line number="433" hits="1" branch="true" condition-coverage="100% (2/2)"/>
182
- <line number="435" hits="1" branch="true" condition-coverage="100% (2/2)"/>
183
- <line number="436" hits="1" branch="true" condition-coverage="100% (2/2)"/>
184
- <line number="438" hits="1" branch="true" condition-coverage="100% (2/2)"/>
185
- <line number="439" hits="1" branch="true" condition-coverage="100% (2/2)"/>
186
- <line number="441" hits="1" branch="true" condition-coverage="100% (2/2)"/>
187
- <line number="442" hits="1" branch="true" condition-coverage="100% (2/2)"/>
188
- <line number="444" hits="1" branch="true" condition-coverage="100% (2/2)"/>
189
- <line number="445" hits="1" branch="true" condition-coverage="100% (2/2)"/>
190
- <line number="448" hits="1" branch="true" condition-coverage="100% (2/2)"/>
191
- <line number="449" hits="1" branch="true" condition-coverage="100% (2/2)"/>
192
- <line number="451" hits="1" branch="true" condition-coverage="100% (2/2)"/>
193
- <line number="452" hits="1" branch="true" condition-coverage="100% (2/2)"/>
194
- <line number="456" hits="1" branch="true" condition-coverage="100% (2/2)"/>
195
- <line number="457" hits="1" branch="true" condition-coverage="100% (2/2)"/>
196
- <line number="459" hits="1" branch="true" condition-coverage="100% (2/2)"/>
197
- <line number="460" hits="1" branch="true" condition-coverage="100% (2/2)"/>
198
- <line number="462" hits="1"/>
199
- <line number="464" hits="1"/>
200
- <line number="465" hits="1" branch="true" condition-coverage="100% (2/2)"/>
201
- <line number="511" hits="1"/>
202
- <line number="513" hits="1"/>
203
- <line number="515" hits="1"/>
204
- <line number="516" hits="1"/>
205
- <line number="517" hits="1"/>
206
- <line number="519" hits="1" branch="true" condition-coverage="100% (2/2)"/>
207
- <line number="520" hits="1"/>
208
- <line number="522" hits="1"/>
209
- <line number="523" hits="1"/>
210
- <line number="524" hits="1"/>
211
- <line number="526" hits="1" branch="true" condition-coverage="100% (2/2)"/>
212
- <line number="527" hits="1" branch="true" condition-coverage="100% (2/2)"/>
213
- <line number="528" hits="1"/>
214
- <line number="529" hits="1"/>
215
- <line number="532" hits="1"/>
216
- <line number="533" hits="1" branch="true" condition-coverage="100% (2/2)"/>
217
- <line number="534" hits="1"/>
218
- <line number="535" hits="1"/>
219
- <line number="537" hits="1"/>
220
- <line number="538" hits="1" branch="true" condition-coverage="100% (2/2)"/>
221
- <line number="540" hits="1"/>
222
- <line number="541" hits="1"/>
223
- <line number="542" hits="1"/>
224
- <line number="545" hits="1"/>
225
- <line number="546" hits="1"/>
226
- <line number="547" hits="1"/>
227
- <line number="549" hits="1"/>
228
- <line number="550" hits="1" branch="true" condition-coverage="100% (2/2)"/>
229
- <line number="556" hits="1" branch="true" condition-coverage="100% (2/2)"/>
230
- <line number="559" hits="1"/>
231
- <line number="560" hits="1"/>
232
- <line number="561" hits="1" branch="true" condition-coverage="100% (2/2)"/>
233
- <line number="562" hits="1"/>
234
- <line number="563" hits="1"/>
235
- <line number="564" hits="1"/>
236
- <line number="565" hits="1"/>
237
- <line number="566" hits="1"/>
238
- <line number="568" hits="1"/>
239
- <line number="569" hits="1" branch="true" condition-coverage="100% (2/2)"/>
240
- <line number="570" hits="1"/>
241
- <line number="573" hits="1"/>
242
- <line number="574" hits="1"/>
243
- <line number="575" hits="1"/>
244
- <line number="578" hits="1"/>
245
- <line number="579" hits="1"/>
246
- <line number="580" hits="1"/>
247
- <line number="583" hits="1"/>
248
- <line number="584" hits="1"/>
249
- <line number="591" hits="1"/>
250
- </lines>
251
- </class>
252
- </classes>
253
- </package>
254
- </packages>
255
- </coverage>